clix/archive.lua

Mon, 08 Feb 2021 22:59:49 +0100

author
Kim Alvefur <zash@zash.se>
date
Mon, 08 Feb 2021 22:59:49 +0100
changeset 148
27a9f28724d3
parent 147
0bc82a318c45
child 159
68e09745d928
permissions
-rw-r--r--

clix.archive: Add 'irc' output format, useful for MUC export

148
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
1 local jid_split = require"util.jid".split;
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local bare_jid = require"util.jid".bare;
78
bed3cfce7d60 clix.archive: Parse timestamps
Kim Alvefur <zash@zash.se>
parents: 77
diff changeset
3 local parse_datetime = require"util.datetime".parse;
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 return function (opts, arg)
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 if opts.short_help then
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 print("Fetch archived messages");
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 return;
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 end
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9
114
757647426af2 clix.archive: Add support for paging backwards
Kim Alvefur <zash@zash.se>
parents: 92
diff changeset
10 local reverse = opts.before;
78
bed3cfce7d60 clix.archive: Parse timestamps
Kim Alvefur <zash@zash.se>
parents: 77
diff changeset
11 if opts.start then
bed3cfce7d60 clix.archive: Parse timestamps
Kim Alvefur <zash@zash.se>
parents: 77
diff changeset
12 opts.start = parse_datetime(opts.start);
bed3cfce7d60 clix.archive: Parse timestamps
Kim Alvefur <zash@zash.se>
parents: 77
diff changeset
13 end
bed3cfce7d60 clix.archive: Parse timestamps
Kim Alvefur <zash@zash.se>
parents: 77
diff changeset
14 if opts["end"] then
bed3cfce7d60 clix.archive: Parse timestamps
Kim Alvefur <zash@zash.se>
parents: 77
diff changeset
15 opts["end"] = parse_datetime(opts["end"]);
bed3cfce7d60 clix.archive: Parse timestamps
Kim Alvefur <zash@zash.se>
parents: 77
diff changeset
16 end
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 local selfjid;
81
e87f4d0b1a80 clix.archive: Show timestamps
Kim Alvefur <zash@zash.se>
parents: 80
diff changeset
18 local function print_message(i)
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 -- TODO Roster lookup
81
e87f4d0b1a80 clix.archive: Show timestamps
Kim Alvefur <zash@zash.se>
parents: 80
diff changeset
20 local m = i.message;
146
ae85457eca8e clix.archive: Skip printing body-less messages
Kim Alvefur <zash@zash.se>
parents: 118
diff changeset
21 if not m:get_child("body") then return end
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 local a = m.attr;
81
e87f4d0b1a80 clix.archive: Show timestamps
Kim Alvefur <zash@zash.se>
parents: 80
diff changeset
23 if i.stamp then
118
8bb289b2b7be clix.archive: Show proper timestamps
Kim Alvefur <zash@zash.se>
parents: 117
diff changeset
24 print(os.date("%Y-%m-%d %H:%M:%S", i.stamp));
81
e87f4d0b1a80 clix.archive: Show timestamps
Kim Alvefur <zash@zash.se>
parents: 80
diff changeset
25 end
80
ae77d9c41f4f clix.archive: The world doesn't revolve around us.
Kim Alvefur <zash@zash.se>
parents: 79
diff changeset
26 if a.to and bare_jid(a.to) ~= selfjid then
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 print("To ".. bare_jid(a.to));
80
ae77d9c41f4f clix.archive: The world doesn't revolve around us.
Kim Alvefur <zash@zash.se>
parents: 79
diff changeset
28 end
ae77d9c41f4f clix.archive: The world doesn't revolve around us.
Kim Alvefur <zash@zash.se>
parents: 79
diff changeset
29 if a.from and bare_jid(a.from) ~= selfjid then
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 print("From ".. bare_jid(a.from));
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 end
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 print(m:get_child_text"body");
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 print"";
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 end
147
0bc82a318c45 clix.archive: Add 'raw' output format, useful for exports
Kim Alvefur <zash@zash.se>
parents: 146
diff changeset
35 if opts.format == "raw" then
0bc82a318c45 clix.archive: Add 'raw' output format, useful for exports
Kim Alvefur <zash@zash.se>
parents: 146
diff changeset
36 local st = require"util.stanza";
0bc82a318c45 clix.archive: Add 'raw' output format, useful for exports
Kim Alvefur <zash@zash.se>
parents: 146
diff changeset
37 local datetime = require"util.datetime".datetime;
0bc82a318c45 clix.archive: Add 'raw' output format, useful for exports
Kim Alvefur <zash@zash.se>
parents: 146
diff changeset
38 function print_message(i)
0bc82a318c45 clix.archive: Add 'raw' output format, useful for exports
Kim Alvefur <zash@zash.se>
parents: 146
diff changeset
39 print(st.stanza("forwarded",{xmlns="urn:xmpp:forward:0"})
0bc82a318c45 clix.archive: Add 'raw' output format, useful for exports
Kim Alvefur <zash@zash.se>
parents: 146
diff changeset
40 :tag("delay", {xmlns="urn:xmpp:delay", stamp=datetime(i.stamp)}):up()
0bc82a318c45 clix.archive: Add 'raw' output format, useful for exports
Kim Alvefur <zash@zash.se>
parents: 146
diff changeset
41 :add_child(i.message));
0bc82a318c45 clix.archive: Add 'raw' output format, useful for exports
Kim Alvefur <zash@zash.se>
parents: 146
diff changeset
42 end
148
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
43 elseif opts.format == "irc" then
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
44 local date;
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
45 local os_date = os.date;
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
46 function print_message(i)
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
47 local m = i.message;
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
48 local body = m:get_child_text("body");
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
49 local a = m.attr;
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
50 local _, _, nick = jid_split(a.from);
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
51
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
52 local curdate = os_date("%F", i.stamp);
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
53 if date ~= curdate then
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
54 print("-!- "..curdate);
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
55 date = curdate;
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
56 end
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
57 if nick and body then
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
58 print(("%s <%s> %s"):format(os_date("%T", i.stamp), nick, body));
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
59 end
27a9f28724d3 clix.archive: Add 'irc' output format, useful for MUC export
Kim Alvefur <zash@zash.se>
parents: 147
diff changeset
60 end
147
0bc82a318c45 clix.archive: Add 'raw' output format, useful for exports
Kim Alvefur <zash@zash.se>
parents: 146
diff changeset
61 end
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 local function on_connect(conn)
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 if opts.debug then
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 conn:hook("stanza-out", print);
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 conn:hook("stanza", print);
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 end
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 selfjid = bare_jid(conn.jid);
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 local function handle_results(ok, result)
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 for i=1,#result do
81
e87f4d0b1a80 clix.archive: Show timestamps
Kim Alvefur <zash@zash.se>
parents: 80
diff changeset
71 print_message(result[i]);
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 end
114
757647426af2 clix.archive: Add support for paging backwards
Kim Alvefur <zash@zash.se>
parents: 92
diff changeset
73 if result[reverse and "first" or "last"] then
90
3115bd81b9de clix.archive: Be interactive when --interactive is set. --everything makes it page by itself.
Kim Alvefur <zash@zash.se>
parents: 81
diff changeset
74 local fetch_next = opts.everything;
3115bd81b9de clix.archive: Be interactive when --interactive is set. --everything makes it page by itself.
Kim Alvefur <zash@zash.se>
parents: 81
diff changeset
75 if opts.interactive and not fetch_next then
3115bd81b9de clix.archive: Be interactive when --interactive is set. --everything makes it page by itself.
Kim Alvefur <zash@zash.se>
parents: 81
diff changeset
76 io.stderr:write "--More--"
92
a629b953780c clix.archive: Print a newline if reading a line fails (the user pressed ^D)
Kim Alvefur <zash@zash.se>
parents: 90
diff changeset
77 fetch_next = io.read"*l" or print();
90
3115bd81b9de clix.archive: Be interactive when --interactive is set. --everything makes it page by itself.
Kim Alvefur <zash@zash.se>
parents: 81
diff changeset
78 end
3115bd81b9de clix.archive: Be interactive when --interactive is set. --everything makes it page by itself.
Kim Alvefur <zash@zash.se>
parents: 81
diff changeset
79 if fetch_next then
114
757647426af2 clix.archive: Add support for paging backwards
Kim Alvefur <zash@zash.se>
parents: 92
diff changeset
80 if reverse then
757647426af2 clix.archive: Add support for paging backwards
Kim Alvefur <zash@zash.se>
parents: 92
diff changeset
81 opts.before = result.first and result.first[1];
757647426af2 clix.archive: Add support for paging backwards
Kim Alvefur <zash@zash.se>
parents: 92
diff changeset
82 else
115
1aaf30b457a0 clix.archive: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 114
diff changeset
83 opts.after = result.last;
114
757647426af2 clix.archive: Add support for paging backwards
Kim Alvefur <zash@zash.se>
parents: 92
diff changeset
84 end
79
a19ccb8f1ef9 clix.archive: Use --to specify where to direct the query
Kim Alvefur <zash@zash.se>
parents: 78
diff changeset
85 conn:query_archive(opts.to, opts, handle_results);
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86 return
90
3115bd81b9de clix.archive: Be interactive when --interactive is set. --everything makes it page by itself.
Kim Alvefur <zash@zash.se>
parents: 81
diff changeset
87 else
116
3ee83c4801b4 clix.archive: Fix pagination message, rsm.first is a table
Kim Alvefur <zash@zash.se>
parents: 115
diff changeset
88 local whatnext, nextpage = reverse and "before" or "after";
3ee83c4801b4 clix.archive: Fix pagination message, rsm.first is a table
Kim Alvefur <zash@zash.se>
parents: 115
diff changeset
89 if reverse then
3ee83c4801b4 clix.archive: Fix pagination message, rsm.first is a table
Kim Alvefur <zash@zash.se>
parents: 115
diff changeset
90 nextpage = result.first and result.first[1];
3ee83c4801b4 clix.archive: Fix pagination message, rsm.first is a table
Kim Alvefur <zash@zash.se>
parents: 115
diff changeset
91 else
3ee83c4801b4 clix.archive: Fix pagination message, rsm.first is a table
Kim Alvefur <zash@zash.se>
parents: 115
diff changeset
92 nextpage = result.last;
3ee83c4801b4 clix.archive: Fix pagination message, rsm.first is a table
Kim Alvefur <zash@zash.se>
parents: 115
diff changeset
93 end
3ee83c4801b4 clix.archive: Fix pagination message, rsm.first is a table
Kim Alvefur <zash@zash.se>
parents: 115
diff changeset
94 conn:info("Next page: --%s=%s", whatnext, nextpage);
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 end
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 end
117
c6b5d2039f25 clix.archive: Show number of items if available
Kim Alvefur <zash@zash.se>
parents: 116
diff changeset
97 if result.count then
c6b5d2039f25 clix.archive: Show number of items if available
Kim Alvefur <zash@zash.se>
parents: 116
diff changeset
98 conn:info("Total: %d items", result.count);
c6b5d2039f25 clix.archive: Show number of items if available
Kim Alvefur <zash@zash.se>
parents: 116
diff changeset
99 end
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100 conn:close();
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101 end
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 conn:add_plugin"archive";
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 -- TODO conn:add_plugin"roster";
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 -- c.roster:fetch(function()
79
a19ccb8f1ef9 clix.archive: Use --to specify where to direct the query
Kim Alvefur <zash@zash.se>
parents: 78
diff changeset
105 conn:query_archive(opts.to, opts, handle_results);
75
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 end
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 clix_connect(opts, on_connect);
8d5c99f46cb8 clix.archive: New plugin, a MAM browser
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 end

mercurial