is_bot_operational field on the Server model
All checks were successful
Build and Push Docker Image / build (push) Successful in 13s

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.
This commit is contained in:
Corban-Lee Jones 2024-10-11 17:24:49 +01:00
parent b324b6accb
commit 35c8e7582b
6 changed files with 78 additions and 5 deletions

View File

@ -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

View File

@ -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)

View File

@ -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),
),
]

View File

@ -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),
),
]

View File

@ -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:

View File

@ -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)