plugin XEP-0045: added /list text command:

/list display a basic (for now) listing of available rooms in current or specified MUC service
This commit is contained in:
Goffi 2016-07-01 00:00:36 +02:00
commit 286ee2a5e2

View file

@ -82,6 +82,7 @@ class XEP_0045(object):
host.bridge.addSignal("mucRoomUserChangedNick", ".plugin", signature='ssss') # args: room_jid, old_nick, new_nick, profile
host.bridge.addSignal("mucRoomNewSubject", ".plugin", signature='sss') # args: room_jid, subject, profile
self.__submit_conf_id = host.registerCallback(self._submitConfiguration, with_data=True)
self._room_join_id = host.registerCallback(self._UIRoomJoinCb, with_data=True)
host.importMenu((D_("MUC"), D_("configure")), self._configureRoomMenu, security_limit=0, help_string=D_("Configure Multi-User Chat room"), type_=C.MENU_ROOM)
try:
self.txt_cmds = self.host.plugins[C.TEXT_CMDS]
@ -137,6 +138,12 @@ class XEP_0045(object):
else:
return True
def _UIRoomJoinCb(self, data, profile):
room_jid = jid.JID(data['index'])
client = self.host.getClient(profile)
self.join(client, room_jid)
return {}
def _passwordUICb(self, data, client, room_jid, nick):
"""Called when the user has given room password (or cancelled)"""
if C.bool(data.get(C.XMLUI_DATA_CANCELLED, "false")):
@ -145,6 +152,16 @@ class XEP_0045(object):
password = data[xml_tools.formEscape('password')]
return client._muc_client.join(room_jid, nick, password).addCallbacks(self._joinCb, self._joinEb, (client, room_jid, nick), errbackArgs=(client, room_jid, nick, password))
def _showListUI(self, items, client, service):
xmlui = xml_tools.XMLUI(title=D_('Rooms in {}'.format(service.full())))
adv_list = xmlui.changeContainer('advanced_list', columns=1, selectable='single', callback_id=self._room_join_id)
items = sorted(items, key=lambda i: i.name.lower())
for item in items:
adv_list.setRowIndex(item.entity.full())
xmlui.addText(item.name)
adv_list.end()
self.host.actionNew({'xmlui': xmlui.toXml()}, profile=client.profile)
def _joinCb(self, room, client, room_jid, nick):
"""Called when the user is in the requested room"""
if room.locked:
@ -642,6 +659,36 @@ class XEP_0045(object):
"""
return self.cmd_title(client, mess_data)
def cmd_list(self, client, mess_data):
"""list available rooms in a muc server
@command (all): [MUC_SERVICE]
- MUC_SERVICE: service to request
empty value will request room's service for a room,
or user's server default MUC service in a one2one chat
"""
unparsed = mess_data["unparsed"].strip()
try:
service = jid.JID(unparsed)
except RuntimeError:
if mess_data['type'] == C.MESS_TYPE_GROUPCHAT:
room_jid = mess_data["to"]
service = jid.JID(room_jid.host)
elif client.muc_service is not None:
service = client.muc_service
else:
msg = D_(u"No known default MUC service".format(unparsed))
self.text_cmds.feedBack(client, msg, mess_data)
return False
except jid.InvalidFormat:
msg = D_(u"{} is not a valid JID!".format(unparsed))
self.text_cmds.feedBack(client, msg, mess_data)
return False
d = self.host.getDiscoItems(service, profile=client.profile)
d.addCallback(self._showListUI, client, service)
return False
def _whois(self, client, whois_msg, mess_data, target_jid):
""" Add MUC user information to whois """
if mess_data['type'] != "groupchat":