mirror of
https://github.com/Facepunch/Facepunch.Steamworks.git
synced 2024-12-25 06:05:46 +03:00
Stats
This commit is contained in:
parent
934bd2154a
commit
99e85e9a98
@ -4,11 +4,13 @@
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
using Steamworks.Data;
|
||||||
|
|
||||||
namespace Steamworks
|
namespace Steamworks
|
||||||
{
|
{
|
||||||
[TestClass]
|
[TestClass]
|
||||||
[DeploymentItem( "steam_api64.dll" )]
|
[DeploymentItem( "steam_api64.dll" )]
|
||||||
|
[DeploymentItem( "steam_appid.txt" )]
|
||||||
public class UserStatsTest
|
public class UserStatsTest
|
||||||
{
|
{
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
@ -151,6 +153,42 @@ public async Task GetScoresAsync()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void GetStatInt()
|
||||||
|
{
|
||||||
|
var startups = new Stat( "GMA_X_STARTUPS_STAT" );
|
||||||
|
Console.WriteLine( $"{startups.Name} {startups.GetInt()} times" );
|
||||||
|
Console.WriteLine( $"{startups.Name} {startups.GetFloat()} times" );
|
||||||
|
|
||||||
|
Assert.AreNotEqual( 0, startups.GetInt() );
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public async Task GetStatGlobalInt()
|
||||||
|
{
|
||||||
|
var startups = new Stat( "GMA_X_STARTUPS_STAT" );
|
||||||
|
await startups.GetGlobalIntDays( 5 );
|
||||||
|
|
||||||
|
await Task.Delay( 3000 );
|
||||||
|
|
||||||
|
var totalStartups = startups.GetGlobalInt();
|
||||||
|
Assert.AreNotEqual( 0, totalStartups );
|
||||||
|
Console.WriteLine( $"Garry's Mod has been started {totalStartups} times" );
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public async Task GetStatGlobalHistoryInt()
|
||||||
|
{
|
||||||
|
var startups = new Stat( "GMA_X_STARTUPS_STAT" );
|
||||||
|
|
||||||
|
var history = await startups.GetGlobalIntDays( 60 );
|
||||||
|
|
||||||
|
for( int i=0; i< history.Length; i++ )
|
||||||
|
{
|
||||||
|
Console.WriteLine( $"{i} : {history[i]}" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Facepunch.Steamworks.Test/bin/x64/Debug/Newtonsoft.Json.dll
Normal file
BIN
Facepunch.Steamworks.Test/bin/x64/Debug/Newtonsoft.Json.dll
Normal file
Binary file not shown.
BIN
Facepunch.Steamworks.Test/bin/x64/Debug/steam_api64.dll
Normal file
BIN
Facepunch.Steamworks.Test/bin/x64/Debug/steam_api64.dll
Normal file
Binary file not shown.
@ -536,24 +536,24 @@ internal bool GetGlobalStat2( string pchStatName, ref double pData )
|
|||||||
|
|
||||||
#region FunctionMeta
|
#region FunctionMeta
|
||||||
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
|
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
|
||||||
private delegate int GetGlobalStatHistoryDelegate( IntPtr self, string pchStatName, ref long pData, uint cubData );
|
private delegate int GetGlobalStatHistoryDelegate( IntPtr self, string pchStatName, [In,Out] long[] pData, uint cubData );
|
||||||
private GetGlobalStatHistoryDelegate GetGlobalStatHistoryDelegatePointer;
|
private GetGlobalStatHistoryDelegate GetGlobalStatHistoryDelegatePointer;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
internal int GetGlobalStatHistory( string pchStatName, ref long pData, uint cubData )
|
internal int GetGlobalStatHistory( string pchStatName, [In,Out] long[] pData, uint cubData )
|
||||||
{
|
{
|
||||||
return GetGlobalStatHistoryDelegatePointer( Self, pchStatName, ref pData, cubData );
|
return GetGlobalStatHistoryDelegatePointer( Self, pchStatName, pData, cubData );
|
||||||
}
|
}
|
||||||
|
|
||||||
#region FunctionMeta
|
#region FunctionMeta
|
||||||
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
|
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
|
||||||
private delegate int GetGlobalStatHistory2Delegate( IntPtr self, string pchStatName, ref double pData, uint cubData );
|
private delegate int GetGlobalStatHistory2Delegate( IntPtr self, string pchStatName, [In,Out] double[] pData, uint cubData );
|
||||||
private GetGlobalStatHistory2Delegate GetGlobalStatHistory2DelegatePointer;
|
private GetGlobalStatHistory2Delegate GetGlobalStatHistory2DelegatePointer;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
internal int GetGlobalStatHistory2( string pchStatName, ref double pData, uint cubData )
|
internal int GetGlobalStatHistory2( string pchStatName, [In,Out] double[] pData, uint cubData )
|
||||||
{
|
{
|
||||||
return GetGlobalStatHistory2DelegatePointer( Self, pchStatName, ref pData, cubData );
|
return GetGlobalStatHistory2DelegatePointer( Self, pchStatName, pData, cubData );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
138
Facepunch.Steamworks/Structs/Stat.cs
Normal file
138
Facepunch.Steamworks/Structs/Stat.cs
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Steamworks.Data
|
||||||
|
{
|
||||||
|
public struct Stat
|
||||||
|
{
|
||||||
|
public string Name { get; internal set; }
|
||||||
|
public SteamId UserId { get; internal set; }
|
||||||
|
|
||||||
|
public Stat( string name )
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
UserId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Stat( string name, SteamId user )
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
UserId = user;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void LocalUserOnly( [CallerMemberName] string caller = null )
|
||||||
|
{
|
||||||
|
if ( UserId == 0 ) return;
|
||||||
|
throw new System.Exception( $"Stat.{caller} can only be called for the local user" );
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetGlobalFloat()
|
||||||
|
{
|
||||||
|
double val = 0.0;
|
||||||
|
|
||||||
|
if ( SteamUserStats.Internal.GetGlobalStat2( Name, ref val ) )
|
||||||
|
return val;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long GetGlobalInt()
|
||||||
|
{
|
||||||
|
long val = 0;
|
||||||
|
SteamUserStats.Internal.GetGlobalStat( Name, ref val );
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<long[]> GetGlobalIntDays( int days )
|
||||||
|
{
|
||||||
|
var result = await SteamUserStats.Internal.RequestGlobalStats( days );
|
||||||
|
if ( result?.Result != Result.OK ) return null;
|
||||||
|
|
||||||
|
var r = new long[days];
|
||||||
|
|
||||||
|
var rows = SteamUserStats.Internal.GetGlobalStatHistory( Name, r, (uint) r.Length );
|
||||||
|
|
||||||
|
if ( days != rows )
|
||||||
|
r = r.Take( rows ).ToArray();
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<double[]> GetGlobalFloatDays( int days )
|
||||||
|
{
|
||||||
|
var result = await SteamUserStats.Internal.RequestGlobalStats( days );
|
||||||
|
if ( result?.Result != Result.OK ) return null;
|
||||||
|
|
||||||
|
var r = new double[days];
|
||||||
|
|
||||||
|
var rows = SteamUserStats.Internal.GetGlobalStatHistory2( Name, r, (uint)r.Length );
|
||||||
|
|
||||||
|
if ( days != rows )
|
||||||
|
r = r.Take( rows ).ToArray();
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float GetFloat()
|
||||||
|
{
|
||||||
|
float val = 0.0f;
|
||||||
|
|
||||||
|
if ( UserId > 0 )
|
||||||
|
{
|
||||||
|
SteamUserStats.Internal.GetUserStat2( UserId, Name, ref val );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SteamUserStats.Internal.GetStat2( Name, ref val );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetInt()
|
||||||
|
{
|
||||||
|
int val = 0;
|
||||||
|
|
||||||
|
if ( UserId > 0 )
|
||||||
|
{
|
||||||
|
SteamUserStats.Internal.GetUserStat( UserId, Name, ref val );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SteamUserStats.Internal.GetStat( Name, ref val );
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Set( int val )
|
||||||
|
{
|
||||||
|
LocalUserOnly();
|
||||||
|
return SteamUserStats.Internal.SetStat( Name, val );
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Set( float val )
|
||||||
|
{
|
||||||
|
LocalUserOnly();
|
||||||
|
return SteamUserStats.Internal.SetStat2( Name, val );
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool UpdateAverageRate( float count, float sessionlength )
|
||||||
|
{
|
||||||
|
LocalUserOnly();
|
||||||
|
return SteamUserStats.Internal.UpdateAvgRateStat( Name, count, sessionlength );
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Store()
|
||||||
|
{
|
||||||
|
LocalUserOnly();
|
||||||
|
return SteamUserStats.Internal.StoreStats();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -71,8 +71,14 @@ void WriteFunctionPointerReader( CodeParser.Class clss )
|
|||||||
private void WriteFunction( CodeParser.Class clss, CodeParser.Class.Function func )
|
private void WriteFunction( CodeParser.Class clss, CodeParser.Class.Function func )
|
||||||
{
|
{
|
||||||
var returnType = BaseType.Parse( func.ReturnType );
|
var returnType = BaseType.Parse( func.ReturnType );
|
||||||
|
returnType.Func = func.Name;
|
||||||
|
|
||||||
var args = func.Arguments.Select( x => BaseType.Parse( x.Value, x.Key ) ).ToArray();
|
var args = func.Arguments.Select( x =>
|
||||||
|
{
|
||||||
|
var bt = BaseType.Parse( x.Value, x.Key );
|
||||||
|
bt.Func = func.Name;
|
||||||
|
return bt;
|
||||||
|
} ).ToArray();
|
||||||
var argstr = string.Join( ", ", args.Select( x => x.AsArgument() ) );
|
var argstr = string.Join( ", ", args.Select( x => x.AsArgument() ) );
|
||||||
var delegateargstr = string.Join( ", ", args.Select( x => x.AsArgument() ) );
|
var delegateargstr = string.Join( ", ", args.Select( x => x.AsArgument() ) );
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@ internal class BaseType
|
|||||||
public virtual string TypeName => $"{NativeType}";
|
public virtual string TypeName => $"{NativeType}";
|
||||||
public virtual string TypeNameFrom => TypeName;
|
public virtual string TypeNameFrom => TypeName;
|
||||||
|
|
||||||
|
public string Func;
|
||||||
|
|
||||||
public static BaseType Parse( string type, string varname = null )
|
public static BaseType Parse( string type, string varname = null )
|
||||||
{
|
{
|
||||||
type = Cleanup.ConvertType( type );
|
type = Cleanup.ConvertType( type );
|
||||||
@ -63,6 +65,7 @@ public virtual bool IsVector
|
|||||||
if ( VarName == "pScoreDetails" ) return true;
|
if ( VarName == "pScoreDetails" ) return true;
|
||||||
if ( VarName == "prgUsers" ) return true;
|
if ( VarName == "prgUsers" ) return true;
|
||||||
if ( VarName == "pDetails" ) return true;
|
if ( VarName == "pDetails" ) return true;
|
||||||
|
if ( VarName == "pData" && NativeType.EndsWith( "*" ) && Func.StartsWith( "GetGlobalStatHistory" ) ) return true;
|
||||||
if ( NativeType.EndsWith( "**" ) ) return true;
|
if ( NativeType.EndsWith( "**" ) ) return true;
|
||||||
|
|
||||||
if ( NativeType.EndsWith( "*" ) )
|
if ( NativeType.EndsWith( "*" ) )
|
||||||
|
Loading…
Reference in New Issue
Block a user