Mercurial > pidgin
annotate libgaim/gaim-url-handler @ 14609:36ededd6e064
[gaim-migrate @ 17337]
Show the placeholder icon in the account editor. I didn't make it
clickable, though. Can someone please do that for me? Pretty please
with corn syrup on top? I'll be your best friend!
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Fri, 22 Sep 2006 06:45:01 +0000 |
parents | b007392d72ff |
children | 5d71039b20eb |
rev | line source |
---|---|
14520 | 1 #!/usr/bin/python |
2 | |
3 import dbus | |
4 import re | |
5 import sys | |
6 import time | |
7 import urllib | |
8 | |
9 obj = dbus.SessionBus().get_object("net.sf.gaim.GaimService", "/net/sf/gaim/GaimObject") | |
10 gaim = dbus.Interface(obj, "net.sf.gaim.GaimInterface") | |
11 | |
12 class CheckedObject: | |
13 def __init__(self, obj): | |
14 self.obj = obj | |
15 | |
16 def __getattr__(self, attr): | |
17 return CheckedAttribute(self, attr) | |
18 | |
19 class CheckedAttribute: | |
20 def __init__(self, cobj, attr): | |
21 self.cobj = cobj | |
22 self.attr = attr | |
23 | |
24 def __call__(self, *args): | |
25 result = self.cobj.obj.__getattr__(self.attr)(*args) | |
26 if result == 0: | |
27 raise "Error: " + self.attr + " " + str(args) + " returned " + str(result) | |
28 return result | |
29 | |
30 cgaim = CheckedObject(gaim) | |
31 | |
32 def extendlist(list, length, fill): | |
33 if len(list) < length: | |
34 return list + [fill] * (length - len(list)) | |
35 else: | |
36 return list | |
37 | |
38 def convert(value): | |
39 try: | |
40 return int(value) | |
41 except: | |
42 return value | |
43 | |
44 def findaccount(protocolname, accountname=""): | |
45 try: | |
46 # prefer connected accounts | |
47 account = cgaim.GaimAccountsFindConnected(accountname, protocolname) | |
48 return account | |
49 except: | |
50 # try to get any account and connect it | |
51 account = cgaim.GaimAccountsFindAny(accountname, protocolname) | |
52 gaim.GaimAccountSetStatusVargs(account, "online", 1) | |
53 gaim.GaimAccountConnect(account) | |
54 return account | |
55 | |
56 def goim(account, screenname, message=None): | |
57 # XXX: 1 == GAIM_CONV_TYPE_IM | |
58 conversation = cgaim.GaimConversationNew(1, account, screenname) | |
59 if message: | |
60 gaim.GaimConvSendConfirm(conversation, message) | |
61 | |
62 def gochat(account, params, message=None): | |
63 connection = cgaim.GaimAccountGetConnection(account) | |
64 gaim.ServJoinChat(connection, params) | |
65 | |
66 if message != None: | |
67 for i in range(20): | |
68 # XXX: 2 == GAIM_CONV_TYPE_CHAT | |
69 conversation = gaim.GaimFindConversationWithAccount(2, params.get("channel", params.get("room")), account) | |
70 if conversation: | |
71 gaim.GaimConvSendConfirm(conversation, message) | |
72 break | |
73 else: | |
74 time.sleep(0.5) | |
75 | |
76 def addbuddy(account, screenname, group="", alias=""): | |
77 cgaim.GaimBlistRequestAddBuddy(account, screenname, group, alias) | |
78 | |
79 | |
80 def aim(uri): | |
81 protocol = "prpl-oscar" | |
82 match = re.match(r"^(aim|icq):([^?]*)(\?(.*))", uri) | |
83 if not match: | |
84 print "Invalid aim URI: %s" % uri | |
85 return | |
86 | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
87 command = urllib.unquote_plus(match.group(2)) |
14520 | 88 paramstring = match.group(4) |
89 params = {} | |
90 if paramstring: | |
91 for param in paramstring.split("&"): | |
92 key, value = extendlist(param.split("=", 1), 2, "") | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
93 params[key] = urllib.unquote_plus(value) |
14520 | 94 accountname = params.get("account", "") |
95 screenname = params.get("screenname", "") | |
96 | |
97 account = findaccount(protocol, accountname) | |
98 | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
99 if command.lower() == "goim": |
14520 | 100 goim(account, screenname, params.get("message")) |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
101 elif command.lower() == "gochat": |
14520 | 102 gochat(account, params) |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
103 elif command.lower() == "addbuddy": |
14520 | 104 addbuddy(account, screenname, params.get("group", "")) |
105 | |
106 def gg(uri): | |
107 protocol = "prpl-gg" | |
108 match = re.match(r"^gg:(.*)", uri) | |
109 if not match: | |
110 print "Invalid gg URI: %s" % uri | |
111 return | |
112 | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
113 screenname = urllib.unquote_plus(match.group(1)) |
14520 | 114 account = findaccount(protocol) |
115 goim(account, screenname) | |
116 | |
117 def icq(uri): | |
118 aim(uri) | |
119 | |
120 def irc(uri): | |
121 protocol = "prpl-irc" | |
122 match = re.match(r"^irc:(//([^/]*)/)?([^?]*)(\?(.*))?", uri) | |
123 if not match: | |
124 print "Invalid irc URI: %s" % uri | |
125 return | |
126 | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
127 server = urllib.unquote_plus(match.group(2)) or "" |
14520 | 128 target = match.group(3) or "" |
129 query = match.group(5) or "" | |
130 | |
131 modifiers = {} | |
132 if target: | |
133 for modifier in target.split(",")[1:]: | |
134 modifiers[modifier] = True | |
135 | |
136 isnick = modifiers.has_key("isnick") | |
137 | |
138 paramstring = match.group(5) | |
139 params = {} | |
140 if paramstring: | |
141 for param in paramstring.split("&"): | |
142 key, value = extendlist(param.split("=", 1), 2, "") | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
143 params[key] = urllib.unquote_plus(value) |
14520 | 144 |
145 account = findaccount(protocol) | |
146 | |
147 if (target != ""): | |
148 if (isnick): | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
149 goim(account, urllib.unquote_plus(target.split(",")[0]), params.get("msg")) |
14520 | 150 else: |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
151 channel = urllib.unquote_plus(target.split(",")[0]) |
14520 | 152 if channel[0] != "#": |
153 channel = "#" + channel | |
154 gochat(account, {"server": server, "channel": channel, "password": params.get("key", "")}, params.get("msg")) | |
155 | |
156 def msnim(uri): | |
157 protocol = "prpl-msn" | |
158 match = re.match(r"^msnim:([^?]*)(\?(.*))", uri) | |
159 if not match: | |
160 print "Invalid msnim URI: %s" % uri | |
161 return | |
162 | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
163 command = urllib.unquote_plus(match.group(1)) |
14520 | 164 paramstring = match.group(3) |
165 params = {} | |
166 if paramstring: | |
167 for param in paramstring.split("&"): | |
168 key, value = extendlist(param.split("=", 1), 2, "") | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
169 params[key] = urllib.unquote_plus(value) |
14520 | 170 screenname = params.get("contact", "") |
171 | |
172 account = findaccount(protocol) | |
173 | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
174 if command.lower() == "chat": |
14520 | 175 goim(account, screenname) |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
176 elif command.lower() == "add": |
14520 | 177 addbuddy(account, screenname) |
178 | |
179 def sip(uri): | |
180 protocol = "prpl-simple" | |
181 match = re.match(r"^sip:(.*)", uri) | |
182 if not match: | |
183 print "Invalid sip URI: %s" % uri | |
184 return | |
185 | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
186 screenname = urllib.unquote_plus(match.group(1)) |
14520 | 187 account = findaccount(protocol) |
188 goim(account, screenname) | |
189 | |
190 def xmpp(uri): | |
191 protocol = "prpl-jabber" | |
192 match = re.match(r"^xmpp:(//([^/?#]*))?(/?([^?#]*))(\?([^;#]*)(;([^#]*))?)?(#(.*))?", uri) | |
193 if not match: | |
194 print "Invalid xmpp URI: %s" % uri | |
195 return | |
196 | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
197 accountname = urllib.unquote_plus(match.group(2)) or "" |
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
198 screenname = urllib.unquote_plus(match.group(4)) |
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
199 command = urllib.unquote_plus(match.group(6)) |
14520 | 200 paramstring = match.group(8) |
201 params = {} | |
202 if paramstring: | |
203 for param in paramstring.split(";"): | |
204 key, value = extendlist(param.split("=", 1), 2, "") | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
205 params[key] = urllib.unquote_plus(value) |
14520 | 206 |
207 account = findaccount(protocol, accountname) | |
208 | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
209 if command.lower() == "message": |
14520 | 210 goim(account, screenname, params.get("body")) |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
211 elif command.lower() == "join": |
14520 | 212 room, server = screenname.split("@") |
213 gochat(account, {"room": room, "server": server}) | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
214 elif command.lower() == "roster": |
14520 | 215 addbuddy(account, screenname, params.get("group", ""), params.get("name", "")) |
216 else: | |
217 goim(account, screenname) | |
218 | |
219 def ymsgr(uri): | |
220 protocol = "prpl-yahoo" | |
221 match = re.match(r"^ymsgr:([^?]*)(\?([^&]*)(&(.*))?)", uri) | |
222 if not match: | |
223 print "Invalid ymsgr URI: %s" % uri | |
224 return | |
225 | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
226 command = urllib.unquote_plus(match.group(1)) |
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
227 screenname = urllib.unquote_plus(match.group(3)) |
14520 | 228 paramstring = match.group(5) |
229 params = {} | |
230 if paramstring: | |
231 for param in paramstring.split("&"): | |
232 key, value = extendlist(param.split("=", 1), 2, "") | |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
233 params[key] = urllib.unquote_plus(value) |
14520 | 234 |
235 account = findaccount(protocol) | |
236 | |
14539
b007392d72ff
[gaim-migrate @ 17260]
Richard Laager <rlaager@wiktel.com>
parents:
14535
diff
changeset
|
237 if command.lower() == "sendim": |
14520 | 238 goim(account, screenname, params.get("m")) |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
239 elif command.lower() == "chat": |
14520 | 240 gochat(account, {"room": screenname}) |
14535
e3a640372b6e
[gaim-migrate @ 17256]
Richard Laager <rlaager@wiktel.com>
parents:
14520
diff
changeset
|
241 elif command.lower() == "addfriend": |
14520 | 242 addbuddy(account, screenname) |
243 | |
244 | |
245 def main(argv=sys.argv): | |
246 if len(argv) != 2: | |
247 print "Usage: %s URI" % argv[0] | |
248 print "Example: %s \"xmpp:romeo@montague.net?message\"" % argv[0] | |
249 return | |
250 | |
251 uri = argv[1] | |
252 type = uri.split(":")[0] | |
253 | |
254 if type == "aim": | |
255 aim(uri) | |
256 elif type == "gg": | |
257 gg(uri) | |
258 elif type == "icq": | |
259 icq(uri) | |
260 elif type == "irc": | |
261 irc(uri) | |
262 elif type == "msnim": | |
263 msnim(uri) | |
264 elif type == "sip": | |
265 sip(uri) | |
266 elif type == "xmpp": | |
267 xmpp(uri) | |
268 elif type == "ymsgr": | |
269 ymsgr(uri) | |
270 else: | |
271 print "Unkown protocol: %s" % type | |
272 | |
273 if __name__ == "__main__": | |
274 main() |