using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using Steamworks.Data; namespace Steamworks { public class SteamServerStats : SteamServerClass { internal static ISteamGameServerStats? Internal => Interface as ISteamGameServerStats; internal override bool InitializeInterface( bool server ) { SetInterface( server, new ISteamGameServerStats( server ) ); if ( Interface is null || Interface.Self == IntPtr.Zero ) return false; return true; } /// /// Downloads stats for the user. /// If the user has no stats, this will return . /// These stats will only be auto-updated for clients playing on the server. /// /// The SteamId of the user to get stats for. /// A task describing the progress and result of the download. public static async Task RequestUserStatsAsync( SteamId steamid ) { if (Internal is null) { return Result.Fail; } var r = await Internal.RequestUserStats( steamid ); if ( !r.HasValue ) return Result.Fail; return r.Value.Result; } /// /// Set the named stat for this user. Setting stats should follow the rules /// you defined in Steamworks. /// /// The SteamId of the user to set stats for. /// The name of the stat. /// The value of the stat. public static bool SetInt( SteamId steamid, string name, int stat ) { return Internal != null && Internal.SetUserStat( steamid, name, stat ); } /// /// Set the named stat for this user. Setting stats should follow the rules /// you defined in Steamworks. /// /// The SteamId of the user to set stats for. /// The name of the stat. /// The value of the stat. public static bool SetFloat( SteamId steamid, string name, float stat ) { return Internal != null && Internal.SetUserStat( steamid, name, stat ); } /// /// Get the named stat for this user. If getting the stat failed, will return /// . You should have called for this SteamID - which downloads /// the stats from the backend. If you didn't call it this will always return . /// /// The SteamId of the user to get stats for. /// The name of the stat. /// The value to return if the stats cannot be received. public static int GetInt( SteamId steamid, string name, int defaultValue = 0 ) { int data = defaultValue; if ( Internal is null || !Internal.GetUserStat( steamid, name, ref data ) ) return defaultValue; return data; } /// /// Get the named stat for this user. If getting the stat failed, will return /// defaultValue. You should have called Refresh for this userid - which downloads /// the stats from the backend. If you didn't call it this will always return defaultValue. /// /// The SteamId of the user to get stats for. /// The name of the stat. /// The value to return if the stats cannot be received. public static float GetFloat( SteamId steamid, string name, float defaultValue = 0 ) { float data = defaultValue; if ( Internal is null || !Internal.GetUserStat( steamid, name, ref data ) ) return defaultValue; return data; } /// /// Unlocks the specified achievement for the specified user. Must have called on a SteamID first. /// Remember to use after use. /// /// The SteamId of the user to unlock the achievement for. /// The ID of the achievement. public static bool SetAchievement( SteamId steamid, string name ) { return Internal != null && Internal.SetUserAchievement( steamid, name ); } /// /// Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first. /// Remember to use after use. /// /// The SteamId of the user to clear the achievement for. /// The ID of the achievement. public static bool ClearAchievement( SteamId steamid, string name ) { return Internal != null && Internal.ClearUserAchievement( steamid, name ); } /// /// Return if available, exists and unlocked /// public static bool GetAchievement( SteamId steamid, string name ) { bool achieved = false; if ( Internal is null || !Internal.GetUserAchievement( steamid, name, ref achieved ) ) return false; return achieved; } /// /// Once you've set a stat change on a user you need to commit your changes. /// You can do that using this method. The callback will let you know if /// your action succeeded, but most of the time you can fire and forget. /// /// The SteamId of the user to store stats for. /// A task describing the progress and result of the commit. public static async Task StoreUserStats( SteamId steamid ) { if (Internal is null) { return Result.Fail; } var r = await Internal.StoreUserStats( steamid ); if ( !r.HasValue ) return Result.Fail; return r.Value.Result; } } }