Mercurial > xib
diff commands.py @ 134:931a5edc7971
moved commands to a separate file
Signed-off-by: Charly COSTE <changaco@changaco.net>
author | Charly COSTE <changaco@changaco.net> |
---|---|
date | Fri, 15 Jan 2010 23:11:25 +0100 |
parents | |
children | 8c6184411ec7 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/commands.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +import shlex + +from argparse_modified import ArgumentParser +import muc +xmpp = muc.xmpp +del muc + +from bridge import Bridge + + +commands = ['xmpp-participants', 'irc-participants', 'bridges'] +admin_commands = ['add-bridge', 'add-xmpp-admin', 'change-bridge-mode', 'halt', 'remove-bridge', 'restart-bot', 'restart-bridge', 'stop-bridge'] + +def execute(bot, command_line, bot_admin, bridge): + ret = '' + command = shlex.split(command_line) + if len(command) > 1: + args_array = command[1:] + else: + args_array = [] + command = command[0] + command_func = command.replace('-', '_') + + if not globals().has_key(command_func): + ret = 'Error: "'+command+'" is not a valid command.\ncommands: '+' '.join(commands) + if bot_admin: + return ret+'\n'+'admin commands: '+' '.join(admin_commands) + else: + return ret + elif command in admin_commands and not bot_admin: + return 'You have to be a bot admin to use this command.' + + b = bridge + + if command in ['change-bridge-mode', 'remove-bridge', 'restart-bridge', 'stop-bridge']: + # we need to know which bridge the command is for + if len(args_array) == 0: + if bridge: + b = bridge + else: + return 'You must specify a bridge. '+bridges(bot, 'bridges', [], bot_admin, None) + else: + try: + bn = int(args_array[0]) + if bn < 1: + raise IndexError + b = bot.bridges[bn-1] + except IndexError: + return 'Invalid bridge number "'+str(bn)+'". '+bridges(bot, 'bridges', [], bot_admin, None) + except ValueError: + bridges = bot.findBridges(args_array[0]) + if len(bridges) == 0: + return 'No bridge found matching "'+args_array[0]+'". '+bridges(bot, 'bridges', [], bot_admin, None) + elif len(bridges) == 1: + b = bridges[0] + elif len(bridges) > 1: + return 'More than one bridge matches "'+args_array[0]+'", please be more specific. '+bridges(bot, 'bridges', [], bot_admin, None) + + + return globals()[command_func](bot, command, args_array, bot_admin, b) + + +def add_bridge(bot, command, args_array, bot_admin, bridge): + parser = ArgumentParser(prog=command) + parser.add_argument('xmpp_room_jid', type=str) + parser.add_argument('irc_chan', type=str) + parser.add_argument('irc_server', type=str) + parser.add_argument('--mode', choices=Bridge._modes, default='normal') + parser.add_argument('--say-level', choices=Bridge._say_levels, default='all') + parser.add_argument('--irc-port', type=int, default=6667) + try: + args = parser.parse_args(args_array) + except ArgumentParser.ParseException as e: + return '\n'+e.args[1] + + bot.new_bridge(args.xmpp_room_jid, args.irc_chan, args.irc_server, args.mode, args.say_level, irc_port=args.irc_port) + + return 'Bridge added.' + + +def add_xmpp_admin(bot, command, args_array, bot_admin, bridge): + parser = ArgumentParser(prog=command) + parser.add_argument('jid', type=str) + try: + args = parser.parse_args(args_array) + except ArgumentParser.ParseException as e: + return '\n'+e.args[1] + bot.admins_jid.append(args.jid) + for b in bot.bridges: + for p in b.participants: + if p.real_jid != None and xmpp.protocol.JID(args.jid).bareMatch(p.real_jid): + p.bot_admin = True + + return 'XMPP admin added.' + + +def bridges(bot, command, args_array, bot_admin, bridge): + parser = ArgumentParser(prog=command) + parser.add_argument('--show-mode', default=False, action='store_true') + parser.add_argument('--show-say-level', default=False, action='store_true') + parser.add_argument('--show-participants', default=False, action='store_true') + try: + args = parser.parse_args(args_array) + except ArgumentParser.ParseException as e: + return '\n'+e.args[1] + ret = 'List of bridges:' + for i, b in enumerate(bot.bridges): + ret += '\n'+str(i+1)+' - '+str(b) + if args.show_mode: + ret += ' - mode='+b.mode + if args.show_say_level: + ret += ' - say_level='+Bridge._say_levels[b.say_level] + if args.show_participants: + xmpp_participants_nicknames = b.get_participants_nicknames_list(protocols=['xmpp']) + ret += '\nparticipants on XMPP ('+str(len(xmpp_participants_nicknames))+'): '+' '.join(xmpp_participants_nicknames) + irc_participants_nicknames = b.get_participants_nicknames_list(protocols=['irc']) + ret += '\nparticipants on IRC ('+str(len(irc_participants_nicknames))+'): '+' '.join(irc_participants_nicknames) + if b.irc_connection == None: + ret += ' - this bridge is stopped, use "restart-bridge '+str(i+1)+'" to restart it' + return ret + + +def change_bridge_mode(bot, command, args_array, bot_admin, bridge): + new_mode = args_array[1] + if not new_mode in Bridge._modes: + return '"'+new_mode+'" is not a valid mode, list of modes: '+' '.join(Bridge._modes) + r = bridge.changeMode(new_mode) + if r: + return r + return 'Mode changed.' + + +def halt(bot, command, args_array, bot_admin, bridge): + bot.stop() + return + + +def irc_participants(bot, command, args_array, bot_admin, bridge): + if not bridge: + for b in bot.bridges: + irc_participants_nicknames = b.get_participants_nicknames_list(protocols=['irc']) + ret += '\nparticipants on '+b.irc_room+' at '+b.irc_server+' ('+str(len(irc_participants_nicknames))+'): '+' '.join(irc_participants_nicknames) + return ret + else: + irc_participants_nicknames = bridge.get_participants_nicknames_list(protocols=['irc']) + return '\nparticipants on '+bridge.irc_room+' at '+bridge.irc_server+' ('+str(len(irc_participants_nicknames))+'): '+' '.join(irc_participants_nicknames) + + +def remove_bridge(bot, command, args_array, bot_admin, bridge): + bot.removeBridge(bridge) + return 'Bridge removed.' + + +def restart_bot(bot, command, args_array, bot_admin, bridge): + bot.restart() + return + +def restart_bridge(bot, command, args_array, bot_admin, bridge): + bridge.restart() + return 'Bridge restarted.' + + +def stop_bridge(bot, command, args_array, bot_admin, bridge): + bridge.stop() + return 'Bridge stopped.' + + +def xmpp_participants(bot, command, args_array, bot_admin, bridge): + if not bridge: + for b in bot.bridges: + xmpp_participants_nicknames = b.get_participants_nicknames_list(protocols=['xmpp']) + ret += '\nparticipants on '+b.xmpp_room_jid+' ('+str(len(xmpp_participants_nicknames))+'): '+' '.join(xmpp_participants_nicknames) + return ret + else: + xmpp_participants_nicknames = bridge.get_participants_nicknames_list(protocols=['xmpp']) + return '\nparticipants on '+bridge.xmpp_room_jid+' ('+str(len(xmpp_participants_nicknames))+'): '+' '.join(xmpp_participants_nicknames)