Add (back?) reason and altroom arguments for /destroy_room.

Also make use of slixmpp’s new destroy_room() function.
This commit is contained in:
Emmanuel Gil Peyrot 2020-12-27 01:37:35 +01:00 committed by Link Mauve
parent 826fa779c4
commit 85b1222222
3 changed files with 34 additions and 52 deletions

View file

@ -56,7 +56,7 @@ These commands work in *any* tab.
- ``/join / password`` - ``/join / password``
/destroy_room /destroy_room
**Usage:** ``/destroy_room [room JID]`` **Usage:** ``/destroy_room [room JID [reason [alternative venue]]]``
Try to destroy the room given as a parameter, or the current room 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. is not parameter is given and the current tab is a chatroom.

View file

@ -8,7 +8,7 @@ from typing import List, Optional, Tuple
import logging import logging
from slixmpp import Iq, JID, InvalidJID from slixmpp import Iq, JID, InvalidJID
from slixmpp.exceptions import XMPPError from slixmpp.exceptions import XMPPError, IqError, IqTimeout
from slixmpp.xmlstream.xmlstream import NotConnectedError from slixmpp.xmlstream.xmlstream import NotConnectedError
from slixmpp.xmlstream.stanzabase import StanzaBase from slixmpp.xmlstream.stanzabase import StanzaBase
from slixmpp.xmlstream.handler import Callback from slixmpp.xmlstream.handler import Callback
@ -1151,26 +1151,43 @@ class CommandCore:
"disconnected", self.core.exit, disposable=True) "disconnected", self.core.exit, disposable=True)
self.core.disconnect(msg) self.core.disconnect(msg)
@command_args_parser.quoted(0, 1, ['']) @command_args_parser.quoted(0, 3, ['', '', ''])
def destroy_room(self, args: List[str]) -> None: def destroy_room(self, args: List[str]):
""" """
/destroy_room [JID] /destroy_room [JID [reason [alternative room JID]]]
""" """
if not args[0] and isinstance(self.core.tabs.current_tab, tabs.MucTab): async def do_destroy(room: JID, reason: str, altroom: JID):
muc.destroy_room(self.core.xmpp,
self.core.tabs.current_tab.general_jid)
return None
try: try:
room = JID(args[0]).bare await self.core.xmpp['xep_0045'].destroy(room, reason, altroom)
if room: except (IqError, IqTimeout) as e:
muc.destroy_room(self.core.xmpp, room) xmpp.core.information('Unable to destroy room %s: %s' % (room, e), 'Info')
return None else:
except InvalidJID: xmpp.core.information('Room %s destroyed' % room, 'Info')
pass
self.core.information('Invalid JID: "%s"' % args[0], 'Error') if not args[0] and isinstance(self.core.tabs.current_tab, tabs.MucTab):
return None room = self.core.tabs.current_tab.general_jid
else:
try:
room = JID(args[0])
except InvalidJID:
room = None
else:
if room.resource:
room = None
if room is None:
self.core.information('Invalid room JID: "%s"' % args[0], 'Error')
return
reason = args[1]
if args[2]:
try:
altroom = JID(args[2])
except InvalidJID:
self.core.information('Invalid alternative room JID: "%s"' % args[2], 'Error')
return
asyncio.ensure_future(do_destroy(room, reason, altroom))
@command_args_parser.quoted(1, 1, ['']) @command_args_parser.quoted(1, 1, [''])
def bind(self, args): def bind(self, args):

View file

@ -39,41 +39,6 @@ NS_MUC_ADMIN = 'http://jabber.org/protocol/muc#admin'
NS_MUC_OWNER = 'http://jabber.org/protocol/muc#owner' NS_MUC_OWNER = 'http://jabber.org/protocol/muc#owner'
def destroy_room(
xmpp: ClientXMPP,
room: str,
reason: str = '',
altroom: str = ''
) -> bool:
"""
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: Iq) -> None:
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(callback=callback)
return True
def change_show( def change_show(
xmpp: ClientXMPP, xmpp: ClientXMPP,
jid: JID, jid: JID,