Add discord ID and sync (#17)

UAT

Signed-off-by: Etzelia <etzelia@hotmail.com>

Optimize imports

Signed-off-by: Etzelia <etzelia@hotmail.com>

Add discord ID and sync

Signed-off-by: Etzelia <etzelia@hotmail.com>

Reviewed-on: https://git.canopymc.net/Canopy/minecraft_manager/pulls/17
Reviewed-by: ZeroHD <joey@ahines.net>
Co-Authored-By: Etzelia <etzelia@hotmail.com>
Co-Committed-By: Etzelia <etzelia@hotmail.com>
roll
Etzelia 2021-07-26 15:23:37 +00:00
parent 03608edfae
commit 66cf464f3d
5 changed files with 54 additions and 6 deletions

View File

@ -1,12 +1,13 @@
import discord import discord
from io import StringIO
from discord.ext import commands from discord.ext import commands
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import close_old_connections from django.db import close_old_connections
from minecraft_manager.api import api from minecraft_manager.api import api
from minecraft_manager.bot.utils import get_application from minecraft_manager.bot.utils import get_application
from minecraft_manager.utils import build_application, full_static
from minecraft_manager.models import Application, Player from minecraft_manager.models import Application, Player
from minecraft_manager.utils import build_application, full_static
class Commands(commands.Cog): class Commands(commands.Cog):
@ -54,6 +55,7 @@ class Commands(commands.Cog):
embed.add_field(name="{}demote <username>".format(self.bot.prefix), embed.add_field(name="{}demote <username>".format(self.bot.prefix),
value="Demote a player to the role given to accepted applications.") value="Demote a player to the role given to accepted applications.")
embed.add_field(name="{}compare".format(self.bot.prefix), value="Compare Discord users to the Whitelist.") embed.add_field(name="{}compare".format(self.bot.prefix), value="Compare Discord users to the Whitelist.")
embed.add_field(name="{}sync".format(self.bot.prefix), value="Sync Discord users with Player records.")
await self.bot.discord_message(ctx.message.channel, embed) await self.bot.discord_message(ctx.message.channel, embed)
@commands.group("app", aliases=["application"]) @commands.group("app", aliases=["application"])
@ -258,6 +260,31 @@ class Commands(commands.Cog):
header = "**The following users do not have an application or player match on the whitelist:**\n" header = "**The following users do not have an application or player match on the whitelist:**\n"
await self.bot.discord_message(ctx.author, "{}```{}```".format(header, "\n".join(no_application))) await self.bot.discord_message(ctx.author, "{}```{}```".format(header, "\n".join(no_application)))
@commands.command()
async def sync(self, ctx):
def sync_player(player):
for member in ctx.guild.members:
name = member.nick if member.nick else member.name
if player.username.lower() == name.lower():
player.discord_id = member.id
player.save()
return True
return False
# Attempt to sync users
need_sync = Player.objects.filter(discord_id__isnull=True)
need_sync_count = need_sync.count()
synced = []
not_synced = []
if need_sync_count > 0:
for ns in need_sync:
if sync_player(ns):
synced.append(ns.username)
else:
not_synced.append(ns.username)
txt = "Synced\n\t{}\n\nNot Synced\n\t{}".format('\n\t'.join(synced), '\n\t'.join(not_synced))
attach = discord.File(fp=StringIO(txt), filename="sync.txt")
await ctx.channel.send(content="Successfully synced {}/{} players.".format(len(synced), need_sync_count), file=attach)
def setup(bot): def setup(bot):
bot.add_cog(Commands(bot)) bot.add_cog(Commands(bot))

View File

@ -24,8 +24,10 @@ class Discord(commands.Bot):
error_users = getattr(settings, 'DISCORD_ERROR_USERS', []) error_users = getattr(settings, 'DISCORD_ERROR_USERS', [])
def __init__(self, token): def __init__(self, token):
intents = discord.Intents.default()
intents.members = True
super().__init__(command_prefix=self.prefix, description=description, case_insensitive=True, help_command=None, super().__init__(command_prefix=self.prefix, description=description, case_insensitive=True, help_command=None,
activity=discord.Game(name=self.discord_game)) activity=discord.Game(name=self.discord_game), intents=intents)
self.token = token self.token = token
self.load_extension("minecraft_manager.bot.commands") self.load_extension("minecraft_manager.bot.commands")
@ -91,5 +93,5 @@ class Discord(commands.Bot):
print(e) print(e)
logger.info('Bot encountered the following unhandled exception %s', e) logger.info('Bot encountered the following unhandled exception %s', e)
finally: finally:
loop.run_until_complete(self.logout()) loop.run_until_complete(self.close())
logger.info("Bot shutting down...") logger.info("Bot shutting down...")

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.3 on 2021-07-20 23:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('minecraft_manager', '0016_auto_20210328_0131'),
]
operations = [
migrations.AddField(
model_name='player',
name='discord_id',
field=models.CharField(blank=True, max_length=30, null=True, unique=True),
),
]

View File

@ -1,11 +1,11 @@
import json import json
import logging import logging
import os import os
import pytz
import yaml
from datetime import datetime from datetime import datetime
from os.path import basename from os.path import basename
import pytz
import yaml
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import models from django.db import models
@ -105,7 +105,7 @@ class Player(models.Model):
application = models.ForeignKey(Application, on_delete=models.SET_NULL, null=True, blank=True) application = models.ForeignKey(Application, on_delete=models.SET_NULL, null=True, blank=True)
first_seen = models.DateField(null=True, blank=True) first_seen = models.DateField(null=True, blank=True)
last_seen = models.DateField(null=True, blank=True) last_seen = models.DateField(null=True, blank=True)
discord_id = models.CharField(max_length=30, unique=True, null=True, blank=True)
@property @property
def is_banned(self): def is_banned(self):

View File

@ -7,6 +7,7 @@
<div class="row"> <div class="row">
<div class="col-xs-9 col-md-6"> <div class="col-xs-9 col-md-6">
<p>UUID: <code>{{ player.uuid }}</code> <button data-copy="{{ player.uuid }}" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-copy"></i></button></p> <p>UUID: <code>{{ player.uuid }}</code> <button data-copy="{{ player.uuid }}" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-copy"></i></button></p>
<p>Discord ID: {% if player.discord_id %}<code>{{ player.discord_id }}</code> <button data-copy="{{ player.discord_id }}" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-copy"></i></button>{% else %}N/A{% endif %}</p>
{% if player.auth_user %} {% if player.auth_user %}
<p>Connected User: {{ player.auth_user.username }}</p> <p>Connected User: {{ player.auth_user.username }}</p>
{% endif %} {% endif %}