Add /invite for ConversationTab to generate new room with all invitees
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
parent
cf50ef2cf3
commit
0f6205d29b
3 changed files with 83 additions and 39 deletions
|
@ -6,6 +6,7 @@ import logging
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
import asyncio
|
||||||
from xml.etree import cElementTree as ET
|
from xml.etree import cElementTree as ET
|
||||||
|
|
||||||
from slixmpp.exceptions import XMPPError
|
from slixmpp.exceptions import XMPPError
|
||||||
|
@ -764,17 +765,21 @@ class CommandCore:
|
||||||
self.core.information('Invited %s to %s' % (to.bare, room), 'Info')
|
self.core.information('Invited %s to %s' % (to.bare, room), 'Info')
|
||||||
|
|
||||||
@command_args_parser.quoted(1, 0)
|
@command_args_parser.quoted(1, 0)
|
||||||
def impromptu(self, args):
|
def impromptu(self, args: str) -> None:
|
||||||
"""/impromptu <jid> [<jid> ...]"""
|
"""/impromptu <jid> [<jid> ...]"""
|
||||||
|
|
||||||
if args is None:
|
if args is None:
|
||||||
return self.help('impromptu')
|
return self.help('impromptu')
|
||||||
|
|
||||||
jids = []
|
jids = set()
|
||||||
for jid in common.shell_split(' '.join(args)):
|
current_tab = self.core.tabs.current_tab
|
||||||
jids.append(safeJID(jid).bare)
|
if isinstance(current_tab, tabs.ConversationTab):
|
||||||
|
jids.add(current_tab.general_jid)
|
||||||
|
|
||||||
self.core.impromptu(jids)
|
for jid in common.shell_split(' '.join(args)):
|
||||||
|
jids.add(safeJID(jid).bare)
|
||||||
|
|
||||||
|
asyncio.ensure_future(self.core.impromptu(jids))
|
||||||
self.core.information('Invited %s to a random room' % (' '.join(jids)), 'Info')
|
self.core.information('Invited %s to a random room' % (' '.join(jids)), 'Info')
|
||||||
|
|
||||||
@command_args_parser.quoted(1, 1, [''])
|
@command_args_parser.quoted(1, 1, [''])
|
||||||
|
|
|
@ -15,11 +15,14 @@ import shutil
|
||||||
import time
|
import time
|
||||||
import uuid
|
import uuid
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from typing import Callable, Dict, List, Optional, Tuple, Type
|
from typing import Callable, Dict, List, Optional, Set, Tuple, Type
|
||||||
|
from xml.etree import cElementTree as ET
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
from slixmpp import JID
|
from slixmpp import JID
|
||||||
from slixmpp.util import FileSystemPerJidCache
|
from slixmpp.util import FileSystemPerJidCache
|
||||||
from slixmpp.xmlstream.handler import Callback
|
from slixmpp.xmlstream.handler import Callback
|
||||||
|
from slixmpp.exceptions import IqError, IqTimeout
|
||||||
|
|
||||||
from poezio import connection
|
from poezio import connection
|
||||||
from poezio import decorators
|
from poezio import decorators
|
||||||
|
@ -869,7 +872,35 @@ class Core:
|
||||||
self.xmpp.plugin['xep_0030'].get_info(
|
self.xmpp.plugin['xep_0030'].get_info(
|
||||||
jid=jid, timeout=5, callback=callback)
|
jid=jid, timeout=5, callback=callback)
|
||||||
|
|
||||||
def impromptu(self, jids: List[JID]) -> None:
|
def _impromptu_room_form(self, room, _jids):
|
||||||
|
# TODO: Use jids to generate user-friendly room name and description
|
||||||
|
fields = [
|
||||||
|
{'ftype': 'hidden', 'var': 'FORM_TYPE', 'value': 'http://jabber.org/protocol/muc#roomconfig'},
|
||||||
|
{'ftype': 'text-single', 'var': 'muc#roomconfig_roomname', 'value': 'Foo'},
|
||||||
|
{'ftype': 'text-single', 'var': 'muc#roomconfig_roomdesc', 'value': 'Bar'},
|
||||||
|
{'ftype': 'boolean', 'var': 'muc#roomconfig_changesubject', 'value': True},
|
||||||
|
{'ftype': 'boolean', 'var': 'muc#roomconfig_allowinvites', 'value': True},
|
||||||
|
{'ftype': 'boolean', 'var': 'muc#roomconfig_persistent', 'value': True},
|
||||||
|
{'ftype': 'boolean', 'var': 'muc#roomconfig_membersonly', 'value': True},
|
||||||
|
{'ftype': 'boolean', 'var': 'muc#roomconfig_publicroom', 'value': False},
|
||||||
|
{'ftype': 'list-single', 'var': 'muc#roomconfig_allowpm', 'value': 'none'},
|
||||||
|
{'ftype': 'list-single', 'var': 'muc#roomconfig_whois', 'value': 'anyone'},
|
||||||
|
]
|
||||||
|
|
||||||
|
form = self.xmpp['xep_0004'].make_form()
|
||||||
|
form['type'] = 'submit'
|
||||||
|
for field in fields:
|
||||||
|
form.add_field(**field)
|
||||||
|
|
||||||
|
iq = self.xmpp.Iq()
|
||||||
|
iq['type'] = 'set'
|
||||||
|
iq['to'] = room
|
||||||
|
query = ET.Element('{http://jabber.org/protocol/muc#owner}query')
|
||||||
|
query.append(form.xml)
|
||||||
|
iq.append(query)
|
||||||
|
return iq
|
||||||
|
|
||||||
|
async def impromptu(self, jids: Set[JID]) -> None:
|
||||||
"""
|
"""
|
||||||
Generates a new "Impromptu" room with a random localpart on the muc
|
Generates a new "Impromptu" room with a random localpart on the muc
|
||||||
component of the user who initiated the request. One the room is
|
component of the user who initiated the request. One the room is
|
||||||
|
@ -877,9 +908,9 @@ class Core:
|
||||||
contacts to join in.
|
contacts to join in.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def callback(results):
|
results = await self.xmpp['xep_0030'].get_info_from_domain()
|
||||||
muc_from_identity = ''
|
|
||||||
|
|
||||||
|
muc_from_identity = ''
|
||||||
for info in results:
|
for info in results:
|
||||||
for identity in info['disco_info']['identities']:
|
for identity in info['disco_info']['identities']:
|
||||||
if identity[0] == 'conference' and identity[1] == 'text':
|
if identity[0] == 'conference' and identity[1] == 'text':
|
||||||
|
@ -902,17 +933,19 @@ class Core:
|
||||||
room = uuid.uuid4().hex + '@' + default_muc
|
room = uuid.uuid4().hex + '@' + default_muc
|
||||||
|
|
||||||
self.open_new_room(room, nick).join()
|
self.open_new_room(room, nick).join()
|
||||||
|
iq = self._impromptu_room_form(room, jids)
|
||||||
|
try:
|
||||||
|
await iq.send()
|
||||||
|
except (IqError, IqTimeout):
|
||||||
|
self.information('Failed to create configure impromptu room.', 'Info')
|
||||||
|
# TODO: destroy? leave room.
|
||||||
|
return None
|
||||||
|
|
||||||
self.information('Room %s created' % room, 'Info')
|
self.information('Room %s created' % room, 'Info')
|
||||||
|
|
||||||
for jid in jids:
|
for jid in jids:
|
||||||
self.invite(jid, room)
|
self.invite(jid, room)
|
||||||
|
|
||||||
asyncio.ensure_future(
|
|
||||||
self.xmpp['xep_0030'].get_info_from_domain(
|
|
||||||
callback=callback,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
def get_error_message(self, stanza, deprecated: bool = False):
|
def get_error_message(self, stanza, deprecated: bool = False):
|
||||||
"""
|
"""
|
||||||
Takes a stanza of the form <message type='error'><error/></message>
|
Takes a stanza of the form <message type='error'><error/></message>
|
||||||
|
|
|
@ -79,6 +79,12 @@ class ConversationTab(OneToOneTab):
|
||||||
' allow you to see his presence, and allow them to'
|
' allow you to see his presence, and allow them to'
|
||||||
' see your presence.',
|
' see your presence.',
|
||||||
shortdesc='Add a user to your roster.')
|
shortdesc='Add a user to your roster.')
|
||||||
|
self.register_command(
|
||||||
|
'invite',
|
||||||
|
self.core.command.impromptu,
|
||||||
|
desc='Invite people into an impromptu room.',
|
||||||
|
shortdesc='Invite other users to the discussion',
|
||||||
|
completion=self.core.completion.impromptu)
|
||||||
self.update_commands()
|
self.update_commands()
|
||||||
self.update_keys()
|
self.update_keys()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue