Split command declaration from init in muctab
Make it slightly more declarative and readable (and longer), and put it at the end of the file.
This commit is contained in:
parent
cee802b6ef
commit
3b5e396469
2 changed files with 221 additions and 130 deletions
|
@ -183,6 +183,21 @@ class Tab(object):
|
||||||
"""
|
"""
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def register_commands_batch(self, commands):
|
||||||
|
"""
|
||||||
|
Add several commands in a row, using a list of dictionaries
|
||||||
|
"""
|
||||||
|
for command in commands:
|
||||||
|
name = command['name']
|
||||||
|
func = command['func']
|
||||||
|
desc = command.get('desc', '')
|
||||||
|
shortdesc = command.get('shortdesc', '')
|
||||||
|
completion = command.get('completion')
|
||||||
|
usage = command.get('usage', '')
|
||||||
|
self.register_command(name, func, desc=desc, shortdesc=shortdesc,
|
||||||
|
completion=completion, usage=usage)
|
||||||
|
|
||||||
|
|
||||||
def register_command(self, name, func, *, desc='', shortdesc='', completion=None, usage=''):
|
def register_command(self, name, func, *, desc='', shortdesc='', completion=None, usage=''):
|
||||||
"""
|
"""
|
||||||
Add a command
|
Add a command
|
||||||
|
|
|
@ -47,26 +47,32 @@ class MucTab(ChatTab):
|
||||||
message_type = 'groupchat'
|
message_type = 'groupchat'
|
||||||
plugin_commands = {}
|
plugin_commands = {}
|
||||||
plugin_keys = {}
|
plugin_keys = {}
|
||||||
|
|
||||||
def __init__(self, core, jid, nick, password=None):
|
def __init__(self, core, jid, nick, password=None):
|
||||||
self.joined = False
|
|
||||||
ChatTab.__init__(self, core, jid)
|
ChatTab.__init__(self, core, jid)
|
||||||
if self.joined == False:
|
self.joined = False
|
||||||
self._state = 'disconnected'
|
self._state = 'disconnected'
|
||||||
|
# our nick in the MUC
|
||||||
self.own_nick = nick
|
self.own_nick = nick
|
||||||
|
# self User object
|
||||||
self.own_user = None
|
self.own_user = None
|
||||||
self.name = jid
|
self.name = jid
|
||||||
self.password = password
|
self.password = password
|
||||||
|
# buffered presences
|
||||||
self.presence_buffer = []
|
self.presence_buffer = []
|
||||||
|
# userlist
|
||||||
self.users = []
|
self.users = []
|
||||||
self.privates = [] # private conversations
|
# private conversations
|
||||||
|
self.privates = []
|
||||||
self.topic = ''
|
self.topic = ''
|
||||||
self.topic_from = ''
|
self.topic_from = ''
|
||||||
self.remote_wants_chatstates = True
|
|
||||||
# Self ping event, so we can cancel it when we leave the room
|
|
||||||
self.self_ping_event = None
|
|
||||||
# We send active, composing and paused states to the MUC because
|
# We send active, composing and paused states to the MUC because
|
||||||
# the chatstate may or may not be filtered by the MUC,
|
# the chatstate may or may not be filtered by the MUC,
|
||||||
# that’s not our problem.
|
# that’s not our problem.
|
||||||
|
self.remote_wants_chatstates = True
|
||||||
|
# Self ping event, so we can cancel it when we leave the room
|
||||||
|
self.self_ping_event = None
|
||||||
|
# UI stuff
|
||||||
self.topic_win = windows.Topic()
|
self.topic_win = windows.Topic()
|
||||||
self.text_win = windows.TextWin()
|
self.text_win = windows.TextWin()
|
||||||
self._text_buffer.add_window(self.text_win)
|
self._text_buffer.add_window(self.text_win)
|
||||||
|
@ -74,131 +80,15 @@ class MucTab(ChatTab):
|
||||||
self.user_win = windows.UserList()
|
self.user_win = windows.UserList()
|
||||||
self.info_header = windows.MucInfoWin()
|
self.info_header = windows.MucInfoWin()
|
||||||
self.input = windows.MessageInput()
|
self.input = windows.MessageInput()
|
||||||
self.ignores = [] # set of Users
|
# List of ignored users
|
||||||
|
self.ignores = []
|
||||||
# keys
|
# keys
|
||||||
self.key_func['^I'] = self.completion
|
self.register_keys()
|
||||||
self.key_func['M-u'] = self.scroll_user_list_down
|
|
||||||
self.key_func['M-y'] = self.scroll_user_list_up
|
|
||||||
self.key_func['M-n'] = self.go_to_next_hl
|
|
||||||
self.key_func['M-p'] = self.go_to_prev_hl
|
|
||||||
# commands
|
|
||||||
self.register_command('ignore', self.command_ignore,
|
|
||||||
usage='<nickname>',
|
|
||||||
desc='Ignore a specified nickname.',
|
|
||||||
shortdesc='Ignore someone',
|
|
||||||
completion=self.completion_ignore)
|
|
||||||
self.register_command('unignore', self.command_unignore,
|
|
||||||
usage='<nickname>',
|
|
||||||
desc='Remove the specified nickname from the ignore list.',
|
|
||||||
shortdesc='Unignore someone.',
|
|
||||||
completion=self.completion_unignore)
|
|
||||||
self.register_command('kick', self.command_kick,
|
|
||||||
usage='<nick> [reason]',
|
|
||||||
desc='Kick the user with the specified nickname.'
|
|
||||||
' You also can give an optional reason.',
|
|
||||||
shortdesc='Kick someone.',
|
|
||||||
completion=self.completion_quoted)
|
|
||||||
self.register_command('ban', self.command_ban,
|
|
||||||
usage='<nick> [reason]',
|
|
||||||
desc='Ban the user with the specified nickname.'
|
|
||||||
' You also can give an optional reason.',
|
|
||||||
shortdesc='Ban someone',
|
|
||||||
completion=self.completion_quoted)
|
|
||||||
self.register_command('role', self.command_role,
|
|
||||||
usage='<nick> <role> [reason]',
|
|
||||||
desc='Set the role of an user. Roles can be:'
|
|
||||||
' none, visitor, participant, moderator.'
|
|
||||||
' You also can give an optional reason.',
|
|
||||||
shortdesc='Set the role of an user.',
|
|
||||||
completion=self.completion_role)
|
|
||||||
self.register_command('affiliation', self.command_affiliation,
|
|
||||||
usage='<nick or jid> <affiliation>',
|
|
||||||
desc='Set the affiliation of an user. Affiliations can be:'
|
|
||||||
' outcast, none, member, admin, owner.',
|
|
||||||
shortdesc='Set the affiliation of an user.',
|
|
||||||
completion=self.completion_affiliation)
|
|
||||||
self.register_command('topic', self.command_topic,
|
|
||||||
usage='<subject>',
|
|
||||||
desc='Change the subject of the room.',
|
|
||||||
shortdesc='Change the subject.',
|
|
||||||
completion=self.completion_topic)
|
|
||||||
self.register_command('subject', self.command_topic,
|
|
||||||
usage='<subject>',
|
|
||||||
desc='Change the subject of the room.',
|
|
||||||
shortdesc='Change the subject.',
|
|
||||||
completion=self.completion_topic)
|
|
||||||
self.register_command('query', self.command_query,
|
|
||||||
usage='<nick> [message]',
|
|
||||||
desc='Open a private conversation with <nick>. This nick'
|
|
||||||
' has to be present in the room you\'re currently in.'
|
|
||||||
' If you specified a message after the nickname, it '
|
|
||||||
'will immediately be sent to this user.',
|
|
||||||
shortdesc='Query an user.',
|
|
||||||
completion=self.completion_quoted)
|
|
||||||
self.register_command('part', self.command_part,
|
|
||||||
usage='[message]',
|
|
||||||
desc='Disconnect from a room. You can'
|
|
||||||
' specify an optional message.',
|
|
||||||
shortdesc='Leave the room.')
|
|
||||||
self.register_command('close', self.command_close,
|
|
||||||
usage='[message]',
|
|
||||||
desc='Disconnect from a room and close the tab.'
|
|
||||||
' You can specify an optional message if '
|
|
||||||
'you are still connected.',
|
|
||||||
shortdesc='Close the tab.')
|
|
||||||
self.register_command('nick', self.command_nick,
|
|
||||||
usage='<nickname>',
|
|
||||||
desc='Change your nickname in the current room.',
|
|
||||||
shortdesc='Change your nickname.',
|
|
||||||
completion=self.completion_nick)
|
|
||||||
self.register_command('recolor', self.command_recolor,
|
|
||||||
usage='[random]',
|
|
||||||
desc='Re-assign a color to all participants of the'
|
|
||||||
' current room, based on the last time they talked.'
|
|
||||||
' Use this if the participants currently talking '
|
|
||||||
'have too many identical colors. Use /recolor random'
|
|
||||||
' for a non-deterministic result.',
|
|
||||||
shortdesc='Change the nicks colors.',
|
|
||||||
completion=self.completion_recolor)
|
|
||||||
self.register_command('color', self.command_color,
|
|
||||||
usage='<nick> <color>',
|
|
||||||
desc='Fix a color for a nick. Use "unset" instead of a color'
|
|
||||||
' to remove the attribution',
|
|
||||||
shortdesc='Fix a color for a nick.',
|
|
||||||
completion=self.completion_color)
|
|
||||||
self.register_command('cycle', self.command_cycle,
|
|
||||||
usage='[message]',
|
|
||||||
desc='Leave the current room and rejoin it immediately.',
|
|
||||||
shortdesc='Leave and re-join the room.')
|
|
||||||
self.register_command('info', self.command_info,
|
|
||||||
usage='<nickname>',
|
|
||||||
desc='Display some information about the user '
|
|
||||||
'in the MUC: its/his/her role, affiliation,'
|
|
||||||
' status and status message.',
|
|
||||||
shortdesc='Show an user\'s infos.',
|
|
||||||
completion=self.completion_info)
|
|
||||||
self.register_command('configure', self.command_configure,
|
|
||||||
desc='Configure the current room, through a form.',
|
|
||||||
shortdesc='Configure the room.')
|
|
||||||
self.register_command('version', self.command_version,
|
|
||||||
usage='<jid or nick>',
|
|
||||||
desc='Get the software version of the given JID'
|
|
||||||
' or nick in room (usually its XMPP client'
|
|
||||||
' and Operating System).',
|
|
||||||
shortdesc='Get the software version of a jid.',
|
|
||||||
completion=self.completion_version)
|
|
||||||
self.register_command('names', self.command_names,
|
|
||||||
desc='Get the users in the room with their roles.',
|
|
||||||
shortdesc='List the users.')
|
|
||||||
self.register_command('invite', self.command_invite,
|
|
||||||
desc='Invite a contact to this room',
|
|
||||||
usage='<jid> [reason]',
|
|
||||||
shortdesc='Invite a contact to this room',
|
|
||||||
completion=self.completion_invite)
|
|
||||||
|
|
||||||
self.resize()
|
|
||||||
self.update_commands()
|
|
||||||
self.update_keys()
|
self.update_keys()
|
||||||
|
# commands
|
||||||
|
self.register_commands()
|
||||||
|
self.update_commands()
|
||||||
|
self.resize()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def general_jid(self):
|
def general_jid(self):
|
||||||
|
@ -1763,6 +1653,192 @@ class MucTab(ChatTab):
|
||||||
self.command_cycle("the MUC server is not responding")
|
self.command_cycle("the MUC server is not responding")
|
||||||
self.core.refresh_window()
|
self.core.refresh_window()
|
||||||
|
|
||||||
|
def register_keys(self):
|
||||||
|
"Register tab-specific keys"
|
||||||
|
self.key_func['^I'] = self.completion
|
||||||
|
self.key_func['M-u'] = self.scroll_user_list_down
|
||||||
|
self.key_func['M-y'] = self.scroll_user_list_up
|
||||||
|
self.key_func['M-n'] = self.go_to_next_hl
|
||||||
|
self.key_func['M-p'] = self.go_to_prev_hl
|
||||||
|
|
||||||
|
def register_commands(self):
|
||||||
|
"Register tab-specific commands"
|
||||||
|
self.register_commands_batch([
|
||||||
|
{
|
||||||
|
'name': 'ignore',
|
||||||
|
'func': self.command_ignore,
|
||||||
|
'usage': '<nickname>',
|
||||||
|
'desc': 'Ignore a specified nickname.',
|
||||||
|
'shortdesc': 'Ignore someone',
|
||||||
|
'completion': self.completion_unignore
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'unignore',
|
||||||
|
'func': self.command_unignore,
|
||||||
|
'usage': '<nickname>',
|
||||||
|
'desc': 'Remove the specified nickname from the ignore list.',
|
||||||
|
'shortdesc': 'Unignore someone.',
|
||||||
|
'completion': self.completion_unignore
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'kick',
|
||||||
|
'func': self.command_kick,
|
||||||
|
'usage': '<nick> [reason]',
|
||||||
|
'desc': ('Kick the user with the specified nickname.'
|
||||||
|
' You also can give an optional reason.'),
|
||||||
|
'shortdesc': 'Kick someone.',
|
||||||
|
'completion': self.completion_quoted
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'ban',
|
||||||
|
'func': self.command_ban,
|
||||||
|
'usage': '<nick> [reason]',
|
||||||
|
'desc': ('Ban the user with the specified nickname.'
|
||||||
|
' You also can give an optional reason.'),
|
||||||
|
'shortdesc': 'Ban someone',
|
||||||
|
'completion': self.completion_quoted
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'role',
|
||||||
|
'func': self.command_role,
|
||||||
|
'usage': '<nick> <role> [reason]',
|
||||||
|
'desc': ('Set the role of an user. Roles can be:'
|
||||||
|
' none, visitor, participant, moderator.'
|
||||||
|
' You also can give an optional reason.'),
|
||||||
|
'shortdesc': 'Set the role of an user.',
|
||||||
|
'completion': self.completion_role
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'affiliation',
|
||||||
|
'func': self.command_affiliation,
|
||||||
|
'usage': '<nick or jid> <affiliation>',
|
||||||
|
'desc': ('Set the affiliation of an user. Affiliations can be:'
|
||||||
|
' outcast, none, member, admin, owner.'),
|
||||||
|
'shortdesc': 'Set the affiliation of an user.',
|
||||||
|
'completion': self.completion_affiliation
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'topic',
|
||||||
|
'func': self.command_topic,
|
||||||
|
'usage': '<subject>',
|
||||||
|
'desc': 'Change the subject of the room.',
|
||||||
|
'shortdesc': 'Change the subject.',
|
||||||
|
'completion': self.completion_topic
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'subject',
|
||||||
|
'func': self.command_topic,
|
||||||
|
'usage': '<subject>',
|
||||||
|
'desc': 'Change the subject of the room.',
|
||||||
|
'shortdesc': 'Change the subject.',
|
||||||
|
'completion': self.completion_topic
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'query',
|
||||||
|
'func': self.command_query,
|
||||||
|
'usage': '<nick> [message]',
|
||||||
|
'desc': ('Open a private conversation with <nick>. This nick'
|
||||||
|
' has to be present in the room you\'re currently in.'
|
||||||
|
' If you specified a message after the nickname, it '
|
||||||
|
'will immediately be sent to this user.'),
|
||||||
|
'shortdesc': 'Query a user.',
|
||||||
|
'completion': self.completion_quoted
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'part',
|
||||||
|
'func': self.command_part,
|
||||||
|
'usage': '[message]',
|
||||||
|
'desc': ('Disconnect from a room. You can'
|
||||||
|
' specify an optional message.'),
|
||||||
|
'shortdesc': 'Leave the room.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'close',
|
||||||
|
'func': self.command_close,
|
||||||
|
'usage': '[message]',
|
||||||
|
'desc': ('Disconnect from a room and close the tab.'
|
||||||
|
' You can specify an optional message if '
|
||||||
|
'you are still connected.'),
|
||||||
|
'shortdesc': 'Close the tab.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'nick',
|
||||||
|
'func': self.command_nick,
|
||||||
|
'usage': '<nickname>',
|
||||||
|
'desc': 'Change your nickname in the current room.',
|
||||||
|
'shortdesc': 'Change your nickname.',
|
||||||
|
'completion': self.completion_nick
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name':'recolor',
|
||||||
|
'func': self.command_recolor,
|
||||||
|
'usage': '[random]',
|
||||||
|
'desc': ('Re-assign a color to all participants of the'
|
||||||
|
' current room, based on the last time they talked.'
|
||||||
|
' Use this if the participants currently talking '
|
||||||
|
'have too many identical colors. Use /recolor random'
|
||||||
|
' for a non-deterministic result.'),
|
||||||
|
'shortdesc': 'Change the nicks colors.',
|
||||||
|
'completion': self.completion_recolor
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'color',
|
||||||
|
'func': self.command_color,
|
||||||
|
'usage': '<nick> <color>',
|
||||||
|
'desc': ('Fix a color for a nick. Use "unset" instead of a '
|
||||||
|
'color to remove the attribution'),
|
||||||
|
'shortdesc': 'Fix a color for a nick.',
|
||||||
|
'completion': self.completion_recolor
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'cycle',
|
||||||
|
'func': self.command_cycle,
|
||||||
|
'usage': '[message]',
|
||||||
|
'desc': 'Leave the current room and rejoin it immediately.',
|
||||||
|
'shortdesc': 'Leave and re-join the room.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'info',
|
||||||
|
'func': self.command_info,
|
||||||
|
'usage': '<nickname>',
|
||||||
|
'desc': ('Display some information about the user '
|
||||||
|
'in the MUC: its/his/her role, affiliation,'
|
||||||
|
' status and status message.'),
|
||||||
|
'shortdesc': 'Show an user\'s infos.',
|
||||||
|
'completion': self.completion_info
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'configure',
|
||||||
|
'func': self.command_configure,
|
||||||
|
'desc': 'Configure the current room, through a form.',
|
||||||
|
'shortdesc': 'Configure the room.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'version',
|
||||||
|
'func': self.command_version,
|
||||||
|
'usage': '<jid or nick>',
|
||||||
|
'desc': ('Get the software version of the given JID'
|
||||||
|
' or nick in room (usually its XMPP client'
|
||||||
|
' and Operating System).'),
|
||||||
|
'shortdesc': 'Get the software version of a jid.',
|
||||||
|
'completion': self.completion_version
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'names',
|
||||||
|
'func': self.command_names,
|
||||||
|
'desc': 'Get the users in the room with their roles.',
|
||||||
|
'shortdesc': 'List the users.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'invite',
|
||||||
|
'func': self.command_invite,
|
||||||
|
'desc': 'Invite a contact to this room',
|
||||||
|
'usage': '<jid> [reason]',
|
||||||
|
'shortdesc': 'Invite a contact to this room',
|
||||||
|
'completion': self.completion_invite
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
class PresenceError(Exception): pass
|
class PresenceError(Exception): pass
|
||||||
|
|
||||||
def dissect_presence(presence):
|
def dissect_presence(presence):
|
||||||
|
|
Loading…
Reference in a new issue