moved the leaderboard text generation into RoboPage class
This commit is contained in:
8
data.py
8
data.py
@@ -148,14 +148,10 @@ class MsgData:
|
|||||||
.apply(lambda gdf: gdf['count'].sum())
|
.apply(lambda gdf: gdf['count'].sum())
|
||||||
.sort_values(ascending=False))
|
.sort_values(ascending=False))
|
||||||
|
|
||||||
async def emoji_leaderboard(self, client: discord.Client, emoji_name: str, days: int):
|
async def emoji_user_counts(self, client: discord.Client, emoji_name: str, days: int):
|
||||||
counts: pd.Series = self.emoji_totals(emoji_name, days)
|
counts: pd.Series = self.emoji_totals(emoji_name, days)
|
||||||
counts.index = pd.Index([(await client.fetch_user(user_id=uid)).display_name for uid in counts.index])
|
counts.index = pd.Index([(await client.fetch_user(user_id=uid)).display_name for uid in counts.index])
|
||||||
width = max([len(str(s)) for s in counts.index.values])
|
return counts
|
||||||
res = f'{emoji_name} totals, past {days} days\n'
|
|
||||||
res += '\n'.join(f"`{str(name).ljust(width + 1)}with {cnt:<2.0f} total`"
|
|
||||||
for name, cnt in counts.iteritems())
|
|
||||||
return res
|
|
||||||
|
|
||||||
def worst_offsenses(self, user: str, days: int):
|
def worst_offsenses(self, user: str, days: int):
|
||||||
cdf = self.emoji_messages('cancelled', days=days)
|
cdf = self.emoji_messages('cancelled', days=days)
|
||||||
|
|||||||
20
robopage.py
20
robopage.py
@@ -59,13 +59,8 @@ class RoboPage(discord.Client):
|
|||||||
await self.data.add_msg(message)
|
await self.data.add_msg(message)
|
||||||
|
|
||||||
if (m := self.leaderboard_regex.match(message.content)) is not None:
|
if (m := self.leaderboard_regex.match(message.content)) is not None:
|
||||||
days = m.group('days') or 14
|
|
||||||
try:
|
try:
|
||||||
await message.reply(
|
await message.reply(await self.leaderboard(match=m))
|
||||||
await self.data.emoji_leaderboard(client=self,
|
|
||||||
emoji_name=get_emoji_name(m.group('emoji')),
|
|
||||||
days=int(days))
|
|
||||||
)
|
|
||||||
except KeyError as e:
|
except KeyError as e:
|
||||||
LOGGER.exception(e)
|
LOGGER.exception(e)
|
||||||
await message.reply(f"I couldn't find any {m.group('emoji')} reactions. Leave me alone!")
|
await message.reply(f"I couldn't find any {m.group('emoji')} reactions. Leave me alone!")
|
||||||
@@ -105,12 +100,25 @@ class RoboPage(discord.Client):
|
|||||||
if hasattr(self, 'data'):
|
if hasattr(self, 'data'):
|
||||||
await self.data.update_reaction(msg=message)
|
await self.data.update_reaction(msg=message)
|
||||||
|
|
||||||
|
async def leaderboard(self, match: re.Match) -> str:
|
||||||
|
emoji_name = get_emoji_name(match.group('emoji'))
|
||||||
|
days = match.group('days') or 14
|
||||||
|
counts = await self.data.emoji_user_counts(client=self,
|
||||||
|
emoji_name=emoji_name,
|
||||||
|
days=int(days))
|
||||||
|
width = max([len(str(s)) for s in counts.index.values])
|
||||||
|
res = f'{match.group("emoji")} totals, past {days} days\n'
|
||||||
|
res += '\n'.join(f"`{str(name).ljust(width + 1)}with {cnt:<2.0f} total`"
|
||||||
|
for name, cnt in counts.iteritems())
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
def get_emoji_name(string: str) -> str:
|
def get_emoji_name(string: str) -> str:
|
||||||
if (m := re.search('<:(?P<name>\w+):(?P<id>\d+)>', string)):
|
if (m := re.search('<:(?P<name>\w+):(?P<id>\d+)>', string)):
|
||||||
string = m.group('name')
|
string = m.group('name')
|
||||||
return string.lower().strip()
|
return string.lower().strip()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user