Skip to content

Commit

Permalink
Финальный фикс
Browse files Browse the repository at this point in the history
  • Loading branch information
thereareyou123 committed Feb 5, 2025
1 parent 961cb78 commit ded5d2e
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 20 deletions.
10 changes: 5 additions & 5 deletions src/app/crud/message.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
from typing import Dict, TypeVar

from sqlalchemy import not_, select
from sqlalchemy.ext.asyncio import AsyncSession

from app.crud.base import CRUDBase
from app.models.models import (Group, Message, MessageGroupAssociation,
MessageStatus)
from app.schemas.message import MessageCreate

from sqlalchemy import not_, select
from sqlalchemy.ext.asyncio import AsyncSession


ModelType = TypeVar('ModelType')

Expand Down Expand Up @@ -58,11 +58,11 @@ async def get_unsent_messages(self, session: AsyncSession) -> ModelType:
async def get_message_statuses(
self,
session: AsyncSession,
message_id: int
message_id: int,
) -> Dict[int, MessageStatus]:
"""Get statuses."""
statuses = await session.execute(
select(MessageStatus).where(MessageStatus.message_id == message_id)
select(MessageStatus).where(MessageStatus.message_id == message_id,)
)
return {s.user_id: s for s in statuses.scalars().all()}

Expand Down
13 changes: 6 additions & 7 deletions src/app/models/models.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import pathlib
from datetime import datetime

from app.core.db import Base
from app.models.constants import LENGTH_32, LENGTH_64, LENGTH_1000

from sqlalchemy import (
BigInteger,
Boolean,
Expand All @@ -15,6 +12,9 @@
String)
from sqlalchemy.orm import relationship

from app.core.db import Base
from app.models.constants import LENGTH_32, LENGTH_64, LENGTH_1000


class MessageGroupAssociation(Base):
"""Model for many-to-many relation between messages and groups."""
Expand Down Expand Up @@ -57,7 +57,7 @@ class UserTG(Base):
message_statuses = relationship(
'MessageStatus',
bacl_populates='user',
lazy='joined'
lazy='joined',
)

__table_args__ = (
Expand Down Expand Up @@ -103,7 +103,7 @@ class Message(Base):
message_statuses = relationship(
'MessageStatus',
bacl_populates='message',
lazy='joined'
lazy='joined',
)
# Связь с группами
groups = relationship(
Expand Down Expand Up @@ -134,8 +134,7 @@ class MessageStatus(Base):

message_id = Column(ForeignKey('message.id'))
user_id = Column(ForeignKey('user_tg.id'))
status = Column(Enum('pending', 'sent', 'failed'), default='pending')
error_reason = Column(String, nullable=True)
status = Column(Enum('pending', 'sent'), default='pending')

message = relationship(
'Message',
Expand Down
26 changes: 18 additions & 8 deletions src/bot/ratelimiter.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,9 @@ async def send_message(context: ContextTypes.DEFAULT_TYPE) -> None: # noqa: C90
if message.is_send:
return

existing_statuses = crud_message.get_message_statuses(session, message_id)
existing_statuses = crud_message.get_message_statuses(
session, message_id
)
users_to_notify = set()
groups = message.groups
if groups:
Expand Down Expand Up @@ -130,7 +132,7 @@ async def send_message(context: ContextTypes.DEFAULT_TYPE) -> None: # noqa: C90
MessageStatus(
message_id=message.id,
user_id=user_id,
status='pending'
status='pending',
)
for user_id in users_to_notify - existing_statuses.keys()
]
Expand All @@ -143,7 +145,6 @@ async def send_message(context: ContextTypes.DEFAULT_TYPE) -> None: # noqa: C90
try:
await send_message_to_user(context, user_id, message)
status.status = 'sent'
status.error_reason = None
update_data = {
'is_send': True,
'sended_at': datetime.now(),
Expand All @@ -157,18 +158,27 @@ async def send_message(context: ContextTypes.DEFAULT_TYPE) -> None: # noqa: C90
pydantic_scheme_obj=MessageUpdate(**update_data),
session=session,
)
session.delete(status)
except (BadRequest, Forbidden) as e:
#Если указан неверный tg_id, или пользователь удалил аккаунт,
#или пользователь удалил бота
#или пользователь удалил бота.
error_msg = str(e)
logging.error(
f'Отправка сообщения отменена из-за ошибки {error_msg}'
f'Отправка сообщения отменена из-за ошибки {error_msg}',
)
session.delete(status)
except Exception as e:
error_msg = str(e)
status.status = 'failed'
status.error_reason = error_msg
#Повторная отправка в случае сетевых ошибок.
await asyncio.sleep(10)
context.job_queue.run_once(
send_message,
when=10,
data={
'message_id': message_id,
'user_id': user_id
},
name=f'retry_send_mes_{message_id}'
)
await session.commit()


Expand Down

0 comments on commit ded5d2e

Please sign in to comment.