166 lines
5.9 KiB
Python
166 lines
5.9 KiB
Python
import json
|
|
import os
|
|
import discord
|
|
import random
|
|
import asyncio
|
|
import re
|
|
from discord.ext import commands
|
|
|
|
|
|
def get_token():
|
|
with open("config.php", "r") as file:
|
|
content = file.read()
|
|
match = re.search(r"bottoken\s*=\s*'(.+?)'", content)
|
|
if match:
|
|
return match.group(1)
|
|
return None
|
|
|
|
token = get_token()
|
|
if not token:
|
|
raise ValueError("Bot token niet gevonden in config.php")
|
|
|
|
# Intents instellen
|
|
intents = discord.Intents.default()
|
|
intents.voice_states = True
|
|
intents.guilds = True
|
|
intents.messages = True
|
|
intents.message_content = True
|
|
intents.presences = True # Nodig als de bot presences moet zien
|
|
intents.members = True # Nodig om leden in een voice channel te zien
|
|
|
|
bot = commands.Bot(command_prefix="!", intents=intents)
|
|
|
|
@bot.event
|
|
async def on_ready():
|
|
print(f'Bot is ingelogd als {bot.user}')
|
|
|
|
@bot.command()
|
|
async def teamify(ctx, *args):
|
|
for arg in args:
|
|
if arg.lower() == "help":
|
|
help_message = (
|
|
"**Gebruik van !teamify:**\n"
|
|
"`!teamify` - Verdeel spelers in teams van max. 4 personen.\n"
|
|
"`!teamify <aantal_teams>` - Verdeel spelers in een opgegeven aantal teams.\n"
|
|
"`!teamify <aantal_teams> move` - Verdeel spelers en verplaats ze naar tijdelijke voice-kanalen.\n"
|
|
"`!teamify move` - Verdeel spelers automatisch en verplaats ze naar tijdelijke voice-kanalen."
|
|
)
|
|
await ctx.send(help_message)
|
|
return
|
|
|
|
# Beperk het commando tot alleen het kanaal "teamify"
|
|
if ctx.channel.name != "teamify":
|
|
await ctx.send("Dit commando kan alleen worden gebruikt in het #teamify kanaal.")
|
|
return
|
|
|
|
guild = ctx.guild
|
|
voice_channel = discord.utils.get(guild.voice_channels, name="teamify")
|
|
|
|
if not voice_channel or len(voice_channel.members) == 0:
|
|
await ctx.send("Er zijn geen mensen in het kanaal 'teamify' om teams van te maken!")
|
|
return
|
|
|
|
members = voice_channel.members
|
|
random.shuffle(members)
|
|
|
|
# Standaardwaarden
|
|
num_teams = 0
|
|
move_players = False
|
|
|
|
# Verwerk argumenten
|
|
for arg in args:
|
|
if arg.isdigit(): # Als het een getal is, gebruik het als het aantal teams
|
|
num_teams = int(arg)
|
|
elif arg.lower() == "move": # Als 'true' is opgegeven, verplaats spelers
|
|
move_players = True
|
|
|
|
# Bepaal het aantal teams als niet opgegeven
|
|
if num_teams <= 0:
|
|
num_teams = len(members) // 4 if len(members) >= 4 else 1
|
|
|
|
num_teams = min(num_teams, len(members))
|
|
teams = [[] for _ in range(num_teams)]
|
|
for i, member in enumerate(members):
|
|
teams[i % num_teams].append(member)
|
|
|
|
# Zoek het tekstkanaal "teamify"
|
|
text_channel = discord.utils.get(guild.text_channels, name="teamify")
|
|
if not text_channel:
|
|
await ctx.send("Het kanaal 'teamify' bestaat niet!")
|
|
return
|
|
|
|
message = f"Willekeurige teams uit {voice_channel.name}:\n\n"
|
|
category = discord.utils.get(guild.categories, name="Temporary Teams")
|
|
if not category:
|
|
category = await guild.create_category("Temporary Teams")
|
|
|
|
temp_channels = []
|
|
|
|
for i, team in enumerate(teams, start=1):
|
|
team_names = ', '.join([member.mention for member in team])
|
|
message += f"**Team {i}:** {team_names}\n"
|
|
|
|
if move_players:
|
|
temp_channel = await guild.create_voice_channel(f"Squad {i}", category=category)
|
|
temp_channels.append(temp_channel)
|
|
for member in team:
|
|
await member.move_to(temp_channel)
|
|
|
|
await text_channel.send(message)
|
|
await ctx.send("Teams zijn gepost in #teamify!" + (" Spelers zijn verplaatst naar tijdelijke kanalen." if move_players else ""))
|
|
|
|
# Controleer continu of de kanalen leeg zijn en verwijder ze
|
|
if move_players:
|
|
while temp_channels:
|
|
await asyncio.sleep(60) # Controleer elke minuut
|
|
for channel in temp_channels[:]:
|
|
if len(channel.members) == 0:
|
|
if channel in guild.voice_channels: # Controleer of het kanaal nog bestaat
|
|
await channel.delete()
|
|
temp_channels.remove(channel)
|
|
await ctx.send(f"Kanaal {channel.name} is opgeruimd omdat het leeg was!")
|
|
|
|
@bot.command()
|
|
async def whoisbest(ctx, category="Casual"):
|
|
# Bestandspad
|
|
file_path = os.path.join("..", "data", "player_last_stats.json")
|
|
|
|
try:
|
|
# JSON-bestand lezen
|
|
with open(file_path, "r", encoding="utf-8") as file:
|
|
data = json.load(file)
|
|
|
|
available_categories = list(data.keys())
|
|
|
|
if category not in data:
|
|
await ctx.send(f"Ongeldige categorie '{category}'! Beschikbare categorieën: {', '.join(available_categories)}")
|
|
return
|
|
|
|
players = [player for player in data.get(category, []) if player.get("matches", 0) >= 18]
|
|
|
|
if not players:
|
|
await ctx.send(f"Geen spelersstatistieken gevonden voor '{category}' met minimaal 18 gespeelde matches!")
|
|
return
|
|
|
|
# Sorteer spelers op winratio (aflopend)
|
|
top_winratio = sorted(players, key=lambda x: x.get("winratio", 0), reverse=True)[:3]
|
|
|
|
# Sorteer spelers op gemiddelde damage (aflopend)
|
|
top_ahd = sorted(players, key=lambda x: x.get("ahd", 0), reverse=True)[:3]
|
|
|
|
# Bouw het bericht op
|
|
message = f"**\U0001F3C6 Top 3 Winratio ({category})**\n"
|
|
for i, player in enumerate(top_winratio, start=1):
|
|
message += f"{i}. **{player['playername']}** - {player['winratio']:.2f}%\n"
|
|
|
|
message += f"\n**\U0001F480 Top 3 AHD ({category})**\n"
|
|
for i, player in enumerate(top_ahd, start=1):
|
|
message += f"{i}. **{player['playername']}** - {player['ahd']:.2f}\n"
|
|
|
|
await ctx.send(message)
|
|
|
|
except Exception as e:
|
|
await ctx.send(f"Fout bij het laden van de statistieken: {str(e)}")
|
|
|
|
|
|
bot.run(token)
|