From 35c8e7582b6c123094827fc0c4617221a8f73d4a Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Fri, 11 Oct 2024 17:24:49 +0100 Subject: [PATCH] `is_bot_operational` field on the Server model True, False or None indicates if the bot is a member of said server, and has sufficient permissions to perform it's job. Starts as None (unknown) and becomes True or False when calling a server's `/generate-channels/` endpoint. --- apps/api/serializers.py | 27 ++++++++++++++++--- apps/home/admin.py | 10 +++++-- .../0011_server_is_bot_operational.py | 18 +++++++++++++ .../0012_alter_server_is_bot_operational.py | 18 +++++++++++++ apps/home/models.py | 1 + apps/home/views.py | 9 +++++++ 6 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 apps/home/migrations/0011_server_is_bot_operational.py create mode 100644 apps/home/migrations/0012_alter_server_is_bot_operational.py diff --git a/apps/api/serializers.py b/apps/api/serializers.py index 6163cc6..4626b59 100644 --- a/apps/api/serializers.py +++ b/apps/api/serializers.py @@ -10,16 +10,17 @@ from apps.home.models import ( ContentFilter, MessageMutator, MessageStyle, + UniqueContentRule, DiscordChannel, Subscription, Content, - UniqueContentRule ) log = logging.getLogger(__name__) -#region Dynamic Model +# region Dynamic Model + # This DynamicModelSerializer is from a StackOverflow user in an obscure thread. # I wish that I could remember which thread, because god bless that man. @@ -119,12 +120,22 @@ class DynamicModelSerializer(serializers.ModelSerializer): abstract = True +# region Servers + class ServerSerializer(DynamicModelSerializer): class Meta: model = Server - fields = ("id", "name", "icon_hash", "active") + fields = ( + "id", + "name", + "icon_hash", + "is_bot_operational", + "active" + ) +# region Filters + class ContentFilterSerializer(DynamicModelSerializer): class Meta: model = ContentFilter @@ -139,12 +150,16 @@ class ContentFilterSerializer(DynamicModelSerializer): ) +# region Msg Mutators + class MessageMutatorSerializer(DynamicModelSerializer): class Meta: model = MessageMutator fields = ("id", "name", "value") +# region Msg Styles + class MessageStyleSerializer(DynamicModelSerializer): title_mutator_detail = serializers.SerializerMethodField() description_mutator_detail = serializers.SerializerMethodField() @@ -183,12 +198,16 @@ class MessageStyleSerializer(DynamicModelSerializer): return {} +# region Rules + class UniqueContentRuleSerializer(DynamicModelSerializer): class Meta: model = UniqueContentRule fields = ("id", "name", "value") +# region Subscriptions + class DiscordChannelField(serializers.PrimaryKeyRelatedField): def to_internal_value(self, data): try: @@ -299,6 +318,8 @@ class SubscriptionSerializer(DynamicModelSerializer): return data +# region Content + class ContentSerializer(DynamicModelSerializer): class Meta: model = Content diff --git a/apps/home/admin.py b/apps/home/admin.py index 34f8f81..61fe63b 100644 --- a/apps/home/admin.py +++ b/apps/home/admin.py @@ -16,8 +16,14 @@ from .models import ( @admin.register(Server) class ServerAdmin(admin.ModelAdmin): - list_display = ["id", "name", "icon_hash", "active"] - list_display_links = ["name"] + list_display = [ + "id", + "name", + "icon_hash", + "is_bot_operational", + "active" + ] + list_display_links = ["id"] @admin.register(ContentFilter) diff --git a/apps/home/migrations/0011_server_is_bot_operational.py b/apps/home/migrations/0011_server_is_bot_operational.py new file mode 100644 index 0000000..5a3f889 --- /dev/null +++ b/apps/home/migrations/0011_server_is_bot_operational.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.4 on 2024-10-11 16:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0010_discordchannel_name'), + ] + + operations = [ + migrations.AddField( + model_name='server', + name='is_bot_operational', + field=models.BooleanField(default=False), + ), + ] diff --git a/apps/home/migrations/0012_alter_server_is_bot_operational.py b/apps/home/migrations/0012_alter_server_is_bot_operational.py new file mode 100644 index 0000000..893b1bc --- /dev/null +++ b/apps/home/migrations/0012_alter_server_is_bot_operational.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.4 on 2024-10-11 16:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0011_server_is_bot_operational'), + ] + + operations = [ + migrations.AlterField( + model_name='server', + name='is_bot_operational', + field=models.BooleanField(default=None, null=True), + ), + ] diff --git a/apps/home/models.py b/apps/home/models.py index d4f1291..1ac0742 100644 --- a/apps/home/models.py +++ b/apps/home/models.py @@ -23,6 +23,7 @@ class Server(models.Model): id = models.PositiveIntegerField(primary_key=True) name = models.CharField(max_length=128) icon_hash = models.CharField(max_length=128, blank=True, null=True) + is_bot_operational = models.BooleanField(default=None, null=True) active = models.BooleanField(default=True) class Meta: diff --git a/apps/home/views.py b/apps/home/views.py index 1222e96..6565827 100644 --- a/apps/home/views.py +++ b/apps/home/views.py @@ -158,10 +158,19 @@ class ChannelsView(View): channels_data, status = await self._get_channel_data(guild_id) + # Not authorized means the bot isn't operational, we need to save that + if status == 403: + server.is_bot_operational = False + await server.asave() + # Send back the error data if status is bad if status != 200: return JsonResponse(channels_data, status=status, safe=False) + # Because the status is 200, we know the Bot is functional, set that param + server.is_bot_operational = True + await server.asave() + cleaned_channels_data = await self._clean_channels_data(server, channels_data) await self._cleanup_dead_channels(server, cleaned_channels_data)