You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
7.0 KiB
187 lines
7.0 KiB
from typing import Dict, List
|
|
|
|
import discord
|
|
from discord.ext import commands
|
|
import logging
|
|
from datetime import datetime
|
|
import json
|
|
import aiohttp
|
|
from googleapiclient.discovery import build
|
|
from concurrent import futures
|
|
from shared_libs import database
|
|
|
|
|
|
log_format = '{asctime}.{msecs:03.0f}|{levelname:<8}|{name}::{message}'
|
|
date_format = '%Y.%m.%d %H.%M.%S'
|
|
|
|
log_dir = 'logs'
|
|
|
|
log_file = '{0}/geeksbot_{1}.log'.format(log_dir, datetime.now().strftime('%Y%m%d_%H%M%S%f'))
|
|
|
|
logging.basicConfig(level=logging.DEBUG, style='{', filename=log_file, datefmt=date_format, format=log_format)
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setLevel(logging.INFO)
|
|
formatter = logging.Formatter(log_format, style='{', datefmt=date_format)
|
|
console_handler.setFormatter(formatter)
|
|
logging.getLogger('').addHandler(console_handler)
|
|
|
|
config_dir = 'config/'
|
|
admin_id_file = 'admin_ids'
|
|
extension_dir = 'exts'
|
|
owner_id = 351794468870946827
|
|
bot_config_file = 'bot_config.json'
|
|
secrets_file = 'bot_secrets.json'
|
|
profane_words_file = 'profane_words'
|
|
|
|
emojis: Dict[str, str] = {
|
|
'x': '❌',
|
|
'y': '✅',
|
|
'poop': '💩',
|
|
'boom': '💥',
|
|
}
|
|
|
|
description = 'I am Geeksbot Dev! Fear me I might just break and take you with me :P'
|
|
|
|
|
|
class Geeksbot(commands.Bot):
|
|
def __init__(self, **kwargs):
|
|
kwargs["command_prefix"] = self.get_custom_prefix
|
|
super().__init__(**kwargs)
|
|
self.aio_session = aiohttp.ClientSession(loop=self.loop)
|
|
with open(f'{config_dir}{bot_config_file}') as file:
|
|
self.bot_config = json.load(file)
|
|
with open(f'{config_dir}{secrets_file}') as file:
|
|
self.bot_secrets = json.load(file)
|
|
# with open(f'{config_dir}{profane_words_file}') as file:
|
|
# self.profane_words = file.readlines()
|
|
self.guild_config = {}
|
|
self.infected = {}
|
|
self.TOKEN = self.bot_secrets['token']
|
|
self.embed_color = discord.Colour.from_rgb(49, 107, 111)
|
|
|
|
# async def connect_db():
|
|
# return await asyncpg.create_pool(host=self.bot_secrets['db_con']['host'],
|
|
# database=self.bot_secrets['db_con']['db_name'],
|
|
# user=self.bot_secrets['db_con']['user'],
|
|
# password=self.bot_secrets['db_con']['password'],
|
|
# loop=asyncio.get_event_loop())
|
|
del self.bot_secrets['token']
|
|
self.db_con = database.DatabaseConnection(**self.bot_secrets['db_con'])
|
|
self.default_prefix = 'g~'
|
|
self.voice_chans = {}
|
|
self.spam_list = {}
|
|
self.gcs_service = build('customsearch', 'v1', developerKey=self.bot_secrets['google_search_key'])
|
|
self.tpe = futures.ThreadPoolExecutor()
|
|
self.geo_api = '2d4e419c2be04c8abe91cb5dd1548c72'
|
|
self.unicode_emojis: Dict[str, str] = {
|
|
'x': '❌',
|
|
'y': '✅',
|
|
'poop': '💩',
|
|
'boom': '💥',
|
|
'left_fist': '🤛',
|
|
'lock': '🔒',
|
|
}
|
|
self.book_emojis: List[str] = [
|
|
'🔓',
|
|
'⏮',
|
|
'◀',
|
|
'#\N{COMBINING ENCLOSING KEYCAP}',
|
|
'▶',
|
|
'⏭',
|
|
'🇽',
|
|
]
|
|
|
|
async def logout(self):
|
|
await self.db_con.close()
|
|
super().logout()
|
|
|
|
@staticmethod
|
|
async def get_custom_prefix(bot_inst, message):
|
|
return await bot_inst.db_con.fetchval('select prefix from guild_config where guild_id = $1',
|
|
message.guild.id) or bot_inst.default_prefix
|
|
|
|
async def load_ext(self, ctx, mod=None):
|
|
self.load_extension('{0}.{1}'.format(extension_dir, mod))
|
|
if ctx is not None:
|
|
await ctx.send('{0} loaded.'.format(mod))
|
|
|
|
async def unload_ext(self, ctx, mod=None):
|
|
self.unload_extension('{0}.{1}'.format(extension_dir, mod))
|
|
if ctx is not None:
|
|
await ctx.send('{0} unloaded.'.format(mod))
|
|
|
|
async def close(self):
|
|
await super().close()
|
|
self.aio_session.close() # aiohttp is drunk and can't decide if it's a coro or not
|
|
|
|
|
|
bot = Geeksbot(description=description, case_insensitive=True)
|
|
|
|
|
|
@bot.command(hidden=True)
|
|
@commands.is_owner()
|
|
async def load(ctx, mod=None):
|
|
"""Allows the owner to load extensions dynamically"""
|
|
await bot.load_ext(ctx, mod)
|
|
|
|
|
|
@bot.command(hidden=True)
|
|
@commands.is_owner()
|
|
async def reload(ctx, mod=None):
|
|
"""Allows the owner to reload extensions dynamically"""
|
|
if mod == 'all':
|
|
load_list = bot.bot_config['load_list']
|
|
for load_item in load_list:
|
|
await bot.unload_ext(ctx, f'{load_item}')
|
|
await bot.load_ext(ctx, f'{load_item}')
|
|
else:
|
|
await bot.unload_ext(ctx, mod)
|
|
await bot.load_ext(ctx, mod)
|
|
|
|
|
|
@bot.command(hidden=True)
|
|
@commands.is_owner()
|
|
async def unload(ctx, mod):
|
|
"""Allows the owner to unload extensions dynamically"""
|
|
await bot.unload_ext(ctx, mod)
|
|
|
|
|
|
@bot.event
|
|
async def on_message(ctx):
|
|
if not ctx.author.bot:
|
|
if ctx.guild:
|
|
if int(await bot.db_con.fetchval("select channel_lockdown from guild_config where guild_id = $1",
|
|
ctx.guild.id)):
|
|
if ctx.channel.id in json.loads(await bot.db_con.fetchval("select allowed_channels from guild_config "
|
|
"where guild_id = $1",
|
|
ctx.guild.id)):
|
|
await bot.process_commands(ctx)
|
|
elif ctx.channel.id == 418452585683484680:
|
|
prefix = await bot.db_con.fetchval('select prefix from guild_config where guild_id = $1', ctx.guild.id)
|
|
prefix = prefix[0] if prefix else bot.default_prefix
|
|
ctx.content = f'{prefix}{ctx.content}'
|
|
await bot.process_commands(ctx)
|
|
else:
|
|
await bot.process_commands(ctx)
|
|
else:
|
|
await bot.process_commands(ctx)
|
|
|
|
|
|
@bot.event
|
|
async def on_ready():
|
|
bot.recent_msgs = {}
|
|
logging.info('Logged in as {0.name}|{0.id}'.format(bot.user))
|
|
load_list = bot.bot_config['load_list']
|
|
for load_item in load_list:
|
|
await bot.load_ext(None, f'{load_item}')
|
|
logging.info('Extension Loaded: {0}'.format(load_item))
|
|
with open(f'{config_dir}reboot', 'r') as f:
|
|
reboot = f.readlines()
|
|
if int(reboot[0]) == 1:
|
|
await bot.get_channel(int(reboot[1])).send('Restart Finished.')
|
|
with open(f'{config_dir}reboot', 'w') as f:
|
|
f.write(f'0')
|
|
logging.info('Done loading, Geeksbot is active.')
|
|
|
|
bot.run(bot.TOKEN)
|