Skip to content

Commit cc91f76

Browse files
committed
REF: refactor of socket component
1 parent ebbbe30 commit cc91f76

File tree

10 files changed

+363
-279
lines changed

10 files changed

+363
-279
lines changed

src/engine/shared/config_pulse.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ MACRO_CONFIG_INT(ClAntiRQ, cl_anti_rq_mode, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SA
8585
//Chat
8686
MACRO_CONFIG_INT(ClCrossChatAutoConnect, cl_cross_chat_autoconnect, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Automatically connect to CrossChat on startup")
8787
MACRO_CONFIG_INT(ClCrossChatInGameChat, cl_cross_chat_ingame_chat, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable CrossChat integration with in-game chat")
88-
//MACRO_CONFIG_INT(ClCrossChatInGameChat, cl_cross_chat_ingame_chat, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable CrossChat integration with in-game chat")
88+
MACRO_CONFIG_INT(ClCrossChatDebug, cl_cross_chat_debug, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable CrossChat debug messages")
8989

9090
//pulse server
9191
MACRO_CONFIG_STR(ClSocketNameserver, ntwr_nameserver, 256, "localhost:3000", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Nameserver for websockets") //TODO: actaual nameserver

src/game/client/components/comp_pulse/menus_pulse.cpp

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -924,11 +924,11 @@ void CMenus::RenderCrossChat(CUIRect MainView)
924924
// m_CrossChatMessages.emplace_back("[Server]: Добро пожаловать в CrossChat!");
925925

926926
char aBuf[64];
927-
if(GameClient()->m_WebSocket.IsConnected())
927+
if(GameClient()->m_WebSocket.m_IsConnected)
928928
str_format(aBuf, sizeof(aBuf), "[Server]: Welcome to chat, %s", g_Config.m_PlayerName);
929929
else
930930
str_format(aBuf, sizeof(aBuf), "[Offline]: Try again later");
931-
GameClient()->m_WebSocket.AddMessage(aBuf);
931+
GameClient()->m_WebSocket.m_WebSocketChat.AddMessage(aBuf);
932932
}
933933

934934
MainView.Draw(ColorRGBA(0, 0, 0, 0.5f), IGraphics::CORNER_ALL, 5.0f);
@@ -955,7 +955,7 @@ void CMenus::RenderCrossChat(CUIRect MainView)
955955
TextRender()->SetFontPreset(EFontPreset::ICON_FONT);
956956

957957
CButtonContainer SReconnectButton;
958-
bool Connected = GameClient()->m_WebSocket.IsConnected();
958+
bool Connected = GameClient()->m_WebSocket.m_IsConnected;
959959

960960
ColorRGBA ButtonColor = Connected ? ColorRGBA(1.0f, 0.0f, 0.0f, 0.25f) // красная при подключении
961961
:
@@ -974,10 +974,6 @@ void CMenus::RenderCrossChat(CUIRect MainView)
974974
ButtonColor))
975975
{
976976
GameClient()->m_WebSocket.SocketConnect();
977-
if(Connected)
978-
{
979-
GameClient()->m_WebSocket.OnInit();
980-
}
981977
}
982978
static bool s_settings_open = false;
983979

@@ -1004,10 +1000,16 @@ void CMenus::RenderCrossChat(CUIRect MainView)
10041000
LeftBar.HSplitBottom(LeftBar.h / 3, &LeftBar, &SettingsRect);
10051001
SettingsRect.Draw(ColorRGBA(0.0f, 0.5f, 1.0f, 0.25f), IGraphics::CORNER_ALL, 3.0f);
10061002
TextRender()->Text(SettingsRect.x + 5.0f, SettingsRect.y + 5.0f, 12.0f, FONT_ICON_GEAR, -1);
1003+
TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT);
1004+
SettingsRect.VMargin(10.0f, &SettingsRect);
1005+
SettingsRect.HSplitTop(SettingsRect.h / 5, nullptr, &SettingsRect);
1006+
1007+
1008+
SettingsRect.HSplitTop(20.0f, &Button, &SettingsRect);
1009+
if(DoButton_CheckBox(&g_Config.m_ClCrossChatAutoConnect, Localize("Connect on startup"), g_Config.m_ClCrossChatAutoConnect, &Button))
1010+
g_Config.m_ClCrossChatAutoConnect ^= 1;
10071011

1008-
SettingsRect.HSplitTop(10.0f, &Button, &SettingsRect);
1009-
Ui()->DoLabel(&Button, Localize("Settings"), FontSize, TEXTALIGN_ML);
1010-
Button.HSplitTop(5.0f, nullptr, &Button);
1012+
10111013
}
10121014

10131015
TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT);
@@ -1027,40 +1029,38 @@ void CMenus::RenderCrossChat(CUIRect MainView)
10271029
const char *pText = s_ChatInput.GetString();
10281030
int64_t Now = time_get();
10291031

1030-
if(GameClient()->m_WebSocket.IsConnected())
1031-
{
1032-
if(!GameClient()->m_WebSocket.m_IsTyping)
1032+
1033+
if(!GameClient()->m_WebSocket.m_WebSocketChat.m_IsTyping)
10331034
{
1034-
GameClient()->m_WebSocket.m_IsTyping = true;
1035-
GameClient()->m_SocketIO.socket()->emit("typing_start", sio::string_message::create(Client()->PlayerName()));
1035+
GameClient()->m_WebSocket.m_WebSocketChat.m_IsTyping = true;
1036+
GameClient()->m_WebSocket.m_WebSocketChat.SendTypingState(true);
10361037
}
10371038

1038-
GameClient()->m_WebSocket.m_LastTypeTime = Now;
1039-
}
1039+
GameClient()->m_WebSocket.m_WebSocketChat.m_LastTypeTime = Now;
1040+
10401041
}
10411042

1042-
if(GameClient()->m_WebSocket.m_IsTyping && time_get() - GameClient()->m_WebSocket.m_LastTypeTime > time_freq() * 2)
1043+
if(GameClient()->m_WebSocket.m_WebSocketChat.m_IsTyping && time_get() - GameClient()->m_WebSocket.m_WebSocketChat.m_LastTypeTime > time_freq() * 2)
10431044
{
1044-
GameClient()->m_WebSocket.m_IsTyping = false;
1045-
if(GameClient()->m_WebSocket.IsConnected())
1046-
GameClient()->m_SocketIO.socket()->emit("typing_stop", sio::string_message::create(Client()->PlayerName()));
1045+
GameClient()->m_WebSocket.m_WebSocketChat.m_IsTyping = false;
1046+
GameClient()->m_WebSocket.m_WebSocketChat.SendTypingState(false);
10471047
}
10481048

10491049
if(Input()->KeyPress(KEY_RETURN) || Input()->KeyPress(KEY_KP_ENTER))
10501050
{
10511051
const char *pText = s_ChatInput.GetString();
10521052
if(pText && pText[0])
10531053
{
1054-
GameClient()->m_WebSocket.SendChatMessage(pText);
1054+
GameClient()->m_WebSocket.m_WebSocketChat.SendChatMessage(pText);
10551055

1056-
s_ChatHistory.push_back(pText);
1056+
s_ChatHistory.emplace_back(pText);
10571057
s_HistoryIndex = -1;
10581058
s_ChatInput.Clear();
10591059

1060-
if(GameClient()->m_WebSocket.m_IsTyping)
1060+
if(GameClient()->m_WebSocket.m_WebSocketChat.m_IsTyping)
10611061
{
1062-
GameClient()->m_WebSocket.m_IsTyping = false;
1063-
GameClient()->m_SocketIO.socket()->emit("typing_stop", sio::string_message::create(Client()->PlayerName()));
1062+
GameClient()->m_WebSocket.m_WebSocketChat.m_IsTyping = false;
1063+
GameClient()->m_WebSocket.m_WebSocketChat.SendTypingState(false);
10641064
}
10651065
}
10661066
}
@@ -1094,15 +1094,15 @@ void CMenus::RenderCrossChat(CUIRect MainView)
10941094
}
10951095
}
10961096

1097-
std::lock_guard<std::mutex> lock(GameClient()->m_WebSocket.m_OnlinePlayersMutex);
1097+
std::lock_guard<std::mutex> lock(GameClient()->m_WebSocket.m_WebSocketChat.m_OnlinePlayersMutex);
10981098
float yOnline = LeftBar.y + 10.0f;
1099-
for(const auto &player : GameClient()->m_WebSocket.m_OnlinePlayers)
1099+
for(const auto &player : GameClient()->m_WebSocket.m_WebSocketChat.m_OnlinePlayers)
11001100
{
11011101
TextRender()->Text(LeftBar.x + 5.0f, yOnline, 12.0f, player.c_str(), -1);
11021102
yOnline += 15.0f;
11031103
}
11041104

1105-
std::vector<CWebSocket::SChatMessage> Messages = GameClient()->m_WebSocket.GetMessages();
1105+
std::vector<CWebSocketChat::SChatMessage> Messages = GameClient()->m_WebSocket.m_WebSocketChat.GetMessages();
11061106
const float LineHeight = 12.0f;
11071107
float y = ChatView.y + ChatView.h - LineHeight;
11081108

@@ -1124,19 +1124,19 @@ void CMenus::RenderCrossChat(CUIRect MainView)
11241124
}
11251125

11261126
{
1127-
std::lock_guard<std::mutex> lock(GameClient()->m_WebSocket.m_TypingMutex);
1128-
if(!GameClient()->m_WebSocket.m_TypingUsers.empty())
1127+
std::lock_guard<std::mutex> lock(GameClient()->m_WebSocket.m_WebSocketChat.m_TypingMutex);
1128+
if(!GameClient()->m_WebSocket.m_WebSocketChat.m_TypingUsers.empty())
11291129
{
11301130
std::string TypingText;
1131-
size_t Count = GameClient()->m_WebSocket.m_TypingUsers.size();
1131+
size_t Count = GameClient()->m_WebSocket.m_WebSocketChat.m_TypingUsers.size();
11321132

11331133
if(Count == 1)
11341134
{
1135-
TypingText = *GameClient()->m_WebSocket.m_TypingUsers.begin() + " is typing...";
1135+
TypingText = *GameClient()->m_WebSocket.m_WebSocketChat.m_TypingUsers.begin() + " is typing...";
11361136
}
11371137
else if(Count == 2)
11381138
{
1139-
auto it = GameClient()->m_WebSocket.m_TypingUsers.begin();
1139+
auto it = GameClient()->m_WebSocket.m_WebSocketChat.m_TypingUsers.begin();
11401140
std::string first = *it++;
11411141
std::string second = *it;
11421142
TypingText = first + " and " + second + " are typing...";
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
#include "socket_chat.h"
2+
3+
#include "../socket.h"
4+
#include "game/client/gameclient.h"
5+
6+
7+
void CWebSocketChat::ListenerInit()
8+
{
9+
10+
m_Socket->socket()->on("chat_message", [&](sio::event &ev) { HandleChatMessage(ev); });
11+
m_Socket->socket()->on("online_update", [&](sio::event &ev) { HandleOnlineUpdate(ev); });
12+
13+
m_Socket->socket()->on("typing_start", [&](sio::event &ev) {HandleTypingStart(ev);});
14+
m_Socket->socket()->on("typing_stop", [&](sio::event &ev) {HandleTypingStop(ev);});
15+
16+
dbg_msg("test", "%d", *m_IsConnected);
17+
}
18+
19+
void CWebSocketChat::HandleTypingStart(sio::event &ev)
20+
{
21+
auto Data = ev.get_message();
22+
if(!Data || Data->get_flag() != sio::message::flag_object)
23+
return;
24+
std::string Nickname = Data->get_map()["nickname"]->get_string();
25+
26+
std::lock_guard<std::mutex> Lock(m_TypingMutex);
27+
m_TypingUsers.insert(Nickname);
28+
}
29+
30+
void CWebSocketChat::HandleTypingStop(sio::event &ev)
31+
{
32+
auto Data = ev.get_message();
33+
if(!Data || Data->get_flag() != sio::message::flag_object)
34+
return;
35+
std::string Nickname = Data->get_map()["nickname"]->get_string();
36+
37+
std::lock_guard<std::mutex> lock(m_TypingMutex);
38+
m_TypingUsers.erase(Nickname);
39+
}
40+
41+
void CWebSocketChat::HandleChatMessage(sio::event &ev)
42+
{
43+
auto Data = ev.get_message();
44+
if(!Data || Data->get_flag() != sio::message::flag_object)
45+
return;
46+
47+
auto Map = Data->get_map();
48+
std::string Nickname = Map["nickname"]->get_string();
49+
std::string Message = Map["message"]->get_string();
50+
51+
ColorRGBA color(1.0f, 1.0f, 1.0f, 1.0f);
52+
if(Map.contains("color"))
53+
{
54+
auto c = Map["color"]->get_map();
55+
color.r = c["r"] ? (float)c["r"]->get_double() : 1.0f;
56+
color.g = c["g"] ? (float)c["g"]->get_double() : 1.0f;
57+
color.b = c["b"] ? (float)c["b"]->get_double() : 1.0f;
58+
color.a = c["a"] ? (float)c["a"]->get_double() : 1.0f;
59+
}
60+
61+
if(Map.contains("skin_name") && Map["skin_name"]->get_flag() == sio::message::flag_string)
62+
std::string skin_name = Map["skin_name"]->get_string();
63+
64+
65+
char aBuf[128];
66+
str_format(aBuf, sizeof(aBuf), "%s: %s", Nickname.c_str(), Message.c_str());
67+
AddMessage(aBuf, color);
68+
69+
if(g_Config.m_ClCrossChatDebug)
70+
{
71+
str_format(aBuf, sizeof(aBuf), "[Debug]: Got color: r=%.2f g=%.2f b=%.2f a=%.2f", color.r, color.g, color.b, color.a);
72+
AddMessage(aBuf, ColorRGBA(0.0f, 1.0f, 0.0f, 1.0f));
73+
}
74+
}
75+
76+
void CWebSocketChat::HandleOnlineUpdate(sio::event &ev)
77+
{
78+
auto Data = ev.get_message();
79+
if(!Data || Data->get_flag() != sio::message::flag_object)
80+
return;
81+
82+
auto UsersArray = Data->get_map()["users"]->get_vector();
83+
std::vector<std::string> OnlinePlayers;
84+
for(auto &userMsg : UsersArray)
85+
if(userMsg->get_flag() == sio::message::flag_string)
86+
OnlinePlayers.push_back(userMsg->get_string());
87+
88+
std::lock_guard<std::mutex> lock(m_OnlinePlayersMutex);
89+
m_OnlinePlayers = OnlinePlayers;
90+
}
91+
92+
void CWebSocketChat::SendChatMessage(const std::string &Msg) const
93+
{
94+
if(!m_IsConnected)
95+
return;
96+
m_Socket->socket()->emit("chat_message", sio::string_message::create(Msg));
97+
}
98+
99+
void CWebSocketChat::AddMessage(const std::string &Msg, ColorRGBA MsgColor)
100+
{
101+
std::lock_guard<std::mutex> lock(m_MessageMutex);
102+
SChatMessage MsgStruct;
103+
MsgStruct.m_Text = Msg;
104+
MsgStruct.m_Color = MsgColor;
105+
m_ChatMessages.push_back(MsgStruct);
106+
if(m_ChatMessages.size() > 100)
107+
m_ChatMessages.erase(m_ChatMessages.begin());
108+
109+
dbg_msg("MSGGGGG", "%s" , Msg.c_str());
110+
}
111+
112+
std::vector<CWebSocketChat::SChatMessage> CWebSocketChat::GetMessages()
113+
{
114+
std::lock_guard<std::mutex> Lock(m_MessageMutex);
115+
return m_ChatMessages;
116+
}
117+
118+
void CWebSocketChat::SendTypingState(bool State)
119+
{
120+
if(!m_IsConnected)
121+
return;
122+
123+
if(State)
124+
m_Socket->socket()->emit("typing_start", sio::string_message::create(g_Config.m_PlayerName));
125+
else
126+
m_Socket->socket()->emit("typing_stop", sio::string_message::create(g_Config.m_PlayerName));
127+
}
128+
129+

src/game/client/components/comp_pulse/socket_request.h renamed to src/game/client/components/comp_pulse/socket/modules/socket_chat.h

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,37 @@
1-
#ifndef GAME_CLIENT_COMPONENTS_COMP_PULSE_SOCKET_REQUEST_H
2-
#define GAME_CLIENT_COMPONENTS_COMP_PULSE_SOCKET_REQUEST_H
1+
#ifndef GAME_CLIENT_COMPONENTS_COMP_PULSE_SOCKET_MODULES_SOCKET_CHAT_H
2+
#define GAME_CLIENT_COMPONENTS_COMP_PULSE_SOCKET_MODULES_SOCKET_CHAT_H
33

4-
#include "base/color.h"
5-
6-
#include <game/client/component.h>
4+
#include "../socket_component.h"
75

6+
#include "base/color.h"
87
#include <sio_client.h>
98

109
#include <mutex>
1110
#include <string>
1211
#include <unordered_set>
1312
#include <vector>
1413

15-
class CWebSocket : public CComponent
14+
class CWebSocketChat : public CWebSocketComponent
1615
{
17-
void SetupSocketListeners();
18-
void HandleChatMessage(sio::event &Ev);
19-
void HandleOnlineUpdate(sio::event &Ev);
20-
21-
std::mutex m_SkinMutex;
22-
2316
public:
2417
struct SChatMessage
2518
{
2619
std::string m_Text;
2720
ColorRGBA m_Color;
2821
};
22+
std::vector<SChatMessage> GetMessages();
23+
24+
//sio::client m_Socket;
25+
26+
void HandleChatMessage(sio::event &Ev);
27+
void SendChatMessage(const std::string &Msg) const;
28+
void AddMessage(const std::string &Msg, ColorRGBA MsgColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f));
29+
void HandleOnlineUpdate(sio::event &Ev);
30+
31+
2932
std::mutex m_MessageMutex;
3033
std::vector<SChatMessage> m_ChatMessages;
3134

32-
bool m_IsConnected;
33-
3435
std::vector<std::string> m_OnlinePlayers;
3536
std::mutex m_OnlinePlayersMutex;
3637

@@ -39,22 +40,16 @@ class CWebSocket : public CComponent
3940
bool m_IsTyping = false;
4041
int64_t m_LastTypeTime = 0;
4142

42-
void SocketConnect();
43-
void SocketDisconnect();
44-
void ConnectAndSetup();
45-
void SocketListen(const std::string &Name);
46-
void SendChatMessage(const std::string &Msg);
47-
bool IsConnected() const;
4843

49-
void OnOpen();
50-
void OnClose();
5144

52-
void AddMessage(const std::string &Msg, ColorRGBA MsgColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f));
53-
std::vector<SChatMessage> GetMessages();
54-
void SetPlayerSkin(const std::string &SkinName, const std::string &BodyColor, const std::string &FeetColor, bool IsCustomColor);
45+
void ListenerInit() override;
46+
47+
48+
void HandleTypingStart(sio::event &ev);
49+
void HandleTypingStop(sio::event &ev);
50+
51+
void SendTypingState(bool State);
5552

56-
void OnInit() override;
57-
int Sizeof() const override { return sizeof(*this); }
5853
};
5954

6055
#endif

0 commit comments

Comments
 (0)