diff --git a/main.py b/main.py index 8706c5e..0363be2 100755 --- a/main.py +++ b/main.py @@ -2,14 +2,10 @@ # Bitlair HobbyBot -import asyncio -from typing import Optional from time import sleep -from string import Template from discord import Intents from discord.ext import commands from discord_webhook import DiscordWebhook, DiscordEmbed -from datetime import datetime import pytz import paho.mqtt.client as mqtt import paho.mqtt.subscribe as subscribe @@ -17,44 +13,47 @@ import os import sys -mqtt_host = os.getenv('MQTT_HOST') +mqtt_host = os.getenv("MQTT_HOST") if not mqtt_host: - print('MQTT_HOST unset') + print("MQTT_HOST unset") sys.exit(1) -token = os.getenv('DISCORD_TOKEN') +token = os.getenv("DISCORD_TOKEN") if not token: - print('DISCORD_TOKEN unset') + print("DISCORD_TOKEN unset") sys.exit(1) -webhook_url = os.getenv('DISCORD_WEBHOOK_URL') +webhook_url = os.getenv("DISCORD_WEBHOOK_URL") if not webhook_url: - print('DISCORD_WEBHOOK_URL unset') + print("DISCORD_WEBHOOK_URL unset") sys.exit(1) -timezone = pytz.timezone('Europe/Amsterdam') +timezone = pytz.timezone("Europe/Amsterdam") # Discord bot stuff intents = Intents.default() intents.message_content = True intents.members = True -HobbyBot = commands.Bot(command_prefix='!', description='Bitlair Bot', intents=intents) +HobbyBot = commands.Bot(command_prefix="!", description="Bitlair Bot", intents=intents) + def mqtt_get_one(topic): try: msg = subscribe.simple(topic, hostname=mqtt_host, keepalive=10) return msg.payload.decode() - except err: + except Exception as err: print(err) - return '' + return "" + # Define bot commands @HobbyBot.event async def on_ready(): - print(f'Logged in as {HobbyBot.user} (ID: {HobbyBot.user.id})') + print(f"Logged in as {HobbyBot.user} (ID: {HobbyBot.user.id})") + # !state -@HobbyBot.command(description='Bitlair Space State') +@HobbyBot.command(description="Bitlair Space State") async def state(ctx): async with ctx.typing(): spaceState = mqtt_get_one("bitlair/state") @@ -63,28 +62,33 @@ async def state(ctx): elif spaceState == "closed": await ctx.send("Bitlair is closed :pensive:") + # !co2 -@HobbyBot.command(description='co2 levels') +@HobbyBot.command(description="co2 levels") async def co2(ctx): async with ctx.typing(): hoofdruimte = mqtt_get_one("bitlair/climate/hoofdruimte_ingang/co2_ppm") await ctx.send("Hoofdruimte: %s ppm\n" % hoofdruimte) + + # !temp -@HobbyBot.command(description='Temperature') +@HobbyBot.command(description="Temperature") async def temp(ctx): async with ctx.typing(): hoofdruimte = mqtt_get_one("bitlair/climate/hoofdruimte_ingang/temperature_c") - await ctx.send("Hoofdruimte: %s °C\n" % hoofdruimte ) + await ctx.send("Hoofdruimte: %s °C\n" % hoofdruimte) + # !humid -@HobbyBot.command(description='Humidity') +@HobbyBot.command(description="Humidity") async def humid(ctx): async with ctx.typing(): hoofdruimte = mqtt_get_one("bitlair/climate/hoofdruimte_ingang/humidity_pct") await ctx.send("Hoofdruimte: %s pct\n" % hoofdruimte) + # !np -@HobbyBot.command(description='Now Playing') +@HobbyBot.command(description="Now Playing") async def np(ctx): async with ctx.typing(): await ctx.send("Now playing: Darude - Sandstorm") @@ -106,12 +110,13 @@ def webhook_message(msg): retained = { - 'bitlair/alarm', - 'bitlair/photos', - 'bitlair/state', - 'bitlair/state/djo', + "bitlair/alarm", + "bitlair/photos", + "bitlair/state", + "bitlair/state/djo", } + # post to mqtt discord channel when state changes def on_message(client, userdata, msg): try: @@ -124,17 +129,17 @@ def on_message(client, userdata, msg): retained.remove(topic) return - if topic == 'bitlair/alarm': - webhook_message('Alarm: %s' % msg) - elif topic == 'bitlair/state': - webhook_message('Bitlair is now %s' % msg.upper()) - elif topic == 'bitlair/state/djo': - webhook_message('DJO is now %s' % msg.upper()) - elif topic == 'bitlair/photos': + if topic == "bitlair/alarm": + webhook_message("Alarm: %s" % msg) + elif topic == "bitlair/state": + webhook_message("Bitlair is now %s" % msg.upper()) + elif topic == "bitlair/state/djo": + webhook_message("DJO is now %s" % msg.upper()) + elif topic == "bitlair/photos": webhook = DiscordWebhook(url=webhook_url, rate_limit_retry=True) - embed = DiscordEmbed(title='WIP Cam', color='fc5d1d') - embed.set_url('https://bitlair.nl/fotos/view/' + msg) - embed.set_image('https://bitlair.nl/fotos/photos/' + msg) + embed = DiscordEmbed(title="WIP Cam", color="fc5d1d") + embed.set_url("https://bitlair.nl/fotos/view/" + msg) + embed.set_image("https://bitlair.nl/fotos/photos/" + msg) webhook.add_embed(embed) webhook.execute() else: