mirror of
https://github.com/SWG-Source/stationapi.git
synced 2026-07-14 23:07:34 -04:00
246 lines
8.8 KiB
C++
246 lines
8.8 KiB
C++
|
|
#include "GatewayClient.hpp"
|
|
|
|
#include "ChatAvatarService.hpp"
|
|
#include "ChatEnums.hpp"
|
|
#include "ChatRoomService.hpp"
|
|
#include "GatewayNode.hpp"
|
|
#include "Message.hpp"
|
|
#include "PersistentMessageService.hpp"
|
|
#include "SQLite3.hpp"
|
|
#include "StationChatConfig.hpp"
|
|
#include "UdpLibrary.hpp"
|
|
|
|
#include "protocol/AddBan.hpp"
|
|
#include "protocol/AddFriend.hpp"
|
|
#include "protocol/AddIgnore.hpp"
|
|
#include "protocol/AddInvite.hpp"
|
|
#include "protocol/AddModerator.hpp"
|
|
#include "protocol/CreateRoom.hpp"
|
|
#include "protocol/DestroyRoom.hpp"
|
|
#include "protocol/EnterRoom.hpp"
|
|
#include "protocol/FailoverReLoginAvatar.hpp"
|
|
#include "protocol/FriendStatus.hpp"
|
|
#include "protocol/GetAnyAvatar.hpp"
|
|
#include "protocol/GetPersistentHeaders.hpp"
|
|
#include "protocol/GetPersistentMessage.hpp"
|
|
#include "protocol/GetRoom.hpp"
|
|
#include "protocol/GetRoomSummaries.hpp"
|
|
#include "protocol/IgnoreStatus.hpp"
|
|
#include "protocol/KickAvatar.hpp"
|
|
#include "protocol/LeaveRoom.hpp"
|
|
#include "protocol/LoginAvatar.hpp"
|
|
#include "protocol/LogoutAvatar.hpp"
|
|
#include "protocol/RemoveBan.hpp"
|
|
#include "protocol/RemoveFriend.hpp"
|
|
#include "protocol/RemoveIgnore.hpp"
|
|
#include "protocol/RemoveInvite.hpp"
|
|
#include "protocol/RemoveModerator.hpp"
|
|
#include "protocol/SendInstantMessage.hpp"
|
|
#include "protocol/SendPersistentMessage.hpp"
|
|
#include "protocol/SendRoomMessage.hpp"
|
|
#include "protocol/SetApiVersion.hpp"
|
|
#include "protocol/SetAvatarAttributes.hpp"
|
|
#include "protocol/UpdatePersistentMessage.hpp"
|
|
|
|
#include "easylogging++.h"
|
|
|
|
GatewayClient::GatewayClient(UdpConnection* connection, GatewayNode* node)
|
|
: NodeClient(connection)
|
|
, node_{node}
|
|
, avatarService_{node->GetAvatarService()}
|
|
, roomService_{node->GetRoomService()}
|
|
, messageService_{node->GetMessageService()} {
|
|
connection->SetHandler(this);
|
|
}
|
|
|
|
GatewayClient::~GatewayClient() {}
|
|
|
|
void GatewayClient::OnIncoming(std::istringstream& istream) {
|
|
ChatRequestType request_type = ::read<ChatRequestType>(istream);
|
|
|
|
switch (request_type) {
|
|
case ChatRequestType::LOGINAVATAR:
|
|
HandleIncomingMessage<LoginAvatar>(istream);
|
|
break;
|
|
case ChatRequestType::LOGOUTAVATAR:
|
|
HandleIncomingMessage<LogoutAvatar>(istream);
|
|
break;
|
|
case ChatRequestType::CREATEROOM:
|
|
HandleIncomingMessage<CreateRoom>(istream);
|
|
break;
|
|
case ChatRequestType::DESTROYROOM:
|
|
HandleIncomingMessage<DestroyRoom>(istream);
|
|
break;
|
|
case ChatRequestType::SENDINSTANTMESSAGE:
|
|
HandleIncomingMessage<SendInstantMessage>(istream);
|
|
break;
|
|
case ChatRequestType::SENDROOMMESSAGE:
|
|
HandleIncomingMessage<SendRoomMessage>(istream);
|
|
break;
|
|
case ChatRequestType::ADDFRIEND:
|
|
HandleIncomingMessage<AddFriend>(istream);
|
|
break;
|
|
case ChatRequestType::REMOVEFRIEND:
|
|
HandleIncomingMessage<RemoveFriend>(istream);
|
|
break;
|
|
case ChatRequestType::FRIENDSTATUS:
|
|
HandleIncomingMessage<FriendStatus>(istream);
|
|
break;
|
|
case ChatRequestType::ADDIGNORE:
|
|
HandleIncomingMessage<AddIgnore>(istream);
|
|
break;
|
|
case ChatRequestType::REMOVEIGNORE:
|
|
HandleIncomingMessage<RemoveIgnore>(istream);
|
|
break;
|
|
case ChatRequestType::ENTERROOM:
|
|
HandleIncomingMessage<EnterRoom>(istream);
|
|
break;
|
|
case ChatRequestType::LEAVEROOM:
|
|
HandleIncomingMessage<LeaveRoom>(istream);
|
|
break;
|
|
case ChatRequestType::ADDMODERATOR:
|
|
HandleIncomingMessage<AddModerator>(istream);
|
|
break;
|
|
case ChatRequestType::REMOVEMODERATOR:
|
|
HandleIncomingMessage<RemoveModerator>(istream);
|
|
break;
|
|
case ChatRequestType::ADDBAN:
|
|
HandleIncomingMessage<AddBan>(istream);
|
|
break;
|
|
case ChatRequestType::REMOVEBAN:
|
|
HandleIncomingMessage<RemoveBan>(istream);
|
|
break;
|
|
case ChatRequestType::ADDINVITE:
|
|
HandleIncomingMessage<AddInvite>(istream);
|
|
break;
|
|
case ChatRequestType::REMOVEINVITE:
|
|
HandleIncomingMessage<RemoveInvite>(istream);
|
|
break;
|
|
case ChatRequestType::KICKAVATAR:
|
|
HandleIncomingMessage<KickAvatar>(istream);
|
|
break;
|
|
case ChatRequestType::GETROOM:
|
|
HandleIncomingMessage<GetRoom>(istream);
|
|
break;
|
|
case ChatRequestType::GETROOMSUMMARIES:
|
|
HandleIncomingMessage<GetRoomSummaries>(istream);
|
|
break;
|
|
case ChatRequestType::SENDPERSISTENTMESSAGE:
|
|
HandleIncomingMessage<SendPersistentMessage>(istream);
|
|
break;
|
|
case ChatRequestType::GETPERSISTENTHEADERS:
|
|
HandleIncomingMessage<GetPersistentHeaders>(istream);
|
|
break;
|
|
case ChatRequestType::GETPERSISTENTMESSAGE:
|
|
HandleIncomingMessage<GetPersistentMessage>(istream);
|
|
break;
|
|
case ChatRequestType::UPDATEPERSISTENTMESSAGE:
|
|
HandleIncomingMessage<UpdatePersistentMessage>(istream);
|
|
break;
|
|
case ChatRequestType::IGNORESTATUS:
|
|
HandleIncomingMessage<IgnoreStatus>(istream);
|
|
break;
|
|
case ChatRequestType::FAILOVER_RELOGINAVATAR:
|
|
HandleIncomingMessage<FailoverReLoginAvatar>(istream);
|
|
break;
|
|
case ChatRequestType::SETAPIVERSION:
|
|
HandleIncomingMessage<SetApiVersion>(istream);
|
|
break;
|
|
case ChatRequestType::SETAVATARATTRIBUTES:
|
|
HandleIncomingMessage<SetAvatarAttributes>(istream);
|
|
break;
|
|
case ChatRequestType::GETANYAVATAR:
|
|
HandleIncomingMessage<GetAnyAvatar>(istream);
|
|
break;
|
|
default:
|
|
LOG(INFO) << "Unknown request type received: " << static_cast<uint16_t>(request_type);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void GatewayClient::SendFriendLoginUpdate(
|
|
const ChatAvatar* srcAvatar, const ChatAvatar* destAvatar) {
|
|
node_->SendTo(
|
|
srcAvatar->GetAddress(), MFriendLogin{destAvatar, destAvatar->GetAddress(),
|
|
srcAvatar->GetAvatarId(), destAvatar->GetStatusMessage()});
|
|
}
|
|
|
|
void GatewayClient::SendFriendLoginUpdates(const ChatAvatar* avatar) {
|
|
auto as = node_->GetAvatarService();
|
|
auto& onlineAvatars = as->GetOnlineAvatars();
|
|
for (auto onlineAvatar : onlineAvatars) {
|
|
if (onlineAvatar->IsFriend(avatar)) {
|
|
SendFriendLoginUpdate(onlineAvatar, avatar);
|
|
}
|
|
}
|
|
|
|
for (auto& contact : avatar->GetFriendList()) {
|
|
if (contact.frnd->IsOnline()) {
|
|
Send(MFriendLogin{contact.frnd, contact.frnd->GetAddress(), avatar->GetAvatarId(),
|
|
contact.frnd->GetStatusMessage()});
|
|
}
|
|
}
|
|
}
|
|
|
|
void GatewayClient::SendFriendLogoutUpdates(const ChatAvatar* avatar) {
|
|
auto& onlineAvatars = avatarService_->GetOnlineAvatars();
|
|
for (auto onlineAvatar : onlineAvatars) {
|
|
if (onlineAvatar->IsFriend(avatar)) {
|
|
node_->SendTo(onlineAvatar->GetAddress(),
|
|
MFriendLogout{avatar, avatar->GetAddress(), onlineAvatar->GetAvatarId()});
|
|
}
|
|
}
|
|
}
|
|
|
|
void GatewayClient::SendDestroyRoomUpdate(
|
|
const ChatAvatar* srcAvatar, uint32_t roomId, std::vector<std::u16string> targets) {
|
|
for (auto& address : targets) {
|
|
node_->SendTo(address, MDestroyRoom{srcAvatar, roomId});
|
|
}
|
|
}
|
|
|
|
void GatewayClient::SendInstantMessageUpdate(const ChatAvatar* srcAvatar,
|
|
const ChatAvatar* destAvatar, const std::u16string& message, const std::u16string& oob) {
|
|
node_->SendTo(destAvatar->GetAddress(),
|
|
MInstantMessage{srcAvatar, destAvatar->GetAvatarId(), message, oob});
|
|
}
|
|
|
|
void GatewayClient::SendRoomMessageUpdate(const ChatAvatar* srcAvatar, const ChatRoom* room,
|
|
uint32_t messageId, const std::u16string& message, const std::u16string& oob) {
|
|
auto connectedAddresses = room->GetConnectedAddresses();
|
|
for (auto& address : connectedAddresses) {
|
|
node_->SendTo(address, MRoomMessage{srcAvatar, room->GetRoomId(), room->GetAvatarIds(srcAvatar),
|
|
message, oob, messageId});
|
|
}
|
|
}
|
|
|
|
void GatewayClient::SendEnterRoomUpdate(const ChatAvatar* srcAvatar, const ChatRoom* room) {
|
|
for (const auto& address : room->GetConnectedAddresses()) {
|
|
node_->SendTo(address, MEnterRoom{srcAvatar, room->GetRoomId()});
|
|
}
|
|
}
|
|
|
|
void GatewayClient::SendLeaveRoomUpdate(
|
|
const std::vector<std::u16string>& addresses, uint32_t srcAvatarId, uint32_t roomId) {
|
|
for (const auto& address : addresses) {
|
|
node_->SendTo(address, MLeaveRoom{srcAvatarId, roomId});
|
|
}
|
|
}
|
|
|
|
void GatewayClient::SendPersistentMessageUpdate(
|
|
const ChatAvatar* destAvatar, const PersistentHeader& header) {
|
|
if (destAvatar) {
|
|
node_->SendTo(
|
|
destAvatar->GetAddress(), MPersistentMessage{destAvatar->GetAvatarId(), header});
|
|
}
|
|
}
|
|
|
|
void GatewayClient::SendKickAvatarUpdate(const std::vector<std::u16string>& addresses,
|
|
const ChatAvatar* srcAvatar, const ChatAvatar* destAvatar, const ChatRoom* room) {
|
|
for (const auto& address : addresses) {
|
|
node_->SendTo(address,
|
|
MKickAvatar{srcAvatar, destAvatar, room->GetRoomName(), room->GetRoomAddress()});
|
|
}
|
|
}
|