All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import asyncio
 | 
						|
import inspect
 | 
						|
import itertools
 | 
						|
import logging
 | 
						|
import os
 | 
						|
import re
 | 
						|
 | 
						|
import discord
 | 
						|
from discord.ext import commands
 | 
						|
 | 
						|
import lib
 | 
						|
import heavynode
 | 
						|
 | 
						|
 | 
						|
DISCORD_TOKEN = lib.getconfig('DISCORD_TOKEN')
 | 
						|
HEAVYNODE_TOKEN = lib.getconfig('HEAVYNODE_TOKEN')
 | 
						|
COOKIE_NAME = lib.getconfig('HEAVYNODE_COOKIE_NAME')
 | 
						|
COOKIE_VALUE = lib.getconfig('HEAVYNODE_COOKIE_VALUE')
 | 
						|
 | 
						|
 | 
						|
logging.basicConfig()
 | 
						|
 | 
						|
intents = discord.Intents.default()
 | 
						|
intents.members = True
 | 
						|
bot = lib.MineBot(command_prefix='!', intents=intents)
 | 
						|
 | 
						|
hn = heavynode.Client(HEAVYNODE_TOKEN, COOKIE_NAME, COOKIE_VALUE)
 | 
						|
bot.add_cleanup(hn.shutdown)
 | 
						|
 | 
						|
 | 
						|
async def is_admin(ctx):
 | 
						|
    user = ctx.message.author
 | 
						|
    member = bot.guilds[0].get_member(user.id)
 | 
						|
    if member is not None:
 | 
						|
        for role in member.roles:
 | 
						|
            if role.name == 'Admin' or role.name == 'Mod':
 | 
						|
                return True
 | 
						|
    return False
 | 
						|
 | 
						|
 | 
						|
async def whitelist_cmd(action, player):
 | 
						|
    expr = re.compile(f'\[Server thread/INFO\]: .*({player}|player).*(whitelist(ed)?|exist)', re.IGNORECASE)
 | 
						|
    resp = await hn.cmd_with_response(f'whitelist {action} {player}', expr)
 | 
						|
    _, msg = resp.split('[Server thread/INFO]: ')
 | 
						|
    return msg
 | 
						|
 | 
						|
 | 
						|
@bot.command()
 | 
						|
@commands.check(is_admin)
 | 
						|
async def add(ctx, player):
 | 
						|
    """Add a player to the server whitelist. Must use exact Minecraft name."""
 | 
						|
    msg = await whitelist_cmd('add', player)
 | 
						|
    await ctx.send(msg)
 | 
						|
 | 
						|
 | 
						|
@bot.command()
 | 
						|
@commands.check(is_admin)
 | 
						|
async def remove(ctx, player):
 | 
						|
    """Remove a player from the server whitelist. Must use exact Minecraft name."""
 | 
						|
    msg = await whitelist_cmd('remove', player)
 | 
						|
    await ctx.send(msg + '.')
 | 
						|
 | 
						|
 | 
						|
@add.error
 | 
						|
@remove.error
 | 
						|
async def whitelist_error(ctx, error):
 | 
						|
    if isinstance(error, commands.CheckFailure):
 | 
						|
        await ctx.send('You must be a server admin to use this command.')
 | 
						|
    elif isinstance(error.original, (heavynode.HttpError, heavynode.GenericError)):
 | 
						|
        await ctx.send('Failed to communicate with server.')
 | 
						|
    elif isinstance(error.original, asyncio.exceptions.TimeoutError):
 | 
						|
        await ctx.send('Command sent; response inconclusive. Check server output for more information.')
 | 
						|
    elif isinstance(error.original, ValueError):
 | 
						|
        await ctx.send('Command sent; could not interpret server response.')
 | 
						|
    else:
 | 
						|
        raise error
 | 
						|
 | 
						|
 | 
						|
bot.run(DISCORD_TOKEN, reconnect=True)
 |