Mercurial > pidgin
diff libgaim/gaim-remote @ 14192:60b1bc8dbf37
[gaim-migrate @ 16863]
Renamed 'core' to 'libgaim'
committer: Tailor Script <tailor@pidgin.im>
author | Evan Schoenberg <evan.s@dreskin.net> |
---|---|
date | Sat, 19 Aug 2006 01:50:10 +0000 |
parents | |
children | a2be9307d58d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgaim/gaim-remote Sat Aug 19 01:50:10 2006 +0000 @@ -0,0 +1,212 @@ +#!/usr/bin/python + +import dbus +import re +import urllib +import sys + +import xml.dom.minidom + +xml.dom.minidom.Element.all = xml.dom.minidom.Element.getElementsByTagName + +obj = dbus.SessionBus().get_object("net.sf.gaim.GaimService", "/net/sf/gaim/GaimObject") +gaim = dbus.Interface(obj, "net.sf.gaim.GaimInterface") + +class CheckedObject: + def __init__(self, obj): + self.obj = obj + + def __getattr__(self, attr): + return CheckedAttribute(self, attr) + +class CheckedAttribute: + def __init__(self, cobj, attr): + self.cobj = cobj + self.attr = attr + + def __call__(self, *args): + result = self.cobj.obj.__getattr__(self.attr)(*args) + if result == 0: + raise "Error: " + self.attr + " " + str(args) + " returned " + str(result) + return result + +cgaim = CheckedObject(gaim) + +urlregexp = r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?" + +def extendlist(list, length, fill): + if len(list) < length: + return list + [fill] * (length - len(list)) + else: + return list + +def convert(value): + try: + return int(value) + except: + return value + +def findaccount(accountname, protocolname): + try: + # prefer connected accounts + account = cgaim.GaimAccountsFindConnected(accountname, protocolname) + return account + except: + # try to get any account and connect it + account = cgaim.GaimAccountsFindAny(accountname, protocolname) + gaim.GaimAccountSetStatusVargs(account, "online", 1) + gaim.GaimAccountConnect(account) + return account + + +def execute(uri): + match = re.match(urlregexp, uri) + protocol = match.group(2) + if protocol == "aim" or protocol == "icq": + protocol = "oscar" + if protocol is not None: + protocol = "prpl-" + protocol + command = match.group(5) + paramstring = match.group(7) + params = {} + if paramstring is not None: + for param in paramstring.split("&"): + key, value = extendlist(param.split("=",1), 2, "") + params[key] = urllib.unquote(value) + + accountname = params.get("account", "") + + if command == "goim": + account = findaccount(accountname, protocol) + conversation = cgaim.GaimConversationNew(1, account, params["screenname"]) + if "message" in params: + im = cgaim.GaimConversationGetImData(conversation) + gaim.GaimConvImSend(im, params["message"]) + return None + + elif command == "gochat": + account = findaccount(accountname, protocol) + connection = cgaim.GaimAccountGetConnection(account) + return gaim.ServJoinChat(connection, params) + + elif command == "addbuddy": + account = findaccount(accountname, protocol) + return cgaim.GaimBlistRequestAddBuddy(account, params["screenname"], + params.get("group", ""), "") + + elif command == "setstatus": + current = gaim.GaimSavedstatusGetCurrent() + + if "status" in params: + status_id = params["status"] + status_type = gaim.GaimPrimitiveGetTypeFromId(status_id) + else: + status_type = gaim.GaimSavedStatusGetType(current) + status_id = gaim.GaimPrimitiveGetIdFromType(status_type) + + if "message" in params: + message = params["message"]; + else: + message = gaim.GaimSavedstatusGetMessage(current) + + if "account" in params: + accounts = [cgaim.GaimAccountsFindAny(accountname, protocol)] + + for account in accounts: + status = gaim.GaimAccountGetStatus(account, status_id) + type = gaim.GaimStatusGetType(status) + gaim.GaimSavedstatusSetSubstatus(current, account, type, message) + gaim.GaimSavedstatusActivateForAccount(current, account) + else: + accounts = gaim.GaimAccountsGetAllActive() + saved = gaim.GaimSavedstatusNew("", status_type) + gaim.GaimSavedstatusSetMessage(saved, message) + gaim.GaimSavedstatusActivate(saved) + + return None + + elif command == "getinfo": + account = findaccount(accountname, protocol) + connection = cgaim.GaimAccountGetConnection(account) + return gaim.ServGetInfo(connection, params["screenname"]) + + elif command == "quit": + return gaim.GaimCoreQuit() + + elif command == "uri": + return None + + else: + match = re.match(r"(\w+)\s*\(([^)]*)\)", command) + if match is not None: + name = match.group(1) + argstr = match.group(2) + if argstr == "": + args = [] + else: + args = argstr.split(",") + fargs = [] + for arg in args: + fargs.append(convert(arg.strip())) + return gaim.__getattr__(name)(*fargs) + else: + # introspect the object to get parameter names and types + # this is slow because the entire introspection info must be downloaded + data = dbus.Interface(obj, "org.freedesktop.DBus.Introspectable").\ + Introspect() + introspect = xml.dom.minidom.parseString(data).documentElement + for method in introspect.all("method"): + if command == method.getAttribute("name"): + methodparams = [] + for arg in method.all("arg"): + if arg.getAttribute("direction") == "in": + value = params[arg.getAttribute("name")] + type = arg.getAttribute("type") + if type == "s": + methodparams.append(value) + elif type == "i": + methodparams.append(int(value)) + else: + raise "Don't know how to handle type \"%s\"" % type + return gaim.__getattr__(command)(*methodparams) + raise "Unknown command: %s" % command + + +if len(sys.argv) == 1: + print """This program uses DBus to communicate with gaim. + +Usage: + + %s "command1" "command2" ... + +Each command is of one of the three types: + + [protocol:]commandname?param1=value1¶m2=value2&... + FunctionName?param1=value1¶m2=value2&... + FunctionName(value1,value2,...) + +The second and third form are provided for completeness but their use +is not recommended; use gaim-send or gaim-send-async instead. The +second form uses introspection to find out the parameter names and +their types, therefore it is rather slow. + +Examples of commands: + + jabber:goim?screenname=testone@localhost&message=hi + jabber:gochat?room=TestRoom&server=conference.localhost + jabber:getinfo?screenname=testone@localhost + jabber:addbuddy?screenname=my friend + + setstatus?status=away&message=don't disturb + quit + + GaimAccountsFindConnected?name=&protocol=prpl-jabber + GaimAccountFindConnected(,prpl-jabber) +""" % sys.argv[0] + +for arg in sys.argv[1:]: + output = execute(arg) + + if (output != None): + print output +