refactoring

This commit is contained in:
klemek
2021-01-07 16:28:51 +01:00
parent 59cf039efa
commit 6ed8b21d76
2 changed files with 89 additions and 71 deletions
+19 -70
View File
@@ -1,14 +1,12 @@
from typing import Dict, List, Tuple, Optional, Union
from typing import Dict, List, Optional
from datetime import datetime
from collections import defaultdict
import discord
import re
import json
import logging
# Custom libs
from utils import aggregate, no_duplicate
from utils import no_duplicate, mention, plural, day_interval, get_intro
from log_manager import GuildLogs, ChannelLogs
import emojis
@@ -99,10 +97,18 @@ async def compute(client: discord.client, message: discord.Message, *args: str):
)
msg_count += count
chan_count += 1 if count > 0 else 0
await progress.edit(content=f"```Computing results...```")
await progress.edit(content="```Computing results...```")
# Display results
await tell_results(
get_intro(emotes, full, channels, members, msg_count, chan_count),
get_intro(
"emotes usage",
emotes,
full,
channels,
members,
msg_count,
chan_count,
),
emotes,
message.channel,
total_msg,
@@ -176,25 +182,16 @@ class Emote:
output += f" {name} - "
if not self.used():
output += "never used "
elif self.usages == 1:
output += "1 time "
else:
output += f"{self.usages:,} times "
if self.reactions == 1:
output += "and 1 reaction "
elif self.reactions > 1:
output += f"and {self.reactions:,} reactions "
output += f"{plural(self.usages, 'time')} "
if self.reactions >= 1:
output += f"and {plural(self.usages, 'reaction')} "
if show_life and not self.default:
output += f"(in {self.life_days()} days) "
output += f"(in {plural(self.life_days(), 'day')}) "
if self.used():
if self.use_days() == 0:
output += "(last used today)"
elif self.use_days() == 1:
output += "(last used yesterday)"
else:
output += f"(last used {self.use_days()} days ago)"
output += f"(last used {day_interval(self.use_days())})"
if show_members:
output += f" (mostly by <@{self.get_top_member()}>: {self.members[self.get_top_member()]})"
output += f" (mostly by {mention(self.get_top_member())}: {self.members[self.get_top_member()]})"
return output
@@ -273,54 +270,6 @@ async def tell_results(
await channel.send(response)
def get_intro(
emotes: Dict[str, Emote],
full: bool,
channels: List[discord.TextChannel],
members: List[discord.Member],
nmm: int, # number of messages impacted
nc: int, # number of impacted channels
) -> str:
"""
Get the introduction sentence of the response
"""
# Show all data (members, channels) when it's less than 5 units
if len(members) == 0:
# Full scan of the server
if full:
return f"{len(emotes)} emotes in this server ({nc} channels, {nmm:,} messages):"
elif len(channels) < 5:
return f"{aggregate([c.mention for c in channels])} emotes usage in {nmm:,} messages:"
else:
return f"These {len(channels)} channels emotes usage in {nmm:,} messages:"
elif len(members) < 5:
if full:
return f"{aggregate([m.mention for m in members])} emotes usage in {nmm:,} messages:"
elif len(channels) < 5:
return (
f"{aggregate([m.mention for m in members])} on {aggregate([c.mention for c in channels])} "
f"emotes usage in {nmm:,} messages:"
)
else:
return (
f"{aggregate([m.mention for m in members])} on these {len(channels)} channels "
f"emotes usage in {nmm:,} messages:"
)
else:
if full:
return f"These {len(members)} members emotes usage in {nmm:,} messages:"
elif len(channels) < 5:
return (
f"These {len(members)} members on {aggregate([c.mention for c in channels])} "
f"emotes usage in {nmm:,} messages:"
)
else:
return (
f"These {len(members)} members on these {len(channels)} channels "
f"emotes usage in {nmm:,} messages:"
)
def get_total(emotes: Dict[str, Emote], nmm: int) -> str:
"""
Get the total of all emotes used
+70 -1
View File
@@ -1,4 +1,4 @@
from typing import List
from typing import List, Dict
import logging
import discord
@@ -13,6 +13,10 @@ async def code_message(message: discord.Message, content: str):
await message.edit(content=f"```\n{content}\n```")
def mention(member_id: int) -> str:
return f"<@{member_id}>"
# LISTS
@@ -43,3 +47,68 @@ def aggregate(names: List[str]) -> str:
return names[0]
else:
return ", ".join(names[:-1]) + " & " + names[-1]
def plural(count: int, word: str) -> str:
return str(count) + " " + word + "s" if count == 1 else ""
def day_interval(interval: int) -> str:
if interval == 0:
return "today"
elif interval == 1:
return "yesterday"
else:
return f"{interval} days ago"
# APP SPECIFIC
def get_intro(
subject: str,
emotes: Dict[str],
full: bool,
channels: List[discord.TextChannel],
members: List[discord.Member],
nmm: int, # number of messages impacted
nc: int, # number of impacted channels
) -> str:
"""
Get the introduction sentence of the response
"""
# Show all data (members, channels) when it's less than 5 units
if len(members) == 0:
# Full scan of the server
if full:
return f"{subject} in this server ({nc} channels, {nmm:,} messages):"
elif len(channels) < 5:
return f"{aggregate([c.mention for c in channels])} {subject} in {nmm:,} messages:"
else:
return f"These {len(channels)} channels {subject} in {nmm:,} messages:"
elif len(members) < 5:
if full:
return f"{aggregate([m.mention for m in members])} {subject} in {nmm:,} messages:"
elif len(channels) < 5:
return (
f"{aggregate([m.mention for m in members])} on {aggregate([c.mention for c in channels])} "
f"{subject} in {nmm:,} messages:"
)
else:
return (
f"{aggregate([m.mention for m in members])} on these {len(channels)} channels "
f"{subject} in {nmm:,} messages:"
)
else:
if full:
return f"These {len(members)} members {subject} in {nmm:,} messages:"
elif len(channels) < 5:
return (
f"These {len(members)} members on {aggregate([c.mention for c in channels])} "
f"{subject} in {nmm:,} messages:"
)
else:
return (
f"These {len(members)} members on these {len(channels)} channels "
f"{subject} in {nmm:,} messages:"
)