#!/usr/bin/env python3
import requests
+import time
+from threading import Thread
from bs4 import BeautifulSoup
import datetime
from dataclasses import dataclass
import re
import googleCalendar
+from paho.mqtt import client as mqtt_client
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
TIMEEDIT_URLS = ["https://cloud.timeedit.net/liu/web/schema/ri167XQQ618Z50Qm07060gZ6y6Y7509Q6Y95Y2.html"]
+MQTT_BROKER = "localhost"
+MQTT_PORT = 1883
+MQTT_TOPIC = "timeedit/request"
+MQTT_AVAIL_TOPIC = "timeedit/available"
+MQTT_CLIENT_ID = "timeedit_request_sub"
+
+MQTT_COMMAND = "run"
+WORKING_THREAD = None
+
+# nohup ~/scripts/timeedit_mqtt_client/main.py > /dev/null 2>&1 &
+
@dataclass
class event:
return event
-def get_timeedit_events(session):
+def get_timeedit_events(session: list) -> list:
for schedule_URL in TIMEEDIT_URLS:
data = session.get(
schedule_URL,
return schedule
-def reset_gc_events(schedule):
+def reset_gc_events(schedule) -> None:
for c_event in googleCalendar.listEvents(
**{
"timeMin": "{0}T{1}{2}".format(
for n_event in schedule:
googleCalendar.createEvent(n_event.get_gc_event())
print(f"Created: {n_event}\n")
+
+def handle_request(client, userdata, msg) -> None:
+ print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic.")
+ global WORKING_THREAD
-if __name__ == "__main__":
+ if (msg.payload.decode() == MQTT_COMMAND):
+ if (WORKING_THREAD is None or not WORKING_THREAD.is_alive()):
+ WORKING_THREAD = Thread(target=threaded_handle)
+ WORKING_THREAD.start()
+ else:
+ print(f"Not finished with previous command!")
+ else:
+ print(f"Unknown command: {msg.payload.decode()}")
- with requests.session() as session:
+
+
+def on_connect(client, userdata, flags, rc):
+ if rc == 0:
+ print("Connected to MQTT Broker!")
+ else:
+ print("Failed to connect, return code %d", rc)
+
+ subscribe(client)
+
+def connect_mqtt() -> mqtt_client:
+
+ client = mqtt_client.Client(MQTT_CLIENT_ID)
+
+ client.will_set(MQTT_AVAIL_TOPIC, payload="dead", qos=0, retain=True)
+
+ client.on_connect = on_connect
+ client.connect_async(MQTT_BROKER, MQTT_PORT, keepalive=3600)
+
+ return client
+
+
+def subscribe(client) -> None:
+ client.subscribe(MQTT_TOPIC, qos=0)
+ client.on_message = handle_request
+
+
+def threaded_handle() -> None:
+ print("Working thread started!")
+
+ with requests.session() as session:
timeedit_schedule = get_timeedit_events(session)
reset_gc_events(timeedit_schedule)
+
+ print("Working thread finished!")
+
+if __name__ == "__main__":
+ client = connect_mqtt()
+ client.loop_start()
+
+ # Wait for thread to start before sending birth pub
+ time.sleep(1)
+ client.publish(MQTT_AVAIL_TOPIC, payload="alive", qos=0, retain=True)
+
+ while(1):
+ time.sleep(1)
\ No newline at end of file