pvl.irker: implement --irc-username option; improve handling of register errors
authorTero Marttila <terom@paivola.fi>
Sat, 12 Jan 2013 23:22:23 +0200
changeset 110 af87b706e4a3
parent 109 8ec3cec95327
child 111 4b96c153c113
pvl.irker: implement --irc-username option; improve handling of register errors
pvl/irker/irc.py
pvl/irker/irker.py
--- a/pvl/irker/irc.py	Sat Jan 12 23:02:38 2013 +0200
+++ b/pvl/irker/irc.py	Sat Jan 12 23:22:23 2013 +0200
@@ -31,15 +31,6 @@
 
     return name.lower()
 
-def myusername ():
-    """
-        Return username current process is running under.
-    """
-
-    import getpass
-
-    return getpass.getuser()
-
 class IRCError (Exception) :
     """
         A handled protocol error.
@@ -246,8 +237,13 @@
     ## Quit
     def irc_ERROR (self, prefix, params) :
         msg, = params
+        error = IRCError(None, msg)
 
-        log.err(IRCError(None, msg))
+        log.err(error)
+
+        if self._registering :
+            self._registering.errback(error)
+            self._registering = None
 
     def connectionLost (self, reason) :
         irc.IRCClient.connectionLost(self, reason)
@@ -314,13 +310,7 @@
     def __init__ (self, nickname=NICKNAME, username=None) :
         # default nickname
         self.nickname = nickname
-
-        if username is True :
-            # system
-            self.username = myusername()
-
-        else :
-            self.username = username
+        self.username = username
 
         # (scheme, host, port, nick) -> IRCClient
         self.clients = {}
@@ -402,11 +392,17 @@
             yield self.clients[lookup]
         
         # connected client
-        client = self.clients[lookup]
+        client = self.clients.get(lookup)
 
-        log.msg('IRCFactory.client', url, ":", client)
+        if client :
+            log.msg('IRCFactory.client', url, ":", client)
 
-        defer.returnValue(client)
+            defer.returnValue(client)
+        else :
+            log.msg('IRCFactory.client', url, ": client connect failed")
+            
+            # XXX: get failure from first yield's errback... except inlineCallbacks drops it and goes to callback with None <_<
+            raise Exception("Client connect failed")
 
     @defer.inlineCallbacks
     def target (self, url) :
--- a/pvl/irker/irker.py	Sat Jan 12 23:02:38 2013 +0200
+++ b/pvl/irker/irker.py	Sat Jan 12 23:22:23 2013 +0200
@@ -13,9 +13,20 @@
 import pvl.irker.irk
 import pvl.irker.irc
 
+def myusername ():
+    """
+        Return username current process is running under.
+    """
+
+    import os, pwd
+
+    return pwd.getpwuid(os.getuid()).pw_name
+
+
 class Options (usage.Options) :
     optParameters = [
-            [ 'irc-nickname', 'n',  pvl.irker.irc.IRCFactory.NICKNAME, "Default IRC nickname" ],
+            [ 'irc-nickname', 'n',  pvl.irker.irc.IRCFactory.NICKNAME,  "Default IRC nickname"                  ],
+            [ 'irc-username', 'u',  myusername(),                       "IRC username (default: system user)"   ],
     ]
 
     def __init__ (self) :
@@ -103,7 +114,7 @@
     s = service.MultiService()
     
     # IRC
-    irc = pvl.irker.irc.IRCFactory(options['irc-nickname'], username=True) # use system username
+    irc = pvl.irker.irc.IRCFactory(options['irc-nickname'], options['irc-username']) 
  
     connect(irc, options.connect)
     target(irc, options.target, options.privmsg)
@@ -129,7 +140,7 @@
     log.startLogging(sys.stderr, setStdout=False)
 
     # connect
-    irc = pvl.irker.irc.IRCFactory(options['irc-nickname'], username=True) # use system username
+    irc = pvl.irker.irc.IRCFactory(options['irc-nickname'], options['irc-username'])
     
     connect(irc, options.connect)
     target(irc, options.target, options.privmsg)