from __future__ import print_function
-import os, sys, select, MySQLdb, MySQLdb.cursors, time, random, gc
+import os, sys, select, MySQLdb, MySQLdb.cursors, time, traceback, random, gc
import bot, config, ctlmod
class Erebus(object): #singleton to pass around
self.chans = []
+ def bind_bot(self, bot):
+ return main._BoundUser(self, bot)
+
def msg(self, *args, **kwargs):
main.randbot().msg(self, *args, **kwargs)
def slowmsg(self, *args, **kwargs):
def __str__(self): return self.nick
def __repr__(self): return "<User %r (%d)>" % (self.nick, self.glevel)
+ class _BoundUser(object):
+ def __init__(self, user, bot):
+ self.__dict__['_bound_user'] = user
+ self.__dict__['_bound_bot'] = bot
+ def __getattr__(self, name):
+ return getattr(self._bound_user, name)
+ def __setattr__(self, name, value):
+ setattr(self._bound_user, name, value)
+ def msg(self, *args, **kwargs):
+ self._bound_bot.msg(self._bound_user, *args, **kwargs)
+ def slowmsg(self, *args, **kwargs):
+ self._bound_bot.slowmsg(self._bound_user, *args, **kwargs)
+ def fastmsg(self, *args, **kwargs):
+ self._bound_bot.fastmsg(self._bound_user, *args, **kwargs)
+ def __repr__(self): return "<_BoundUser %r %r>" % (self._bound_user, self._bound_bot)
+
class Channel(object):
def __init__(self, name, bot):
self.name = name
return curs
else:
return res
+ except MySQLdb.DataError as e:
+ self.log("[SQL]", ".", "MySQL DataError: %r" % (e))
+ return False
except MySQLdb.MySQLError as e:
self.log("[SQL]", "!", "MySQL error! %r" % (e))
if not noretry:
self.po.register(fileno, select.POLLIN)
elif self.potype == "select":
self.fdlist.append(fileno)
+ def delfd(self, fileno):
+ del self.fds[fileno]
+ if self.potype == "poll":
+ self.po.unregister(fileno)
+ elif self.potype == "select":
+ self.fdlist.remove(fileno)
def bot(self, name): #get Bot() by name (nick)
return self.bots[name.lower()]
def randbot(self): #get Bot() randomly
return self.bots[random.choice(list(self.bots.keys()))]
- def user(self, _nick, justjoined=False, create=True):
+ def user(self, _nick, send_who=False, create=True):
nick = _nick.lower()
+
+ if send_who and (nick not in self.users or not self.users[nick].isauthed()):
+ self.randbot().conn.send("WHO %s n%%ant,1" % (nick))
+
if nick in self.users:
return self.users[nick]
elif create:
user = self.User(_nick)
self.users[nick] = user
-
- if justjoined:
- self.randbot().conn.send("WHO %s n%%ant,1" % (nick))
-
return user
else:
return None
def loop():
poready = main.poll()
for fileno in poready:
- for line in main.fd(fileno).getdata():
- main.fd(fileno).parse(line)
+ try:
+ data = main.fd(fileno).getdata()
+ except:
+ main.log('*', '!', 'Super-mega-emergency: getdata raised exception for socket %d' % (fileno))
+ traceback.print_exc()
+ data = None
+ if data is None:
+ main.fd(fileno).close()
+ else:
+ for line in data:
+ if cfg.getboolean('debug', 'io'):
+ main.log(str(main.fd(fileno)), 'I', line)
+ try:
+ main.fd(fileno).parse(line)
+ except:
+ main.log('*', '!', 'Super-mega-emergency: parse raised exception for socket %d data %r' % (fileno, line))
+ traceback.print_exc()
if main.mustquit is not None:
main.log('*', '!', 'Core exiting due to: %s' % (main.mustquit))
raise main.mustquit