From 8b5b43e0990b7c647293cfdb131228141346bce7 Mon Sep 17 00:00:00 2001 From: Joren Date: Mon, 6 Feb 2023 23:44:33 +0100 Subject: [PATCH 1/7] add: basic impl of event manager --- main.py | 11 +++++--- src/globals/__init__.py | 0 src/globals/client_instance.py | 22 +++++++++++++++ .../{discord_client.py => event_manager.py} | 9 +++---- src/utils/singleton.py | 7 +++++ src/utils/small_utility.py | 27 ------------------- 6 files changed, 40 insertions(+), 36 deletions(-) create mode 100644 src/globals/__init__.py create mode 100644 src/globals/client_instance.py rename src/managers/{discord_client.py => event_manager.py} (64%) create mode 100644 src/utils/singleton.py diff --git a/main.py b/main.py index 6264cc8..9d1aad8 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,16 @@ import asyncio -from src.utils.small_utility import get_env_token, setup_bot +from src.globals.client_instance import DiscordClient, setup_bot + +from src.utils.small_utility import get_env_token async def main(): - client = await setup_bot() + await setup_bot() # Get token from .env and start up bot accordingly - await client.start(get_env_token("TOKEN")) + await DiscordClient().start(get_env_token("TOKEN")) + -if __name__ == '__main__': +if __name__ == "__main__": asyncio.run(main()) diff --git a/src/globals/__init__.py b/src/globals/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/globals/client_instance.py b/src/globals/client_instance.py new file mode 100644 index 0000000..460ccd1 --- /dev/null +++ b/src/globals/client_instance.py @@ -0,0 +1,22 @@ +import discord + +from src.managers.event_manager import EventManager +from src.managers.cog_system import CogSystem + + +async def setup_bot(): + intents = discord.Intents.default() + intents.message_content = True + + # Initialise discord bot singleton + DiscordClient(command_prefix="!", intents=intents, help_command=None) + + # Initialise cog system + cog_system = CogSystem(DiscordClient()) + + # Register all cogs to client + await cog_system.reg_cogs() + + +# Typedef for clarity, make sure to import DiscordClient +DiscordClient = EventManager diff --git a/src/managers/discord_client.py b/src/managers/event_manager.py similarity index 64% rename from src/managers/discord_client.py rename to src/managers/event_manager.py index fecb990..1a5f93a 100644 --- a/src/managers/discord_client.py +++ b/src/managers/event_manager.py @@ -1,7 +1,10 @@ from discord.ext import commands +from src.utils.singleton import Singleton -class _DiscordClientManager(commands.Bot): + +# Warning: Unless you have a very good reason to use this class, please do not touch it. +class EventManager(commands.Bot, metaclass=Singleton): async def on_ready(self): print(f"Logged on as {self.user}!") @@ -10,7 +13,3 @@ async def on_message(self, message): await self.process_commands(message) print(f"Message from {message.author}: {message.content}") - - -# Typedef for clarity, make sure to import DiscordClient -DiscordClient = _DiscordClientManager diff --git a/src/utils/singleton.py b/src/utils/singleton.py new file mode 100644 index 0000000..3776cb9 --- /dev/null +++ b/src/utils/singleton.py @@ -0,0 +1,7 @@ +class Singleton(type): + _instances = {} + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) + return cls._instances[cls] diff --git a/src/utils/small_utility.py b/src/utils/small_utility.py index 0b00efa..ed09c03 100644 --- a/src/utils/small_utility.py +++ b/src/utils/small_utility.py @@ -1,12 +1,8 @@ import os import os.path -import discord from dotenv import load_dotenv -from src.managers.discord_client import DiscordClient -from src.managers.cog_system import CogSystem - # TODO: Impl proper error handling def get_env_token(req_token): @@ -22,26 +18,3 @@ def get_env_token(req_token): exit(1) return token - - -async def _create_client_instance(): - # New python API update requires these - intents = discord.Intents.default() - intents.message_content = True - - # Create discord bot instance - return DiscordClient(command_prefix="!", intents=intents, help_command=None) - - -async def setup_bot(): - # Create discord bot instance - client = await _create_client_instance() - - # Initialise cog system - cog_system = CogSystem(client) - - # Register all cogs to client - await cog_system.reg_cogs() - - # Return client so the .start() can be ran - return client From 597728624d9c38240866e33bd4079c860521bac9 Mon Sep 17 00:00:00 2001 From: Joren Date: Tue, 7 Feb 2023 00:40:05 +0100 Subject: [PATCH 2/7] rework: whole concept behind event management --- main.py | 21 +++++++++++++++++++-- src/events/__init__.py | 0 src/events/default_events.py | 17 +++++++++++++++++ src/events/event_base.py | 8 ++++++++ src/globals/client_instance.py | 24 +++++------------------- src/managers/event_manager.py | 20 +++++++------------- 6 files changed, 56 insertions(+), 34 deletions(-) create mode 100644 src/events/__init__.py create mode 100644 src/events/default_events.py create mode 100644 src/events/event_base.py diff --git a/main.py b/main.py index 9d1aad8..741d298 100644 --- a/main.py +++ b/main.py @@ -1,12 +1,29 @@ import asyncio +import discord -from src.globals.client_instance import DiscordClient, setup_bot +from src.globals.client_instance import DiscordClient +# Setup bot and initialise singleton +intents = discord.Intents.default() +intents.message_content = True +DiscordClient(command_prefix="!", intents=intents, help_command=None) + + +# Imported after to ensure DiscordClient() isnt called before initial initialization. from src.utils.small_utility import get_env_token +from src.managers.event_manager import EventManager +from src.managers.cog_system import CogSystem async def main(): - await setup_bot() + # Initialise event manager + EventManager() + + # Initialise cog system + cog_system = CogSystem(DiscordClient()) + + # Register all cogs to client + await cog_system.reg_cogs() # Get token from .env and start up bot accordingly await DiscordClient().start(get_env_token("TOKEN")) diff --git a/src/events/__init__.py b/src/events/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/events/default_events.py b/src/events/default_events.py new file mode 100644 index 0000000..9ed7911 --- /dev/null +++ b/src/events/default_events.py @@ -0,0 +1,17 @@ +from src.globals.client_instance import DiscordClient + +# List of all available events & the client instance +_discord_client = DiscordClient() + + +@_discord_client.event +async def on_ready(): + print(f"Logged on as {_discord_client.user}!") + + +@_discord_client.event +async def on_message(message): + print(f"Message lol {message.author}: {message.content}") + + # Ensures commands work properly, wont process any commands without it. + await _discord_client.process_commands(message) diff --git a/src/events/event_base.py b/src/events/event_base.py new file mode 100644 index 0000000..61133bf --- /dev/null +++ b/src/events/event_base.py @@ -0,0 +1,8 @@ +from abc import ABCMeta, abstractmethod + + +class AbstractEventBase(metaclass=ABCMeta): + @property + @abstractmethod + def on_event(self): + pass diff --git a/src/globals/client_instance.py b/src/globals/client_instance.py index 460ccd1..d7eaa55 100644 --- a/src/globals/client_instance.py +++ b/src/globals/client_instance.py @@ -1,22 +1,8 @@ -import discord +from discord.ext import commands -from src.managers.event_manager import EventManager -from src.managers.cog_system import CogSystem +from src.utils.singleton import Singleton -async def setup_bot(): - intents = discord.Intents.default() - intents.message_content = True - - # Initialise discord bot singleton - DiscordClient(command_prefix="!", intents=intents, help_command=None) - - # Initialise cog system - cog_system = CogSystem(DiscordClient()) - - # Register all cogs to client - await cog_system.reg_cogs() - - -# Typedef for clarity, make sure to import DiscordClient -DiscordClient = EventManager +# NOTE: Skeleton of the client to ensure only one object of commands.bot is created by utilising a singleton +class DiscordClient(commands.Bot, metaclass=Singleton): + pass diff --git a/src/managers/event_manager.py b/src/managers/event_manager.py index 1a5f93a..daa8a32 100644 --- a/src/managers/event_manager.py +++ b/src/managers/event_manager.py @@ -1,15 +1,9 @@ -from discord.ext import commands +# Initialises all default events +from src.events.default_events import * -from src.utils.singleton import Singleton - -# Warning: Unless you have a very good reason to use this class, please do not touch it. -class EventManager(commands.Bot, metaclass=Singleton): - async def on_ready(self): - print(f"Logged on as {self.user}!") - - async def on_message(self, message): - # Ensures commands work properly, wont process any commands without it. - await self.process_commands(message) - - print(f"Message from {message.author}: {message.content}") +# Manages the events +class EventManager: + def __init__(self): + # Reg events here if theres no better way... + pass From 0e3d2a16ad1a11ec55764b82b3b982edba6baf87 Mon Sep 17 00:00:00 2001 From: Joren Date: Tue, 7 Feb 2023 00:42:57 +0100 Subject: [PATCH 3/7] fix: location of imports --- main.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/main.py b/main.py index 741d298..4380d32 100644 --- a/main.py +++ b/main.py @@ -9,13 +9,12 @@ DiscordClient(command_prefix="!", intents=intents, help_command=None) -# Imported after to ensure DiscordClient() isnt called before initial initialization. -from src.utils.small_utility import get_env_token -from src.managers.event_manager import EventManager -from src.managers.cog_system import CogSystem - - async def main(): + # Imported after to ensure DiscordClient() isnt called before initial initialization. + from src.utils.small_utility import get_env_token + from src.managers.event_manager import EventManager + from src.managers.cog_system import CogSystem + # Initialise event manager EventManager() From 89683809a7377e4c834e72b83cc9ce5c65f37ae5 Mon Sep 17 00:00:00 2001 From: Joren Date: Tue, 7 Feb 2023 00:44:27 +0100 Subject: [PATCH 4/7] fix: poorly phrased comment --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 4380d32..3899965 100644 --- a/main.py +++ b/main.py @@ -3,7 +3,7 @@ from src.globals.client_instance import DiscordClient -# Setup bot and initialise singleton +# Initialise singleton with bot instance intents = discord.Intents.default() intents.message_content = True DiscordClient(command_prefix="!", intents=intents, help_command=None) From aaebaf7aa50ff22220a0abcab3d3544204e7027e Mon Sep 17 00:00:00 2001 From: Joren Date: Tue, 7 Feb 2023 00:46:11 +0100 Subject: [PATCH 5/7] move: dev files to detail folder --- src/events/{ => detail}/default_events.py | 0 src/events/{ => detail}/event_base.py | 0 src/managers/event_manager.py | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename src/events/{ => detail}/default_events.py (100%) rename src/events/{ => detail}/event_base.py (100%) diff --git a/src/events/default_events.py b/src/events/detail/default_events.py similarity index 100% rename from src/events/default_events.py rename to src/events/detail/default_events.py diff --git a/src/events/event_base.py b/src/events/detail/event_base.py similarity index 100% rename from src/events/event_base.py rename to src/events/detail/event_base.py diff --git a/src/managers/event_manager.py b/src/managers/event_manager.py index daa8a32..71518dc 100644 --- a/src/managers/event_manager.py +++ b/src/managers/event_manager.py @@ -1,5 +1,5 @@ # Initialises all default events -from src.events.default_events import * +from src.events.detail.default_events import * # Manages the events From 367034490fe6addac5a6f2bd8d1a05f28bf51c1a Mon Sep 17 00:00:00 2001 From: Joren Date: Tue, 7 Feb 2023 17:45:51 +0100 Subject: [PATCH 6/7] add: working listener/observer pattern --- src/events/detail/default_events.py | 12 +++++++++--- src/events/detail/event_base.py | 11 +++++++++-- src/events/language_filter.py | 8 ++++++++ src/events/print_message.py | 6 ++++++ src/events/welcome_message.py | 7 +++++++ src/managers/event_manager.py | 21 +++++++++++++++++++-- 6 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 src/events/language_filter.py create mode 100644 src/events/print_message.py create mode 100644 src/events/welcome_message.py diff --git a/src/events/detail/default_events.py b/src/events/detail/default_events.py index 9ed7911..a2ba503 100644 --- a/src/events/detail/default_events.py +++ b/src/events/detail/default_events.py @@ -6,12 +6,18 @@ @_discord_client.event async def on_ready(): - print(f"Logged on as {_discord_client.user}!") + from src.managers.event_manager import EventManager + + for each in EventManager.on_ready_events: + await each.on_ready() @_discord_client.event async def on_message(message): - print(f"Message lol {message.author}: {message.content}") - # Ensures commands work properly, wont process any commands without it. await _discord_client.process_commands(message) + + from src.managers.event_manager import EventManager + + for each in EventManager.on_message_events: + await each.on_message(message) diff --git a/src/events/detail/event_base.py b/src/events/detail/event_base.py index 61133bf..91aba14 100644 --- a/src/events/detail/event_base.py +++ b/src/events/detail/event_base.py @@ -1,8 +1,15 @@ from abc import ABCMeta, abstractmethod -class AbstractEventBase(metaclass=ABCMeta): +class OnReadyEvent(metaclass=ABCMeta): @property @abstractmethod - def on_event(self): + def on_ready(self): + pass + + +class OnMessageEvent(metaclass=ABCMeta): + @property + @abstractmethod + def on_message(self, message): pass diff --git a/src/events/language_filter.py b/src/events/language_filter.py new file mode 100644 index 0000000..9c619a1 --- /dev/null +++ b/src/events/language_filter.py @@ -0,0 +1,8 @@ +from src.events.detail.event_base import OnMessageEvent +from src.globals.client_instance import DiscordClient + + +class LanguageFilter(OnMessageEvent): + async def on_message(self, message) -> None: + if message.content == "kanker": + await message.channel.send("Doe is rustig broertje.") diff --git a/src/events/print_message.py b/src/events/print_message.py new file mode 100644 index 0000000..b29acc3 --- /dev/null +++ b/src/events/print_message.py @@ -0,0 +1,6 @@ +from src.events.detail.event_base import OnMessageEvent + + +class PrintMessage(OnMessageEvent): + async def on_message(self, message) -> None: + print(f"Message {message.author}: {message.content}") diff --git a/src/events/welcome_message.py b/src/events/welcome_message.py new file mode 100644 index 0000000..7b236f7 --- /dev/null +++ b/src/events/welcome_message.py @@ -0,0 +1,7 @@ +from src.events.detail.event_base import OnReadyEvent +from src.globals.client_instance import DiscordClient + + +class WelcomeMessage(OnReadyEvent): + async def on_ready(self) -> None: + print(f"Logged on as {DiscordClient().user}!") diff --git a/src/managers/event_manager.py b/src/managers/event_manager.py index 71518dc..2e5579a 100644 --- a/src/managers/event_manager.py +++ b/src/managers/event_manager.py @@ -4,6 +4,23 @@ # Manages the events class EventManager: + # Declare static member lists of event objects + on_ready_events = [] + on_message_events = [] + def __init__(self): - # Reg events here if theres no better way... - pass + # Create & register events + self.register_events() + + def register_events(self): + # Please include the py module that contains your feature and create an instance + # fmt: off + from src.events.welcome_message import WelcomeMessage + self.on_ready_events.append(WelcomeMessage()) + + from src.events.print_message import PrintMessage + self.on_message_events.append(PrintMessage()) + + from src.events.language_filter import LanguageFilter + self.on_message_events.append(LanguageFilter()) + # fmt: on From 57272f67837e75b7eac93c9886471c1045e62b21 Mon Sep 17 00:00:00 2001 From: Joren Date: Wed, 8 Feb 2023 02:19:15 +0100 Subject: [PATCH 7/7] modify: lang filter, fix: missing dependency --- Pipfile | 1 + Pipfile.lock | 122 ++++++++++++++++++++++++++++++---- src/events/language_filter.py | 12 +++- 3 files changed, 121 insertions(+), 14 deletions(-) diff --git a/Pipfile b/Pipfile index d72c352..2f3af2f 100644 --- a/Pipfile +++ b/Pipfile @@ -9,6 +9,7 @@ python-dotenv = "*" [dev-packages] black = "*" +jishaku = "*" [requires] python_version = "3.11" diff --git a/Pipfile.lock b/Pipfile.lock index 524447e..697d7a6 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "4275acac3d9857028985da197ac4685aad71cb45f59c8179d76eee99710c1a48" + "sha256": "8c16d815c261426706fafcf1a14c4bc1f346cef43d63ba0b959e35f94f16d2d2" }, "pipfile-spec": 6, "requires": { @@ -407,6 +407,13 @@ } }, "develop": { + "astunparse": { + "hashes": [ + "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", + "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8" + ], + "version": "==1.6.3" + }, "black": { "hashes": [ "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd", @@ -438,6 +445,13 @@ "index": "pypi", "version": "==23.1.0" }, + "braceexpand": { + "hashes": [ + "sha256:91332d53de7828103dcae5773fb43bc34950b0c8160e35e0f44c4427a3b85014", + "sha256:e6e539bd20eaea53547472ff94f4fb5c3d3bf9d0a89388c4b56663aba765f705" + ], + "version": "==0.1.7" + }, "click": { "hashes": [ "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", @@ -446,12 +460,88 @@ "markers": "python_version >= '3.7'", "version": "==8.1.3" }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "platform_system == 'Windows'", + "version": "==0.4.6" + }, + "import-expression": { + "hashes": [ + "sha256:06086a6ab3bfa528b1c478e633d6adf2b3a990e31440f6401b0f3ea12b0659a9", + "sha256:292099910a4dcc65ba562377cd2265487ba573dd63d73bdee5deec36ca49555b" + ], + "version": "==1.1.4" + }, + "jishaku": { + "hashes": [ + "sha256:01c9ddcdb3c5a43806bf8c146d2d6ebd8818ad93f07e1713386db70690e7bd5d", + "sha256:7105310bb4e08d3e67c84a25c7bfb4619fa45ca3dbd134ae219f96f5fb4510db", + "sha256:74ed2fda23beed4214a1df35132691c96bfee289f777685d6e3fd81344ecf7e0", + "sha256:9ae8beaf907c1fd8b35d23bff8af4f8dd6a2cf58bce89878905fa815dfc506d0", + "sha256:f05380834662f572576984569f9b0bad83863afdf46d3566f9cc008dc95b70d2" + ], + "index": "pypi", + "version": "==2.5.1" + }, + "line-profiler": { + "hashes": [ + "sha256:0cd9e0679e14fa79efcbd23e50027ea7b91dbd73b3f563556be450acedda0dd2", + "sha256:0de5f977c6387e1a9799fdb09e62707e28d9e7be2911ac1fa8132e19dbf2e4ac", + "sha256:14e9e17e7462325a9f8334815294ac6a319ffa471db0b3c85affd2eeb72f4ab0", + "sha256:1a6aa784790a299676409420f1707d6c72456703499503f283fa62106549b928", + "sha256:1c45d54f8fbeb95016cd83e3e6ee3ae0746b05da612b4d3b2d7600dd3bdf5cee", + "sha256:1ea823094d3fa4c19bda80f97e23c8968f0de0a26ce0292f940b351886d0006c", + "sha256:224dff75befa6589673efd11cbb23b5de9086c075eae37aa03d9a426d6b00aac", + "sha256:25e8c9d4248dc48905801851ff8a75b9c74827a0871d118d1104d8e43d7fb0fc", + "sha256:37a03c75f478d132555f79216966cea7c5038d3e76311a209cb85d3a2c109c6d", + "sha256:38218ffb3a7140843615aa3ba2f90dc0a61d1ebb4b8734ed4e66b9f5386c5811", + "sha256:3b3ffca66ee09fd6c2b1b31336b8510c1142d9f5bd3397fa38ee0648af6272d9", + "sha256:3ba3d088b17a9c902e95c0cb23017f1df1356e33e5b01a4f65c2cba710b78c17", + "sha256:3ceefb2443504021d3b509a25af2c1232d9866bf0022e97e248fce492e7c2ca7", + "sha256:3dd66972da651cb48acff95cb5e953c1bbb8d15b84e8d2f03b24c132c2618d1b", + "sha256:4904d263a16e8561ad312b7fa97f19cbf730c4d053c7535b9ea7674a7b2002c9", + "sha256:518818bea6ff084ffffe1e7f65d345f389259a5d2b12ed4d75b9a62b79ac3268", + "sha256:53c4dd01c8f6066db200edb9b99fd6038dcf5582588d0a90c8747713e1cc9cce", + "sha256:541a5798c1debc6be52090e26096c6a9faf8c9e6608f49d1b7fc6ddba1a16dea", + "sha256:5978f48e47328df82d5f3959ba03b1d099c927d4c4bd1ea65bcdd7960af506d6", + "sha256:5b18e84e5d5245337bd157989a1d6d79c08f402caaeb73fe020d927f0cd1cab0", + "sha256:657e5638e2b14140f720a296ae0e5404a3ec3b57f8993de38b8b8d4d364ad232", + "sha256:6970818772e69215734221226a3a94cf1dc5cfc63e700694a42c998b5b2ce22d", + "sha256:6f78d3b7055694e0a375bd2f7ff96c96479beea8ee500e4e4a1e0e8339b46280", + "sha256:76b4778bbafc12ba44846622a083a7a2e2a0214d63bb37478bd42b0a2f226c0c", + "sha256:784e1af0901fffcfc5e4172b0eeb4753475d7493aa10898e7742598bd37afa64", + "sha256:7c9585da4003666167373ac219cdaeeaecafa3f8e16ced302e05f3da3956cffc", + "sha256:7d2dcffabf9794678a709888684541f39b3b6ff2b1fd06365df5a56578f73973", + "sha256:803c926aaebc036d6af6f3c428fc5e5eb07d0708a86563b31c5efc170ba55a63", + "sha256:90a957e45bbc15a261d866f5ab46092f61fd7a025701820309ef04f18cdaaf4c", + "sha256:930e47bf506cbaeaafd0333289236b0ade553c2bfe11ac09ae276a92813b60a3", + "sha256:967a31032dbc7345b936fc516de59ab92b43913bf9a3a81b4888329f16665222", + "sha256:99e7e78ad515d2f9e70d2536e403c2c26b3990a21ebb070296b22b14e709f1f2", + "sha256:9caea9600d5a6bfd5b3d8833afb3f1866f8a22f0839d1f17c6fcf5e87edea6fa", + "sha256:ac262bd6d87dbdd4959941a699131e4f4daeb03f308eb785775dd61e52a272f1", + "sha256:b1f0a6e00d24a1064ee4fbe3ae62406e71b11065aab7aa448c1242035125e74e", + "sha256:c3df5fb8a2a2c9b43498f3214cbac871fa7303572c19fe8157f2d95986fc9c4b", + "sha256:c4be7c7f6995af1b4c98fc7d64910389e139052f04502f75195a8eb783b6c3da", + "sha256:d6eb20bbc089d166523349af733e8670dde4a94ca4a9eb4a44081f4bc0365552", + "sha256:d715e31962e84100ff3d09caec5a26e940b31675020cee55608be62a236dffc6", + "sha256:d78ef5527b00c849e4edb42012c4bb036776b46b24ddd64ba4c49f02e79a4fc3", + "sha256:dc25a5483711e9f106cc7820027b0df5adedec4473e492d2d37f95d76aca1b41", + "sha256:f3765aed8434623797b135bdf41239957ca386ffcce4d7f8e5f639757673aa01", + "sha256:f3f8d91b6e8a86790436713a5853aa57718fe378796d452619531cabb54ae8eb" + ], + "markers": "python_version >= '3.6'", + "version": "==4.0.2" + }, "mypy-extensions": { "hashes": [ - "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", - "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" ], - "version": "==0.4.3" + "markers": "python_version >= '3.5'", + "version": "==1.0.0" }, "packaging": { "hashes": [ @@ -471,19 +561,27 @@ }, "platformdirs": { "hashes": [ - "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490", - "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2" + "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9", + "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567" ], "markers": "python_version >= '3.7'", - "version": "==2.6.2" + "version": "==3.0.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" }, - "tomli": { + "wheel": { "hashes": [ - "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac", + "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8" ], - "markers": "python_version < '3.11'", - "version": "==2.0.1" + "markers": "python_version >= '3.7'", + "version": "==0.38.4" } } } diff --git a/src/events/language_filter.py b/src/events/language_filter.py index 9c619a1..6a66465 100644 --- a/src/events/language_filter.py +++ b/src/events/language_filter.py @@ -3,6 +3,14 @@ class LanguageFilter(OnMessageEvent): + # TODO: Ship them in a file, and create the ability to add/remove words runtime. + kBadWordsList = ["kanker", "flikker", "can3cer"] + async def on_message(self, message) -> None: - if message.content == "kanker": - await message.channel.send("Doe is rustig broertje.") + for bad_word in self.kBadWordsList: + if bad_word in message.content.lower(): + await message.delete() + await message.channel.send( + f"Hey {message.author.mention}, keep it civil blud." + ) + break