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()