Mercurial > libervia-backend
comparison sat/core/sat_main.py @ 3715:b9718216a1c0 0.9
merge bookmark 0.9
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 01 Dec 2021 16:13:31 +0100 |
parents | cbb988a6f507 |
children | 16e36f0dd1cb |
comparison
equal
deleted
inserted
replaced
3714:af09b5aaa5d7 | 3715:b9718216a1c0 |
---|---|
56 from ordereddict import OrderedDict | 56 from ordereddict import OrderedDict |
57 | 57 |
58 log = getLogger(__name__) | 58 log = getLogger(__name__) |
59 | 59 |
60 class SAT(service.Service): | 60 class SAT(service.Service): |
61 | |
61 def _init(self): | 62 def _init(self): |
62 # we don't use __init__ to avoid doule initialisation with twistd | 63 # we don't use __init__ to avoid doule initialisation with twistd |
63 # this _init is called in startService | 64 # this _init is called in startService |
64 log.info(f"{C.APP_NAME} {self.full_version}") | 65 log.info(f"{C.APP_NAME} {self.full_version}") |
65 self._cb_map = {} # map from callback_id to callbacks | 66 self._cb_map = {} # map from callback_id to callbacks |
78 "disco#info": xmpp.NS_DISCO_INFO, | 79 "disco#info": xmpp.NS_DISCO_INFO, |
79 } | 80 } |
80 | 81 |
81 self.memory = memory.Memory(self) | 82 self.memory = memory.Memory(self) |
82 | 83 |
83 # trigger are used to change SàT behaviour | 84 # trigger are used to change Libervia behaviour |
84 self.trigger = ( | 85 self.trigger = ( |
85 trigger.TriggerManager() | 86 trigger.TriggerManager() |
86 ) | 87 ) |
87 | 88 |
88 bridge_name = ( | 89 bridge_name = ( |
90 or self.memory.getConfig("", "bridge", "dbus") | 91 or self.memory.getConfig("", "bridge", "dbus") |
91 ) | 92 ) |
92 | 93 |
93 bridge_module = dynamic_import.bridge(bridge_name) | 94 bridge_module = dynamic_import.bridge(bridge_name) |
94 if bridge_module is None: | 95 if bridge_module is None: |
95 log.error("Can't find bridge module of name {}".format(bridge_name)) | 96 log.error(f"Can't find bridge module of name {bridge_name}") |
96 sys.exit(1) | 97 sys.exit(1) |
97 log.info("using {} bridge".format(bridge_name)) | 98 log.info(f"using {bridge_name} bridge") |
98 try: | 99 try: |
99 self.bridge = bridge_module.Bridge() | 100 self.bridge = bridge_module.Bridge() |
100 except exceptions.BridgeInitError: | 101 except exceptions.BridgeInitError: |
101 log.error("Bridge can't be initialised, can't start SàT core") | 102 log.error("Bridge can't be initialised, can't start Libervia Backend") |
102 sys.exit(1) | 103 sys.exit(1) |
104 | |
105 defer.ensureDeferred(self._postInit()) | |
106 | |
107 @property | |
108 def version(self): | |
109 """Return the short version of Libervia""" | |
110 return C.APP_VERSION | |
111 | |
112 @property | |
113 def full_version(self): | |
114 """Return the full version of Libervia | |
115 | |
116 In developement mode, release name and extra data are returned too | |
117 """ | |
118 version = self.version | |
119 if version[-1] == "D": | |
120 # we are in debug version, we add extra data | |
121 try: | |
122 return self._version_cache | |
123 except AttributeError: | |
124 self._version_cache = "{} « {} » ({})".format( | |
125 version, C.APP_RELEASE_NAME, utils.getRepositoryData(sat) | |
126 ) | |
127 return self._version_cache | |
128 else: | |
129 return version | |
130 | |
131 @property | |
132 def bridge_name(self): | |
133 return os.path.splitext(os.path.basename(self.bridge.__file__))[0] | |
134 | |
135 async def _postInit(self): | |
136 try: | |
137 bridge_pi = self.bridge.postInit | |
138 except AttributeError: | |
139 pass | |
140 else: | |
141 await bridge_pi() | |
142 | |
103 self.bridge.register_method("getReady", lambda: self.initialised) | 143 self.bridge.register_method("getReady", lambda: self.initialised) |
104 self.bridge.register_method("getVersion", lambda: self.full_version) | 144 self.bridge.register_method("getVersion", lambda: self.full_version) |
105 self.bridge.register_method("getFeatures", self.getFeatures) | 145 self.bridge.register_method("getFeatures", self.getFeatures) |
106 self.bridge.register_method("profileNameGet", self.memory.getProfileName) | 146 self.bridge.register_method("profileNameGet", self.memory.getProfileName) |
107 self.bridge.register_method("profilesListGet", self.memory.getProfilesList) | 147 self.bridge.register_method("profilesListGet", self.memory.getProfilesList) |
177 self.bridge.register_method("imageCheck", self._imageCheck) | 217 self.bridge.register_method("imageCheck", self._imageCheck) |
178 self.bridge.register_method("imageResize", self._imageResize) | 218 self.bridge.register_method("imageResize", self._imageResize) |
179 self.bridge.register_method("imageGeneratePreview", self._imageGeneratePreview) | 219 self.bridge.register_method("imageGeneratePreview", self._imageGeneratePreview) |
180 self.bridge.register_method("imageConvert", self._imageConvert) | 220 self.bridge.register_method("imageConvert", self._imageConvert) |
181 | 221 |
182 self.memory.initialized.addCallback(lambda __: defer.ensureDeferred(self._postMemoryInit())) | 222 |
183 | 223 await self.memory.initialise() |
184 @property | |
185 def version(self): | |
186 """Return the short version of SàT""" | |
187 return C.APP_VERSION | |
188 | |
189 @property | |
190 def full_version(self): | |
191 """Return the full version of SàT | |
192 | |
193 In developement mode, release name and extra data are returned too | |
194 """ | |
195 version = self.version | |
196 if version[-1] == "D": | |
197 # we are in debug version, we add extra data | |
198 try: | |
199 return self._version_cache | |
200 except AttributeError: | |
201 self._version_cache = "{} « {} » ({})".format( | |
202 version, C.APP_RELEASE_NAME, utils.getRepositoryData(sat) | |
203 ) | |
204 return self._version_cache | |
205 else: | |
206 return version | |
207 | |
208 @property | |
209 def bridge_name(self): | |
210 return os.path.splitext(os.path.basename(self.bridge.__file__))[0] | |
211 | |
212 async def _postMemoryInit(self): | |
213 """Method called after memory initialization is done""" | |
214 self.common_cache = cache.Cache(self, None) | 224 self.common_cache = cache.Cache(self, None) |
215 log.info(_("Memory initialised")) | 225 log.info(_("Memory initialised")) |
216 try: | 226 try: |
217 self._import_plugins() | 227 self._import_plugins() |
218 ui_contact_list.ContactList(self) | 228 ui_contact_list.ContactList(self) |
449 try: | 459 try: |
450 unload = plugin.unload | 460 unload = plugin.unload |
451 except AttributeError: | 461 except AttributeError: |
452 continue | 462 continue |
453 else: | 463 else: |
454 defers_list.append(defer.maybeDeferred(unload)) | 464 defers_list.append(utils.asDeferred(unload)) |
455 return defers_list | 465 return defers_list |
456 | 466 |
457 def _connect(self, profile_key, password="", options=None): | 467 def _connect(self, profile_key, password="", options=None): |
458 profile = self.memory.getProfileName(profile_key) | 468 profile = self.memory.getProfileName(profile_key) |
459 return defer.ensureDeferred(self.connect(profile, password, options)) | 469 return defer.ensureDeferred(self.connect(profile, password, options)) |
463 """Connect a profile (i.e. connect client.component to XMPP server) | 473 """Connect a profile (i.e. connect client.component to XMPP server) |
464 | 474 |
465 Retrieve the individual parameters, authenticate the profile | 475 Retrieve the individual parameters, authenticate the profile |
466 and initiate the connection to the associated XMPP server. | 476 and initiate the connection to the associated XMPP server. |
467 @param profile: %(doc_profile)s | 477 @param profile: %(doc_profile)s |
468 @param password (string): the SàT profile password | 478 @param password (string): the Libervia profile password |
469 @param options (dict): connection options. Key can be: | 479 @param options (dict): connection options. Key can be: |
470 - | 480 - |
471 @param max_retries (int): max number of connection retries | 481 @param max_retries (int): max number of connection retries |
472 @return (D(bool)): | 482 @return (D(bool)): |
473 - True if the XMPP connection was already established | 483 - True if the XMPP connection was already established |
526 pass | 536 pass |
527 | 537 |
528 features = [] | 538 features = [] |
529 for import_name, plugin in self.plugins.items(): | 539 for import_name, plugin in self.plugins.items(): |
530 try: | 540 try: |
531 features_d = defer.maybeDeferred(plugin.getFeatures, profile_key) | 541 features_d = utils.asDeferred(plugin.getFeatures, profile_key) |
532 except AttributeError: | 542 except AttributeError: |
533 features_d = defer.succeed({}) | 543 features_d = defer.succeed({}) |
534 features.append(features_d) | 544 features.append(features_d) |
535 | 545 |
536 d_list = defer.DeferredList(features) | 546 d_list = defer.DeferredList(features) |
574 for item in client.roster.getItems(): # we get all items for client's roster | 584 for item in client.roster.getItems(): # we get all items for client's roster |
575 # and convert them to expected format | 585 # and convert them to expected format |
576 attr = client.roster.getAttributes(item) | 586 attr = client.roster.getAttributes(item) |
577 # we use full() and not userhost() because jid with resources are allowed | 587 # we use full() and not userhost() because jid with resources are allowed |
578 # in roster, even if it's not common. | 588 # in roster, even if it's not common. |
579 ret.append([item.entity.full(), attr, item.groups]) | 589 ret.append([item.entity.full(), attr, list(item.groups)]) |
580 return ret | 590 return ret |
581 | 591 |
582 return client.roster.got_roster.addCallback(got_roster) | 592 return client.roster.got_roster.addCallback(got_roster) |
583 | 593 |
584 def getContactsFromGroup(self, group, profile_key): | 594 def getContactsFromGroup(self, group, profile_key): |
1101 return self.memory.disco.findFeaturesSet(*args, **kwargs) | 1111 return self.memory.disco.findFeaturesSet(*args, **kwargs) |
1102 | 1112 |
1103 def _findByFeatures(self, namespaces, identities, bare_jids, service, roster, own_jid, | 1113 def _findByFeatures(self, namespaces, identities, bare_jids, service, roster, own_jid, |
1104 local_device, profile_key): | 1114 local_device, profile_key): |
1105 client = self.getClient(profile_key) | 1115 client = self.getClient(profile_key) |
1116 identities = [tuple(i) for i in identities] if identities else None | |
1106 return defer.ensureDeferred(self.findByFeatures( | 1117 return defer.ensureDeferred(self.findByFeatures( |
1107 client, namespaces, identities, bare_jids, service, roster, own_jid, | 1118 client, namespaces, identities, bare_jids, service, roster, own_jid, |
1108 local_device)) | 1119 local_device)) |
1109 | 1120 |
1110 async def findByFeatures( | 1121 async def findByFeatures( |