private void OnPICSChanges(SteamApps.PICSChangesCallback callback) { if (PreviousChangeNumber == callback.CurrentChangeNumber) { return; } Bootstrap.Log("Changelist {0} -> {1} ({2} apps, {3} packages)", PreviousChangeNumber, callback.CurrentChangeNumber, callback.AppChanges.Count, callback.PackageChanges.Count); PreviousChangeNumber = callback.CurrentChangeNumber; // Group apps and package changes by changelist, this will seperate into individual changelists var appGrouping = callback.AppChanges.Values.GroupBy(a => a.ChangeNumber); var packageGrouping = callback.PackageChanges.Values.GroupBy(p => p.ChangeNumber); // Join apps and packages back together based on changelist number var changeLists = Utils.FullOuterJoin(appGrouping, packageGrouping, a => a.Key, p => p.Key, (a, p, key) => new SteamChangelist { ChangeNumber = key, Apps = a.Select(x => x.ID), Packages = p.Select(x => x.ID), }, new EmptyGrouping <uint, SteamApps.PICSChangesCallback.PICSChangeData>(), new EmptyGrouping <uint, SteamApps.PICSChangesCallback.PICSChangeData>()) .OrderBy(c => c.ChangeNumber); foreach (var changeList in changeLists) { Bootstrap.Broadcast(new ChangelistEvent(changeList)); } Bootstrap.SendAppsToSubscribers(callback.AppChanges); }
private async Task ChangesTick() { var currentHash = TickerHash; var random = new Random(); if (currentHash == 0) { Bootstrap.Log("Waiting a minute before requesting changes, to give a chance for users to reconnect"); await Task.Delay(60000 + random.Next(10000)); } else { Bootstrap.Log($"PICS ticker started #{currentHash}"); } while (currentHash == TickerHash) { try { await Apps.PICSGetChangesSince(PreviousChangeNumber, true, true); } catch (OperationCanceledException) { Bootstrap.Log("PICSGetChangesSince task was cancelled"); } catch (AsyncJobFailedException) { Bootstrap.Log("PICSGetChangesSince async job failed"); } await Task.Delay(random.Next(3210)); } Bootstrap.Log($"PICS ticker stopped #{currentHash}"); }
private async Task ChangesTick() { var currentHash = TickerHash; var random = new Random(); if (currentHash == 0) { Bootstrap.Log("Waiting a minute before requesting changes, to give a chance for users to reconnect"); await Task.Delay(60000 + random.Next(10000)); } else { Bootstrap.Log($"PICS ticker started #{currentHash}"); } while (currentHash == TickerHash) { try { await Apps.PICSGetChangesSince(PreviousChangeNumber, true, true); } catch (Exception e) { Bootstrap.Log($"PICSGetChangesSince: {e.GetType().Name}: {e.Message}"); } await Task.Delay(random.Next(3210)); } Bootstrap.Log($"PICS ticker stopped #{currentHash}"); }
private void OnLoggedOff(SteamUser.LoggedOffCallback callback) { if (IsLoggedOn) { Bootstrap.Broadcast(new LogOffEvent()); IsLoggedOn = false; } Bootstrap.Log("Logged off from Steam"); }
private void OnConnected(SteamClient.ConnectedCallback callback) { if (callback.Result != EResult.OK) { Bootstrap.Log("Could not connect to Steam: {0}", callback.Result); IsRunning = false; return; } Bootstrap.Log("Connected to Steam, logging in..."); User.LogOnAnonymous(); }
private void OnLoggedOn(SteamUser.LoggedOnCallback callback) { if (callback.Result != EResult.OK) { Bootstrap.Log("Failed to login: {0}", callback.Result); Thread.Sleep(TimeSpan.FromSeconds(2)); return; } IsLoggedOn = true; Bootstrap.Broadcast(new LogOnEvent()); Bootstrap.Log("Logged in, current valve time is {0} UTC", callback.ServerTime); }
private void OnDisconnected(SteamClient.DisconnectedCallback callback) { if (!IsRunning) { Bootstrap.Log("Shutting down..."); return; } if (IsLoggedOn) { Bootstrap.Broadcast(new LogOffEvent()); IsLoggedOn = false; } Bootstrap.Log("Disconnected from Steam. Retrying..."); Thread.Sleep(TimeSpan.FromSeconds(15)); Client.Connect(); }
public ChangelistEvent(SteamChangelist changelist) : base("Changelist") { ChangeNumber = changelist.ChangeNumber; if (changelist.Apps.Any()) { Apps = changelist.Apps.ToDictionary(x => x, x => "Unknown App " + x); if (Bootstrap.Config.DatabaseConnectionString != null) { try { using var db = new MySqlConnection(Bootstrap.Config.DatabaseConnectionString); foreach (var app in db.Query <AppData>("SELECT `AppID`, `Name`, `LastKnownName` FROM `Apps` WHERE `AppID` IN @Apps", new { changelist.Apps })) { if (!string.IsNullOrEmpty(app.LastKnownName) && app.Name != app.LastKnownName) { Apps[app.AppID] = $"{app.Name} ({app.LastKnownName})"; } else { Apps[app.AppID] = app.Name; } } } catch (MySqlException e) { Bootstrap.Log("{0}", e.Message); } } } else { Apps = new Dictionary <uint, string>(); } if (changelist.Packages.Any()) { Packages = changelist.Packages.ToDictionary(x => x, x => "Unknown Package " + x); if (Bootstrap.Config.DatabaseConnectionString != null) { try { using var db = new MySqlConnection(Bootstrap.Config.DatabaseConnectionString); foreach (var sub in db.Query <PackageData>("SELECT `SubID`, `LastKnownName` FROM `Subs` WHERE `SubID` IN @Packages", new { changelist.Packages })) { Packages[sub.SubID] = sub.LastKnownName; } } catch (MySqlException e) { Bootstrap.Log("{0}", e.Message); } } } else { Packages = new Dictionary <uint, string>(); } }
private void OnConnected(SteamClient.ConnectedCallback callback) { Bootstrap.Log("Connected to Steam, logging in..."); User.LogOnAnonymous(); }
public void WriteLine(string category, string msg) { Bootstrap.Log("[SteamKit] {0} {1}", category, msg); }
public ChangelistEvent(SteamChangelist changelist) : base("Changelist") { ChangeNumber = changelist.ChangeNumber; if (changelist.Apps.Any()) { Apps = changelist.Apps.ToDictionary(x => x, x => "Unknown App " + x); if (Bootstrap.DatabaseConnectionString != null) { try { var apps = string.Join(",", changelist.Apps); using (var reader = MySqlHelper.ExecuteReader(Bootstrap.DatabaseConnectionString, "SELECT `AppID`, `Name`, `LastKnownName` FROM `Apps` WHERE `AppID` IN(" + apps + ")")) { while (reader.Read()) { var name = reader.GetString(1); var lastKnownName = reader.GetString(2); if (!string.IsNullOrEmpty(lastKnownName) && name != lastKnownName) { name = string.Format("{0} ({1})", name, lastKnownName); } Apps[reader.GetUInt32(0)] = name; } } } catch (MySqlException e) { Bootstrap.Log("{0}", e.Message); } } } else { Apps = new Dictionary <uint, string>(); } if (changelist.Packages.Any()) { Packages = changelist.Packages.ToDictionary(x => x, x => "Unknown Package " + x); if (Bootstrap.DatabaseConnectionString != null) { try { var subs = string.Join(",", changelist.Packages); using (var reader = MySqlHelper.ExecuteReader(Bootstrap.DatabaseConnectionString, "SELECT `SubID`, `LastKnownName` FROM `Subs` WHERE `SubID` IN(" + subs + ")")) { while (reader.Read()) { Packages[reader.GetUInt32(0)] = reader.GetString(1); } } } catch (MySqlException e) { Bootstrap.Log("{0}", e.Message); } } } else { Packages = new Dictionary <uint, string>(); } }