diff options
| author | 2017-07-09 12:26:03 +0200 | |
|---|---|---|
| committer | 2017-07-16 21:29:49 +0200 | |
| commit | 42e57c121896818f9fbde5ddd9b7dbb5b2a267b1 (patch) | |
| tree | b3f27a02bc2cda201297c48fb52dfbc0efba326b | |
| parent | Network: Handle the disconnect of a client (diff) | |
| download | yuzu-42e57c121896818f9fbde5ddd9b7dbb5b2a267b1.tar.gz yuzu-42e57c121896818f9fbde5ddd9b7dbb5b2a267b1.tar.xz yuzu-42e57c121896818f9fbde5ddd9b7dbb5b2a267b1.zip | |
Network: Enable sending and receiving chat messages
| -rw-r--r-- | src/network/room.cpp | 38 | ||||
| -rw-r--r-- | src/network/room_member.cpp | 29 | ||||
| -rw-r--r-- | src/network/room_member.h | 12 |
3 files changed, 79 insertions, 0 deletions
diff --git a/src/network/room.cpp b/src/network/room.cpp index 6dc7db341..0fdb5e68f 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp | |||
| @@ -107,6 +107,12 @@ public: | |||
| 107 | void HandleWifiPacket(const ENetEvent* event); | 107 | void HandleWifiPacket(const ENetEvent* event); |
| 108 | 108 | ||
| 109 | /** | 109 | /** |
| 110 | * Extracts a chat entry from a received ENet packet and adds it to the chat queue. | ||
| 111 | * @param event The ENet event that was received. | ||
| 112 | */ | ||
| 113 | void HandleChatPacket(const ENetEvent* event); | ||
| 114 | |||
| 115 | /** | ||
| 110 | * Removes the client from the members list if it was in it and announces the change | 116 | * Removes the client from the members list if it was in it and announces the change |
| 111 | * to all other clients. | 117 | * to all other clients. |
| 112 | */ | 118 | */ |
| @@ -128,6 +134,9 @@ void Room::RoomImpl::ServerLoop() { | |||
| 128 | case IdWifiPacket: | 134 | case IdWifiPacket: |
| 129 | HandleWifiPacket(&event); | 135 | HandleWifiPacket(&event); |
| 130 | break; | 136 | break; |
| 137 | case IdChatMessage: | ||
| 138 | HandleChatPacket(&event); | ||
| 139 | break; | ||
| 131 | } | 140 | } |
| 132 | enet_packet_destroy(event.packet); | 141 | enet_packet_destroy(event.packet); |
| 133 | break; | 142 | break; |
| @@ -271,6 +280,35 @@ void Room::RoomImpl::HandleWifiPacket(const ENetEvent* event) { | |||
| 271 | enet_host_flush(server); | 280 | enet_host_flush(server); |
| 272 | } | 281 | } |
| 273 | 282 | ||
| 283 | void Room::RoomImpl::HandleChatPacket(const ENetEvent* event) { | ||
| 284 | Packet in_packet; | ||
| 285 | in_packet.Append(event->packet->data, event->packet->dataLength); | ||
| 286 | |||
| 287 | in_packet.IgnoreBytes(sizeof(MessageID)); | ||
| 288 | std::string message; | ||
| 289 | in_packet >> message; | ||
| 290 | auto CompareNetworkAddress = [&](const Member member) -> bool { | ||
| 291 | return member.peer == event->peer; | ||
| 292 | }; | ||
| 293 | const auto sending_member = std::find_if(members.begin(), members.end(), CompareNetworkAddress); | ||
| 294 | if (sending_member == members.end()) { | ||
| 295 | return; // Received a chat message from a unknown sender | ||
| 296 | } | ||
| 297 | |||
| 298 | Packet out_packet; | ||
| 299 | out_packet << static_cast<MessageID>(IdChatMessage); | ||
| 300 | out_packet << sending_member->nickname; | ||
| 301 | out_packet << message; | ||
| 302 | |||
| 303 | ENetPacket* enet_packet = enet_packet_create(out_packet.GetData(), out_packet.GetDataSize(), | ||
| 304 | ENET_PACKET_FLAG_RELIABLE); | ||
| 305 | for (auto it = members.begin(); it != members.end(); ++it) { | ||
| 306 | if (it->peer != event->peer) | ||
| 307 | enet_peer_send(it->peer, 0, enet_packet); | ||
| 308 | } | ||
| 309 | enet_host_flush(server); | ||
| 310 | } | ||
| 311 | |||
| 274 | void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) { | 312 | void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) { |
| 275 | // Remove the client from the members list. | 313 | // Remove the client from the members list. |
| 276 | members.erase(std::remove_if(members.begin(), members.end(), | 314 | members.erase(std::remove_if(members.begin(), members.end(), |
diff --git a/src/network/room_member.cpp b/src/network/room_member.cpp index f919e4de0..d68bb551d 100644 --- a/src/network/room_member.cpp +++ b/src/network/room_member.cpp | |||
| @@ -68,6 +68,12 @@ public: | |||
| 68 | * @param event The ENet event that was received. | 68 | * @param event The ENet event that was received. |
| 69 | */ | 69 | */ |
| 70 | void HandleWifiPackets(const ENetEvent* event); | 70 | void HandleWifiPackets(const ENetEvent* event); |
| 71 | |||
| 72 | /** | ||
| 73 | * Extracts a chat entry from a received ENet packet and adds it to the chat queue. | ||
| 74 | * @param event The ENet event that was received. | ||
| 75 | */ | ||
| 76 | void HandleChatPacket(const ENetEvent* event); | ||
| 71 | }; | 77 | }; |
| 72 | 78 | ||
| 73 | // RoomMemberImpl | 79 | // RoomMemberImpl |
| @@ -89,6 +95,9 @@ void RoomMember::RoomMemberImpl::ReceiveLoop() { | |||
| 89 | if (event.type == ENET_EVENT_TYPE_RECEIVE) { | 95 | if (event.type == ENET_EVENT_TYPE_RECEIVE) { |
| 90 | switch (event.packet->data[0]) { | 96 | switch (event.packet->data[0]) { |
| 91 | // TODO(B3N30): Handle the other message types | 97 | // TODO(B3N30): Handle the other message types |
| 98 | case IdChatMessage: | ||
| 99 | HandleChatPacket(&event); | ||
| 100 | break; | ||
| 92 | case IdRoomInformation: | 101 | case IdRoomInformation: |
| 93 | HandleRoomInformationPacket(&event); | 102 | HandleRoomInformationPacket(&event); |
| 94 | break; | 103 | break; |
| @@ -208,6 +217,19 @@ void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) { | |||
| 208 | // TODO(B3N30): Invoke callbacks | 217 | // TODO(B3N30): Invoke callbacks |
| 209 | } | 218 | } |
| 210 | 219 | ||
| 220 | void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) { | ||
| 221 | Packet packet; | ||
| 222 | packet.Append(event->packet->data, event->packet->dataLength); | ||
| 223 | |||
| 224 | // Ignore the first byte, which is the message id. | ||
| 225 | packet.IgnoreBytes(sizeof(MessageID)); | ||
| 226 | |||
| 227 | ChatEntry chat_entry{}; | ||
| 228 | packet >> chat_entry.nickname; | ||
| 229 | packet >> chat_entry.message; | ||
| 230 | // TODO(B3N30): Invoke callbacks | ||
| 231 | } | ||
| 232 | |||
| 211 | // RoomMember | 233 | // RoomMember |
| 212 | RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} { | 234 | RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} { |
| 213 | room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0); | 235 | room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0); |
| @@ -273,6 +295,13 @@ void RoomMember::SendWifiPacket(const WifiPacket& wifi_packet) { | |||
| 273 | room_member_impl->Send(packet); | 295 | room_member_impl->Send(packet); |
| 274 | } | 296 | } |
| 275 | 297 | ||
| 298 | void RoomMember::SendChatMessage(const std::string& message) { | ||
| 299 | Packet packet; | ||
| 300 | packet << static_cast<MessageID>(IdChatMessage); | ||
| 301 | packet << message; | ||
| 302 | room_member_impl->Send(packet); | ||
| 303 | } | ||
| 304 | |||
| 276 | void RoomMember::Leave() { | 305 | void RoomMember::Leave() { |
| 277 | ASSERT_MSG(room_member_impl->receive_thread != nullptr, "Must be in a room to leave it."); | 306 | ASSERT_MSG(room_member_impl->receive_thread != nullptr, "Must be in a room to leave it."); |
| 278 | { | 307 | { |
diff --git a/src/network/room_member.h b/src/network/room_member.h index d23f5d4b6..693aa4e7f 100644 --- a/src/network/room_member.h +++ b/src/network/room_member.h | |||
| @@ -24,6 +24,12 @@ struct WifiPacket { | |||
| 24 | uint8_t channel; ///< WiFi channel where this frame was transmitted. | 24 | uint8_t channel; ///< WiFi channel where this frame was transmitted. |
| 25 | }; | 25 | }; |
| 26 | 26 | ||
| 27 | /// Represents a chat message. | ||
| 28 | struct ChatEntry { | ||
| 29 | std::string nickname; ///< Nickname of the client who sent this message. | ||
| 30 | std::string message; ///< Body of the message. | ||
| 31 | }; | ||
| 32 | |||
| 27 | /** | 33 | /** |
| 28 | * This is what a client [person joining a server] would use. | 34 | * This is what a client [person joining a server] would use. |
| 29 | * It also has to be used if you host a game yourself (You'd create both, a Room and a | 35 | * It also has to be used if you host a game yourself (You'd create both, a Room and a |
| @@ -88,6 +94,12 @@ public: | |||
| 88 | void SendWifiPacket(const WifiPacket& packet); | 94 | void SendWifiPacket(const WifiPacket& packet); |
| 89 | 95 | ||
| 90 | /** | 96 | /** |
| 97 | * Sends a chat message to the room. | ||
| 98 | * @param message The contents of the message. | ||
| 99 | */ | ||
| 100 | void SendChatMessage(const std::string& message); | ||
| 101 | |||
| 102 | /** | ||
| 91 | * Leaves the current room. | 103 | * Leaves the current room. |
| 92 | */ | 104 | */ |
| 93 | void Leave(); | 105 | void Leave(); |