diff --git a/src/data_types/__init__.py b/src/data_types/__init__.py index f34a200..1d1172b 100644 --- a/src/data_types/__init__.py +++ b/src/data_types/__init__.py @@ -1,4 +1,4 @@ -from .emote import Emote +from .emote import Emote, get_emote_dict from .frequency import Frequency from .composition import Composition from .other import Other diff --git a/src/data_types/emote.py b/src/data_types/emote.py index 346a068..ad0b98c 100644 --- a/src/data_types/emote.py +++ b/src/data_types/emote.py @@ -1,4 +1,4 @@ -from typing import List, Optional +from typing import List, Optional, Dict from datetime import datetime from collections import defaultdict import discord @@ -77,3 +77,10 @@ class Emote: if show_members: output += f" (mostly by {mention(self.get_top_member())}: {self.members[self.get_top_member()]})" return output + + +def get_emote_dict(guild: discord.Guild) -> Dict[str, Emote]: + emotes = defaultdict(Emote) + for emoji in guild.emojis: + emotes[str(emoji)] = Emote(emoji) + return emotes diff --git a/src/main.py b/src/main.py index f4c58e1..db04992 100644 --- a/src/main.py +++ b/src/main.py @@ -2,7 +2,13 @@ from miniscord import Bot import logging from utils import emojis -from scanners import EmotesScanner, FrequencyScanner, CompositionScanner, OtherScanner +from scanners import ( + EmotesScanner, + FullScanner, + FrequencyScanner, + CompositionScanner, + OtherScanner, +) logging.basicConfig( format="[%(asctime)s][%(levelname)s][%(module)s] %(message)s", level=logging.INFO @@ -43,5 +49,11 @@ bot.register_command( "freq: frequency analysis", FrequencyScanner.help(), ) +bot.register_command( + "full", + lambda *args: FullScanner().compute(*args), + "full: full analysis", + FullScanner.help(), +) bot.start() diff --git a/src/scanners/__init__.py b/src/scanners/__init__.py index eaf2f17..37c6e4c 100644 --- a/src/scanners/__init__.py +++ b/src/scanners/__init__.py @@ -2,3 +2,4 @@ from .emotes_scanner import EmotesScanner from .frequency_scanner import FrequencyScanner from .composition_scanner import CompositionScanner from .other_scanner import OtherScanner +from .full_scanner import FullScanner diff --git a/src/scanners/composition_scanner.py b/src/scanners/composition_scanner.py index f3242b9..038db69 100644 --- a/src/scanners/composition_scanner.py +++ b/src/scanners/composition_scanner.py @@ -1,11 +1,13 @@ from typing import List +from collections import defaultdict import discord # Custom libs from .scanner import Scanner -from data_types import Composition +from . import EmotesScanner +from data_types import Composition, Emote, get_emote_dict from logs import ChannelLogs, MessageLog @@ -27,14 +29,21 @@ class CompositionScanner(Scanner): ) async def init(self, message: discord.Message, *args: str) -> bool: + guild = message.channel.guild self.comp = Composition() + # Create emotes dict from custom emojis of the guild + self.emotes = get_emote_dict(message.channel.guild) return True def compute_message(self, channel: ChannelLogs, message: MessageLog): - return Composition.analyse_message(message, self.comp, self.raw_members) + ret = CompositionScanner.analyse_message(message, self.comp, self.raw_members) + ret &= EmotesScanner.analyse_message( + message, self.emotes, self.raw_members, all_emojis=True + ) + return ret def get_results(self, intro: str) -> List[str]: - Composition.compute_results(self.comp) + CompositionScanner.compute_results(self.comp) res = [intro] res += self.comp.to_string() return res @@ -46,6 +55,7 @@ class CompositionScanner(Scanner): impacted = False # If author is included in the selection (empty list is all) if len(raw_members) == 0 or message.author in raw_members: + impacted = True pass # TODO return impacted diff --git a/src/scanners/emotes_scanner.py b/src/scanners/emotes_scanner.py index b6d7e71..31edf35 100644 --- a/src/scanners/emotes_scanner.py +++ b/src/scanners/emotes_scanner.py @@ -6,7 +6,7 @@ import discord # Custom libs from logs import ChannelLogs, MessageLog -from data_types import Emote +from data_types import Emote, get_emote_dict from .scanner import Scanner from utils import emojis @@ -49,9 +49,8 @@ class EmotesScanner(Scanner): len(self.members) == 0 or len(self.members) > 1 ) # Create emotes dict from custom emojis of the guild - self.emotes = defaultdict(Emote) - for emoji in guild.emojis: - self.emotes[str(emoji)] = Emote(emoji) + # Create emotes dict from custom emojis of the guild + self.emotes = get_emote_dict(message.channel.guild) return True def compute_message(self, channel: ChannelLogs, message: MessageLog): diff --git a/src/scanners/full_scanner.py b/src/scanners/full_scanner.py new file mode 100644 index 0000000..3aaf0ad --- /dev/null +++ b/src/scanners/full_scanner.py @@ -0,0 +1,61 @@ +from typing import List +from collections import defaultdict +import discord + + +# Custom libs + +from .scanner import Scanner +from . import FrequencyScanner, CompositionScanner, OtherScanner, EmotesScanner +from data_types import Frequency, Composition, Other, Emote, get_emote_dict +from logs import ChannelLogs, MessageLog + + +class FullScanner(Scanner): + @staticmethod + def help() -> str: + return "```\n" + +"%full : Show full statistics\n" + +"arguments:\n" + +"* @member : filter for one or more member\n" + +"* #channel : filter for one or more channel\n" + +"Example: %full #mychannel1 @user\n" + +"```" + + def __init__(self): + super().__init__( + help=FullScanner.help(), + intro_context="Full analysis", + ) + + async def init(self, message: discord.Message, *args: str) -> bool: + guild = message.channel.guild + self.freq = Frequency() + self.comp = Composition() + self.other = Other() + # Create emotes dict from custom emojis of the guild + # Create emotes dict from custom emojis of the guild + self.emotes = get_emote_dict(message.channel.guild) + return True + + def compute_message(self, channel: ChannelLogs, message: MessageLog): + ret = FrequencyScanner.analyse_message(message, self.freq, self.raw_members) + ret &= CompositionScanner.analyse_message(message, self.comp, self.raw_members) + ret &= OtherScanner.analyse_message(message, self.other, self.raw_members) + ret &= EmotesScanner.analyse_message( + message, self.emotes, self.raw_members, all_emojis=True + ) + return ret + + def get_results(self, intro: str) -> List[str]: + FrequencyScanner.compute_results(self.freq) + CompositionScanner.compute_results(self.comp) + OtherScanner.compute_results(self.other) + res = [intro] + res += ["__Frequency__:"] + res += self.freq.to_string() + res += ["__Composition__:"] + res += self.comp.to_string() + res += ["__Other__:"] + res += self.other.to_string() + return res diff --git a/src/scanners/other_scanner.py b/src/scanners/other_scanner.py index f8253d0..a212b84 100644 --- a/src/scanners/other_scanner.py +++ b/src/scanners/other_scanner.py @@ -46,6 +46,7 @@ class OtherScanner(Scanner): impacted = False # If author is included in the selection (empty list is all) if len(raw_members) == 0 or message.author in raw_members: + impacted = True pass # TODO return impacted