Compare commits

..

2 commits

Author SHA1 Message Date
834ea75fd8 Add logging 2022-03-29 19:28:20 +02:00
b4e76b75e4 Add open/close notifications
Uses only polling for now, websocket support to be added later.
2022-03-29 19:27:45 +02:00
4 changed files with 62 additions and 3 deletions

View file

@ -8,3 +8,6 @@ access_token = ...
[spaceping]
api_token = ...
[isitopen]
announce_rooms = ["!room_id:homeserver.example"]

View file

@ -1,4 +1,6 @@
import asyncio
import datetime
import logging
from nio.rooms import MatrixRoom
from nio.events.room_events import RoomMessage
import simplematrixbotlib as botlib
@ -16,6 +18,8 @@ class ItSyndikatBot:
def __init__(self, config: Config):
self.config = config
self.current_open_state = None
creds = botlib.Creds(
config.matrix_homeserver,
config.matrix_username,
@ -28,7 +32,28 @@ class ItSyndikatBot:
self.bot = botlib.Bot(creds)
self.bot.listener.on_message_event(self.on_message)
self.bot.run()
async def run(self):
async def poll_for_changes():
while True:
logging.debug("Polling open state")
try:
status = await self.its_api.status()
new_state = status["state"]["open"]
if (
self.current_open_state is not None
and new_state != self.current_open_state
):
await self.announce_open_change(new_state)
self.current_open_state = new_state
except Exception as e:
logging.error(f"Polling for open state failed: {e}")
await asyncio.sleep(60)
asyncio.create_task(poll_for_changes())
await self.bot.main()
async def on_message(self, room, message):
m = botlib.MessageMatch(room, message, self.bot, self.config.command_prefix)
@ -45,6 +70,25 @@ class ItSyndikatBot:
room.room_id, f"Unknown command: {m.command()}"
)
async def announce_open_change(self, now_open: bool):
logging.info("Open state changed: now " + ("open" if now_open else "closed"))
room_ids = self.config.isitopen_announce_rooms
if now_open:
message = "opening IT-Syndikat - Ohai!"
else:
message = "closing IT-Syndikat - nap time!"
for room_id in room_ids:
await self.bot.api.async_client.room_send(
room_id=room_id,
message_type="m.room.message",
content={
"msgtype": "m.notice",
"body": message,
},
)
async def reply(self, room, message, reply):
await self.bot.api.async_client.room_send(
room_id=room.room_id,
@ -64,7 +108,9 @@ class ItSyndikatBot:
async def isitopen(self, room, message):
try:
status = await self.its_api.status()
if status["state"]["open"]:
is_open = status["state"]["open"]
self.current_open_state = is_open
if is_open:
date = datetime.datetime.fromtimestamp(status["state"]["lastchange"])
text = f"positive! space has been open since {date}"
else:

View file

@ -1,8 +1,12 @@
import asyncio
import argparse
import logging
from . import ItSyndikatBot
from .config import Config
logging.basicConfig(level=logging.DEBUG)
parser = argparse.ArgumentParser(description="IT-Syndikat matrix bot")
parser.add_argument(
"-c",
@ -12,4 +16,5 @@ parser.add_argument(
args = parser.parse_args()
ItSyndikatBot(Config(args.config))
bot = ItSyndikatBot(Config(args.config))
asyncio.run(bot.run())

View file

@ -1,4 +1,5 @@
import toml
from typing import List
class Config:
@ -10,6 +11,8 @@ class Config:
spaceping_token: str
isitopen_announce_rooms: List[str]
def __init__(self, path=None):
if path is None:
path = "/etc/itsyndikat-bot.toml"
@ -24,3 +27,5 @@ class Config:
self.matrix_access_token = matrix["access_token"]
self.spaceping_token = config["spaceping"]["api_token"]
self.isitopen_announce_rooms = config["isitopen"]["announce_rooms"]