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