using System; using System.Collections.Generic; using System.Linq; using StardewValley.Network; namespace StardewModdingAPI.Framework.Networking { /// Metadata about a connected player. internal class MultiplayerPeer : IMultiplayerPeer { /********* ** Fields *********/ /// A method which sends a message to the peer. private readonly Action SendMessageImpl; /********* ** Accessors *********/ /// public long PlayerID { get; } /// public bool IsHost { get; } /// public bool IsSplitScreen => this.ScreenID != null; /// public bool HasSmapi => this.ApiVersion != null; /// public int? ScreenID { get; } /// public GamePlatform? Platform { get; } /// public ISemanticVersion? GameVersion { get; } /// public ISemanticVersion? ApiVersion { get; } /// public IEnumerable Mods { get; } /********* ** Public methods *********/ /// Construct an instance. /// The player's unique ID. /// The player's screen ID, if applicable. /// The metadata to copy. /// A method which sends a message to the peer. /// Whether this is a connection to the host player. public MultiplayerPeer(long playerID, int? screenID, RemoteContextModel? model, Action sendMessage, bool isHost) { this.PlayerID = playerID; this.ScreenID = screenID; this.IsHost = isHost; if (model != null) { this.Platform = model.Platform; this.GameVersion = model.GameVersion; this.ApiVersion = model.ApiVersion; this.Mods = model.Mods.Select(mod => new MultiplayerPeerMod(mod)).ToArray(); } else this.Mods = Array.Empty(); this.SendMessageImpl = sendMessage; } /// public IMultiplayerPeerMod? GetMod(string? id) { if (string.IsNullOrWhiteSpace(id) || !this.Mods.Any()) return null; id = id.Trim(); return this.Mods.FirstOrDefault(mod => mod.ID != null && mod.ID.Equals(id, StringComparison.OrdinalIgnoreCase)); } /// Send a message to the given peer, bypassing the game's normal validation to allow messages before the connection is approved. /// The message to send. public void SendMessage(OutgoingMessage message) { this.SendMessageImpl(message); } } }