Added admin commands for managing the db

doc_update
Joey Hines 2018-08-11 11:20:40 -05:00
parent 5cb68fc208
commit fe30c9405f
8 changed files with 145 additions and 16 deletions

View File

@ -15,6 +15,7 @@ class Add_Commands:
self.bot = bot self.bot = bot
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def register(self, ctx): async def register(self, ctx):
''' '''
Registers your Discord and Minecraft account with the the database. Registers your Discord and Minecraft account with the the database.
@ -31,6 +32,7 @@ class Add_Commands:
await self.bot.say('{}, you are already in the database. Ding dong.'.format(ctx.message.author.mention)) await self.bot.say('{}, you are already in the database. Ding dong.'.format(ctx.message.author.mention))
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def add_base(self, ctx, x_pos: int, z_pos: int, *args): async def add_base(self, ctx, x_pos: int, z_pos: int, *args):
''' '''
Adds your base to the database. Adds your base to the database.
@ -55,6 +57,7 @@ class Add_Commands:
ctx.message.author.mention, name)) ctx.message.author.mention, name))
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def add_shop(self, ctx, x_pos: int, z_pos: int, *args): async def add_shop(self, ctx, x_pos: int, z_pos: int, *args):
''' '''
Adds your shop to the database. Adds your shop to the database.
@ -79,6 +82,7 @@ class Add_Commands:
ctx.message.author.mention, name)) ctx.message.author.mention, name))
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def add_tunnel(self, ctx, tunnel_color: str, tunnel_number: int, *args): async def add_tunnel(self, ctx, tunnel_color: str, tunnel_number: int, *args):
''' '''
Adds your tunnel to the database. If you only have one location, you do not need to specify a location name. Adds your tunnel to the database. If you only have one location, you do not need to specify a location name.
@ -104,6 +108,7 @@ class Add_Commands:
await self.bot.say('{}, **{}** is an invalid tunnel color.'.format(ctx.message.author.mention, tunnel_color)) await self.bot.say('{}, **{}** is an invalid tunnel color.'.format(ctx.message.author.mention, tunnel_color))
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def add_item(self, ctx, item_name: str, quantity: int, diamond_price: int, *args): async def add_item(self, ctx, item_name: str, quantity: int, diamond_price: int, *args):
''' '''
Adds an item to a shop's inventory. Adds an item to a shop's inventory.

View File

@ -1,9 +1,21 @@
from discord.ext import commands from discord.ext import commands
from BotErrors import * from BotErrors import *
from BotConfig import bot_config
from DiscordHelperFunctions import * from DiscordHelperFunctions import *
from Geoffrey import bot_commands from Geoffrey import bot_commands
def check_mod(user):
try:
for role in user.roles:
if role.id == bot_config.bot_mod:
return True
except AttributeError:
raise NotOnServerError
return False
class Admin_Commands: class Admin_Commands:
''' '''
Commands for cool people only. Commands for cool people only.
@ -12,26 +24,82 @@ class Admin_Commands:
def __init__(self, bot): def __init__(self, bot):
self.bot = bot self.bot = bot
def check_mod(self, user): async def error(self, error, ctx):
try: if isinstance(error.original, PlayerNotFound):
if ("admin" in [y.name.lower() for y in user.roles]) | \ error_str = 'that player is not in the database.'
("mod" in [y.name.lower() for y in user.roles]): elif isinstance(error.original, DeleteEntryError):
return True error_str = 'that player does not have a location by that name.'
else: else:
return False return
except AttributeError:
raise NotOnServerError await self.bot.send_message(ctx.message.channel, '{}, {}'.format(ctx.message.author.mention, error_str))
@commands.command(pass_context=True) @commands.command(pass_context=True)
async def test(self, ctx): async def test(self, ctx):
''' '''
Checks if the bot is alive. Checks if the bot is alive.
''' '''
if self.check_mod(ctx.message.author): if check_mod(ctx.message.author):
await self.bot.say('I\'m here you ding dong') await self.bot.say('I\'m here you ding dong')
else: else:
raise NoPermissionError raise NoPermissionError
@commands.group(pass_context=True)
async def mod(self, ctx):
if check_mod(ctx.message.author):
if ctx.invoked_subcommand is None:
await self.bot.say('{}, invalid sub-command for command **mod**.'.format(ctx.message.author.mention))
else:
raise NoPermissionError
@mod.command(pass_context=True)
async def delete(self, ctx, discord_uuid: str, location_name: str):
bot_commands.delete(location_name, discord_uuid=discord_uuid)
await self.bot.say('{}, **{}** has been deleted.'.format(ctx.message.author.mention, location_name))
@delete.error
async def delete_error(self, error, ctx):
await self.error(error, ctx)
@mod.command(pass_context=True)
async def edit(self, ctx, discord_uuid: str, new_name: str, current_name: str):
bot_commands.edit_name(new_name, current_name, discord_uuid=discord_uuid)
await self.bot.say('{}, **{}** has been rename to **{}**.'.format(ctx.message.author.mention, current_name,
new_name))
@edit.error
async def edit_error(self, error, ctx):
await self.error(error, ctx)
@mod.command(pass_context=True)
async def update_mc_uuid(self, ctx, discord_uuid: str, mc_uuid: str):
bot_commands.update_mc_uuid(discord_uuid, mc_uuid)
await self.bot.say('{}, **{}** has been updated.'.format(ctx.message.author.mention, discord_uuid))
@update_mc_uuid.error
async def update_mc_uuid_error(self, error, ctx):
await self.error(error, ctx)
@mod.command(pass_context=True)
async def update_discord_uuid(self, ctx, current_discord_uuid: str, new_discord_uuid: str):
bot_commands.update_mc_uuid(current_discord_uuid, new_discord_uuid)
await self.bot.say('{}, user **{}** has been updated.'.format(ctx.message.author.mention, current_discord_uuid))
@update_discord_uuid.error
async def update_discord_uuid_error(self, error, ctx):
await self.error(error, ctx)
@mod.command(pass_context=True)
async def update_mc_name(self, ctx, discord_uuid: str, mc_name: str):
bot_commands.update_mc_name(discord_uuid, mc_name)
await self.bot.say('{}, user **{}** has been renamed.'.format(ctx.message.author.mention, mc_name))
@update_mc_name.error
async def update_mc_name_error(self, error, ctx):
await self.error(error, ctx)
def setup(bot): def setup(bot):
bot.add_cog(Admin_Commands(bot)) bot.add_cog(Admin_Commands(bot))

View File

@ -12,6 +12,7 @@ class Config:
self.status = self.config['Discord']['Status'] self.status = self.config['Discord']['Status']
self.prefix = self.config['Discord']['Prefix'] self.prefix = self.config['Discord']['Prefix']
self.dynmap_url = self.config['Minecraft']['dynmap_url'] self.dynmap_url = self.config['Minecraft']['dynmap_url']
self.bot_mod = self.config['Discord']['bot_mod']
except: except:
print("Invalid config file") print("Invalid config file")
quit(1) quit(1)
@ -30,7 +31,7 @@ class Config:
def create_config(self, config): def create_config(self, config):
config['Discord'] = {'Token': '', 'Status': '', 'Prefix': '', } config['Discord'] = {'Token': '', 'Status': '', 'Prefix': '', }
config['SQL'] = {'Dialect+Driver': '', 'username': '', 'password': '', 'host': '', 'port': '', config['SQL'] = {'Dialect+Driver': '', 'username': '', 'password': '', 'host': '', 'port': '',
'database':'','test_args':''} 'database': '', 'bot_mod': ''}
config['Minecraft'] = {'World_Name': '', 'dynmap_url': ''} config['Minecraft'] = {'World_Name': '', 'dynmap_url': ''}
with open('GeoffreyConfig.ini', 'w') as configfile: with open('GeoffreyConfig.ini', 'w') as configfile:
config.write(configfile) config.write(configfile)

View File

@ -53,3 +53,5 @@ class NoPermissionError(DataBaseError):
class NotOnServerError(DataBaseError): class NotOnServerError(DataBaseError):
'''You need to run this command on 24CC''' '''You need to run this command on 24CC'''
class FuckyWucky:
'''You made one.'''

View File

@ -328,3 +328,49 @@ class Commands:
return loc_str return loc_str
def update_mc_uuid(self, mc_uuid, discord_uuid):
session = self.interface.database.Session()
try:
player = self.interface.find_player_by_discord_uuid(session, discord_uuid)
player.mc_uuid = mc_uuid
session.commit()
except Exception as e:
session.rollback()
raise e
finally:
session.close()
def update_discord_uuid(self, old_discord_uuid, new_discord_uuid):
session = self.interface.database.Session()
try:
player = self.interface.find_player_by_discord_uuid(session, old_discord_uuid)
player.discord_uuid = new_discord_uuid
session.commit()
except Exception as e:
session.rollback()
raise e
finally:
session.close()
def update_mc_name(self, discord_uuid, mc_name):
session = self.interface.database.Session()
try:
player = self.interface.find_player_by_discord_uuid(session, discord_uuid)
player.name = mc_name
session.commit()
except Exception as e:
session.rollback()
raise e
finally:
session.close()

View File

@ -4,13 +4,13 @@ from DiscordHelperFunctions import *
from Geoffrey import bot_commands from Geoffrey import bot_commands
@commands.cooldown(5, 60, commands.BucketType.user)
class Edit_Commands: class Edit_Commands:
def __init__(self, bot): def __init__(self, bot):
self.bot = bot self.bot = bot
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def edit_pos(self, ctx, x_pos: int, y_pos: int, *args): async def edit_pos(self, ctx, x_pos: int, y_pos: int, *args):
''' '''
Edits the position of a location Edits the position of a location
@ -27,8 +27,8 @@ class Edit_Commands:
await self.bot.say('{}, you do not have a location called **{}**.'.format( await self.bot.say('{}, you do not have a location called **{}**.'.format(
ctx.message.author.mention, loc)) ctx.message.author.mention, loc))
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def edit_tunnel(self, ctx, tunnel_color: str, tunnel_number: int, *args): async def edit_tunnel(self, ctx, tunnel_color: str, tunnel_number: int, *args):
''' '''
Edits the tunnel of a location Edits the tunnel of a location
@ -48,6 +48,7 @@ class Edit_Commands:
await self.bot.say('{}, **{}** is an invalid tunnel color.'.format(ctx.message.author.mention, tunnel_color)) await self.bot.say('{}, **{}** is an invalid tunnel color.'.format(ctx.message.author.mention, tunnel_color))
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def edit_name(self, ctx, new_name: str, current_name: str): async def edit_name(self, ctx, new_name: str, current_name: str):
''' '''
Edits the name of a location Edits the name of a location

View File

@ -36,6 +36,9 @@ async def on_ready():
@bot.event @bot.event
async def on_command_error(error, ctx): async def on_command_error(error, ctx):
if hasattr(ctx, 'cog'):
if "Admin_Commands" in ctx.cog.__str__():
return
if isinstance(error, commands.CommandNotFound): if isinstance(error, commands.CommandNotFound):
error_str = 'Command not found, ding dongs like you can use ?help to see all the commands this bot can do.' error_str = 'Command not found, ding dongs like you can use ?help to see all the commands this bot can do.'
elif isinstance(error, commands.CommandOnCooldown): elif isinstance(error, commands.CommandOnCooldown):

View File

@ -4,7 +4,6 @@ from DiscordHelperFunctions import *
from Geoffrey import bot_commands from Geoffrey import bot_commands
@commands.cooldown(5, 60, commands.BucketType.user)
class Search_Commands: class Search_Commands:
''' '''
Commands to find stuff. Commands to find stuff.
@ -14,6 +13,7 @@ class Search_Commands:
self.bot = bot self.bot = bot
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def find(self, ctx, * args): async def find(self, ctx, * args):
''' '''
Finds all the locations and tunnels matching the search term Finds all the locations and tunnels matching the search term
@ -33,6 +33,7 @@ class Search_Commands:
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def tunnel(self, ctx, player: str): async def tunnel(self, ctx, player: str):
''' '''
Finds all the tunnels a player owns. Finds all the tunnels a player owns.
@ -48,6 +49,7 @@ class Search_Commands:
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def find_around(self, ctx, x_pos: int, z_pos: int, * args): async def find_around(self, ctx, x_pos: int, z_pos: int, * args):
''' '''
Finds all the locations around a certain point. Finds all the locations around a certain point.
@ -90,6 +92,7 @@ class Search_Commands:
await self.bot.say('{}, {} is an invalid dimension.'.format(ctx.message.author.mention, dimension)) await self.bot.say('{}, {} is an invalid dimension.'.format(ctx.message.author.mention, dimension))
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def selling(self, ctx, item_name: str): async def selling(self, ctx, item_name: str):
''' '''
Lists all the shops selling an item Lists all the shops selling an item
@ -103,6 +106,7 @@ class Search_Commands:
await self.bot.say('{}, no shop sells **{}**.'.format(ctx.message.author.mention, item_name)) await self.bot.say('{}, no shop sells **{}**.'.format(ctx.message.author.mention, item_name))
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def info(self, ctx, * args): async def info(self, ctx, * args):
''' '''
Displays info about a location. Displays info about a location.
@ -123,11 +127,10 @@ class Search_Commands:
await self.bot.say('{}, no locations in the database match **{}**.'.format(ctx.message.author.mention, loc)) await self.bot.say('{}, no locations in the database match **{}**.'.format(ctx.message.author.mention, loc))
@commands.command(pass_context=True) @commands.command(pass_context=True)
@commands.cooldown(5, 60, commands.BucketType.user)
async def me(self, ctx): async def me(self, ctx):
''' '''
Displays all your locations in the database Displays all your locations in the database
?me
''' '''
try: try: