Skip to content

Commit

Permalink
Merge pull request #141 from zediious/0.4.4.2
Browse files Browse the repository at this point in the history
Changes for 0.4.4.2
  • Loading branch information
zediious authored Nov 26, 2023
2 parents fa9a560 + 391cb53 commit b3d9cdf
Show file tree
Hide file tree
Showing 19 changed files with 496 additions and 30 deletions.
16 changes: 16 additions & 0 deletions config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,11 @@
'level': 'DEBUG',
'propagate': False,
},
'raptorbot.models': {
'handlers': ['console', 'bot_log_file'],
'level': 'DEBUG',
'propagate': False,
},
'raptorbot.botware': {
'handlers': ['console', 'bot_log_file'],
'level': 'DEBUG',
Expand All @@ -345,6 +350,16 @@
'level': 'DEBUG',
'propagate': False,
},
'raptorbot.discordbot.util.embed': {
'handlers': ['console', 'bot_log_file'],
'level': 'DEBUG',
'propagate': False,
},
'raptorbot.discordbot.util.messages': {
'handlers': ['console', 'bot_log_file'],
'level': 'DEBUG',
'propagate': False,
},
'raptorbot.discordbot.util.task_check': {
'handlers': ['console', 'bot_log_file'],
'level': 'DEBUG',
Expand Down Expand Up @@ -468,6 +483,7 @@
"gameservers.Player": "fas fa-headset",
"gameservers.Server": "fas fa-server",
"raptorbot": "fas fa-robot",
"raptorbot.SentEmbedMessage": "fas fa-comment",
"raptorbot.GlobalAnnouncement": "fas fa-bullhorn",
"raptorbot.ServerAnnouncement": "fas fa-bullhorn",
"staffapps": "fas fa-book-reader",
Expand Down
41 changes: 40 additions & 1 deletion raptorWeb/gameservers/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,32 @@

from django.db import models
from django.utils.timezone import localtime, now
from django.dispatch import receiver
from django.db.models.signals import pre_save
from django.conf import settings

from mcstatus import JavaServer
from mcstatus.querier import QueryResponse
from django_resized import ResizedImageField

from raptorWeb.raptormc.models import SiteInformation
from raptorWeb.raptorbot.models import ServerAnnouncement
from raptorWeb.raptorbot.models import ServerAnnouncement, DiscordBotTasks, SentEmbedMessage

LOGGER: Logger = getLogger('gameservers.models')
IMPORT_JSON_LOCATION: str = getattr(settings, 'IMPORT_JSON_LOCATION')
SERVER_FIELDS_TO_IGNORE = [
'player_count',
'announcement_count',
'server_state',
'in_maintenance'
'server_port',
'server_rules',
'server_banned_items'
'server_vote_links'
'discord_announcement_channel_id',
'discord_modpack_role_id '
]


class ServerManager(models.Manager):

Expand Down Expand Up @@ -448,3 +463,27 @@ def get_server(self):
class Meta:
verbose_name = "Historic Player Count"
verbose_name_plural = "Historic Player Counts"


@receiver(pre_save, sender=Server)
def update_embeds(sender, instance, *args, **kwargs):
"""
If certain fields of a server are modified, tell the Discord Bot
to update sent message embeds with the new information.
"""
try:
previous = Server.objects.get(id=instance.id)

for field in instance._meta.fields:
field_string = str(field).replace('gameservers.Server.', '')
if field_string not in SERVER_FIELDS_TO_IGNORE:
if getattr(previous, field_string) != getattr(instance, field_string):
for message in SentEmbedMessage.objects.filter(server=previous):
message.changed_and_unedited = True
message.save()
tasks: DiscordBotTasks = DiscordBotTasks.objects.get_or_create(pk=1)[0]
tasks.update_embeds = True
tasks.save()
break
except Server.DoesNotExist:
pass
55 changes: 54 additions & 1 deletion raptorWeb/raptorbot/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from tinymce.widgets import TinyMCE

from raptorWeb.raptorbot.models import DiscordGuild, GlobalAnnouncement, ServerAnnouncement
from raptorWeb.raptorbot.models import GlobalAnnouncement, ServerAnnouncement, SentEmbedMessage, DiscordBotInternal, DiscordBotTasks


class AnnouncementForm(ModelForm):
Expand Down Expand Up @@ -41,6 +41,13 @@ class GlobalAnnouncementAdmin(admin.ModelAdmin):
]

list_display: list[str] = ['author', 'date']

def has_add_permission(self, request, obj=None):
return False

def has_change_permission(self, request, obj=None):
return False


class ServerAnnouncementAdmin(admin.ModelAdmin):
"""
Expand Down Expand Up @@ -70,7 +77,53 @@ class ServerAnnouncementAdmin(admin.ModelAdmin):
]

list_display: list[str] = ['author', 'date', 'server']

def has_add_permission(self, request, obj=None):
return False

def has_change_permission(self, request, obj=None):
return False


class SentEmbedMessageAdmin(admin.ModelAdmin):
"""
Object defining behavior and display of
SentEmbedMessages in the Django admin interface.
"""
fieldsets: tuple[tuple[str, dict[str, tuple[str]]]] = (
('General', {
'fields': (
'server',
'message_id',
'channel_id',
'webhook_id',
'sent',
'modified')
}),
)

readonly_fields: tuple[str] = (
'server',
'message_id',
'channel_id',
'webhook_id',
'sent',
'modified'
)

search_fields: list[str] = [
'server'
]

list_display: list[str] = ['server', 'modified', 'sent']

def has_add_permission(self, request, obj=None):
return False

def has_change_permission(self, request, obj=None):
return False


admin.site.register(GlobalAnnouncement, GlobalAnnouncementAdmin)
admin.site.register(ServerAnnouncement, ServerAnnouncementAdmin)
admin.site.register(SentEmbedMessage, SentEmbedMessageAdmin)
2 changes: 1 addition & 1 deletion raptorWeb/raptorbot/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
class RaptorbotConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'raptorWeb.raptorbot'
verbose_name = 'Announcements'
verbose_name = 'Discord Bot'
74 changes: 53 additions & 21 deletions raptorWeb/raptorbot/discordbot/bot.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from logging import Logger, getLogger
from threading import Thread
from time import sleep
from typing import Optional
import ctypes

Expand All @@ -11,6 +12,7 @@

from raptorWeb.raptormc.models import SiteInformation
from raptorWeb.gameservers.models import Server
from raptorWeb.raptorbot.models import SentEmbedMessage, DiscordBotInternal
from raptorWeb.raptorbot.discordbot.util import announcements, embed, presence, task_check

LOGGER: Logger = getLogger('raptorbot.discordbot.bot')
Expand Down Expand Up @@ -88,6 +90,23 @@ async def on_ready() -> None:
async def on_presence_update(before, after) -> None:
await presence.update_member_count(raptor_bot)
await presence.update_invite_link(raptor_bot)


@raptor_bot.event
async def on_message_delete(message) -> None:
try:
saved_embed: SentEmbedMessage = await SentEmbedMessage.objects.aget(message_id=message.id)
bot_stat: DiscordBotInternal = await DiscordBotInternal.objects.aget(name="botinternal-stat")
bot_stat.deleted_a_message = True
await bot_stat.asave()
await DiscordBotInternal.objects.aupdate(
deleted_a_message=True
)
sleep(3)
await saved_embed.adelete()

except SentEmbedMessage.DoesNotExist:
pass


@raptor_bot.event
Expand Down Expand Up @@ -117,31 +136,37 @@ async def on_message(message: discord.Message) -> None:

@raptor_bot.event
async def on_raw_message_edit(message: discord.Message) -> None:
if message.data["author"]["id"] != raptor_bot.user.id:
site_info: SiteInformation = await SiteInformation.objects.aget(pk=1)
if message.channel_id == int(site_info.discord_global_announcement_channel):
await announcements.update_global_announcements(raptor_bot)

try:
server_queryset: Server.objects = Server.objects.filter(
discord_announcement_channel_id = message.channel_id)

if server_queryset != None:
server: Server = await server_queryset.aget()
await announcements.update_server_announce(
server.modpack_name,
bot_instance=raptor_bot,
site_info=site_info)

except Server.DoesNotExist:
pass
try:
if message.data["author"]["id"] != raptor_bot.user.id:
site_info: SiteInformation = await SiteInformation.objects.aget(pk=1)
if message.channel_id == int(site_info.discord_global_announcement_channel):
await announcements.update_global_announcements(raptor_bot)

try:
server_queryset: Server.objects = Server.objects.filter(
discord_announcement_channel_id = message.channel_id)

if server_queryset != None:
server: Server = await server_queryset.aget()
await announcements.update_server_announce(
server.modpack_name,
bot_instance=raptor_bot,
site_info=site_info)

except Server.DoesNotExist:
pass

except KeyError:
pass


# Commands
@raptor_bot.tree.command(
name="display_server_info",
description="Send a message with an embed displaying server information.")
@discord.app_commands.describe(key="Choose a server address prefix")
description="Send a message displaying server information. "
"Will update if the server's information is changed.")
@discord.app_commands.describe(key="Choose a server address prefix. This is the first part "
"of a server's domain/address.")
async def display_server_info(interaction: discord.Interaction, key: str) -> None:
"""
Send a message with an embed displaying server information. Take a server's address
Expand All @@ -153,7 +178,14 @@ async def display_server_info(interaction: discord.Interaction, key: str) -> Non
if server.server_address.split(".")[0] == key:
message_embeds: list[discord.Embed] = await embed.craft_embed(server)
await interaction.response.send_message(embeds=message_embeds)

sent_message = await interaction.original_response()

await SentEmbedMessage.objects.acreate(
server=server,
webhook_id='',
message_id=sent_message.id,
channel_id=sent_message.channel.id
)

@raptor_bot.tree.command(
name="refresh_announcements",
Expand Down
30 changes: 29 additions & 1 deletion raptorWeb/raptorbot/discordbot/util/embed.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,50 @@
from logging import Logger, getLogger

from django.utils.html import strip_tags
from django.utils.timezone import localtime
from django.conf import settings

import discord
from discord.ext import commands

from raptorWeb.gameservers.models import Server
from raptorWeb.raptorbot.models import SentEmbedMessage

LOGGER: Logger = getLogger('raptorbot.discordbot.util.embed')
DOMAIN_NAME: str = getattr(settings, 'DOMAIN_NAME')
WEB_PROTO: str = getattr(settings, 'WEB_PROTO')


async def update_embeds(bot_instance: commands.Bot) -> None:
"""
Update all sent embeds with new server information
"""
async for saved_embed in SentEmbedMessage.objects.all():
if saved_embed.changed_and_unedited != True:
continue
server = await SentEmbedMessage.objects.select_related(
'server'
).aget(id = saved_embed.id)
message_embeds: list[discord.Embed] = await craft_embed(server.server)
channel: discord.TextChannel = bot_instance.get_channel(int(saved_embed.channel_id))
message = await channel.fetch_message(int(saved_embed.message_id))
await message.edit(embeds=message_embeds)
saved_embed.modified = localtime()
saved_embed.changed_and_unedited = False
await saved_embed.asave()

async def craft_embed(server: Server) -> list[discord.Embed]:
"""
Given a Server, return a list of Embeds for display. One embed
contains a server's modpack image, the other contains information.
"""
image_embed = discord.Embed(color=0x00ff00)
try:
server_image = server.modpack_picture.url
except ValueError:
server_image = ''
image_embed.set_image(
url=f"{WEB_PROTO}://{DOMAIN_NAME}{server.modpack_picture.url}")
url=f"{WEB_PROTO}://{DOMAIN_NAME}{server_image}")

info_embed = discord.Embed(
title=server.modpack_name,
Expand Down
17 changes: 17 additions & 0 deletions raptorWeb/raptorbot/discordbot/util/messages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from logging import Logger, getLogger

import discord
from discord.ext import commands

LOGGER: Logger = getLogger('raptorbot.discordbot.util.messages')

async def delete_messages(bot_instance: commands.Bot, messages_string: str) -> None:
"""
Delete all messages in DiscordbotTasks messages_to_delete field
"""
messages = messages_string[:-1].split(',')
for message in messages:
message_details = message.replace('(', '').replace(')', '').split('.')
channel: discord.TextChannel = bot_instance.get_channel(int(message_details[1]))
message = await channel.fetch_message(int(message_details[0]))
await message.delete()
12 changes: 10 additions & 2 deletions raptorWeb/raptorbot/discordbot/util/task_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from raptorWeb.raptormc.models import SiteInformation
from raptorWeb.raptorbot.models import DiscordBotTasks
from raptorWeb.raptorbot.discordbot.util import announcements, presence
from raptorWeb.raptorbot.discordbot.util import announcements, presence, embed, messages

LOGGER: Logger = getLogger('raptorbot.discordbot.util.task_check')

Expand All @@ -25,10 +25,18 @@ async def check_tasks(bot_instance):

if tasks[0].update_members:
await presence.update_member_count(bot_instance, site_info)

if tasks[0].update_embeds:
await embed.update_embeds(bot_instance)

if str(tasks[0].messages_to_delete) != "":
await messages.delete_messages(bot_instance, str(tasks[0].messages_to_delete))

await DiscordBotTasks.objects.aupdate(
id=1,
refresh_global_announcements=False,
refresh_server_announcements=False,
update_members=False
update_members=False,
update_embeds=False,
messages_to_delete=""
)
Loading

0 comments on commit b3d9cdf

Please sign in to comment.