From 7bb7700157a9034166299253714b7fe32951bbbb Mon Sep 17 00:00:00 2001 From: klemek Date: Thu, 14 Jan 2021 18:14:37 +0100 Subject: [PATCH] new scanner %msg --- src/main.py | 7 +++ src/scanners/__init__.py | 1 + src/scanners/messages_scanner.py | 81 ++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 src/scanners/messages_scanner.py diff --git a/src/main.py b/src/main.py index 0cef728..4616e41 100644 --- a/src/main.py +++ b/src/main.py @@ -10,6 +10,7 @@ from scanners import ( PresenceScanner, MentionsScanner, MentionedScanner, + MessagesScanner, ) from logs import GuildLogs @@ -51,6 +52,12 @@ bot.register_command( "emojis: rank emojis by their usage", EmotesScanner.help(), ) +bot.register_command( + "(messages?|msg)", + lambda *args: MessagesScanner().compute(*args), + "msg: rank users mentions by their messages", + MessagesScanner.help(), +) bot.register_command( "pres(ence)?", lambda *args: PresenceScanner().compute(*args), diff --git a/src/scanners/__init__.py b/src/scanners/__init__.py index 47999ff..b65f2e4 100644 --- a/src/scanners/__init__.py +++ b/src/scanners/__init__.py @@ -5,3 +5,4 @@ from .presence_scanner import PresenceScanner from .full_scanner import FullScanner from .mentions_scanner import MentionsScanner from .mentioned_scanner import MentionedScanner +from .messages_scanner import MessagesScanner diff --git a/src/scanners/messages_scanner.py b/src/scanners/messages_scanner.py new file mode 100644 index 0000000..cd0fd4e --- /dev/null +++ b/src/scanners/messages_scanner.py @@ -0,0 +1,81 @@ +from typing import Dict, List +from collections import defaultdict +import discord + + +# Custom libs + +from logs import ChannelLogs, MessageLog +from .scanner import Scanner +from data_types import Counter +from utils import COMMON_HELP_ARGS, plural, precise, mention, alt_mention + + +class MessagesScanner(Scanner): + @staticmethod + def help() -> str: + return ( + "```\n" + + "%msg: Rank users mentions by their messages\n" + + "arguments:\n" + + COMMON_HELP_ARGS + + "* - top , default is 10\n" + + "* all - include bots\n" + + "Example: %msg 10 #channel\n" + + "```" + ) + + def __init__(self): + super().__init__( + has_digit_args=True, + valid_args=["all"], + help=MessagesScanner.help(), + intro_context="Messages", + ) + + async def init(self, message: discord.Message, *args: str) -> bool: + # get max emotes to view + self.top = 10 + for arg in args: + if arg.isdigit(): + self.top = int(arg) + self.all_mentions = "all" in args + # Create mentions dict + self.messages = defaultdict(Counter) + return True + + def compute_message(self, channel: ChannelLogs, message: MessageLog): + return MessagesScanner.analyse_message( + message, self.messages, self.raw_members, all_mentions=self.all_mentions + ) + + def get_results(self, intro: str) -> List[str]: + names = [name for name in self.messages] + names.sort(key=lambda name: self.messages[name].score(), reverse=True) + names = names[: self.top] + usage_count = sum([message.usages for message in self.messages.values()]) + res = [intro] + res += [ + self.messages[name].to_string( + names.index(name), + mention(name), + total_usage=usage_count, + counted="message", + ) + for name in names + ] + return res + + @staticmethod + def analyse_message( + message: MessageLog, + messages: Dict[str, Counter], + raw_members: List[int], + *, + all_mentions: bool, + ) -> bool: + impacted = False + if not message.bot or all_mentions: + impacted = True + messages[message.author].update_use(1, message.created_at) + return impacted