Libnetwork: add password protected rooms, guid, and error fixes (#3068)
* Network: Add password protected roomsand GUID * Limit chat message size
This commit is contained in:
parent
4071da5012
commit
c0a7afaa5c
4 changed files with 139 additions and 33 deletions
|
@ -74,10 +74,12 @@ public:
|
|||
* nickname and preferred mac.
|
||||
* @params nickname The desired nickname.
|
||||
* @params preferred_mac The preferred MAC address to use in the room, the NoPreferredMac tells
|
||||
* @params password The password for the room
|
||||
* the server to assign one for us.
|
||||
*/
|
||||
void SendJoinRequest(const std::string& nickname,
|
||||
const MacAddress& preferred_mac = NoPreferredMac);
|
||||
const MacAddress& preferred_mac = NoPreferredMac,
|
||||
const std::string& password = "");
|
||||
|
||||
/**
|
||||
* Extracts a MAC Address from a received ENet packet.
|
||||
|
@ -161,6 +163,9 @@ void RoomMember::RoomMemberImpl::MemberLoop() {
|
|||
case IdVersionMismatch:
|
||||
SetState(State::WrongVersion);
|
||||
break;
|
||||
case IdWrongPassword:
|
||||
SetState(State::WrongPassword);
|
||||
break;
|
||||
case IdCloseRoom:
|
||||
SetState(State::LostConnection);
|
||||
break;
|
||||
|
@ -196,12 +201,14 @@ void RoomMember::RoomMemberImpl::Send(Packet&& packet) {
|
|||
}
|
||||
|
||||
void RoomMember::RoomMemberImpl::SendJoinRequest(const std::string& nickname,
|
||||
const MacAddress& preferred_mac) {
|
||||
const MacAddress& preferred_mac,
|
||||
const std::string& password) {
|
||||
Packet packet;
|
||||
packet << static_cast<u8>(IdJoinRequest);
|
||||
packet << nickname;
|
||||
packet << preferred_mac;
|
||||
packet << network_version;
|
||||
packet << password;
|
||||
Send(std::move(packet));
|
||||
}
|
||||
|
||||
|
@ -215,8 +222,13 @@ void RoomMember::RoomMemberImpl::HandleRoomInformationPacket(const ENetEvent* ev
|
|||
RoomInformation info{};
|
||||
packet >> info.name;
|
||||
packet >> info.member_slots;
|
||||
packet >> info.uid;
|
||||
packet >> info.port;
|
||||
packet >> info.preferred_game;
|
||||
room_information.name = info.name;
|
||||
room_information.member_slots = info.member_slots;
|
||||
room_information.port = info.port;
|
||||
room_information.preferred_game = info.preferred_game;
|
||||
|
||||
u32 num_members;
|
||||
packet >> num_members;
|
||||
|
@ -260,10 +272,6 @@ void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) {
|
|||
packet >> wifi_packet.channel;
|
||||
packet >> wifi_packet.transmitter_address;
|
||||
packet >> wifi_packet.destination_address;
|
||||
|
||||
u32 data_length;
|
||||
packet >> data_length;
|
||||
|
||||
packet >> wifi_packet.data;
|
||||
|
||||
Invoke<WifiPacket>(wifi_packet);
|
||||
|
@ -348,14 +356,13 @@ RoomMember::CallbackHandle<T> RoomMember::RoomMemberImpl::Bind(
|
|||
}
|
||||
|
||||
// RoomMember
|
||||
RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} {
|
||||
room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0);
|
||||
ASSERT_MSG(room_member_impl->client != nullptr, "Could not create client");
|
||||
}
|
||||
RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} {}
|
||||
|
||||
RoomMember::~RoomMember() {
|
||||
ASSERT_MSG(!IsConnected(), "RoomMember is being destroyed while connected");
|
||||
enet_host_destroy(room_member_impl->client);
|
||||
if (room_member_impl->loop_thread) {
|
||||
Leave();
|
||||
}
|
||||
}
|
||||
|
||||
RoomMember::State RoomMember::GetState() const {
|
||||
|
@ -380,18 +387,22 @@ RoomInformation RoomMember::GetRoomInformation() const {
|
|||
}
|
||||
|
||||
void RoomMember::Join(const std::string& nick, const char* server_addr, u16 server_port,
|
||||
u16 client_port, const MacAddress& preferred_mac) {
|
||||
u16 client_port, const MacAddress& preferred_mac,
|
||||
const std::string& password) {
|
||||
// If the member is connected, kill the connection first
|
||||
if (room_member_impl->loop_thread && room_member_impl->loop_thread->joinable()) {
|
||||
room_member_impl->SetState(State::Error);
|
||||
room_member_impl->loop_thread->join();
|
||||
room_member_impl->loop_thread.reset();
|
||||
Leave();
|
||||
}
|
||||
// If the thread isn't running but the ptr still exists, reset it
|
||||
else if (room_member_impl->loop_thread) {
|
||||
room_member_impl->loop_thread.reset();
|
||||
}
|
||||
|
||||
if (!room_member_impl->client) {
|
||||
room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0);
|
||||
ASSERT_MSG(room_member_impl->client != nullptr, "Could not create client");
|
||||
}
|
||||
|
||||
ENetAddress address{};
|
||||
enet_address_set_host(&address, server_addr);
|
||||
address.port = server_port;
|
||||
|
@ -409,9 +420,10 @@ void RoomMember::Join(const std::string& nick, const char* server_addr, u16 serv
|
|||
room_member_impl->nickname = nick;
|
||||
room_member_impl->SetState(State::Joining);
|
||||
room_member_impl->StartLoop();
|
||||
room_member_impl->SendJoinRequest(nick, preferred_mac);
|
||||
room_member_impl->SendJoinRequest(nick, preferred_mac, password);
|
||||
SendGameInfo(room_member_impl->current_game_info);
|
||||
} else {
|
||||
enet_peer_disconnect(room_member_impl->server, 0);
|
||||
room_member_impl->SetState(State::CouldNotConnect);
|
||||
}
|
||||
}
|
||||
|
@ -480,6 +492,9 @@ void RoomMember::Leave() {
|
|||
room_member_impl->SetState(State::Idle);
|
||||
room_member_impl->loop_thread->join();
|
||||
room_member_impl->loop_thread.reset();
|
||||
|
||||
enet_host_destroy(room_member_impl->client);
|
||||
room_member_impl->client = nullptr;
|
||||
}
|
||||
|
||||
template void RoomMember::Unbind(CallbackHandle<WifiPacket>);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue