diff libpurple/purple-url-handler @ 17226:5059a0a071a2

Restore the protocol specific URL handlers in purple-url-handler for those protocols that don't have their own uri-handler signal handler in libpurple yet. These can be phased out as protocols get their own uri-handler support, after reading other C uri parser implementations I didn't want to tackle that just yet.
author Stu Tomlinson <stu@nosnilmot.com>
date Fri, 25 May 2007 00:46:16 +0000
parents cc9242ce1435
children 8a7238fb7905
line wrap: on
line diff
--- a/libpurple/purple-url-handler	Thu May 24 20:27:10 2007 +0000
+++ b/libpurple/purple-url-handler	Fri May 25 00:46:16 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?"