refactoring

matrix
Clemens Klug 2018-04-11 16:41:03 +02:00
parent bac8b398bb
commit 6f9da6f761
1 changed files with 37 additions and 15 deletions

52
bot.py
View File

@ -8,6 +8,10 @@ import logging
import requests import requests
import schedule import schedule
STATUS_URL = "https://isfswiaiopen.wiai.de?json"
MESSAGE_URL = "https://api.telegram.org/bot{token}/sendMessage"
IMAGE_URL = "https://api.telegram.org/bot{token}/sendPhoto"
logging.basicConfig(format='%(asctime)s %(levelname)s %(name)s:%(message)s', level=logging.DEBUG, datefmt="%Y.%m.%d %H:%M:%S") logging.basicConfig(format='%(asctime)s %(levelname)s %(name)s:%(message)s', level=logging.DEBUG, datefmt="%Y.%m.%d %H:%M:%S")
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -15,7 +19,7 @@ def parse_time(string):
return datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S") return datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")
def get_status(): def get_status():
status = requests.get("https://isfswiaiopen.wiai.de?json").json() status = requests.get(STATUS_URL).json()
status["timestamp"] = parse_time(status['timestamp']) status["timestamp"] = parse_time(status['timestamp'])
return status return status
@ -23,21 +27,31 @@ def get_status_text(config, src=get_status):
return config["texts"][str(get_status()["doorstate"])] return config["texts"][str(get_status()["doorstate"])]
def post(chats, text, token): def post(chats, text, token):
url = "https://api.telegram.org/bot{token}/sendMessage".format(token=token) url = MESSAGE_URL.format(token=token)
for chat in chats: for chat in chats:
response = requests.post(url, data={'chat_id': chats[chat], "text": text}) response = requests.post(url, data={'chat_id': chats[chat], "text": text})
log.info("post message: %s", response.status_code) log.info("post message: %s", response.status_code)
def has_argument(args, key):
return key in args and args[key]
def get_config(args):
config = json.load(open(args['config']))
if has_argument(args, "interval"):
log.info("Overwrite sleep value by argument…")
config["sleep"] = args["interval"]
return config
def main(args={"config": "settings.json"}): def main(args={"config": "settings.json"}):
log.info("run once") log.info("run once")
config = json.load(open(args['config'])) config = get_config(args)
text = get_status_text(config) text = get_status_text(config)
post(config['groups'], text, config['token']) post(config['groups'], text, config['token'])
post_plot(config) post_plot(config)
def loop(args={"config": "settings.json"}): def loop(args={"config": "settings.json"}):
log.info("prepare loop") log.info("prepare loop")
config = json.load(open(args['config'])) config = get_config(args)
setup(config) setup(config)
while True: while True:
try: try:
@ -50,25 +64,32 @@ def do_loop(config):
last_state = None last_state = None
while True: while True:
log.info("enter loop") log.info("enter loop")
changed = False changed = has_changed(last_state)
new_state = get_status()
if last_state is None:
changed = True
elif not last_state["doorstate"] == new_state["doorstate"]:
changed = True
if changed: if changed:
last_state = new_state last_state = update(new_state)
text = get_status_text(config, lambda: last_state)
post(config["groups"], text, config["token"])
log.info("run pending tasks") log.info("run pending tasks")
schedule.run_pending() schedule.run_pending()
log.info("sleep") log.info("sleep")
time.sleep(config['sleep']) time.sleep(config['sleep'])
def has_changed(last_state):
changed = False
new_state = get_status()
if last_state is None:
changed = True
elif not last_state["doorstate"] == new_state["doorstate"]:
changed = True
return changed
def update(state):
text = get_status_text(config, lambda: state)
post(config["groups"], text, config["token"])
return state
def post_plot(config): def post_plot(config):
from plot import get_plot from plot import get_plot
with NamedTemporaryFile() as target: with NamedTemporaryFile() as target:
image_url = 'https://api.telegram.org/bot{token}/sendPhoto'.format(token=config['token']) image_url = IMAGE_URL.format(token=config['token'])
photo, last = get_plot(target) photo, last = get_plot(target)
files = {'photo': photo} files = {'photo': photo}
if last + datetime.timedelta(days=1) < datetime.datetime.today(): if last + datetime.timedelta(days=1) < datetime.datetime.today():
@ -76,7 +97,7 @@ def post_plot(config):
return return
for chat in config['groups']: for chat in config['groups']:
files['photo'].seek(0) files['photo'].seek(0)
values = {"chat_id":config['groups'][chat]} values = {"chat_id": config['groups'][chat]}
r = requests.post(image_url, files=files, data=values) r = requests.post(image_url, files=files, data=values)
log.info("post photo: %s", r.status_code) log.info("post photo: %s", r.status_code)
@ -87,6 +108,7 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser(description="DoorStateBot") parser = argparse.ArgumentParser(description="DoorStateBot")
parser.add_argument("--config", "-c", default="settings.json", help="Configuration file") parser.add_argument("--config", "-c", default="settings.json", help="Configuration file")
parser.add_argument("--loop", "-l", action="store_true", help="Loop") parser.add_argument("--loop", "-l", action="store_true", help="Loop")
parser.add_argument("--interval", "-i", help="Interval")
args = parser.parse_args() args = parser.parse_args()
if args.loop: if args.loop:
loop(vars(args)) loop(vars(args))