]> jfr.im git - erebus.git/commitdiff
less crashing, more debugging.
authorzonidjan <redacted>
Mon, 26 Sep 2016 09:31:01 +0000 (04:31 -0500)
committerzonidjan <redacted>
Mon, 26 Sep 2016 09:31:01 +0000 (04:31 -0500)
bot.py
ctlmod.py
erebus.py

diff --git a/bot.py b/bot.py
index 2c4d82cc4acfb7e3b9f056a653db95148f6b6c5f..d9ab69bbd7e2398fe37f2faed76e6751c5875952 100644 (file)
--- a/bot.py
+++ b/bot.py
@@ -114,6 +114,13 @@ class Bot(object):
                        pass
 
 
+       def __debug_cbexception(self, *args):
+               if int(self.parent.cfg.get('debug', 'cbexc', default=0)) == 1:
+                       self.conn.send("PRIVMSG DimeCadmium :%09.3f ^C4^B!!!^B^C CBEXC" % (time.time() % 100000))
+                       print "%09.3f %s [!] CBEXC %r" % (time.time() % 100000, self.nick, args)
+                       __import__('traceback').print_exc()
+
+
        def parsemsg(self, user, target, msg):
                chan = None
                if len(msg) == 0:
@@ -146,9 +153,12 @@ class Bot(object):
                                elif not triggerused:
                                        if self.parent.haschanhook(target.lower()):
                                                for callback in self.parent.getchanhook(target.lower()):
-                                                       cbret = callback(self, user, chan, *pieces)
-                                                       if cbret is NotImplemented:
-                                                               self.msg(user, "Command not implemented.")
+                                                       try:
+                                                               cbret = callback(self, user, chan, *pieces)
+                                                               if cbret is NotImplemented: self.msg(user, "Command not implemented.")
+                                                       except Exception:
+                                                               self.msg(user, "Command failed. Code: CBEXC%09.3f" % (time.time() % 100000))
+                                                               self.__debug_cbexception("chanhook", user, target, msg)
                                        return # not to bot, don't process!
                        except IndexError:
                                return # "message" is empty
@@ -160,27 +170,41 @@ class Bot(object):
                                if chan is None and callback.needchan:
                                        self.msg(user, "You need to specify a channel for that command.")
                                elif user.glevel >= callback.reqglevel and (not callback.needchan or chan.levelof(user.auth) >= callback.reqclevel):
-                                       cbret = callback(self, user, chan, target, *pieces[1:])
-                                       if cbret is NotImplemented:
-                                               self.msg(user, "Command not implemented.")
+                                       try:
+                                               cbret = callback(self, user, chan, target, *pieces[1:])
+                                               if cbret is NotImplemented: self.msg(user, "Command not implemented.")
+                                       except Exception:
+                                               self.msg(user, "Command failed. Code: CBEXC%09.3f" % (time.time() % 100000))
+                                               self.__debug_cbexception("hook", user, target, msg)
+
+       def __debug_nomsg(self, target, msg):
+               if int(self.parent.cfg.get('debug', 'nomsg', default=0)) == 1:
+                       self.conn.send("PRIVMSG DimeCadmium :%09.3f \ 34\ 2!!!\ 2\ 3 NOMSG %r, %r" % (time.time() % 100000, target, msg))
+                       print "%09.3f %s [!] %s" % (time.time() % 100000, self.nick, "!!! NOMSG")
+                       __import__('traceback').print_stack()
 
        def msg(self, target, msg):
-               if target is None or msg is None: return False
+               if target is None or msg is None:
+                       return self.__debug_nomsg(target, msg)
 
                self.msgqueue.append((target, msg))
                if not self.msgtimer.is_alive():
                        self.msgtimer.start()
-               return True
+               return
 
        def slowmsg(self, target, msg):
-               if target is None or msg is None: return False
+               if target is None or msg is None:
+                       return self.__debug_nomsg(target, msg)
 
                self.slowmsgqueue.append((target,msg))
                if not self.msgtimer.is_alive():
                        self.msgtimer.start()
-               return True
+               return
 
        def fastmsg(self, target, msg):
+               if target is None or msg is None:
+                       return __debug_nomsg(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')
@@ -247,11 +271,8 @@ class BotConnection(object):
                if done: self.state = 2
                return self.state == 2
 
-       #TODO: rewrite send() to queue
        def send(self, 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)
+               print "%09.3f %s [O] %s" % (time.time() % 100000, self.parent.nick, line)
                self._write(line)
 
        def _write(self, line):
@@ -263,8 +284,7 @@ class BotConnection(object):
 
                while "\r\n" in self.buffer:
                        pieces = self.buffer.split("\r\n", 1)
-                       print "%05.3f %s [I] %s" % (time.time() % 100000, self.parent.nick, pieces[0])
-                       sys.stdout.flush()
+                       print "%09.3f %s [I] %s" % (time.time() % 100000, self.parent.nick, pieces[0])
 #                      print (time.time() % 1460000000), self.parent.nick, '[I]', pieces[0]
                        lines.append(pieces[0])
                        self.buffer = pieces[1]
index ab9145a249baf0b501e2bc6c4cd93eb6f298c9ef..402fdc884eda6e720cb5ba730b12d7f3d5ca4578 100644 (file)
--- a/ctlmod.py
+++ b/ctlmod.py
@@ -15,7 +15,7 @@ def load(parent, modname, dependent=False):
        if dependent:
                print "Loading dependency %s..." % (modname),
        else:
-               print "%05.3f [MOD] [#] Loading %s... " % (time.time() % 100000, modname),
+               print "%09.3f [MOD] [#] Loading %s... " % (time.time() % 100000, modname),
        modstatus = _load(parent, modname, dependent)
        if not modstatus:
                print str(modstatus)
index 4cd536de93b6a2b0e6b34a4e5fa0ef0492d59d77..7386df2bea82efd5644e93a773830f8210a0e29b 100644 (file)
--- a/erebus.py
+++ b/erebus.py
@@ -59,7 +59,9 @@ class Erebus(object):
                def join(self, chan):
                        self.chans.append(chan)
                def part(self, chan):
-                       self.chans.remove(chan)
+                       try:
+                               self.chans.remove(chan)
+                       except: pass
                def quit(self):
                        for chan in self.chans:
                                self.chans.remove(chan)
@@ -163,11 +165,11 @@ class Erebus(object):
        def randbot(self): #get Bot() randomly
                return self.bots[random.choice(self.bots.keys())]
 
-       def user(self, _nick, justjoined=False):
+       def user(self, _nick, justjoined=False, create=True):
                nick = _nick.lower()
                if nick in self.users:
                        return self.users[nick]
-               else:
+               elif create:
                        user = self.User(_nick)
                        self.users[nick] = user
 
@@ -175,6 +177,8 @@ class Erebus(object):
                                self.randbot().conn.send("WHO %s n%%ant,2" % (nick))
 
                        return user
+               else:
+                       return None
        def channel(self, name): #get Channel() by name
                if name.lower() in self.chans:
                        return self.chans[name.lower()]
@@ -243,11 +247,11 @@ class Erebus(object):
 
 class MyCursor(MySQLdb.cursors.DictCursor):
        def execute(self, *args, **kwargs):
-               print "%05.3f [SQL] [#] MyCursor.execute(self, %s, %s)" % (time.time() % 100000, ', '.join([repr(i) for i in args]), ', '.join([str(key)+"="+repr(kwargs[key]) for key in kwargs]))
+               print "%09.3f [SQL] [#] MyCursor.execute(self, %s, %s)" % (time.time() % 100000, ', '.join([repr(i) for i in args]), ', '.join([str(key)+"="+repr(kwargs[key]) for key in kwargs]))
                try:
                        super(self.__class__, self).execute(*args, **kwargs)
                except MySQLdb.MySQLError as e:
-                       print "%05.3f [SQL] [!] MySQL error! %r" % (time.time() % 100000, e)
+                       print "%09.3f [SQL] [!] MySQL error! %r" % (time.time() % 100000, e)
                        dbsetup()
                        return False
                return True
@@ -290,7 +294,7 @@ def loop():
 if __name__ == '__main__':
        try: os.rename('logfile', 'oldlogs/%s' % (time.time()))
        except: pass
-       sys.stdout = open('logfile', 'w')
+       sys.stdout = open('logfile', 'w', 1)
        sys.stderr = sys.stdout
        setup()
        while True: loop()