Mercurial > prosody-modules
comparison mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua @ 67:e839b4453387
mod_adhoc_cmd_admin: Add announce command
author | Florian Zeitz <florob@babelmonkeys.de> |
---|---|
date | Fri, 30 Oct 2009 01:32:12 +0100 |
parents | 59f490390528 |
children | b47216512a1d |
comparison
equal
deleted
inserted
replaced
66:b86ae5e21a56 | 67:e839b4453387 |
---|---|
36 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; | 36 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; |
37 { name = "max_items", type = "list-single", label = "Maximum number of users", | 37 { name = "max_items", type = "list-single", label = "Maximum number of users", |
38 value = { "25", "50", "75", "100", "150", "200", "all" } }; | 38 value = { "25", "50", "75", "100", "150", "200", "all" } }; |
39 }; | 39 }; |
40 | 40 |
41 local announce_layout = dataforms_new{ | |
42 title = "Making an Announcement"; | |
43 instructions = "Fill out this form to make an announcement to all\nactive users of this service."; | |
44 | |
45 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; | |
46 { name = "subject", type = "text-single", label = "Subject" }; | |
47 { name = "announcement", type = "text-multi", required = true, label = "Announcement" }; | |
48 }; | |
49 | |
41 function add_user_command_handler(item, origin, stanza) | 50 function add_user_command_handler(item, origin, stanza) |
42 if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then | 51 if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then |
43 if stanza.tags[1].attr.action == "cancel" then | 52 if stanza.tags[1].attr.action == "cancel" then |
44 origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); | 53 origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); |
45 sessions[stanza.tags[1].attr.sessionid] = nil; | 54 sessions[stanza.tags[1].attr.sessionid] = nil; |
46 return true; | 55 return true; |
47 end | 56 end |
48 form = stanza.tags[1]:child_with_ns("jabber:x:data"); | 57 local form = stanza.tags[1]:child_with_ns("jabber:x:data"); |
49 local fields = add_user_layout:data(form); | 58 local fields = add_user_layout:data(form); |
50 local username, host, resource = jid.split(fields.accountjid); | 59 local username, host, resource = jid.split(fields.accountjid); |
51 if (fields.password == fields["password-verify"]) and username and host and host == stanza.attr.to then | 60 if (fields.password == fields["password-verify"]) and username and host and host == stanza.attr.to then |
52 if usermanager_user_exists(username, host) then | 61 if usermanager_user_exists(username, host) then |
53 origin.send(st.error_reply(stanza, "cancel", "conflict", "Account already exists"):up() | 62 origin.send(st.error_reply(stanza, "cancel", "conflict", "Account already exists"):up() |
94 origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); | 103 origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); |
95 sessions[stanza.tags[1].attr.sessionid] = nil; | 104 sessions[stanza.tags[1].attr.sessionid] = nil; |
96 return true; | 105 return true; |
97 end | 106 end |
98 | 107 |
99 form = stanza.tags[1]:child_with_ns("jabber:x:data"); | 108 local form = stanza.tags[1]:child_with_ns("jabber:x:data"); |
100 local fields = add_user_layout:data(form); | 109 local fields = add_user_layout:data(form); |
101 | 110 |
102 local max_items = nil | 111 local max_items = nil |
103 if fields.max_items ~= "all" then | 112 if fields.max_items ~= "all" then |
104 max_items = tonumber(fields.max_items); | 113 max_items = tonumber(fields.max_items); |
126 end | 135 end |
127 | 136 |
128 return true; | 137 return true; |
129 end | 138 end |
130 | 139 |
140 function announce_handler(item, origin, stanza) | |
141 if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then | |
142 if stanza.tags[1].attr.action == "cancel" then | |
143 origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); | |
144 sessions[stanza.tags[1].attr.sessionid] = nil; | |
145 return true; | |
146 end | |
147 | |
148 local form = stanza.tags[1]:child_with_ns("jabber:x:data"); | |
149 local fields = add_user_layout:data(form); | |
150 | |
151 module:log("info", "Sending server announcement to all online users"); | |
152 local host_session = hosts[stanza.attr.to]; | |
153 local message = st.message({type = "headline", from = stanza.attr.to}, fields.announcement):up() | |
154 :tag("subject"):text(fields.subject or "Announcement"); | |
155 | |
156 local c = 0; | |
157 for user in pairs(host_session.sessions) do | |
158 c = c + 1; | |
159 message.attr.to = user.."@"..stanza.attr.to; | |
160 core_post_stanza(host_session, message); | |
161 end | |
162 | |
163 module:log("info", "Announcement sent to %d online users", c); | |
164 | |
165 origin.send(st.reply(stanza):add_child(item:cmdtag("completed", stanza.tags[1].attr.sessionid) | |
166 :tag("note"):text("Announcement sent."))); | |
167 sessions[stanza.tags[1].attr.sessionid] = nil; | |
168 return true; | |
169 else | |
170 local sessionid=uuid.generate(); | |
171 sessions[sessionid] = "executing"; | |
172 origin.send(st.reply(stanza):add_child(item:cmdtag("executing", sessionid):add_child(announce_layout:form()))); | |
173 end | |
174 | |
175 return true; | |
176 end | |
177 | |
131 local add_user_desc = adhoc_new("Add User", "http://jabber.org/protocol/admin#add-user", add_user_command_handler, "admin"); | 178 local add_user_desc = adhoc_new("Add User", "http://jabber.org/protocol/admin#add-user", add_user_command_handler, "admin"); |
132 local get_online_users_desc = adhoc_new("Get List of Online Users", "http://jabber.org/protocol/admin#get-online-users", get_online_users_command_handler, "admin"); | 179 local get_online_users_desc = adhoc_new("Get List of Online Users", "http://jabber.org/protocol/admin#get-online-users", get_online_users_command_handler, "admin"); |
180 local announce_desc = adhoc_new("Send Announcement to Online Users", "http://jabber.org/protocol/admin#announce", announce_handler, "admin"); | |
133 | 181 |
134 function module.unload() | 182 function module.unload() |
135 module:remove_item("adhoc", add_user_desc); | 183 module:remove_item("adhoc", add_user_desc); |
136 module:remove_item("adhoc", get_online_users_desc); | 184 module:remove_item("adhoc", get_online_users_desc); |
185 module:remove_item("adhoc", announce_desc); | |
137 end | 186 end |
138 | 187 |
139 module:add_item("adhoc", add_user_desc); | 188 module:add_item("adhoc", add_user_desc); |
140 module:add_item("adhoc", get_online_users_desc); | 189 module:add_item("adhoc", get_online_users_desc); |
190 module:add_item("adhoc", announce_desc); |