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(