Skip to content

Commit 311edde

Browse files
authored
Merge pull request #39 from OpenBuilders/feat/telegram-number-categories
feat: MORE telegram numbers categories
2 parents 028767b + a31bc7f commit 311edde

File tree

7 files changed

+136
-16
lines changed

7 files changed

+136
-16
lines changed

backend/api/routes/admin/resource.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@ async def get_nft_collection_categories() -> list[CategoriesFDO]:
6666
return [
6767
CategoriesFDO(
6868
asset=asset.value,
69-
categories=list(category_definition.enum)
70-
+ ([None] if category_definition.is_optional else []),
69+
categories=(
70+
([None] if category_definition.is_optional else [])
71+
+ list(category_definition.enum)
72+
),
7173
)
7274
for asset, category_definition in ASSET_TO_CATEGORY_TYPE_MAPPING.items()
7375
]

backend/core/actions/chat/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class TelegramChatAction(BaseAction):
5757
def __init__(
5858
self, db_session: Session, telethon_client: TelegramClient | None = None
5959
):
60-
logger.info(f"Initializing TelegramChatAction {telethon_client=}")
6160
super().__init__(db_session)
6261
self.telegram_chat_service = TelegramChatService(db_session)
6362
self.telegram_chat_user_service = TelegramChatUserService(db_session)

backend/core/enums/nft.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,19 @@ class TelegramUsernameCategory(enum.StrEnum):
4545
class TelegramNumberCategory(enum.StrEnum):
4646
DIGITS_7 = "7 digits"
4747
DIGITS_11 = "11 digits"
48+
CLUB_007 = "007 Club"
49+
CLUB_69 = "69 Club"
50+
CLUB_420 = "420 Club"
51+
CLUB_666 = "666 Club"
52+
CLUB_777 = "777 Club"
53+
CLUB_888 = "888 Club"
54+
CLUB_1337 = "1337 Club"
55+
CLUB_BINARY = "Binary Club"
56+
REPEAT_2 = "XX"
57+
REPEAT_3 = "XXX"
58+
REPEAT_4 = "XXXX"
59+
REPEAT_5 = "XXXXX"
60+
YEAR = "Year"
4861

4962

5063
class TonDnsCategory(enum.StrEnum):

backend/core/services/supertelethon.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def __init__(self, client: TelegramClient | None = None) -> None:
4848
async def start(self) -> None:
4949
if self.client.is_connected():
5050
return
51+
logger.info("Initiating Telethon connection.")
5152
await self.client.start(bot_token=core_settings.telegram_bot_token)
5253

5354
def start_sync(self) -> None:
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import re
2+
3+
DIGIT_REPEATS_AT_LEAST_TWICE = re.compile(r"(\d)\1+")
4+
DIGIT_REPEATS_AT_LEAST_THRICE = re.compile(r"(\d)\1{2,}")
5+
DIGIT_REPEATS_AT_LEAST_FOURTH = re.compile(r"(\d)\1{3,}")
6+
DIGIT_REPEATS_AT_LEAST_FIFTH = re.compile(r"(\d)\1{4,}")
7+
DIGIT_IS_YEAR = re.compile(r"(19[0-9]{2}|20(0[0-9]|([12])[0-9]))")
8+
DIGIT_IS_BINARY = re.compile(r"^[01]+$")

backend/core/utils/custom_rules/mapping.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
from collections.abc import Callable
22

3+
from core.utils.custom_rules.constants import (
4+
DIGIT_REPEATS_AT_LEAST_TWICE,
5+
DIGIT_REPEATS_AT_LEAST_THRICE,
6+
DIGIT_REPEATS_AT_LEAST_FOURTH,
7+
DIGIT_REPEATS_AT_LEAST_FIFTH,
8+
DIGIT_IS_YEAR,
9+
DIGIT_IS_BINARY,
10+
)
311
from core.utils.custom_rules.telegram_gifts import handle_telegram_gifts_type_category
412
from core.utils.custom_rules.telegram_numbers import (
513
handle_telegram_numbers_length_category,
14+
handle_telegram_numbers_substring_category,
15+
handle_telegram_numbers_regex_match_category,
616
)
717
from core.enums.nft import (
818
TelegramNumberCategory,
@@ -27,6 +37,45 @@
2737
TelegramNumberCategory.DIGITS_11: handle_telegram_numbers_length_category(
2838
target_length=8
2939
),
40+
TelegramNumberCategory.CLUB_007: handle_telegram_numbers_substring_category(
41+
substring="007"
42+
),
43+
TelegramNumberCategory.CLUB_69: handle_telegram_numbers_substring_category(
44+
substring="69"
45+
),
46+
TelegramNumberCategory.CLUB_420: handle_telegram_numbers_substring_category(
47+
substring="420"
48+
),
49+
TelegramNumberCategory.CLUB_666: handle_telegram_numbers_substring_category(
50+
substring="666"
51+
),
52+
TelegramNumberCategory.CLUB_777: handle_telegram_numbers_substring_category(
53+
substring="777"
54+
),
55+
TelegramNumberCategory.CLUB_888: handle_telegram_numbers_substring_category(
56+
substring="888"
57+
),
58+
TelegramNumberCategory.CLUB_1337: handle_telegram_numbers_substring_category(
59+
substring="1337"
60+
),
61+
TelegramNumberCategory.REPEAT_2: handle_telegram_numbers_regex_match_category(
62+
regex_pattern=DIGIT_REPEATS_AT_LEAST_TWICE,
63+
),
64+
TelegramNumberCategory.REPEAT_3: handle_telegram_numbers_regex_match_category(
65+
regex_pattern=DIGIT_REPEATS_AT_LEAST_THRICE,
66+
),
67+
TelegramNumberCategory.REPEAT_4: handle_telegram_numbers_regex_match_category(
68+
regex_pattern=DIGIT_REPEATS_AT_LEAST_FOURTH,
69+
),
70+
TelegramNumberCategory.REPEAT_5: handle_telegram_numbers_regex_match_category(
71+
regex_pattern=DIGIT_REPEATS_AT_LEAST_FIFTH,
72+
),
73+
TelegramNumberCategory.YEAR: handle_telegram_numbers_regex_match_category(
74+
regex_pattern=DIGIT_IS_YEAR,
75+
),
76+
TelegramNumberCategory.CLUB_BINARY: handle_telegram_numbers_regex_match_category(
77+
regex_pattern=DIGIT_IS_BINARY,
78+
),
3079
# Telegram Usernames
3180
TelegramUsernameCategory.LETTERS_4: handle_telegram_username_length_category(
3281
target_length=4

backend/core/utils/custom_rules/telegram_numbers.py

Lines changed: 61 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import re
12
from collections.abc import Callable
23

34
from core.enums.nft import NftCollectionAsset
@@ -16,6 +17,34 @@ def __len__(self):
1617
return len(self.digits)
1718

1819

20+
def _is_telegram_number(nft_item: NftItem) -> bool:
21+
if (
22+
nft_item.collection_address
23+
!= NFT_ASSET_TO_ADDRESS_MAPPING[NftCollectionAsset.TELEGRAM_NUMBER]
24+
):
25+
return False
26+
27+
if not nft_item.blockchain_metadata.name:
28+
return False
29+
30+
return True
31+
32+
33+
def _is_valid_length(item: NftItem, target_length: int) -> bool:
34+
telegram_number = TelegramNumber(item.blockchain_metadata.name)
35+
return len(telegram_number) <= target_length
36+
37+
38+
def _is_substring_in_number(item: NftItem, substring: str) -> bool:
39+
telegram_number = TelegramNumber(item.blockchain_metadata.name)
40+
return substring in telegram_number.digits
41+
42+
43+
def _is_regex_matched(item: NftItem, regex_pattern: re.Pattern) -> bool:
44+
telegram_number = TelegramNumber(item.blockchain_metadata.name)
45+
return bool(regex_pattern.match(telegram_number.digits))
46+
47+
1948
def handle_telegram_numbers_length_category(
2049
target_length: int,
2150
) -> Callable[[list[NftItem]], list[NftItem]]:
@@ -31,23 +60,42 @@ def handle_telegram_numbers_length_category(
3160
"""
3261

3362
def _inner(nfts: list[NftItem]) -> list[NftItem]:
34-
valid_nfts = []
63+
return list(
64+
filter(
65+
lambda item: _is_telegram_number(item)
66+
and _is_valid_length(item, target_length=target_length),
67+
nfts,
68+
)
69+
)
70+
71+
return _inner
3572

36-
for nft in nfts:
37-
if (
38-
nft.collection_address
39-
!= NFT_ASSET_TO_ADDRESS_MAPPING[NftCollectionAsset.TELEGRAM_NUMBER]
40-
):
41-
continue
4273

43-
if not nft.blockchain_metadata.name:
44-
continue
74+
def handle_telegram_numbers_substring_category(
75+
substring: str,
76+
) -> Callable[[list[NftItem]], list[NftItem]]:
77+
def _inner(nfts: list[NftItem]) -> list[NftItem]:
78+
return list(
79+
filter(
80+
lambda item: _is_telegram_number(item)
81+
and _is_substring_in_number(item, substring=substring),
82+
nfts,
83+
)
84+
)
4585

46-
telegram_number = TelegramNumber(nft.blockchain_metadata.name)
86+
return _inner
4787

48-
if len(telegram_number) <= target_length:
49-
valid_nfts.append(nft)
5088

51-
return valid_nfts
89+
def handle_telegram_numbers_regex_match_category(
90+
regex_pattern: re.Pattern,
91+
) -> Callable[[list[NftItem]], list[NftItem]]:
92+
def _inner(nfts: list[NftItem]) -> list[NftItem]:
93+
return list(
94+
filter(
95+
lambda item: _is_telegram_number(item)
96+
and _is_regex_matched(item, regex_pattern=regex_pattern),
97+
nfts,
98+
)
99+
)
52100

53101
return _inner

0 commit comments

Comments
 (0)