using LANCommander.SDK.Models; using Microsoft.Extensions.Logging; using Steamworks; using System; using System.Collections.Generic; using System.IO; namespace LANCommander.SDK.Services { public class LobbyClient(ILogger logger) { /// /// Get all Steam lobbies for a specified game. Game install directory must contain a file called steam_appid.txt. /// Remember to call ReleaseSteam() when the game is done playing or lobby join is canceled! /// /// Directory that contains the game install and steam_appid.txt /// Game GUID /// Lobby information public IEnumerable GetSteamLobbies(string installDirectory, Guid gameId) { uint appId = 0; var appIdDefinitions = Directory.EnumerateFiles(installDirectory, "steam_appid.txt", SearchOption.AllDirectories); foreach (var appIdDefinition in appIdDefinitions) { if (uint.TryParse(File.ReadAllText(appIdDefinition), out appId)) break; } var lobbies = new List(); try { logger?.LogTrace("Initializing Steamworks with app ID {AppId}", appId); SteamClient.Init(appId, true); foreach (var friend in SteamFriends.GetFriends()) { if (friend is { IsPlayingThisGame: true, GameInfo.Lobby: not null }) { var lobby = new Lobby { GameId = gameId, ExternalGameId = appId.ToString(), Id = friend.GameInfo.Value.Lobby.Value.Id.Value.ToString(), ExternalUserId = friend.Id.Value.ToString(), ExternalUsername = friend.Name, }; lobbies.Add(lobby); logger?.LogTrace("Found lobby | {FriendName} ({FriendId}): {LobbyId}", lobby.ExternalUsername, lobby.ExternalUserId, lobby.Id); } } } catch (Exception ex) { logger?.LogError(ex, "Couldn't initialize Steamworks"); } return lobbies; } public void ReleaseSteam() { try { SteamClient.Shutdown(); } catch (Exception ex) { } } } }