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 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")
log = logging.getLogger(__name__)
@ -15,7 +19,7 @@ def parse_time(string):
return datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")
def get_status():
status = requests.get("https://isfswiaiopen.wiai.de?json").json()
status = requests.get(STATUS_URL).json()
status["timestamp"] = parse_time(status['timestamp'])
return status
@ -23,21 +27,31 @@ def get_status_text(config, src=get_status):
return config["texts"][str(get_status()["doorstate"])]
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:
response = requests.post(url, data={'chat_id': chats[chat], "text": text})
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"}):
log.info("run once")
config = json.load(open(args['config']))
config = get_config(args)
text = get_status_text(config)
post(config['groups'], text, config['token'])
post_plot(config)
def loop(args={"config": "settings.json"}):
log.info("prepare loop")
config = json.load(open(args['config']))
config = get_config(args)
setup(config)
while True:
try:
@ -50,25 +64,32 @@ def do_loop(config):
last_state = None
while True:
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
new_state = get_status()
if last_state is None:
changed = True
elif not last_state["doorstate"] == new_state["doorstate"]:
changed = True
if changed:
last_state = new_state
text = get_status_text(config, lambda: last_state)
return changed
def update(state):
text = get_status_text(config, lambda: state)
post(config["groups"], text, config["token"])
log.info("run pending tasks")
schedule.run_pending()
log.info("sleep")
time.sleep(config['sleep'])
return state
def post_plot(config):
from plot import get_plot
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)
files = {'photo': photo}
if last + datetime.timedelta(days=1) < datetime.datetime.today():
@ -87,6 +108,7 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser(description="DoorStateBot")
parser.add_argument("--config", "-c", default="settings.json", help="Configuration file")
parser.add_argument("--loop", "-l", action="store_true", help="Loop")
parser.add_argument("--interval", "-i", help="Interval")
args = parser.parse_args()
if args.loop:
loop(vars(args))