plugin XEP-0045, primitivus: added MUC configuration

This commit is contained in:
Goffi 2014-02-04 18:06:12 +01:00
commit 72fd99f679
3 changed files with 63 additions and 2 deletions

View file

@ -23,10 +23,12 @@ from twisted.internet import defer
from twisted.words.protocols.jabber import jid
from sat.core import exceptions
from sat.memory import memory
import uuid
from wokkel import muc
from sat.tools import xml_tools
try:
@ -56,18 +58,21 @@ class XEP_0045(object):
info(_("Plugin XEP_0045 initialization"))
self.host = host
self.clients = {}
self._sessions = memory.Sessions()
host.bridge.addMethod("joinMUC", ".plugin", in_sign='ssa{ss}s', out_sign='s', method=self._join)
host.bridge.addMethod("mucNick", ".plugin", in_sign='sss', out_sign='', method=self.mucNick)
host.bridge.addMethod("mucLeave", ".plugin", in_sign='ss', out_sign='', method=self.mucLeave, async = True)
host.bridge.addMethod("mucLeave", ".plugin", in_sign='ss', out_sign='', method=self.mucLeave, async=True)
host.bridge.addMethod("getRoomsJoined", ".plugin", in_sign='s', out_sign='a(sass)', method=self.getRoomsJoined)
host.bridge.addMethod("getRoomsSubjects", ".plugin", in_sign='s', out_sign='a(ss)', method=self.getRoomsSubjects)
host.bridge.addMethod("getUniqueRoomName", ".plugin", in_sign='ss', out_sign='s', method=self.getUniqueName)
host.bridge.addMethod("configureRoom", ".plugin", in_sign='ss', out_sign='s', method=self._configureRoom, async=True)
host.bridge.addSignal("roomJoined", ".plugin", signature='sasss') # args: room_jid, room_nicks, user_nick, profile
host.bridge.addSignal("roomLeft", ".plugin", signature='ss') # args: room_jid, profile
host.bridge.addSignal("roomUserJoined", ".plugin", signature='ssa{ss}s') # args: room_jid, user_nick, user_data, profile
host.bridge.addSignal("roomUserLeft", ".plugin", signature='ssa{ss}s') # args: room_jid, user_nick, user_data, profile
host.bridge.addSignal("roomUserChangedNick", ".plugin", signature='ssss') # args: room_jid, old_nick, new_nick, profile
host.bridge.addSignal("roomNewSubject", ".plugin", signature='sss') # args: room_jid, subject, profile
self.__submit_conf_id = host.registerCallback(self._submitConfiguration, with_data=True)
def __check_profile(self, profile):
"""check if profile is used and connected
@ -169,6 +174,51 @@ class XEP_0045(object):
nicks.append(nick)
return nicks, missing
def _configureRoom(self, room_jid_s, profile_key='@NONE@'):
d = self.configureRoom(jid.JID(room_jid_s), profile_key)
d.addCallback(lambda xmlui: xmlui.toXml())
return d
def configureRoom(self, room_jid, profile_key='@NONE@'):
""" return the room configuration form
@param room: jid of the room to configure
@param profile_key: %(doc_profile_key)s
@return: configuration form as XMLUI
"""
profile = self.host.memory.getProfileName(profile_key)
if not self.__check_profile(profile):
raise exceptions.ProfileUnknownError("Unknown or disconnected profile")
if room_jid.userhost() not in self.clients[profile].joined_rooms:
raise UnknownRoom("This room has not been joined")
def config2XMLUI(result):
if not result:
return ""
session_id, session_data = self._sessions.newSession(profile=profile)
session_data["room_jid"] = room_jid
xmlui = xml_tools.dataForm2XMLUI(result, submit_id=self.__submit_conf_id)
xmlui.session_id = session_id
return xmlui
d = self.clients[profile].getConfiguration(room_jid)
d.addCallback(config2XMLUI)
return d
def _submitConfiguration(self, raw_data, profile):
try:
session_data = self._sessions.profileGet(raw_data["session_id"], profile)
except KeyError:
warning ("session id doesn't exist, session has probably expired")
# TODO: send error dialog
return defer.succeed({})
data = xml_tools.XMLUIResult2DataFormResult(raw_data)
d = self.clients[profile].configure(session_data['room_jid'], data)
d.addCallback(lambda ignore: {})
del self._sessions[raw_data["session_id"]]
return d
def isNickInRoom(self, room_jid, nick, profile):
"""Tell if a nick is currently present in a room"""
profile = self.host.memory.getProfileName(profile)