# HG changeset patch # User Matthew Wild # Date 1318293682 -3600 # Node ID 1969310ea06ab3dcf6023f8a5b240e305c19b72d # Parent 48b6152295092eceea9356b823f9e63db1284010 mod_roster_command: Manage rosters through prosodyctl diff -r 48b615229509 -r 1969310ea06a mod_roster_command/mod_roster_command.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_roster_command/mod_roster_command.lua Tue Oct 11 01:41:22 2011 +0100 @@ -0,0 +1,129 @@ +----------------------------------------------------------- +-- mod_roster_command: Manage rosters through prosodyctl +-- version 0.02 +----------------------------------------------------------- +-- Copyright (C) 2011 Matthew Wild +-- Copyright (C) 2011 Adam Nielsen +-- +-- This project is MIT/X11 licensed. Please see the +-- COPYING file in the source package for more information. +----------------------------------------------------------- + +-- Workaround for lack of util.startup... +_G.bare_sessions = _G.bare_sessions or {}; + +local rostermanager = require "core.rostermanager"; +local storagemanager = require "core.storagemanager"; +local jid = require "util.jid"; +local warn = prosodyctl.show_warning; + +-- Make a *one-way* subscription. User will see when contact is online, +-- contact will not see when user is online. +function subscribe(user_jid, contact_jid) + local user_username, user_host = jid.split(user_jid); + local contact_username, contact_host = jid.split(contact_jid); + if not hosts[user_host] then + warn("The host '%s' is not configured for this server.", user_host); + return; + end + storagemanager.initialize_host(user_host); + -- Update user's roster to say subscription request is pending... + rostermanager.set_contact_pending_out(user_username, user_host, contact_jid); + if hosts[contact_host] then + if contact_host ~= user_host then + storagemanager.initialize_host(contact_host); + end + -- Update contact's roster to say subscription request is pending... + rostermanager.set_contact_pending_in(contact_username, contact_host, user_jid); + -- Update contact's roster to say subscription request approved... + rostermanager.subscribed(contact_username, contact_host, user_jid); + -- Update user's roster to say subscription request approved... + rostermanager.process_inbound_subscription_approval(user_username, user_host, contact_jid); + end +end + +-- Make a mutual subscription between jid1 and jid2. Each JID will see +-- when the other one is online. +function subscribe_both(jid1, jid2) + subscribe(jid1, jid2); + subscribe(jid2, jid1); +end + +-- Unsubscribes user from contact (not contact from user, if subscribed). +function unsubscribe(user_jid, contact_jid) + local user_username, user_host = jid.split(user_jid); + local contact_username, contact_host = jid.split(contact_jid); + if not hosts[user_host] then + warn("The host '%s' is not configured for this server.", user_host); + return; + end + storagemanager.initialize_host(user_host); + -- Update user's roster to say subscription is cancelled... + rostermanager.unsubscribe(user_username, user_host, contact_jid); + if hosts[contact_host] then + if contact_host ~= user_host then + storagemanager.initialize_host(contact_host); + end + -- Update contact's roster to say subscription is cancelled... + rostermanager.unsubscribed(contact_username, contact_host, user_jid); + end +end + +-- Cancel any subscription in either direction. +function unsubscribe_both(jid1, jid2) + unsubscribe(jid1, jid2); + unsubscribe(jid2, jid1); +end + +-- Set the name shown and group used in the contact list +function rename(user_jid, contact_jid, contact_nick, contact_group) + local user_username, user_host = jid.split(user_jid); + if not hosts[user_host] then + warn("The host '%s' is not configured for this server.", user_host); + return; + end + storagemanager.initialize_host(user_host); + + -- Load user's roster and find the contact + local roster = rostermanager.load_roster(user_username, user_host); + local item = roster[contact_jid]; + if item then + if contact_nick then + item.name = contact_nick; + end + if contact_group then + item.groups = {}; -- Remove from all current groups + item.groups[contact_group] = true; + end + rostermanager.save_roster(user_username, user_host, roster); + end +end + +function module.command(arg) + local command = arg[1]; + if not command then + warn("Valid subcommands: (un)subscribe(_both) | rename"); + return 0; + end + table.remove(arg, 1); + if command == "subscribe" then + subscribe(arg[1], arg[2]); + return 0; + elseif command == "subscribe_both" then + subscribe_both(arg[1], arg[2]); + return 0; + elseif command == "unsubscribe" then + unsubscribe(arg[1], arg[2]); + return 0; + elseif command == "unsubscribe_both" then + unsubscribe_both(arg[1], arg[2]); + return 0; + elseif command == "rename" then + rename(arg[1], arg[2], arg[3], arg[4]); + return 0; + else + warn("Unknown command: %s", command); + return 1; + end + return 0; +end