diff options
-rw-r--r-- | poezio/tabs/basetabs.py | 15 | ||||
-rw-r--r-- | poezio/tabs/muctab.py | 334 |
2 files changed, 220 insertions, 129 deletions
diff --git a/poezio/tabs/basetabs.py b/poezio/tabs/basetabs.py index 3a898129..90b1d54d 100644 --- a/poezio/tabs/basetabs.py +++ b/poezio/tabs/basetabs.py @@ -183,6 +183,21 @@ class Tab(object): """ 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=''): """ Add a command diff --git a/poezio/tabs/muctab.py b/poezio/tabs/muctab.py index 459e1e06..b68411d5 100644 --- a/poezio/tabs/muctab.py +++ b/poezio/tabs/muctab.py @@ -47,26 +47,32 @@ class MucTab(ChatTab): message_type = 'groupchat' plugin_commands = {} plugin_keys = {} + def __init__(self, core, jid, nick, password=None): - self.joined = False ChatTab.__init__(self, core, jid) - if self.joined == False: - self._state = 'disconnected' + self.joined = False + self._state = 'disconnected' + # our nick in the MUC self.own_nick = nick + # self User object self.own_user = None self.name = jid self.password = password + # buffered presences self.presence_buffer = [] + # userlist self.users = [] - self.privates = [] # private conversations + # private conversations + self.privates = [] self.topic = '' 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 # the chatstate may or may not be filtered by the MUC, # 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.text_win = windows.TextWin() self._text_buffer.add_window(self.text_win) @@ -74,131 +80,15 @@ class MucTab(ChatTab): self.user_win = windows.UserList() self.info_header = windows.MucInfoWin() self.input = windows.MessageInput() - self.ignores = [] # set of Users + # List of ignored users + self.ignores = [] # 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 + self.register_keys() + self.update_keys() # 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.register_commands() self.update_commands() - self.update_keys() + self.resize() @property def general_jid(self): @@ -1763,6 +1653,192 @@ class MucTab(ChatTab): self.command_cycle("the MUC server is not responding") 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 def dissect_presence(presence): |