From 608a2c95d2081ebf8f5afd80d0de6a5eb3514119 Mon Sep 17 00:00:00 2001 From: Bart Koolen Date: Fri, 28 Feb 2025 15:30:21 +0100 Subject: [PATCH] Added saperate sending and receiving Je kan nu de server check muten. en ik heb een framework gemaakt voor het versturen naar verschilende personen. --- .../.~lock.Glucosemeter Project Logboek.docx# | 1 + docs/Glucosemeter Project Logboek.docx | Bin 34359 -> 34787 bytes src/GlucoseCheck.py | 5 +- src/ServerCheck.py | 50 +++++++++++++++--- src/TeleBot.py | 42 +++++++++------ 5 files changed, 75 insertions(+), 23 deletions(-) create mode 100644 docs/.~lock.Glucosemeter Project Logboek.docx# diff --git a/docs/.~lock.Glucosemeter Project Logboek.docx# b/docs/.~lock.Glucosemeter Project Logboek.docx# new file mode 100644 index 0000000..0367120 --- /dev/null +++ b/docs/.~lock.Glucosemeter Project Logboek.docx# @@ -0,0 +1 @@ +,bart,bart-T420,28.02.2025 12:04,file:///home/bart/.config/libreoffice/4; \ No newline at end of file diff --git a/docs/Glucosemeter Project Logboek.docx b/docs/Glucosemeter Project Logboek.docx index 75ee91e55813b96fa94cf7386c6d5964e1fc856c..d0bd1e9fb9de141e74d6e9a7d732102f45bc67b6 100644 GIT binary patch delta 15147 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 diff --git a/src/GlucoseCheck.py b/src/GlucoseCheck.py index e19c6da..c3c8024 100644 --- a/src/GlucoseCheck.py +++ b/src/GlucoseCheck.py @@ -7,8 +7,8 @@ from collections import deque ##### Mqtt vars ##### broker_address = "192.168.1.250" broker_port = 1883 -recieve_topic = "telegrambot/in" -send_topic = "telegrambot/out" +recieve_topic = "telegrambot/in/glucose/gj" +send_topic = "telegrambot/out/gj" brokercreds = ["hass","Bruk#5"] ##### Variables ##### @@ -145,5 +145,6 @@ Mqtt.connect(broker_address, broker_port, 60) #Set Connection Mqtt.loop_start() #Start connecting +Mqtt.publish(send_topic, "Started Glucose Checker :-)") if __name__ == "__main__": main(url, headers) diff --git a/src/ServerCheck.py b/src/ServerCheck.py index b39c814..105020c 100644 --- a/src/ServerCheck.py +++ b/src/ServerCheck.py @@ -8,22 +8,34 @@ from time import sleep ##### Mqtt vars ##### broker_address = "192.168.1.250" broker_port = 1883 -recieve_topic = "telegrambot/in" -send_topic = "telegrambot/out" +recieve_topic = "telegrambot/in/server/#" +send_topic = "telegrambot/out/" brokercreds = ["hass","Bruk#5"] ####################### # Setup For Variables # ####################### +class User: # Custom classes for my dictionaries + def __init__(self, name, lastName, userID, mute): + self.name = name + self.lastName = lastName + self.userID = userID + self.mute = mute +User = { + "7570193598": User(name="Bart", lastName="Koolen", userID="7570193598", mute=0), + "7909366331": User(name="GJ", lastName="Koolen", userID="7909366331", mute=0),} + +mute_time = 86400 #This is in seconds, it defines how long the program /mute command lasts +interval_offline_message = 300 class Site: #Custom classes for my dictionaries def __init__(self, url, typeVar): self.url = url self.typeVar = typeVar webServers = {"Google" : Site(url="https://google.com", typeVar="URL"), #List with all the servers urls and names and types - "GameServer" : Site(url="http://192.168.0.251", typeVar="URL"), + "GameServer" : Site(url="http://192.168.1.251", typeVar="URL"), "SpiritBody" : Site(url="https://spiritbodyhealing.org", typeVar="URL"), "HeresYourSign": Site(url="https://heresyoursign.nl", typeVar="URL"), #"SMB_server": Site(url="192.168.1.250", typeVar="SMB"), @@ -130,8 +142,24 @@ def on_connect(client, userdata, flags, reason_code, properties): #This runs o def on_message(client, userdata, msg): #This runs everytime a mqtt message is recieved checkWebServer(webServers) #Update list of websites status messageStatus = statusCheck(True) #True returns every server and state - print(messageStatus) - Mqtt.publish(send_topic, messageStatus) + user_topic = msg.topic.split("/")[-1] + args = msg.payload.decode() + print(user_topic) + keys = list(User.keys()) + if not args: + return + elif args[0] == "m": + for i in keys: + if User[i].name.lower() == user_topic: + print(f"right: {user_topic}: {i}") + if User[i].mute > 0: + User[keys[0]].mute = 0 + User[keys[1]].mute = 0 + else: + User[i].mute = mute_time//interval_offline_message #This is defined in the setup variables + elif args[0] == "s": + print("s") + Mqtt.publish(send_topic + user_topic , messageStatus) Mqtt = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) #Creates a mqqt object Mqtt.on_connect = on_connect #Create callback on connect @@ -143,11 +171,21 @@ Mqtt.connect(broker_address, broker_port, 60) #Set Connectio Mqtt.loop_start() #Start connecting def main(): #This is the main loop + keys = list(User.keys()) while True: checkWebServer(webServers) #Update list of websites status messageStatus = statusCheck(False) #False is only on state change - Mqtt.publish(send_topic, messageStatus) + if User[keys[0]].mute == 0 | User[keys[1]].mute == 0: + Mqtt.publish(send_topic + "broadcast", messageStatus) sleep(30) + if User[keys[0]].mute > 0: + User[keys[0]].mute = User[keys[0]].mute - 1 + + if User[keys[1]].mute > 0: + User[keys[1]].mute = User[keys[1]].mute - 1 + print(User[keys[0]].mute) + print(User[keys[1]].mute) + if __name__ == '__main__': main() diff --git a/src/TeleBot.py b/src/TeleBot.py index 4c22eaf..c53b332 100644 --- a/src/TeleBot.py +++ b/src/TeleBot.py @@ -9,12 +9,14 @@ from time import sleep ##### Mqtt vars ##### broker_address = "192.168.1.250" broker_port = 1883 -recieve_topic = "telegrambot/out" -send_topic = "telegrambot/in" +recieve_topic = "telegrambot/out/#" +send_topic_server = "telegrambot/in/server/" +send_topic_glucose = "telegrambot/in/glucose/" brokercreds = ["hass","Bruk#5"] x = "AS" -flag = False +flag = " " ##### Bot Variabels ##### +BotToken = '7690417088:AAGcmBegbLHBDXMBKiE6MEgCp3rnLz5vPCE' class User: # Custom classes for my dictionaries def __init__(self, name, lastName, userID, mute): @@ -22,7 +24,6 @@ class User: # Custom classes for my dictionaries self.lastName = lastName self.userID = userID self.mute = mute -BotToken = '7690417088:AAGcmBegbLHBDXMBKiE6MEgCp3rnLz5vPCE' User = { "7570193598": User(name="Bart", lastName="Koolen", userID="7570193598", mute=0), @@ -31,13 +32,15 @@ User = { ##### Main ##### async def subscribe(update: Update, context: ContextTypes.DEFAULT_TYPE): #This command can be run to test setting up a database for users await context.bot.send_message(chat_id=update.effective_chat.id, text=update.message.chat.id) - Mqtt.publish(send_topic,1) + #Mqtt.publish(send_topic,1) async def gluc_command(update: Update, context: CallbackContext): #This command can be run to test setting up a database for users args = ' '.join(context.args) - print(args) - #await context.bot.send_message(chat_id=update.effective_chat.id, text=update.message.chat.id) - Mqtt.publish(send_topic, args) - + current_user = User[str(update.effective_chat.id)].name + Mqtt.publish(send_topic_glucose + current_user.lower(), args) +async def server_command(update: Update, context: CallbackContext): + args = ' '.join(context.args) + current_user = User[str(update.effective_chat.id)].name + Mqtt.publish(send_topic_server + current_user.lower(), args) def on_connect(client, userdata, flags, reason_code, properties): print(f"Connected with result code {reason_code}") @@ -52,17 +55,26 @@ def on_connect(client, userdata, flags, reason_code, properties): def on_message(client, userdata, msg): #This runs everytime a mqtt message is recieved global x global flag + print(msg.topic) x = msg.payload.decode() - flag = True + flag = msg.topic.split("/")[-1] + async def Cat(context: ContextTypes.DEFAULT_TYPE): #This runs evert second to check for if a mqtt message is recieved global x global flag keys = list(User.keys()) print(flag) - if flag == True: - #await context.bot.send_message(chat_id=keys[0], text=x) + if flag == "broadcast": + await context.bot.send_message(chat_id=keys[0], text=x) await context.bot.send_message(chat_id=keys[1], text=x) - flag = False + flag = " " + else: + for i in keys: + if User[i].name.lower() == flag: + #await context.bot.send_message(chat_id=keys[0], text=x) + await context.bot.send_message(chat_id=i, text=x) + flag = " " + flag = " " Mqtt = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) Mqtt.on_connect = on_connect @@ -76,13 +88,13 @@ def main():#This is the main loop application = ApplicationBuilder().token(BotToken).build() gluc_handler = CommandHandler('g', gluc_command) subscribe_handler = CommandHandler('subscribe', subscribe) - #mute_handler = CommandHandler('mute', mute) + server_handler = CommandHandler('s', server_command) job_queue = application.job_queue job_minute = job_queue.run_repeating(Cat , interval=1, first=1) #job_offline = job_queue.run_repeating(callback_offline , interval=interval_offline_message) application.add_handler(gluc_handler) application.add_handler(subscribe_handler) - #application.add_handler(mute_handler) + application.add_handler(server_handler) application.run_polling() if __name__ == '__main__':