# HG changeset patch # User Stu Tomlinson # Date 1180054152 0 # Node ID 9e8a488825a0df37d9ec05d12e9d2b68fb7cf9c3 # Parent 1c62deca5958a59ffe3c99389fe33233b2200a1d# Parent 5059a0a071a2cc4f7c110cfb83c721d28edc7a65 merge of '3a7f04e7907df7b5f5c519fa276ec6429d2ab9b5' and '5258efeb247f0af9bd9625bc58b63801f74e4519' diff -r 1c62deca5958 -r 9e8a488825a0 libpurple/purple-url-handler --- a/libpurple/purple-url-handler Thu May 24 23:37:34 2007 +0000 +++ b/libpurple/purple-url-handler Fri May 25 00:49:12 2007 +0000 @@ -38,6 +38,150 @@ cpurple = CheckedObject(purple) +def extendlist(list, length, fill): + if len(list) < length: + return list + [fill] * (length - len(list)) + else: + return list + +def findaccount(protocolname, accountname=""): + # prefer connected accounts + account = cpurple.PurpleAccountsFindConnected(accountname, protocolname) + if (account != 0): + return account + + # try to get any account and connect it + account = cpurple.PurpleAccountsFindAny(accountname, protocolname) + if (account == 0): + print "No matching account found." + sys.exit(1) + + purple.PurpleAccountSetStatusVargs(account, "online", 1) + purple.PurpleAccountConnect(account) + return account + +def goim(account, screenname, message=None): + # XXX: 1 == PURPLE_CONV_TYPE_IM + conversation = cpurple.PurpleConversationNew(1, account, screenname) + if message: + purple.PurpleConvSendConfirm(conversation, message) + +def gochat(account, params, message=None): + connection = cpurple.PurpleAccountGetConnection(account) + purple.ServJoinChat(connection, params) + + if message != None: + for i in range(20): + # XXX: 2 == PURPLE_CONV_TYPE_CHAT + conversation = purple.PurpleFindConversationWithAccount(2, params.get("channel", params.get("room")), account) + if conversation: + purple.PurpleConvSendConfirm(conversation, message) + break + else: + time.sleep(0.5) + +def addbuddy(account, screenname, group="", alias=""): + cpurple.PurpleBlistRequestAddBuddy(account, screenname, group, alias) + + +def gg(uri): + protocol = "prpl-gg" + match = re.match(r"^gg:(.*)", uri) + if not match: + print "Invalid gg URI: %s" % uri + return + + screenname = urllib.unquote_plus(match.group(1)) + account = findaccount(protocol) + goim(account, screenname) + +def irc(uri): + protocol = "prpl-irc" + match = re.match(r"^irc:(//([^/]*)/)?([^?]*)(\?(.*))?", uri) + if not match: + print "Invalid irc URI: %s" % uri + return + + server = urllib.unquote_plus(match.group(2)) or "" + target = match.group(3) or "" + query = match.group(5) or "" + + modifiers = {} + if target: + for modifier in target.split(",")[1:]: + modifiers[modifier] = True + + isnick = modifiers.has_key("isnick") + + paramstring = match.group(5) + params = {} + if paramstring: + for param in paramstring.split("&"): + key, value = extendlist(param.split("=", 1), 2, "") + params[key] = urllib.unquote_plus(value) + + account = findaccount(protocol) + + if (target != ""): + if (isnick): + goim(account, urllib.unquote_plus(target.split(",")[0]), params.get("msg")) + else: + channel = urllib.unquote_plus(target.split(",")[0]) + if channel[0] != "#": + channel = "#" + channel + gochat(account, {"server": server, "channel": channel, "password": params.get("key", "")}, params.get("msg")) + +def sip(uri): + protocol = "prpl-simple" + match = re.match(r"^sip:(.*)", uri) + if not match: + print "Invalid sip URI: %s" % uri + return + + screenname = urllib.unquote_plus(match.group(1)) + account = findaccount(protocol) + goim(account, screenname) + +def xmpp(uri): + protocol = "prpl-jabber" + match = re.match(r"^xmpp:(//([^/?#]*)/?)?([^?#]*)(\?([^;#]*)(;([^#]*))?)?(#(.*))?", uri) + if not match: + print "Invalid xmpp URI: %s" % uri + return + + tmp = match.group(2) + if (tmp): + accountname = urllib.unquote_plus(tmp) + else: + accountname = "" + + screenname = urllib.unquote_plus(match.group(3)) + + tmp = match.group(5) + if (tmp): + command = urllib.unquote_plus(tmp) + else: + command = "" + + paramstring = match.group(7) + params = {} + if paramstring: + for param in paramstring.split(";"): + key, value = extendlist(param.split("=", 1), 2, "") + params[key] = urllib.unquote_plus(value) + + account = findaccount(protocol, accountname) + + if command.lower() == "message": + goim(account, screenname, params.get("body")) + elif command.lower() == "join": + room, server = screenname.split("@") + gochat(account, {"room": room, "server": server}) + elif command.lower() == "roster": + addbuddy(account, screenname, params.get("group", ""), params.get("name", "")) + else: + goim(account, screenname) + def main(argv=sys.argv): if len(argv) != 2: print "Usage: %s URI" % argv[0] @@ -45,10 +189,19 @@ return uri = argv[1] + type = uri.split(":")[0] - print uri try: - cpurple.PurpleGotProtocolHandlerUri(uri) + if type == "gg": + gg(uri) + elif type == "irc": + irc(uri) + elif type == "sip": + sip(uri) + elif type == "xmpp": + xmpp(uri) + else: + cpurple.PurpleGotProtocolHandlerUri(uri) except dbus.dbus_bindings.DBusException: print "ERROR: Is there a libpurple-powered client (e.g. Pidgin or Finch) running?"