add user messages count action (#76)

* remove fastapi users dependency

* add user service to chatbot service

* add user save on bot info command

* add user model to admin

* fix tests
This commit is contained in:
Dmitry Afanasyev
2024-01-07 02:14:44 +03:00
committed by GitHub
parent fd9d38b5f0
commit 1e79c981c2
19 changed files with 811 additions and 798 deletions

View File

@@ -92,6 +92,11 @@ async def ask_question(update: Update, context: ContextTypes.DEFAULT_TYPE) -> No
if not update.message:
return
if not update.effective_user:
logger.error('no effective user', update=update, context=context)
await update.message.reply_text("Бот не смог определить пользователя. :(\nОб ошибке уже сообщено.")
return
await update.message.reply_text(
f"Ответ в среднем занимает 10-15 секунд.\n"
f"- Список команд: /{BotCommands.help}\n"
@@ -100,8 +105,16 @@ async def ask_question(update: Update, context: ContextTypes.DEFAULT_TYPE) -> No
chatgpt_service = ChatGptService.build()
logger.warning("question asked", user=update.message.from_user, question=update.message.text)
answer = await chatgpt_service.request_to_chatgpt(question=update.message.text)
await update.message.reply_text(answer)
answer, user = await asyncio.gather(
chatgpt_service.request_to_chatgpt(question=update.message.text),
chatgpt_service.get_or_create_bot_user(
user_id=update.effective_user.id,
username=update.effective_user.username,
first_name=update.effective_user.first_name,
last_name=update.effective_user.last_name,
),
)
await asyncio.gather(update.message.reply_text(answer), chatgpt_service.update_bot_user_message_count(user.id))
async def voice_recognize(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:

View File

@@ -15,6 +15,9 @@ from speech_recognition import (
)
from constants import AUDIO_SEGMENT_DURATION
from core.auth.models.users import User
from core.auth.repository import UserRepository
from core.auth.services import UserService
from core.bot.models.chatgpt import ChatGptModels
from core.bot.repository import ChatGPTRepository
from infra.database.db_adapter import Database
@@ -89,6 +92,15 @@ class SpeechToTextService:
@dataclass
class ChatGptService:
repository: ChatGPTRepository
user_service: UserService
@classmethod
def build(cls) -> "ChatGptService":
db = Database(settings=settings)
repository = ChatGPTRepository(settings=settings, db=db)
user_repository = UserRepository(db=db)
user_service = UserService(repository=user_repository)
return ChatGptService(repository=repository, user_service=user_service)
async def get_chatgpt_models(self) -> Sequence[ChatGptModels]:
return await self.repository.get_chatgpt_models()
@@ -117,8 +129,27 @@ class ChatGptService:
async def delete_chatgpt_model(self, model_id: int) -> None:
return await self.repository.delete_chatgpt_model(model_id=model_id)
@classmethod
def build(cls) -> "ChatGptService":
db = Database(settings=settings)
repository = ChatGPTRepository(settings=settings, db=db)
return ChatGptService(repository=repository)
async def get_or_create_bot_user(
self,
user_id: int,
email: str | None = None,
username: str | None = None,
first_name: str | None = None,
last_name: str | None = None,
ban_reason: str | None = None,
is_active: bool = True,
is_superuser: bool = False,
) -> User:
return await self.user_service.get_or_create_user_by_id(
user_id=user_id,
email=email,
username=username,
first_name=first_name,
last_name=last_name,
ban_reason=ban_reason,
is_active=is_active,
is_superuser=is_superuser,
)
async def update_bot_user_message_count(self, user_id: int) -> None:
await self.user_service.update_user_message_count(user_id)