running pycharm code instpector and pycharm reformat code

This commit is contained in:
Quentin Nerden 2015-08-10 12:00:00 +02:00 committed by Jeff Ammons
parent 4441a56011
commit 05ca843d31

View file

@ -1,11 +1,11 @@
#!/usr/bin/env python #!/usr/bin/env python
import sys import sys
sys.dont_write_bytecode = True sys.dont_write_bytecode = True
import glob import glob
import yaml import yaml
import json
import os import os
import sys import sys
import time import time
@ -14,20 +14,24 @@ from argparse import ArgumentParser
from slackclient import SlackClient from slackclient import SlackClient
def dbg(debug_string): def dbg(debug_string):
if debug: if debug:
logging.info(debug_string) logging.info(debug_string)
class RtmBot(object): class RtmBot(object):
def __init__(self, token): def __init__(self, token):
self.last_ping = 0 self.last_ping = 0
self.token = token self.token = token
self.bot_plugins = [] self.bot_plugins = []
self.slack_client = None self.slack_client = None
def connect(self): def connect(self):
"""Convenience method that creates Server instance""" """Convenience method that creates Server instance"""
self.slack_client = SlackClient(self.token) self.slack_client = SlackClient(self.token)
self.slack_client.rtm_connect() self.slack_client.rtm_connect()
def start(self): def start(self):
self.connect() self.connect()
self.load_plugins() self.load_plugins()
@ -38,12 +42,14 @@ class RtmBot(object):
self.output() self.output()
self.autoping() self.autoping()
time.sleep(.1) time.sleep(.1)
def autoping(self): def autoping(self):
#hardcode the interval to 3 seconds # hardcode the interval to 3 seconds
now = int(time.time()) now = int(time.time())
if now > self.last_ping + 3: if now > self.last_ping + 3:
self.slack_client.server.ping() self.slack_client.server.ping()
self.last_ping = now self.last_ping = now
def input(self, data): def input(self, data):
if "type" in data: if "type" in data:
function_name = "process_" + data["type"] function_name = "process_" + data["type"]
@ -51,35 +57,39 @@ class RtmBot(object):
for plugin in self.bot_plugins: for plugin in self.bot_plugins:
plugin.register_jobs() plugin.register_jobs()
plugin.do(function_name, data) plugin.do(function_name, data)
def output(self): def output(self):
for plugin in self.bot_plugins: for plugin in self.bot_plugins:
limiter = False limiter = False
for output in plugin.do_output(): for output in plugin.do_output():
channel = self.slack_client.server.channels.find(output[0]) channel = self.slack_client.server.channels.find(output[0])
if channel != None and output[1] != None: if channel is not None and output[1] is not None:
if limiter == True: if limiter:
time.sleep(.1) time.sleep(.1)
limiter = False limiter = True # TODO: check goal: no sleep for 1st channel, sleep of all after ?
message = output[1].encode('ascii','ignore') # TODO: find out how to safely encode stuff if needed :(
channel.send_message("{}".format(message)) # message = output[1].encode('utf-8','ignore')
limiter = True channel.send_message(output[1]) # message
def crons(self): def crons(self):
for plugin in self.bot_plugins: for plugin in self.bot_plugins:
plugin.do_jobs() plugin.do_jobs()
def load_plugins(self): def load_plugins(self):
for plugin in glob.glob(directory+'/plugins/*'): for plugin in glob.glob(directory + '/plugins/*'):
sys.path.insert(0, plugin) sys.path.insert(0, plugin)
sys.path.insert(0, directory+'/plugins/') sys.path.insert(0, directory + '/plugins/')
for plugin in glob.glob(directory+'/plugins/*.py') + glob.glob(directory+'/plugins/*/*.py'): for plugin in glob.glob(directory + '/plugins/*.py') + glob.glob(directory + '/plugins/*/*.py'):
logging.info(plugin) logging.info(plugin)
name = plugin.split('/')[-1][:-3] name = plugin.split('/')[-1][:-3]
# try: # try:
self.bot_plugins.append(Plugin(name)) self.bot_plugins.append(Plugin(name))
# except: # except:
# print "error loading plugin %s" % name # print "error loading plugin %s" % name
class Plugin(object): class Plugin(object):
def __init__(self, name, plugin_config={}): def __init__(self, name):
self.name = name self.name = name
self.jobs = [] self.jobs = []
self.module = __import__(name) self.module = __import__(name)
@ -90,32 +100,36 @@ class Plugin(object):
self.module.config = config[name] self.module.config = config[name]
if 'setup' in dir(self.module): if 'setup' in dir(self.module):
self.module.setup() self.module.setup()
def register_jobs(self): def register_jobs(self):
if 'crontable' in dir(self.module): if 'crontable' in dir(self.module):
for interval, function in self.module.crontable: for interval, function in self.module.crontable:
self.jobs.append(Job(interval, eval("self.module."+function))) self.jobs.append(Job(interval, eval("self.module." + function)))
logging.info(self.module.crontable) logging.info(self.module.crontable)
self.module.crontable = [] self.module.crontable = []
else: else:
self.module.crontable = [] self.module.crontable = []
def do(self, function_name, data): def do(self, function_name, data):
if function_name in dir(self.module): if function_name in dir(self.module):
#this makes the plugin fail with stack trace in debug mode # this makes the plugin fail with stack trace in debug mode
if not debug: if not debug:
try: try:
eval("self.module."+function_name)(data) eval("self.module." + function_name)(data, bot, config)
except: except:
dbg("problem in module {} {}".format(function_name, data)) dbg("problem in module {} {}".format(function_name, data))
else: else:
eval("self.module."+function_name)(data) eval("self.module." + function_name)(data, bot, config)
if "catch_all" in dir(self.module): if "catch_all" in dir(self.module):
try: try:
self.module.catch_all(data) self.module.catch_all(data)
except: except:
dbg("problem in catch all") dbg("problem in catch all")
def do_jobs(self): def do_jobs(self):
for job in self.jobs: for job in self.jobs:
job.check() job.check()
def do_output(self): def do_output(self):
output = [] output = []
while True: while True:
@ -129,15 +143,19 @@ class Plugin(object):
self.module.outputs = [] self.module.outputs = []
return output return output
class Job(object): class Job(object):
def __init__(self, interval, function): def __init__(self, interval, function):
self.function = function self.function = function
self.interval = interval self.interval = interval
self.lastrun = 0 self.lastrun = 0
def __str__(self): def __str__(self):
return "{} {} {}".format(self.function, self.interval, self.lastrun) return "{} {} {}".format(self.function, self.interval, self.lastrun)
def __repr__(self): def __repr__(self):
return self.__str__() return self.__str__()
def check(self): def check(self):
if self.lastrun + self.interval < time.time(): if self.lastrun + self.interval < time.time():
if not debug: if not debug:
@ -150,6 +168,7 @@ class Job(object):
self.lastrun = time.time() self.lastrun = time.time()
pass pass
class UnknownChannel(Exception): class UnknownChannel(Exception):
pass pass
@ -182,8 +201,8 @@ if __name__ == "__main__":
directory = os.path.dirname(sys.argv[0]) directory = os.path.dirname(sys.argv[0])
if not directory.startswith('/'): if not directory.startswith('/'):
directory = os.path.abspath("{}/{}".format(os.getcwd(), directory = os.path.abspath("{}/{}".format(os.getcwd(),
directory directory
)) ))
config = yaml.load(file(args.config or 'rtmbot.conf', 'r')) config = yaml.load(file(args.config or 'rtmbot.conf', 'r'))
debug = config["DEBUG"] debug = config["DEBUG"]
@ -195,7 +214,7 @@ if __name__ == "__main__":
if config.has_key("DAEMON"): if config.has_key("DAEMON"):
if config["DAEMON"]: if config["DAEMON"]:
import daemon import daemon
with daemon.DaemonContext(): with daemon.DaemonContext():
main_loop() main_loop()
main_loop() main_loop()