diff options
| author | 2017-07-09 12:26:03 +0200 | |
|---|---|---|
| committer | 2017-07-16 21:29:49 +0200 | |
| commit | 42e57c121896818f9fbde5ddd9b7dbb5b2a267b1 (patch) | |
| tree | b3f27a02bc2cda201297c48fb52dfbc0efba326b /src/network/room.cpp | |
| 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
Diffstat (limited to '')
| -rw-r--r-- | src/network/room.cpp | 38 |
1 files changed, 38 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(), |