bf88b40c92df6ece75bab13c9135647cf93308cd
[gwibber.git] / gwibber / microblog / __init__.py
1
2 import operator, traceback 
3 from . import can
4 from . import twitter, jaiku, identica, laconica, pownce, friendfeed
5 from . import digg, flickr, brightkite, rss, pingfm, facebook
6 from . import greader
7
8 # i18n magic
9 import gettext
10
11 _ = gettext.lgettext
12
13 PROTOCOLS = {
14   "jaiku": jaiku,
15   "digg": digg,
16   "twitter": twitter,
17   "facebook": facebook,
18   "friendfeed": friendfeed,
19   "flickr": flickr,
20   #"pownce": pownce,
21   "identica": identica,
22   "laconica": laconica,
23   "rss": rss,
24   "pingfm": pingfm,
25   "greader": greader,
26   "brightkite": brightkite,
27 }
28
29 def supports(a, feature):
30   return feature in PROTOCOLS[a["protocol"]].PROTOCOL_INFO["features"]
31
32 class Client:
33   def __init__(self, accounts):
34     self.accounts = accounts
35
36   def handle_error(self, acct, err, msg = None):
37     pass
38
39   def post_process_message(self, message):
40     return message
41
42   def get_data(self, test, method, name, filter=list(PROTOCOLS.keys()), return_value=True, first_only=False):
43     for acct in self.accounts:
44       if acct["protocol"] in list(PROTOCOLS.keys()) and \
45          acct["protocol"] in filter:
46         try:
47           client = PROTOCOLS[acct["protocol"]].Client(acct)
48           if test(acct):
49             if return_value:
50               for message in method(client):
51                 yield self.post_process_message(message)
52             else:
53               yield method(client)
54               if first_only: break
55         except: self.handle_error(acct, traceback.format_exc(), name)
56
57   def perform_operation(self, test, method, name, filter=list(PROTOCOLS.keys())):
58     data = list(self.get_data(test, method, name, filter))
59     data.sort(key=operator.attrgetter("time"), reverse=True)
60     return data
61
62   def send(self, message, filter=list(PROTOCOLS.keys())):
63     return list(self.get_data(
64       lambda a: a["send_enabled"] and supports(a, can.SEND),
65       # Translators: this message appears in the Errors dialog
66       # Indicates with wich action the error happened 
67       lambda c: c.send(message), _("send message"), filter, False))
68
69   def send_thread(self, message, target, filter=list(PROTOCOLS.keys())):
70     return list(self.get_data(
71       lambda a: a["send_enabled"] and supports(a, can.THREAD_REPLY),
72       # Translators: this message appears in the Errors dialog
73       # Indicates with wich action the error happened 
74       lambda c: c.send_thread(message, target), _("send message"), filter, False))
75
76   def reply(self, message, filter=list(PROTOCOLS.keys())):
77     return list(self.get_data(
78       lambda a: supports(a, can.SEND),
79       # Translators: this message appears in the Errors dialog
80       # Indicates with wich action the error happened       
81       lambda c: c.send(message), _("send message"), filter, False, True))
82
83   def thread(self, query, filter=list(PROTOCOLS.keys())):
84     return self.perform_operation(
85       lambda a: a["receive_enabled"] and supports(a, can.THREAD) and \
86         a.id == query.account.id,
87       # Translators: this message appears in the Errors dialog
88       # Indicates with wich action the error happened 
89       lambda c: c.get_thread(query), _("retrieve thread"), filter)
90   
91   def responses(self, filter=list(PROTOCOLS.keys())):
92     return self.perform_operation(
93       lambda a: a["receive_enabled"] and supports(a, can.RESPONSES),
94       # Translators: this message appears in the Errors dialog
95       # Indicates with wich action the error happened 
96       lambda c: c.responses(), _("retrieve responses"), filter)
97
98   def receive(self, filter=list(PROTOCOLS.keys())):
99     return self.perform_operation(
100       lambda a: a["receive_enabled"] and supports(a, can.RECEIVE),
101       # Translators: this message appears in the Errors dialog
102       # Indicates with wich action the error happened 
103       lambda c: c.receive(), _("retrieve messages"), filter)
104
105   def friend_positions(self, filter=list(PROTOCOLS.keys())):
106     return self.perform_operation(
107       lambda a: a["receive_enabled"] and supports(a, can.GEO_FRIEND_POSITIONS),
108       # Translators: this message appears in the Errors dialog
109       # Indicates with wich action the error happened 
110       lambda c: c.friend_positions(), _("retrieve positions"), filter)
111
112   def search(self, query, filter=list(PROTOCOLS.keys())):
113     return self.perform_operation(
114       lambda a: a["search_enabled"] and supports(a, can.SEARCH),
115       # Translators: this message appears in the Errors dialog
116       # Indicates with wich action the error happened       
117       lambda c: c.search(query), _("perform search query"), filter)
118
119   def search_url(self, query, filter=list(PROTOCOLS.keys())):
120     return self.perform_operation(
121       lambda a: a["search_enabled"] and supports(a, can.SEARCH_URL),
122       # Translators: this message appears in the Errors dialog
123       # Indicates with wich action the error happened       
124       lambda c: c.search_url(query), _("perform search query"), filter)
125
126   def tag(self, query, filter=list(PROTOCOLS.keys())):
127     return self.perform_operation(
128       lambda a: a["receive_enabled"] and supports(a, can.TAG),
129       # Translators: this message appears in the Errors dialog
130       # Indicates with wich action the error happened       
131       lambda c: c.tag(query.lower().replace("#", "")), _("perform tag query"), filter)
132
133   def user_messages(self, screen_name, account_id, filter=list(PROTOCOLS.keys())):
134     return self.perform_operation(
135       lambda a: a["receive_enabled"] and supports(a, can.USER_MESSAGES) and \
136         a.id == account_id,
137       lambda c: c.user_messages(screen_name), "perform user_messages query", filter)
138
139   def group(self, query, filter=list(PROTOCOLS.keys())):
140     return self.perform_operation(
141       lambda a: a["receive_enabled"] and supports(a, can.GROUP),
142       # Translators: this message appears in the Errors dialog
143       # Indicates with wich action the error happened       
144       lambda c: c.group(query.lower().replace("!", "")), _("perform group query"), filter)
145
146   def unfollow(self, id, account_id, filter=list(PROTOCOLS.keys())):
147     return list(self.get_data(
148       lambda a: a.id == account_id,
149       lambda c: c.unfollow(id), "unfollow %s" % (id,) , filter, False))
150
151