using NativeEngine; using Sandbox.Network; using System.Collections.Generic; namespace Sandbox; /// /// Rich Presence System for Steam /// internal sealed class SteamRichPresenceSystem : IRichPresenceSystem { Dictionary _values = new(); void SetValue( string key, string value ) { if ( _values.TryGetValue( key, out var oldValue ) && oldValue == value ) return; Steam.SteamFriends().SetRichPresence( key, value ); _values[key] = value; } void Clear() { Steam.SteamFriends().ClearRichPresence(); _values.Clear(); } void IRichPresenceSystem.Poll() { if ( PartyRoom.Current is PartyRoom party ) { SetValue( "party_id", $"{party.Id}" ); } else { SetValue( "party_id", null ); } SetValue( "in_editor", Application.IsEditor ? "1" : "0" ); if ( IGameInstance.Current is null ) { SetValue( "steam_display", "#StatusMenu" ); SetValue( "gametitle", null ); SetValue( "steam_player_group", null ); SetValue( "steam_player_group_size", null ); SetValue( "lobby", null ); SetValue( "connect", null ); return; } if ( Networking.IsActive ) { var gameLobby = Networking.System.Sockets .OfType() .FirstOrDefault(); if ( gameLobby is not null ) { SetValue( "connect", $"+connect {gameLobby.LobbySteamId}" ); SetValue( "steam_player_group", $"{gameLobby.LobbySteamId}" ); SetValue( "steam_player_group_size", $"{gameLobby.LobbyMemberCount}" ); } else { var connection = Networking.System.Connection; var playerCount = Connection.All.Count( c => c.State == Connection.ChannelState.Connected ); if ( connection is SteamNetwork.IpConnection or SteamNetwork.IdConnection ) { SetValue( "connect", $"+connect {connection.Address}" ); SetValue( "steam_player_group", $"{connection.Address}" ); SetValue( "steam_player_group_size", $"{playerCount}" ); } } } else { SetValue( "connect", null ); SetValue( "steam_player_group", null ); SetValue( "steam_player_group_size", null ); } if ( IGameInstance.Current.Package is Package gamePackage ) { SetValue( "steam_display", "#StatusGame" ); SetValue( "gametitle", gamePackage.Title ); SetValue( "map", "" ); SetValue( "gamename", Application.GameIdent ); } else { SetValue( "steam_display", "#StatusGame" ); SetValue( "gametitle", "Secret Game" ); SetValue( "map", "" ); SetValue( "gamename", Application.GameIdent ); } } }