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:
parent
3b49db2892
commit
286ee2a5e2
1 changed files with 47 additions and 0 deletions
|
|
@ -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":
|
||||
|
|
|
|||
Loading…
Reference in a new issue