clix/roster.lua

Wed, 20 Apr 2011 02:00:16 +0200

author
Kim Alvefur <zash@zash.se>
date
Wed, 20 Apr 2011 02:00:16 +0200
changeset 59
46cb6e772e31
parent 58
d5d9f7dffc1f
child 61
7d62bff46601
permissions
-rw-r--r--

clix.roster: Add a separator between groups in the show sub command

48
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 short_opts.i = "interactive";
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local split_jid = require "util.jid".split;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local function printor(str) return function() print(str) end end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 return function (opts, arg)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 if opts.short_help then
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 print("Show or edit your roster");
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 return;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 if opts.help and not opts.interactive then
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 return 0;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local function on_connect(conn)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 -- Fake socket object around stdin
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 local stdin = {
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 getfd = function () return 0; end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 dirty = function (self) return false; end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 settimeout = function () end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 send = function (_, d) return #d, 0; end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 close = function () end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 receive = function (_, patt)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 local data = io.stdin:read(patt);
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 if data == nil then
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 conn:close();
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 if opts.echo then
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 io.write(data, patt == "*l" and "\n" or "");
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 return data;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 };
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 local commands = {
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 quit = function(param) conn:close(); end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 add = function(param) conn.roster:add_contact(param) end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 sub = function(param) conn:send(verse.presence{to=param, type="subscribe"}); end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 auth = function(param) conn:send(verse.presence{to=param, type="subscribed"}); end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 del = function(param) conn.roster:delete_contact(param) end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 setnick = function(param)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 local jid, nick = param:match("^(%S+)%s+(%S+)");
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 local item = conn.roster.items[jid];
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 if not item then print("no jid "..jid); return; end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 conn.roster:add_contact(jid, nick, item.groups or {}, printor("saved"));
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 addgroup = function(param)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 local jid, group = param:match("^(%S+)%s+(%S+)");
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 local item = conn.roster.items[jid];
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 local groups = item.groups or {};
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 table.insert(groups, group);
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 conn.roster:add_contact(jid, item.name, groups, printor("saved"));
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 delgroup = function(param)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 local jid, group = param:match("^(%S+)%s+(%S+)");
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 local item = conn.roster.items[jid];
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 local groups = item.groups;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 if not groups then return end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 for i = 1,#groups do
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 if groups[i] == group then
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 table.remove(groups, i);
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 break
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 conn.roster:add_contact(jid, item.name, groups, printor("saved"));
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 list = function()
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 for jid, item in pairs(conn.roster.items) do
56
4b5f9a50ae68 clix.roster: Fix nickname fallback
Kim Alvefur <zash@zash.se>
parents: 48
diff changeset
66 local name, host = item.name or split_jid(jid);
48
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 print(name or host, jid, table.concat(item.groups or {}, ", "));
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 listgroups = function(param)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 local groups = {};
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 for jid, item in pairs(conn.roster.items) do
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 for i = 1,#item.groups do
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 groups[item.groups[i]] = ( groups[item.groups[i]] or 0 ) + 1;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 for group, size in pairs(groups) do
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 print(group, size)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 show = function(param)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 local item = conn.roster.items[param];
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 if not item then
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 print("No such contact");
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85 return;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 for k,v in pairs(item) do
59
46cb6e772e31 clix.roster: Add a separator between groups in the show sub command
Kim Alvefur <zash@zash.se>
parents: 58
diff changeset
89 print(k,type(v) == "table" and table.concat(v, ", ") or v)
48
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
91 end;
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 }
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 local function on_incoming(stdin, text)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 local cmd = text:match("^(%a*)");
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 local param = text:match("%s+(.*)", #cmd);
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 if commands[cmd] then
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 commands[cmd](param);
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100 stdin = require "net.server".wrapclient(stdin, "stdin", 0, {
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101 onincoming = on_incoming, ondisconnect = function () end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 }, "*l");
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 conn:add_plugin("roster");
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 conn.roster:fetch(function(roster)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 if not roster then
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 print("There was an error fetching your roster");
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 conn:close()
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
110 if not opts.interactive then
58
d5d9f7dffc1f clix.roster: Don't run any command by default when --interactive
Kim Alvefur <zash@zash.se>
parents: 57
diff changeset
111 local firstcmd = commands[arg[1] or "list"];
d5d9f7dffc1f clix.roster: Don't run any command by default when --interactive
Kim Alvefur <zash@zash.se>
parents: 57
diff changeset
112 if firstcmd then
d5d9f7dffc1f clix.roster: Don't run any command by default when --interactive
Kim Alvefur <zash@zash.se>
parents: 57
diff changeset
113 firstcmd(table.concat(arg, " ", 2, #arg))
d5d9f7dffc1f clix.roster: Don't run any command by default when --interactive
Kim Alvefur <zash@zash.se>
parents: 57
diff changeset
114 end
48
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
115 conn:close();
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
116 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 end);
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
118 local function notif(e)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 return function(item)
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120 return print(("%s %s"):format((item.name and item.name .. " (" .. item.jid .. ")") or item.jid, e));
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
121 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
122 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
123 if opts.interactive then
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
124 conn:hook("roster/item-added", notif("added"));
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125 conn:hook("roster/item-changed", notif("changed"));
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 conn:hook("roster/item-removed", notif("removed"));
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127 end
57
830baad98c9a clix.roster: Show incomming subscription requests when --presence is used
Kim Alvefur <zash@zash.se>
parents: 56
diff changeset
128 if opts.presence then
830baad98c9a clix.roster: Show incomming subscription requests when --presence is used
Kim Alvefur <zash@zash.se>
parents: 56
diff changeset
129 conn:hook("presence", function(presence)
830baad98c9a clix.roster: Show incomming subscription requests when --presence is used
Kim Alvefur <zash@zash.se>
parents: 56
diff changeset
130 if presence.attr.type == "subscribe" then
830baad98c9a clix.roster: Show incomming subscription requests when --presence is used
Kim Alvefur <zash@zash.se>
parents: 56
diff changeset
131 print(("%s wants to subscribe to you"):format(presence.attr.from));
830baad98c9a clix.roster: Show incomming subscription requests when --presence is used
Kim Alvefur <zash@zash.se>
parents: 56
diff changeset
132 --elseif presence.attr.type == "subscribed" then
830baad98c9a clix.roster: Show incomming subscription requests when --presence is used
Kim Alvefur <zash@zash.se>
parents: 56
diff changeset
133 --print(("%s subscribed to you?"):format(presence.attr.from));
830baad98c9a clix.roster: Show incomming subscription requests when --presence is used
Kim Alvefur <zash@zash.se>
parents: 56
diff changeset
134 end
830baad98c9a clix.roster: Show incomming subscription requests when --presence is used
Kim Alvefur <zash@zash.se>
parents: 56
diff changeset
135 end)
830baad98c9a clix.roster: Show incomming subscription requests when --presence is used
Kim Alvefur <zash@zash.se>
parents: 56
diff changeset
136 end
48
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
137 end
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
138 clix_connect(opts, on_connect);
8206f3369d37 clix.roster: Roster management
Kim Alvefur <zash@zash.se>
parents:
diff changeset
139 end

mercurial