import sys import logging import logging.handlers import re LOG_SETUP = False # The colors class below is from: # https://www.geeksforgeeks.org/print-colors-python-terminal class colors: reset = "\033[0m" bold = "\033[01m" disable = "\033[02m" underline = "\033[04m" reverse = "\033[07m" strikethrough = "\033[09m" invisible = "\033[08m" class fg: white = "\033[97m" black = "\033[30m" red = "\033[31m" green = "\033[32m" orange = "\033[33m" blue = "\033[34m" purple = "\033[35m" cyan = "\033[36m" lightgrey = "\033[37m" darkgrey = "\033[90m" lightred = "\033[91m" lightgreen = "\033[92m" yellow = "\033[93m" lightblue = "\033[94m" pink = "\033[95m" lightcyan = "\033[96m" class bg: black = "\033[40m" red = "\033[41m" green = "\033[42m" orange = "\033[43m" blue = "\033[44m" purple = "\033[45m" cyan = "\033[46m" lightgrey = "\033[47m" class PlainTextFormatter(logging.Formatter): def format(self, record): log_message = super().format(record) log_message = re.sub(r"\033\[[0-9]{1,2}m", "", log_message) return log_message # Make it easy to log text: def write(input_str, color=colors.fg.lightgrey, logger_name="discord.bot"): global LOG_SETUP if not LOG_SETUP: logging.getLogger("discord").setLevel(logging.DEBUG) logging.getLogger("discord.http").setLevel(logging.INFO) line_format = "[{asctime}] [{threadName}] [{levelname}] {name}: {message}" timestamp_format = "%Y-%m-%d %H:%M:%S" file_handler = logging.handlers.RotatingFileHandler(filename="log.txt", encoding="utf-8", maxBytes=32 * 1024 * 1024, backupCount=10) file_formatter = PlainTextFormatter(line_format, timestamp_format, style="{") file_handler.setFormatter(file_formatter) console_handler = logging.StreamHandler() console_formatter = logging.Formatter(colors.fg.darkgrey + line_format, timestamp_format, style="{") console_handler.setFormatter(console_formatter) root_logger = logging.getLogger() root_logger.addHandler(file_handler) root_logger.addHandler(console_handler) LOG_SETUP = True logging.getLogger(logger_name).info(f"{color}{input_str}{colors.reset}") def write_prompt(client=None, msg=None, chl=None, user=None, author=None, roles=None, rxn=None): bot_name = client.user.name + "#" + client.user.discriminator server_name = msg.channel.guild.name category_name = msg.channel.category.name channel_name = msg.channel.name user_name = user.name discrim = 0 if user.discriminator is not None: discrim = user.discriminator user_name = f"{user_name}#{discrim}" message_content = msg.content message_text = f"[{bot_name}/{server_name}/{category_name}/{channel_name}/{user_name}] {colors.fg.white}{message_content}" write(message_text, logger_name="discord.bot.prompts") def write_stat(key, value): write(f"{key}: {value}", logger_name="discord.bot.stats") def get_stat(key, sum=True): value = 0 with open("stats.log.txt") as file: lines = [line.strip() for line in file] for line in lines: match = re.search(key, line) if match is not None: value = value + float(match.group(1).strip()) return value