Skip to content
This repository has been archived by the owner on Jan 3, 2025. It is now read-only.

Commit

Permalink
Merge pull request #29 from The-B1T-Foundation/rewritten_message_hand…
Browse files Browse the repository at this point in the history
…ler_experimental_version

Refactored message handler & answer handler
  • Loading branch information
b1tflyyyy authored Apr 21, 2024
2 parents e098125 + 8152cf6 commit de46155
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ class MatcherBase : private MatcherDescriberInterface {
template <typename M, bool = MatcherBase::IsInlined<M>()>
struct ValuePolicy {
static const M& Get(const MatcherBase& m) {
// When inlined along with Init, need to be explicit to avoid violating
// When inlined along with Bind_Commands, need to be explicit to avoid violating
// strict aliasing rules.
const M* ptr =
static_cast<const M*>(static_cast<const void*>(&m.buffer_));
Expand Down
90 changes: 51 additions & 39 deletions source/view/handlers/message_handler/message_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ AMessage_Handler::AMessage_Handler(TgBot::Bot& tg_bot, AUser_DB_Controller& user
{ }

// ---------------------------------------------------------------------------------------------------------------------
void AMessage_Handler::Init()
void AMessage_Handler::Bind_Commands()
{
TG_Bot.getEvents().onCommand(SMessage_Commands::Start.data(), [this](TgBot::Message::Ptr message) -> void
{
Expand All @@ -49,7 +49,7 @@ void AMessage_Handler::Init()
{
Auto_Register(message->from->id, message->from->username, message->from->firstName);

if (Can_Use_Command(message, 7))
if (Can_Use_Command(message, Time_To_Wait))
{
auto expression{ AProgrammer_Game_Controller::Generate_Expression() };
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Programmer_Game_Msg(expression));
Expand All @@ -62,7 +62,7 @@ void AMessage_Handler::Init()
{
Auto_Register(message->from->id, message->from->username, message->from->firstName);

if (Can_Use_Command(message, 7))
if (Can_Use_Command(message, Time_To_Wait))
{
auto expression{ AMath_Problem_Game_Controller::Generate_Problem() };
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Math_Game_Msg(expression));
Expand All @@ -71,44 +71,9 @@ void AMessage_Handler::Init()
Task_DB_Controller.Set_Answer(message->from->id, expression.Result);
}
});
// TODO: .....................................................................................................................
TG_Bot.getEvents().onCommand(SMessage_Commands::Answer.data(), [this](TgBot::Message::Ptr message) -> void
{
if (auto current_user_state{ State_DB_Controller.Get_State(message->from->id) }; current_user_state != AState_DB_Controller::EState_Type::Default)
{
std::int64_t score{};
auto current_score{ Stats_DB_Controller.Get_Score(message->from->id) };

switch (current_user_state)
{
case AState_DB_Controller::EState_Type::Programmer_Game:
{
score = AProgrammer_Game_Controller::Score;
break;
}
case AState_DB_Controller::EState_Type::Math_Game:
{
score = AMath_Problem_Game_Controller::Score;
break;
}
}

auto answer{ Task_DB_Controller.Get_Answer(message->from->id) };
std::string_view user_answer{ message->text.begin() + 8, message->text.end() };

if (answer != user_answer)
{
Stats_DB_Controller.Set_Score(message->from->id, (current_score - score));
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Incorrect_Answer_Msg(score, answer));
}
else
{
Stats_DB_Controller.Set_Score(message->from->id, (current_score + score));
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Correct_Answer_Msg(score));
}

State_DB_Controller.Set_State(message->from->id, AState_DB_Controller::EState_Type::Default);
}
Handle_Answer(message);
});
}

Expand Down Expand Up @@ -136,4 +101,51 @@ bool AMessage_Handler::Can_Use_Command(const TgBot::Message::Ptr& message, std::

Task_DB_Controller.Set_Time_Stamp(message->from->id, current_time);
return true;
}

// ---------------------------------------------------------------------------------------------------------------------
void AMessage_Handler::Handle_Answer(TgBot::Message::Ptr& message)
{
if (auto current_user_state{ State_DB_Controller.Get_State(message->from->id) }; current_user_state != AState_DB_Controller::EState_Type::Default)
{
std::int64_t score{};
auto current_score{ Stats_DB_Controller.Get_Score(message->from->id) };

switch (current_user_state)
{
case AState_DB_Controller::EState_Type::Programmer_Game:
{
score = AProgrammer_Game_Controller::Score;
break;
}
case AState_DB_Controller::EState_Type::Math_Game:
{
score = AMath_Problem_Game_Controller::Score;
break;
}
}

auto answer{ Task_DB_Controller.Get_Answer(message->from->id) };
Parse_User_Answer(message->text);

if (answer != message->text)
{
Stats_DB_Controller.Set_Score(message->from->id, (current_score - score));
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Incorrect_Answer_Msg(score, answer));
}
else
{
Stats_DB_Controller.Set_Score(message->from->id, (current_score + score));
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Correct_Answer_Msg(score));
}

State_DB_Controller.Set_State(message->from->id, AState_DB_Controller::EState_Type::Default);
}
}

// ---------------------------------------------------------------------------------------------------------------------
void AMessage_Handler::Parse_User_Answer(std::string& answer)
{
answer.erase(answer.begin(), answer.begin() + static_cast<std::ptrdiff_t>(SMessage_Commands::Answer.size() + 1)); // erase /answer part, + 1 for '/'
answer.erase(std::remove(answer.begin(), answer.end(), ' '), answer.end());
}
7 changes: 6 additions & 1 deletion source/view/handlers/message_handler/message_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,16 @@ class AMessage_Handler
explicit AMessage_Handler(TgBot::Bot& tg_bot, AUser_DB_Controller& user_db_controller, AState_DB_Controller& state_db_controller, ATask_DB_Controller& task_db_controller, AStats_DB_Controller& stats_db_controller);
constexpr ~AMessage_Handler() = default;

void Init();
void Bind_Commands();

private:
void Auto_Register(std::int64_t user_id, std::string_view username, std::string_view first_name);
bool Can_Use_Command(const TgBot::Message::Ptr& message, std::int64_t required_difference); // TODO: .................
void Handle_Answer(TgBot::Message::Ptr& message);
void Parse_User_Answer(std::string& answer);

private:
constexpr static std::size_t Time_To_Wait{ 3 };

private:
TgBot::Bot& TG_Bot;
Expand Down
2 changes: 1 addition & 1 deletion source/view/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ int main()
AStats_DB_Controller stats_db_controller{ *db_cfg };

AMessage_Handler message_handler{ tg_bot, user_db_controller, state_db_controller, task_db_controller, stats_db_controller };
message_handler.Init(); // TODO .......
message_handler.Bind_Commands();

try
{
Expand Down

0 comments on commit de46155

Please sign in to comment.