diff options
author | mathieui <mathieui@mathieui.net> | 2014-04-26 14:05:28 +0200 |
---|---|---|
committer | mathieui <mathieui@mathieui.net> | 2014-04-26 14:05:28 +0200 |
commit | 1f0ff4f0c30f5326e1b36ff03ebf83ac85239e89 (patch) | |
tree | 77aa90b2a0a7b3a8fec744b7c45f817ccd593e62 | |
parent | 4c4e2083a6f4cab94b5cf63620e7a1be66c82817 (diff) | |
download | poezio-1f0ff4f0c30f5326e1b36ff03ebf83ac85239e89.tar.gz poezio-1f0ff4f0c30f5326e1b36ff03ebf83ac85239e89.tar.bz2 poezio-1f0ff4f0c30f5326e1b36ff03ebf83ac85239e89.tar.xz poezio-1f0ff4f0c30f5326e1b36ff03ebf83ac85239e89.zip |
Fix #2444 (implement room destroy)
- destroy the current room if no parameter
- destroy the room given as a parameter if any
- no reason or alt room because it would be ambiguous in a command
(implementation ideas welcome)
-rw-r--r-- | doc/source/commands.rst | 8 | ||||
-rw-r--r-- | src/core/commands.py | 12 | ||||
-rw-r--r-- | src/core/core.py | 8 | ||||
-rw-r--r-- | src/multiuserchat.py | 31 |
4 files changed, 59 insertions, 0 deletions
diff --git a/doc/source/commands.rst b/doc/source/commands.rst index 7a6346c5..b7b00d46 100644 --- a/doc/source/commands.rst +++ b/doc/source/commands.rst @@ -55,6 +55,14 @@ These commands work in *any* tab. - ``/join room@server.tld/my_nick password`` - ``/join / password`` + /destroy_room + **Usage:** ``/destroy_room [room JID]`` + + Try to destroy the room given as a parameter, or the current room + is not parameter is given and the current tab is a chatroom. + + You need to be the owner of a room or a server admin to destroy it. + /exit /quit Just disconnect from the server and exit poezio. diff --git a/src/core/commands.py b/src/core/commands.py index 8b753b18..0815a80e 100644 --- a/src/core/commands.py +++ b/src/core/commands.py @@ -815,6 +815,18 @@ def command_quit(self, arg=''): self.reset_curses() sys.exit() +def command_destroy_room(self, arg=''): + """ + /destroy_room [JID] + """ + room = safeJID(arg).bare + if room: + muc.destroy_room(self.xmpp, room) + elif isinstance(self.current_tab(), tabs.MucTab) and not arg: + muc.destroy_room(self.xmpp, self.current_tab().general_jid) + else: + self.information(_('Invalid JID: "%s"') % arg, _('Error')) + def command_bind(self, arg): """ Bind a key. diff --git a/src/core/core.py b/src/core/core.py index 1fe00d2d..5313e89d 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -1639,6 +1639,13 @@ class Core(object): "tab."), shortdesc=_('Move a tab.'), completion=self.completion_move_tab) + self.register_command('destroy_room', self.command_destroy_room, + usage=_('[room JID]'), + desc=_('Try to destroy the room [room JID], or the current' + ' tab if it is a multi-user chat and [room JID] is ' + 'not given.'), + shortdesc=_('Destroy a room.'), + completion=None) self.register_command('show', self.command_status, usage=_('<availability> [status message]'), desc=_("Sets your availability and (optionally) your status " @@ -1856,6 +1863,7 @@ class Core(object): command_bookmark_local = commands.command_bookmark_local command_bookmark = commands.command_bookmark command_bookmarks = commands.command_bookmarks + command_destroy_room = commands.command_destroy_room command_remove_bookmark = commands.command_remove_bookmark command_set = commands.command_set command_server_cycle = commands.command_server_cycle diff --git a/src/multiuserchat.py b/src/multiuserchat.py index d1921100..ccf33ed1 100644 --- a/src/multiuserchat.py +++ b/src/multiuserchat.py @@ -11,6 +11,7 @@ Add some facilities that are not available on the XEP_0045 sleek plugin """ +from gettext import gettext as _ from xml.etree import cElementTree as ET from common import safeJID @@ -18,6 +19,36 @@ import logging log = logging.getLogger(__name__) NS_MUC_ADMIN = 'http://jabber.org/protocol/muc#admin' +NS_MUC_OWNER = 'http://jabber.org/protocol/muc#owner' + + +def destroy_room(xmpp, room, reason='', altroom=''): + """ + destroy a room + """ + room = safeJID(room) + if not room: + return False + iq = xmpp.make_iq_set() + iq['to'] = room + query = ET.Element('{%s}query' % NS_MUC_OWNER) + destroy = ET.Element('{%s}destroy' % NS_MUC_OWNER) + if altroom: + destroy.attrib['jid'] = altroom + if reason: + xreason = ET.Element('{%s}reason' % NS_MUC_OWNER) + xreason.text = reason + destroy.append(xreason) + query.append(destroy) + iq.append(query) + def callback(iq): + if not iq or iq['type'] == 'error': + xmpp.core.information(_('Unable to destroy room %s') % room, + _('Info')) + else: + xmpp.core.information(_('Room %s destroyed') % room, _('Info')) + iq.send(block=False, callback=callback) + return True def send_private_message(xmpp, jid, line): """ |