diff --git a/bot/bot_app.py b/bot/bot_app.py index 5806478..81c920c 100644 --- a/bot/bot_app.py +++ b/bot/bot_app.py @@ -4,6 +4,7 @@ import misskey from parsing import parse_notification from db_utils import get_or_create_user, add_pull, get_config, set_config from client import client_connection +from response import generate_response # Initialize the Misskey client client = client_connection() @@ -44,15 +45,49 @@ def stream_notifications(): instance = host if host else "local" if instance in whitelisted_instances or instance == "local": - note = notification.get("note", {}).get("text", "") + note = notification.get("note", {}) + note_text = note.get("text", "") + note_id = note.get("id") notif_type = notification.get("type", "unknown") + # We want the visibility to be related to the type that was received (so if + # people don't want to dump a bunch of notes on home they don't have to) + + visibility = notification["note"]["visibility"] + if visibility != "specified": + visibility = "home" + print(f"📨 [{notif_type}] from @{username}@{instance}") - print(f"💬 {note}") + print(f"💬 {note_text}") print("-" * 30) - # 🧠 Send to the parser - parse_notification(notification,client) + + # We get the type of notification to filter the ones that we actually want + # to parse + + notif_type = notification.get("type") + if notif_type in ('mention', 'reply'): + # 🧠 Send to the parser + parsed_command = parse_notification(notification,client) + # Get the response + response = generate_response(parsed_command) + if isinstance(response, str): + client.notes_create( + text=response, + reply_id=note_id, + visibility=visibility + ) + elif response: + client.notes_create( + text=response[0], + reply_id=note_id, + visibility=visibility, + file_ids=response[1] + #visible_user_ids=[] #todo: write actual visible users ids so pleromers can use the bot privately + ) + + + else: print(f"⚠️ Blocked notification from untrusted instance: {host}") @@ -70,7 +105,7 @@ def stream_notifications(): except Exception as e: print(f"An exception has occured: {e}\n{traceback.format_exc()}") - time.sleep(5) + time.sleep(2) diff --git a/bot/parsing.py b/bot/parsing.py index c17a276..bbefe70 100644 --- a/bot/parsing.py +++ b/bot/parsing.py @@ -1,23 +1,11 @@ import random, re import config -from gacha_response import gacha_response def parse_notification(notification,client): - '''Oarses any notifications received by the bot and sends any commands to + '''Parses any notifications received by the bot and sends any commands to gacha_response()''' - # We get the type of notification to filter the ones that we actually want - # to parse - - notif_type = notification.get("type") - if not notif_type in ('mention', 'reply'): - return # Ignore anything that isn't a mention - - # We want the visibility to be related to the type that was received (so if - # people don't want to dump a bunch of notes on home they don't have to) - visibility = notification["note"]["visibility"] - if visibility != "specified": - visibility = "home" + # Get the full Activitypub ID of the user user = notification.get("user", {}) @@ -50,22 +38,4 @@ def parse_notification(notification,client): command = parts[0].lower() if parts else None arguments = parts[1:] if len(parts) > 1 else [] - # TODO: move response generation to a different function - response = gacha_response(command.lower(),full_user, arguments, note_obj) - if not response: - return - - if isinstance(response, str): - client.notes_create( - text=response, - reply_id=note_id, - visibility=visibility - ) - else: - client.notes_create( - text=response[0], - reply_id=note_id, - visibility=visibility, - file_ids=response[1] - #visible_user_ids=[] #todo: write actual visible users ids so pleromers can use the bot privately - ) + return [command,full_user, arguments, note_obj] diff --git a/bot/gacha_response.py b/bot/response.py similarity index 92% rename from bot/gacha_response.py rename to bot/response.py index e703aff..2c58c43 100644 --- a/bot/gacha_response.py +++ b/bot/response.py @@ -26,11 +26,13 @@ def is_float(val): return False -# TODO: See issue #3, separate command parsing from game logic. -def gacha_response(command,full_user, arguments,note_obj): - '''Parses a given command with arguments, processes the game state and +def generate_response(parsed_command): + + '''Given a command with arguments, processes the game state and returns a response''' + command, full_user, arguments, note_obj = parsed_command + if command == "roll": user_id = get_or_create_user(full_user) character_id, character_name, file_id, rarity = get_character()