diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f41c12e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.pyc +rtmbot.conf diff --git a/plugins/example/counter.py b/plugins/example/counter.py new file mode 100644 index 0000000..5846c94 --- /dev/null +++ b/plugins/example/counter.py @@ -0,0 +1,9 @@ +import time +crontable = [] +outputs = [] + +#crontable.append([.5,"add_number"]) +crontable.append([5,"say_time"]) + +def say_time(): + outputs.append(["D030GJLM2", time.time()]) diff --git a/plugins/example/repeat.py b/plugins/example/repeat.py new file mode 100644 index 0000000..9ad8307 --- /dev/null +++ b/plugins/example/repeat.py @@ -0,0 +1,9 @@ +import time +crontable = [] +outputs = [] + +def process_message(data): + print data + if data['channel'].startswith("D"): + outputs.append([data['channel'], "from repeat1: " + data['text']]) + diff --git a/plugins/example/repeat2.py b/plugins/example/repeat2.py new file mode 100644 index 0000000..1150493 --- /dev/null +++ b/plugins/example/repeat2.py @@ -0,0 +1,9 @@ +import time +crontable = [] +outputs = [] + +def process_message(data): + print data + if data['channel'].startswith("D"): + outputs.append([data['channel'], "from repeat2: " + data['text']]) + diff --git a/rtmbot.py b/rtmbot.py new file mode 100755 index 0000000..51e0112 --- /dev/null +++ b/rtmbot.py @@ -0,0 +1,109 @@ +#!/usr/bin/python + +import glob +import yaml +import json +import os +import sys +import time + +from slackclient import SlackClient + +class RtmBot(object): + def __init__(self, token): + self.token = token + self.bot_plugins = [] + self.slack_client = None + def connect(self): + """Convenience method that creates Server instance""" + self.slack_client = SlackClient(self.token) + self.slack_client.connect() + def start(self): + self.connect() + self.load_plugins() + while True: + for reply in self.slack_client.read(): + self.input(reply) + #print self.bot_plugins + self.crons() + self.output() + time.sleep(.1) + def input(self, data): + if "type" in data: + function_name = "process_" + data["type"] + for plugin in self.bot_plugins: + plugin.do(function_name, data) + def output(self): + for plugin in self.bot_plugins: + for output in plugin.do_output(): + channel = self.slack_client.server.channels.find(output[0]) + channel.send_message("%s" % output[1]) + #plugin.do_output() + pass + #print self.bot_plugins[plugin].replies() + def crons(self): + for plugin in self.bot_plugins: + plugin.do_jobs() + pass + #print job + def load_plugins(self): + path = os.path.dirname(sys.argv[0]) + sys.path.insert(0, path + "/plugins") + for plugin in glob.glob(path+'/plugins/*.py'): + name = plugin.split('/')[-1].rstrip('.py') +# try: + self.bot_plugins.append(Plugin(name)) +# except: +# print "error loading plugins" + +class Plugin(object): + def __init__(self, name): + self.name = name + self.jobs = [] + self.module = __import__(name) + self.register_jobs() + self.outputs = [] + def register_jobs(self): + if 'crontable' in dir(self.module): + for interval, function in self.module.crontable: + self.jobs.append(Job(interval, eval("self.module."+function))) + print self.module.crontable + def do(self, function_name, data): + if function_name in dir(self.module): + eval("self.module."+function_name)(data) + def do_jobs(self): + for job in self.jobs: + job.check() + def do_output(self): + output = [] + while True: + if 'outputs' in dir(self.module): + if len(self.module.outputs) > 0: + output.append(self.module.outputs.pop(0)) + else: + break + return output + +class Job(object): + def __init__(self, interval, function): + self.function = function + self.interval = interval + self.lastrun = 0 + def __str__(self): + return "%s %s %s" % (self.function, self.interval, self.lastrun) + def __repr__(self): + return self.__str__() + def check(self): + if self.lastrun + self.interval < time.time(): + self.function() + self.lastrun = time.time() + pass + + +if __name__ == "__main__": + proc = {k[8:]: v for k, v in globals().items() if k.startswith("process_")} + config = yaml.load(file('rtmbot.conf', 'r')) + + bot = RtmBot(config["SLACK_TOKEN"]) + bot.start() +