Add open/close notifications
Uses only polling for now, websocket support to be added later.
This commit is contained in:
parent
4cdd60d48f
commit
b4e76b75e4
4 changed files with 55 additions and 3 deletions
|
@ -8,3 +8,6 @@ access_token = ...
|
|||
|
||||
[spaceping]
|
||||
api_token = ...
|
||||
|
||||
[isitopen]
|
||||
announce_rooms = ["!room_id:homeserver.example"]
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import asyncio
|
||||
import datetime
|
||||
from nio.rooms import MatrixRoom
|
||||
from nio.events.room_events import RoomMessage
|
||||
|
@ -16,6 +17,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 +31,27 @@ 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:
|
||||
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:
|
||||
pass
|
||||
|
||||
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 +68,23 @@ class ItSyndikatBot:
|
|||
room.room_id, f"Unknown command: {m.command()}"
|
||||
)
|
||||
|
||||
async def announce_open_change(self, now_open: bool):
|
||||
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 +104,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:
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import asyncio
|
||||
import argparse
|
||||
|
||||
from . import ItSyndikatBot
|
||||
|
@ -12,4 +13,5 @@ parser.add_argument(
|
|||
|
||||
args = parser.parse_args()
|
||||
|
||||
ItSyndikatBot(Config(args.config))
|
||||
bot = ItSyndikatBot(Config(args.config))
|
||||
asyncio.run(bot.run())
|
||||
|
|
|
@ -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"]
|
||||
|
|
Loading…
Reference in a new issue