Mercurial > libervia-backend
view plugins/plugin_xep_0100.py @ 48:4392f1fdb064
plugins improvement
- new protocols field in plugins info, useful to know which ones are implemented by the plugin
- XEP-0153 first implementation (vcard avatars)
- plugin vcard: avatar & nick cached, clients are noticed of updated values
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 06 Jan 2010 23:56:44 +1100 |
parents | 874de3020e1c |
children | a5b5fb5fc9fd |
line wrap: on
line source
#!/usr/bin/python # -*- coding: utf-8 -*- """ SAT plugin for managing gateways (xep-0100) Copyright (C) 2009 Jérôme Poisson (goffi@goffi.org) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ from logging import debug, info, error from twisted.internet import protocol from twisted.words.protocols.jabber import client, jid, xmlstream from twisted.words.protocols.jabber import error as jab_error import pdb from wokkel import disco, iwokkel PLUGIN_INFO = { "name": "Gateways Plugin", "import_name": "XEP_0100", "type": "XEP", "protocols": ["XEP-0100"], "dependencies": ["XEP_0077"], "main": "XEP_0100", "description": """Implementation of Gateways protocol""" } class XEP_0100(): def __init__(self, host): info("Gateways plugin initialization") self.host = host self.__gateways = {} #dict used to construct the answer to findGateways. Key = target jid host.bridge.addMethod("findGateways", ".communication", in_sign='s', out_sign='s', method=self.findGateways) host.bridge.addMethod("gatewayRegister", ".request", in_sign='ssa(ss)', out_sign='s', method=self.gatewayRegister) def __inc_handled_items(self, request_id): self.__gateways[request_id]['__handled_items']+=1 if self.__gateways[request_id]['__total_items'] == self.__gateways[request_id]['__handled_items']: debug ("All items checked for id [%s]" % str(request_id)) del self.__gateways[request_id]['__total_items'] del self.__gateways[request_id]['__handled_items'] self.host.actionResultExt(request_id,"DICT_DICT",self.__gateways[request_id]) def discoInfo(self, disco, entity, request_id): """Find disco infos about entity, to check if it is a gateway""" for identity in disco.identities: if identity[0] == 'gateway': print ("Found gateway (%s): %s" % (entity.full(), disco.identities[identity])) self.__gateways[request_id][entity.full()] = { 'name':disco.identities[identity], 'type':identity[1] } self.__inc_handled_items(request_id) def discoInfoErr(self, failure, entity, request_id): """Something is going wrong with disco""" failure.trap(jab_error.StanzaError) error("Error when discovering [%s]: %s" % (entity.full(), failure.value.condition)) self.__inc_handled_items(request_id) def discoItems(self, disco, request_id, target): """Look for items with disco protocol, and ask infos for each one""" #FIXME: target is used as we can't find the original iq node (parent is None) # an other way would avoid this useless parameter (is there a way with wokkel ?) if len(disco._items) == 0: debug ("No gateway found") self.host.actionResultExt(request_id,"DICT_DICT",{}) return self.__gateways[request_id] = {'__total_items':len(disco._items), '__handled_items':0, '__private__':{'target':target.full()}} for item in disco._items: debug ("item found: %s", item.name) self.host.disco.requestInfo(item.entity).addCallback(self.discoInfo, entity=item.entity, request_id=request_id) self.host.disco.requestInfo(item.entity).addErrback(self.discoInfoErr, entity=item.entity, request_id=request_id) def registrationSuccessful(self, target): """Called when in_band registration is ok, we must now follow the rest of procedure""" print "Registration successful, doing the rest" self.host.addContact(target) self.host.setPresence(target) def gatewayRegister(self, action, target, fields): """Register gateway using in-band registration, then log-in to gateway""" if action == 'SUBMIT': self.host.plugins["XEP_0077"].addTrigger(target, self.registrationSuccessful) return self.host.plugins["XEP_0077"].in_band_submit(action, target, fields) def findGateways(self, target): """Find gateways in the target JID, using discovery protocol Return an id used for retrieving the list of gateways """ to_jid = jid.JID(target) debug ("find gateways (target = %s)" % to_jid.full()) request_id = self.host.get_next_id() self.host.disco.requestItems(to_jid).addCallback(self.discoItems, request_id=request_id, target = to_jid) return request_id