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

46
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 = has_changed(last_state)
if changed:
last_state = update(new_state)
log.info("run pending tasks")
schedule.run_pending()
log.info("sleep")
time.sleep(config['sleep'])
def has_changed(last_state):
changed = False changed = False
new_state = get_status() new_state = get_status()
if last_state is None: if last_state is None:
changed = True changed = True
elif not last_state["doorstate"] == new_state["doorstate"]: elif not last_state["doorstate"] == new_state["doorstate"]:
changed = True changed = True
if changed: return changed
last_state = new_state
text = get_status_text(config, lambda: last_state) def update(state):
text = get_status_text(config, lambda: state)
post(config["groups"], text, config["token"]) post(config["groups"], text, config["token"])
log.info("run pending tasks") return state
schedule.run_pending()
log.info("sleep")
time.sleep(config['sleep'])
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():
@ -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))