Also moved cogs into their own folder

doc_update
Joey Hines 2018-08-11 16:07:33 -05:00
parent 48e39b18d9
commit f82aac5f56
12 changed files with 190 additions and 149 deletions

View File

@ -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'

View File

@ -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")

116
bot.py 100644
View File

@ -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")

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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:

View File

@ -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: