2018-05-05 20:51:20 -08:00

175 lines
8.7 KiB
Python

import discord
from discord.ext import commands
from .imports import checks, utils
import json
import logging
import inspect
admin_log = logging.getLogger('admin')
config_dir = 'config/'
bot_config_file = 'bot_config.json'
class Admin:
def __init__(self, bot):
self.bot = bot
@commands.group(case_insensitive=True)
async def set(self, ctx):
"""Run help set for more info"""
pass
@commands.group(case_insensitive=True)
async def add(self, ctx):
"""Run help set for more info"""
pass
@commands.group(case_insensitive=True)
async def remove(self, ctx):
"""Run help set for more info"""
pass
@commands.command(hidden=True)
@commands.check(checks.is_guild_owner)
async def get_guild_config(self, ctx):
config = self.bot.db_con.fetchval('select * from guild_config where guild_id = $1', ctx.guild.id)
configs = [str(config)[i:i+1990] for i in range(0, len(config), 1990)]
await ctx.message.author.send(f'The current config for the {ctx.guild.name} guild is:\n')
admin_log.info(configs)
for config in configs:
await ctx.message.author.send(f'```{config}```')
await ctx.send(f'{ctx.message.author.mention} check your DMs.')
@commands.command(hidden=True)
@commands.is_owner()
async def get_bot_config(self, ctx):
n = 2000
config = [str(self.bot.bot_config)[i:i+n] for i in range(0, len(str(self.bot.bot_config)), n)]
for conf in config:
await ctx.message.author.send(conf)
await ctx.send(f'{ctx.message.author.mention} check your DMs.')
@commands.command(hidden=True)
@commands.is_owner()
async def reload_bot_config(self, ctx):
with open(f'{config_dir}{bot_config_file}') as file:
self.bot.bot_config = json.load(file)
del self.bot.bot_config['token']
del self.bot.bot_config['db_con']
await ctx.send('Config reloaded.')
@set.command(name='channel_lockdown', aliases=['lockdown', 'restrict_access', 'cl'])
async def _channel_lockdown(self, ctx, config='true'):
if ctx.guild:
if checks.is_admin(self.bot, ctx):
if str(config).lower() == 'true':
if self.bot.db_con.fetchval('select allowed_channels from guild_config where guild_id = $1',
ctx.guild.id) is []:
await ctx.send('Please set at least one allowed channel before running this command.')
else:
self.bot.db_con.execute('update guild_config set channel_lockdown = True where guild_id = $1',
ctx.guild.id)
await ctx.send('Channel Lockdown is now active.')
elif str(config).lower() == 'false':
if self.bot.db_con.fetchval('select channel_lockdown from guild_config where guild_id = $1',
ctx.guild.id):
self.bot.db_con.execute('update guild_config set channel_lockdown = False where guild_id = $1',
ctx.guild.id)
await ctx.send('Channel Lockdown has been deactivated.')
else:
await ctx.send('Channel Lockdown is already deactivated.')
else:
await ctx.send(f'You are not authorized to run this command.')
else:
await ctx.send('This command must be run from inside a guild.')
@add.command(name='allowed_channels', aliases=['channel', 'ac'])
async def _allowed_channels(self, ctx, *, channels):
if ctx.guild:
if checks.is_admin(self.bot, ctx):
channels = channels.lower().replace(' ', '').split(',')
added = ''
for channel in channels:
chnl = discord.utils.get(ctx.guild.channels, name=channel)
if chnl is None:
await ctx.send(f'{channel} is not a valid text channel in this guild.')
else:
admin_log.info('Chan found')
if self.bot.db_con.fetchval('select allowed_channels from guild_config where guild_id = $1',
ctx.guild.id):
if chnl.id in self.bot.con.fetchval('select allowed_channels from guild_config '
'where guild_id = $1',
ctx.guild.id):
admin_log.info('Chan found in config')
await ctx.send(f'{channel} is already in the list of allowed channels. Skipping...')
else:
admin_log.info('Chan not found in config')
allowed_channels = self.bot.db_con.fetchval('select allowed_channels from '
'guild_config where guild_id = $1',
ctx.guild.id).append(chnl.id)
self.bot.db_con.execute('update guild_config set allowed_channels = $2 '
'where guild_id = $1',
ctx.guild.id, allowed_channels)
added = f'{added}\n{channel}'
else:
admin_log.info('Chan not found in config')
allowed_channels = [chnl.id]
self.bot.db_con.execute('update guild_config set allowed_channels = $2 '
'where guild_id = $1',
ctx.guild.id, allowed_channels)
added = f'{added}\n{channel}'
if added != '':
await ctx.send(f'The following channels have been added to the allowed channel list: {added}')
await ctx.message.add_reaction('')
else:
await ctx.send(f'You are not authorized to run this command.')
else:
await ctx.send('This command must be run from inside a guild.')
@commands.command()
@commands.is_owner()
async def view_code(self, ctx, code_name):
pages = utils.paginate(inspect.getsource(self.bot.get_command(code_name).callback))
for page in pages:
await ctx.send(page)
@add.command(name='admin_role', aliases=['admin'])
@commands.cooldown(1, 5, type=commands.BucketType.guild)
@commands.check(checks.is_guild_owner)
async def _add_admin_role(self, ctx, role=None):
role = discord.utils.get(ctx.guild.roles, name=role)
if role is not None:
roles = self.bot.db_con.fetchval('select admin_roles from guild_config where guild_id = $1',
ctx.guild.id)
if role.id in roles:
await ctx.send(f'{role.name} is already registered as an admin role in this guild.')
else:
roles.append(role.id)
self.bot.db_con.execute('update guild_config set admin_roles = $2 where guild_id = $1',
ctx.guild.id, roles)
await ctx.send(f'{role.name} has been added to the list of admin roles for this guild.')
else:
await ctx.send('You must include a valid role name with this command.')
@remove.command(name='admin_role', aliases=['admin'])
@commands.cooldown(1, 5, type=commands.BucketType.guild)
@commands.check(checks.is_guild_owner)
async def _remove_admin_role(self, ctx, role=None):
role = discord.utils.get(ctx.guild.roles, name=role)
if role is not None:
roles = self.bot.db_con.fetchval('select admin_roles from guild_config where guild_id = $1',
ctx.guild.id)
if role.id in roles:
roles.remove(role.id)
self.bot.db_con.execute('update guild_config set admin_roles = $2 where guild_id = $1',
ctx.guild.id, roles)
await ctx.send(f'{role.name} has been removed from the list of admin roles for this guild.')
else:
await ctx.send(f'{role.name} is not registered as an admin role in this guild.')
else:
await ctx.send('You must include a valid role name with this command.')
def setup(bot):
bot.add_cog(Admin(bot))