Skip to content

Commit

Permalink
Add explanatory error messages for malformed queries in discord bot
Browse files Browse the repository at this point in the history
  • Loading branch information
ldeluigi committed Aug 24, 2024
1 parent e626d6c commit 613d7de
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 3 deletions.
11 changes: 8 additions & 3 deletions backend/spellbook/views/variants.py
Original file line number Diff line number Diff line change
@@ -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]
Expand Down
24 changes: 24 additions & 0 deletions bot/discord/spellbook_discord.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 613d7de

Please sign in to comment.