Skip to content

Commit c59cf5e

Browse files
committed
Добавлена запись группы, для пересылки сообщений.
1 parent 7036830 commit c59cf5e

File tree

6 files changed

+86
-2
lines changed

6 files changed

+86
-2
lines changed

database/database.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@ class Meta:
4141
return Keywords # Возвращаем класс модели
4242

4343

44+
def create_group_model(user_id):
45+
class Group(Model):
46+
"""Модель для хранения технической группы"""
47+
id = AutoField() # <-- добавляем первичный ключ (иначе всё пишется в одну строку)
48+
user_group = CharField(unique=True) # Поле для хранения технической группы
49+
50+
class Meta:
51+
database = db # Указываем, что модель использует базу данных
52+
table_name = f"group_{user_id}" # Имя таблицы
53+
54+
return Group # Возвращаем класс модели
55+
56+
4457
# Создаём таблицы при первом запуске
4558
db.connect()
4659
db.create_tables([User], safe=True)

handlers/connect_group.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# -*- coding: utf-8 -*-
2+
from aiogram import F
3+
from aiogram.fsm.context import FSMContext
4+
from aiogram.types import Message
5+
from loguru import logger
6+
7+
from database.database import User, create_group_model
8+
from keyboards.keyboards import (back_keyboard)
9+
from locales.locales import get_text
10+
from states.states import MyStates
11+
from system.dispatcher import router
12+
13+
14+
@router.message(F.text == "Подключить группу для сообщений")
15+
async def handle_connect_message_group(message: Message, state: FSMContext):
16+
"""Ввод username группы для сообщений"""
17+
user_tg = message.from_user
18+
user = User.get(User.user_id == user_tg.id)
19+
20+
logger.info(
21+
f"Пользователь {user_tg.id} {user_tg.username} {user_tg.first_name} {user_tg.last_name} перешел в меню Подключить группу для сообщений")
22+
23+
await message.answer(
24+
get_text(user.language, "enter_group"),
25+
reply_markup=back_keyboard() # клавиатура назад
26+
)
27+
await state.set_state(MyStates.entering_group)
28+
29+
30+
@router.message(MyStates.entering_group)
31+
async def handle_group_username_submission(message: Message, state: FSMContext):
32+
"""Обработка введённого ключевого слова, словосочетания"""
33+
34+
group_username = message.text.strip()
35+
user_tg = message.from_user
36+
logger.info(f"Пользователь ввёл ссылку: {group_username}")
37+
38+
# Создаём модель с таблицей, уникальной для конкретного пользователя
39+
GroupModel = create_group_model(user_id=user_tg.id) # Создаём таблицу для групп / ключевых слов
40+
41+
# Проверяем, существует ли таблица (если нет — создаём)
42+
if not GroupModel.table_exists():
43+
GroupModel.create_table()
44+
logger.info(f"Создана новая таблица для пользователя {user_tg.id}")
45+
46+
# Добавляем запись в таблицу
47+
try:
48+
group_record = GroupModel.create(user_group=group_username)
49+
await message.answer(f"✅ Группа {group_username} добавлена для отправки сообщений.")
50+
logger.info(f"username {group_username} добавлено пользователем {user_tg.id}")
51+
except Exception as e:
52+
if "UNIQUE constraint failed" in str(e):
53+
await message.answer("⚠️ Эта группа уже добавлена.")
54+
else:
55+
await message.answer("⚠️ Ошибка при добавлении группы.")
56+
logger.error(f"Ошибка при добавлении ключевого слова: {e}")
57+
await state.clear() # Очищаем состояние
58+
59+
60+
def register_entering_group_handler():
61+
"""Регистрация обработчиков"""
62+
router.message.register(handle_connect_message_group) # Регистрация обработчика

keyboards/keyboards.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,9 @@ def settings_keyboard():
4242
return ReplyKeyboardMarkup(
4343
keyboard=[
4444
[KeyboardButton(text="🔁 Обновить список")],
45-
4645
[KeyboardButton(text="Ввод ключевого слова")],
47-
4846
[KeyboardButton(text="Подключить аккаунт")],
47+
[KeyboardButton(text="Подключить группу для сообщений")],
4948
[KeyboardButton(text="Сменить язык")],
5049
[KeyboardButton(text="🔙 Назад")]
5150
],

locales/locales.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636
"enter_keyword": (
3737
"🔍 Введите ключевое слово / словосочетание для отслеживания"
3838
),
39+
"enter_group": (
40+
"🔍 Введите ссылку на группу в формате @username в которую будет пересылаться сообщение обнаруженное по ключевому слову"
41+
),
3942
},
4043

4144
"en": {
@@ -73,6 +76,9 @@
7376
"enter_keyword": (
7477
"🔍 Enter a keyword / phrase to track"
7578
),
79+
"enter_group": (
80+
"🔍 Enter a link to the group in the format @username to which the message will be forwarded when a keyword is detected"
81+
),
7682
}
7783
}
7884

main.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from loguru import logger
77

8+
from handlers.connect_group import register_entering_group_handler
89
from handlers.entering_keyword import register_entering_keyword_handler
910
from handlers.handlers import register_greeting_handlers
1011
from system.dispatcher import dp, bot
@@ -21,6 +22,8 @@ async def main() -> None:
2122

2223
register_entering_keyword_handler() # Регистрация обработчика для ввода и записи в БД ключевых слов
2324

25+
register_entering_group_handler() # Регистрация обработчика для ввода и записи в БД групп (техническая группа)
26+
2427
await dp.start_polling(bot)
2528

2629

states/states.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ class MyStates(StatesGroup):
66
"""Прием ссылки на группу / канал"""
77
waiting_username_group = State() # ожидание ввода имени группы в формате @username
88
entering_keyword = State() # ожидание ввода ключевого слова
9+
entering_group = State() # ожидание ввода группы в формате @username (техническая)

0 commit comments

Comments
 (0)