Mercurial > pidgin
comparison libpurple/purple-url-handler @ 17037:cc9242ce1435
Patch #756 from EvilSporkMan. Use Datallah's url handling for Dbus
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Tue, 15 May 2007 01:06:02 +0000 |
parents | 27dfbca8dd40 |
children | 5059a0a071a2 |
comparison
equal
deleted
inserted
replaced
17036:74f1f5bbd858 | 17037:cc9242ce1435 |
---|---|
36 | 36 |
37 return result | 37 return result |
38 | 38 |
39 cpurple = CheckedObject(purple) | 39 cpurple = CheckedObject(purple) |
40 | 40 |
41 def extendlist(list, length, fill): | |
42 if len(list) < length: | |
43 return list + [fill] * (length - len(list)) | |
44 else: | |
45 return list | |
46 | |
47 def convert(value): | |
48 try: | |
49 return int(value) | |
50 except: | |
51 return value | |
52 | |
53 def findaccount(protocolname, accountname=""): | |
54 # prefer connected accounts | |
55 account = cpurple.PurpleAccountsFindConnected(accountname, protocolname) | |
56 if (account != 0): | |
57 return account | |
58 | |
59 # try to get any account and connect it | |
60 account = cpurple.PurpleAccountsFindAny(accountname, protocolname) | |
61 if (account == 0): | |
62 print "No matching account found." | |
63 sys.exit(1) | |
64 | |
65 purple.PurpleAccountSetStatusVargs(account, "online", 1) | |
66 purple.PurpleAccountConnect(account) | |
67 return account | |
68 | |
69 def goim(account, screenname, message=None): | |
70 # XXX: 1 == PURPLE_CONV_TYPE_IM | |
71 conversation = cpurple.PurpleConversationNew(1, account, screenname) | |
72 if message: | |
73 purple.PurpleConvSendConfirm(conversation, message) | |
74 | |
75 def gochat(account, params, message=None): | |
76 connection = cpurple.PurpleAccountGetConnection(account) | |
77 purple.ServJoinChat(connection, params) | |
78 | |
79 if message != None: | |
80 for i in range(20): | |
81 # XXX: 2 == PURPLE_CONV_TYPE_CHAT | |
82 conversation = purple.PurpleFindConversationWithAccount(2, params.get("channel", params.get("room")), account) | |
83 if conversation: | |
84 purple.PurpleConvSendConfirm(conversation, message) | |
85 break | |
86 else: | |
87 time.sleep(0.5) | |
88 | |
89 def addbuddy(account, screenname, group="", alias=""): | |
90 cpurple.PurpleBlistRequestAddBuddy(account, screenname, group, alias) | |
91 | |
92 | |
93 def aim(uri): | |
94 protocol = "prpl-aim" | |
95 match = re.match(r"^aim:([^?]*)(\?(.*))", uri) | |
96 if not match: | |
97 print "Invalid aim URI: %s" % uri | |
98 return | |
99 | |
100 command = urllib.unquote_plus(match.group(1)) | |
101 paramstring = match.group(3) | |
102 params = {} | |
103 if paramstring: | |
104 for param in paramstring.split("&"): | |
105 key, value = extendlist(param.split("=", 1), 2, "") | |
106 params[key] = urllib.unquote_plus(value) | |
107 accountname = params.get("account", "") | |
108 screenname = params.get("screenname", "") | |
109 | |
110 account = findaccount(protocol, accountname) | |
111 | |
112 if command.lower() == "goim": | |
113 goim(account, screenname, params.get("message")) | |
114 elif command.lower() == "gochat": | |
115 gochat(account, params) | |
116 elif command.lower() == "addbuddy": | |
117 addbuddy(account, screenname, params.get("group", "")) | |
118 | |
119 def gg(uri): | |
120 protocol = "prpl-gg" | |
121 match = re.match(r"^gg:(.*)", uri) | |
122 if not match: | |
123 print "Invalid gg URI: %s" % uri | |
124 return | |
125 | |
126 screenname = urllib.unquote_plus(match.group(1)) | |
127 account = findaccount(protocol) | |
128 goim(account, screenname) | |
129 | |
130 def icq(uri): | |
131 protocol = "prpl-icq" | |
132 match = re.match(r"^icq:([^?]*)(\?(.*))", uri) | |
133 if not match: | |
134 print "Invalid icq URI: %s" % uri | |
135 return | |
136 | |
137 command = urllib.unquote_plus(match.group(1)) | |
138 paramstring = match.group(3) | |
139 params = {} | |
140 if paramstring: | |
141 for param in paramstring.split("&"): | |
142 key, value = extendlist(param.split("=", 1), 2, "") | |
143 params[key] = urllib.unquote_plus(value) | |
144 accountname = params.get("account", "") | |
145 screenname = params.get("screenname", "") | |
146 | |
147 account = findaccount(protocol, accountname) | |
148 | |
149 if command.lower() == "goim": | |
150 goim(account, screenname, params.get("message")) | |
151 elif command.lower() == "gochat": | |
152 gochat(account, params) | |
153 elif command.lower() == "addbuddy": | |
154 addbuddy(account, screenname, params.get("group", "")) | |
155 | |
156 def irc(uri): | |
157 protocol = "prpl-irc" | |
158 match = re.match(r"^irc:(//([^/]*)/)?([^?]*)(\?(.*))?", uri) | |
159 if not match: | |
160 print "Invalid irc URI: %s" % uri | |
161 return | |
162 | |
163 server = urllib.unquote_plus(match.group(2)) or "" | |
164 target = match.group(3) or "" | |
165 query = match.group(5) or "" | |
166 | |
167 modifiers = {} | |
168 if target: | |
169 for modifier in target.split(",")[1:]: | |
170 modifiers[modifier] = True | |
171 | |
172 isnick = modifiers.has_key("isnick") | |
173 | |
174 paramstring = match.group(5) | |
175 params = {} | |
176 if paramstring: | |
177 for param in paramstring.split("&"): | |
178 key, value = extendlist(param.split("=", 1), 2, "") | |
179 params[key] = urllib.unquote_plus(value) | |
180 | |
181 account = findaccount(protocol) | |
182 | |
183 if (target != ""): | |
184 if (isnick): | |
185 goim(account, urllib.unquote_plus(target.split(",")[0]), params.get("msg")) | |
186 else: | |
187 channel = urllib.unquote_plus(target.split(",")[0]) | |
188 if channel[0] != "#": | |
189 channel = "#" + channel | |
190 gochat(account, {"server": server, "channel": channel, "password": params.get("key", "")}, params.get("msg")) | |
191 | |
192 def msnim(uri): | |
193 protocol = "prpl-msn" | |
194 match = re.match(r"^msnim:([^?]*)(\?(.*))", uri) | |
195 if not match: | |
196 print "Invalid msnim URI: %s" % uri | |
197 return | |
198 | |
199 command = urllib.unquote_plus(match.group(1)) | |
200 paramstring = match.group(3) | |
201 params = {} | |
202 if paramstring: | |
203 for param in paramstring.split("&"): | |
204 key, value = extendlist(param.split("=", 1), 2, "") | |
205 params[key] = urllib.unquote_plus(value) | |
206 screenname = params.get("contact", "") | |
207 | |
208 account = findaccount(protocol) | |
209 | |
210 if command.lower() == "chat": | |
211 goim(account, screenname) | |
212 elif command.lower() == "add": | |
213 addbuddy(account, screenname) | |
214 | |
215 def sip(uri): | |
216 protocol = "prpl-simple" | |
217 match = re.match(r"^sip:(.*)", uri) | |
218 if not match: | |
219 print "Invalid sip URI: %s" % uri | |
220 return | |
221 | |
222 screenname = urllib.unquote_plus(match.group(1)) | |
223 account = findaccount(protocol) | |
224 goim(account, screenname) | |
225 | |
226 def xmpp(uri): | |
227 protocol = "prpl-jabber" | |
228 match = re.match(r"^xmpp:(//([^/?#]*)/?)?([^?#]*)(\?([^;#]*)(;([^#]*))?)?(#(.*))?", uri) | |
229 if not match: | |
230 print "Invalid xmpp URI: %s" % uri | |
231 return | |
232 | |
233 tmp = match.group(2) | |
234 if (tmp): | |
235 accountname = urllib.unquote_plus(tmp) | |
236 else: | |
237 accountname = "" | |
238 | |
239 screenname = urllib.unquote_plus(match.group(3)) | |
240 | |
241 tmp = match.group(5) | |
242 if (tmp): | |
243 command = urllib.unquote_plus(tmp) | |
244 else: | |
245 command = "" | |
246 | |
247 paramstring = match.group(7) | |
248 params = {} | |
249 if paramstring: | |
250 for param in paramstring.split(";"): | |
251 key, value = extendlist(param.split("=", 1), 2, "") | |
252 params[key] = urllib.unquote_plus(value) | |
253 | |
254 account = findaccount(protocol, accountname) | |
255 | |
256 if command.lower() == "message": | |
257 goim(account, screenname, params.get("body")) | |
258 elif command.lower() == "join": | |
259 room, server = screenname.split("@") | |
260 gochat(account, {"room": room, "server": server}) | |
261 elif command.lower() == "roster": | |
262 addbuddy(account, screenname, params.get("group", ""), params.get("name", "")) | |
263 else: | |
264 goim(account, screenname) | |
265 | |
266 def ymsgr(uri): | |
267 protocol = "prpl-yahoo" | |
268 match = re.match(r"^ymsgr:([^?]*)(\?([^&]*)(&(.*))?)", uri) | |
269 if not match: | |
270 print "Invalid ymsgr URI: %s" % uri | |
271 return | |
272 | |
273 command = urllib.unquote_plus(match.group(1)) | |
274 screenname = urllib.unquote_plus(match.group(3)) | |
275 paramstring = match.group(5) | |
276 params = {} | |
277 if paramstring: | |
278 for param in paramstring.split("&"): | |
279 key, value = extendlist(param.split("=", 1), 2, "") | |
280 params[key] = urllib.unquote_plus(value) | |
281 | |
282 account = findaccount(protocol) | |
283 | |
284 if command.lower() == "sendim": | |
285 goim(account, screenname, params.get("m")) | |
286 elif command.lower() == "chat": | |
287 gochat(account, {"room": screenname}) | |
288 elif command.lower() == "addfriend": | |
289 addbuddy(account, screenname) | |
290 | |
291 | |
292 def main(argv=sys.argv): | 41 def main(argv=sys.argv): |
293 if len(argv) != 2: | 42 if len(argv) != 2: |
294 print "Usage: %s URI" % argv[0] | 43 print "Usage: %s URI" % argv[0] |
295 print "Example: %s \"xmpp:romeo@montague.net?message\"" % argv[0] | 44 print "Example: %s \"xmpp:romeo@montague.net?message\"" % argv[0] |
296 return | 45 return |
297 | 46 |
298 uri = argv[1] | 47 uri = argv[1] |
299 type = uri.split(":")[0] | |
300 | 48 |
49 print uri | |
301 try: | 50 try: |
302 if type == "aim": | 51 cpurple.PurpleGotProtocolHandlerUri(uri) |
303 aim(uri) | |
304 elif type == "gg": | |
305 gg(uri) | |
306 elif type == "icq": | |
307 icq(uri) | |
308 elif type == "irc": | |
309 irc(uri) | |
310 elif type == "msnim": | |
311 msnim(uri) | |
312 elif type == "sip": | |
313 sip(uri) | |
314 elif type == "xmpp": | |
315 xmpp(uri) | |
316 elif type == "ymsgr": | |
317 ymsgr(uri) | |
318 else: | |
319 print "Unkown protocol: %s" % type | |
320 except dbus.dbus_bindings.DBusException: | 52 except dbus.dbus_bindings.DBusException: |
321 print "ERROR: Is there a libpurple-powered client (e.g. Pidgin or Finch) running?" | 53 print "ERROR: Is there a libpurple-powered client (e.g. Pidgin or Finch) running?" |
322 | 54 |
323 | 55 |
324 if __name__ == "__main__": | 56 if __name__ == "__main__": |