summaryrefslogtreecommitdiff
path: root/poezio/core/core.py
diff options
context:
space:
mode:
authorMaxime “pep” Buquet <pep@bouah.net>2018-11-24 04:36:19 +0000
committerMaxime “pep” Buquet <pep@bouah.net>2018-12-16 16:57:48 +0000
commit0f6205d29bf9a42939e82914c905aab118be4fc7 (patch)
tree9ed907636b48cf61fc09ecbbc82badc25d8ed62f /poezio/core/core.py
parentcf50ef2cf38a0366bcba7e45c254dc03e4fe981f (diff)
downloadpoezio-0f6205d29bf9a42939e82914c905aab118be4fc7.tar.gz
poezio-0f6205d29bf9a42939e82914c905aab118be4fc7.tar.bz2
poezio-0f6205d29bf9a42939e82914c905aab118be4fc7.tar.xz
poezio-0f6205d29bf9a42939e82914c905aab118be4fc7.zip
Add /invite for ConversationTab to generate new room with all invitees
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
Diffstat (limited to 'poezio/core/core.py')
-rw-r--r--poezio/core/core.py95
1 files changed, 64 insertions, 31 deletions
diff --git a/poezio/core/core.py b/poezio/core/core.py
index edec3b0c..9ffa59a9 100644
--- a/poezio/core/core.py
+++ b/poezio/core/core.py
@@ -15,11 +15,14 @@ import shutil
import time
import uuid
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.util import FileSystemPerJidCache
from slixmpp.xmlstream.handler import Callback
+from slixmpp.exceptions import IqError, IqTimeout
from poezio import connection
from poezio import decorators
@@ -869,7 +872,35 @@ class Core:
self.xmpp.plugin['xep_0030'].get_info(
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
component of the user who initiated the request. One the room is
@@ -877,41 +908,43 @@ class Core:
contacts to join in.
"""
- def callback(results):
- muc_from_identity = ''
+ results = await self.xmpp['xep_0030'].get_info_from_domain()
- for info in results:
- for identity in info['disco_info']['identities']:
- if identity[0] == 'conference' and identity[1] == 'text':
- muc_from_identity = info['from'].bare
+ muc_from_identity = ''
+ for info in results:
+ for identity in info['disco_info']['identities']:
+ if identity[0] == 'conference' and identity[1] == 'text':
+ muc_from_identity = info['from'].bare
- # Use config.default_muc_service as muc component if available,
- # otherwise find muc component by disco#items-ing the user domain.
- # If not, give up
- default_muc = config.get('default_muc_service', muc_from_identity)
- if not default_muc:
- self.information(
- "Error finding a MUC service to join. If your server does not "
- "provide one, set 'default_muc_service' manually to a MUC "
- "service that allows room creation.",
- 'Error'
- )
- return
+ # Use config.default_muc_service as muc component if available,
+ # otherwise find muc component by disco#items-ing the user domain.
+ # If not, give up
+ default_muc = config.get('default_muc_service', muc_from_identity)
+ if not default_muc:
+ self.information(
+ "Error finding a MUC service to join. If your server does not "
+ "provide one, set 'default_muc_service' manually to a MUC "
+ "service that allows room creation.",
+ 'Error'
+ )
+ return
- nick = self.own_nick
- room = uuid.uuid4().hex + '@' + default_muc
+ nick = self.own_nick
+ room = uuid.uuid4().hex + '@' + default_muc
- self.open_new_room(room, nick).join()
- self.information('Room %s created' % room, 'Info')
+ 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
- for jid in jids:
- self.invite(jid, room)
+ self.information('Room %s created' % room, 'Info')
- asyncio.ensure_future(
- self.xmpp['xep_0030'].get_info_from_domain(
- callback=callback,
- )
- )
+ for jid in jids:
+ self.invite(jid, room)
def get_error_message(self, stanza, deprecated: bool = False):
"""