1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
import os
import dbus
import datetime as dt
import logging
from gi.repository import GObject
from gajim.common import app
from gajim.common import ged
from gajim.common import dbus_support
from gajim.plugins import GajimPlugin
from gajim.plugins.helpers import log_calls
from gajim.plugins.plugins_i18n import _
from gajim.common.const import ACTIVITIES
log = logging.getLogger('gajim.p.hamster')
HAMSTAER_INTERFACE = 'org.gnome.Hamster'
SUBACTIVITIES = []
subactivity_ = [list(ACTIVITIES[x].keys()) for x in list(ACTIVITIES.keys())]
for x in subactivity_ :
SUBACTIVITIES = SUBACTIVITIES + x
SUBACTIVITIES = set(SUBACTIVITIES)
SUBACTIVITIES.remove('category')
XMPP_ACTIVITIES = set(ACTIVITIES.keys())
class HamsterIntegrationPlugin(GajimPlugin):
@log_calls('HamsterIntegrationPlugin')
def init(self):
self.description = _('Integration with project hamster, see '
'http://projecthamster.wordpress.com/about/')
self.config_dialog = None
self.events_handlers = {}
if os.name == 'nt':
self.available_text = _('Plugin can\'t be run under Windows.')
self.activatable = False
@log_calls('HamsterIntegrationPlugin')
def activate(self):
if not dbus_support.supported:
return
self.bus = dbus_support.session_bus.SessionBus()
try:
self.session_presence = self.bus.get_object(HAMSTAER_INTERFACE,
'/org/gnome/Hamster')
except:
log.debug('Hamster D-Bus service not found')
return
self.bus.add_signal_receiver(self.hamster_facts_changed, 'FactsChanged',
HAMSTAER_INTERFACE)
app.ged.register_event_handler('signed-in', ged.POSTGUI,
self.on_signed_in)
@log_calls('HamsterIntegrationPlugin')
def deactivate(self):
if not dbus_support.supported or not self.active:
return
self.bus.remove_signal_receiver(self.hamster_facts_changed,
"FactsChanged", dbus_interface=HAMSTAER_INTERFACE)
app.ged.remove_event_handler('signed-in', ged.POSTGUI,
self.on_signed_in)
def hamster_facts_changed(self, *args, **kw):
# get hamster tags
facts = self.session_presence.GetTodaysFacts(
dbus_interface=HAMSTAER_INTERFACE)
if not facts:
return
if self.from_dbus_fact(facts[-1])['end_time']:
accounts = list(app.connections.keys())
for account in accounts:
if app.account_is_connected(account):
connection = app.connections[account]
connection.get_module('UserActivity').send(None)
return
last_fact = self.from_dbus_fact(facts[-1])
tags = set(last_fact['tags'])
activity = "Other"
activity_candidates = XMPP_ACTIVITIES.intersection(tags)
if len(activity_candidates) >= 1:
activity=list(activity_candidates)[0]
subactivity = 'other'
subactivity_candidates = SUBACTIVITIES.intersection(tags)
if len(subactivity_candidates) >= 1:
subactivity=list(subactivity_candidates)[0]
# send activity
for account in app.connections:
if app.account_is_connected(account):
connection = app.connections[account]
connection.get_module('UserActivity').send(
(activity, subactivity, last_fact['fact']))
def from_dbus_fact(self, fact):
'''unpack the struct into a proper dict'''
return dict(fact = fact[4],
start_time = dt.datetime.utcfromtimestamp(fact[1]),
end_time = dt.datetime.utcfromtimestamp(fact[2]) if fact[2] else None,
description = fact[3],
activity_id = fact[5],
category = fact[6],
tags = fact[7],
date = dt.datetime.utcfromtimestamp(fact[8]).date(),
delta = dt.timedelta(days = fact[9] // (24 * 60 * 60),
seconds = fact[9] % (24 * 60 * 60)),
id = fact[0])
def on_signed_in(self, network_event):
GObject.timeout_add(5000,self.hamster_facts_changed)
|