Skip to content

Commit bf184b5

Browse files
committed
The system for responding to likes has been redesigned
1 parent de0c75e commit bf184b5

File tree

6 files changed

+201
-62
lines changed

6 files changed

+201
-62
lines changed

app/handlers/dating/inbox.py

Lines changed: 110 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
from aiogram import F, types
44
from aiogram.filters.state import StateFilter
55
from aiogram.fsm.context import FSMContext
6+
from sqlalchemy import select
67
from sqlalchemy.ext.asyncio import AsyncSession
78

9+
from app.business.dating_service import send_user_like_alert
810
from app.business.profile_service import complaint_to_profile, send_profile_with_dist
911
from app.constans import EFFECTS_DICTIONARY
1012
from app.handlers.common.start import start_command
@@ -14,10 +16,50 @@
1416
from app.states.default import LikeResponse
1517
from app.text import message_text as mt
1618
from database.models import UserModel
19+
from database.models.match import MatchModel, MatchStatus
1720
from database.services import Match, Profile, User
1821
from loader import bot
1922

2023

24+
async def _send_mutual_like_notifications(session: AsyncSession, user: UserModel) -> None:
25+
"""
26+
Отправляет уведомления о взаимных лайках для матчей со статусом Accepted,
27+
которые исходят от пользователя
28+
"""
29+
effect_id = EFFECTS_DICTIONARY["🎉"]
30+
31+
# Найти все матчи со статусом Accepted, где пользователь является отправителем
32+
result = await session.execute(
33+
select(MatchModel)
34+
.where(MatchModel.sender_id == user.id)
35+
.where(MatchModel.status == MatchStatus.Accepted)
36+
.where(MatchModel.is_active == True)
37+
)
38+
accepted_matches = result.scalars().all()
39+
for match in accepted_matches:
40+
try:
41+
# Получаем профиль получателя
42+
receiver = await User.get_with_profile(session, match.receiver_id)
43+
await send_profile_with_dist(session=session, user=user, profile=receiver.profile)
44+
if receiver and receiver.profile:
45+
# Генерируем ссылку и текст
46+
link = generate_user_link(id=receiver.id, username=receiver.username)
47+
text = mt.LIKE_ACCEPT(user.language).format(
48+
link, html.escape(receiver.profile.name)
49+
)
50+
51+
# Отправляем уведомление
52+
await bot.send_message(
53+
chat_id=user.id, text=text, message_effect_id=effect_id, parse_mode="HTML"
54+
)
55+
56+
# Деактивируем матч, чтобы не отправлять уведомление повторно
57+
await Match.update(session=session, id=match.id, is_active=False)
58+
59+
except Exception as e:
60+
pass
61+
62+
2163
@dating_router.message(StateFilter(None), F.text == "📭")
2264
async def match_archive(
2365
message: types.Message, state: FSMContext, user: UserModel, session: AsyncSession
@@ -30,18 +72,21 @@ async def match_archive(
3072
username=message.from_user.username,
3173
) # needs to be redone
3274

75+
# Проверяем и отправляем уведомления о взаимных лайках
76+
await _send_mutual_like_notifications(session, user)
77+
3378
if liker_ids := await Match.get_user_matchs(session, message.from_user.id):
34-
text = mt.ARCHIVE_SEARCH.format(len(liker_ids))
79+
text = mt.ARCHIVE_SEARCH(user.language).format(len(liker_ids))
3580
await message.answer(text=text, reply_markup=match_kb)
3681

3782
await state.update_data(ids=liker_ids)
3883
profile = await Profile.get(session, liker_ids[0])
3984
match_data = await Match.get(session, user.id, profile.id)
4085
await send_profile_with_dist(user=user, profile=profile, session=session)
4186
if match_data and match_data.message:
42-
await message.answer(mt.MESSAGE_TO_YOU.format(match_data.message))
87+
await message.answer(mt.MESSAGE_TO_YOU(user.language).format(match_data.message))
4388
else:
44-
await message.answer(mt.LIKE_ARCHIVE)
89+
await message.answer(mt.LIKE_ARCHIVE(user.language))
4590
await start_command(message=message, user=user, state=state)
4691

4792

@@ -56,19 +101,31 @@ async def _match_atchive_callback(
56101
id=user.id,
57102
username=callback.from_user.username,
58103
) # needs to be redone
59-
await callback.message.answer(text=mt.SEARCH, reply_markup=match_kb)
104+
await callback.message.answer(text=mt.SEARCH(user.language), reply_markup=match_kb)
60105
await callback.answer()
61106

107+
# Проверяем и отправляем уведомления о взаимных лайках
108+
await _send_mutual_like_notifications(session, user)
109+
62110
if liker_ids := await Match.get_user_matchs(session, callback.from_user.id):
63111
await state.update_data(ids=liker_ids)
64112
profile = await Profile.get(session, liker_ids[0])
65113
match_data = await Match.get(session, user.id, profile.id)
66114
await send_profile_with_dist(user=user, profile=profile, session=session)
67115
if match_data and match_data.message:
68-
await callback.message.answer(mt.MESSAGE_TO_YOU.format(match_data.message))
116+
await callback.message.answer(
117+
mt.MESSAGE_TO_YOU(user.language).format(match_data.message)
118+
)
69119
else:
70-
await callback.message.answer(mt.LIKE_ARCHIVE)
71-
await start_command(callback.message, user=user, state=state)
120+
# from app.keyboards.default.base import menu_kb
121+
122+
await callback.message.answer(mt.LIKE_ARCHIVE(user.language))
123+
# await state.clear()
124+
# await callback.message.answer(
125+
# mt.MENU,
126+
# reply_markup=menu_kb,
127+
# )
128+
await start_command(message=callback.message, user=user, state=state)
72129

73130

74131
@dating_router.message(
@@ -82,27 +139,17 @@ async def _match_response(
82139
ids = data.get("ids")
83140

84141
another_user = await User.get_with_profile(session, ids[0])
142+
match_data = await Match.get(session, user.id, another_user.id)
85143

86144
if message.text == "❤️":
87-
effect_id = EFFECTS_DICTIONARY["🎉"]
88145
"""Отправка пользователю который ответил на лайк"""
89-
link = generate_user_link(id=another_user.id, username=another_user.username)
90-
text = mt.LIKE_ACCEPT(another_user.language).format(
91-
link, html.escape(another_user.profile.name)
92-
)
93-
try:
94-
await bot.send_message(chat_id=user.id, text=text, message_effect_id=effect_id)
95-
except:
96-
...
97-
"""Отправка пользователю которому ответили на лайк"""
98-
link = generate_user_link(id=user.id, username=user.username)
99-
text = mt.LIKE_ACCEPT_ALERT(user.language).format(link, html.escape(user.profile.name))
100-
try:
101-
await bot.send_message(chat_id=another_user.id, text=text, message_effect_id=effect_id)
102-
except:
103-
...
146+
await like_accept(session=session, user=user, another_user=another_user, match=match_data)
104147
elif message.text == "👎":
105148
pass
149+
await Match.update(
150+
session=session, id=match_data.id, status=MatchStatus.Rejected, is_active=False
151+
)
152+
106153
elif message.text == "💢":
107154
await message.answer(mt.COMPLAINT, reply_markup=compleint_kb())
108155
return
@@ -115,8 +162,8 @@ async def _match_response(
115162
reason=message.text,
116163
)
117164
elif message.text == "↩️":
118-
await message.answer(mt.SEARCH, reply_markup=match_kb)
119-
await Match.delete(session, user.id, another_user.id)
165+
await message.answer(mt.SEARCH(user.language), reply_markup=match_kb)
166+
# await Match.delete(session, user.id, another_user.id)
120167

121168
ids.pop(0)
122169
await state.update_data(ids=ids)
@@ -125,9 +172,9 @@ async def _match_response(
125172
match_data = await Match.get(session, user.id, profile.id)
126173
await send_profile_with_dist(user=user, profile=profile, session=session)
127174
if match_data and match_data.message:
128-
await message.answer(mt.MESSAGE_TO_YOU.format(match_data.message))
175+
await message.answer(mt.MESSAGE_TO_YOU(user.language).format(match_data.message))
129176
else:
130-
await message.answer(mt.EMPTY_PROFILE_SEARCH)
177+
await message.answer(mt.EMPTY_PROFILE_SEARCH(user.language))
131178
await start_command(message=message, user=user, state=state)
132179

133180

@@ -140,3 +187,39 @@ def generate_user_link(id: int, username: str = None) -> str:
140187
if username:
141188
return f"https://t.me/{username}"
142189
return f"tg://user?id={id}"
190+
191+
192+
async def like_accept(
193+
session: AsyncSession, user: UserModel, another_user: UserModel, match: MatchModel
194+
):
195+
effect_id = EFFECTS_DICTIONARY["🎉"]
196+
if match.status == MatchStatus.Accepted:
197+
# Если изначальный отправитель получил взимный лайк и зашел в inbox
198+
sender = user
199+
reciver = another_user
200+
await Match.update(session=session, id=match.id, is_active=False)
201+
202+
link = generate_user_link(id=reciver.id, username=reciver.username)
203+
text = mt.LIKE_ACCEPT(sender.language).format(link, html.escape(reciver.profile.name))
204+
try:
205+
await bot.send_message(
206+
chat_id=sender.id, text=text, message_effect_id=effect_id, parse_mode="HTML"
207+
)
208+
except:
209+
...
210+
211+
else:
212+
# Если изначальный отправитель не этот же человек
213+
sender = another_user
214+
reciver = user
215+
await Match.update(session=session, id=match.id, status=MatchStatus.Accepted)
216+
await send_user_like_alert(session, sender)
217+
218+
link = generate_user_link(id=sender.id, username=sender.username)
219+
text = mt.LIKE_ACCEPT(reciver.language).format(link, html.escape(sender.profile.name))
220+
try:
221+
await bot.send_message(
222+
chat_id=reciver.id, text=text, message_effect_id=effect_id, parse_mode="HTML"
223+
)
224+
except:
225+
...

app/handlers/dating/search.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from app.text import message_text as mt
1616
from database.models import UserModel
1717
from database.services import Match, Profile, User
18-
from database.services.complaint import Compleint
1918
from database.services.search import search_profiles
2019

2120

@@ -25,7 +24,7 @@ async def _search_command(
2524
) -> None:
2625
"""Бот подбирает анкеты, соответствующие предпочтениям пользователя, и предлагает их"""
2726

28-
await message.answer(mt.SEARCH, reply_markup=search_kb)
27+
await message.answer(mt.SEARCH(user.language), reply_markup=search_kb)
2928

3029
if profile_list := await search_profiles(session, user.profile):
3130
await state.set_state(Search.search)
@@ -66,7 +65,7 @@ async def _search_profile(
6665
pass
6766
elif message.text == "📩":
6867
await state.set_state(Search.message)
69-
await message.answer(mt.MAILING_TO_USER, reply_markup=return_to_menu_kb)
68+
await message.answer(mt.MAILING_TO_USER(user.language), reply_markup=return_to_menu_kb)
7069
return
7170

7271
if message.text == "💢":
@@ -109,7 +108,7 @@ async def _search_profile_mailing_(
109108
await state.set_state(Search.search)
110109

111110
if message.text == "↩️":
112-
await message.answer(mt.CANNCELED_LETTER, reply_markup=search_kb)
111+
await message.answer(mt.CANNCELED_LETTER(user.language), reply_markup=search_kb)
113112
await send_profile_with_dist(user=user, profile=another_user.profile, session=session)
114113

115114
return
@@ -142,7 +141,7 @@ async def next_profile(
142141
await state.update_data(ids=profile_list)
143142
await send_profile_with_dist(user=user, profile=profile, session=session)
144143
else:
145-
await message.answer(mt.EMPTY_PROFILE_SEARCH)
144+
await message.answer(mt.EMPTY_PROFILE_SEARCH(user.language))
146145
await start_command(message=message, user=user, state=state)
147146

148147

@@ -155,6 +154,6 @@ async def like_profile(
155154
is_create = await Match.create(session, message.from_user.id, another_user.id, mail_text)
156155

157156
if is_create:
158-
matchs_count = len(await Match.get_user_matchs(session, message.from_user.id))
157+
matchs_count = len(await Match.get_user_matchs(session, another_user.id))
159158
if matchs_count == 1 or matchs_count % 3 == 0:
160159
await send_user_like_alert(session, another_user)

app/middlewares/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ def setup_middlewares(dp: Dispatcher) -> None:
2020
common_router.message.middleware(CommonMiddleware())
2121
common_router.callback_query.middleware(CommonMiddleware())
2222
common_router.message.middleware(i18n_middleware)
23+
common_router.callback_query.middleware(i18n_middleware)
2324

2425
dating_router.message.middleware(LoggingMiddleware())
2526
dating_router.callback_query.middleware(LoggingMiddleware())
2627
dating_router.message.middleware(DatingMiddleware())
2728
dating_router.callback_query.middleware(DatingMiddleware())
2829
dating_router.message.middleware(i18n_middleware)
30+
dating_router.callback_query.middleware(i18n_middleware)
2931

3032
admin_router.message.middleware(LoggingMiddleware())
3133
admin_router.callback_query.middleware(LoggingMiddleware())

app/text.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -97,21 +97,17 @@ def ACTIVATE_PROFILE_ALERT(self):
9797
return _("✅ Твоя анкета успешно восстановлена! Теперь ты снова можешь пользоваться ботом.")
9898

9999
# Поиск анкет
100-
@property
101-
def SEARCH(self):
102-
return _("🔍 Выполняется поиск...")
100+
def SEARCH(self, language: str = None):
101+
return _("🔍 Выполняется поиск...", locale=language)
103102

104-
@property
105-
def ARCHIVE_SEARCH(self):
106-
return _("Твоя анкета понравилась {} людям! Давай посмотрим, кто это:")
103+
def ARCHIVE_SEARCH(self, language: str = None):
104+
return _("Твоя анкета понравилась {} людям! Давай посмотрим, кто это:", locale=language)
107105

108-
@property
109-
def INVALID_PROFILE_SEARCH(self):
110-
return _("Подходящих анкет не найдено. Попробуй выбрать другой город. 🌍")
106+
def INVALID_PROFILE_SEARCH(self, language: str = None):
107+
return _("Подходящих анкет не найдено. Попробуй выбрать другой город. 🌍", locale=language)
111108

112-
@property
113-
def EMPTY_PROFILE_SEARCH(self):
114-
return _("Анкеты закончились. Попробуй позже! 😊")
109+
def EMPTY_PROFILE_SEARCH(self, language: str = None):
110+
return _("Анкеты закончились. Попробуй позже! 😊", locale=language)
115111

116112
# Лайки и сообщения
117113
def LIKE_PROFILE(self, language: str):
@@ -120,9 +116,8 @@ def LIKE_PROFILE(self, language: str):
120116
locale=language,
121117
)
122118

123-
@property
124-
def LIKE_ARCHIVE(self):
125-
return _("Пока никто не поставил тебе лайк, но всё ещё впереди!")
119+
def LIKE_ARCHIVE(self, language: str = None):
120+
return _("Пока никто не поставил тебе лайк, но всё ещё впереди!", locale=language)
126121

127122
def LIKE_ACCEPT(self, language: str):
128123
return _("Надеюсь вы хорошо проведете время ;) <a href='{}'>{}</a>", locale=language)
@@ -133,9 +128,8 @@ def LIKE_ACCEPT_ALERT(self, language: str):
133128
locale=language,
134129
)
135130

136-
@property
137-
def MESSAGE_TO_YOU(self):
138-
return _("Сообщение для тебя:\n{}")
131+
def MESSAGE_TO_YOU(self, language: str = None):
132+
return _("Сообщение для тебя:\n{}", locale=language)
139133

140134
# Сообщения и рассылка
141135
@property

database/models/match.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ class MatchModel(BaseModel):
1919
receiver_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
2020
message: Mapped[str] = mapped_column(String(250), nullable=True)
2121
status: Mapped[int] = mapped_column(Integer, server_default="1")
22+
is_active: Mapped[bool] = mapped_column(server_default="True", nullable=False)

0 commit comments

Comments
 (0)