diff --git a/poezio/core/commands.py b/poezio/core/commands.py index 5c8199c0..f301e801 100644 --- a/poezio/core/commands.py +++ b/poezio/core/commands.py @@ -763,6 +763,20 @@ class CommandCore: self.core.invite(to.full, room, reason=reason) self.core.information('Invited %s to %s' % (to.bare, room), 'Info') + @command_args_parser.quoted(1, 0) + def impromptu(self, args): + """/impromptu [ ...]""" + + if args is None: + return self.help('impromptu') + + jids = [] + for jid in common.shell_split(' '.join(args)): + jids.append(safeJID(jid).bare) + + self.core.impromptu(jids) + self.core.information('Invited %s to a random room' % (' '.join(jids)), 'Info') + @command_args_parser.quoted(1, 1, ['']) def decline(self, args): """/decline [reason]""" diff --git a/poezio/core/completions.py b/poezio/core/completions.py index b283950e..87bb2d47 100644 --- a/poezio/core/completions.py +++ b/poezio/core/completions.py @@ -289,6 +289,19 @@ class CompletionCore: return Completion( the_input.new_completion, rooms, n, '', quotify=True) + def impromptu(self, the_input): + """Completion for /impromptu""" + n = the_input.get_argument_position(quoted=True) + onlines = [] + offlines = [] + for barejid in roster.jids(): + if len(roster[barejid]): + onlines.append(barejid) + else: + offlines.append(barejid) + comp = sorted(onlines) + sorted(offlines) + return Completion(the_input.new_completion, comp, n, quotify=True) + def activity(self, the_input): """Completion for /activity""" n = the_input.get_argument_position(quoted=True) diff --git a/poezio/core/core.py b/poezio/core/core.py index eec0d49b..985dcbab 100644 --- a/poezio/core/core.py +++ b/poezio/core/core.py @@ -13,6 +13,7 @@ import pipes import sys import shutil import time +import uuid from collections import defaultdict from typing import Callable, Dict, List, Optional, Tuple, Type @@ -868,6 +869,28 @@ class Core: self.xmpp.plugin['xep_0030'].get_info( jid=jid, timeout=5, callback=callback) + def impromptu(self, jids: List[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 + created and the first user has joined, send invites for specified + contacts to join in. + """ + + # Use config.default_muc as muc component if available, otherwise + # find muc component by disco#items-ing the user domain. If not, give + # up + default_muc = 'chat.cluxia.eu' + + nick = self.own_nick + room = uuid.uuid4().hex + '@' + default_muc + + self.open_new_room(room, nick).join() + self.information('Room %s created' % room, 'Info') + + for jid in jids: + self.invite(jid, room) + def get_error_message(self, stanza, deprecated: bool = False): """ Takes a stanza of the form @@ -1788,6 +1811,13 @@ class Core: desc='Invite jid in room with reason.', shortdesc='Invite someone in a room.', completion=self.completion.invite) + self.register_command( + 'impromptu', + self.command.impromptu, + usage=' [ ...]', + desc='Invite people into an impromptu room', + shortdesc='Invite someone in a room.', + completion=self.completion.impromptu) self.register_command( 'invitations', self.command.invitations,