comparison src/gaim-remote @ 13765:13b7e59a0759

[gaim-migrate @ 16177] SF Bug #1485718 "At Solaris ARC review, the architect committee noticed that gaim installs two files to /usr/bin with the *.py extension. These include: gaim-notifications-example.py gaim-remote.py ARC also noticed that there are no other applications in /usr/bin with this extension, and questioned whether it makes sense to add applications to the default user PATH like this. Does it make more sense to remove the .py from the filenames if you are planning to install them into PATH? They recommend changing the name for consistancy. Also, not sure it is a good idea to install example programs to /usr/bin. Perhaps gaim-notifications-example should be installed to a /usr/demo directory, or elsewhere?" I've renamed gaim-remote.py to gaim-remote and moved gaim-notifications-example to /usr/share/gaim/doc/examples. committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Thu, 11 May 2006 17:02:46 +0000
parents
children 95166d0d6037
comparison
equal deleted inserted replaced
13764:8d972f41b4de 13765:13b7e59a0759
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
12 obj = dbus.SessionBus().get_object("net.sf.gaim.GaimService", "/net/sf/gaim/GaimObject")
13 gaim = dbus.Interface(obj, "net.sf.gaim.GaimInterface")
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
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
63 def execute(uri):
64 match = re.match(urlregexp, uri)
65 protocol = match.group(2)
66 if protocol == "aim" or protocol == "icq":
67 protocol = "oscar"
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":
81 print params
82 account = findaccount(accountname, protocol)
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":
90 account = findaccount(accountname, protocol)
91 connection = cgaim.GaimAccountGetConnection(account)
92 return gaim.ServJoinChat(connection, params)
93
94 elif command == "addbuddy":
95 account = findaccount(accountname, protocol)
96 return cgaim.GaimBlistRequestAddBuddy(account, params["screenname"],
97 params.get("group", ""), "")
98
99 elif command == "setstatus":
100 current = gaim.GaimSavedstatusGetCurrent()
101
102 if "status" in params:
103 status_id = params["status"]
104 status_type = gaim.GaimPrimitiveGetTypeFromId(status_id)
105 else:
106 status_type = gaim.GaimSavedStatusGetType(current)
107 status_id = gaim.GaimPrimitiveGetIdFromType(status_type)
108
109 if "message" in params:
110 message = params["message"];
111 else:
112 message = gaim.GaimSavedstatusGetMessage(current)
113
114 if "account" in params:
115 accounts = [cgaim.GaimAccountsFindAny(accountname, protocol)]
116
117 for account in accounts:
118 status = gaim.GaimAccountGetStatus(account, status_id)
119 type = gaim.GaimStatusGetType(status)
120 gaim.GaimSavedstatusSetSubstatus(current, account, type, message)
121 gaim.GaimSavedstatusActivateForAccount(current, account)
122 else:
123 accounts = gaim.GaimAccountsGetAllActive()
124 saved = gaim.GaimSavedstatusNew("", status_type)
125 gaim.GaimSavedstatusSetMessage(saved, message)
126 gaim.GaimSavedstatusActivate(saved)
127
128 return None
129
130 elif command == "getinfo":
131 account = findaccount(accountname, protocol)
132 connection = cgaim.GaimAccountGetConnection(account)
133 return gaim.ServGetInfo(connection, params["screenname"])
134
135 elif command == "quit":
136 return gaim.GaimCoreQuit()
137
138 elif command == "uri":
139 return None
140
141 else:
142 match = re.match(r"(\w+)\s*\(([^)]*)\)", command)
143 if match is not None:
144 name = match.group(1)
145 argstr = match.group(2)
146 if argstr == "":
147 args = []
148 else:
149 args = argstr.split(",")
150 fargs = []
151 for arg in args:
152 fargs.append(convert(arg.strip()))
153 return gaim.__getattr__(name)(*fargs)
154 else:
155 # introspect the object to get parameter names and types
156 # this is slow because the entire introspection info must be downloaded
157 data = dbus.Interface(obj, "org.freedesktop.DBus.Introspectable").\
158 Introspect()
159 introspect = xml.dom.minidom.parseString(data).documentElement
160 for method in introspect.all("method"):
161 if command == method.getAttribute("name"):
162 methodparams = []
163 for arg in method.all("arg"):
164 if arg.getAttribute("direction") == "in":
165 value = params[arg.getAttribute("name")]
166 type = arg.getAttribute("type")
167 if type == "s":
168 methodparams.append(value)
169 elif type == "i":
170 methodparams.append(int(value))
171 else:
172 raise "Don't know how to handle type \"%s\"" % type
173 return gaim.__getattr__(command)(*methodparams)
174 raise "Unknown command: %s" % command
175
176
177 if len(sys.argv) == 1:
178 print """This program uses DBus to communicate with gaim.
179
180 Usage:
181
182 %s "command1" "command2" ...
183
184 Each command is of one of the three types:
185
186 [protocol:]commandname?param1=value1&param2=value2&...
187 FunctionName?param1=value1&param2=value2&...
188 FunctionName(value1,value2,...)
189
190 The second and third form are provided for completeness but their use
191 is not recommended; use gaim-send or gaim-send-async instead. The
192 second form uses introspection to find out the parameter names and
193 their types, therefore it is rather slow.
194
195 Examples of commands:
196
197 jabber:goim?screenname=testone@localhost&message=hi
198 jabber:gochat?room=TestRoom&server=conference.localhost
199 jabber:getinfo?screenname=testone@localhost
200 jabber:addbuddy?screenname=my friend
201
202 setstatus?status=away&message=don't disturb
203 quit
204
205 GaimAccountsFindConnected?name=&protocol=prpl-jabber
206 GaimAccountFindConnected(,prpl-jabber)
207 """ % sys.argv[0]
208
209 for arg in sys.argv[1:]:
210 print execute(arg)
211
212