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 #28 from The-B1T-Foundation/rewritten_message_hand…
Browse files Browse the repository at this point in the history
…ler_experimental_version

Rewritten message handler experimental version
  • Loading branch information
b1tflyyyy authored Apr 19, 2024
2 parents 3541f53 + a57da88 commit e098125
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 99 deletions.
165 changes: 79 additions & 86 deletions source/view/handlers/message_handler/message_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,118 +29,111 @@ AMessage_Handler::AMessage_Handler(TgBot::Bot& tg_bot, AUser_DB_Controller& user
{ }

// ---------------------------------------------------------------------------------------------------------------------
void AMessage_Handler::Handle_All_Messages(const TgBot::Message::Ptr& message)
void AMessage_Handler::Init()
{
Auto_Register(message->from->id, message->from->username, message->from->firstName);
if (auto current_user_state{ State_DB_Controller.Get_State(message->from->id) }; current_user_state != AState_DB_Controller::EState_Type::Default)
{
Handle_Game_State(message->from->id, current_user_state, message->text);
return;
}

Handle_Default_Commands(message);
}

// ---------------------------------------------------------------------------------------------------------------------
void AMessage_Handler::Auto_Register(std::int64_t user_id, std::string_view username, std::string_view first_name)
{
if (!User_DB_Controller.Is_User_Exists(user_id))
{
User_DB_Controller.Create_User(AUser{ user_id, first_name.data(), username.data() });
State_DB_Controller.Create_Default_State(user_id);
Task_DB_Controller.Create_Default_Task(user_id);
Stats_DB_Controller.Create_Default_Stats(user_id);
}
}

// ---------------------------------------------------------------------------------------------------------------------
void AMessage_Handler::Handle_Default_Commands(const TgBot::Message::Ptr& message)
{
if (message->text == SMessage_Commands::Start)
TG_Bot.getEvents().onCommand(SMessage_Commands::Start.data(), [this](TgBot::Message::Ptr message) -> void
{
Auto_Register(message->from->id, message->from->username, message->from->firstName);
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Hello_Msg(message->from->username));
}
else if (message->text == SMessage_Commands::Profile)
});
TG_Bot.getEvents().onCommand(SMessage_Commands::Profile.data(), [this](TgBot::Message::Ptr message) -> void
{
Auto_Register(message->from->id, message->from->username, message->from->firstName);

auto user{ User_DB_Controller.Get_User(message->from->id) };
auto score{ Stats_DB_Controller.Get_Score(message->from->id) };

TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Profile_Msg(user, score));
}
else
});
TG_Bot.getEvents().onCommand(SMessage_Commands::Programmer_Game.data(), [this](TgBot::Message::Ptr message) -> void
{
Handle_Game_Commands(message);
}
}
Auto_Register(message->from->id, message->from->username, message->from->firstName);

// ---------------------------------------------------------------------------------------------------------------------
void AMessage_Handler::Handle_Game_Commands(const TgBot::Message::Ptr& message)
{
auto current_time{ static_cast<std::int64_t>(std::chrono::duration_cast<std::chrono::minutes>(std::chrono::high_resolution_clock::now().time_since_epoch()).count()) };
if (auto difference{ current_time - Task_DB_Controller.Get_Time_Stamp(message->from->id) }; difference < 10) // 10 - waiting time
{
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Waiting_Time_Msg(10 - difference));
return;
}

if (message->text == SMessage_Commands::Programmer_Game)
{
auto expression{ AProgrammer_Game_Controller::Generate_Expression() };
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Programmer_Game_Msg(expression));
if (Can_Use_Command(message, 7))
{
auto expression{ AProgrammer_Game_Controller::Generate_Expression() };
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Programmer_Game_Msg(expression));

State_DB_Controller.Set_State(message->from->id, AState_DB_Controller::EState_Type::Programmer_Game);
Task_DB_Controller.Set_Answer(message->from->id, expression.Result);
}
else if (message->text == SMessage_Commands::Math_Game)
State_DB_Controller.Set_State(message->from->id, AState_DB_Controller::EState_Type::Programmer_Game);
Task_DB_Controller.Set_Answer(message->from->id, expression.Result);return;
}
});
TG_Bot.getEvents().onCommand(SMessage_Commands::Math_Game.data(), [this](TgBot::Message::Ptr message) -> void
{
auto expression{ AMath_Problem_Game_Controller::Generate_Problem() };
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Math_Game_Msg(expression));
Auto_Register(message->from->id, message->from->username, message->from->firstName);

State_DB_Controller.Set_State(message->from->id, AState_DB_Controller::EState_Type::Math_Game);
Task_DB_Controller.Set_Answer(message->from->id, expression.Result);
}

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

// ---------------------------------------------------------------------------------------------------------------------
void AMessage_Handler::Handle_Game_State(std::int64_t user_id, AState_DB_Controller::EState_Type current_state, std::string_view message)
{
auto current_score{ Stats_DB_Controller.Get_Score(user_id) };
if (Can_Use_Command(message, 7))
{
auto expression{ AMath_Problem_Game_Controller::Generate_Problem() };
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Math_Game_Msg(expression));

switch (current_state)
State_DB_Controller.Set_State(message->from->id, AState_DB_Controller::EState_Type::Math_Game);
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
{
case AState_DB_Controller::EState_Type::Programmer_Game:
if (auto current_user_state{ State_DB_Controller.Get_State(message->from->id) }; current_user_state != AState_DB_Controller::EState_Type::Default)
{
if (auto answer{ Task_DB_Controller.Get_Answer(user_id) }; answer != message)
{
Stats_DB_Controller.Set_Score(user_id, (current_score - AProgrammer_Game_Controller::Score));
TG_Bot.getApi().sendMessage(user_id, AMessage_Reply::Get_Incorrect_Answer_Msg(AProgrammer_Game_Controller::Score, answer));
}
else
std::int64_t score{};
auto current_score{ Stats_DB_Controller.Get_Score(message->from->id) };

switch (current_user_state)
{
Stats_DB_Controller.Set_Score(user_id, (current_score + AProgrammer_Game_Controller::Score));
TG_Bot.getApi().sendMessage(user_id, AMessage_Reply::Get_Correct_Answer_Msg(AProgrammer_Game_Controller::Score));
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;
}
}

break;
}
case AState_DB_Controller::EState_Type::Math_Game:
{
if (auto answer{ Task_DB_Controller.Get_Answer(user_id) }; answer != message)
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(user_id, (current_score - AMath_Problem_Game_Controller::Score));
TG_Bot.getApi().sendMessage(user_id, AMessage_Reply::Get_Incorrect_Answer_Msg(AMath_Problem_Game_Controller::Score, 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(user_id, (current_score + AMath_Problem_Game_Controller::Score));
TG_Bot.getApi().sendMessage(user_id, AMessage_Reply::Get_Correct_Answer_Msg(AMath_Problem_Game_Controller::Score));
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));
}

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

// ---------------------------------------------------------------------------------------------------------------------
void AMessage_Handler::Auto_Register(std::int64_t user_id, std::string_view username, std::string_view first_name)
{
if (!User_DB_Controller.Is_User_Exists(user_id))
{
User_DB_Controller.Create_User(AUser{ user_id, first_name.data(), username.data() });
State_DB_Controller.Create_Default_State(user_id);
Task_DB_Controller.Create_Default_Task(user_id);
Stats_DB_Controller.Create_Default_Stats(user_id);
}
}

// ---------------------------------------------------------------------------------------------------------------------
bool AMessage_Handler::Can_Use_Command(const TgBot::Message::Ptr& message, std::int64_t required_difference)
{
auto current_time{ static_cast<std::int64_t>(std::chrono::duration_cast<std::chrono::minutes>(std::chrono::high_resolution_clock::now().time_since_epoch()).count()) };
if (auto difference{ current_time - Task_DB_Controller.Get_Time_Stamp(message->from->id) }; difference < required_difference)
{
TG_Bot.getApi().sendMessage(message->chat->id, AMessage_Reply::Get_Waiting_Time_Msg(required_difference - difference));
return false;
}

State_DB_Controller.Set_State(user_id, AState_DB_Controller::EState_Type::Default);
Task_DB_Controller.Set_Time_Stamp(message->from->id, current_time);
return true;
}
8 changes: 3 additions & 5 deletions source/view/handlers/message_handler/message_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,11 @@ 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 Handle_All_Messages(const TgBot::Message::Ptr& message);
void Init();

private:
[[clang::always_inline]] __inline__ void Auto_Register(std::int64_t user_id, std::string_view username, std::string_view first_name);
[[clang::always_inline]] __inline__ void Handle_Default_Commands(const TgBot::Message::Ptr& message);
[[clang::always_inline]] __inline__ void Handle_Game_Commands(const TgBot::Message::Ptr& message);
[[clang::always_inline]] __inline__ void Handle_Game_State(std::int64_t user_id, AState_DB_Controller::EState_Type current_state, std::string_view message);
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: .................

private:
TgBot::Bot& TG_Bot;
Expand Down
5 changes: 1 addition & 4 deletions source/view/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +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 };
tg_bot.getEvents().onAnyMessage([&message_handler](TgBot::Message::Ptr message) -> void
{
message_handler.Handle_All_Messages(message);
});
message_handler.Init(); // TODO .......

try
{
Expand Down
9 changes: 5 additions & 4 deletions source/view/texts/message_commands/message_commands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@

#include "message_commands.hpp"

constinit std::string_view SMessage_Commands::Start{ "/start" };
constinit std::string_view SMessage_Commands::Profile{ "/profile" };
constinit std::string_view SMessage_Commands::Programmer_Game{ "/pr_game" };
constinit std::string_view SMessage_Commands::Math_Game{ "/math_game" };
constinit std::string_view SMessage_Commands::Start{ "start" };
constinit std::string_view SMessage_Commands::Profile{ "profile" };
constinit std::string_view SMessage_Commands::Programmer_Game{ "pr_game" };
constinit std::string_view SMessage_Commands::Math_Game{ "math_game" };
constinit std::string_view SMessage_Commands::Answer{ "answer" };
1 change: 1 addition & 0 deletions source/view/texts/message_commands/message_commands.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,5 @@ struct SMessage_Commands
constinit static std::string_view Profile;
constinit static std::string_view Programmer_Game;
constinit static std::string_view Math_Game;
constinit static std::string_view Answer;
};

0 comments on commit e098125

Please sign in to comment.