Mercurial > pidgin
annotate src/gaim-remote.py @ 13548:db6add1a3905
[gaim-migrate @ 15925]
Another patch from Bj??rn Voigt:
"Jochen Kemnade helped me very much with the German translation for
2.0.0. He wants to continue translation support and asked to be added to
the current translators list."
and
"I found an inconsistency in the translators list. Normally there is only
one translator per line. But there could be more than one translator for
one language. But Erdal Ronahi and Amed ?. Jiyan are in one line. The
problem is that the click on the mailto-link does not work with two mail
adresses together (in the Gaim->About window)"
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Wed, 22 Mar 2006 06:24:39 +0000 |
parents | ac5bc9a7b603 |
children | ec858948d292 |
rev | line source |
---|---|
11187 | 1 #!/usr/bin/python |
2 | |
3 import dbus | |
4 import re | |
5 import urllib | |
6 import sys | |
7 | |
8 import xml.dom.minidom | |
9 | |
10 xml.dom.minidom.Element.all = xml.dom.minidom.Element.getElementsByTagName | |
11 | |
13220
ac5bc9a7b603
[gaim-migrate @ 15584]
Richard Laager <rlaager@wiktel.com>
parents:
12684
diff
changeset
|
12 obj = dbus.SessionBus().get_object("net.sf.gaim.GaimService", "/net/sf/gaim/GaimObject") |
ac5bc9a7b603
[gaim-migrate @ 15584]
Richard Laager <rlaager@wiktel.com>
parents:
12684
diff
changeset
|
13 gaim = dbus.Interface(obj, "net.sf.gaim.GaimInterface") |
11187 | 14 |
15 class CheckedObject: | |
16 def __init__(self, obj): | |
17 self.obj = obj | |
18 | |
19 def __getattr__(self, attr): | |
20 return CheckedAttribute(self, attr) | |
21 | |
22 class CheckedAttribute: | |
23 def __init__(self, cobj, attr): | |
24 self.cobj = cobj | |
25 self.attr = attr | |
26 | |
27 def __call__(self, *args): | |
28 result = self.cobj.obj.__getattr__(self.attr)(*args) | |
29 if result == 0: | |
30 raise "Error: " + self.attr + " " + str(args) + " returned " + str(result) | |
31 return result | |
32 | |
33 cgaim = CheckedObject(gaim) | |
34 | |
35 urlregexp = r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?" | |
36 | |
37 def extendlist(list, length, fill): | |
38 if len(list) < length: | |
39 return list + [fill] * (length - len(list)) | |
40 else: | |
41 return list | |
42 | |
43 def convert(value): | |
44 try: | |
45 return int(value) | |
46 except: | |
47 return value | |
48 | |
11241 | 49 def findaccount(accountname, protocolname): |
50 try: | |
51 # prefer connected accounts | |
52 account = cgaim.GaimAccountsFindConnected(accountname, protocolname) | |
53 return account | |
54 except: | |
55 # try to get any account and connect it | |
56 account = cgaim.GaimAccountsFindAny(accountname, protocolname) | |
57 print gaim.GaimAccountGetUsername(account) | |
58 gaim.GaimAccountSetStatusVargs(account, "online", 1) | |
59 gaim.GaimAccountConnect(account) | |
60 return account | |
61 | |
62 | |
11187 | 63 def execute(uri): |
64 match = re.match(urlregexp, uri) | |
65 protocol = match.group(2) | |
12684
2e4e02b72e43
[gaim-migrate @ 15027]
Richard Laager <rlaager@wiktel.com>
parents:
11331
diff
changeset
|
66 if protocol == "aim" or protocol == "icq": |
2e4e02b72e43
[gaim-migrate @ 15027]
Richard Laager <rlaager@wiktel.com>
parents:
11331
diff
changeset
|
67 protocol = "oscar" |
11187 | 68 if protocol is not None: |
69 protocol = "prpl-" + protocol | |
70 command = match.group(5) | |
71 paramstring = match.group(7) | |
72 params = {} | |
73 if paramstring is not None: | |
74 for param in paramstring.split("&"): | |
75 key, value = extendlist(param.split("=",1), 2, "") | |
76 params[key] = urllib.unquote(value) | |
77 | |
78 accountname = params.get("account", "") | |
79 | |
80 if command == "goim": | |
11241 | 81 print params |
82 account = findaccount(accountname, protocol) | |
11187 | 83 conversation = cgaim.GaimConversationNew(1, account, params["screenname"]) |
84 if "message" in params: | |
85 im = cgaim.GaimConversationGetImData(conversation) | |
86 gaim.GaimConvImSend(im, params["message"]) | |
87 return None | |
88 | |
89 elif command == "gochat": | |
11241 | 90 account = findaccount(accountname, protocol) |
11187 | 91 connection = cgaim.GaimAccountGetConnection(account) |
92 return gaim.ServJoinChat(connection, params) | |
93 | |
94 elif command == "addbuddy": | |
11241 | 95 account = findaccount(accountname, protocol) |
11187 | 96 return cgaim.GaimBlistRequestAddBuddy(account, params["screenname"], |
97 params.get("group", ""), "") | |
98 | |
99 elif command == "setstatus": | |
100 if "account" in params: | |
11241 | 101 accounts = [cgaim.GaimAccountsFindAny(accountname, protocol)] |
11187 | 102 else: |
103 accounts = gaim.GaimAccountsGetAllActive() | |
104 | |
105 for account in accounts: | |
11241 | 106 status = cgaim.GaimAccountGetStatus(account, params["status"]) |
11187 | 107 for key, value in params.items(): |
11241 | 108 if key not in ["status", "account"]: |
11187 | 109 gaim.GaimStatusSetAttrString(status, key, value) |
110 gaim.GaimAccountSetStatusVargs(account, params["status"], 1) | |
111 return None | |
112 | |
11241 | 113 elif command == "getinfo": |
114 account = findaccount(accountname, protocol) | |
115 connection = cgaim.GaimAccountGetConnection(account) | |
11331 | 116 return gaim.ServGetInfo(connection, params["screenname"]) |
11241 | 117 |
11187 | 118 elif command == "quit": |
119 return gaim.GaimCoreQuit() | |
120 | |
121 elif command == "uri": | |
122 return None | |
123 | |
124 else: | |
125 match = re.match(r"(\w+)\s*\(([^)]*)\)", command) | |
126 if match is not None: | |
127 name = match.group(1) | |
128 argstr = match.group(2) | |
129 if argstr == "": | |
130 args = [] | |
131 else: | |
132 args = argstr.split(",") | |
133 fargs = [] | |
134 for arg in args: | |
135 fargs.append(convert(arg.strip())) | |
136 return gaim.__getattr__(name)(*fargs) | |
137 else: | |
138 # introspect the object to get parameter names and types | |
139 # this is slow because the entire introspection info must be downloaded | |
140 data = dbus.Interface(obj, "org.freedesktop.DBus.Introspectable").\ | |
141 Introspect() | |
142 introspect = xml.dom.minidom.parseString(data).documentElement | |
143 for method in introspect.all("method"): | |
144 if command == method.getAttribute("name"): | |
145 methodparams = [] | |
146 for arg in method.all("arg"): | |
147 if arg.getAttribute("direction") == "in": | |
148 value = params[arg.getAttribute("name")] | |
149 type = arg.getAttribute("type") | |
150 if type == "s": | |
151 methodparams.append(value) | |
152 elif type == "i": | |
153 methodparams.append(int(value)) | |
154 else: | |
155 raise "Don't know how to handle type \"%s\"" % type | |
11331 | 156 return gaim.__getattr__(command)(*methodparams) |
11187 | 157 raise "Unknown command: %s" % command |
158 | |
11331 | 159 |
160 if len(sys.argv) == 1: | |
161 print """This program uses DBus to communicate with gaim. | |
162 | |
163 Usage: | |
11187 | 164 |
11331 | 165 %s "command1" "command2" ... |
166 | |
167 Each command is of one of the three types: | |
168 | |
169 [protocol:]commandname?param1=value1¶m2=value2&... | |
170 FunctionName?param1=value1¶m2=value2&... | |
171 FunctionName(value1,value2,...) | |
11187 | 172 |
11331 | 173 The second and third form are provided for completeness but their use |
174 is not recommended; use gaim-send or gaim-send-async instead. The | |
175 second form uses introspection to find out the parameter names and | |
176 their types, therefore it is rather slow. | |
177 | |
178 Examples of commands: | |
11187 | 179 |
11331 | 180 jabber:goim?screenname=testone@localhost&message=hi |
181 jabber:gochat?room=TestRoom&server=conference.localhost | |
182 jabber:getinfo?screenname=testone@localhost | |
183 jabber:addbuddy?screenname=my friend | |
11187 | 184 |
11331 | 185 setstatus?status=away&message=don't disturb |
186 quit | |
11187 | 187 |
11331 | 188 GaimAccountsFindConnected?name=&protocol=prpl-jabber |
189 GaimAccountFindConnected(,prpl-jabber) | |
190 """ % sys.argv[0] | |
11187 | 191 |
192 for arg in sys.argv[1:]: | |
193 print execute(arg) | |
194 | |
195 |