From 613d7dedc097c9a167fb2b3eb6f0ef6e279eb847 Mon Sep 17 00:00:00 2001 From: ldeluigi <44567586+ldeluigi@users.noreply.github.com> Date: Sat, 24 Aug 2024 14:52:15 +0200 Subject: [PATCH] Add explanatory error messages for malformed queries in discord bot --- backend/spellbook/views/variants.py | 11 ++++++++--- bot/discord/spellbook_discord.py | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/backend/spellbook/views/variants.py b/backend/spellbook/views/variants.py index 74d29378..3031ca27 100644 --- a/backend/spellbook/views/variants.py +++ b/backend/spellbook/views/variants.py @@ -1,11 +1,16 @@ -from rest_framework import viewsets -from drf_spectacular.utils import extend_schema +from rest_framework import viewsets, serializers +from drf_spectacular.utils import extend_schema, inline_serializer from spellbook.models import Variant, PreSerializedSerializer from spellbook.serializers import VariantSerializer from .filters import SpellbookQueryFilter, OrderingFilterWithNullsLast -@extend_schema(responses=VariantSerializer) +@extend_schema(responses={ + 200: VariantSerializer, + 400: inline_serializer('VariantsQueryValidationError', { + 'q': serializers.ListSerializer(child=serializers.CharField(), required=False), + }) +}) class VariantViewSet(viewsets.ReadOnlyModelViewSet): queryset = Variant.serialized_objects filter_backends = [SpellbookQueryFilter, OrderingFilterWithNullsLast] diff --git a/bot/discord/spellbook_discord.py b/bot/discord/spellbook_discord.py index ee527d44..57c27d6c 100644 --- a/bot/discord/spellbook_discord.py +++ b/bot/discord/spellbook_discord.py @@ -9,6 +9,7 @@ from spellbook_client.models.variant import Variant from spellbook_client.models.deck_request import DeckRequest from spellbook_client.models.invalid_url_response import InvalidUrlResponse +from spellbook_client.models.variants_query_validation_error import VariantsQueryValidationError from text_utils import discord_chunk, chunk_diff_async from bot_utils import parse_queries, SpellbookQuery, url_from_variant, compute_variant_name, compute_variant_results, API, compute_variant_recipe, uri_validator @@ -164,6 +165,29 @@ def add_kwargs(i: int, c: str): old_chunks_wrappers=messages, unwrap=lambda m: m.content, ) + except VariantsQueryValidationError as e: + if message: + await message.remove_reaction('🔍', bot.user) # type: ignore + await message.add_reaction('⚠') + error_messages = e.q or [] + reply += f'\n\nThere {'is a problem' if len(error_messages) <= 1 else 'are problems'} with {query_info.summary}' + if error_messages: + if len(error_messages) > 1: + reply += ':\n' + for error_message in error_messages: + reply += f'\n* {error_message}' + else: + reply += f'. {error_messages[0]}' + if message: + chunks = discord_chunk(reply) + messages = await chunk_diff_async( + new_chunks=chunks, + add=lambda i, c: message.reply(**add_kwargs(i, c)), + update=lambda i, m, c: m.edit(content=c, suppress=embed is None or i != len(chunks) - 1, embed=embed if i == len(chunks) - 1 else None), + remove=lambda _, m: m.delete(), + old_chunks_wrappers=messages, + unwrap=lambda m: m.content, + ) except APIError: if message: await message.remove_reaction('🔍', bot.user) # type: ignore