diff --git a/gifs.json b/gifs.json deleted file mode 100644 index 5af4808..0000000 --- a/gifs.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "beans": "https://c.tenor.com/TjX1yORoln0AAAAM/this-is-beans-beans.gif", - "not like this": "https://tenor.com/view/not-like-this-the-matrix-panic-neo-angry-gif-5216157" -} \ No newline at end of file diff --git a/kwaylon/__init__.py b/kwaylon/__init__.py new file mode 100644 index 0000000..23f93a6 --- /dev/null +++ b/kwaylon/__init__.py @@ -0,0 +1 @@ +from .kwaylon import Kwaylon \ No newline at end of file diff --git a/data.py b/kwaylon/data.py similarity index 98% rename from data.py rename to kwaylon/data.py index 6778aec..641a141 100644 --- a/data.py +++ b/kwaylon/data.py @@ -7,7 +7,7 @@ from pathlib import Path import discord import pandas as pd -from msg import message_df, full_reaction_df, message_dict, LOGGER, reaction_df +from .msg import message_df, full_reaction_df, message_dict, LOGGER, reaction_df LOGGER = logging.getLogger(__name__) diff --git a/jokes.py b/kwaylon/jokes.py similarity index 100% rename from jokes.py rename to kwaylon/jokes.py diff --git a/robopage.py b/kwaylon/kwaylon.py similarity index 84% rename from robopage.py rename to kwaylon/kwaylon.py index 1b54b87..f2651f0 100644 --- a/robopage.py +++ b/kwaylon/kwaylon.py @@ -1,15 +1,12 @@ import logging -import os import re from typing import Union import discord import pandas as pd from discord import RawReactionActionEvent, RawReactionClearEmojiEvent -from dotenv import load_dotenv -import data -import jokes +from . import data, jokes logging.basicConfig(level=logging.INFO) @@ -18,16 +15,16 @@ LIL_STINKY_ID = 704043422276780072 LOGGER = logging.getLogger(__name__) -class RoboPage(discord.Client): - db_path: str = 'messages.db' +class Kwaylon(discord.Client): + db_path: str = '../messages.db' def __init__(self, *args, **kwargs): - super(RoboPage, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) attrs = filter(lambda n: n.endswith('Joke') and n not in ['Joke', 'GifJoke'], dir(jokes)) attrs = map(lambda n: getattr(jokes, n)(), attrs) self.jokes = list(attrs) self.most_regex = re.compile( - "^who is the most\s+(?P\S+)\s*?(?:in the past (?P\d+) days)?\??$", + '^who is the most\s+(?P\S+)\s*?(?:in the past (?P\d+) days)?\??$', re.IGNORECASE, ) self.leaderboard_regex = re.compile( @@ -80,7 +77,7 @@ class RoboPage(discord.Client): async def handle_raw_reaction(self, payload: Union[RawReactionActionEvent, RawReactionClearEmojiEvent]): LOGGER.info(payload) - guild = await client.fetch_guild(payload.guild_id) + guild = await self.fetch_guild(payload.guild_id) channel = await guild.fetch_channel(payload.channel_id) message = await channel.fetch_message(payload.message_id) @@ -114,7 +111,7 @@ class RoboPage(discord.Client): emoji_name=get_emoji_name(match.group('emoji')), days=days ) - user: discord.User = await client.fetch_user(user_id=data.index[0]) + user: discord.User = await self.fetch_user(user_id=data.index[0]) LOGGER.info(f'User: {user.mention}') msg = f'{user.mention} with {data.iloc[0]:.0f}x {match.group("emoji")} over the past {days} days' msg += '\n' + await self.worst_offsenses(user=user, days=days, top=3, emoji_str=match.group('emoji')) @@ -138,31 +135,3 @@ def get_emoji_name(string: str) -> str: if (m := re.search('<:(?P\w+):(?P\d+)>', string)): string = m.group('name') return string.lower().strip() - - -if __name__ == '__main__': - client = RoboPage() - - - @client.event - async def on_ready(): - await client.handle_ready() - - - @client.event - async def on_message(message: discord.Message): - await client.handle_message(message) - - - @client.event - async def on_raw_reaction_add(payload: RawReactionActionEvent): - await client.handle_raw_reaction(payload) - - - @client.event - async def on_raw_reaction_remove(payload: RawReactionActionEvent): - await client.handle_raw_reaction(payload) - - - load_dotenv() - client.run(os.getenv('DISCORD_TOKEN')) diff --git a/msg.py b/kwaylon/msg.py similarity index 65% rename from msg.py rename to kwaylon/msg.py index 9562eb4..275989b 100644 --- a/msg.py +++ b/kwaylon/msg.py @@ -1,23 +1,13 @@ import logging -import os from datetime import datetime, timedelta from typing import Dict, Iterable import discord import pandas as pd -from dotenv import load_dotenv LOGGER = logging.getLogger(__name__) -def convert_emoji(emoji): - try: - emoji.name.encode('ascii') - except UnicodeEncodeError as e: - emoji.name = emoji.name.encode('unicode-escape').decode('ascii') - return emoji - - async def message_df(client: discord.Client, **kwargs): return pd.DataFrame( [message_dict(m) async for m in message_gen(client, **kwargs)] @@ -70,35 +60,3 @@ def reaction_dict(r: discord.Reaction) -> Dict: 'emoji id': r.emoji.id if r.is_custom_emoji() else None, 'count': int(r.count), } - - -def emoji_totals(edf: pd.DataFrame) -> pd.DataFrame: - totals = edf.groupby('display_name').sum()['count'].sort_values(ascending=False).apply(int) - max_channels = ( - edf - .groupby(['display_name', 'channel']) - .sum()['count'] - .sort_values(ascending=False) - .groupby(level=0) - .apply(lambda gdf: gdf.idxmax()[1]) - ) - return pd.DataFrame({ - 'total': totals, - 'max channel': max_channels, - # 'worst': cdf.groupby('display_name').max()['link'] - }).sort_values('total', ascending=False) - - -if __name__ == '__main__': - client = discord.Client() - - logging.basicConfig(level=logging.INFO) - - - @client.event - async def on_ready(): - print(f'{client.user} has connected to Discord!') - - - load_dotenv() - client.run(os.getenv('DISCORD_TOKEN')) diff --git a/main.py b/main.py new file mode 100644 index 0000000..6244b1b --- /dev/null +++ b/main.py @@ -0,0 +1,34 @@ +import os + +from discord import Message, RawReactionActionEvent +from dotenv import load_dotenv + +from kwaylon import Kwaylon + +if __name__ == '__main__': + # https://discordpy.readthedocs.io/en/stable/quickstart.html + client = Kwaylon() + + + @client.event + async def on_ready(): + await client.handle_ready() + + + @client.event + async def on_message(message: Message): + await client.handle_message(message) + + + @client.event + async def on_raw_reaction_add(payload: RawReactionActionEvent): + await client.handle_raw_reaction(payload) + + + @client.event + async def on_raw_reaction_remove(payload: RawReactionActionEvent): + await client.handle_raw_reaction(payload) + + + load_dotenv() + client.run(os.getenv('DISCORD_TOKEN'))