From be95b0400768e7ea1653e1652ace7c18697d39a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20H=C3=B6rist?= Date: Wed, 30 Jan 2019 20:23:16 +0100 Subject: [PATCH] Refactor UserNickname and UserMood - Use IconTheme for mood icons - Simplify modules because nbxmpp handles more stuff --- gajim/chat_control.py | 49 +++++++-- gajim/common/configpaths.py | 2 - gajim/common/connection.py | 1 + gajim/common/helpers.py | 7 -- gajim/common/modules/__init__.py | 7 ++ gajim/common/modules/base.py | 23 +++- gajim/common/modules/message.py | 5 +- gajim/common/modules/user_mood.py | 103 +++++++----------- gajim/common/modules/user_nickname.py | 73 +++++-------- gajim/common/modules/util.py | 27 +++++ .../hicolor/16x16/status/mood-afraid.png} | Bin .../hicolor/16x16/status/mood-amazed.png} | Bin .../hicolor/16x16/status/mood-amorous.png} | Bin .../hicolor/16x16/status/mood-angry.png} | Bin .../hicolor/16x16/status/mood-annoyed.png} | Bin .../hicolor/16x16/status/mood-anxious.png} | Bin .../hicolor/16x16/status/mood-aroused.png} | Bin .../hicolor/16x16/status/mood-ashamed.png} | Bin .../hicolor/16x16/status/mood-bored.png} | Bin .../hicolor/16x16/status/mood-brave.png} | Bin .../hicolor/16x16/status/mood-calm.png} | Bin .../hicolor/16x16/status/mood-cautious.png} | Bin .../hicolor/16x16/status/mood-cold.png} | Bin .../hicolor/16x16/status/mood-confident.png} | Bin .../hicolor/16x16/status/mood-confused.png} | Bin .../16x16/status/mood-contemplative.png} | Bin .../hicolor/16x16/status/mood-contented.png} | Bin .../hicolor/16x16/status/mood-cranky.png} | Bin .../hicolor/16x16/status/mood-crazy.png} | Bin .../hicolor/16x16/status/mood-creative.png} | Bin .../hicolor/16x16/status/mood-curious.png} | Bin .../hicolor/16x16/status/mood-dejected.png} | Bin .../hicolor/16x16/status/mood-depressed.png} | Bin .../16x16/status/mood-disappointed.png} | Bin .../hicolor/16x16/status/mood-disgusted.png} | Bin .../hicolor/16x16/status/mood-dismayed.png} | Bin .../hicolor/16x16/status/mood-distracted.png} | Bin .../16x16/status/mood-embarrassed.png} | Bin .../hicolor/16x16/status/mood-envious.png} | Bin .../hicolor/16x16/status/mood-excited.png} | Bin .../16x16/status/mood-flirtatious.png} | Bin .../hicolor/16x16/status/mood-frustrated.png} | Bin .../hicolor/16x16/status/mood-grateful.png} | Bin .../hicolor/16x16/status/mood-grieving.png} | Bin .../hicolor/16x16/status/mood-grumpy.png} | Bin .../hicolor/16x16/status/mood-guilty.png} | Bin .../hicolor/16x16/status/mood-happy.png} | Bin .../hicolor/16x16/status/mood-hopeful.png} | Bin .../hicolor/16x16/status/mood-hot.png} | Bin .../hicolor/16x16/status/mood-humbled.png} | Bin .../hicolor/16x16/status/mood-humiliated.png} | Bin .../hicolor/16x16/status/mood-hungry.png} | Bin .../hicolor/16x16/status/mood-hurt.png} | Bin .../hicolor/16x16/status/mood-impressed.png} | Bin .../hicolor/16x16/status/mood-in_awe.png} | Bin .../hicolor/16x16/status/mood-in_love.png} | Bin .../hicolor/16x16/status/mood-indignant.png} | Bin .../hicolor/16x16/status/mood-interested.png} | Bin .../16x16/status/mood-intoxicated.png} | Bin .../hicolor/16x16/status/mood-invincible.png} | Bin .../hicolor/16x16/status/mood-jealous.png} | Bin .../hicolor/16x16/status/mood-lonely.png} | Bin .../hicolor/16x16/status/mood-lost.png} | Bin .../hicolor/16x16/status/mood-lucky.png} | Bin .../hicolor/16x16/status/mood-mean.png} | Bin .../hicolor/16x16/status/mood-moody.png} | Bin .../hicolor/16x16/status/mood-nervous.png} | Bin .../hicolor/16x16/status/mood-neutral.png} | Bin .../hicolor/16x16/status/mood-offended.png} | Bin .../hicolor/16x16/status/mood-outraged.png} | Bin .../hicolor/16x16/status/mood-playful.png} | Bin .../hicolor/16x16/status/mood-proud.png} | Bin .../hicolor/16x16/status/mood-relaxed.png} | Bin .../hicolor/16x16/status/mood-relieved.png} | Bin .../hicolor/16x16/status/mood-remorseful.png} | Bin .../hicolor/16x16/status/mood-restless.png} | Bin .../hicolor/16x16/status/mood-sad.png} | Bin .../hicolor/16x16/status/mood-sarcastic.png} | Bin .../hicolor/16x16/status/mood-satisfied.png} | Bin .../hicolor/16x16/status/mood-serious.png} | Bin .../hicolor/16x16/status/mood-shocked.png} | Bin .../hicolor/16x16/status/mood-shy.png} | Bin .../hicolor/16x16/status/mood-sick.png} | Bin .../hicolor/16x16/status/mood-sleepy.png} | Bin .../16x16/status/mood-spontaneous.png} | Bin .../hicolor/16x16/status/mood-stressed.png} | Bin .../hicolor/16x16/status/mood-strong.png} | Bin .../hicolor/16x16/status/mood-surprised.png} | Bin .../hicolor/16x16/status/mood-thankful.png} | Bin .../hicolor/16x16/status/mood-thirsty.png} | Bin .../hicolor/16x16/status/mood-tired.png} | Bin .../hicolor/16x16/status/mood-undefined.png} | Bin .../hicolor/16x16/status/mood-unknown.png} | Bin .../hicolor/16x16/status/mood-weak.png} | Bin .../hicolor/16x16/status/mood-worried.png} | Bin gajim/dialogs.py | 8 +- gajim/gtk/profile.py | 2 +- gajim/gtk/tooltips.py | 6 +- gajim/gtk/util.py | 22 ++++ gajim/gtkgui_helpers.py | 15 --- gajim/roster_window.py | 60 +++++++--- 101 files changed, 243 insertions(+), 167 deletions(-) rename gajim/data/{moods/default/afraid.png => icons/hicolor/16x16/status/mood-afraid.png} (100%) rename gajim/data/{moods/default/amazed.png => icons/hicolor/16x16/status/mood-amazed.png} (100%) rename gajim/data/{moods/default/amorous.png => icons/hicolor/16x16/status/mood-amorous.png} (100%) rename gajim/data/{moods/default/angry.png => icons/hicolor/16x16/status/mood-angry.png} (100%) rename gajim/data/{moods/default/annoyed.png => icons/hicolor/16x16/status/mood-annoyed.png} (100%) rename gajim/data/{moods/default/anxious.png => icons/hicolor/16x16/status/mood-anxious.png} (100%) rename gajim/data/{moods/default/aroused.png => icons/hicolor/16x16/status/mood-aroused.png} (100%) rename gajim/data/{moods/default/ashamed.png => icons/hicolor/16x16/status/mood-ashamed.png} (100%) rename gajim/data/{moods/default/bored.png => icons/hicolor/16x16/status/mood-bored.png} (100%) rename gajim/data/{moods/default/brave.png => icons/hicolor/16x16/status/mood-brave.png} (100%) rename gajim/data/{moods/default/calm.png => icons/hicolor/16x16/status/mood-calm.png} (100%) rename gajim/data/{moods/default/cautious.png => icons/hicolor/16x16/status/mood-cautious.png} (100%) rename gajim/data/{moods/default/cold.png => icons/hicolor/16x16/status/mood-cold.png} (100%) rename gajim/data/{moods/default/confident.png => icons/hicolor/16x16/status/mood-confident.png} (100%) rename gajim/data/{moods/default/confused.png => icons/hicolor/16x16/status/mood-confused.png} (100%) rename gajim/data/{moods/default/contemplative.png => icons/hicolor/16x16/status/mood-contemplative.png} (100%) rename gajim/data/{moods/default/contented.png => icons/hicolor/16x16/status/mood-contented.png} (100%) rename gajim/data/{moods/default/cranky.png => icons/hicolor/16x16/status/mood-cranky.png} (100%) rename gajim/data/{moods/default/crazy.png => icons/hicolor/16x16/status/mood-crazy.png} (100%) rename gajim/data/{moods/default/creative.png => icons/hicolor/16x16/status/mood-creative.png} (100%) rename gajim/data/{moods/default/curious.png => icons/hicolor/16x16/status/mood-curious.png} (100%) rename gajim/data/{moods/default/dejected.png => icons/hicolor/16x16/status/mood-dejected.png} (100%) rename gajim/data/{moods/default/depressed.png => icons/hicolor/16x16/status/mood-depressed.png} (100%) rename gajim/data/{moods/default/disappointed.png => icons/hicolor/16x16/status/mood-disappointed.png} (100%) rename gajim/data/{moods/default/disgusted.png => icons/hicolor/16x16/status/mood-disgusted.png} (100%) rename gajim/data/{moods/default/dismayed.png => icons/hicolor/16x16/status/mood-dismayed.png} (100%) rename gajim/data/{moods/default/distracted.png => icons/hicolor/16x16/status/mood-distracted.png} (100%) rename gajim/data/{moods/default/embarrassed.png => icons/hicolor/16x16/status/mood-embarrassed.png} (100%) rename gajim/data/{moods/default/envious.png => icons/hicolor/16x16/status/mood-envious.png} (100%) rename gajim/data/{moods/default/excited.png => icons/hicolor/16x16/status/mood-excited.png} (100%) rename gajim/data/{moods/default/flirtatious.png => icons/hicolor/16x16/status/mood-flirtatious.png} (100%) rename gajim/data/{moods/default/frustrated.png => icons/hicolor/16x16/status/mood-frustrated.png} (100%) rename gajim/data/{moods/default/grateful.png => icons/hicolor/16x16/status/mood-grateful.png} (100%) rename gajim/data/{moods/default/grieving.png => icons/hicolor/16x16/status/mood-grieving.png} (100%) rename gajim/data/{moods/default/grumpy.png => icons/hicolor/16x16/status/mood-grumpy.png} (100%) rename gajim/data/{moods/default/guilty.png => icons/hicolor/16x16/status/mood-guilty.png} (100%) rename gajim/data/{moods/default/happy.png => icons/hicolor/16x16/status/mood-happy.png} (100%) rename gajim/data/{moods/default/hopeful.png => icons/hicolor/16x16/status/mood-hopeful.png} (100%) rename gajim/data/{moods/default/hot.png => icons/hicolor/16x16/status/mood-hot.png} (100%) rename gajim/data/{moods/default/humbled.png => icons/hicolor/16x16/status/mood-humbled.png} (100%) rename gajim/data/{moods/default/humiliated.png => icons/hicolor/16x16/status/mood-humiliated.png} (100%) rename gajim/data/{moods/default/hungry.png => icons/hicolor/16x16/status/mood-hungry.png} (100%) rename gajim/data/{moods/default/hurt.png => icons/hicolor/16x16/status/mood-hurt.png} (100%) rename gajim/data/{moods/default/impressed.png => icons/hicolor/16x16/status/mood-impressed.png} (100%) rename gajim/data/{moods/default/in_awe.png => icons/hicolor/16x16/status/mood-in_awe.png} (100%) rename gajim/data/{moods/default/in_love.png => icons/hicolor/16x16/status/mood-in_love.png} (100%) rename gajim/data/{moods/default/indignant.png => icons/hicolor/16x16/status/mood-indignant.png} (100%) rename gajim/data/{moods/default/interested.png => icons/hicolor/16x16/status/mood-interested.png} (100%) rename gajim/data/{moods/default/intoxicated.png => icons/hicolor/16x16/status/mood-intoxicated.png} (100%) rename gajim/data/{moods/default/invincible.png => icons/hicolor/16x16/status/mood-invincible.png} (100%) rename gajim/data/{moods/default/jealous.png => icons/hicolor/16x16/status/mood-jealous.png} (100%) rename gajim/data/{moods/default/lonely.png => icons/hicolor/16x16/status/mood-lonely.png} (100%) rename gajim/data/{moods/default/lost.png => icons/hicolor/16x16/status/mood-lost.png} (100%) rename gajim/data/{moods/default/lucky.png => icons/hicolor/16x16/status/mood-lucky.png} (100%) rename gajim/data/{moods/default/mean.png => icons/hicolor/16x16/status/mood-mean.png} (100%) rename gajim/data/{moods/default/moody.png => icons/hicolor/16x16/status/mood-moody.png} (100%) rename gajim/data/{moods/default/nervous.png => icons/hicolor/16x16/status/mood-nervous.png} (100%) rename gajim/data/{moods/default/neutral.png => icons/hicolor/16x16/status/mood-neutral.png} (100%) rename gajim/data/{moods/default/offended.png => icons/hicolor/16x16/status/mood-offended.png} (100%) rename gajim/data/{moods/default/outraged.png => icons/hicolor/16x16/status/mood-outraged.png} (100%) rename gajim/data/{moods/default/playful.png => icons/hicolor/16x16/status/mood-playful.png} (100%) rename gajim/data/{moods/default/proud.png => icons/hicolor/16x16/status/mood-proud.png} (100%) rename gajim/data/{moods/default/relaxed.png => icons/hicolor/16x16/status/mood-relaxed.png} (100%) rename gajim/data/{moods/default/relieved.png => icons/hicolor/16x16/status/mood-relieved.png} (100%) rename gajim/data/{moods/default/remorseful.png => icons/hicolor/16x16/status/mood-remorseful.png} (100%) rename gajim/data/{moods/default/restless.png => icons/hicolor/16x16/status/mood-restless.png} (100%) rename gajim/data/{moods/default/sad.png => icons/hicolor/16x16/status/mood-sad.png} (100%) rename gajim/data/{moods/default/sarcastic.png => icons/hicolor/16x16/status/mood-sarcastic.png} (100%) rename gajim/data/{moods/default/satisfied.png => icons/hicolor/16x16/status/mood-satisfied.png} (100%) rename gajim/data/{moods/default/serious.png => icons/hicolor/16x16/status/mood-serious.png} (100%) rename gajim/data/{moods/default/shocked.png => icons/hicolor/16x16/status/mood-shocked.png} (100%) rename gajim/data/{moods/default/shy.png => icons/hicolor/16x16/status/mood-shy.png} (100%) rename gajim/data/{moods/default/sick.png => icons/hicolor/16x16/status/mood-sick.png} (100%) rename gajim/data/{moods/default/sleepy.png => icons/hicolor/16x16/status/mood-sleepy.png} (100%) rename gajim/data/{moods/default/spontaneous.png => icons/hicolor/16x16/status/mood-spontaneous.png} (100%) rename gajim/data/{moods/default/stressed.png => icons/hicolor/16x16/status/mood-stressed.png} (100%) rename gajim/data/{moods/default/strong.png => icons/hicolor/16x16/status/mood-strong.png} (100%) rename gajim/data/{moods/default/surprised.png => icons/hicolor/16x16/status/mood-surprised.png} (100%) rename gajim/data/{moods/default/thankful.png => icons/hicolor/16x16/status/mood-thankful.png} (100%) rename gajim/data/{moods/default/thirsty.png => icons/hicolor/16x16/status/mood-thirsty.png} (100%) rename gajim/data/{moods/default/tired.png => icons/hicolor/16x16/status/mood-tired.png} (100%) rename gajim/data/{moods/default/undefined.png => icons/hicolor/16x16/status/mood-undefined.png} (100%) rename gajim/data/{moods/default/unknown.png => icons/hicolor/16x16/status/mood-unknown.png} (100%) rename gajim/data/{moods/default/weak.png => icons/hicolor/16x16/status/mood-weak.png} (100%) rename gajim/data/{moods/default/worried.png => icons/hicolor/16x16/status/mood-worried.png} (100%) diff --git a/gajim/chat_control.py b/gajim/chat_control.py index 209349bf4..3dcae5d71 100644 --- a/gajim/chat_control.py +++ b/gajim/chat_control.py @@ -47,6 +47,7 @@ from gajim.common.contacts import GC_Contact from gajim.common.const import AvatarSize from gajim.common.const import KindConstant from gajim.common.const import Chatstate +from gajim.common.const import PEPEventType from gajim import gtkgui_helpers from gajim import gui_menu_builder @@ -57,6 +58,8 @@ from gajim.gtk.dialogs import ConfirmationDialog from gajim.gtk.add_contact import AddNewContactWindow from gajim.gtk.util import get_icon_name from gajim.gtk.util import get_cursor +from gajim.gtk.util import ensure_proper_control +from gajim.gtk.util import format_mood from gajim.command_system.implementation.hosts import ChatCommands from gajim.command_system.framework import CommandHost # pylint: disable=unused-import @@ -128,7 +131,6 @@ class ChatControl(ChatControlBase): self.update_toolbar() self._pep_images = {} - self._pep_images['mood'] = self.xml.get_object('mood_image') self._pep_images['activity'] = self.xml.get_object('activity_image') self._pep_images['tune'] = self.xml.get_object('tune_image') self._pep_images['geoloc'] = self.xml.get_object('location_image') @@ -227,6 +229,10 @@ class ChatControl(ChatControlBase): app.ged.register_event_handler('pep-received', ged.GUI1, self._nec_pep_received) + app.ged.register_event_handler('nickname-received', ged.GUI1, + self._on_nickname_received) + app.ged.register_event_handler('mood-received', ged.GUI1, + self._on_mood_received) if self.TYPE_ID == message_control.TYPE_CHAT: # Dont connect this when PrivateChatControl is used app.ged.register_event_handler('update-roster-avatar', ged.GUI1, @@ -409,6 +415,7 @@ class ChatControl(ChatControlBase): def update_all_pep_types(self): for pep_type in self._pep_images: self.update_pep(pep_type) + self._update_pep(PEPEventType.MOOD) def update_pep(self, pep_type): if isinstance(self.contact, GC_Contact): @@ -434,12 +441,36 @@ class ChatControl(ChatControlBase): if obj.jid != self.contact.jid: return - if obj.pep_type == 'nick': - self.update_ui() - self.parent_win.redraw_tab(self) - self.parent_win.show_title() - else: - self.update_pep(obj.pep_type) + self.update_pep(obj.pep_type) + + def _update_pep(self, type_): + image = self._get_pep_widget(type_) + data = self.contact.pep.get(type_) + if data is None: + image.hide() + return + + if type_ == PEPEventType.MOOD: + icon = 'mood-%s' % data.mood + formated_text = format_mood(*data) + + image.set_from_icon_name(icon, Gtk.IconSize.MENU) + image.set_tooltip_markup(formated_text) + image.show() + + def _get_pep_widget(self, type_): + if type_ == PEPEventType.MOOD: + return self.xml.get_object('mood_image') + + @ensure_proper_control + def _on_mood_received(self, _event): + self._update_pep(PEPEventType.MOOD) + + @ensure_proper_control + def _on_nickname_received(self, _event): + self.update_ui() + self.parent_win.redraw_tab(self) + self.parent_win.show_title() def _update_jingle(self, jingle_type): if jingle_type not in ('audio', 'video'): @@ -1051,6 +1082,10 @@ class ChatControl(ChatControlBase): app.ged.remove_event_handler('pep-received', ged.GUI1, self._nec_pep_received) + app.ged.remove_event_handler('nickname-received', ged.GUI1, + self._on_nickname_received) + app.ged.remove_event_handler('mood-received', ged.GUI1, + self._on_mood_received) if self.TYPE_ID == message_control.TYPE_CHAT: app.ged.remove_event_handler('update-roster-avatar', ged.GUI1, self._nec_update_avatar) diff --git a/gajim/common/configpaths.py b/gajim/common/configpaths.py index e5f4028fe..908a13c38 100644 --- a/gajim/common/configpaths.py +++ b/gajim/common/configpaths.py @@ -221,8 +221,6 @@ class ConfigPaths: 'emoticons', PathLocation.DATA, PathType.FOLDER_OPTIONAL), ('MY_ICONSETS', 'iconsets', PathLocation.DATA, PathType.FOLDER_OPTIONAL), - ('MY_MOOD_ICONSETS', - 'moods', PathLocation.DATA, PathType.FOLDER_OPTIONAL), ('MY_ACTIVITY_ICONSETS', 'activities', PathLocation.DATA, PathType.FOLDER_OPTIONAL), diff --git a/gajim/common/connection.py b/gajim/common/connection.py index 374d11e27..50a44e8f6 100644 --- a/gajim/common/connection.py +++ b/gajim/common/connection.py @@ -1631,6 +1631,7 @@ class Connection(CommonConnection, ConnectionHandlers): # Inform GUI we just signed in app.nec.push_incoming_event(NetworkEvent('signed-in', conn=self)) + modules.send_stored_publish(self.name) self.get_module('PEP').send_stored_publish() self.continue_connect_info = None diff --git a/gajim/common/helpers.py b/gajim/common/helpers.py index c11a56c94..2ef42e57e 100644 --- a/gajim/common/helpers.py +++ b/gajim/common/helpers.py @@ -1098,13 +1098,6 @@ def get_current_show(account): status = app.connections[account].connected return app.SHOW_LIST[status] -def get_mood_iconset_path(iconset): - if os.path.isdir(os.path.join(configpaths.get('DATA'), 'moods', iconset)): - return os.path.join(configpaths.get('DATA'), 'moods', iconset) - if os.path.isdir( - os.path.join(configpaths.get('MY_MOOD_ICONSETS'), iconset)): - return os.path.join(configpaths.get('MY_MOOD_ICONSETS'), iconset) - def get_activity_iconset_path(iconset): if os.path.isdir(os.path.join(configpaths.get('DATA'), 'activities', iconset)): return os.path.join(configpaths.get('DATA'), 'activities', iconset) diff --git a/gajim/common/modules/__init__.py b/gajim/common/modules/__init__.py index 77403cb9d..280c0e65f 100644 --- a/gajim/common/modules/__init__.py +++ b/gajim/common/modules/__init__.py @@ -34,6 +34,8 @@ ZEROCONF_MODULES = ['iq', _imported_modules = [] # type: List[tuple] _modules = {} # type: Dict[str, Dict[str, Any]] +_store_publish_modules = [ + 'UserMood'] # type: List[str] for file in Path(__file__).parent.iterdir(): if file.stem == '__init__': @@ -112,6 +114,11 @@ def unregister_single(con: ConnectionT, name: str) -> None: del _modules[con.name][name] +def send_stored_publish(account: str) -> None: + for name in _store_publish_modules: + _modules[account][name].send_stored_publish() + + def get(account: str, name: str) -> Any: try: return _modules[account][name] diff --git a/gajim/common/modules/base.py b/gajim/common/modules/base.py index 5c3746c86..6607ea5ff 100644 --- a/gajim/common/modules/base.py +++ b/gajim/common/modules/base.py @@ -20,6 +20,9 @@ import logging from functools import partial from unittest.mock import Mock +import nbxmpp +from nbxmpp.structs import StanzaHandler + from gajim.common import app log = logging.getLogger('gajim.c.m.base') @@ -34,6 +37,7 @@ class BaseModule: self._con = con self._account = con.name self._nbxmpp_callbacks = {} # type: Dict[str, Any] + self._stored_publish = None # type: Callable self.handlers = [] # type: List[str] def __getattr__(self, key): @@ -46,8 +50,10 @@ class BaseModule: module = self._con.connection.get_module(self._nbxmpp_extends) - return partial(getattr(module, key), - callback=self._nbxmpp_callbacks.get(key)) + callback = self._nbxmpp_callbacks.get(key) + if callback is None: + return getattr(module, key) + return partial(getattr(module, key), callback=callback) def _nbxmpp(self, module_name=None): if not app.account_is_connected(self._account): @@ -61,3 +67,16 @@ class BaseModule: def _register_callback(self, method, callback): self._nbxmpp_callbacks[method] = callback + + def _register_pubsub_handler(self, callback): + handler = StanzaHandler(name='message', + callback=callback, + ns=nbxmpp.NS_PUBSUB_EVENT, + priority=49) + self.handlers.append(handler) + + def send_stored_publish(self): + if self._stored_publish is None: + return + log.info('Send stored publish') + self._stored_publish() diff --git a/gajim/common/modules/message.py b/gajim/common/modules/message.py index f7434ccac..0cbe990aa 100644 --- a/gajim/common/modules/message.py +++ b/gajim/common/modules/message.py @@ -55,12 +55,11 @@ class Message: ] # XEPs for which this message module should not be executed - self._message_namespaces = set([nbxmpp.NS_PUBSUB_EVENT, - nbxmpp.NS_ROSTERX, + self._message_namespaces = set([nbxmpp.NS_ROSTERX, nbxmpp.NS_IBB]) def _message_received(self, _con, stanza, properties): - if properties.is_mam_message: + if properties.is_mam_message or properties.is_pubsub_event: return # Check if a child of the message contains any # namespaces that we handle in other modules. diff --git a/gajim/common/modules/user_mood.py b/gajim/common/modules/user_mood.py index 8da3814dd..cc145ebc7 100644 --- a/gajim/common/modules/user_mood.py +++ b/gajim/common/modules/user_mood.py @@ -6,94 +6,69 @@ # # Gajim 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 +# 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 Gajim. If not, see . +# along with Gajim. If not, see . # XEP-0107: User Mood from typing import Any -from typing import Dict -from typing import List # pylint: disable=unused-import -from typing import Optional from typing import Tuple import logging import nbxmpp -from gi.repository import GLib -from gajim.common.const import PEPEventType, MOODS -from gajim.common.exceptions import StanzaMalformed -from gajim.common.modules.pep import AbstractPEPModule, AbstractPEPData +from gajim.common import app +from gajim.common.nec import NetworkEvent +from gajim.common.modules.base import BaseModule +from gajim.common.modules.util import event_node +from gajim.common.modules.util import store_publish +from gajim.common.const import PEPEventType log = logging.getLogger('gajim.c.m.user_mood') -class UserMoodData(AbstractPEPData): +class UserMood(BaseModule): - type_ = PEPEventType.MOOD + _nbxmpp_extends = 'Mood' + _nbxmpp_methods = [ + 'set_mood', + ] - def as_markup_text(self) -> str: - if self.data is None: - return '' - mood = self._translate_mood(self.data['mood']) - markuptext = '%s' % GLib.markup_escape_text(mood) - if 'text' in self.data: - text = self.data['text'] - markuptext += ' (%s)' % GLib.markup_escape_text(text) - return markuptext + def __init__(self, con): + BaseModule.__init__(self, con) + self._register_pubsub_handler(self._mood_received) - @staticmethod - def _translate_mood(mood: str) -> str: - if mood in MOODS: - return MOODS[mood] - return mood - - -class UserMood(AbstractPEPModule): - - name = 'mood' - namespace = nbxmpp.NS_MOOD - pep_class = UserMoodData - store_publish = True - _log = log - - def _extract_info(self, item: nbxmpp.Node) -> Optional[Dict[str, str]]: - mood_dict = {} - mood_tag = item.getTag('mood', namespace=nbxmpp.NS_MOOD) - if mood_tag is None: - raise StanzaMalformed('No mood node') - - if not mood_tag.getChildren(): - return None - - for child in mood_tag.getChildren(): - name = child.getName().strip() - if name == 'text': - mood_dict['text'] = child.getData() + @event_node(nbxmpp.NS_MOOD) + def _mood_received(self, _con, _stanza, properties): + data = properties.pubsub_event.data + for contact in app.contacts.get_contacts(self._account, + str(properties.jid)): + if data.mood is not None: + contact.pep[PEPEventType.MOOD] = data else: - mood_dict['mood'] = name + contact.pep.pop(PEPEventType.MOOD, None) - if 'mood' not in mood_dict: - raise StanzaMalformed('No mood value found') - return mood_dict + if properties.is_self_message: + if data.mood is not None: + self._con.pep[PEPEventType.MOOD] = data + else: + self._con.pep.pop(PEPEventType.MOOD, None) - def _build_node(self, data: Optional[Tuple[str, str]]) -> nbxmpp.Node: - item = nbxmpp.Node('mood', {'xmlns': nbxmpp.NS_MOOD}) - if data is None: - return item + app.nec.push_incoming_event( + NetworkEvent('mood-received', + account=self._account, + jid=properties.jid.getBare(), + mood=data, + is_self_message=properties.is_self_message)) - mood, text = data - if not mood: - return item - item.addChild(mood) - - if text: - item.addChild('text', payload=text) - return item + @store_publish + def set_mood(self, mood): + log.info('Send %s', mood) + self._nbxmpp('Mood').set_mood(mood) def get_instance(*args: Any, **kwargs: Any) -> Tuple[UserMood, str]: diff --git a/gajim/common/modules/user_nickname.py b/gajim/common/modules/user_nickname.py index 5c9be16cc..e25c41ee5 100644 --- a/gajim/common/modules/user_nickname.py +++ b/gajim/common/modules/user_nickname.py @@ -6,17 +6,15 @@ # # Gajim 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 +# 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 Gajim. If not, see . +# along with Gajim. If not, see . # XEP-0172: User Nickname from typing import Any -from typing import List # pylint: disable=unused-import -from typing import Optional from typing import Tuple import logging @@ -24,56 +22,41 @@ import logging import nbxmpp from gajim.common import app -from gajim.common.const import PEPEventType -from gajim.common.exceptions import StanzaMalformed -from gajim.common.modules.pep import AbstractPEPModule, AbstractPEPData +from gajim.common.nec import NetworkEvent +from gajim.common.modules.base import BaseModule +from gajim.common.modules.util import event_node log = logging.getLogger('gajim.c.m.user_nickname') -class UserNicknameData(AbstractPEPData): +class UserNickname(BaseModule): - type_ = PEPEventType.NICKNAME + _nbxmpp_extends = 'Nickname' + _nbxmpp_methods = [ + 'set_nickname', + ] - def get_nick(self) -> str: - return self.data or '' + def __init__(self, con): + BaseModule.__init__(self, con) + self._register_pubsub_handler(self._nickname_received) + @event_node(nbxmpp.NS_NICK) + def _nickname_received(self, _con, _stanza, properties): + nick = properties.pubsub_event.data + if properties.self_message: + if nick is None: + nick = app.config.get_per('accounts', self._account, 'name') + app.nicks[self._account] = nick -class UserNickname(AbstractPEPModule): + for contact in app.contacts.get_contacts(self._account, + str(properties.jid)): + contact.contact_name = nick - name = 'nick' - namespace = nbxmpp.NS_NICK - pep_class = UserNicknameData - store_publish = True - _log = log - - def _extract_info(self, item: nbxmpp.Node) -> Optional[str]: - nick = '' - child = item.getTag('nick', namespace=nbxmpp.NS_NICK) - if child is None: - raise StanzaMalformed('No nick node') - nick = child.getData() - - return nick or None - - def _build_node(self, data: Optional[str]) -> Optional[nbxmpp.Node]: - item = nbxmpp.Node('nick', {'xmlns': nbxmpp.NS_NICK}) - if data is not None: - item.addData(data) - return item - - def _notification_received(self, - jid: nbxmpp.JID, - user_pep: UserNicknameData) -> None: - for contact in app.contacts.get_contacts(self._account, str(jid)): - contact.contact_name = user_pep.get_nick() - - if jid == self._con.get_own_jid().getStripped(): - if user_pep: - app.nicks[self._account] = user_pep.get_nick() - else: - app.nicks[self._account] = app.config.get_per( - 'accounts', self._account, 'name') + app.nec.push_incoming_event( + NetworkEvent('nickname-received', + account=self._account, + jid=properties.jid.getBare(), + nickname=nick)) def parse_nickname(stanza: nbxmpp.Node) -> str: diff --git a/gajim/common/modules/util.py b/gajim/common/modules/util.py index 1a927c7ed..131f82e70 100644 --- a/gajim/common/modules/util.py +++ b/gajim/common/modules/util.py @@ -16,6 +16,11 @@ from typing import Union +from functools import wraps +from functools import partial + +from gajim.common import app + def from_xs_boolean(value: Union[str, bool]) -> bool: if isinstance(value, bool): @@ -44,3 +49,25 @@ def to_xs_boolean(value: Union[bool, None]) -> str: raise ValueError( 'Cant convert %s to xs:boolean' % value) + + +def event_node(node): + def event_node_decorator(func): + @wraps(func) + def func_wrapper(self, _con, _stanza, properties): + if properties.pubsub_event.node != node: + return + func(self, _con, _stanza, properties) + + return func_wrapper + return event_node_decorator + + +def store_publish(func): + @wraps(func) + def func_wrapper(self, *args, **kwargs): + if not app.account_is_connected(self._account): + self._stored_publish = partial(func, self, *args, **kwargs) + return + return func(self, *args, **kwargs) + return func_wrapper diff --git a/gajim/data/moods/default/afraid.png b/gajim/data/icons/hicolor/16x16/status/mood-afraid.png similarity index 100% rename from gajim/data/moods/default/afraid.png rename to gajim/data/icons/hicolor/16x16/status/mood-afraid.png diff --git a/gajim/data/moods/default/amazed.png b/gajim/data/icons/hicolor/16x16/status/mood-amazed.png similarity index 100% rename from gajim/data/moods/default/amazed.png rename to gajim/data/icons/hicolor/16x16/status/mood-amazed.png diff --git a/gajim/data/moods/default/amorous.png b/gajim/data/icons/hicolor/16x16/status/mood-amorous.png similarity index 100% rename from gajim/data/moods/default/amorous.png rename to gajim/data/icons/hicolor/16x16/status/mood-amorous.png diff --git a/gajim/data/moods/default/angry.png b/gajim/data/icons/hicolor/16x16/status/mood-angry.png similarity index 100% rename from gajim/data/moods/default/angry.png rename to gajim/data/icons/hicolor/16x16/status/mood-angry.png diff --git a/gajim/data/moods/default/annoyed.png b/gajim/data/icons/hicolor/16x16/status/mood-annoyed.png similarity index 100% rename from gajim/data/moods/default/annoyed.png rename to gajim/data/icons/hicolor/16x16/status/mood-annoyed.png diff --git a/gajim/data/moods/default/anxious.png b/gajim/data/icons/hicolor/16x16/status/mood-anxious.png similarity index 100% rename from gajim/data/moods/default/anxious.png rename to gajim/data/icons/hicolor/16x16/status/mood-anxious.png diff --git a/gajim/data/moods/default/aroused.png b/gajim/data/icons/hicolor/16x16/status/mood-aroused.png similarity index 100% rename from gajim/data/moods/default/aroused.png rename to gajim/data/icons/hicolor/16x16/status/mood-aroused.png diff --git a/gajim/data/moods/default/ashamed.png b/gajim/data/icons/hicolor/16x16/status/mood-ashamed.png similarity index 100% rename from gajim/data/moods/default/ashamed.png rename to gajim/data/icons/hicolor/16x16/status/mood-ashamed.png diff --git a/gajim/data/moods/default/bored.png b/gajim/data/icons/hicolor/16x16/status/mood-bored.png similarity index 100% rename from gajim/data/moods/default/bored.png rename to gajim/data/icons/hicolor/16x16/status/mood-bored.png diff --git a/gajim/data/moods/default/brave.png b/gajim/data/icons/hicolor/16x16/status/mood-brave.png similarity index 100% rename from gajim/data/moods/default/brave.png rename to gajim/data/icons/hicolor/16x16/status/mood-brave.png diff --git a/gajim/data/moods/default/calm.png b/gajim/data/icons/hicolor/16x16/status/mood-calm.png similarity index 100% rename from gajim/data/moods/default/calm.png rename to gajim/data/icons/hicolor/16x16/status/mood-calm.png diff --git a/gajim/data/moods/default/cautious.png b/gajim/data/icons/hicolor/16x16/status/mood-cautious.png similarity index 100% rename from gajim/data/moods/default/cautious.png rename to gajim/data/icons/hicolor/16x16/status/mood-cautious.png diff --git a/gajim/data/moods/default/cold.png b/gajim/data/icons/hicolor/16x16/status/mood-cold.png similarity index 100% rename from gajim/data/moods/default/cold.png rename to gajim/data/icons/hicolor/16x16/status/mood-cold.png diff --git a/gajim/data/moods/default/confident.png b/gajim/data/icons/hicolor/16x16/status/mood-confident.png similarity index 100% rename from gajim/data/moods/default/confident.png rename to gajim/data/icons/hicolor/16x16/status/mood-confident.png diff --git a/gajim/data/moods/default/confused.png b/gajim/data/icons/hicolor/16x16/status/mood-confused.png similarity index 100% rename from gajim/data/moods/default/confused.png rename to gajim/data/icons/hicolor/16x16/status/mood-confused.png diff --git a/gajim/data/moods/default/contemplative.png b/gajim/data/icons/hicolor/16x16/status/mood-contemplative.png similarity index 100% rename from gajim/data/moods/default/contemplative.png rename to gajim/data/icons/hicolor/16x16/status/mood-contemplative.png diff --git a/gajim/data/moods/default/contented.png b/gajim/data/icons/hicolor/16x16/status/mood-contented.png similarity index 100% rename from gajim/data/moods/default/contented.png rename to gajim/data/icons/hicolor/16x16/status/mood-contented.png diff --git a/gajim/data/moods/default/cranky.png b/gajim/data/icons/hicolor/16x16/status/mood-cranky.png similarity index 100% rename from gajim/data/moods/default/cranky.png rename to gajim/data/icons/hicolor/16x16/status/mood-cranky.png diff --git a/gajim/data/moods/default/crazy.png b/gajim/data/icons/hicolor/16x16/status/mood-crazy.png similarity index 100% rename from gajim/data/moods/default/crazy.png rename to gajim/data/icons/hicolor/16x16/status/mood-crazy.png diff --git a/gajim/data/moods/default/creative.png b/gajim/data/icons/hicolor/16x16/status/mood-creative.png similarity index 100% rename from gajim/data/moods/default/creative.png rename to gajim/data/icons/hicolor/16x16/status/mood-creative.png diff --git a/gajim/data/moods/default/curious.png b/gajim/data/icons/hicolor/16x16/status/mood-curious.png similarity index 100% rename from gajim/data/moods/default/curious.png rename to gajim/data/icons/hicolor/16x16/status/mood-curious.png diff --git a/gajim/data/moods/default/dejected.png b/gajim/data/icons/hicolor/16x16/status/mood-dejected.png similarity index 100% rename from gajim/data/moods/default/dejected.png rename to gajim/data/icons/hicolor/16x16/status/mood-dejected.png diff --git a/gajim/data/moods/default/depressed.png b/gajim/data/icons/hicolor/16x16/status/mood-depressed.png similarity index 100% rename from gajim/data/moods/default/depressed.png rename to gajim/data/icons/hicolor/16x16/status/mood-depressed.png diff --git a/gajim/data/moods/default/disappointed.png b/gajim/data/icons/hicolor/16x16/status/mood-disappointed.png similarity index 100% rename from gajim/data/moods/default/disappointed.png rename to gajim/data/icons/hicolor/16x16/status/mood-disappointed.png diff --git a/gajim/data/moods/default/disgusted.png b/gajim/data/icons/hicolor/16x16/status/mood-disgusted.png similarity index 100% rename from gajim/data/moods/default/disgusted.png rename to gajim/data/icons/hicolor/16x16/status/mood-disgusted.png diff --git a/gajim/data/moods/default/dismayed.png b/gajim/data/icons/hicolor/16x16/status/mood-dismayed.png similarity index 100% rename from gajim/data/moods/default/dismayed.png rename to gajim/data/icons/hicolor/16x16/status/mood-dismayed.png diff --git a/gajim/data/moods/default/distracted.png b/gajim/data/icons/hicolor/16x16/status/mood-distracted.png similarity index 100% rename from gajim/data/moods/default/distracted.png rename to gajim/data/icons/hicolor/16x16/status/mood-distracted.png diff --git a/gajim/data/moods/default/embarrassed.png b/gajim/data/icons/hicolor/16x16/status/mood-embarrassed.png similarity index 100% rename from gajim/data/moods/default/embarrassed.png rename to gajim/data/icons/hicolor/16x16/status/mood-embarrassed.png diff --git a/gajim/data/moods/default/envious.png b/gajim/data/icons/hicolor/16x16/status/mood-envious.png similarity index 100% rename from gajim/data/moods/default/envious.png rename to gajim/data/icons/hicolor/16x16/status/mood-envious.png diff --git a/gajim/data/moods/default/excited.png b/gajim/data/icons/hicolor/16x16/status/mood-excited.png similarity index 100% rename from gajim/data/moods/default/excited.png rename to gajim/data/icons/hicolor/16x16/status/mood-excited.png diff --git a/gajim/data/moods/default/flirtatious.png b/gajim/data/icons/hicolor/16x16/status/mood-flirtatious.png similarity index 100% rename from gajim/data/moods/default/flirtatious.png rename to gajim/data/icons/hicolor/16x16/status/mood-flirtatious.png diff --git a/gajim/data/moods/default/frustrated.png b/gajim/data/icons/hicolor/16x16/status/mood-frustrated.png similarity index 100% rename from gajim/data/moods/default/frustrated.png rename to gajim/data/icons/hicolor/16x16/status/mood-frustrated.png diff --git a/gajim/data/moods/default/grateful.png b/gajim/data/icons/hicolor/16x16/status/mood-grateful.png similarity index 100% rename from gajim/data/moods/default/grateful.png rename to gajim/data/icons/hicolor/16x16/status/mood-grateful.png diff --git a/gajim/data/moods/default/grieving.png b/gajim/data/icons/hicolor/16x16/status/mood-grieving.png similarity index 100% rename from gajim/data/moods/default/grieving.png rename to gajim/data/icons/hicolor/16x16/status/mood-grieving.png diff --git a/gajim/data/moods/default/grumpy.png b/gajim/data/icons/hicolor/16x16/status/mood-grumpy.png similarity index 100% rename from gajim/data/moods/default/grumpy.png rename to gajim/data/icons/hicolor/16x16/status/mood-grumpy.png diff --git a/gajim/data/moods/default/guilty.png b/gajim/data/icons/hicolor/16x16/status/mood-guilty.png similarity index 100% rename from gajim/data/moods/default/guilty.png rename to gajim/data/icons/hicolor/16x16/status/mood-guilty.png diff --git a/gajim/data/moods/default/happy.png b/gajim/data/icons/hicolor/16x16/status/mood-happy.png similarity index 100% rename from gajim/data/moods/default/happy.png rename to gajim/data/icons/hicolor/16x16/status/mood-happy.png diff --git a/gajim/data/moods/default/hopeful.png b/gajim/data/icons/hicolor/16x16/status/mood-hopeful.png similarity index 100% rename from gajim/data/moods/default/hopeful.png rename to gajim/data/icons/hicolor/16x16/status/mood-hopeful.png diff --git a/gajim/data/moods/default/hot.png b/gajim/data/icons/hicolor/16x16/status/mood-hot.png similarity index 100% rename from gajim/data/moods/default/hot.png rename to gajim/data/icons/hicolor/16x16/status/mood-hot.png diff --git a/gajim/data/moods/default/humbled.png b/gajim/data/icons/hicolor/16x16/status/mood-humbled.png similarity index 100% rename from gajim/data/moods/default/humbled.png rename to gajim/data/icons/hicolor/16x16/status/mood-humbled.png diff --git a/gajim/data/moods/default/humiliated.png b/gajim/data/icons/hicolor/16x16/status/mood-humiliated.png similarity index 100% rename from gajim/data/moods/default/humiliated.png rename to gajim/data/icons/hicolor/16x16/status/mood-humiliated.png diff --git a/gajim/data/moods/default/hungry.png b/gajim/data/icons/hicolor/16x16/status/mood-hungry.png similarity index 100% rename from gajim/data/moods/default/hungry.png rename to gajim/data/icons/hicolor/16x16/status/mood-hungry.png diff --git a/gajim/data/moods/default/hurt.png b/gajim/data/icons/hicolor/16x16/status/mood-hurt.png similarity index 100% rename from gajim/data/moods/default/hurt.png rename to gajim/data/icons/hicolor/16x16/status/mood-hurt.png diff --git a/gajim/data/moods/default/impressed.png b/gajim/data/icons/hicolor/16x16/status/mood-impressed.png similarity index 100% rename from gajim/data/moods/default/impressed.png rename to gajim/data/icons/hicolor/16x16/status/mood-impressed.png diff --git a/gajim/data/moods/default/in_awe.png b/gajim/data/icons/hicolor/16x16/status/mood-in_awe.png similarity index 100% rename from gajim/data/moods/default/in_awe.png rename to gajim/data/icons/hicolor/16x16/status/mood-in_awe.png diff --git a/gajim/data/moods/default/in_love.png b/gajim/data/icons/hicolor/16x16/status/mood-in_love.png similarity index 100% rename from gajim/data/moods/default/in_love.png rename to gajim/data/icons/hicolor/16x16/status/mood-in_love.png diff --git a/gajim/data/moods/default/indignant.png b/gajim/data/icons/hicolor/16x16/status/mood-indignant.png similarity index 100% rename from gajim/data/moods/default/indignant.png rename to gajim/data/icons/hicolor/16x16/status/mood-indignant.png diff --git a/gajim/data/moods/default/interested.png b/gajim/data/icons/hicolor/16x16/status/mood-interested.png similarity index 100% rename from gajim/data/moods/default/interested.png rename to gajim/data/icons/hicolor/16x16/status/mood-interested.png diff --git a/gajim/data/moods/default/intoxicated.png b/gajim/data/icons/hicolor/16x16/status/mood-intoxicated.png similarity index 100% rename from gajim/data/moods/default/intoxicated.png rename to gajim/data/icons/hicolor/16x16/status/mood-intoxicated.png diff --git a/gajim/data/moods/default/invincible.png b/gajim/data/icons/hicolor/16x16/status/mood-invincible.png similarity index 100% rename from gajim/data/moods/default/invincible.png rename to gajim/data/icons/hicolor/16x16/status/mood-invincible.png diff --git a/gajim/data/moods/default/jealous.png b/gajim/data/icons/hicolor/16x16/status/mood-jealous.png similarity index 100% rename from gajim/data/moods/default/jealous.png rename to gajim/data/icons/hicolor/16x16/status/mood-jealous.png diff --git a/gajim/data/moods/default/lonely.png b/gajim/data/icons/hicolor/16x16/status/mood-lonely.png similarity index 100% rename from gajim/data/moods/default/lonely.png rename to gajim/data/icons/hicolor/16x16/status/mood-lonely.png diff --git a/gajim/data/moods/default/lost.png b/gajim/data/icons/hicolor/16x16/status/mood-lost.png similarity index 100% rename from gajim/data/moods/default/lost.png rename to gajim/data/icons/hicolor/16x16/status/mood-lost.png diff --git a/gajim/data/moods/default/lucky.png b/gajim/data/icons/hicolor/16x16/status/mood-lucky.png similarity index 100% rename from gajim/data/moods/default/lucky.png rename to gajim/data/icons/hicolor/16x16/status/mood-lucky.png diff --git a/gajim/data/moods/default/mean.png b/gajim/data/icons/hicolor/16x16/status/mood-mean.png similarity index 100% rename from gajim/data/moods/default/mean.png rename to gajim/data/icons/hicolor/16x16/status/mood-mean.png diff --git a/gajim/data/moods/default/moody.png b/gajim/data/icons/hicolor/16x16/status/mood-moody.png similarity index 100% rename from gajim/data/moods/default/moody.png rename to gajim/data/icons/hicolor/16x16/status/mood-moody.png diff --git a/gajim/data/moods/default/nervous.png b/gajim/data/icons/hicolor/16x16/status/mood-nervous.png similarity index 100% rename from gajim/data/moods/default/nervous.png rename to gajim/data/icons/hicolor/16x16/status/mood-nervous.png diff --git a/gajim/data/moods/default/neutral.png b/gajim/data/icons/hicolor/16x16/status/mood-neutral.png similarity index 100% rename from gajim/data/moods/default/neutral.png rename to gajim/data/icons/hicolor/16x16/status/mood-neutral.png diff --git a/gajim/data/moods/default/offended.png b/gajim/data/icons/hicolor/16x16/status/mood-offended.png similarity index 100% rename from gajim/data/moods/default/offended.png rename to gajim/data/icons/hicolor/16x16/status/mood-offended.png diff --git a/gajim/data/moods/default/outraged.png b/gajim/data/icons/hicolor/16x16/status/mood-outraged.png similarity index 100% rename from gajim/data/moods/default/outraged.png rename to gajim/data/icons/hicolor/16x16/status/mood-outraged.png diff --git a/gajim/data/moods/default/playful.png b/gajim/data/icons/hicolor/16x16/status/mood-playful.png similarity index 100% rename from gajim/data/moods/default/playful.png rename to gajim/data/icons/hicolor/16x16/status/mood-playful.png diff --git a/gajim/data/moods/default/proud.png b/gajim/data/icons/hicolor/16x16/status/mood-proud.png similarity index 100% rename from gajim/data/moods/default/proud.png rename to gajim/data/icons/hicolor/16x16/status/mood-proud.png diff --git a/gajim/data/moods/default/relaxed.png b/gajim/data/icons/hicolor/16x16/status/mood-relaxed.png similarity index 100% rename from gajim/data/moods/default/relaxed.png rename to gajim/data/icons/hicolor/16x16/status/mood-relaxed.png diff --git a/gajim/data/moods/default/relieved.png b/gajim/data/icons/hicolor/16x16/status/mood-relieved.png similarity index 100% rename from gajim/data/moods/default/relieved.png rename to gajim/data/icons/hicolor/16x16/status/mood-relieved.png diff --git a/gajim/data/moods/default/remorseful.png b/gajim/data/icons/hicolor/16x16/status/mood-remorseful.png similarity index 100% rename from gajim/data/moods/default/remorseful.png rename to gajim/data/icons/hicolor/16x16/status/mood-remorseful.png diff --git a/gajim/data/moods/default/restless.png b/gajim/data/icons/hicolor/16x16/status/mood-restless.png similarity index 100% rename from gajim/data/moods/default/restless.png rename to gajim/data/icons/hicolor/16x16/status/mood-restless.png diff --git a/gajim/data/moods/default/sad.png b/gajim/data/icons/hicolor/16x16/status/mood-sad.png similarity index 100% rename from gajim/data/moods/default/sad.png rename to gajim/data/icons/hicolor/16x16/status/mood-sad.png diff --git a/gajim/data/moods/default/sarcastic.png b/gajim/data/icons/hicolor/16x16/status/mood-sarcastic.png similarity index 100% rename from gajim/data/moods/default/sarcastic.png rename to gajim/data/icons/hicolor/16x16/status/mood-sarcastic.png diff --git a/gajim/data/moods/default/satisfied.png b/gajim/data/icons/hicolor/16x16/status/mood-satisfied.png similarity index 100% rename from gajim/data/moods/default/satisfied.png rename to gajim/data/icons/hicolor/16x16/status/mood-satisfied.png diff --git a/gajim/data/moods/default/serious.png b/gajim/data/icons/hicolor/16x16/status/mood-serious.png similarity index 100% rename from gajim/data/moods/default/serious.png rename to gajim/data/icons/hicolor/16x16/status/mood-serious.png diff --git a/gajim/data/moods/default/shocked.png b/gajim/data/icons/hicolor/16x16/status/mood-shocked.png similarity index 100% rename from gajim/data/moods/default/shocked.png rename to gajim/data/icons/hicolor/16x16/status/mood-shocked.png diff --git a/gajim/data/moods/default/shy.png b/gajim/data/icons/hicolor/16x16/status/mood-shy.png similarity index 100% rename from gajim/data/moods/default/shy.png rename to gajim/data/icons/hicolor/16x16/status/mood-shy.png diff --git a/gajim/data/moods/default/sick.png b/gajim/data/icons/hicolor/16x16/status/mood-sick.png similarity index 100% rename from gajim/data/moods/default/sick.png rename to gajim/data/icons/hicolor/16x16/status/mood-sick.png diff --git a/gajim/data/moods/default/sleepy.png b/gajim/data/icons/hicolor/16x16/status/mood-sleepy.png similarity index 100% rename from gajim/data/moods/default/sleepy.png rename to gajim/data/icons/hicolor/16x16/status/mood-sleepy.png diff --git a/gajim/data/moods/default/spontaneous.png b/gajim/data/icons/hicolor/16x16/status/mood-spontaneous.png similarity index 100% rename from gajim/data/moods/default/spontaneous.png rename to gajim/data/icons/hicolor/16x16/status/mood-spontaneous.png diff --git a/gajim/data/moods/default/stressed.png b/gajim/data/icons/hicolor/16x16/status/mood-stressed.png similarity index 100% rename from gajim/data/moods/default/stressed.png rename to gajim/data/icons/hicolor/16x16/status/mood-stressed.png diff --git a/gajim/data/moods/default/strong.png b/gajim/data/icons/hicolor/16x16/status/mood-strong.png similarity index 100% rename from gajim/data/moods/default/strong.png rename to gajim/data/icons/hicolor/16x16/status/mood-strong.png diff --git a/gajim/data/moods/default/surprised.png b/gajim/data/icons/hicolor/16x16/status/mood-surprised.png similarity index 100% rename from gajim/data/moods/default/surprised.png rename to gajim/data/icons/hicolor/16x16/status/mood-surprised.png diff --git a/gajim/data/moods/default/thankful.png b/gajim/data/icons/hicolor/16x16/status/mood-thankful.png similarity index 100% rename from gajim/data/moods/default/thankful.png rename to gajim/data/icons/hicolor/16x16/status/mood-thankful.png diff --git a/gajim/data/moods/default/thirsty.png b/gajim/data/icons/hicolor/16x16/status/mood-thirsty.png similarity index 100% rename from gajim/data/moods/default/thirsty.png rename to gajim/data/icons/hicolor/16x16/status/mood-thirsty.png diff --git a/gajim/data/moods/default/tired.png b/gajim/data/icons/hicolor/16x16/status/mood-tired.png similarity index 100% rename from gajim/data/moods/default/tired.png rename to gajim/data/icons/hicolor/16x16/status/mood-tired.png diff --git a/gajim/data/moods/default/undefined.png b/gajim/data/icons/hicolor/16x16/status/mood-undefined.png similarity index 100% rename from gajim/data/moods/default/undefined.png rename to gajim/data/icons/hicolor/16x16/status/mood-undefined.png diff --git a/gajim/data/moods/default/unknown.png b/gajim/data/icons/hicolor/16x16/status/mood-unknown.png similarity index 100% rename from gajim/data/moods/default/unknown.png rename to gajim/data/icons/hicolor/16x16/status/mood-unknown.png diff --git a/gajim/data/moods/default/weak.png b/gajim/data/icons/hicolor/16x16/status/mood-weak.png similarity index 100% rename from gajim/data/moods/default/weak.png rename to gajim/data/icons/hicolor/16x16/status/mood-weak.png diff --git a/gajim/data/moods/default/worried.png b/gajim/data/icons/hicolor/16x16/status/mood-worried.png similarity index 100% rename from gajim/data/moods/default/worried.png rename to gajim/data/icons/hicolor/16x16/status/mood-worried.png diff --git a/gajim/dialogs.py b/gajim/dialogs.py index b84ec208f..56389ef01 100644 --- a/gajim/dialogs.py +++ b/gajim/dialogs.py @@ -504,10 +504,12 @@ class ChangeMoodDialog: self.MOODS.sort() for mood in self.MOODS: + image = Gtk.Image.new_from_icon_name( + 'mood-%s' % mood, Gtk.IconSize.MENU) self.mood_buttons[mood] = Gtk.RadioButton() self.mood_buttons[mood].join_group(no_mood_button) self.mood_buttons[mood].set_mode(False) - self.mood_buttons[mood].add(gtkgui_helpers.load_mood_icon(mood)) + self.mood_buttons[mood].add(image) self.mood_buttons[mood].set_relief(Gtk.ReliefStyle.NONE) self.mood_buttons[mood].set_tooltip_text(MOODS[mood]) self.mood_buttons[mood].connect('clicked', @@ -700,8 +702,8 @@ class ChangeStatusMessageDialog(TimeoutDialog): img = self.xml.get_object('mood_image') label = self.xml.get_object('mood_button_label') if 'mood' in self.pep_dict and self.pep_dict['mood'] in MOODS: - img.set_from_pixbuf(gtkgui_helpers.load_mood_icon( - self.pep_dict['mood']).get_pixbuf()) + img.set_from_icon_name('mood-%s' % self.pep_dict['mood'], + Gtk.IconSize.MENU) if self.pep_dict['mood_text']: label.set_text(self.pep_dict['mood_text']) else: diff --git a/gajim/gtk/profile.py b/gajim/gtk/profile.py index a6f4cd4cc..dccc114b5 100644 --- a/gajim/gtk/profile.py +++ b/gajim/gtk/profile.py @@ -325,7 +325,7 @@ class ProfileWindow(Gtk.ApplicationWindow): return vcard_, sha = self.make_vcard() nick = vcard_.get('NICKNAME') or None - app.connections[self.account].get_module('UserNickname').send(nick) + app.connections[self.account].get_module('UserNickname').set_nickname(nick) if not nick: nick = app.config.get_per('accounts', self.account, 'name') app.nicks[self.account] = nick diff --git a/gajim/gtk/tooltips.py b/gajim/gtk/tooltips.py index 06fc22f55..ad79d5f61 100644 --- a/gajim/gtk/tooltips.py +++ b/gajim/gtk/tooltips.py @@ -36,11 +36,13 @@ from gi.repository import Pango from gajim.common import app from gajim.common import helpers from gajim.common.const import AvatarSize +from gajim.common.const import PEPEventType from gajim.common.i18n import Q_ from gajim.common.i18n import _ from gajim.gtk.util import get_builder from gajim.gtk.util import get_icon_name +from gajim.gtk.util import format_mood log = logging.getLogger('gajim.gtk.tooltips') @@ -471,8 +473,8 @@ class RosterTooltip(StatusTable): Append Tune, Mood, Activity, Location information of the specified contact to the given property list. """ - if 'mood' in contact.pep: - mood = contact.pep['mood'].as_markup_text() + if PEPEventType.MOOD in contact.pep: + mood = format_mood(*contact.pep[PEPEventType.MOOD]) self._ui.mood.set_markup(mood) self._ui.mood.show() self._ui.mood_label.show() diff --git a/gajim/gtk/util.py b/gajim/gtk/util.py index aed9e6470..f74f0ee1d 100644 --- a/gajim/gtk/util.py +++ b/gajim/gtk/util.py @@ -36,6 +36,7 @@ from gajim.common import app from gajim.common import configpaths from gajim.common import i18n from gajim.common.i18n import _ +from gajim.common.const import MOODS from gajim.gtk.const import GajimIconSet @@ -499,3 +500,24 @@ def ensure_not_destroyed(func): return return func(self, *args, **kwargs) return func_wrapper + + +def ensure_proper_control(func): + @wraps(func) + def func_wrapper(self, event): + if event.account != self.account: + return + if event.jid != self.contact.jid: + return + return func(self, event) + return func_wrapper + + +def format_mood(mood, text): + if mood is None: + return '' + mood = MOODS[mood] + markuptext = '%s' % GLib.markup_escape_text(mood) + if text is not None: + markuptext += ' (%s)' % GLib.markup_escape_text(text) + return markuptext diff --git a/gajim/gtkgui_helpers.py b/gajim/gtkgui_helpers.py index 122bff2f4..8b063bfe4 100644 --- a/gajim/gtkgui_helpers.py +++ b/gajim/gtkgui_helpers.py @@ -267,15 +267,6 @@ def create_list_multi(value_list, selected_values=None): treeview.show_all() return treeview -def load_mood_icon(icon_name): - """ - Load an icon from the mood iconset in 16x16 - """ - iconset = app.config.get('mood_iconset') - path = os.path.join(helpers.get_mood_iconset_path(iconset), '') - icon_list = _load_icon_list([icon_name], path) - return icon_list[icon_name] - def load_activity_icon(category, activity=None): """ Load an icon from the activity iconset in 16x16 @@ -289,12 +280,6 @@ def load_activity_icon(category, activity=None): return icon_list[activity] def get_pep_icon(pep_class): - if pep_class == PEPEventType.MOOD: - received_mood = pep_class.data['mood'] - mood = received_mood if received_mood in MOODS else 'unknown' - pixbuf = load_mood_icon(mood).get_pixbuf() - return pixbuf - if pep_class == PEPEventType.TUNE: return 'audio-x-generic' diff --git a/gajim/roster_window.py b/gajim/roster_window.py index 0f8fc7287..99b1cdb5c 100644 --- a/gajim/roster_window.py +++ b/gajim/roster_window.py @@ -43,6 +43,7 @@ from gi.repository import GObject from gi.repository import GLib from gi.repository import Gio from nbxmpp.protocol import NS_FILE, NS_ROSTERX, NS_CONFERENCE +from nbxmpp.structs import MoodData from gajim import dialogs from gajim import vcard @@ -1043,9 +1044,8 @@ class RosterWindow: self.model[child_iter][Column.NAME] = GLib.markup_escape_text(account_name) pep_dict = app.connections[account].pep - if app.config.get('show_mood_in_roster') and 'mood' in pep_dict: - self.model[child_iter][Column.MOOD_PIXBUF] = \ - gtkgui_helpers.get_pep_icon(pep_dict['mood']) + if app.config.get('show_mood_in_roster') and PEPEventType.MOOD in pep_dict: + self.model[child_iter][Column.MOOD_PIXBUF] = 'mood-%s' % pep_dict[PEPEventType.MOOD].mood else: self.model[child_iter][Column.MOOD_PIXBUF] = None @@ -1311,7 +1311,7 @@ class RosterWindow: return False def _is_pep_shown_in_roster(self, pep_type): - if pep_type == 'mood': + if pep_type == PEPEventType.MOOD: return app.config.get('show_mood_in_roster') if pep_type == 'activity': @@ -1328,6 +1328,7 @@ class RosterWindow: def draw_all_pep_types(self, jid, account, contact=None): for pep_type in self._pep_type_to_model_column: self.draw_pep(jid, account, pep_type, contact=contact) + self._draw_pep(account, jid, PEPEventType.MOOD) def draw_pep(self, jid, account, pep_type, contact=None): if pep_type not in self._pep_type_to_model_column: @@ -1349,6 +1350,26 @@ class RosterWindow: for child_iter in iters: self.model[child_iter][model_column] = pixbuf + def _draw_pep(self, account, jid, type_): + if not self._is_pep_shown_in_roster(type_): + return + + iters = self._get_contact_iter(jid, account, model=self.model) + if not iters: + return + contact = app.contacts.get_contact(account, jid) + + icon = None + data = contact.pep.get(type_) + + if type_ == PEPEventType.MOOD: + column = Column.MOOD_PIXBUF + if data is not None: + icon = 'mood-%s' % data.mood + + for child_iter in iters: + self.model[child_iter][column] = icon + def _get_avatar_image(self, account, jid): if not app.config.get('show_avatars_in_roster'): return None @@ -2086,9 +2107,9 @@ class RosterWindow: if 'mood' in pep_dict: mood = pep_dict['mood'] mood_text = pep_dict.get('mood_text', None) - connection.get_module('UserMood').send((mood, mood_text)) + connection.get_module('UserMood').set_mood(MoodData(mood, mood_text)) else: - connection.get_module('UserMood').send(None) + connection.get_module('UserMood').set_mood(None) def delete_pep(self, jid, account): if jid == app.get_jid_from_account(account): @@ -2611,18 +2632,21 @@ class RosterWindow: def _nec_pep_received(self, obj): if obj.user_pep.type_ not in (PEPEventType.ACTIVITY, PEPEventType.TUNE, - PEPEventType.MOOD, - PEPEventType.LOCATION, - PEPEventType.NICKNAME): + PEPEventType.LOCATION): return if obj.jid == app.get_jid_from_account(obj.conn.name): self.draw_account(obj.conn.name) - if obj.pep_type == 'nick': - self.draw_contact(obj.jid, obj.conn.name) - else: - self.draw_pep(obj.jid, obj.conn.name, obj.pep_type) + self.draw_pep(obj.jid, obj.conn.name, obj.pep_type) + + def _on_mood_received(self, event): + if event.is_self_message: + self.draw_account(event.account) + self._draw_pep(event.account, event.jid, PEPEventType.MOOD) + + def _on_nickname_received(self, event): + self.draw_contact(event.jid, event.account) def _nec_update_avatar(self, obj): app.log('avatar').debug('Draw roster avatar: %s', obj.jid) @@ -5558,7 +5582,7 @@ class RosterWindow: # activity_pixbuf, TUNE_ICON, LOCATION_ICON, avatar_img, # padlock_pixbuf, visible] self.columns = [str, str, str, str, str, - GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf, str, str, + str, GdkPixbuf.Pixbuf, str, str, Gtk.Image, str, bool] self.xml = get_builder('roster_window.ui') @@ -5658,7 +5682,7 @@ class RosterWindow: # cell_data_func, func_arg) self.renderers_list = [] self.renderers_propertys = {} - self._pep_type_to_model_column = {'mood': Column.MOOD_PIXBUF, + self._pep_type_to_model_column = { 'activity': Column.ACTIVITY_PIXBUF, 'tune': Column.TUNE_ICON, 'geoloc': Column.LOCATION_ICON} @@ -5682,7 +5706,7 @@ class RosterWindow: 'markup', Column.NAME, self._nameCellDataFunc, None), ('mood', Gtk.CellRendererPixbuf(), False, - 'pixbuf', Column.MOOD_PIXBUF, + 'icon_name', Column.MOOD_PIXBUF, self._fill_pep_pixbuf_renderer, Column.MOOD_PIXBUF), ('activity', Gtk.CellRendererPixbuf(), False, @@ -5808,6 +5832,10 @@ class RosterWindow: self._nec_agent_removed) app.ged.register_event_handler('pep-received', ged.GUI1, self._nec_pep_received) + app.ged.register_event_handler('nickname-received', ged.GUI1, + self._on_nickname_received) + app.ged.register_event_handler('mood-received', ged.GUI1, + self._on_mood_received) app.ged.register_event_handler('update-roster-avatar', ged.GUI1, self._nec_update_avatar) app.ged.register_event_handler('update-room-avatar', ged.GUI1,