diff --git a/extensions/highscores.py b/extensions/highscores.py index 512337e..10b6cf0 100644 --- a/extensions/highscores.py +++ b/extensions/highscores.py @@ -6,105 +6,109 @@ import discord from discord.ext import commands -@commands.command( - description="Highscores", - help="Shows a bar graph of users in this channel and how many messages they have sent.", - brief="Display chat highscores", - aliases=["highscore"] - ) -async def highscores(ctx, limit=15): - filename = str(ctx.channel.id) + ".log" - with open("data/chatgpt/logs/" + filename, 'r', encoding="utf-8") as logfile: - data = logfile.readlines() - logfile.close() - - def is_username(user): - for character in user: - if character.isupper(): - return False - if not (character.isalpha() or character.isdigit() or character == '.' or character == '_'): - return False - return True +class Highscores(commands.Cog): - user_message_counts = {} - for line in data: - try: - user = line[0:line.find(':')] - if is_username(user): - if user not in user_message_counts and user != "" and len(user) <= 32: - user_message_counts[user] = 1 - else: - user_message_counts[user] += 1 - except Exception as error: - print("Error occurred in highscores") - - sorted_message_counts = sorted(user_message_counts.items(), key=lambda x:x[1]) - sorted_dict = dict(sorted_message_counts[-limit::]) - keys = list(sorted_dict.keys()) - values = list(sorted_dict.values()) - fig, ax = plt.subplots() - bar_container = ax.barh(keys, values) - ax.set_xlabel("Message Count") - ax.set_ylabel("Username") - ax.set_title("Messages Sent in " + ctx.channel.name) - ax.bar_label(bar_container, label_type='center') - filepath = 'tmp/' + str(time.time_ns()) + '.png' - plt.savefig(filepath, dpi=1000, bbox_inches="tight") - with open(filepath, "rb") as fh: - f = discord.File(fh, filename=str(ctx.channel.id) + '_hiscores.png') - await ctx.send(file=f) - + def __init__(self, bot): + self.bot = bot -@commands.command( - description="Highscores Server", - help="Shows a bar graph of users across all servers I am in and how many messages they have sent.", - brief="Display chat highscores", - aliases=["highscore_server"] - ) -async def highscores_server(ctx, limit=15): - - def is_username(user): - for character in user: - if character.isupper(): - return False - if not (character.isalpha() or character.isdigit() or character == '.' or character == '_'): - return False - return True - - user_message_counts = {} - data = [] - for filename in os.listdir("data/chatgpt/logs/"): + @commands.command( + description="Highscores", + help="Shows a bar graph of users in this channel and how many messages they have sent.", + brief="Display chat highscores", + aliases=["highscore"] + ) + async def highscores(self, ctx, limit=15): + filename = str(ctx.channel.id) + ".log" with open("data/chatgpt/logs/" + filename, 'r', encoding="utf-8") as logfile: - data += logfile.readlines() + data = logfile.readlines() logfile.close() - user_message_counts = {} - for line in data: - try: - user = line[0:line.find(':')] - if is_username(user): - if user not in user_message_counts and user != "" and len(user) <= 32: - user_message_counts[user] = 1 - else: - user_message_counts[user] += 1 - except Exception as error: - print("Error occurred in highscores_server") + + def is_username(user): + for character in user: + if character.isupper(): + return False + if not (character.isalpha() or character.isdigit() or character == '.' or character == '_'): + return False + return True - sorted_message_counts = sorted(user_message_counts.items(), key=lambda x:x[1]) - sorted_dict = dict(sorted_message_counts[-limit::]) - keys = list(sorted_dict.keys()) - values = list(sorted_dict.values()) - fig, ax = plt.subplots() - bar_container = ax.barh(keys, values) - ax.set_xlabel("Message Count") - ax.set_ylabel("Username") - ax.set_title("Messages Sent in all channels I can see") - ax.bar_label(bar_container, label_type='center') - filepath = 'tmp/' + str(time.time_ns()) + '.png' - plt.savefig(filepath, dpi=1000, bbox_inches="tight") - with open(filepath, "rb") as fh: - f = discord.File(fh, filename=str(ctx.channel.id) + '_hiscores.png') - await ctx.send(file=f) + user_message_counts = {} + for line in data: + try: + user = line[0:line.find(':')] + if is_username(user): + if user not in user_message_counts and user != "" and len(user) <= 32: + user_message_counts[user] = 1 + else: + user_message_counts[user] += 1 + except Exception as error: + self.bot.logger.exception("Error occurred in highscores") + + sorted_message_counts = sorted(user_message_counts.items(), key=lambda x:x[1]) + sorted_dict = dict(sorted_message_counts[-limit::]) + keys = list(sorted_dict.keys()) + values = list(sorted_dict.values()) + fig, ax = plt.subplots() + bar_container = ax.barh(keys, values) + ax.set_xlabel("Message Count") + ax.set_ylabel("Username") + ax.set_title("Messages Sent in " + ctx.channel.name) + ax.bar_label(bar_container, label_type='center') + filepath = 'tmp/' + str(time.time_ns()) + '.png' + plt.savefig(filepath, dpi=1000, bbox_inches="tight") + with open(filepath, "rb") as fh: + f = discord.File(fh, filename=str(ctx.channel.id) + '_hiscores.png') + await ctx.send(file=f) + + + @commands.command( + description="Highscores Server", + help="Shows a bar graph of users across all servers I am in and how many messages they have sent.", + brief="Display chat highscores", + aliases=["highscore_server"] + ) + async def highscores_server(self, ctx, limit=15): + + def is_username(user): + for character in user: + if character.isupper(): + return False + if not (character.isalpha() or character.isdigit() or character == '.' or character == '_'): + return False + return True + + user_message_counts = {} + data = [] + for filename in os.listdir("data/chatgpt/logs/"): + with open("data/chatgpt/logs/" + filename, 'r', encoding="utf-8") as logfile: + data += logfile.readlines() + logfile.close() + user_message_counts = {} + for line in data: + try: + user = line[0:line.find(':')] + if is_username(user): + if user not in user_message_counts and user != "" and len(user) <= 32: + user_message_counts[user] = 1 + else: + user_message_counts[user] += 1 + except Exception as error: + self.bot.logger.exception("Error occurred in highscores_server") + + sorted_message_counts = sorted(user_message_counts.items(), key=lambda x:x[1]) + sorted_dict = dict(sorted_message_counts[-limit::]) + keys = list(sorted_dict.keys()) + values = list(sorted_dict.values()) + fig, ax = plt.subplots() + bar_container = ax.barh(keys, values) + ax.set_xlabel("Message Count") + ax.set_ylabel("Username") + ax.set_title("Messages Sent in all channels I can see") + ax.bar_label(bar_container, label_type='center') + filepath = 'tmp/' + str(time.time_ns()) + '.png' + plt.savefig(filepath, dpi=1000, bbox_inches="tight") + with open(filepath, "rb") as fh: + f = discord.File(fh, filename=str(ctx.channel.id) + '_hiscores.png') + await ctx.send(file=f) async def setup(bot): - bot.add_command(highscores) - bot.add_command(highscores_server) \ No newline at end of file + bot.add_cog(Highscores(bot)) \ No newline at end of file