diff options
Diffstat (limited to 'IRC')
| -rw-r--r--[-rwxr-xr-x] | IRC/ircasy.py | 72 | 
1 files changed, 49 insertions, 23 deletions
| diff --git a/IRC/ircasy.py b/IRC/ircasy.py index 0a9465f..3d211ac 100755..100644 --- a/IRC/ircasy.py +++ b/IRC/ircasy.py @@ -13,27 +13,42 @@ from re import split, search, match  from textwrap import TextWrapper  import logging,logging.handlers -log = logging.getLogger('asybot') -hdlr = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON) -formatter = logging.Formatter( '%(filename)s: %(levelname)s: %(message)s') -hdlr.setFormatter(formatter) -log.addHandler(hdlr) -logging.basicConfig(level = logging.INFO)  # s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g -- removes color codes  class asybot(asychat): -  def __init__(self, server, port, channels, realname, nickname, username, hostname, ircname, hammer_interval, alarm_timeout, kill_timeout): +  def __init__(self, server, port, channels, nickname, realname=False, username=False, hostname=False, hammer_interval=10, alarm_timeout=300, kill_timeout=360):      asychat.__init__(self) +    #logger magic +    self.log = logging.getLogger('asybot') +    hdlr = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON) +    formatter = logging.Formatter( '%(filename)s: %(levelname)s: %(message)s') +    hdlr.setFormatter(formatter) +    self.log.addHandler(hdlr) +    logging.basicConfig(level = logging.DEBUG) + +    self.nickname = nickname + +    if realname: +      self.realname = realname +    else: +      self.realname = nickname + +    if username: +      self.username = username +    else: +      self.username = nickname + +    if hostname: +      self.hostname = hostname +    else: +      self.hostname = nickname + +    self.retry = False      self.server = server      self.port = port      self.channels = channels -    self.realname = realname -    self.nickname = nickname -    self.username = username -    self.hostname = hostname -    self.ircname = ircname      self.data = ''      self.myterminator = '\r\n'      self.set_terminator(self.myterminator.encode()) @@ -41,7 +56,7 @@ class asybot(asychat):      self.connect((self.server, self.port))      self.wrapper = TextWrapper(subsequent_indent=" ",width=400) -    log.info('=> irc://%s@%s:%s/%s' % (self.nickname, self.server, self.port, self.channels)) +    self.log.info('=> irc://%s@%s:%s/%s' % (self.nickname, self.server, self.port, self.channels))      # When we don't receive data for alarm_timeout seconds then issue a      # PING every hammer_interval seconds until kill_timeout seconds have @@ -52,7 +67,6 @@ class asybot(asychat):      signal(SIGALRM, lambda signum, frame: self.alarm_handler())      self.reset_alarm() -    def reset_alarm(self):      self.last_activity = date.now()      alarm(self.alarm_timeout) @@ -60,18 +74,18 @@ class asybot(asychat):    def alarm_handler(self):      delta = date.now() - self.last_activity      if delta > timedelta(seconds=self.kill_timeout): -      log.error('No data for %s.  Giving up...' % delta) -      exit(2) +      self.log.error('No data for %s.  Giving up...' % delta) +      self.handle_disconnect()      else: -      log.error('No data for %s.  PINGing server...' % delta) +      self.log.error('No data for %s.  PINGing server...' % delta)        self.push('PING :%s' % self.nickname)        alarm(self.hammer_interval)    def collect_incoming_data(self, data): -    self.data += data.decode(encoding='UTF-8') +    self.data += data.decode()    def found_terminator(self): -    log.debug('<< %s' % self.data) +    self.log.debug('<< %s' % self.data)      message = self.data      self.data = '' @@ -82,7 +96,7 @@ class asybot(asychat):      if command == 'PING':        self.push('PONG :%s' % rest) -      log.debug("Replying to servers PING with PONG :%s" %rest) +      self.log.debug("Replying to servers PING with PONG :%s" %rest)      elif command == 'PRIVMSG':        self.on_privmsg(prefix, command, params, rest) @@ -98,24 +112,36 @@ class asybot(asychat):      self.reset_alarm()    def push(self, message): -    log.debug('>> %s' % message) +    self.log.debug('>> %s' % message)      msg = (message + self.myterminator).encode() -    log.debug('>> %s' % msg) +    self.log.debug('>> %s' % msg)      asychat.push(self, msg) +  def reconnect(self): +    self.push('QUIT') +    self.close() +    self.create_socket(AF_INET, SOCK_STREAM) +    self.connect((self.server, self.port)) +    def handle_connect(self):      self.push('NICK %s' % self.nickname)      self.push('USER %s %s %s :%s' %          (self.username, self.hostname, self.server, self.realname))      self.push('JOIN %s' % ','.join(self.channels)) +  def handle_disconnect(self): +    if self.retry: +      self.reconnect() +    else: +      self.log.error('No retry set, giving up') +    def on_privmsg(self, prefix, command, params, rest):      pass    def PRIVMSG(self, target, text):      for line in self.wrapper.wrap(text):        msg = 'PRIVMSG %s :%s' % (','.join(target), line) -      log.info(msg) +      self.log.info(msg)        self.push(msg)        sleep(1) | 
