Mercurial > pidgin.yaz
comparison libgaim/gaim-url-handler @ 14520:82b59abcaee4
[gaim-migrate @ 17240]
SF Patch #1492561 from Lars T. Mikkelsen
"This patch adds gaim-url-handler, a URL handler for
most protocols in Gaim. The gaim-url-handler is similar
to (and based on) gaim-remote, however, it uses the
native URL format of each protocol.
Furthermore, the patch includes a GConf schema, which
allows Gnome applications to use the URL handler."
With this and gaim-send/gaim-send-async, we should be able to drop gaim-remote.
Please let me know if you object, or I'll remove gaim-remote shortly.
For the record, I know this doesn't support 100% of the ChatZilla IRC URL spec,
and I haven't investigated the XMPP URL spec beyond a casual first look. We
can tweak these things later -- I figured it was important to get the bulk of
the code in place.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Mon, 11 Sep 2006 02:30:59 +0000 |
parents | |
children | e3a640372b6e |
comparison
equal
deleted
inserted
replaced
14519:e548832f0e82 | 14520:82b59abcaee4 |
---|---|
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 | |
87 command = urllib.unquote(match.group(2)) | |
88 paramstring = match.group(4) | |
89 params = {} | |
90 if paramstring: | |
91 for param in paramstring.split("&"): | |
92 key, value = extendlist(param.split("=", 1), 2, "") | |
93 params[key] = urllib.unquote(value) | |
94 accountname = params.get("account", "") | |
95 screenname = params.get("screenname", "") | |
96 | |
97 account = findaccount(protocol, accountname) | |
98 | |
99 if command == "goim": | |
100 goim(account, screenname, params.get("message")) | |
101 elif command == "gochat": | |
102 gochat(account, params) | |
103 elif command == "addbuddy": | |
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 | |
113 screenname = urllib.unquote(match.group(1)) | |
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 | |
127 server = urllib.unquote(match.group(2)) or "" | |
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, "") | |
143 params[key] = urllib.unquote(value) | |
144 | |
145 account = findaccount(protocol) | |
146 | |
147 if (target != ""): | |
148 if (isnick): | |
149 goim(account, urllib.unquote(target.split(",")[0]), params.get("msg")) | |
150 else: | |
151 channel = urllib.unquote(target.split(",")[0]) | |
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 | |
163 command = urllib.unquote(match.group(1)) | |
164 paramstring = match.group(3) | |
165 params = {} | |
166 if paramstring: | |
167 for param in paramstring.split("&"): | |
168 key, value = extendlist(param.split("=", 1), 2, "") | |
169 params[key] = urllib.unquote(value) | |
170 screenname = params.get("contact", "") | |
171 | |
172 account = findaccount(protocol) | |
173 | |
174 if command == "chat": | |
175 goim(account, screenname) | |
176 elif command == "add": | |
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 | |
186 screenname = urllib.unquote(match.group(1)) | |
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 | |
197 accountname = urllib.unquote(match.group(2)) or "" | |
198 screenname = urllib.unquote(match.group(4)) | |
199 command = urllib.unquote(match.group(6)) | |
200 paramstring = match.group(8) | |
201 params = {} | |
202 if paramstring: | |
203 for param in paramstring.split(";"): | |
204 key, value = extendlist(param.split("=", 1), 2, "") | |
205 params[key] = urllib.unquote(value) | |
206 | |
207 account = findaccount(protocol, accountname) | |
208 | |
209 if command == "message": | |
210 goim(account, screenname, params.get("body")) | |
211 elif command == "join": | |
212 room, server = screenname.split("@") | |
213 gochat(account, {"room": room, "server": server}) | |
214 elif command == "roster": | |
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 | |
226 command = urllib.unquote(match.group(1)) | |
227 screenname = urllib.unquote(match.group(3)) | |
228 paramstring = match.group(5) | |
229 params = {} | |
230 if paramstring: | |
231 for param in paramstring.split("&"): | |
232 key, value = extendlist(param.split("=", 1), 2, "") | |
233 params[key] = urllib.unquote(value) | |
234 | |
235 account = findaccount(protocol) | |
236 | |
237 if command == "sendIM": | |
238 goim(account, screenname, params.get("m")) | |
239 elif command == "chat": | |
240 gochat(account, {"room": screenname}) | |
241 elif command == "addfriend": | |
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() |