From 37162307673db4c3442b69a1f460e2c5b9e6d499 Mon Sep 17 00:00:00 2001 From: Michael Kainer <kaini1123@gmx.at> Date: Mon, 25 Oct 2010 14:43:33 +0200 Subject: [PATCH] Initial --- ubuntu_integration/__init__.py | 1 + ubuntu_integration/doc/example.jpg | Bin 0 -> 11097 bytes ubuntu_integration/manifest.ini | 15 +++ ubuntu_integration/plugin.py | 176 +++++++++++++++++++++++++++++ 4 files changed, 192 insertions(+) create mode 100644 ubuntu_integration/__init__.py create mode 100644 ubuntu_integration/doc/example.jpg create mode 100644 ubuntu_integration/manifest.ini create mode 100644 ubuntu_integration/plugin.py diff --git a/ubuntu_integration/__init__.py b/ubuntu_integration/__init__.py new file mode 100644 index 00000000..db3c5d39 --- /dev/null +++ b/ubuntu_integration/__init__.py @@ -0,0 +1 @@ +from plugin import UbuntuIntegrationPlugin diff --git a/ubuntu_integration/doc/example.jpg b/ubuntu_integration/doc/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97fc76d1742904160a95e0c39cb91dec8479a398 GIT binary patch literal 11097 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 WOXXh2Toy(?4b)MjCj9WQ@V@{L2uXPW literal 0 HcmV?d00001 diff --git a/ubuntu_integration/manifest.ini b/ubuntu_integration/manifest.ini new file mode 100644 index 00000000..dc8b74b3 --- /dev/null +++ b/ubuntu_integration/manifest.ini @@ -0,0 +1,15 @@ +[info] +name: Ubuntu Ayatana Integration +short_name: ubuntu_integration +version: 0.1 +description: This plugin integrates Gajim with the Ubuntu Messaging Menu. + + You must have python-indicate and python-xdg (and Gajim obviously) installed to enable this plugin. + + Many thanks to the guys from gajim@conference.gajim.org for answering my questions :) +authors: Michael Kainer <kaini@jabber.hot-chilli.net> +homepage: http://google.at/ + + + + diff --git a/ubuntu_integration/plugin.py b/ubuntu_integration/plugin.py new file mode 100644 index 00000000..e7553352 --- /dev/null +++ b/ubuntu_integration/plugin.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +""" +Ubuntu Ayatana Integration plugin. + +TODO: +* handle gc-invitation, subscription_request: it looks like they don't fire +* nice error if plugin can't load +* me menu +* permanent integration into the messaging menu after quitting gajim +* show/hide gajim on root menu entry +* switch workspace on click on events +* pictures in the menu +* hide gajim if the plugin is disabled + +:author: Michael Kainer <kaini@jabber.hot-chilli.net> +:since: 21st October 2010 +:copyright: Copyright (2010) Michael Kainer <kaini1123@gmx.at> +:license: GPLv3 +""" +# Python +import time +import os +# Gajim +from plugins import GajimPlugin +from plugins.plugin import GajimPluginException +from plugins.helpers import log, log_calls +from common import ged +from common import gajim +# 3rd party +try: + import indicate + HAS_INDICATE = True +except: + HAS_INDICATE = False +try: + from xdg.DesktopEntry import DesktopEntry + from xdg.BaseDirectory import load_data_paths + HAS_PYXDG = True +except: + HAS_PYXDG = False + +class UbuntuIntegrationPlugin(GajimPlugin): + """ + Class for Messaging Menu and Me Menu. + """ + + @log_calls("UbuntuIntegrationPlugin") + def init(self): + """ + Does nothing. + """ + pass + + @log_calls("UbuntuIntegrationPlugin") + def activate(self): + """ + Displays gajim in the Messaging Menu. + """ + if not HAS_INDICATE: + raise GajimPluginException("python-indicate is missing!") + if not HAS_PYXDG: + raise GajimPluginException("python-xdg is missing!") + + self.server = indicate.indicate_server_ref_default() + self.server.set_type("message.im") + dfile = "" + for file in load_data_paths("applications/gajim.desktop"): + dfile = file + break + if not dfile: + raise GajimPluginException("Can't locate gajim.desktop!") + self.server.set_desktop_file(dfile) + self.server.show() + + # {(account, jid): (indicator, [event, ...]), ...} + self.events = {} + + gajim.events.event_added_subscribe(self.on_event_added) + gajim.events.event_removed_subscribe(self.on_event_removed) + + @log_calls("UbuntuIntegrationPlugin") + def deactivate(self): + """ + Cleaning up. + """ + gajim.events.event_added_unsubscribe(self.on_event_added) + gajim.events.event_removed_unsubscribe(self.on_event_removed) + + for (_, event) in self.events: + event[0].hide() + self.server.hide() + + del self.server + del self.events + + def on_indicator_activate(self, indicator, _): + """ + Forwards the action to gajims event handler. + """ + key = indicator.key + event = self.events[key][1][0] + gajim.interface.handle_event(event.account, event.jid, event.type_) + + def on_event_added(self, event): + """ + Adds "Nickname Time" to the Messaging menu. + """ + print "----", event.type_ + + # Basic variables + account = event.account + jid = event.jid + when = time.time() + contact = "" + + # Check if the event is valid and modify the variables + if event.type_ == "chat" or \ + event.type_ == "printed_chat" or \ + event.type_ == "normal" or \ + event.type_ == "printed_normal" or \ + event.type_ == "file-request" or \ + event.type_ == "jingle-incoming": + contact = gajim.contacts.get_contact_from_full_jid(account, jid) + if contact: + contact = contact.get_shown_name() + else: + contact = jid + elif event.type_ == "pm" or event.type_ == "printed_pm": + contact = gajim.get_nick_from_jid(gajim.get_room_from_fjid(jid)) + \ + "/" + gajim.get_room_and_nick_from_fjid(jid)[1] + elif event.type_ == "printed_marked_gc_msg": + contact = gajim.get_nick_from_jid(gajim.get_room_from_fjid(jid)) + else: + print "ignored"; + return + + print account, jid, when, contact + + # Add a new indicator if necessary + key = (account, jid) + if not self.events.has_key(key): + indicator = indicate.Indicator() + indicator.set_property("name", contact) + indicator.set_property_time("time", when) + indicator.set_property_bool("draw-attention", True); + indicator.connect("user-display", self.on_indicator_activate) + indicator.show() + indicator.key = key + self.events[key] = (indicator, []) + + # Prepare the event and save it + event.time = when + self.events[key][1].append(event); + + def on_event_removed(self, events): + """ + Goes through the events and removes them from the array and + the indicator if there are no longer any events pending. + """ + for event in events: + print "====", event.type_ + + key = (event.account, event.jid) + + if self.events.has_key(key) and \ + event in self.events[key][1]: + self.events[key][1].remove(event) + + if len(self.events[key][1]) == 0: # remove indicator + self.events[key][0].hide() + del self.events[key] + else: # set the indicator time to the text event + self.events[key][0].set_property_time("time", + self.events[key][1][0].time) + else: + print "ignored" -- GitLab