Mercurial > prosody-modules
comparison mod_roster_command/mod_roster_command.lua @ 453:1969310ea06a
mod_roster_command: Manage rosters through prosodyctl
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 11 Oct 2011 01:41:22 +0100 |
| parents | |
| children | f806c8a7f985 |
comparison
equal
deleted
inserted
replaced
| 452:48b615229509 | 453:1969310ea06a |
|---|---|
| 1 ----------------------------------------------------------- | |
| 2 -- mod_roster_command: Manage rosters through prosodyctl | |
| 3 -- version 0.02 | |
| 4 ----------------------------------------------------------- | |
| 5 -- Copyright (C) 2011 Matthew Wild | |
| 6 -- Copyright (C) 2011 Adam Nielsen | |
| 7 -- | |
| 8 -- This project is MIT/X11 licensed. Please see the | |
| 9 -- COPYING file in the source package for more information. | |
| 10 ----------------------------------------------------------- | |
| 11 | |
| 12 -- Workaround for lack of util.startup... | |
| 13 _G.bare_sessions = _G.bare_sessions or {}; | |
| 14 | |
| 15 local rostermanager = require "core.rostermanager"; | |
| 16 local storagemanager = require "core.storagemanager"; | |
| 17 local jid = require "util.jid"; | |
| 18 local warn = prosodyctl.show_warning; | |
| 19 | |
| 20 -- Make a *one-way* subscription. User will see when contact is online, | |
| 21 -- contact will not see when user is online. | |
| 22 function subscribe(user_jid, contact_jid) | |
| 23 local user_username, user_host = jid.split(user_jid); | |
| 24 local contact_username, contact_host = jid.split(contact_jid); | |
| 25 if not hosts[user_host] then | |
| 26 warn("The host '%s' is not configured for this server.", user_host); | |
| 27 return; | |
| 28 end | |
| 29 storagemanager.initialize_host(user_host); | |
| 30 -- Update user's roster to say subscription request is pending... | |
| 31 rostermanager.set_contact_pending_out(user_username, user_host, contact_jid); | |
| 32 if hosts[contact_host] then | |
| 33 if contact_host ~= user_host then | |
| 34 storagemanager.initialize_host(contact_host); | |
| 35 end | |
| 36 -- Update contact's roster to say subscription request is pending... | |
| 37 rostermanager.set_contact_pending_in(contact_username, contact_host, user_jid); | |
| 38 -- Update contact's roster to say subscription request approved... | |
| 39 rostermanager.subscribed(contact_username, contact_host, user_jid); | |
| 40 -- Update user's roster to say subscription request approved... | |
| 41 rostermanager.process_inbound_subscription_approval(user_username, user_host, contact_jid); | |
| 42 end | |
| 43 end | |
| 44 | |
| 45 -- Make a mutual subscription between jid1 and jid2. Each JID will see | |
| 46 -- when the other one is online. | |
| 47 function subscribe_both(jid1, jid2) | |
| 48 subscribe(jid1, jid2); | |
| 49 subscribe(jid2, jid1); | |
| 50 end | |
| 51 | |
| 52 -- Unsubscribes user from contact (not contact from user, if subscribed). | |
| 53 function unsubscribe(user_jid, contact_jid) | |
| 54 local user_username, user_host = jid.split(user_jid); | |
| 55 local contact_username, contact_host = jid.split(contact_jid); | |
| 56 if not hosts[user_host] then | |
| 57 warn("The host '%s' is not configured for this server.", user_host); | |
| 58 return; | |
| 59 end | |
| 60 storagemanager.initialize_host(user_host); | |
| 61 -- Update user's roster to say subscription is cancelled... | |
| 62 rostermanager.unsubscribe(user_username, user_host, contact_jid); | |
| 63 if hosts[contact_host] then | |
| 64 if contact_host ~= user_host then | |
| 65 storagemanager.initialize_host(contact_host); | |
| 66 end | |
| 67 -- Update contact's roster to say subscription is cancelled... | |
| 68 rostermanager.unsubscribed(contact_username, contact_host, user_jid); | |
| 69 end | |
| 70 end | |
| 71 | |
| 72 -- Cancel any subscription in either direction. | |
| 73 function unsubscribe_both(jid1, jid2) | |
| 74 unsubscribe(jid1, jid2); | |
| 75 unsubscribe(jid2, jid1); | |
| 76 end | |
| 77 | |
| 78 -- Set the name shown and group used in the contact list | |
| 79 function rename(user_jid, contact_jid, contact_nick, contact_group) | |
| 80 local user_username, user_host = jid.split(user_jid); | |
| 81 if not hosts[user_host] then | |
| 82 warn("The host '%s' is not configured for this server.", user_host); | |
| 83 return; | |
| 84 end | |
| 85 storagemanager.initialize_host(user_host); | |
| 86 | |
| 87 -- Load user's roster and find the contact | |
| 88 local roster = rostermanager.load_roster(user_username, user_host); | |
| 89 local item = roster[contact_jid]; | |
| 90 if item then | |
| 91 if contact_nick then | |
| 92 item.name = contact_nick; | |
| 93 end | |
| 94 if contact_group then | |
| 95 item.groups = {}; -- Remove from all current groups | |
| 96 item.groups[contact_group] = true; | |
| 97 end | |
| 98 rostermanager.save_roster(user_username, user_host, roster); | |
| 99 end | |
| 100 end | |
| 101 | |
| 102 function module.command(arg) | |
| 103 local command = arg[1]; | |
| 104 if not command then | |
| 105 warn("Valid subcommands: (un)subscribe(_both) | rename"); | |
| 106 return 0; | |
| 107 end | |
| 108 table.remove(arg, 1); | |
| 109 if command == "subscribe" then | |
| 110 subscribe(arg[1], arg[2]); | |
| 111 return 0; | |
| 112 elseif command == "subscribe_both" then | |
| 113 subscribe_both(arg[1], arg[2]); | |
| 114 return 0; | |
| 115 elseif command == "unsubscribe" then | |
| 116 unsubscribe(arg[1], arg[2]); | |
| 117 return 0; | |
| 118 elseif command == "unsubscribe_both" then | |
| 119 unsubscribe_both(arg[1], arg[2]); | |
| 120 return 0; | |
| 121 elseif command == "rename" then | |
| 122 rename(arg[1], arg[2], arg[3], arg[4]); | |
| 123 return 0; | |
| 124 else | |
| 125 warn("Unknown command: %s", command); | |
| 126 return 1; | |
| 127 end | |
| 128 return 0; | |
| 129 end |
