Mercurial > pidgin
annotate libgaim/gaim-url-handler @ 14763:175d85e4c8fa
[gaim-migrate @ 17520]
This is no longer an issue as of datallah's commit,
revision #17509
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Wed, 18 Oct 2006 15:27:38 +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() |
