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