private void RequestUpdateForList(IEnumerable <uint> appIDs, IEnumerable <uint> packageIDs) { Log.WriteInfo("PICSChanges", "Requesting info for {0} apps and {1} packages", appIDs.Count(), packageIDs.Count()); const int size = 100; // Horribly unoptimized mess, but it's a full run so whatever while (appIDs.Any()) { JobManager.AddJob(() => Steam.Instance.Apps.PICSGetAccessTokens(appIDs.Take(size), Enumerable.Empty <uint>())); appIDs = appIDs.Skip(size).ToList(); } if (Settings.Current.FullRun == FullRunState.WithForcedDepots) { return; } var packages = packageIDs.Select(package => Utils.NewPICSRequest(package)); while (packages.Any()) { JobManager.AddJob(() => Steam.Instance.Apps.PICSGetProductInfo(Enumerable.Empty <SteamApps.PICSRequest>(), packages.Take(size))); packages = packages.Skip(size).ToList(); } }
private void OnPICSChangesFullRun(SteamApps.PICSChangesCallback callback) { PreviousChangeNumber = 2; Log.WriteInfo("PICSChanges", "Requesting info for {0} apps and {1} packages", callback.AppChanges.Count, callback.PackageChanges.Count); var apps = callback.AppChanges.Keys.ToList(); // Horribly unoptimized mess, but it's a full run so whatever while (apps.Any()) { JobManager.AddJob(() => Steam.Instance.Apps.PICSGetAccessTokens(apps.Take(500), Enumerable.Empty <uint>())); apps = apps.Skip(500).ToList(); } var packages = callback.PackageChanges.Keys.Select(package => Utils.NewPICSRequest(package)).ToList(); while (packages.Any()) { JobManager.AddJob(() => Steam.Instance.Apps.PICSGetProductInfo(Enumerable.Empty <SteamApps.PICSRequest>(), packages.Take(500))); packages = packages.Skip(500).ToList(); } }
private static void OnPICSTokens(SteamApps.PICSTokensCallback callback) { JobManager.TryRemoveJob(callback.JobID); Log.WriteDebug("PICSTokens", "Tokens granted: {0} - Tokens denied: {1}", callback.AppTokens.Count, callback.AppTokensDenied.Count); var apps = callback.AppTokensDenied .Select(Utils.NewPICSRequest) .Concat(callback.AppTokens.Select(app => Utils.NewPICSRequest(app.Key, app.Value))); JobManager.AddJob(() => Steam.Instance.Apps.PICSGetProductInfo(apps, Enumerable.Empty <SteamApps.PICSRequest>())); }
private static void Reload() { var oldTokens = SecretTokens; using (var db = Database.Get()) { SecretTokens = db.Query <PICSToken>("SELECT `AppID`, `Token` FROM `PICSTokens`").ToDictionary(x => x.AppID, x => x.Token); } if (oldTokens == null) { return; } var apps = SecretTokens .Where(x => !oldTokens.ContainsKey(x.Key)) .Select(app => Utils.NewPICSRequest(app.Key, app.Value)); JobManager.AddJob(() => Steam.Instance.Apps.PICSGetProductInfo(apps, Enumerable.Empty <SteamApps.PICSRequest>())); }
private static void OnPICSTokens(SteamApps.PICSTokensCallback callback) { Log.WriteDebug("Steam", "Tokens granted: {0} - Tokens denied: {1}", callback.AppTokens.Count, callback.AppTokensDenied.Count); var apps = callback.AppTokensDenied .Select(app => Utils.NewPICSRequest(app)) .Concat(callback.AppTokens.Select(app => Utils.NewPICSRequest(app.Key, app.Value))); Func <JobID> func = () => Steam.Instance.Apps.PICSGetProductInfo(apps, Enumerable.Empty <SteamApps.PICSRequest>()); JobAction job; // We have to preserve CommandRequest between jobs if (JobManager.TryRemoveJob(callback.JobID, out job) && job.IsCommand) { JobManager.AddJob(func, job.CommandRequest); return; } JobManager.AddJob(func); }
public override async Task OnCommand(CommandArguments command) { if (command.Message.Length == 0) { command.Reply("Usage:{0} app <appid or partial game name>", Colors.OLIVE); return; } string name; if (!uint.TryParse(command.Message, out var appID)) { name = command.Message; if (!Utils.ConvertUserInputToSQLSearch(ref name)) { command.Reply("Your request is invalid or too short."); return; } using (var db = Database.GetConnection()) { appID = db.ExecuteScalar <uint>("SELECT `AppID` FROM `Apps` WHERE `Apps`.`StoreName` LIKE @Name OR `Apps`.`Name` LIKE @Name OR `Apps`.`LastKnownName` LIKE @Name ORDER BY `LastUpdated` DESC LIMIT 1", new { Name = name }); } if (appID == 0) { command.Reply("Nothing was found matching your request."); return; } } var tokenCallback = await Steam.Instance.Apps.PICSGetAccessTokens(appID, null); SteamApps.PICSRequest request; if (tokenCallback.AppTokens.ContainsKey(appID)) { request = Utils.NewPICSRequest(appID, tokenCallback.AppTokens[appID]); } else { request = Utils.NewPICSRequest(appID); } var job = await Steam.Instance.Apps.PICSGetProductInfo(new List <SteamApps.PICSRequest> { request }, Enumerable.Empty <SteamApps.PICSRequest>()); var callback = job.Results.FirstOrDefault(x => x.Apps.ContainsKey(appID)); if (callback == null) { command.Reply("Unknown AppID: {0}{1}{2}", Colors.BLUE, appID, LicenseList.OwnedApps.ContainsKey(appID) ? SteamDB.StringCheckmark : string.Empty); return; } var info = callback.Apps[appID]; if (info.KeyValues["common"]["name"].Value != null) { name = Utils.RemoveControlCharacters(info.KeyValues["common"]["name"].AsString()); } else { name = Steam.GetAppName(info.ID); } info.KeyValues.SaveToFile(Path.Combine(Application.Path, "app", string.Format("{0}.vdf", info.ID)), false); command.Reply("{0}{1}{2} -{3} {4}{5} - Dump:{6} {7}{8}{9}{10}", Colors.BLUE, name, Colors.NORMAL, Colors.DARKBLUE, SteamDB.GetAppURL(info.ID), Colors.NORMAL, Colors.DARKBLUE, SteamDB.GetRawAppURL(info.ID), Colors.NORMAL, info.MissingToken ? SteamDB.StringNeedToken : string.Empty, LicenseList.OwnedApps.ContainsKey(info.ID) ? SteamDB.StringCheckmark : string.Empty ); if (command.IsUserAdmin && !LicenseList.OwnedApps.ContainsKey(info.ID)) { JobManager.AddJob(() => Steam.Instance.Apps.RequestFreeLicense(info.ID)); } }
private void OnLoggedOn(SteamUser.LoggedOnCallback callback) { GameCoordinator.UpdateStatus(0, callback.Result.ToString()); if (callback.Result == EResult.AccountLogonDenied) { Console.Write("STEAM GUARD! Please enter the auth code sent to the email at {0}: ", callback.EmailDomain); AuthCode = Console.ReadLine(); if (AuthCode != null) { AuthCode = AuthCode.Trim(); } return; } if (callback.Result != EResult.OK) { Log.WriteInfo("Steam", "Failed to login: {0}", callback.Result); IRC.Instance.SendEmoteAnnounce("failed to log in: {0}", callback.Result); return; } var cellId = callback.CellID; if (LocalConfig.CellID != cellId) { Log.WriteDebug("Local Config", "CellID differs, {0} != {1}, forcing server refetch", LocalConfig.CellID, cellId); LocalConfig.CellID = cellId; // TODO: is this really needed? LocalConfig.LoadServers(); LocalConfig.Save(); } LastSuccessfulLogin = DateTime.Now; Log.WriteInfo("Steam", "Logged in, current Valve time is {0}", callback.ServerTime.ToString("R")); IRC.Instance.SendEmoteAnnounce("logged in. Valve time: {0}", callback.ServerTime.ToString("R")); if (Settings.IsFullRun) { if (Settings.Current.FullRun == FullRunState.ImportantOnly) { JobManager.AddJob(() => Steam.Instance.Apps.PICSGetAccessTokens(Application.ImportantApps.Keys, Enumerable.Empty <uint>())); JobManager.AddJob(() => Steam.Instance.Apps.PICSGetProductInfo(Enumerable.Empty <SteamApps.PICSRequest>(), Application.ImportantSubs.Keys.Select(package => Utils.NewPICSRequest(package)))); } else if (Steam.Instance.PICSChanges.PreviousChangeNumber == 1) { Steam.Instance.PICSChanges.PerformSync(); //JobManager.AddJob(() => Steam.Instance.Apps.PICSGetChangesSince(1, true, true)); } } else { JobManager.RestartJobsIfAny(); Application.ChangelistTimer.Start(); } }
private void OnPICSChanges(SteamApps.PICSChangesCallback callback) { if (PreviousChangeNumber == callback.CurrentChangeNumber) { return; } var packageChangesCount = callback.PackageChanges.Count; var appChangesCount = callback.AppChanges.Count; Log.WriteInfo("PICSChanges", "Changelist {0} -> {1} ({2} apps, {3} packages)", PreviousChangeNumber, callback.CurrentChangeNumber, appChangesCount, packageChangesCount); PreviousChangeNumber = callback.CurrentChangeNumber; HandleChangeNumbers(callback); if (appChangesCount == 0 && packageChangesCount == 0) { IRC.Instance.SendAnnounce("{0}»{1} Changelist {2}{3}{4} (empty)", Colors.RED, Colors.NORMAL, Colors.BLUE, PreviousChangeNumber, Colors.DARKGRAY); return; } if (appChangesCount > 0) { JobManager.AddJob(() => Steam.Instance.Apps.PICSGetAccessTokens(callback.AppChanges.Keys, Enumerable.Empty <uint>())); TaskManager.Run(() => HandleApps(callback)); } if (packageChangesCount > 0) { JobManager.AddJob(() => Steam.Instance.Apps.PICSGetProductInfo(Enumerable.Empty <SteamApps.PICSRequest>(), callback.PackageChanges.Keys.Select(package => Utils.NewPICSRequest(package)))); TaskManager.Run(() => HandlePackages(callback)); TaskManager.Run(() => HandlePackagesChangelists(callback)); } TaskManager.Run(() => SendChangelistsToIRC(callback)); PrintImportants(callback); }
public override async Task OnCommand(CommandArguments command) { if (string.IsNullOrWhiteSpace(command.Message)) { command.Reply("Usage:{0} app <appid or partial game name>", Colors.OLIVE); return; } string name; if (!uint.TryParse(command.Message, out var appID)) { appID = await TrySearchAppId(command); if (appID == 0) { return; } } var tokenTask = Steam.Instance.Apps.PICSGetAccessTokens(appID, null); tokenTask.Timeout = TimeSpan.FromSeconds(10); var tokenCallback = await tokenTask; SteamApps.PICSRequest request; if (tokenCallback.AppTokens.ContainsKey(appID)) { request = Utils.NewPICSRequest(appID, tokenCallback.AppTokens[appID]); } else { request = Utils.NewPICSRequest(appID); } var infoTask = Steam.Instance.Apps.PICSGetProductInfo(new List <SteamApps.PICSRequest> { request }, Enumerable.Empty <SteamApps.PICSRequest>()); infoTask.Timeout = TimeSpan.FromSeconds(10); var job = await infoTask; var callback = job.Results.FirstOrDefault(x => x.Apps.ContainsKey(appID)); if (callback == null) { command.Reply("Unknown AppID: {0}{1}{2}", Colors.BLUE, appID, LicenseList.OwnedApps.ContainsKey(appID) ? SteamDB.StringCheckmark : string.Empty); return; } var info = callback.Apps[appID]; if (info.KeyValues["common"]["name"].Value != null) { name = Utils.RemoveControlCharacters(info.KeyValues["common"]["name"].AsString()); } else { name = Steam.GetAppName(info.ID); } info.KeyValues.SaveToFile(Path.Combine(Application.Path, "app", string.Format("{0}.vdf", info.ID)), false); command.Reply("{0}{1}{2} -{3} {4}{5} - Dump:{6} {7}{8}{9}{10}", Colors.BLUE, name, Colors.NORMAL, Colors.DARKBLUE, SteamDB.GetAppURL(info.ID), Colors.NORMAL, Colors.DARKBLUE, SteamDB.GetRawAppURL(info.ID), Colors.NORMAL, info.MissingToken ? SteamDB.StringNeedToken : string.Empty, LicenseList.OwnedApps.ContainsKey(info.ID) ? SteamDB.StringCheckmark : string.Empty ); if (command.IsUserAdmin && !LicenseList.OwnedApps.ContainsKey(info.ID)) { JobManager.AddJob(() => Steam.Instance.Apps.RequestFreeLicense(info.ID)); } }
private void OnLoggedOn(SteamUser.LoggedOnCallback callback) { GameCoordinator.UpdateStatus(0, callback.Result.ToString()); if (callback.Result == EResult.AccountLogonDenied) { Console.Write("STEAM GUARD! Please enter the auth code sent to the email at {0}: ", callback.EmailDomain); AuthCode = Console.ReadLine(); if (AuthCode != null) { AuthCode = AuthCode.Trim(); } return; } if (callback.Result != EResult.OK) { Log.WriteInfo("Steam", "Failed to login: {0}", callback.Result); IRC.Instance.SendEmoteAnnounce("failed to log in: {0}", callback.Result); return; } LastSuccessfulLogin = DateTime.Now; Log.WriteInfo("Steam", "Logged in, current Valve time is {0}", callback.ServerTime.ToString("R")); IRC.Instance.SendMain("Logged in to Steam. Valve time: {0}{1}", Colors.DARKGRAY, callback.ServerTime.ToString("R")); IRC.Instance.SendEmoteAnnounce("logged in."); if (Settings.IsFullRun) { if (Settings.Current.FullRun == 3) { Steam.Instance.Apps.PICSGetAccessTokens(Application.ImportantApps.Keys, Enumerable.Empty <uint>()); Steam.Instance.Apps.PICSGetProductInfo(Enumerable.Empty <SteamApps.PICSRequest>(), Application.ImportantSubs.Keys.Select(package => Utils.NewPICSRequest(package))); } else if (Steam.Instance.PICSChanges.PreviousChangeNumber == 1) { Steam.Instance.Apps.PICSGetChangesSince(1, true, true); } } else { JobManager.RestartJobsIfAny(); Application.ChangelistTimer.Start(); } }