diff --git a/run.py b/src/__main__.py similarity index 66% rename from run.py rename to src/__main__.py index 3c16799..16b076e 100644 --- a/run.py +++ b/src/__main__.py @@ -1,21 +1,27 @@ # !/usr/bin/python # -*- coding: utf8 -*- +""" +App entry point. -# Import packages +Something meaningful here, eventually. +""" import asyncio -import discord -from discord.ext import commands import json import logging -import traceback import random +import traceback + +import discord +from discord.ext import commands -# Import custom files from src.config.config import LoadConfig from src.shared_libs.loggable import Loggable + +# Init logging to output on INFO level to stderr. logging.basicConfig(level='INFO') + # If uvloop is installed, change to that eventloop policy as it # is more efficient try: @@ -23,13 +29,14 @@ try: asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) del uvloop except BaseException as ex: - logging.warning(f'Could not load uvloop. {type(ex).__name__}: {ex};', - 'reverting to default impl.') + logging.warning(f'Could not load uvloop. {type(ex).__qualname__}: {ex};', + 'reverting to default impl.') else: logging.info(f'Using uvloop for asyncio event loop policy.') # Bot Class +# Might be worth moving this to it's own file? class SebiMachine(commands.Bot, LoadConfig, Loggable): """This discord is dedicated to http://www.discord.gg/GWdhBSp""" def __init__(self): @@ -39,13 +46,13 @@ class SebiMachine(commands.Bot, LoadConfig, Loggable): # Load plugins # Add your cog file name in this list - with open('cogs.txt', 'r') as cog_file: + with open('cogs.txt') as cog_file: cogs = cog_file.readlines() for cog in cogs: # Could this just be replaced with `strip()`? cog = cog.replace('\n', '') - self.load_extension(f'src.cogs.{cog}') + self.load_extension(f'{__name__}.cogs.{cog}') self.logger.info(f'Loaded: {cog}') async def on_ready(self): @@ -59,16 +66,18 @@ class SebiMachine(commands.Bot, LoadConfig, Loggable): error : Exception """ jokes = ["I\'m a bit tipsy, I took to many screenshots...", - "I am rushing to the 24/7 store to get myself anti-bug spray...", - "Organizing turtle race...", - "There is no better place then 127.0.0.1...", - "Recycling Hex Decimal...", - "No worry, I get fixed :^)...", - "R.I.P, press F for respect...", - "The bug repellent dit not work...", - "You found a bug in the program. Unfortunately the joke did not fit here, better luck next time..."] + "I am rushing to the 24/7 store to get myself anti-bug spray...", + "Organizing turtle race...", + "There is no better place then 127.0.0.1...", + "Recycling Hex Decimal...", + "No worry, I get fixed :^)...", + "R.I.P, press F for respect...", + "The bug repellent dit not work...", + "You found a bug in the program. Unfortunately the joke did not fit here, better luck next time..."] - # catch error + # CommandErrors triggered by other propagating errors tend to get wrapped. This means + # if we have a cause, we should probably consider unwrapping that so we get a useful + # message. error = error.__cause__ or error tb = traceback.format_exception(type(error), error, error.__traceback__, limit=2, chain=False) tb = ''.join(tb) @@ -86,7 +95,8 @@ class SebiMachine(commands.Bot, LoadConfig, Loggable): if __name__ == '__main__': client = SebiMachine() # Make sure the key stays private. - with open('src/config/PrivateConfig.json') as fp: + # I am 99% certain this is valid! + with open(f'{__name__}/config/PrivateConfig.json') as fp: PrivateConfig = json.load(fp) client.run(PrivateConfig["bot-key"])