diff --git a/kibicara/platforms/mastodon/bot.py b/kibicara/platforms/mastodon/bot.py index 8c6d9b4..a4fcfc3 100644 --- a/kibicara/platforms/mastodon/bot.py +++ b/kibicara/platforms/mastodon/bot.py @@ -8,8 +8,8 @@ from kibicara.platformapi import Censor, Spawner, Message from kibicara.platforms.mastodon.model import MastodonAccount from mastodon import Mastodon, MastodonError -from asyncio import gather, get_event_loop -import sys +from asyncio import gather +import re from logging import getLogger @@ -27,6 +27,7 @@ class MastodonBot(Censor): self.account = Mastodon( client_id=self.model.instance.client_id, client_secret=self.model.instance.client_secret, + api_base_url=self.model.instance.name, access_token=self.model.access_token, ) await gather(self.poll(), self.push()) @@ -36,22 +37,26 @@ class MastodonBot(Censor): while True: try: notifications = self.account.notifications() - except MastodonError: - logger.warning( - "%s in hood %s" % (sys.exc_info()[0], self.model.hood.name) - ) + except MastodonError as e: + logger.warning("%s in hood %s" % (e, self.model.hood.name)) continue last_seen = int(self.model.last_seen) for status in notifications: - status_id = int(status['status']['id']) + try: + status_id = int(status['status']['id']) + except KeyError: + continue # ignore notifications which don't have a status if status_id <= last_seen: continue # toot was already processed in the past - if status_id > self.model.last_seen: - self.model.last_seen = status_id # save last_seen in database - text = status['status']['content'] - # :TODO sanitize toot content; see ticketfrei2 for regex magic + if status_id > int(self.model.last_seen): + await self.model.update(last_seen=str(status_id)) + text = re.sub(r'<[^>]*>', '', status['status']['content']) + text = re.sub( + "(?<=^|(?<=[^a-zA-Z0-9-_.]))@([A-Za-z]+[A-Za-z0-9-_]+)", "", text + ) logger.debug( - "Mastodon in %s received message: " % (self.model.hood.name,) + "Mastodon in %s received toot #%s: %s" + % (self.model.hood.name, status_id, text) ) if status['status']['visibility'] == 'public': await self.publish(Message(text, toot_id=status_id)) @@ -63,9 +68,11 @@ class MastodonBot(Censor): while True: message = await self.receive() if hasattr(message, "tood_id"): - await self.account.status_reblog(message.tood_id) + logger.debug("Boosting post %s: %s" % (message.tood_id, message.text)) + self.account.status_reblog(message.tood_id) else: - await self.account.status_post(message.text) + logger.debug("Posting message: %s" % (message.text,)) + self.account.status_post(message.text) spawner = Spawner(MastodonAccount, MastodonBot)