Skip to content

Commit

Permalink
feat(filters): added custom regex filter
Browse files Browse the repository at this point in the history
  • Loading branch information
HitaloM committed Jul 22, 2024
1 parent e56ed87 commit 0a4d880
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 7 deletions.
8 changes: 4 additions & 4 deletions locales/bot.pot
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PyKorone 1.0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-07-21 19:23-0300\n"
"POT-Creation-Date: 2024-07-22 20:08-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
Expand Down Expand Up @@ -675,15 +675,15 @@ msgstr ""
msgid "Unknown flag: {flag}"
msgstr ""

#: src/korone/modules/regex/handlers/sed.py:40
#: src/korone/modules/regex/handlers/sed.py:41
msgid "Regex error: {e}"
msgstr ""

#: src/korone/modules/regex/handlers/sed.py:48
#: src/korone/modules/regex/handlers/sed.py:49
msgid "Your regex didn't change anything from the original message."
msgstr ""

#: src/korone/modules/regex/handlers/sed.py:50
#: src/korone/modules/regex/handlers/sed.py:51
msgid "No message to apply the substitution."
msgstr ""

Expand Down
11 changes: 10 additions & 1 deletion src/korone/filters/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@
from korone.filters.admin import IsAdmin
from korone.filters.chat import IsGroupChat, IsPrivateChat
from korone.filters.command import Command, CommandObject
from korone.filters.regex import Regex
from korone.filters.sudo import IsSudo

__all__ = ("Command", "CommandObject", "IsAdmin", "IsGroupChat", "IsPrivateChat", "IsSudo")
__all__ = (
"Command",
"CommandObject",
"IsAdmin",
"IsGroupChat",
"IsPrivateChat",
"IsSudo",
"Regex",
)
79 changes: 79 additions & 0 deletions src/korone/filters/regex.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2024 Hitalo M. <https://github.com/HitaloM>

from __future__ import annotations

import re
from collections.abc import Iterable, Sequence
from contextlib import suppress
from typing import TYPE_CHECKING

from hydrogram.filters import Filter

if TYPE_CHECKING:
from hydrogram import Client
from hydrogram.types import Message

RegexPatternType = str | re.Pattern


class RegexError(Exception):
pass


class Regex(Filter):
__slots__ = ("ignore_case", "patterns")

def __init__(
self,
*values: RegexPatternType,
patterns: Sequence[RegexPatternType] | RegexPatternType | None = None,
ignore_case: bool = False,
) -> None:
patterns = self._prepare_patterns(values, patterns, ignore_case)
if not patterns:
msg = "Regex filter requires at least one pattern"
raise ValueError(msg)

self.patterns = tuple(patterns)
self.ignore_case = ignore_case

def _prepare_patterns(self, values, patterns, ignore_case):
if isinstance(patterns, str | re.Pattern):
patterns = [patterns]
elif patterns is None:
patterns = []

if not isinstance(patterns, Iterable):
msg = "Regex filter only supports str, re.Pattern object or their Iterable"
raise TypeError(msg)

return [self._process_pattern(pattern, ignore_case) for pattern in (*values, *patterns)]

@staticmethod
def _process_pattern(pattern, ignore_case):
if isinstance(pattern, str):
flags = re.IGNORECASE if ignore_case else 0
pattern = re.compile(pattern, flags)

if not isinstance(pattern, re.Pattern):
msg = "Regex filter only supports str, re.Pattern object or their Iterable"
raise TypeError(msg)

return pattern

async def __call__(self, client: Client, message: Message) -> bool:
if not (message.text or message.caption):
return False

with suppress(RegexError):
return await self.parse_regex(message)

return False

async def parse_regex(self, message: Message) -> bool:
text = message.text or message.caption
if not text:
return False

return any(pattern.search(text) for pattern in self.patterns)
5 changes: 3 additions & 2 deletions src/korone/modules/regex/handlers/sed.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@
# Copyright (c) 2024 Hitalo M. <https://github.com/HitaloM>

import regex as re
from hydrogram import Client, filters
from hydrogram import Client
from hydrogram.types import Message

from korone.decorators import router
from korone.filters import Regex
from korone.handlers.abstract import MessageHandler
from korone.modules.regex.utils import SED_PATTERN, process_command
from korone.utils.i18n import gettext as _


class SedHandler(MessageHandler):
@router.message(filters.regex(SED_PATTERN))
@router.message(Regex(SED_PATTERN))
async def handle(self, client: Client, message: Message) -> None:
match = re.match(SED_PATTERN, message.text)
if match:
Expand Down

0 comments on commit 0a4d880

Please sign in to comment.