def _NH_CFGSettingsObjectDidChange(self, notification): if notification.sender is BlinkSettings(): account_manager = AccountManager() if 'presence.offline_note' in notification.data.modified: for account in (account for account in account_manager.get_accounts() if account.xcap.discovered): state = BlinkPresenceState(account).offline_state account.xcap_manager.set_offline_status(OfflineStatus(state) if state is not None else None) if 'presence.icon' in notification.data.modified: icon = IconManager().get('avatar') status_icon = Icon(icon.content, icon.content_type) if icon is not None else None for account in (account for account in account_manager.get_accounts() if account.xcap.discovered): account.xcap_manager.set_status_icon(status_icon) if 'presence.current_state' in notification.data.modified: for account in (account for account in account_manager.get_accounts() if account.enabled and account.presence.enabled): account.presence_state = BlinkPresenceState(account).online_state else: account = notification.sender if {'xcap.enabled', 'xcap.xcap_root'}.intersection(notification.data.modified): account.xcap.icon = None account.save() elif {'presence.enabled', 'display_name', 'xcap.icon'}.intersection(notification.data.modified) and account.presence.enabled: account.presence_state = BlinkPresenceState(account).online_state if account.xcap.discovered and (set(notification.data.modified) != {'xcap.icon'} or account.id in self._should_set_offline_status): state = BlinkPresenceState(account).offline_state account.xcap_manager.set_offline_status(OfflineStatus(state) if state is not None else None) if account.id in self._should_set_offline_status: # do not use set.discard() here to avoid race conditions. it should only be removed if present. self._should_set_offline_status.remove(account.id)
def _NH_XCAPManagerDidReloadData(self, notification): account = notification.sender.account blink_settings = BlinkSettings() icon_manager = IconManager() offline_status = notification.data.offline_status status_icon = notification.data.status_icon try: offline_note = next(note for service in offline_status.pidf.services for note in service.notes) except (AttributeError, StopIteration): offline_note = None blink_settings.presence.offline_note = offline_note blink_settings.save() try: offline_icon = next(service.icon for service in offline_status.pidf.services) except (AttributeError, StopIteration): offline_icon_hash = None else: offline_icon_hash = str(offline_icon).partition( '#blink-icon')[2] or None if status_icon: icon_hash = hashlib.sha1(status_icon.data).hexdigest() icon_desc = IconDescriptor(status_icon.url, icon_hash) if not blink_settings.presence.icon or blink_settings.presence.icon.etag != icon_hash: icon = icon_manager.store_data('avatar', status_icon.data) blink_settings.presence.icon = IconDescriptor( FileURL(icon.filename), icon_hash) if icon is not None else None blink_settings.save() elif account.xcap.icon != icon_desc and icon_hash != offline_icon_hash: self._should_set_offline_status.add(account.id) else: if blink_settings.presence.icon is None is not account.xcap.icon: self._should_set_offline_status.add(account.id) elif blink_settings.presence.icon is account.xcap.icon is offline_status is None and account.xcap_manager.pidf_manipulation.supported: state = BlinkPresenceState(account).offline_state account.xcap_manager.set_offline_status( OfflineStatus(state) if state is not None else None) icon_desc = None icon_manager.remove('avatar') blink_settings.presence.icon = None blink_settings.save() account.xcap.icon = icon_desc account.save()
def _NH_CFGSettingsObjectDidChange(self, notification): if isinstance(notification.sender, Account): account = notification.sender if set(['xcap.enabled', 'xcap.xcap_root']).intersection(notification.data.modified): account.xcap.icon = None account.save() elif set(['display_name', 'presence.enabled', 'presence.disable_location', 'presence.disable_timezone', 'presence.homepage', 'xcap.icon']).intersection(notification.data.modified): account.presence_state = self.build_pidf(account) if 'presence.disable_location' in notification.data.modified and not account.presence.disable_location: self.get_location([account]) elif notification.sender is SIPSimpleSettings(): account_manager = AccountManager() if set(['chat.disabled', 'video.device', 'screen_sharing_server.disabled', 'file_transfer.disabled', 'presence_state.icon', 'presence_state.status', 'presence_state.note']).intersection(notification.data.modified): self.publish() if 'presence_state.offline_note' in notification.data.modified: for account in (account for account in account_manager.get_accounts() if hasattr(account, 'xcap') and account.enabled and account.xcap.enabled and account.xcap.discovered): offline_pidf = self.build_offline_pidf(account) offline_status = OfflineStatus(offline_pidf) if offline_pidf is not None else None account.xcap_manager.set_offline_status(offline_status) if 'presence_state.icon' in notification.data.modified: status_icon = self.build_status_icon() icon = Icon(status_icon, 'image/png') if status_icon is not None else None for account in (account for account in account_manager.get_accounts() if hasattr(account, 'xcap') and account.enabled and account.xcap.enabled and account.xcap.discovered): account.xcap_manager.set_status_icon(icon)
def _NH_SIPAccountDidDiscoverXCAPSupport(self, notification): account = notification.sender offline_pidf = self.build_offline_pidf(account) offline_status = OfflineStatus(offline_pidf) if offline_pidf is not None else None account.xcap_manager.set_offline_status(offline_status)