comparison src/plugins/plugin_exp_parrot.py @ 2144:1d3f73e065e1

core, jp: component handling + client handling refactoring: - SàT can now handle components - plugin have now a "modes" key in PLUGIN_INFO where they declare if they can be used with clients and or components. They default to be client only. - components are really similar to clients, but with some changes in behaviour: * component has "entry point", which is a special plugin with a componentStart method, which is called just after component is connected * trigger end with a different suffixes (e.g. profileConnected vs profileConnectedComponent), so a plugin which manage both clients and components can have different workflow * for clients, only triggers of plugins handling client mode are launched * for components, only triggers of plugins needed in dependencies are launched. They all must handle component mode. * component have a sendHistory attribute (False by default) which can be set to True to allow saving sent messages into history * for convenience, "client" is still used in method even if it can now be a component * a new "component" boolean attribute tells if we have a component or a client * components have to add themselve Message protocol * roster and presence protocols are not added for components * component default port is 5347 (which is Prosody's default port) - asyncCreateProfile has been renamed for profileCreate, both to follow new naming convention and to prepare the transition to fully asynchronous bridge - createProfile has a new "component" attribute. When used to create a component, it must be set to a component entry point - jp: added --component argument to profile/create - disconnect bridge method is now asynchronous, this way frontends can know when disconnection is finished - new PI_* constants for PLUGIN_INFO values (not used everywhere yet) - client/component connection workflow has been moved to their classes instead of being a host methods - host.messageSend is now client.sendMessage, and former client.sendMessage is now client.sendMessageData. - identities are now handled in client.identities list, so it can be updated dynamically by plugins (in the future, frontends should be able to update them too through bridge) - profileConnecting* profileConnected* profileDisconnected* and getHandler now all use client instead of profile
author Goffi <goffi@goffi.org>
date Sun, 12 Feb 2017 17:55:43 +0100
parents aa94f33fd2ad
children 33c8c4973743
comparison
equal deleted inserted replaced
2143:c3cac21157d4 2144:1d3f73e065e1
41 41
42 class Exp_Parrot(object): 42 class Exp_Parrot(object):
43 """Parrot mode plugin: repeat messages from one entity or MUC room to another one""" 43 """Parrot mode plugin: repeat messages from one entity or MUC room to another one"""
44 # XXX: This plugin can be potentially dangerous if we don't trust entities linked 44 # XXX: This plugin can be potentially dangerous if we don't trust entities linked
45 # this is specially true if we have other triggers. 45 # this is specially true if we have other triggers.
46 # messageSendTrigger avoid other triggers execution, it's deactivated to allow 46 # sendMessageTrigger avoid other triggers execution, it's deactivated to allow
47 # /unparrot command in text commands plugin. 47 # /unparrot command in text commands plugin.
48 # FIXME: potentially unsecure, specially with e2e encryption 48 # FIXME: potentially unsecure, specially with e2e encryption
49 49
50 def __init__(self, host): 50 def __init__(self, host):
51 log.info(_("Plugin Parrot initialization")) 51 log.info(_("Plugin Parrot initialization"))
52 self.host = host 52 self.host = host
53 host.trigger.add("MessageReceived", self.MessageReceivedTrigger, priority=100) 53 host.trigger.add("MessageReceived", self.MessageReceivedTrigger, priority=100)
54 #host.trigger.add("messageSend", self.messageSendTrigger, priority=100) 54 #host.trigger.add("sendMessage", self.sendMessageTrigger, priority=100)
55 try: 55 try:
56 self.host.plugins[C.TEXT_CMDS].registerTextCommands(self) 56 self.host.plugins[C.TEXT_CMDS].registerTextCommands(self)
57 except KeyError: 57 except KeyError:
58 log.info(_(u"Text commands not available")) 58 log.info(_(u"Text commands not available"))
59 59
60 #def messageSendTrigger(self, client, mess_data, treatments): 60 #def sendMessageTrigger(self, client, mess_data, treatments):
61 # """ Deactivate other triggers if recipient is in parrot links """ 61 # """ Deactivate other triggers if recipient is in parrot links """
62 # try: 62 # try:
63 # _links = client.parrot_links 63 # _links = client.parrot_links
64 # except AttributeError: 64 # except AttributeError:
65 # return True 65 # return True
101 src_txt = from_jid.user 101 src_txt = from_jid.user
102 message[lang] = u"[{}] {}".format(src_txt, body) 102 message[lang] = u"[{}] {}".format(src_txt, body)
103 103
104 linked = _links[from_jid.userhostJID()] 104 linked = _links[from_jid.userhostJID()]
105 105
106 self.host.messageSend(jid.JID(unicode(linked)), message, None, "auto", no_trigger=True, profile_key=profile) 106 client.sendMessage(jid.JID(unicode(linked)), message, None, "auto", no_trigger=True)
107 107
108 return True 108 return True
109 109
110 def addParrot(self, client, source_jid, dest_jid): 110 def addParrot(self, client, source_jid, dest_jid):
111 """Add a parrot link from one entity to another one 111 """Add a parrot link from one entity to another one