]> jfr.im git - erebus.git/blobdiff - bot.py
fix log rotation
[erebus.git] / bot.py
diff --git a/bot.py b/bot.py
index b65a5ae5ddf716d38bfc20fc871e0f476ef4142b..c753fe17860649e248d578bcab6f6a6a754aaefa 100644 (file)
--- a/bot.py
+++ b/bot.py
@@ -3,7 +3,8 @@
 # Erebus IRC bot - Author: John Runyon
 # "Bot" and "BotConnection" classes (handling a specific "arm")
 
-import socket, sys
+import socket, sys, time, threading
+from collections import deque
 
 #bots = {'erebus': bot.Bot(nick='Erebus', user='erebus', bind='', server='irc.quakenet.org', port=6667, realname='Erebus')}
 class Bot(object):
@@ -23,6 +24,11 @@ class Bot(object):
                        self.chans = [self.parent.newchannel(self, row['chname']) for row in chansres]
 
                self.conn = BotConnection(self, bind, server, port)
+
+               self.msgqueue = deque()
+               self.makemsgtimer()
+
+
        def connect(self):
                if self.conn.connect():
                        self.parent.newfd(self, self.conn.socket.fileno())
@@ -99,6 +105,10 @@ class Bot(object):
                                del self.parent.users[oldnick.lower()]
                        self.parent.users[newnick.lower()].nickchange(newnick)
 
+               elif pieces[0] == "ERROR": #TODO handle better
+                       sys.exit(2)
+                       os._exit(2)
+
                elif pieces[1] == "MODE": #TODO parse for ops/voices (at least)
                        pass
 
@@ -156,12 +166,32 @@ class Bot(object):
        def msg(self, target, msg):
                if target is None or msg is None: return
 
-               if isinstance(target, self.parent.User): self.conn.send("NOTICE %s :%s" % (target.nick, msg))
-               elif isinstance(target, self.parent.Channel): self.conn.send("PRIVMSG %s :%s" % (target.name, msg))
-               elif isinstance(target, basestring):
-                       if target[0] == '#': self.conn.send("PRIVMSG %s :%s" % (target, msg))
-                       else: self.conn.send("NOTICE %s :%s" % (target, msg))
-               else: raise TypeError('Bot.msg() "target" must be Erebus.User, Erebus.Channel, or string')
+               self.msgqueue.append((target,msg))
+               if not self.msgtimer.is_alive():
+                       self.msgtimer.start()
+
+       def fastmsg(self, target, msg):
+
+               if isinstance(target, self.parent.User): target = target.nick
+               elif isinstance(target, self.parent.Channel): target = target.name
+               elif not isinstance(target, basestring): raise TypeError('Bot.msg() "target" must be Erebus.User, Erebus.Channel, or string')
+
+               if target[0] == '#': command = "PRIVMSG %s :%s" % (target, msg)
+               else: command = "NOTICE %s :%s" % (target, msg)
+
+               self.conn.send(command)
+
+       def _popmsg(self):
+               self.makemsgtimer()
+
+               try:
+                       self.fastmsg(*self.msgqueue.popleft())
+                       self.msgtimer.start()
+               except IndexError: pass
+
+       def makemsgtimer(self):
+               self.msgtimer = threading.Timer(2, self._popmsg)
+               self.msgtimer.daemon = True
 
        def join(self, chan):
                self.conn.send("JOIN %s" % (chan))
@@ -205,7 +235,9 @@ class BotConnection(object):
 
        #TODO: rewrite send() to queue
        def send(self, line):
-               print self.parent.nick, '[O]', str(line)
+               print "%05.3f %s [O] %s" % (time.time() % 100000, self.parent.nick, line)
+               sys.stdout.flush()
+#              print (time.time() % 1466400000), self.parent.nick, '[O]', str(line)
                self._write(line)
 
        def _write(self, line):
@@ -217,7 +249,9 @@ class BotConnection(object):
 
                while "\r\n" in self.buffer:
                        pieces = self.buffer.split("\r\n", 1)
-                       print self.parent.nick, '[I]', pieces[0]
+                       print "%05.3f %s [I] %s" % (time.time() % 100000, self.parent.nick, pieces[0])
+                       sys.stdout.flush()
+#                      print (time.time() % 1460000000), self.parent.nick, '[I]', pieces[0]
                        lines.append(pieces[0])
                        self.buffer = pieces[1]