#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(istream); switch (request_type) { case ChatRequestType::LOGINAVATAR: HandleIncomingMessage(istream); break; case ChatRequestType::LOGOUTAVATAR: HandleIncomingMessage(istream); break; case ChatRequestType::CREATEROOM: HandleIncomingMessage(istream); break; case ChatRequestType::DESTROYROOM: HandleIncomingMessage(istream); break; case ChatRequestType::SENDINSTANTMESSAGE: HandleIncomingMessage(istream); break; case ChatRequestType::SENDROOMMESSAGE: HandleIncomingMessage(istream); break; case ChatRequestType::ADDFRIEND: HandleIncomingMessage(istream); break; case ChatRequestType::REMOVEFRIEND: HandleIncomingMessage(istream); break; case ChatRequestType::FRIENDSTATUS: HandleIncomingMessage(istream); break; case ChatRequestType::ADDIGNORE: HandleIncomingMessage(istream); break; case ChatRequestType::REMOVEIGNORE: HandleIncomingMessage(istream); break; case ChatRequestType::ENTERROOM: HandleIncomingMessage(istream); break; case ChatRequestType::LEAVEROOM: HandleIncomingMessage(istream); break; case ChatRequestType::ADDMODERATOR: HandleIncomingMessage(istream); break; case ChatRequestType::REMOVEMODERATOR: HandleIncomingMessage(istream); break; case ChatRequestType::ADDBAN: HandleIncomingMessage(istream); break; case ChatRequestType::REMOVEBAN: HandleIncomingMessage(istream); break; case ChatRequestType::ADDINVITE: HandleIncomingMessage(istream); break; case ChatRequestType::REMOVEINVITE: HandleIncomingMessage(istream); break; case ChatRequestType::KICKAVATAR: HandleIncomingMessage(istream); break; case ChatRequestType::GETROOM: HandleIncomingMessage(istream); break; case ChatRequestType::GETROOMSUMMARIES: HandleIncomingMessage(istream); break; case ChatRequestType::SENDPERSISTENTMESSAGE: HandleIncomingMessage(istream); break; case ChatRequestType::GETPERSISTENTHEADERS: HandleIncomingMessage(istream); break; case ChatRequestType::GETPERSISTENTMESSAGE: HandleIncomingMessage(istream); break; case ChatRequestType::UPDATEPERSISTENTMESSAGE: HandleIncomingMessage(istream); break; case ChatRequestType::IGNORESTATUS: HandleIncomingMessage(istream); break; case ChatRequestType::FAILOVER_RELOGINAVATAR: HandleIncomingMessage(istream); break; case ChatRequestType::SETAPIVERSION: HandleIncomingMessage(istream); break; case ChatRequestType::SETAVATARATTRIBUTES: HandleIncomingMessage(istream); break; case ChatRequestType::GETANYAVATAR: HandleIncomingMessage(istream); break; default: LOG(INFO) << "Unknown request type received: " << static_cast(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 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& 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& 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()}); } }