Friend lists, #tag lookup, Steam friend import, and lobby/room invites
Every player gets a persistent public player_tag (e.g. "#XK4B9P2R") on register/login — share it to be found. All methods take the player token, never the private API token.
public static Task<FriendListResponse> GetFriendsAsync(Client client, string playerToken, CancellationToken ct = default)
Lists friends plus incoming/outgoing requests. Entries carry player_id, player_name, player_tag, is_online, steam_id and relationship.
public static Task<FriendLookupResponse> LookupPlayerByTagAsync(Client client, string playerToken, string playerTag, CancellationToken ct = default)
Finds a player by their public tag ("#XXXXXXXX" — 8 chars, no vowels/0/1).
public static Task<FriendStatusResponse> SendFriendRequestAsync(Client client, string playerToken, int playerId, CancellationToken ct = default)
public static Task<FriendStatusResponse> SendFriendRequestByTagAsync(Client client, string playerToken, string playerTag, CancellationToken ct = default)
Sends a friend request — auto-accepts when the target already requested you.
public static Task<FriendStatusResponse> AcceptFriendRequestAsync(Client client, string playerToken, int playerId, CancellationToken ct = default)
public static Task<FriendStatusResponse> DeclineFriendRequestAsync(Client client, string playerToken, int playerId, CancellationToken ct = default)
public static Task<FriendStatusResponse> RemoveFriendAsync(Client client, string playerToken, int playerId, CancellationToken ct = default)
Accept or decline an incoming request; RemoveFriend also cancels an outgoing one.
public static Task<SteamFriendsLookupResponse> LookupSteamFriendsAsync(Client client, string playerToken, List<string> steamIds, CancellationToken ct = default)
Maps SteamID64s (from SteamFriends.GetFriends()) to registered players — one-click "add Steam friend" list.
public static Task<FriendInviteResponse> InviteFriendAsync(Client client, string playerToken, int playerId, CancellationToken ct = default)
public static Task<FriendInvitesResponse> GetInvitesAsync(Client client, string playerToken, CancellationToken ct = default)
Invites a friend into your current lobby or room (kind: "matchmaking"/"room"), and lists pending invites received.
public static Task<FriendInviteAcceptResponse> AcceptInviteAsync<T>(Client client, string playerToken, string inviteId, T playerData = null, CancellationToken ct = default)
public static Task<FriendInviteAcceptResponse> DeclineInviteAsync(Client client, string playerToken, string inviteId, CancellationToken ct = default)
Accepting joins the lobby/room directly — the invite token bypasses password and host approval. Room invites return room_id.
// Host publishes the lobby's join_token connect string as rich presence
SteamFriends.SetJoinConnectString($"mdl_{matchmakingId}_{joinToken}");
SteamFriends.OpenInviteDialog(connectString); // Steam overlay picker
// Invitee — game running: GameRichPresenceJoinRequested callback
SteamTicket.RichPresenceJoinRequested += (inviter, connect) => JoinByConnectString(connect);
// Invitee — cold launch: "+connect <string>" launch parameter
var connect = SteamFriends.GetLaunchConnectString();
The Steam overlay invite dialog needs no Steam lobby. The connect string carries the backend join_token, so the invitee bypasses the lobby password. The overlay only attaches to builds launched under Steam — not the editor.