RULES: easy way
- удален модуль рулз - удалены библиотеки bs4 и lxml - правила теперь в константах и оттуда их получаем по номеру - пофиксил баг в тестах(не мокали инкремент)
This commit is contained in:
Binary file not shown.
+4
-4
@@ -7,9 +7,8 @@ from .admin_commands import bot
|
|||||||
from .constants import (LOG_COMM, FAQ, LIB, RULES, RUS, RUS_ENG_TABLE, ENG_RUS_TABLE, PYTHONCHATRU, ZEN, LUTZ_ID,
|
from .constants import (LOG_COMM, FAQ, LIB, RULES, RUS, RUS_ENG_TABLE, ENG_RUS_TABLE, PYTHONCHATRU, ZEN, LUTZ_ID,
|
||||||
BDMTSS_ID)
|
BDMTSS_ID)
|
||||||
from .filters import in_spam_list, in_caption_spam_list, in_delete_list
|
from .filters import in_spam_list, in_caption_spam_list, in_delete_list
|
||||||
from .helpers import represent_as_get, detect_args, is_admin
|
from .helpers import represent_as_get, detect_args, is_admin, fetch_rule
|
||||||
from .report import update_stats, increment
|
from .report import update_stats, increment
|
||||||
from .rules import fetch_rule
|
|
||||||
from .stan import act, speak
|
from .stan import act, speak
|
||||||
|
|
||||||
|
|
||||||
@@ -65,10 +64,11 @@ async def send_rules(message: types.Message):
|
|||||||
markup = types.InlineKeyboardMarkup([[RULES]], 1)
|
markup = types.InlineKeyboardMarkup([[RULES]], 1)
|
||||||
args = message.text.split()
|
args = message.text.split()
|
||||||
logging.info(LOG_COMM % (message.chat.title, message.from_user.id, message.from_user.first_name, message.text))
|
logging.info(LOG_COMM % (message.chat.title, message.from_user.id, message.from_user.first_name, message.text))
|
||||||
if len(args) > 1 and args[-1].isdigit() and 0 < int(args[-1]):
|
if len(args) > 1 and args[-1].isdigit():
|
||||||
|
index = int(args[-1])
|
||||||
await send_or_reply(
|
await send_or_reply(
|
||||||
message,
|
message,
|
||||||
f"<b>Правило {args[-1]}</b>\n<i>{fetch_rule(args[-1])}</i>",
|
f"<b>Правило {args[-1]}</b>\n<i>{fetch_rule(index)}</i>",
|
||||||
reply_markup=markup,
|
reply_markup=markup,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -80,5 +80,19 @@ ZEN = [
|
|||||||
"If the implementation is easy to explain, it may be a good idea.",
|
"If the implementation is easy to explain, it may be a good idea.",
|
||||||
"Namespaces are one honking great idea — let's do more of those!",
|
"Namespaces are one honking great idea — let's do more of those!",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
RULES_TEXT = (
|
||||||
|
"Админ всегда прав и предупреждает один раз",
|
||||||
|
"Запрещена брань, реклама, голосовые сообщения, флуд, мета-вопросы и тема ChatGPT",
|
||||||
|
"Языки общения: русский или английский",
|
||||||
|
"Придерживайся общепринятых норм беседы: без оскорблений, расизма, CAPS'а, политических, религиозных и взрослых тем.",
|
||||||
|
"Знаки препинания важны, особенно вопросительный знак",
|
||||||
|
"Твой ник должен быть читаемым и понятным",
|
||||||
|
"Мы приветствуем общение по широкому кругу тем, но стоит придерживаться IT и Python, обсуждение прочих тем только в субботу.",
|
||||||
|
"Прежде, чем задать вопрос, поищи ответ в интернете.",
|
||||||
|
"Более пяти строк кода нужно присылать nekobin-ссылкой с расширением .py.",
|
||||||
|
"Не нужно писать в ЛС.",
|
||||||
|
)
|
||||||
|
|
||||||
LUTZ_ID = "BQACAgQAAxkBAAPBYsWJG9Ml0fPrnbU9UyzTQiQSuHkAAjkDAAIstCxSkuRbXAlcqeQpBA"
|
LUTZ_ID = "BQACAgQAAxkBAAPBYsWJG9Ml0fPrnbU9UyzTQiQSuHkAAjkDAAIstCxSkuRbXAlcqeQpBA"
|
||||||
BDMTSS_ID = "AwACAgIAAxkBAAIJrWOg2WUvLwrf7ahyJxQHB8_nqllwAAL5JQAC2_IJSbhfQIO5YnVmLAQ"
|
BDMTSS_ID = "AwACAgIAAxkBAAIJrWOg2WUvLwrf7ahyJxQHB8_nqllwAAL5JQAC2_IJSbhfQIO5YnVmLAQ"
|
||||||
|
|||||||
+9
-1
@@ -6,7 +6,7 @@ from urllib.request import urlopen
|
|||||||
|
|
||||||
from telebot import types
|
from telebot import types
|
||||||
|
|
||||||
from .constants import SPAM, BAN_WORDS, NON_GRATA, ADMIN_ID, ONLY_RUS_LETTERS, RUS_LETTERS_AND_PUNCTUATION
|
from .constants import SPAM, BAN_WORDS, NON_GRATA, ADMIN_ID, ONLY_RUS_LETTERS, RUS_LETTERS_AND_PUNCTUATION, RULES_TEXT
|
||||||
|
|
||||||
|
|
||||||
def is_url_reachable(url: str) -> bool:
|
def is_url_reachable(url: str) -> bool:
|
||||||
@@ -102,3 +102,11 @@ def detect_args(message: types.Message):
|
|||||||
else:
|
else:
|
||||||
if len(message.text.split()) > 1:
|
if len(message.text.split()) > 1:
|
||||||
return " ".join(message.text.split()[1:])
|
return " ".join(message.text.split()[1:])
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_rule(index: int) -> str:
|
||||||
|
length = len(RULES_TEXT)
|
||||||
|
if index in range(1, length + 1):
|
||||||
|
return RULES_TEXT[index - 1]
|
||||||
|
else:
|
||||||
|
return "Пока не придумали"
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
from urllib.request import urlopen
|
|
||||||
|
|
||||||
from bs4 import BeautifulSoup
|
|
||||||
|
|
||||||
from .config import RULES_URL
|
|
||||||
|
|
||||||
html = BeautifulSoup(urlopen(RULES_URL), "lxml")
|
|
||||||
|
|
||||||
|
|
||||||
def fetch_rule(li):
|
|
||||||
li = int(li)
|
|
||||||
lis = html.find_all("li")
|
|
||||||
if li <= len(lis):
|
|
||||||
return lis[li - 1].text
|
|
||||||
else:
|
|
||||||
return f"Пока не придумали."
|
|
||||||
+1
-1
@@ -66,7 +66,7 @@ async def tease_nongrata(message: types.Message):
|
|||||||
await bot.reply_to(message, "у нас тут таких не любят")
|
await bot.reply_to(message, "у нас тут таких не любят")
|
||||||
|
|
||||||
|
|
||||||
@bot.message_handler(content_types=util.content_type_service)
|
@bot.message_handler(content_types=['new_chat_members', 'left_chat_member'])
|
||||||
async def check_new_members(message: types.Message):
|
async def check_new_members(message: types.Message):
|
||||||
if message.content_type == "new_chat_members":
|
if message.content_type == "new_chat_members":
|
||||||
from_user = message.from_user
|
from_user = message.from_user
|
||||||
|
|||||||
@@ -236,6 +236,8 @@ class TestBot(IsolatedAsyncioTestCase):
|
|||||||
async def test_spam_text(self):
|
async def test_spam_text(self):
|
||||||
# Нужно подставить антиспам вкл.
|
# Нужно подставить антиспам вкл.
|
||||||
with patch("src.filters.is_antispam_enabled") as mocked:
|
with patch("src.filters.is_antispam_enabled") as mocked:
|
||||||
|
# Нужно подменить инкремент, нельзя реально в шелве работать в тестах
|
||||||
|
with patch("src.commands.increment") as _mocked_shelve:
|
||||||
mocked.return_value = True
|
mocked.return_value = True
|
||||||
await self.bot.process_new_updates([get_update('пишите мне в ЛС, Писать в ЛС')])
|
await self.bot.process_new_updates([get_update('пишите мне в ЛС, Писать в ЛС')])
|
||||||
self.assertEqual(RESULTS[0][1], "deleteMessage")
|
self.assertEqual(RESULTS[0][1], "deleteMessage")
|
||||||
@@ -245,6 +247,8 @@ class TestBot(IsolatedAsyncioTestCase):
|
|||||||
async def test_wrong_url(self):
|
async def test_wrong_url(self):
|
||||||
# Нужно подставить антиспам вкл.
|
# Нужно подставить антиспам вкл.
|
||||||
with patch("src.filters.is_antispam_enabled") as mocked:
|
with patch("src.filters.is_antispam_enabled") as mocked:
|
||||||
|
# Нужно подменить инкремент, нельзя реально в шелве работать в тестах
|
||||||
|
with patch("src.commands.increment") as _mocked_shelve:
|
||||||
mocked.return_value = True
|
mocked.return_value = True
|
||||||
await self.bot.process_new_updates([get_update('тут подробнее https://zvuk.com/artist/61375')])
|
await self.bot.process_new_updates([get_update('тут подробнее https://zvuk.com/artist/61375')])
|
||||||
self.assertEqual(RESULTS[0][1], "deleteMessage")
|
self.assertEqual(RESULTS[0][1], "deleteMessage")
|
||||||
|
|||||||
+11
-2
@@ -1,7 +1,7 @@
|
|||||||
from unittest import TestCase, main
|
from unittest import TestCase, main
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
from src.constants import SPAM, BAN_WORDS, ADMIN_ID
|
from src.constants import SPAM, BAN_WORDS, ADMIN_ID, RULES_TEXT
|
||||||
from src.helpers import is_spam, is_mixed, is_ban_words_in_caption, is_in_not_allowed, is_nongrata, is_admin
|
from src.helpers import is_spam, is_mixed, is_ban_words_in_caption, is_in_not_allowed, is_nongrata, is_admin, fetch_rule
|
||||||
|
|
||||||
CASES = (
|
CASES = (
|
||||||
"Оформим резидeнтствo ОАЭ без предoплаты за 5000 дирхам. Пoдробнoсти в лc",
|
"Оформим резидeнтствo ОАЭ без предoплаты за 5000 дирхам. Пoдробнoсти в лc",
|
||||||
@@ -72,6 +72,15 @@ class TestOthers(TestCase):
|
|||||||
m = MagicMock(from_user=MagicMock(id=text))
|
m = MagicMock(from_user=MagicMock(id=text))
|
||||||
self.assertEqual(is_admin(m), expected)
|
self.assertEqual(is_admin(m), expected)
|
||||||
|
|
||||||
|
def test_fetch_rule(self):
|
||||||
|
for index, text in enumerate(RULES_TEXT,1):
|
||||||
|
with self.subTest(f"fetch rule {index}"):
|
||||||
|
self.assertEqual(fetch_rule(index), text)
|
||||||
|
|
||||||
|
def test_fetch_non_existent_rule(self):
|
||||||
|
self.assertEqual(fetch_rule(0), 'Пока не придумали')
|
||||||
|
self.assertEqual(fetch_rule(100), 'Пока не придумали')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|||||||
Reference in New Issue
Block a user