/ src / network / room.h
room.h
  1  // Copyright 2017 Citra Emulator Project
  2  // Licensed under GPLv2 or any later version
  3  // Refer to the license.txt file included.
  4  
  5  #pragma once
  6  
  7  #include <array>
  8  #include <memory>
  9  #include <string>
 10  #include <vector>
 11  #include "common/common_types.h"
 12  #include "network/verify_user.h"
 13  
 14  namespace Network {
 15  
 16  constexpr u32 network_version = 4; ///< The version of this Room and RoomMember
 17  
 18  constexpr u16 DefaultRoomPort = 24872;
 19  
 20  constexpr u32 MaxMessageSize = 500;
 21  
 22  /// Maximum number of concurrent connections allowed to this room.
 23  static constexpr u32 MaxConcurrentConnections = 254;
 24  
 25  constexpr std::size_t NumChannels = 1; // Number of channels used for the connection
 26  
 27  struct RoomInformation {
 28      std::string name;           ///< Name of the server
 29      std::string description;    ///< Server description
 30      u32 member_slots;           ///< Maximum number of members in this room
 31      u16 port;                   ///< The port of this room
 32      std::string preferred_game; ///< Game to advertise that you want to play
 33      u64 preferred_game_id;      ///< Title ID for the advertised game
 34      std::string host_username;  ///< Forum username of the host
 35      bool enable_citra_mods;     ///< Allow Citra Moderators to moderate on this room
 36  };
 37  
 38  struct GameInfo {
 39      std::string name{""};
 40      u64 id{0};
 41  };
 42  
 43  using MacAddress = std::array<u8, 6>;
 44  /// A special MAC address that tells the room we're joining to assign us a MAC address
 45  /// automatically.
 46  constexpr MacAddress NoPreferredMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
 47  
 48  // 802.11 broadcast MAC address
 49  constexpr MacAddress BroadcastMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
 50  
 51  // The different types of messages that can be sent. The first byte of each packet defines the type
 52  enum RoomMessageTypes : u8 {
 53      IdJoinRequest = 1,
 54      IdJoinSuccess,
 55      IdRoomInformation,
 56      IdSetGameInfo,
 57      IdWifiPacket,
 58      IdChatMessage,
 59      IdNameCollision,
 60      IdMacCollision,
 61      IdVersionMismatch,
 62      IdWrongPassword,
 63      IdCloseRoom,
 64      IdRoomIsFull,
 65      IdConsoleIdCollision,
 66      IdStatusMessage,
 67      IdHostKicked,
 68      IdHostBanned,
 69      /// Moderation requests
 70      IdModKick,
 71      IdModBan,
 72      IdModUnban,
 73      IdModGetBanList,
 74      // Moderation responses
 75      IdModBanListResponse,
 76      IdModPermissionDenied,
 77      IdModNoSuchUser,
 78      IdJoinSuccessAsMod,
 79  };
 80  
 81  /// Types of system status messages
 82  enum StatusMessageTypes : u8 {
 83      IdMemberJoin = 1,  ///< Member joining
 84      IdMemberLeave,     ///< Member leaving
 85      IdMemberKicked,    ///< A member is kicked from the room
 86      IdMemberBanned,    ///< A member is banned from the room
 87      IdAddressUnbanned, ///< A username / ip address is unbanned from the room
 88  };
 89  
 90  /// This is what a server [person creating a server] would use.
 91  class Room final {
 92  public:
 93      enum class State : u8 {
 94          Open,   ///< The room is open and ready to accept connections.
 95          Closed, ///< The room is not opened and can not accept connections.
 96      };
 97  
 98      struct Member {
 99          std::string nickname;     ///< The nickname of the member.
100          std::string username;     ///< The web services username of the member. Can be empty.
101          std::string display_name; ///< The web services display name of the member. Can be empty.
102          std::string avatar_url;   ///< Url to the member's avatar. Can be empty.
103          GameInfo game_info;       ///< The current game of the member
104          MacAddress mac_address;   ///< The assigned mac address of the member.
105      };
106  
107      Room();
108      ~Room();
109  
110      /**
111       * Gets the current state of the room.
112       */
113      State GetState() const;
114  
115      /**
116       * Gets the room information of the room.
117       */
118      const RoomInformation& GetRoomInformation() const;
119  
120      /**
121       * Gets the verify UID of this room.
122       */
123      std::string GetVerifyUID() const;
124  
125      /**
126       * Gets a list of the mbmers connected to the room.
127       */
128      std::vector<Member> GetRoomMemberList() const;
129  
130      /**
131       * Checks if the room is password protected
132       */
133      bool HasPassword() const;
134  
135      using UsernameBanList = std::vector<std::string>;
136      using IPBanList = std::vector<std::string>;
137  
138      using BanList = std::pair<UsernameBanList, IPBanList>;
139  
140      /**
141       * Creates the socket for this room. Will bind to default address if
142       * server is empty string.
143       */
144      bool Create(const std::string& name, const std::string& description = "",
145                  const std::string& server = "", u16 server_port = DefaultRoomPort,
146                  const std::string& password = "",
147                  const u32 max_connections = MaxConcurrentConnections,
148                  const std::string& host_username = "", const std::string& preferred_game = "",
149                  u64 preferred_game_id = 0,
150                  std::unique_ptr<VerifyUser::Backend> verify_backend = nullptr,
151                  const BanList& ban_list = {}, bool enable_citra_mods = false);
152  
153      /**
154       * Sets the verification GUID of the room.
155       */
156      void SetVerifyUID(const std::string& uid);
157  
158      /**
159       * Gets the ban list (including banned forum usernames and IPs) of the room.
160       */
161      BanList GetBanList() const;
162  
163      /**
164       * Destroys the socket
165       */
166      void Destroy();
167  
168  private:
169      class RoomImpl;
170      std::unique_ptr<RoomImpl> room_impl;
171  };
172  
173  } // namespace Network