aboutsummaryrefslogtreecommitdiffstats
path: root/IRC
diff options
context:
space:
mode:
authorlassulus <lassulus@googlemail.com>2014-01-13 16:44:19 +0100
committerlassulus <lassulus@googlemail.com>2014-01-13 16:44:19 +0100
commite2ddedfb658eb808366442fabc3472cbae8ae1f7 (patch)
tree913674f32c4c364ea522e82f45a6b3c089fed69f /IRC
parentf8829c2c84ca67c5b0e496bb98ed2b3d8efbcbe8 (diff)
reaktor: refactor code for moar abstraction
Diffstat (limited to 'IRC')
-rwxr-xr-xIRC/index2
-rwxr-xr-xIRC/ircasy.py (renamed from IRC/asybot.py)107
-rw-r--r--IRC/reaktor.py72
3 files changed, 98 insertions, 83 deletions
diff --git a/IRC/index b/IRC/index
index 2dc803a..af557a8 100755
--- a/IRC/index
+++ b/IRC/index
@@ -3,4 +3,4 @@ set -xeuf
# cd //Reaktor
cd $(dirname $(readlink -f $0))/..
-exec IRC/asybot.py "$@"
+exec IRC/reaktor.py "$@"
diff --git a/IRC/asybot.py b/IRC/ircasy.py
index 8367b19..0a9465f 100755
--- a/IRC/asybot.py
+++ b/IRC/ircasy.py
@@ -2,50 +2,38 @@
#
# //Reaktor/IRC/asybot.py
#
-import os
-from translate_colors import translate_colors
-def is_executable(x):
- import os
- return os.path.exists(x) and os.access(x, os.X_OK)
-
from asynchat import async_chat as asychat
from asyncore import loop
from socket import AF_INET, SOCK_STREAM,gethostname
from signal import SIGALRM, signal, alarm
from datetime import datetime as date, timedelta
-import shlex
from time import sleep
from sys import exit
from re import split, search, match
from textwrap import TextWrapper
-import logging,logging.handlers
-import shlex
-
-config_filename = './config.py'
-from getconf import make_getconf
-getconf = make_getconf(config_filename)
+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.DEBUG if getconf('debug') else logging.INFO)
+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):
+ def __init__(self, server, port, channels, realname, nickname, username, hostname, ircname, hammer_interval, alarm_timeout, kill_timeout):
asychat.__init__(self)
- self.server = getconf('irc_server')
- self.port = getconf('irc_port')
- self.channels = getconf('irc_channels')
- self.realname = getconf('irc_nickname')
- self.nickname = getconf('irc_nickname')
- self.username = getconf('irc_nickname')
- self.hostname = getconf('irc_nickname')
- self.ircname = getconf('irc_nickname')
+ 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())
@@ -58,9 +46,9 @@ class asybot(asychat):
# When we don't receive data for alarm_timeout seconds then issue a
# PING every hammer_interval seconds until kill_timeout seconds have
# passed without a message. Any incoming message will reset alarm.
- self.alarm_timeout = getconf('irc_alarm_timeout')
- self.hammer_interval = getconf('irc_hammer_interval')
- self.kill_timeout = getconf('irc_kill_timeout')
+ self.alarm_timeout = alarm_timeout
+ self.hammer_interval = hammer_interval
+ self.kill_timeout = kill_timeout
signal(SIGALRM, lambda signum, frame: self.alarm_handler())
self.reset_alarm()
@@ -122,59 +110,14 @@ class asybot(asychat):
self.push('JOIN %s' % ','.join(self.channels))
def on_privmsg(self, prefix, command, params, rest):
- def PRIVMSG(text):
- for line in self.wrapper.wrap(text):
- msg = 'PRIVMSG %s :%s' % (','.join(params), line)
- log.info(msg)
- self.push(msg)
- sleep(1)
-
- def ME(text):
- PRIVMSG(('ACTION ' + text + ''))
-
- for command in getconf('commands'):
- y = match(command['pattern'], rest)
- if y:
- self.execute_command(command, y, prefix, PRIVMSG, ME)
- break
-
- def execute_command(self, command, match, prefix, PRIVMSG, ME):
- from os.path import realpath, dirname, join
- from subprocess import Popen as popen, PIPE
- from time import time
-
- #TODO: allow only commands below ./commands/
- exe = join(dirname(realpath(dirname(__file__))), command['argv'][0])
- myargv = [exe] + command['argv'][1:]
- if match.groupdict().get('args',None):
- myargv += shlex.split(match.groupdict()['args'])
-
- env = {}
- env['_from'] = prefix.split('!', 1)[0]
- env['config_filename'] = os.path.abspath(config_filename)
- start = time()
- try:
- p = popen(myargv, bufsize=1, stdout=PIPE, stderr=PIPE, env=env)
- except (OSError, Exception) as error:
- ME('brain damaged')
- log.error('OSError@%s: %s' % (myargv, error))
- return
- pid = p.pid
- for line in iter(p.stdout.readline, ''.encode()):
- try:
- PRIVMSG(translate_colors(line.decode()))
- except Exception as error:
- log.error('no send: %s' % error)
- log.debug('%s stdout: %s' % (pid, line))
- p.wait()
- elapsed = time() - start
- code = p.returncode
- log.info('command: %s -> %s in %d seconds' % (myargv, code, elapsed))
- [log.debug('%s stderr: %s' % (pid, x)) for x in p.stderr.readlines()]
-
- if code != 0:
- ME('mimimi')
-
-if __name__ == "__main__":
- asybot()
- loop()
+ pass
+
+ def PRIVMSG(self, target, text):
+ for line in self.wrapper.wrap(text):
+ msg = 'PRIVMSG %s :%s' % (','.join(target), line)
+ log.info(msg)
+ self.push(msg)
+ sleep(1)
+
+ def ME(self, target, text):
+ self.PRIVMSG(target, ('ACTION ' + text + ''))
diff --git a/IRC/reaktor.py b/IRC/reaktor.py
new file mode 100644
index 0000000..706d2c8
--- /dev/null
+++ b/IRC/reaktor.py
@@ -0,0 +1,72 @@
+import os
+from ircasy import asybot
+from asyncore import loop
+from translate_colors import translate_colors
+import shlex
+from re import split, search, match
+
+config_filename = './config.py'
+from getconf import make_getconf
+getconf = make_getconf(config_filename)
+
+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.DEBUG if getconf('debug') else logging.INFO)
+
+
+class Reaktor(asybot):
+ def __init__(self):
+ nick = getconf('irc_nickname')
+ asybot.__init__(self, getconf('irc_server'), getconf('irc_port'), getconf('irc_channels'), nick, nick, nick, nick, nick, getconf('irc_hammer_interval'), getconf('irc_alarm_timeout'), getconf('irc_kill_timeout'))
+
+ def on_privmsg(self, prefix, command, params, rest):
+ for command in getconf('commands'):
+ y = match(command['pattern'], rest)
+ if y:
+ self.execute_command(command, y, prefix, params)
+ break
+
+ def execute_command(self, command, match, prefix, target):
+ from os.path import realpath, dirname, join
+ from subprocess import Popen as popen, PIPE
+ from time import time
+
+ #TODO: allow only commands below ./commands/
+ exe = join(dirname(realpath(dirname(__file__))), command['argv'][0])
+ myargv = [exe] + command['argv'][1:]
+ if match.groupdict().get('args',None):
+ myargv += shlex.split(match.groupdict()['args'])
+
+ env = {}
+ env['_from'] = prefix.split('!', 1)[0]
+ env['config_filename'] = os.path.abspath(config_filename)
+ start = time()
+ try:
+ p = popen(myargv, bufsize=1, stdout=PIPE, stderr=PIPE, env=env)
+ except (OSError, Exception) as error:
+ self.ME(target, 'brain damaged')
+ log.error('OSError@%s: %s' % (myargv, error))
+ return
+ pid = p.pid
+ for line in iter(p.stdout.readline, ''.encode()):
+ try:
+ self.PRIVMSG(target, translate_colors(line.decode()))
+ except Exception as error:
+ log.error('no send: %s' % error)
+ log.debug('%s stdout: %s' % (pid, line))
+ p.wait()
+ elapsed = time() - start
+ code = p.returncode
+ log.info('command: %s -> %s in %d seconds' % (myargv, code, elapsed))
+ [log.debug('%s stderr: %s' % (pid, x)) for x in p.stderr.readlines()]
+
+ if code != 0:
+ self.ME(target, 'mimimi')
+
+if __name__ == "__main__":
+ Reaktor()
+ loop()