Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/application/StarP2PNetworkingService_pc.hpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/application/StarP2PNetworkingService_pc.hpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/application/StarP2PNetworkingService_pc.hpp')
-rw-r--r--source/application/StarP2PNetworkingService_pc.hpp146
1 files changed, 146 insertions, 0 deletions
diff --git a/source/application/StarP2PNetworkingService_pc.hpp b/source/application/StarP2PNetworkingService_pc.hpp
new file mode 100644
index 0000000..47cebb6
--- /dev/null
+++ b/source/application/StarP2PNetworkingService_pc.hpp
@@ -0,0 +1,146 @@
+#ifndef STAR_P2P_NETWORKING_SERVICE_PC_HPP
+#define STAR_P2P_NETWORKING_SERVICE_PC_HPP
+
+#include "StarPlatformServices_pc.hpp"
+#include "StarAlgorithm.hpp"
+#include "StarThread.hpp"
+#include "StarStrongTypedef.hpp"
+#include "StarRpcPromise.hpp"
+
+namespace Star {
+
+STAR_CLASS(PcP2PNetworkingService);
+
+class PcP2PNetworkingService : public P2PNetworkingService {
+public:
+ PcP2PNetworkingService(PcPlatformServicesStatePtr state);
+ ~PcP2PNetworkingService();
+
+ void setJoinUnavailable() override;
+ void setJoinLocal(uint32_t capacity) override;
+ void setJoinRemote(HostAddressWithPort location) override;
+ void setActivityData(String const& title, Maybe<pair<uint16_t, uint16_t>>) override;
+
+ MVariant<P2PNetworkingPeerId, HostAddressWithPort> pullPendingJoin() override;
+ Maybe<pair<String, RpcPromiseKeeper<P2PJoinRequestReply>>> pullJoinRequest() override;
+
+ void setAcceptingP2PConnections(bool acceptingP2PConnections) override;
+ List<P2PSocketUPtr> acceptP2PConnections() override;
+ void update() override;
+ Either<String, P2PSocketUPtr> connectToPeer(P2PNetworkingPeerId peerId) override;
+
+ void addPendingJoin(String connectionString);
+
+private:
+ strong_typedef(Empty, JoinUnavailable);
+ struct JoinLocal {
+ bool operator==(JoinLocal const& rhs) const { return capacity == rhs.capacity; };
+ uint32_t capacity;
+ };
+ strong_typedef(HostAddressWithPort, JoinRemote);
+ typedef Variant<JoinUnavailable, JoinLocal, JoinRemote> JoinLocation;
+
+#ifdef STAR_ENABLE_STEAM_INTEGRATION
+
+ struct SteamP2PSocket : P2PSocket {
+ SteamP2PSocket() = default;
+ ~SteamP2PSocket();
+
+ bool isOpen() override;
+ bool sendMessage(ByteArray const& message) override;
+ Maybe<ByteArray> receiveMessage() override;
+
+ Mutex mutex;
+ PcP2PNetworkingService* parent = nullptr;
+ CSteamID steamId = CSteamID();
+ Deque<ByteArray> incoming;
+ bool connected = false;
+ };
+
+ unique_ptr<SteamP2PSocket> createSteamP2PSocket(CSteamID steamId);
+
+ STEAM_CALLBACK(PcP2PNetworkingService, steamOnConnectionFailure, P2PSessionConnectFail_t, m_callbackConnectionFailure);
+ STEAM_CALLBACK(PcP2PNetworkingService, steamOnJoinRequested, GameRichPresenceJoinRequested_t, m_callbackJoinRequested);
+ STEAM_CALLBACK(PcP2PNetworkingService, steamOnSessionRequest, P2PSessionRequest_t, m_callbackSessionRequest);
+
+ void steamCloseSocket(SteamP2PSocket* socket);
+ void steamReceiveAll();
+
+#endif
+
+#ifdef STAR_ENABLE_DISCORD_INTEGRATION
+
+ enum class DiscordSocketMode {
+ Startup,
+ Connected,
+ Disconnected
+ };
+
+ struct DiscordP2PSocket : P2PSocket {
+ DiscordP2PSocket() = default;
+ ~DiscordP2PSocket();
+
+ bool isOpen() override;
+ bool sendMessage(ByteArray const& message) override;
+ Maybe<ByteArray> receiveMessage() override;
+
+ Mutex mutex;
+ PcP2PNetworkingService* parent = nullptr;
+ DiscordSocketMode mode = DiscordSocketMode::Disconnected;
+ discord::LobbyId lobbyId = {};
+ discord::UserId remoteUserId;
+ Deque<ByteArray> incoming;
+ };
+
+ P2PSocketUPtr discordConnectRemote(discord::UserId remoteUserId, discord::LobbyId lobbyId, String const& lobbySecret);
+ void discordCloseSocket(DiscordP2PSocket* socket);
+
+ void discordOnReceiveMessage(discord::LobbyId lobbyId, discord::UserId userId, discord::NetworkChannelId channel, uint8_t* data, uint32_t size);
+ void discordOnLobbyMemberConnect(discord::LobbyId lobbyId, discord::UserId userId);
+ void discordOnLobbyMemberUpdate(discord::LobbyId lobbyId, discord::UserId userId);
+ void discordOnLobbyMemberDisconnect(discord::LobbyId lobbyId, discord::UserId userId);
+
+#endif
+
+ void setJoinLocation(JoinLocation joinLocation);
+
+ PcPlatformServicesStatePtr m_state;
+
+ Mutex m_mutex;
+ JoinLocation m_joinLocation;
+ bool m_acceptingP2PConnections = false;
+ List<P2PSocketUPtr> m_pendingIncomingConnections;
+ MVariant<P2PNetworkingPeerId, HostAddressWithPort> m_pendingJoin;
+
+#ifdef STAR_ENABLE_STEAM_INTEGRATION
+
+ HashMap<uint64, SteamP2PSocket*> m_steamOpenSockets;
+
+#endif
+
+#ifdef STAR_ENABLE_DISCORD_INTEGRATION
+
+
+ List<pair<discord::UserId, String>> m_discordJoinRequests;
+ List<pair<discord::UserId, RpcPromise<P2PJoinRequestReply>>> m_pendingDiscordJoinRequests;
+
+ HashMap<discord::UserId, DiscordP2PSocket*> m_discordOpenSockets;
+ String m_discordActivityTitle;
+ Maybe<pair<uint16_t, uint16_t>> m_discordPartySize;
+ bool m_discordForceUpdateActivity = false;
+ bool m_discordUpdatingActivity = false;
+ Maybe<pair<discord::LobbyId, String>> m_discordServerLobby = {};
+
+ int m_discordOnActivityJoinToken = 0;
+ int m_discordOnActivityRequestToken = 0;
+ int m_discordOnReceiveMessage = 0;
+ int m_discordOnLobbyMemberConnect = 0;
+ int m_discordOnLobbyMemberUpdate = 0;
+ int m_discordOnLobbyMemberDisconnect = 0;
+
+#endif
+};
+
+}
+
+#endif