diff --git a/hitomi/settings.py b/hitomi/settings.py index 32fc98b..5d4f652 100644 --- a/hitomi/settings.py +++ b/hitomi/settings.py @@ -39,6 +39,7 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'bot', 'dice', + 'logger', 'weather', ] @@ -126,6 +127,7 @@ STATIC_URL = '/static/' # default bot settings DISCORD_BOT_TOKEN = 'token' +LOGGER_BASE_DIR = './logs' WEATHER_WEATHER_UNDERGROUND_API_KEY = 'key' diff --git a/logger/__init__.py b/logger/__init__.py new file mode 100644 index 0000000..fc68247 --- /dev/null +++ b/logger/__init__.py @@ -0,0 +1,80 @@ +"""Log messages showing up on Discord.""" +import logging +from os import makedirs + +from django.conf import settings + +from bot import hitomi + +logger = logging.getLogger(__name__) + + +@hitomi.event +async def on_message(message): + """Log the seen message.""" + try: + log_file = log_file_for_message(message) + log_line = "{0:s}\t{1:s}\t{2:s}\t{3:s}".format(str(message.timestamp), str(message.author), str(message.id), + str(message.content)) + logger.info("{0:s} - {1:s}".format(log_file, log_line)) + with open(log_file, 'a') as log_fd: + print(log_line, file=log_fd) + except Exception as ex: + logger.error("error in creating log line") + logger.exception(ex) + + # let other stuff happen + await hitomi.process_commands(message) + + +@hitomi.event +async def on_message_delete(message): + """Log the message deletion.""" + try: + log_file = log_file_for_message(message) + log_line = "{0:s}\t{1:s}\tD:{2:s}\tDELETED: {3:s}".format(str(message.timestamp), str(message.author), + str(message.id), str(message.content)) + logger.info("{0:s} - {1:s}".format(log_file, log_line)) + with open(log_file, 'a') as log_fd: + print(log_line, file=log_fd) + except Exception as ex: + logger.error("error in creating log line") + logger.exception(ex) + + # let other stuff happen + await hitomi.process_commands(message) + + +@hitomi.event +async def on_message_edit(before, after): + """Log the message deletion.""" + try: + log_file = log_file_for_message(after) + log_line = "{0:s}\t{1:s}\tE:{2:s}\tEDIT: {3:s} (was \"{4:s}\")".format(str(after.timestamp), str(after.author), + str(after.id), str(after.content), + str(before.content)) + logger.info("{0:s} - {1:s}".format(log_file, log_line)) + with open(log_file, 'a') as log_fd: + print(log_line, file=log_fd) + except Exception as ex: + logger.error("error in creating log line") + logger.exception(ex) + + # let other stuff happen + await hitomi.process_commands(after) + + +def log_file_for_message(message): + """For the given message, figure out where we'd log the message.""" + if message.channel.is_private: + log_directory = 'DM/{0:s}/'.format(str(message.author)) + log_file = '{0:s}-{1:s}.log'.format(str(message.author), str(message.timestamp.strftime('%Y%m'))) + else: + log_directory = '{0:s}-{1:s}/{2:s}/'.format(str(message.server.id), str(message.server), + str(message.channel)) + log_file = '{0:s}-{1:s}.log'.format(str(message.channel), str(message.timestamp.strftime('%Y%m'))) + + destination_dir = '{0:s}/{1:s}'.format(settings.LOGGER_BASE_DIR, log_directory) + makedirs(destination_dir, exist_ok=True) + + return '{0:s}{1:s}'.format(destination_dir, log_file)