Also moved cogs into their own folder
parent
48e39b18d9
commit
f82aac5f56
84
BotConfig.py
84
BotConfig.py
|
@ -1,59 +1,67 @@
|
||||||
import configparser
|
import configparser
|
||||||
|
|
||||||
|
|
||||||
class Config:
|
def create_config(config):
|
||||||
|
config['Discord'] = {'Token': '',
|
||||||
|
'Status': '',
|
||||||
|
'Prefix': '?',
|
||||||
|
'Bot_Mod': ''
|
||||||
|
}
|
||||||
|
config['SQL'] = {'Dialect+Driver': 'mysql+mysqldb',
|
||||||
|
'Username': '',
|
||||||
|
'Password': '',
|
||||||
|
'Host': '',
|
||||||
|
'Port': '',
|
||||||
|
'Database': ''
|
||||||
|
}
|
||||||
|
config['Minecraft'] = {'Dynmap_Url': '',
|
||||||
|
'World_Name': ''
|
||||||
|
}
|
||||||
|
config['Logging'] = {'Count': '',
|
||||||
|
'Rotation_Duration': ''
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self):
|
with open('GeoffreyConfig.ini', 'w') as configfile:
|
||||||
self.config = ''
|
config.write(configfile)
|
||||||
self.engine_args = ''
|
|
||||||
self.token = ''
|
|
||||||
self.world_name = ''
|
|
||||||
self.status = ''
|
|
||||||
self.prefix = ''
|
|
||||||
self.dynmap_url = ''
|
|
||||||
self.bot_mod = ''
|
|
||||||
self.load_config()
|
|
||||||
|
|
||||||
def load_config(self):
|
|
||||||
try:
|
|
||||||
self.config = self.read_config()
|
|
||||||
self.engine_args = self.read_engine_arg()
|
|
||||||
self.token = self.config['Discord']['Token']
|
|
||||||
self.world_name = self.config['Minecraft']['World_Name']
|
|
||||||
self.status = self.config['Discord']['Status']
|
|
||||||
self.prefix = self.config['Discord']['Prefix']
|
|
||||||
self.dynmap_url = self.config['Minecraft']['dynmap_url']
|
|
||||||
self.bot_mod = self.config['Discord']['bot_mod']
|
|
||||||
except:
|
|
||||||
print("Invalid config file")
|
|
||||||
quit(1)
|
|
||||||
|
|
||||||
def read_config(self):
|
def read_config():
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config.read('GeoffreyConfig.ini')
|
config.read('GeoffreyConfig.ini')
|
||||||
|
|
||||||
if len(config.sections()) == 0:
|
if len(config.sections()) == 0:
|
||||||
self.create_config(config)
|
create_config(config)
|
||||||
print("GeoffreyConfig.ini generated.")
|
print("GeoffreyConfig.ini generated.")
|
||||||
quit(0)
|
quit(0)
|
||||||
|
|
||||||
return config
|
return config
|
||||||
|
|
||||||
def create_config(self, config):
|
|
||||||
config['Discord'] = {'Token': '', 'Status': '', 'Prefix': '', }
|
class Config:
|
||||||
config['SQL'] = {'Dialect+Driver': '', 'username': '', 'password': '', 'host': '', 'port': '',
|
|
||||||
'database': '', 'bot_mod': ''}
|
def __init__(self):
|
||||||
config['Minecraft'] = {'World_Name': '', 'dynmap_url': ''}
|
try:
|
||||||
with open('GeoffreyConfig.ini', 'w') as configfile:
|
self.config = read_config()
|
||||||
config.write(configfile)
|
self.engine_args = self.read_engine_arg()
|
||||||
|
self.token = self.config['Discord']['Token']
|
||||||
|
self.world_name = self.config['Minecraft']['World_Name']
|
||||||
|
self.status = self.config['Discord']['Status']
|
||||||
|
self.prefix = self.config['Discord']['Prefix']
|
||||||
|
self.dynmap_url = self.config['Minecraft']['Dynmap_Url']
|
||||||
|
self.bot_mod = self.config['Discord']['Bot_Mod']
|
||||||
|
self.count = int(self.config['Logging']['Count'])
|
||||||
|
self.rotation_duration = int(self.config['Logging']['Rotation_Duration'])
|
||||||
|
except Exception as e:
|
||||||
|
print("Invalid config file, missing {}.".format(e))
|
||||||
|
quit(1)
|
||||||
|
|
||||||
def read_engine_arg(self):
|
def read_engine_arg(self):
|
||||||
driver = self.config['SQL']['Dialect+Driver']
|
driver = self.config['SQL']['Dialect+Driver']
|
||||||
username = self.config['SQL']['username']
|
username = self.config['SQL']['Username']
|
||||||
password = self.config['SQL']['password']
|
password = self.config['SQL']['Password']
|
||||||
host = self.config['SQL']['host']
|
host = self.config['SQL']['Host']
|
||||||
port = self.config['SQL']['port']
|
port = self.config['SQL']['Port']
|
||||||
database_name = self.config['SQL']['database']
|
database_name = self.config['SQL']['Database']
|
||||||
|
|
||||||
engine_args = '{}://{}:{}@{}:{}/{}?charset=utf8mb4&use_unicode=1'
|
engine_args = '{}://{}:{}@{}:{}/{}?charset=utf8mb4&use_unicode=1'
|
||||||
|
|
||||||
|
|
125
Geoffrey.py
125
Geoffrey.py
|
@ -1,118 +1,35 @@
|
||||||
from discord.ext import commands
|
""""
|
||||||
from discord import Game
|
Geoffrey Minecraft Info Database
|
||||||
from Commands import *
|
|
||||||
from BotErrors import *
|
|
||||||
from MinecraftAccountInfoGrabber import *
|
|
||||||
from BotConfig import *
|
|
||||||
import asyncio
|
|
||||||
|
|
||||||
description = '''
|
Created by: Joey Hines (ZeroHD)
|
||||||
Geoffrey (pronounced JOFF-ree) started his life as an inside joke none of you will understand.
|
|
||||||
At some point, she was to become an airhorn bot. Now, they know where your stuff is.
|
|
||||||
|
|
||||||
Please respect Geoffrey, the bot is very sensitive.
|
"""
|
||||||
|
import logging
|
||||||
If have a suggestion or if something is borked, you can PM my ding dong of a creator ZeroHD.
|
import logging.handlers as handlers
|
||||||
|
from bot import start_bot
|
||||||
*You must use ?register before adding things to Geoffrey*
|
from BotConfig import bot_config
|
||||||
'''
|
|
||||||
|
|
||||||
bad_error_message = 'OOPSIE WOOPSIE!! Uwu We made a fucky wucky!! A wittle fucko boingo! The admins at our ' \
|
|
||||||
'headquarters are working VEWY HAWD to fix this! (Error in command {}: {})'
|
|
||||||
|
|
||||||
|
|
||||||
# Bot Commands ******************************************************************'
|
def setup_logging():
|
||||||
bot = commands.Bot(command_prefix=bot_config.prefix, description=description, case_insensitive=True)
|
|
||||||
|
|
||||||
|
discord_logger = logging.getLogger('discord')
|
||||||
|
discord_logger.setLevel(logging.DEBUG)
|
||||||
|
sql_logger = logging.getLogger('sqlalchemy.engine')
|
||||||
|
sql_logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
@bot.event
|
handler = handlers.TimedRotatingFileHandler(filename='Geoffrey.log', when='D',
|
||||||
async def on_ready():
|
interval=bot_config.rotation_duration, backupCount=bot_config.count,
|
||||||
print('GeoffreyBot')
|
encoding='utf-8')
|
||||||
print('Username: ' + bot.user.name)
|
|
||||||
print('ID: ' + bot.user.id)
|
|
||||||
|
|
||||||
await bot.change_presence(game=Game(name=bot_config.status))
|
handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))
|
||||||
|
|
||||||
|
discord_logger.addHandler(handler)
|
||||||
|
sql_logger.addHandler(handler)
|
||||||
|
|
||||||
@bot.event
|
|
||||||
async def on_command_error(error, ctx):
|
|
||||||
if hasattr(ctx, 'cog'):
|
|
||||||
if "Admin_Commands" in ctx.cog.__str__():
|
|
||||||
return
|
|
||||||
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.'
|
|
||||||
elif isinstance(error, commands.CommandOnCooldown):
|
|
||||||
return
|
|
||||||
elif isinstance(error, commands.UserInputError):
|
|
||||||
error_str = 'Invalid syntax for **{}** you ding dong, please read ?help {}.'\
|
|
||||||
.format(ctx.invoked_with, ctx.invoked_with)
|
|
||||||
elif isinstance(error.original, NoPermissionError):
|
|
||||||
error_str = 'You don\'t have permission for that cool command.'
|
|
||||||
elif isinstance(error.original, UsernameLookupFailed):
|
|
||||||
error_str = 'Your user name was not found, either Mojang is having a fucky wucky ' \
|
|
||||||
'or your nickname is not set correctly. *stares at the Mods*'
|
|
||||||
elif isinstance(error.original, PlayerNotFound):
|
|
||||||
error_str = 'Make sure to use ?register first you ding dong.'
|
|
||||||
elif isinstance(error.original, EntryNameNotUniqueError):
|
|
||||||
error_str = 'An entry in the database already has that name ding dong.'
|
|
||||||
elif isinstance(error.original, DatabaseValueError):
|
|
||||||
error_str = 'Use a shorter name or a smaller value, dong ding.'
|
|
||||||
elif isinstance(error.original, NotOnServerError):
|
|
||||||
error_str = 'Command needs to be run on 24CC. Run this command there whoever you are.'.format()
|
|
||||||
else:
|
|
||||||
error_str = bad_error_message.format(ctx.invoked_with, error)
|
|
||||||
|
|
||||||
await bot.send_message(ctx.message.channel, '{} **Error Running Command:** {}'.format(ctx.message.author.mention,
|
|
||||||
error_str))
|
|
||||||
|
|
||||||
|
|
||||||
async def username_update():
|
|
||||||
session = None
|
|
||||||
await bot.wait_until_ready()
|
|
||||||
while not bot.is_closed:
|
|
||||||
session = bot_commands.interface.database.Session()
|
|
||||||
try:
|
|
||||||
print("Updating MC usernames...")
|
|
||||||
session = bot_commands.interface.database.Session()
|
|
||||||
player_list = session.query(Player).all()
|
|
||||||
for player in player_list:
|
|
||||||
player.name = grab_playername(player.mc_uuid)
|
|
||||||
|
|
||||||
session.commit()
|
|
||||||
|
|
||||||
await asyncio.sleep(600)
|
|
||||||
|
|
||||||
except UsernameLookupFailed:
|
|
||||||
print("Username lookup error, are Mojang's servers down?")
|
|
||||||
session.rollback()
|
|
||||||
finally:
|
|
||||||
print("Done.")
|
|
||||||
session.close()
|
|
||||||
|
|
||||||
if session is not None:
|
|
||||||
session.close()
|
|
||||||
|
|
||||||
# Bot Startup ******************************************************************
|
|
||||||
bot_commands = Commands()
|
|
||||||
|
|
||||||
extensions = ['Add_Commands', 'Delete_Commands', 'Edit_Commands', 'Search_Commands', 'Admin_Commands']
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
bot_commands = Commands()
|
setup_logging()
|
||||||
|
start_bot()
|
||||||
for extension in extensions:
|
|
||||||
try:
|
|
||||||
bot.load_extension(extension)
|
|
||||||
except Exception as e:
|
|
||||||
print('Failed to load extension {}, {}'.format(extension, e))
|
|
||||||
|
|
||||||
try:
|
|
||||||
bot.loop.create_task(username_update())
|
|
||||||
bot.run(bot_config.token)
|
|
||||||
except TimeoutError:
|
|
||||||
print("Disconnected, is Discord offline?")
|
|
||||||
except:
|
|
||||||
print("Bye")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
from BotErrors import *
|
||||||
|
from DatabaseModels import Player
|
||||||
|
from Commands import Commands
|
||||||
|
from discord.ext import commands
|
||||||
|
from discord import Game
|
||||||
|
from MinecraftAccountInfoGrabber import *
|
||||||
|
from BotConfig import *
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
description = '''
|
||||||
|
Geoffrey (pronounced JOFF-ree) started his life as an inside joke none of you will understand.
|
||||||
|
At some point, she was to become an airhorn bot. Now, they know where your stuff is.
|
||||||
|
|
||||||
|
Please respect Geoffrey, the bot is very sensitive.
|
||||||
|
|
||||||
|
If have a suggestion or if something is borked, you can PM my ding dong of a creator ZeroHD.
|
||||||
|
|
||||||
|
*You must use ?register before adding things to Geoffrey*
|
||||||
|
'''
|
||||||
|
|
||||||
|
bad_error_message = 'OOPSIE WOOPSIE!! Uwu We made a fucky wucky!! A wittle fucko boingo! The admins at our ' \
|
||||||
|
'headquarters are working VEWY HAWD to fix this! (Error in command {}: {})'
|
||||||
|
|
||||||
|
|
||||||
|
bot = commands.Bot(command_prefix=bot_config.prefix, description=description, case_insensitive=True)
|
||||||
|
bot_commands = Commands()
|
||||||
|
|
||||||
|
extensions = ['cogs.Add_Commands',
|
||||||
|
'cogs.Delete_Commands',
|
||||||
|
'cogs.Edit_Commands',
|
||||||
|
'cogs.Search_Commands',
|
||||||
|
'cogs.Admin_Commands']
|
||||||
|
|
||||||
|
|
||||||
|
@bot.event
|
||||||
|
async def on_ready():
|
||||||
|
print('GeoffreyBot')
|
||||||
|
print('Username: ' + bot.user.name)
|
||||||
|
print('ID: ' + bot.user.id)
|
||||||
|
|
||||||
|
await bot.change_presence(game=Game(name=bot_config.status))
|
||||||
|
|
||||||
|
|
||||||
|
@bot.event
|
||||||
|
async def on_command_error(error, ctx):
|
||||||
|
if hasattr(ctx, 'cog'):
|
||||||
|
if "Admin_Commands" in ctx.cog.__str__():
|
||||||
|
return
|
||||||
|
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.'
|
||||||
|
elif isinstance(error, commands.CommandOnCooldown):
|
||||||
|
return
|
||||||
|
elif isinstance(error, commands.UserInputError):
|
||||||
|
error_str = 'Invalid syntax for **{}** you ding dong, please read ?help {}.'\
|
||||||
|
.format(ctx.invoked_with, ctx.invoked_with)
|
||||||
|
elif isinstance(error.original, NoPermissionError):
|
||||||
|
error_str = 'You don\'t have permission for that cool command.'
|
||||||
|
elif isinstance(error.original, UsernameLookupFailed):
|
||||||
|
error_str = 'Your user name was not found, either Mojang is having a fucky wucky ' \
|
||||||
|
'or your nickname is not set correctly. *stares at the Mods*'
|
||||||
|
elif isinstance(error.original, PlayerNotFound):
|
||||||
|
error_str = 'Make sure to use ?register first you ding dong.'
|
||||||
|
elif isinstance(error.original, EntryNameNotUniqueError):
|
||||||
|
error_str = 'An entry in the database already has that name ding dong.'
|
||||||
|
elif isinstance(error.original, DatabaseValueError):
|
||||||
|
error_str = 'Use a shorter name or a smaller value, dong ding.'
|
||||||
|
elif isinstance(error.original, NotOnServerError):
|
||||||
|
error_str = 'Command needs to be run on 24CC. Run this command there whoever you are.'.format()
|
||||||
|
else:
|
||||||
|
error_str = bad_error_message.format(ctx.invoked_with, error)
|
||||||
|
|
||||||
|
await bot.send_message(ctx.message.channel, '{} **Error Running Command:** {}'.format(ctx.message.author.mention,
|
||||||
|
error_str))
|
||||||
|
|
||||||
|
|
||||||
|
async def username_update():
|
||||||
|
session = None
|
||||||
|
await bot.wait_until_ready()
|
||||||
|
while not bot.is_closed:
|
||||||
|
session = bot_commands.interface.database.Session()
|
||||||
|
try:
|
||||||
|
print("Updating MC usernames...")
|
||||||
|
session = bot_commands.interface.database.Session()
|
||||||
|
player_list = session.query(Player).all()
|
||||||
|
for player in player_list:
|
||||||
|
player.name = grab_playername(player.mc_uuid)
|
||||||
|
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
await asyncio.sleep(600)
|
||||||
|
|
||||||
|
except UsernameLookupFailed:
|
||||||
|
print("Username lookup error, are Mojang's servers down?")
|
||||||
|
session.rollback()
|
||||||
|
finally:
|
||||||
|
print("Done.")
|
||||||
|
session.close()
|
||||||
|
|
||||||
|
if session is not None:
|
||||||
|
session.close()
|
||||||
|
|
||||||
|
|
||||||
|
def start_bot():
|
||||||
|
for extension in extensions:
|
||||||
|
try:
|
||||||
|
bot.load_extension(extension)
|
||||||
|
except Exception as e:
|
||||||
|
print('Failed to load extension {}, {}'.format(extension, e))
|
||||||
|
|
||||||
|
try:
|
||||||
|
bot.loop.create_task(username_update())
|
||||||
|
bot.run(bot_config.token)
|
||||||
|
except TimeoutError:
|
||||||
|
print("Disconnected, is Discord offline?")
|
||||||
|
except:
|
||||||
|
print("Bye")
|
|
@ -1,7 +1,7 @@
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from BotErrors import *
|
from BotErrors import *
|
||||||
from DiscordHelperFunctions import *
|
from DiscordHelperFunctions import *
|
||||||
from Geoffrey import bot_commands
|
from bot import bot_commands
|
||||||
|
|
||||||
|
|
||||||
@commands.cooldown(5, 60, commands.BucketType.user)
|
@commands.cooldown(5, 60, commands.BucketType.user)
|
|
@ -1,7 +1,7 @@
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from BotErrors import *
|
from BotErrors import *
|
||||||
from BotConfig import bot_config
|
from BotConfig import bot_config
|
||||||
from Geoffrey import bot_commands
|
from bot import bot_commands
|
||||||
from discord import Game
|
from discord import Game
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from BotErrors import *
|
from BotErrors import *
|
||||||
from DiscordHelperFunctions import *
|
from DiscordHelperFunctions import *
|
||||||
from Geoffrey import bot_commands
|
from bot import bot_commands
|
||||||
|
|
||||||
|
|
||||||
@commands.cooldown(5, 60, commands.BucketType.user)
|
@commands.cooldown(5, 60, commands.BucketType.user)
|
|
@ -1,7 +1,7 @@
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from BotErrors import *
|
from BotErrors import *
|
||||||
from DiscordHelperFunctions import *
|
from DiscordHelperFunctions import *
|
||||||
from Geoffrey import bot_commands
|
from bot import bot_commands
|
||||||
|
|
||||||
|
|
||||||
class Edit_Commands:
|
class Edit_Commands:
|
|
@ -1,7 +1,7 @@
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from BotErrors import *
|
from BotErrors import *
|
||||||
from DiscordHelperFunctions import *
|
from DiscordHelperFunctions import *
|
||||||
from Geoffrey import bot_commands
|
from bot import bot_commands
|
||||||
|
|
||||||
|
|
||||||
class Search_Commands:
|
class Search_Commands:
|
Loading…
Reference in New Issue