mirror of
https://github.com/Facepunch/Facepunch.Steamworks.git
synced 2024-12-26 06:35:49 +03:00
Support for getting a callback when a persona name is ready
This commit is contained in:
parent
5e0abacd54
commit
7c4aaddd1c
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using SteamNative;
|
using SteamNative;
|
||||||
@ -348,15 +349,96 @@ internal void Cycle()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public delegate void FetchInformationCallback(ulong steamid);
|
||||||
|
|
||||||
|
private const int PersonaChangeName = 0x0001;
|
||||||
|
private const int PersonaChangeAvatar = 0x0040;
|
||||||
|
|
||||||
|
private readonly Dictionary<ulong, Dictionary<int, FetchInformationCallback>> _fetchInformationRequests =
|
||||||
|
new Dictionary<ulong, Dictionary<int, FetchInformationCallback>>();
|
||||||
|
private static readonly List<KeyValuePair<int, FetchInformationCallback>> _tempCallbackList
|
||||||
|
= new List<KeyValuePair<int, FetchInformationCallback>>();
|
||||||
|
|
||||||
|
public void FetchUserInformation( ulong steamid, bool nameOnly, FetchInformationCallback callback )
|
||||||
|
{
|
||||||
|
if ( callback == null ) throw new ArgumentNullException( nameof(callback) );
|
||||||
|
|
||||||
|
if ( !client.native.friends.RequestUserInformation( steamid, nameOnly ) )
|
||||||
|
{
|
||||||
|
// Already got this user's info
|
||||||
|
callback( steamid );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var flags = PersonaChangeName | (nameOnly ? 0 : PersonaChangeAvatar);
|
||||||
|
|
||||||
|
if ( !_fetchInformationRequests.TryGetValue( steamid, out var outer) )
|
||||||
|
{
|
||||||
|
outer = new Dictionary<int, FetchInformationCallback>();
|
||||||
|
_fetchInformationRequests.Add( steamid, outer );
|
||||||
|
}
|
||||||
|
|
||||||
|
FetchInformationCallback inner;
|
||||||
|
if ( !outer.TryGetValue( flags, out inner ) )
|
||||||
|
{
|
||||||
|
outer.Add( flags, callback );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
outer[flags] = inner + callback;
|
||||||
|
}
|
||||||
|
|
||||||
private void OnPersonaStateChange( PersonaStateChange_t data )
|
private void OnPersonaStateChange( PersonaStateChange_t data )
|
||||||
{
|
{
|
||||||
// k_EPersonaChangeAvatar
|
// k_EPersonaChangeAvatar
|
||||||
if ( (data.ChangeFlags & 0x0040) == 0x0040 )
|
if ( (data.ChangeFlags & PersonaChangeAvatar) != 0 )
|
||||||
{
|
{
|
||||||
LoadAvatarForSteamId( data.SteamID );
|
LoadAvatarForSteamId( data.SteamID );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( _fetchInformationRequests.TryGetValue( data.SteamID, out var outer ) )
|
||||||
|
{
|
||||||
|
var list = _tempCallbackList;
|
||||||
|
|
||||||
|
list.Clear();
|
||||||
|
|
||||||
|
foreach ( var pair in outer )
|
||||||
|
{
|
||||||
|
list.Add(pair);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ( var pair in list )
|
||||||
|
{
|
||||||
|
var flags = pair.Key & data.ChangeFlags;
|
||||||
|
if ( flags == 0 )
|
||||||
|
{
|
||||||
|
// No new information for this request
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
outer.Remove( pair.Key );
|
||||||
|
|
||||||
|
if ( flags == pair.Key )
|
||||||
|
{
|
||||||
|
// All requested information has been provided
|
||||||
|
pair.Value( data.SteamID );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Still missing some information
|
||||||
|
var remainingFlags = pair.Key ^ flags;
|
||||||
|
|
||||||
|
if ( outer.TryGetValue( remainingFlags, out var existing ) )
|
||||||
|
{
|
||||||
|
outer[remainingFlags] = existing + pair.Value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outer.Add( remainingFlags, pair.Value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find and refresh this friend's status
|
// Find and refresh this friend's status
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user