mirror of
https://github.com/JustArchiNET/ArchiSteamFarm.git
synced 2025-12-17 06:50:29 +00:00
Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9fa23ecddf | ||
|
|
ab3bfe2460 | ||
|
|
465ca2d4f9 | ||
|
|
21e892c042 | ||
|
|
98be9e1efd | ||
|
|
3081bfe814 | ||
|
|
61e4461bc4 | ||
|
|
5c2bcd551c | ||
|
|
15f9eb4e80 | ||
|
|
5038527c90 | ||
|
|
e8370987ea | ||
|
|
3f7660526d | ||
|
|
f484b50ab3 | ||
|
|
55000c7653 | ||
|
|
4cd2444a1a | ||
|
|
4f23d2e874 | ||
|
|
76bdd898e1 | ||
|
|
a45cf02d52 | ||
|
|
828c76e201 | ||
|
|
32e68f2be3 | ||
|
|
de3f3cd93b | ||
|
|
31fb6fec08 | ||
|
|
cf2473a3d5 | ||
|
|
0d44379948 | ||
|
|
43264e77b2 | ||
|
|
c09af9b937 | ||
|
|
c84565f091 | ||
|
|
d07f1c6852 | ||
|
|
754b52647b |
@@ -30,6 +30,14 @@ using System.IO;
|
||||
|
||||
namespace ArchiSteamFarm {
|
||||
internal sealed class ArchiHandler : ClientMsgHandler {
|
||||
internal sealed class OfflineMessageCallback : CallbackMsg {
|
||||
internal uint OfflineMessages { get; private set; }
|
||||
internal List<uint> Users { get; private set; }
|
||||
internal OfflineMessageCallback(CMsgClientOfflineMessageNotification body) {
|
||||
OfflineMessages = body.offline_messages;
|
||||
Users = body.friends_with_offline_messages;
|
||||
}
|
||||
}
|
||||
|
||||
internal sealed class PurchaseResponseCallback : CallbackMsg {
|
||||
internal enum EPurchaseResult {
|
||||
@@ -132,6 +140,9 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
switch (packetMsg.MsgType) {
|
||||
case EMsg.ClientFSOfflineMessageNotification:
|
||||
HandleFSOfflineMessageNotification(packetMsg);
|
||||
break;
|
||||
case EMsg.ClientPurchaseResponse:
|
||||
HandlePurchaseResponse(packetMsg);
|
||||
break;
|
||||
@@ -141,71 +152,33 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleFSOfflineMessageNotification(IPacketMsg packetMsg) {
|
||||
if (packetMsg == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var response = new ClientMsgProtobuf<CMsgClientOfflineMessageNotification>(packetMsg);
|
||||
Client.PostCallback(new OfflineMessageCallback(response.Body));
|
||||
}
|
||||
|
||||
private void HandlePurchaseResponse(IPacketMsg packetMsg) {
|
||||
if (packetMsg == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var response = new ClientMsgProtobuf<CMsgClientPurchaseResponse>(packetMsg);
|
||||
Client.PostCallback(new PurchaseResponseCallback(response.Body));
|
||||
}
|
||||
|
||||
private void HandleUserNotifications(IPacketMsg packetMsg) {
|
||||
if (packetMsg == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var response = new ClientMsgProtobuf<CMsgClientUserNotifications>(packetMsg);
|
||||
foreach (var notification in response.Body.notifications) {
|
||||
Client.PostCallback(new NotificationCallback(notification));
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Please remove me entirely once https://github.com/SteamRE/SteamKit/pull/217 gets merged
|
||||
internal void HackedLogOn(uint id, SteamUser.LogOnDetails details) {
|
||||
if (details == null) {
|
||||
throw new ArgumentNullException("details");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(details.Username) || (string.IsNullOrEmpty(details.Password) && string.IsNullOrEmpty(details.LoginKey))) {
|
||||
throw new ArgumentException("LogOn requires a username and password to be set in 'details'.");
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(details.LoginKey) && !details.ShouldRememberPassword) {
|
||||
// Prevent consumers from screwing this up.
|
||||
// If should_remember_password is false, the login_key is ignored server-side.
|
||||
// The inverse is not applicable (you can log in with should_remember_password and no login_key).
|
||||
throw new ArgumentException("ShouldRememberPassword is required to be set to true in order to use LoginKey.");
|
||||
}
|
||||
|
||||
if (!Client.IsConnected) {
|
||||
return;
|
||||
}
|
||||
|
||||
var logon = new ClientMsgProtobuf<CMsgClientLogon>(EMsg.ClientLogon);
|
||||
|
||||
SteamID steamId = new SteamID(details.AccountID, details.AccountInstance, Client.ConnectedUniverse, EAccountType.Individual);
|
||||
|
||||
logon.ProtoHeader.client_sessionid = 0;
|
||||
logon.ProtoHeader.steamid = steamId.ConvertToUInt64();
|
||||
|
||||
logon.Body.obfustucated_private_ip = id;
|
||||
|
||||
logon.Body.account_name = details.Username;
|
||||
logon.Body.password = details.Password;
|
||||
logon.Body.should_remember_password = details.ShouldRememberPassword;
|
||||
|
||||
logon.Body.protocol_version = MsgClientLogon.CurrentProtocol;
|
||||
logon.Body.client_os_type = (uint) details.ClientOSType;
|
||||
logon.Body.client_language = details.ClientLanguage;
|
||||
logon.Body.cell_id = details.CellID;
|
||||
|
||||
logon.Body.steam2_ticket_request = details.RequestSteam2Ticket;
|
||||
|
||||
logon.Body.client_package_version = 1771;
|
||||
|
||||
// steam guard
|
||||
logon.Body.auth_code = details.AuthCode;
|
||||
logon.Body.two_factor_code = details.TwoFactorCode;
|
||||
|
||||
logon.Body.login_key = details.LoginKey;
|
||||
|
||||
logon.Body.sha_sentryfile = details.SentryFileHash;
|
||||
logon.Body.eresult_sentryfile = (int) (details.SentryFileHash != null ? EResult.OK : EResult.FileNotFound);
|
||||
|
||||
Client.Send(logon);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -73,8 +73,8 @@
|
||||
<HintPath>..\packages\protobuf-net.2.0.0.668\lib\net40\protobuf-net.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="SteamKit2, Version=1.6.5.29095, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SteamKit2.1.6.5\lib\net40\SteamKit2.dll</HintPath>
|
||||
<Reference Include="SteamKit2, Version=1.7.0.33680, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SteamKit2.1.7.0\lib\net45\SteamKit2.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
@@ -143,8 +143,7 @@
|
||||
mkdir "$(TargetDir)out" "$(TargetDir)out\config"
|
||||
copy "$(TargetDir)config\example.xml" "$(TargetDir)out\config"
|
||||
copy "$(TargetDir)config\minimal.xml" "$(TargetDir)out\config"
|
||||
"$(SolutionDir)tools\ILMerge.exe" /out:"$(TargetDir)out\ASF.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards
|
||||
del "$(TargetDir)out\ASF.pdb"
|
||||
"$(SolutionDir)tools\ILMerge.exe" /ndebug /internalize /out:"$(TargetDir)out\ASF.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2" /wildcards
|
||||
)</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
|
||||
@@ -54,6 +54,41 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
}
|
||||
|
||||
private async Task UnlockParentalAccount(string parentalPin) {
|
||||
if (string.IsNullOrEmpty(parentalPin) || parentalPin.Equals("0")) {
|
||||
return;
|
||||
}
|
||||
|
||||
Logging.LogGenericInfo(Bot.BotName, "Unlocking parental account...");
|
||||
Dictionary<string, string> postData = new Dictionary<string, string>() {
|
||||
{ "pin", parentalPin }
|
||||
};
|
||||
|
||||
HttpResponseMessage response = await WebBrowser.UrlPost("https://steamcommunity.com/parental/ajaxunlock", postData, SteamCookieDictionary, "https://steamcommunity.com/").ConfigureAwait(false);
|
||||
if (response == null) {
|
||||
Logging.LogGenericInfo(Bot.BotName, "Failed!");
|
||||
return;
|
||||
}
|
||||
|
||||
IEnumerable<string> setCookieValues;
|
||||
if (!response.Headers.TryGetValues("Set-Cookie", out setCookieValues)) {
|
||||
Logging.LogGenericInfo(Bot.BotName, "Failed!");
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (string setCookieValue in setCookieValues) {
|
||||
if (setCookieValue.Contains("steamparental=")) {
|
||||
string setCookie = setCookieValue.Substring(setCookieValue.IndexOf("steamparental=") + 14);
|
||||
setCookie = setCookie.Substring(0, setCookie.IndexOf(';'));
|
||||
SteamCookieDictionary.Add("steamparental", setCookie);
|
||||
Logging.LogGenericInfo(Bot.BotName, "Success!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Logging.LogGenericInfo(Bot.BotName, "Failed!");
|
||||
}
|
||||
|
||||
internal ArchiWebHandler(Bot bot, string apiKey) {
|
||||
Bot = bot;
|
||||
|
||||
@@ -125,29 +160,7 @@ namespace ArchiSteamFarm {
|
||||
SteamCookieDictionary.Add("steamLoginSecure", steamLoginSecure);
|
||||
SteamCookieDictionary.Add("birthtime", "-473356799"); // ( ͡° ͜ʖ ͡°)
|
||||
|
||||
if (!string.IsNullOrEmpty(parentalPin) && !parentalPin.Equals("0")) {
|
||||
Logging.LogGenericInfo(Bot.BotName, "Unlocking parental account...");
|
||||
Dictionary<string, string> postData = new Dictionary<string, string>() {
|
||||
{"pin", parentalPin}
|
||||
};
|
||||
|
||||
HttpResponseMessage response = await WebBrowser.UrlPost("https://steamcommunity.com/parental/ajaxunlock", postData, SteamCookieDictionary, "https://steamcommunity.com/").ConfigureAwait(false);
|
||||
if (response != null && response.IsSuccessStatusCode) {
|
||||
Logging.LogGenericInfo(Bot.BotName, "Success!");
|
||||
|
||||
var setCookieValues = response.Headers.GetValues("Set-Cookie");
|
||||
foreach (string setCookieValue in setCookieValues) {
|
||||
if (setCookieValue.Contains("steamparental=")) {
|
||||
string setCookie = setCookieValue.Substring(setCookieValue.IndexOf("steamparental=") + 14);
|
||||
setCookie = setCookie.Substring(0, setCookie.IndexOf(';'));
|
||||
SteamCookieDictionary.Add("steamparental", setCookie);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Logging.LogGenericInfo(Bot.BotName, "Failed!");
|
||||
}
|
||||
}
|
||||
await UnlockParentalAccount(parentalPin).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
internal async Task<bool?> IsLoggedIn() {
|
||||
@@ -168,7 +181,7 @@ namespace ArchiSteamFarm {
|
||||
bool? isLoggedIn = await IsLoggedIn().ConfigureAwait(false);
|
||||
if (isLoggedIn.HasValue && !isLoggedIn.Value) {
|
||||
Logging.LogGenericInfo(Bot.BotName, "Reconnecting because our sessionID expired!");
|
||||
Bot.SteamClient.Disconnect(); // Bot will handle reconnect
|
||||
var restart = Task.Run(async () => await Bot.Restart().ConfigureAwait(false));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
using Newtonsoft.Json;
|
||||
using SteamAuth;
|
||||
using SteamKit2;
|
||||
using SteamKit2.Internal;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
@@ -35,27 +36,30 @@ using System.Xml;
|
||||
|
||||
namespace ArchiSteamFarm {
|
||||
internal sealed class Bot {
|
||||
private const ulong ArchiSCFarmGroup = 103582791440160998;
|
||||
private const ushort CallbackSleep = 500; // In miliseconds
|
||||
|
||||
private static readonly ConcurrentDictionary<string, Bot> Bots = new ConcurrentDictionary<string, Bot>();
|
||||
private static readonly uint LoginID = MsgClientLogon.ObfuscationMask; // This must be the same for all ASF bots and all ASF processes
|
||||
|
||||
internal static readonly HashSet<uint> GlobalBlacklist = new HashSet<uint> { 303700, 335590, 368020, 425280 };
|
||||
|
||||
private readonly string ConfigFile, LoginKeyFile, MobileAuthenticatorFile, SentryFile;
|
||||
|
||||
internal readonly string BotName;
|
||||
internal readonly ArchiHandler ArchiHandler;
|
||||
internal readonly ArchiWebHandler ArchiWebHandler;
|
||||
internal readonly CallbackManager CallbackManager;
|
||||
internal readonly CardsFarmer CardsFarmer;
|
||||
internal readonly SteamClient SteamClient;
|
||||
internal readonly SteamFriends SteamFriends;
|
||||
internal readonly SteamUser SteamUser;
|
||||
internal readonly Trading Trading;
|
||||
|
||||
private bool LoggedInElsewhere = false;
|
||||
private bool IsRunning = false;
|
||||
private string AuthCode, LoginKey, TwoFactorAuth;
|
||||
|
||||
internal ArchiHandler ArchiHandler { get; private set; }
|
||||
internal ArchiWebHandler ArchiWebHandler { get; private set; }
|
||||
internal CallbackManager CallbackManager { get; private set; }
|
||||
internal CardsFarmer CardsFarmer { get; private set; }
|
||||
internal SteamClient SteamClient { get; private set; }
|
||||
internal SteamFriends SteamFriends { get; private set; }
|
||||
internal SteamGuardAccount SteamGuardAccount { get; private set; }
|
||||
internal SteamUser SteamUser { get; private set; }
|
||||
internal Trading Trading { get; private set; }
|
||||
|
||||
// Config variables
|
||||
internal bool Enabled { get; private set; } = false;
|
||||
@@ -67,9 +71,11 @@ namespace ArchiSteamFarm {
|
||||
internal ulong SteamMasterID { get; private set; } = 0;
|
||||
internal ulong SteamMasterClanID { get; private set; } = 0;
|
||||
internal bool CardDropsRestricted { get; private set; } = false;
|
||||
internal bool FarmOffline { get; private set; } = false;
|
||||
internal bool HandleOfflineMessages { get; private set; } = false;
|
||||
internal bool UseAsfAsMobileAuthenticator { get; private set; } = false;
|
||||
internal bool ShutdownOnFarmingFinished { get; private set; } = false;
|
||||
internal HashSet<uint> Blacklist { get; private set; } = new HashSet<uint> { 303700, 335590, 368020, 425280 };
|
||||
internal HashSet<uint> Blacklist { get; private set; } = new HashSet<uint>();
|
||||
internal bool Statistics { get; private set; } = true;
|
||||
|
||||
private static bool IsValidCdKey(string key) {
|
||||
@@ -135,8 +141,11 @@ namespace ArchiSteamFarm {
|
||||
CallbackManager.Subscribe<SteamClient.DisconnectedCallback>(OnDisconnected);
|
||||
|
||||
SteamFriends = SteamClient.GetHandler<SteamFriends>();
|
||||
CallbackManager.Subscribe<SteamFriends.ChatInviteCallback>(OnChatInvite);
|
||||
CallbackManager.Subscribe<SteamFriends.ChatMsgCallback>(OnChatMsg);
|
||||
CallbackManager.Subscribe<SteamFriends.FriendsListCallback>(OnFriendsList);
|
||||
CallbackManager.Subscribe<SteamFriends.FriendMsgCallback>(OnFriendMsg);
|
||||
CallbackManager.Subscribe<SteamFriends.FriendMsgHistoryCallback>(OnFriendMsgHistory);
|
||||
|
||||
if (UseAsfAsMobileAuthenticator && File.Exists(MobileAuthenticatorFile)) {
|
||||
SteamGuardAccount = JsonConvert.DeserializeObject<SteamGuardAccount>(File.ReadAllText(MobileAuthenticatorFile));
|
||||
@@ -150,6 +159,7 @@ namespace ArchiSteamFarm {
|
||||
CallbackManager.Subscribe<SteamUser.UpdateMachineAuthCallback>(OnMachineAuth);
|
||||
|
||||
CallbackManager.Subscribe<ArchiHandler.NotificationCallback>(OnNotification);
|
||||
CallbackManager.Subscribe<ArchiHandler.OfflineMessageCallback>(OnOfflineMessage);
|
||||
CallbackManager.Subscribe<ArchiHandler.PurchaseResponseCallback>(OnPurchaseResponse);
|
||||
|
||||
ArchiWebHandler = new ArchiWebHandler(this, SteamApiKey);
|
||||
@@ -157,7 +167,8 @@ namespace ArchiSteamFarm {
|
||||
Trading = new Trading(this);
|
||||
|
||||
// Start
|
||||
var fireAndForget = Task.Run(async () => await Start().ConfigureAwait(false));
|
||||
var handleCallbacks = Task.Run(() => HandleCallbacks());
|
||||
var start = Task.Run(async () => await Start().ConfigureAwait(false));
|
||||
}
|
||||
|
||||
internal async Task AcceptAllConfirmations() {
|
||||
@@ -301,6 +312,12 @@ namespace ArchiSteamFarm {
|
||||
case "CardDropsRestricted":
|
||||
CardDropsRestricted = bool.Parse(value);
|
||||
break;
|
||||
case "FarmOffline":
|
||||
FarmOffline = bool.Parse(value);
|
||||
break;
|
||||
case "HandleOfflineMessages":
|
||||
HandleOfflineMessages = bool.Parse(value);
|
||||
break;
|
||||
case "ShutdownOnFarmingFinished":
|
||||
ShutdownOnFarmingFinished = bool.Parse(value);
|
||||
break;
|
||||
@@ -328,12 +345,15 @@ namespace ArchiSteamFarm {
|
||||
return true;
|
||||
}
|
||||
|
||||
internal async Task Start() {
|
||||
if (IsRunning) {
|
||||
return;
|
||||
internal async Task Restart() {
|
||||
await Stop().ConfigureAwait(false);
|
||||
await Start().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
IsRunning = true;
|
||||
internal async Task Start() {
|
||||
if (SteamClient.IsConnected) {
|
||||
return;
|
||||
}
|
||||
|
||||
Logging.LogGenericInfo(BotName, "Starting...");
|
||||
|
||||
@@ -343,17 +363,17 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
SteamClient.Connect();
|
||||
|
||||
var fireAndForget = Task.Run(() => HandleCallbacks());
|
||||
}
|
||||
|
||||
internal async Task Stop() {
|
||||
if (!IsRunning) {
|
||||
if (!SteamClient.IsConnected) {
|
||||
return;
|
||||
}
|
||||
|
||||
await CardsFarmer.StopFarming().ConfigureAwait(false);
|
||||
IsRunning = false;
|
||||
await Utilities.SleepAsync(0); // TODO: This is here only to make VS happy, for now
|
||||
|
||||
Logging.LogGenericInfo(BotName, "Stopping...");
|
||||
|
||||
SteamClient.Disconnect();
|
||||
}
|
||||
|
||||
@@ -383,19 +403,23 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private void HandleCallbacks() {
|
||||
TimeSpan timeSpan = TimeSpan.FromMilliseconds(CallbackSleep);
|
||||
while (IsRunning) {
|
||||
while (true) {
|
||||
CallbackManager.RunWaitCallbacks(timeSpan);
|
||||
}
|
||||
}
|
||||
|
||||
private void SendMessageToUser(ulong steamID, string message) {
|
||||
private void SendMessage(ulong steamID, string message) {
|
||||
if (steamID == 0 || string.IsNullOrEmpty(message)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: I really need something better
|
||||
if (steamID < 110300000000000000) {
|
||||
SteamFriends.SendChatMessage(steamID, EChatEntryType.ChatMsg, message);
|
||||
} else {
|
||||
SteamFriends.SendChatRoomMessage(steamID, EChatEntryType.ChatMsg, message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void ResponseStatus(ulong steamID, string botName = null) {
|
||||
if (steamID == 0) {
|
||||
@@ -408,15 +432,15 @@ namespace ArchiSteamFarm {
|
||||
bot = this;
|
||||
} else {
|
||||
if (!Bots.TryGetValue(botName, out bot)) {
|
||||
SendMessageToUser(steamID, "Couldn't find any bot named " + botName + "!");
|
||||
SendMessage(steamID, "Couldn't find any bot named " + botName + "!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (bot.CardsFarmer.CurrentGamesFarming.Count > 0) {
|
||||
SendMessageToUser(steamID, "Bot " + bot.BotName + " is currently farming appIDs: " + string.Join(", ", bot.CardsFarmer.CurrentGamesFarming) + " and has a total of " + bot.CardsFarmer.GamesToFarm.Count + " games left to farm");
|
||||
SendMessage(steamID, "Bot " + bot.BotName + " is currently farming appIDs: " + string.Join(", ", bot.CardsFarmer.CurrentGamesFarming) + " and has a total of " + bot.CardsFarmer.GamesToFarm.Count + " games left to farm");
|
||||
}
|
||||
SendMessageToUser(steamID, "Currently " + Bots.Count + " bots are running");
|
||||
SendMessage(steamID, "Currently " + Bots.Count + " bots are running");
|
||||
}
|
||||
|
||||
private void Response2FA(ulong steamID, string botName = null) {
|
||||
@@ -430,18 +454,18 @@ namespace ArchiSteamFarm {
|
||||
bot = this;
|
||||
} else {
|
||||
if (!Bots.TryGetValue(botName, out bot)) {
|
||||
SendMessageToUser(steamID, "Couldn't find any bot named " + botName + "!");
|
||||
SendMessage(steamID, "Couldn't find any bot named " + botName + "!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (bot.SteamGuardAccount == null) {
|
||||
SendMessageToUser(steamID, "That bot doesn't have ASF 2FA enabled!");
|
||||
SendMessage(steamID, "That bot doesn't have ASF 2FA enabled!");
|
||||
return;
|
||||
}
|
||||
|
||||
long timeLeft = 30 - TimeAligner.GetSteamTime() % 30;
|
||||
SendMessageToUser(steamID, "2FA Token: " + bot.SteamGuardAccount.GenerateSteamGuardCode() + " (expires in " + timeLeft + " seconds)");
|
||||
SendMessage(steamID, "2FA Token: " + bot.SteamGuardAccount.GenerateSteamGuardCode() + " (expires in " + timeLeft + " seconds)");
|
||||
}
|
||||
|
||||
private void Response2FAOff(ulong steamID, string botName = null) {
|
||||
@@ -455,20 +479,20 @@ namespace ArchiSteamFarm {
|
||||
bot = this;
|
||||
} else {
|
||||
if (!Bots.TryGetValue(botName, out bot)) {
|
||||
SendMessageToUser(steamID, "Couldn't find any bot named " + botName + "!");
|
||||
SendMessage(steamID, "Couldn't find any bot named " + botName + "!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (bot.SteamGuardAccount == null) {
|
||||
SendMessageToUser(steamID, "That bot doesn't have ASF 2FA enabled!");
|
||||
SendMessage(steamID, "That bot doesn't have ASF 2FA enabled!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (bot.DelinkMobileAuthenticator()) {
|
||||
SendMessageToUser(steamID, "Done! Bot is no longer using ASF 2FA");
|
||||
SendMessage(steamID, "Done! Bot is no longer using ASF 2FA");
|
||||
} else {
|
||||
SendMessageToUser(steamID, "Something went wrong!");
|
||||
SendMessage(steamID, "Something went wrong!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -478,15 +502,15 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
if (Bots.ContainsKey(botName)) {
|
||||
SendMessageToUser(steamID, "That bot instance is already running!");
|
||||
SendMessage(steamID, "That bot instance is already running!");
|
||||
return;
|
||||
}
|
||||
|
||||
new Bot(botName);
|
||||
if (Bots.ContainsKey(botName)) {
|
||||
SendMessageToUser(steamID, "Done!");
|
||||
SendMessage(steamID, "Done!");
|
||||
} else {
|
||||
SendMessageToUser(steamID, "That bot instance failed to start, make sure that XML config exists and bot is active!");
|
||||
SendMessage(steamID, "That bot instance failed to start, make sure that XML config exists and bot is active!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -496,20 +520,72 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
if (!Bots.ContainsKey(botName)) {
|
||||
SendMessageToUser(steamID, "That bot instance is already inactive!");
|
||||
SendMessage(steamID, "That bot instance is already inactive!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (await Shutdown(botName).ConfigureAwait(false)) {
|
||||
SendMessageToUser(steamID, "Done!");
|
||||
SendMessage(steamID, "Done!");
|
||||
} else {
|
||||
SendMessageToUser(steamID, "That bot instance failed to shutdown!");
|
||||
SendMessage(steamID, "That bot instance failed to shutdown!");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task HandleMessage(ulong steamID, string message) {
|
||||
if (IsValidCdKey(message)) {
|
||||
ArchiHandler.RedeemKey(message);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!message.StartsWith("!")) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!message.Contains(" ")) {
|
||||
switch (message) {
|
||||
case "!2fa":
|
||||
Response2FA(steamID);
|
||||
break;
|
||||
case "!2faoff":
|
||||
Response2FAOff(steamID);
|
||||
break;
|
||||
case "!exit":
|
||||
await ShutdownAllBots().ConfigureAwait(false);
|
||||
break;
|
||||
case "!restart":
|
||||
await Program.Restart().ConfigureAwait(false);
|
||||
break;
|
||||
case "!status":
|
||||
ResponseStatus(steamID);
|
||||
break;
|
||||
case "!stop":
|
||||
await Shutdown().ConfigureAwait(false);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
string[] args = message.Split(' ');
|
||||
switch (args[0]) {
|
||||
case "!2fa":
|
||||
Response2FA(steamID, args[1]);
|
||||
break;
|
||||
case "!2faoff":
|
||||
Response2FAOff(steamID, args[1]);
|
||||
break;
|
||||
case "!redeem":
|
||||
ArchiHandler.RedeemKey(args[1]);
|
||||
break;
|
||||
case "!start":
|
||||
ResponseStart(steamID, args[1]);
|
||||
break;
|
||||
case "!stop":
|
||||
await ResponseStop(steamID, args[1]).ConfigureAwait(false);
|
||||
break;
|
||||
case "!status":
|
||||
ResponseStatus(steamID, args[1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnConnected(SteamClient.ConnectedCallback callback) {
|
||||
if (callback == null) {
|
||||
@@ -541,11 +617,11 @@ namespace ArchiSteamFarm {
|
||||
SteamPassword = Program.GetUserInput(BotName, Program.EUserInputType.Password);
|
||||
}
|
||||
|
||||
// TODO: We should use SteamUser.LogOn with proper LoginID once https://github.com/SteamRE/SteamKit/pull/217 gets merged
|
||||
ArchiHandler.HackedLogOn(Program.UniqueID, new SteamUser.LogOnDetails {
|
||||
SteamUser.LogOn(new SteamUser.LogOnDetails {
|
||||
Username = SteamLogin,
|
||||
Password = SteamPassword,
|
||||
AuthCode = AuthCode,
|
||||
LoginID = LoginID,
|
||||
LoginKey = LoginKey,
|
||||
TwoFactorCode = TwoFactorAuth,
|
||||
SentryFileHash = sentryHash,
|
||||
@@ -558,30 +634,58 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsRunning) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (SteamClient == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Logging.LogGenericInfo(BotName, "Disconnected from Steam!");
|
||||
await CardsFarmer.StopFarming().ConfigureAwait(false);
|
||||
|
||||
Logging.LogGenericWarning(BotName, "Disconnected from Steam, reconnecting...");
|
||||
// If we initiated disconnect, do not attempt to reconnect
|
||||
if (callback.UserInitiated) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (LoggedInElsewhere) {
|
||||
LoggedInElsewhere = false;
|
||||
Logging.LogGenericWarning(BotName, "Account is being used elsewhere, will try reconnecting in 30 minutes...");
|
||||
await Utilities.SleepAsync(30 * 60 * 1000).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
Logging.LogGenericInfo(BotName, "Reconnecting...");
|
||||
|
||||
// 2FA tokens are expiring soon, use limiter only when we don't have any pending
|
||||
if (TwoFactorAuth == null) {
|
||||
await Program.LimitSteamRequestsAsync().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
if (LoggedInElsewhere) {
|
||||
LoggedInElsewhere = false;
|
||||
Logging.LogGenericWarning(BotName, "Account is being used elsewhere, will try reconnecting in 5 minutes...");
|
||||
await Utilities.SleepAsync(5 * 60 * 1000).ConfigureAwait(false);
|
||||
SteamClient.Connect();
|
||||
}
|
||||
|
||||
SteamClient.Connect();
|
||||
private void OnChatInvite(SteamFriends.ChatInviteCallback callback) {
|
||||
if (callback == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
ulong steamID = callback.PatronID;
|
||||
if (steamID != SteamMasterID) {
|
||||
return;
|
||||
}
|
||||
|
||||
SteamFriends.JoinChat(callback.ChatRoomID);
|
||||
}
|
||||
|
||||
private async void OnChatMsg(SteamFriends.ChatMsgCallback callback) {
|
||||
if (callback == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (callback.ChatMsgType != EChatEntryType.ChatMsg) {
|
||||
return;
|
||||
}
|
||||
|
||||
ulong steamID = callback.ChatterID;
|
||||
if (steamID != SteamMasterID) {
|
||||
return;
|
||||
}
|
||||
|
||||
await HandleMessage(callback.ChatRoomID, callback.Message).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private void OnFriendsList(SteamFriends.FriendsListCallback callback) {
|
||||
@@ -622,69 +726,44 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
string message = callback.Message;
|
||||
if (string.IsNullOrEmpty(message)) {
|
||||
await HandleMessage(steamID, callback.Message).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private async void OnFriendMsgHistory(SteamFriends.FriendMsgHistoryCallback callback) {
|
||||
if (callback == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (IsValidCdKey(message)) {
|
||||
ArchiHandler.RedeemKey(message);
|
||||
if (callback.Result != EResult.OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!message.StartsWith("!")) {
|
||||
ulong steamID = callback.SteamID;
|
||||
|
||||
if (steamID != SteamMasterID) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!message.Contains(" ")) {
|
||||
switch (message) {
|
||||
case "!2fa":
|
||||
Response2FA(steamID);
|
||||
break;
|
||||
case "!2faoff":
|
||||
Response2FAOff(steamID);
|
||||
break;
|
||||
case "!exit":
|
||||
await ShutdownAllBots().ConfigureAwait(false);
|
||||
break;
|
||||
case "!farm":
|
||||
SendMessageToUser(steamID, "Please wait...");
|
||||
await CardsFarmer.StartFarming().ConfigureAwait(false);
|
||||
SendMessageToUser(steamID, "Done!");
|
||||
break;
|
||||
case "!restart":
|
||||
await Program.Restart().ConfigureAwait(false);
|
||||
break;
|
||||
case "!status":
|
||||
ResponseStatus(steamID);
|
||||
break;
|
||||
case "!stop":
|
||||
await Shutdown().ConfigureAwait(false);
|
||||
break;
|
||||
var messages = callback.Messages;
|
||||
if (messages.Count == 0) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
string[] args = message.Split(' ');
|
||||
switch (args[0]) {
|
||||
case "!2fa":
|
||||
Response2FA(steamID, args[1]);
|
||||
break;
|
||||
case "!2faoff":
|
||||
Response2FAOff(steamID, args[1]);
|
||||
break;
|
||||
case "!redeem":
|
||||
ArchiHandler.RedeemKey(args[1]);
|
||||
break;
|
||||
case "!start":
|
||||
ResponseStart(steamID, args[1]);
|
||||
break;
|
||||
case "!stop":
|
||||
await ResponseStop(steamID, args[1]).ConfigureAwait(false);
|
||||
break;
|
||||
case "!status":
|
||||
ResponseStatus(steamID, args[1]);
|
||||
break;
|
||||
|
||||
// Get last message
|
||||
var lastMessage = messages[messages.Count - 1];
|
||||
|
||||
// If message is read already, return
|
||||
if (!lastMessage.Unread) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If message is too old, return
|
||||
if (DateTime.UtcNow.Subtract(lastMessage.Timestamp).TotalMinutes > 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle the message
|
||||
await HandleMessage(steamID, lastMessage.Message).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private void OnAccountInfo(SteamUser.AccountInfoCallback callback) {
|
||||
@@ -692,8 +771,10 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!FarmOffline) {
|
||||
SteamFriends.SetPersonaState(EPersonaState.Online);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnLoggedOff(SteamUser.LoggedOffCallback callback) {
|
||||
if (callback == null) {
|
||||
@@ -757,7 +838,7 @@ namespace ArchiSteamFarm {
|
||||
TwoFactorAuth = null;
|
||||
|
||||
if (!SteamNickname.Equals("null")) {
|
||||
SteamFriends.SetPersonaName(SteamNickname);
|
||||
await SteamFriends.SetPersonaName(SteamNickname);
|
||||
}
|
||||
|
||||
if (SteamParentalPIN.Equals("null")) {
|
||||
@@ -772,8 +853,8 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
if (Statistics) {
|
||||
await ArchiWebHandler.JoinClan(Program.ArchiSCFarmGroup).ConfigureAwait(false);
|
||||
SteamFriends.JoinChat(Program.ArchiSCFarmGroup);
|
||||
await ArchiWebHandler.JoinClan(ArchiSCFarmGroup).ConfigureAwait(false);
|
||||
SteamFriends.JoinChat(ArchiSCFarmGroup);
|
||||
}
|
||||
|
||||
Trading.CheckTrades();
|
||||
@@ -784,8 +865,7 @@ namespace ArchiSteamFarm {
|
||||
case EResult.Timeout:
|
||||
case EResult.TryAnotherCM:
|
||||
Logging.LogGenericWarning(BotName, "Unable to login to Steam: " + result + ", retrying...");
|
||||
await Stop().ConfigureAwait(false);
|
||||
await Start().ConfigureAwait(false);
|
||||
await Restart().ConfigureAwait(false);
|
||||
break;
|
||||
default:
|
||||
Logging.LogGenericWarning(BotName, "Unable to login to Steam: " + result);
|
||||
@@ -808,8 +888,6 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
Logging.LogGenericInfo(BotName, "Updating sentryfile...");
|
||||
|
||||
int fileSize;
|
||||
byte[] sentryHash;
|
||||
|
||||
@@ -837,8 +915,6 @@ namespace ArchiSteamFarm {
|
||||
OneTimePassword = callback.OneTimePassword,
|
||||
SentryFileHash = sentryHash,
|
||||
});
|
||||
|
||||
Logging.LogGenericInfo(BotName, "Sentryfile updated successfully!");
|
||||
}
|
||||
|
||||
private void OnNotification(ArchiHandler.NotificationCallback callback) {
|
||||
@@ -853,6 +929,18 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
}
|
||||
|
||||
private void OnOfflineMessage(ArchiHandler.OfflineMessageCallback callback) {
|
||||
if (callback == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!HandleOfflineMessages) {
|
||||
return;
|
||||
}
|
||||
|
||||
SteamFriends.RequestOfflineMessages();
|
||||
}
|
||||
|
||||
private async void OnPurchaseResponse(ArchiHandler.PurchaseResponseCallback callback) {
|
||||
if (callback == null) {
|
||||
return;
|
||||
@@ -860,10 +948,11 @@ namespace ArchiSteamFarm {
|
||||
|
||||
var purchaseResult = callback.PurchaseResult;
|
||||
var items = callback.Items;
|
||||
SendMessageToUser(SteamMasterID, "Status: " + purchaseResult + " | Items: " + string.Join("", items));
|
||||
SendMessage(SteamMasterID, "Status: " + purchaseResult + " | Items: " + string.Join("", items));
|
||||
|
||||
if (purchaseResult == ArchiHandler.PurchaseResponseCallback.EPurchaseResult.OK) {
|
||||
await CardsFarmer.StartFarming().ConfigureAwait(false);
|
||||
// We will restart CF module to recalculate current status and decide about new optimal approach
|
||||
await CardsFarmer.RestartFarming().ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace ArchiSteamFarm {
|
||||
internal readonly ConcurrentDictionary<uint, double> GamesToFarm = new ConcurrentDictionary<uint, double>();
|
||||
internal readonly List<uint> CurrentGamesFarming = new List<uint>();
|
||||
|
||||
private volatile bool NowFarming = false;
|
||||
private bool NowFarming = false;
|
||||
|
||||
internal CardsFarmer(Bot bot) {
|
||||
Bot = bot;
|
||||
@@ -105,10 +105,10 @@ namespace ArchiSteamFarm {
|
||||
|
||||
Logging.LogGenericInfo(Bot.BotName, "Now farming: " + string.Join(", ", GamesToFarm.Keys));
|
||||
if (Farm(maxHour, GamesToFarm.Keys)) {
|
||||
CurrentGamesFarming.Clear();
|
||||
return true;
|
||||
} else {
|
||||
CurrentGamesFarming.Clear();
|
||||
NowFarming = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -128,14 +128,16 @@ namespace ArchiSteamFarm {
|
||||
return true;
|
||||
} else {
|
||||
CurrentGamesFarming.Clear();
|
||||
NowFarming = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
internal async Task StartFarming() {
|
||||
internal async Task RestartFarming() {
|
||||
await StopFarming().ConfigureAwait(false);
|
||||
await StartFarming().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
internal async Task StartFarming() {
|
||||
await Semaphore.WaitAsync().ConfigureAwait(false);
|
||||
|
||||
if (NowFarming) {
|
||||
@@ -143,23 +145,6 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if farming is possible
|
||||
Logging.LogGenericInfo(Bot.BotName, "Checking possibility to farm...");
|
||||
NowFarming = true;
|
||||
Semaphore.Release();
|
||||
Bot.ArchiHandler.PlayGames(1337);
|
||||
|
||||
// We'll now either receive OnLoggedOff() with LoggedInElsewhere, or nothing happens
|
||||
if (await Task.Run(() => FarmResetEvent.WaitOne(5000)).ConfigureAwait(false)) { // If LoggedInElsewhere happens in 5 seconds from now, abort farming
|
||||
NowFarming = false;
|
||||
return;
|
||||
}
|
||||
|
||||
NowFarming = false;
|
||||
Logging.LogGenericInfo(Bot.BotName, "Farming is possible!");
|
||||
|
||||
await Semaphore.WaitAsync().ConfigureAwait(false);
|
||||
|
||||
if (await Bot.ArchiWebHandler.ReconnectIfNeeded().ConfigureAwait(false)) {
|
||||
Semaphore.Release();
|
||||
return;
|
||||
@@ -170,7 +155,7 @@ namespace ArchiSteamFarm {
|
||||
// Find the number of badge pages
|
||||
HtmlDocument badgesDocument = await Bot.ArchiWebHandler.GetBadgePage(1).ConfigureAwait(false);
|
||||
if (badgesDocument == null) {
|
||||
Logging.LogGenericWarning(Bot.BotName, "Could not get badges information, farming is stopped!");
|
||||
Logging.LogGenericWarning(Bot.BotName, "Could not get badges information, will try again later!");
|
||||
Semaphore.Release();
|
||||
return;
|
||||
}
|
||||
@@ -209,7 +194,7 @@ namespace ArchiSteamFarm {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Bot.Blacklist.Contains(appID)) {
|
||||
if (Bot.GlobalBlacklist.Contains(appID) || Bot.Blacklist.Contains(appID)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -250,10 +235,16 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
}
|
||||
|
||||
if (GamesToFarm.Count == 0) {
|
||||
Logging.LogGenericInfo(Bot.BotName, "No games to farm!");
|
||||
Semaphore.Release();
|
||||
return;
|
||||
}
|
||||
|
||||
Logging.LogGenericInfo(Bot.BotName, "Farming in progress...");
|
||||
|
||||
NowFarming = GamesToFarm.Count > 0;
|
||||
Semaphore.Release();
|
||||
NowFarming = true;
|
||||
Semaphore.Release(); // From this point we allow other calls to shut us down
|
||||
|
||||
// Now the algorithm used for farming depends on whether account is restricted or not
|
||||
if (Bot.CardDropsRestricted) {
|
||||
@@ -269,6 +260,7 @@ namespace ArchiSteamFarm {
|
||||
Logging.LogGenericInfo(Bot.BotName, "Done farming: " + appID);
|
||||
gamesToFarmSolo.Remove(appID);
|
||||
} else {
|
||||
NowFarming = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -277,6 +269,7 @@ namespace ArchiSteamFarm {
|
||||
if (success) {
|
||||
Logging.LogGenericInfo(Bot.BotName, "Done farming: " + string.Join(", ", GamesToFarm.Keys));
|
||||
} else {
|
||||
NowFarming = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -290,6 +283,7 @@ namespace ArchiSteamFarm {
|
||||
if (success) {
|
||||
Logging.LogGenericInfo(Bot.BotName, "Done farming: " + appID);
|
||||
} else {
|
||||
NowFarming = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -321,7 +315,7 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
private async Task CheckGamesForFarming() {
|
||||
if (NowFarming || GamesToFarm.Count > 0) {
|
||||
if (NowFarming || GamesToFarm.Count > 0 || !Bot.SteamClient.IsConnected) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,16 +24,32 @@
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace ArchiSteamFarm {
|
||||
internal static class Logging {
|
||||
private static readonly object FileLock = new object();
|
||||
|
||||
internal static void Init() {
|
||||
File.Delete(Program.LogFile);
|
||||
}
|
||||
|
||||
private static void Log(string message) {
|
||||
if (Program.ConsoleIsBusy) {
|
||||
if (string.IsNullOrEmpty(message)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Console.WriteLine(DateTime.Now + " " + message);
|
||||
string loggedMessage = DateTime.Now + " " + message + Environment.NewLine;
|
||||
|
||||
// Write on console only when not awaiting response from user
|
||||
if (!Program.ConsoleIsBusy) {
|
||||
Console.Write(loggedMessage);
|
||||
}
|
||||
|
||||
lock (FileLock) {
|
||||
File.AppendAllText(Program.LogFile, loggedMessage);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void LogGenericError(string botName, string message, [CallerMemberName] string previousMethodName = "") {
|
||||
@@ -60,10 +76,5 @@ namespace ArchiSteamFarm {
|
||||
internal static void LogGenericDebug(string botName, string message, [CallerMemberName] string previousMethodName = "") {
|
||||
Log("[#] DEBUG: " + previousMethodName + "() <" + botName + "> " + message);
|
||||
}
|
||||
|
||||
[Conditional("DEBUG")]
|
||||
internal static void LogGenericDebug(string message, [CallerMemberName] string previousMethodName = "") {
|
||||
LogGenericDebug("DEBUG", message, previousMethodName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,8 +43,6 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
private const string LatestGithubReleaseURL = "https://api.github.com/repos/JustArchi/ArchiSteamFarm/releases/latest";
|
||||
|
||||
internal const ulong ArchiSCFarmGroup = 103582791440160998;
|
||||
internal const string ConfigDirectoryPath = "config";
|
||||
|
||||
private static readonly SemaphoreSlim SteamSemaphore = new SemaphoreSlim(1);
|
||||
@@ -55,10 +53,10 @@ namespace ArchiSteamFarm {
|
||||
private static readonly object ConsoleLock = new object();
|
||||
//private static readonly string ExeName = AssemblyName.Name + ".exe";
|
||||
|
||||
internal static readonly uint UniqueID = (uint) Utilities.Random.Next();
|
||||
internal static readonly string LogFile = Path.Combine(Path.GetDirectoryName(ExecutablePath), "log.txt");
|
||||
internal static readonly string Version = AssemblyName.Version.ToString();
|
||||
|
||||
internal static bool ConsoleIsBusy = false;
|
||||
internal static bool ConsoleIsBusy { get; private set; } = false;
|
||||
|
||||
private static async Task CheckForUpdate() {
|
||||
JObject response = await WebBrowser.UrlGetToJObject(LatestGithubReleaseURL).ConfigureAwait(false);
|
||||
@@ -153,14 +151,15 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
private static void InitServices() {
|
||||
Logging.Init();
|
||||
WebBrowser.Init();
|
||||
}
|
||||
|
||||
private static void Main(string[] args) {
|
||||
Logging.LogGenericInfo("Main", "Archi's Steam Farm, version " + Version);
|
||||
|
||||
InitServices();
|
||||
|
||||
Logging.LogGenericInfo("Main", "Archi's Steam Farm, version " + Version);
|
||||
|
||||
Task.Run(async () => await CheckForUpdate().ConfigureAwait(false)).Wait();
|
||||
|
||||
// Allow loading configs from source tree if it's a debug build
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
[assembly: AssemblyVersion("1.2.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.2.0.0")]
|
||||
|
||||
@@ -22,14 +22,11 @@
|
||||
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ArchiSteamFarm {
|
||||
internal static class Utilities {
|
||||
internal static readonly Random Random = new Random();
|
||||
|
||||
internal static async Task SleepAsync(int miliseconds) {
|
||||
await Task.Delay(miliseconds).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
@@ -63,6 +63,16 @@
|
||||
<!-- TIP: Based on this parameter, ASF will try to choose the most optimal cards farming algorithm for this account -->
|
||||
<CardDropsRestricted type="bool" value="false"/>
|
||||
|
||||
<!-- This switch defines if the account should stay as "Offline" after logging in to Steam -->
|
||||
<!-- Please note that bot won't be able to respond to any commands when this property is set to "true" -->
|
||||
<!-- TIP: Setting this to "true" may be useful for primary accounts, to not show as online when you're not here -->
|
||||
<FarmOffline type="bool" value="false"/>
|
||||
|
||||
<!-- This switch defines if bot should handle offline messages when it sees them -->
|
||||
<!-- Basically it should be used only when "FarmOffline" property above is true, so bot can handle offline messages -->
|
||||
<!-- Reading offline messages will also mark them as received, therefore it should not be used if you want to keep them for later -->
|
||||
<HandleOfflineMessages type="bool" value="false"/>
|
||||
|
||||
<!-- This switch defines if bot should disconnect once farming is finished -->
|
||||
<!-- When no bots are active, ASF will shutdown as well -->
|
||||
<!-- Some people may want to keep their bots 24/7, other disconnect them after job is done -->
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
<package id="HtmlAgilityPack" version="1.4.9" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="8.0.1-beta3" targetFramework="net45" />
|
||||
<package id="protobuf-net" version="2.0.0.668" targetFramework="net45" />
|
||||
<package id="SteamKit2" version="1.6.5" targetFramework="net45" />
|
||||
<package id="SteamKit2" version="1.7.0" targetFramework="net452" />
|
||||
</packages>
|
||||
BIN
packages/SteamKit2.1.6.5/SteamKit2.1.6.5.nupkg
vendored
BIN
packages/SteamKit2.1.6.5/SteamKit2.1.6.5.nupkg
vendored
Binary file not shown.
BIN
packages/SteamKit2.1.6.5/lib/net40/SteamKit2.dll
vendored
BIN
packages/SteamKit2.1.6.5/lib/net40/SteamKit2.dll
vendored
Binary file not shown.
BIN
packages/SteamKit2.1.7.0/SteamKit2.1.7.0.nupkg
vendored
Normal file
BIN
packages/SteamKit2.1.7.0/SteamKit2.1.7.0.nupkg
vendored
Normal file
Binary file not shown.
BIN
packages/SteamKit2.1.7.0/lib/net45/SteamKit2.dll
vendored
Normal file
BIN
packages/SteamKit2.1.7.0/lib/net45/SteamKit2.dll
vendored
Normal file
Binary file not shown.
@@ -821,6 +821,12 @@
|
||||
The connection timeout.
|
||||
</value>
|
||||
</member>
|
||||
<member name="P:SteamKit2.Internal.CMClient.DebugNetworkListener">
|
||||
<summary>
|
||||
Gets or sets the network listening interface. Use this for debugging only.
|
||||
For your convenience, you can use <see cref="T:SteamKit2.NetHookNetworkListener"/> class.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.Internal.CMClient.#ctor(System.Net.Sockets.ProtocolType)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.Internal.CMClient"/> class with a specific connection type.
|
||||
@@ -1492,14 +1498,14 @@
|
||||
Smart list of CM servers.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SmartCMServerList.ScoreExpiryTimeSpan">
|
||||
<member name="P:SteamKit2.SmartCMServerList.BadConnectionMemoryTimeSpan">
|
||||
<summary>
|
||||
Determines after how much time a server's score should expire and be reset to it's base value.
|
||||
Determines how long a server's bad connection state is remembered for.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SmartCMServerList.ResetOldScores">
|
||||
<summary>
|
||||
Resets the scores of all servers which had their scores last updated a <see cref="P:SteamKit2.SmartCMServerList.ScoreExpiryTimeSpan"/> ago.
|
||||
Resets the scores of all servers which has a last bad connection more than <see cref="P:SteamKit2.SmartCMServerList.BadConnectionMemoryTimeSpan"/> ago.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SmartCMServerList.TryAdd(System.Net.IPEndPoint)">
|
||||
@@ -1516,9 +1522,18 @@
|
||||
<param name="endPoints">The collection of <see cref="T:System.Net.IPEndPoint"/>s to add.</param>
|
||||
<returns>false if any of the specified servers are already in the list, true otherwise.</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SmartCMServerList.ResetAllScores">
|
||||
<member name="M:SteamKit2.SmartCMServerList.MergeWithList(System.Collections.Generic.IEnumerable{System.Net.IPEndPoint})">
|
||||
<summary>
|
||||
Explicitly resets the quality of every stored server.
|
||||
Merges the list with a new list of servers provided to us by the Steam servers.
|
||||
This adds the new list of <see cref="T:System.Net.IPEndPoint"/>s to the beginning of the list,
|
||||
ensuring that any pre-existing servers are moved into their new place in order near
|
||||
the beginning of the list.
|
||||
</summary>
|
||||
<param name="listToMerge">The <see cref="T:System.Net.IPEndPoint"/>s to merge into this <see cref="T:SteamKit2.SmartCMServerList"/>.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SmartCMServerList.ResetBadServers">
|
||||
<summary>
|
||||
Explicitly resets the known state of all servers.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SmartCMServerList.Clear">
|
||||
@@ -1853,6 +1868,7 @@
|
||||
<summary>
|
||||
Requests details for a specific item of user generated content from the Steam servers.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamCloud.UGCDetailsCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="ugcId">The unique user generated content id.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamCloud.UGCDetailsCallback"/>.</returns>
|
||||
@@ -1861,6 +1877,7 @@
|
||||
<summary>
|
||||
Requests details for a specific file in the user's Cloud storage.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamCloud.SingleFileInfoCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="appid">The app id of the game.</param>
|
||||
<param name="filename">The path to the file being requested.</param>
|
||||
@@ -1870,6 +1887,7 @@
|
||||
<summary>
|
||||
Commit a Cloud file at the given path to make its UGC handle publicly visible.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamCloud.ShareFileCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="appid">The app id of the game.</param>
|
||||
<param name="filename">The path to the file being requested.</param>
|
||||
@@ -2009,9 +2027,8 @@
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamGameServer.LogOff">
|
||||
<summary>
|
||||
Logs the game server off of the Steam3 network.
|
||||
This method does not disconnect the client.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamUser.LoggedOffCallback"/>.
|
||||
Informs the Steam servers that this client wishes to log off from the network.
|
||||
The Steam server will disconnect the client, and a <see cref="T:SteamKit2.SteamClient.DisconnectedCallback"/> will be posted.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamGameServer.SendStatus(SteamKit2.SteamGameServer.StatusDetails)">
|
||||
@@ -2139,6 +2156,7 @@
|
||||
<summary>
|
||||
Requests a list of servers from the Steam game master server.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamMasterServer.QueryCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="details">The details for the request.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamMasterServer.QueryCallback"/>.</returns>
|
||||
@@ -2242,6 +2260,7 @@
|
||||
<summary>
|
||||
Adds a screenshot to the user's screenshot library. The screenshot image and thumbnail must already exist on the UFS.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamScreenshots.ScreenshotAddedCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="details">The details of the screenshot.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamScreenshots.ScreenshotAddedCallback"/>.</returns>
|
||||
@@ -2428,6 +2447,7 @@
|
||||
<summary>
|
||||
Sends a message.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamUnifiedMessages.ServiceMethodResponse"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<typeparam name="TResponse">The type of the protobuf object which is the response to the RPC call.</typeparam>
|
||||
<param name="expr">RPC call expression, e.g. x => x.SomeMethodCall(message);</param>
|
||||
@@ -2438,6 +2458,7 @@
|
||||
<summary>
|
||||
Sends a message.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamUnifiedMessages.ServiceMethodResponse"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<typeparam name="TRequest">The type of a protobuf object.</typeparam>
|
||||
<param name="name">Name of the RPC endpoint. Takes the format ServiceName.RpcName</param>
|
||||
@@ -2656,6 +2677,7 @@
|
||||
<summary>
|
||||
Enumerates the list of published files for the current logged in user.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamWorkshop.UserPublishedFilesCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="details">The specific details of the request.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamWorkshop.UserPublishedFilesCallback"/>.</returns>
|
||||
@@ -2664,6 +2686,7 @@
|
||||
<summary>
|
||||
Enumerates the list of subscribed files for the current logged in user.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamWorkshop.UserSubscribedFilesCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="details">The specific details of the request.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamWorkshop.UserSubscribedFilesCallback"/>.</returns>
|
||||
@@ -2672,6 +2695,7 @@
|
||||
<summary>
|
||||
Enumerates the list of published files for the current logged in user based on user action.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamWorkshop.UserActionPublishedFilesCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="details">The specific details of the request.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamWorkshop.UserActionPublishedFilesCallback"/>.</returns>
|
||||
@@ -2740,6 +2764,7 @@
|
||||
<summary>
|
||||
Enumerates the list of all published files on the Steam workshop.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamWorkshop.PublishedFilesCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="details">The specific details of the request.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamWorkshop.PublishedFilesCallback"/>.</returns>
|
||||
@@ -2767,6 +2792,7 @@
|
||||
<summary>
|
||||
Asks the Steam back-end for a leaderboard by name for a given appid.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamUserStats.FindOrCreateLeaderboardCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="appId">The AppID to request a leaderboard for.</param>
|
||||
<param name="name">Name of the leaderboard to request.</param>
|
||||
@@ -2776,6 +2802,7 @@
|
||||
<summary>
|
||||
Asks the Steam back-end for a leaderboard by name, and will create it if it's not yet.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamUserStats.FindOrCreateLeaderboardCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="appId">The AppID to request a leaderboard for.</param>
|
||||
<param name="name">Name of the leaderboard to create.</param>
|
||||
@@ -2787,6 +2814,7 @@
|
||||
<summary>
|
||||
Asks the Steam back-end for a set of rows in the leaderboard.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamUserStats.LeaderboardEntriesCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="appId">The AppID to request leaderboard rows for.</param>
|
||||
<param name="id">ID of the leaderboard to view.</param>
|
||||
@@ -2896,6 +2924,79 @@
|
||||
Gets the list of leaderboard entries this response contains.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobManager.StartJob(SteamKit2.AsyncJob)">
|
||||
<summary>
|
||||
Tracks a job with this manager.
|
||||
</summary>
|
||||
<param name="asyncJob">The asynchronous job to track.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobManager.TryCompleteJob(SteamKit2.JobID,SteamKit2.CallbackMsg)">
|
||||
<summary>
|
||||
Passes a callback to a pending async job.
|
||||
If the given callback completes the job, the job is removed from this manager.
|
||||
</summary>
|
||||
<param name="jobId">The JobID.</param>
|
||||
<param name="callback">The callback.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobManager.HeartbeatJob(SteamKit2.JobID)">
|
||||
<summary>
|
||||
Extends the lifetime of a job.
|
||||
</summary>
|
||||
<param name="jobId">The job identifier.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobManager.FailJob(SteamKit2.JobID)">
|
||||
<summary>
|
||||
Marks a certain job as remotely failed.
|
||||
</summary>
|
||||
<param name="jobId">The job identifier.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobManager.CancelPendingJobs">
|
||||
<summary>
|
||||
Cancels and clears all jobs being tracked.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobManager.SetTimeoutsEnabled(System.Boolean)">
|
||||
<summary>
|
||||
Enables or disables periodic checks for job timeouts.
|
||||
</summary>
|
||||
<param name="enable">Whether or not job timeout checks should be enabled.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobManager.CancelTimedoutJobs">
|
||||
<summary>
|
||||
This is called periodically to cancel and clear out any jobs that have timed out (no response from Steam).
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobManager.GetJob(SteamKit2.JobID,System.Boolean)">
|
||||
<summary>
|
||||
Retrieves a job from this manager, and optionally removes it from tracking.
|
||||
</summary>
|
||||
<param name="jobId">The JobID.</param>
|
||||
<param name="andRemove">If set to <c>true</c>, this job is removed from tracking.</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:SteamKit2.AsyncJobFailedException">
|
||||
<summary>
|
||||
Thrown when Steam encounters a remote error with a pending <see cref="T:SteamKit2.AsyncJob"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobFailedException.#ctor">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.AsyncJobFailedException"/> class.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobFailedException.#ctor(System.String)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.AsyncJobFailedException"/> class.
|
||||
</summary>
|
||||
<param name="message">The message that describes the error.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobFailedException.#ctor(System.String,System.Exception)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.AsyncJobFailedException"/> class.
|
||||
</summary>
|
||||
<param name="message">The error message that explains the reason for the exception.</param>
|
||||
<param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
|
||||
</member>
|
||||
<member name="T:SteamKit2.Callback`1">
|
||||
<summary>
|
||||
This utility class is used for binding a callback to a function.
|
||||
@@ -3229,19 +3330,20 @@
|
||||
Helper class to load servers from the Steam Directory Web API.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamDirectory.Initialize(System.Int32)">
|
||||
<member name="M:SteamKit2.SteamDirectory.Initialize(System.UInt32)">
|
||||
<summary>
|
||||
Initializes <see cref="T:SteamKit2.Internal.CMClient"/>'s server list with servers from the Steam Directory.
|
||||
</summary>
|
||||
<param name="cellid">Cell ID</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamDirectory.LoadAsync(System.Int32)">
|
||||
<member name="M:SteamKit2.SteamDirectory.LoadAsync(System.UInt32)">
|
||||
<summary>
|
||||
Load a list of servers from the Steam Directory.
|
||||
</summary>
|
||||
<param name="cellid">Cell ID</param>
|
||||
<returns>A <see cref="T:System.Threading.Tasks.Task"/> with the Result set to an enumerable list of <see cref="T:System.Net.IPEndPoint"/>s.</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamDirectory.LoadAsync(System.Int32,System.Threading.CancellationToken)">
|
||||
<member name="M:SteamKit2.SteamDirectory.LoadAsync(System.UInt32,System.Threading.CancellationToken)">
|
||||
<summary>
|
||||
Load a list of servers from the Steam Directory.
|
||||
</summary>
|
||||
@@ -3536,45 +3638,6 @@
|
||||
A <see cref="T:System.String"/> that represents this instance.
|
||||
</returns>
|
||||
</member>
|
||||
<member name="T:SteamKit2.JobID">
|
||||
<summary>
|
||||
Represents an identifier of a network task known as a job.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:SteamKit2.JobID.Invalid">
|
||||
<summary>
|
||||
Represents an invalid JobID.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.JobID.#ctor">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.JobID"/> class.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.JobID.#ctor(System.UInt64)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.JobID"/> class.
|
||||
</summary>
|
||||
<param name="jobId">The Job ID to initialize this instance with.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.JobID.op_Implicit(SteamKit2.JobID)~System.UInt64">
|
||||
<summary>
|
||||
Performs an implicit conversion from <see cref="T:SteamKit2.JobID"/> to <see cref="T:System.UInt64"/>.
|
||||
</summary>
|
||||
<param name="jobId">The Job ID.</param>
|
||||
<returns>
|
||||
The result of the conversion.
|
||||
</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.JobID.op_Implicit(System.UInt64)~SteamKit2.JobID">
|
||||
<summary>
|
||||
Performs an implicit conversion from <see cref="T:System.UInt64"/> to <see cref="T:SteamKit2.JobID"/>.
|
||||
</summary>
|
||||
<param name="jobId">The Job ID.</param>
|
||||
<returns>
|
||||
The result of the conversion.
|
||||
</returns>
|
||||
</member>
|
||||
<member name="T:SteamKit2.UGCHandle">
|
||||
<summary>
|
||||
Represents a single unique handle to a piece of User Generated Content.
|
||||
@@ -3699,6 +3762,195 @@
|
||||
<param name="encryptionKey">The encryption key.</param>
|
||||
<returns><c>true</c> if the file names were successfully decrypted; otherwise, <c>false</c>.</returns>
|
||||
</member>
|
||||
<member name="T:SteamKit2.JobID">
|
||||
<summary>
|
||||
Represents an identifier of a network task known as a job.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:SteamKit2.JobID.Invalid">
|
||||
<summary>
|
||||
Represents an invalid JobID.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.JobID.#ctor">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.JobID"/> class.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.JobID.#ctor(System.UInt64)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.JobID"/> class.
|
||||
</summary>
|
||||
<param name="jobId">The Job ID to initialize this instance with.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.JobID.op_Implicit(SteamKit2.JobID)~System.UInt64">
|
||||
<summary>
|
||||
Performs an implicit conversion from <see cref="T:SteamKit2.JobID"/> to <see cref="T:System.UInt64"/>.
|
||||
</summary>
|
||||
<param name="jobId">The Job ID.</param>
|
||||
<returns>
|
||||
The result of the conversion.
|
||||
</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.JobID.op_Implicit(System.UInt64)~SteamKit2.JobID">
|
||||
<summary>
|
||||
Performs an implicit conversion from <see cref="T:System.UInt64"/> to <see cref="T:SteamKit2.JobID"/>.
|
||||
</summary>
|
||||
<param name="jobId">The Job ID.</param>
|
||||
<returns>
|
||||
The result of the conversion.
|
||||
</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.JobID.op_Implicit(SteamKit2.AsyncJob)~SteamKit2.JobID">
|
||||
<summary>
|
||||
Performs an implicit conversion from <see cref="T:SteamKit2.AsyncJob"/> to <see cref="T:SteamKit2.JobID"/>.
|
||||
</summary>
|
||||
<param name="asyncJob">The asynchronous job.</param>
|
||||
<returns>
|
||||
The result of the conversion.
|
||||
</returns>
|
||||
</member>
|
||||
<member name="T:SteamKit2.AsyncJob">
|
||||
<summary>
|
||||
The base class for awaitable versions of a <see cref="P:SteamKit2.AsyncJob.JobID"/>.
|
||||
Should not be used or constructed directly, but rather with <see cref="T:SteamKit2.AsyncJob`1"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.AsyncJob.JobID">
|
||||
<summary>
|
||||
Gets the <see cref="P:SteamKit2.AsyncJob.JobID"/> for this job.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.AsyncJob.Timeout">
|
||||
<summary>
|
||||
Gets or sets the period of time before this job will be considered timed out and will be canceled. By default this is 10 seconds.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJob.AddResult(SteamKit2.CallbackMsg)">
|
||||
<summary>
|
||||
Adds a callback to the async job's result set.
|
||||
</summary>
|
||||
<param name="callback">The callback.</param>
|
||||
<returns><c>true</c> if this result completes the set; otherwise, <c>false</c>.</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJob.SetFailed(System.Boolean)">
|
||||
<summary>
|
||||
Sets this job as failed, either remotely or due to a message timeout.
|
||||
</summary>
|
||||
<param name="dueToRemoteFailure">
|
||||
If set to <c>true</c> this job is marked as failed because Steam informed us of a job failure;
|
||||
otherwise, this job has failed due to a message timeout.
|
||||
</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJob.Heartbeat">
|
||||
<summary>
|
||||
Marks this job as having received a heartbeat and extends the job's timeout.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:SteamKit2.AsyncJob`1">
|
||||
<summary>
|
||||
Represents an awaitable version of a <see cref="T:SteamKit2.JobID"/>.
|
||||
Can either be converted to a TPL <see cref="T:System.Threading.Tasks.Task"/> with <see cref="M:SteamKit2.AsyncJob`1.ToTask"/> or can be awaited directly.
|
||||
</summary>
|
||||
<typeparam name="T">The callback type that will be returned by this async job.</typeparam>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJob`1.#ctor(SteamKit2.SteamClient,SteamKit2.JobID)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.AsyncJob`1" /> class.
|
||||
</summary>
|
||||
<param name="client">The <see cref="T:SteamKit2.SteamClient"/> that this job will be associated with.</param>
|
||||
<param name="jobId">The Job ID value associated with this async job.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJob`1.ToTask">
|
||||
<summary>
|
||||
Converts this <see cref="T:SteamKit2.AsyncJob`1"/> instance into a TPL <see cref="T:System.Threading.Tasks.Task`1"/>.
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJob`1.GetAwaiter">
|
||||
<summary>Gets an awaiter used to await this <see cref="T:SteamKit2.AsyncJob`1"/>.</summary>
|
||||
<returns>An awaiter instance.</returns>
|
||||
<remarks>This method is intended for compiler use rather than use directly in code.</remarks>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJob`1.AddResult(SteamKit2.CallbackMsg)">
|
||||
<summary>
|
||||
Adds a callback to the async job's result set. For an <see cref="T:SteamKit2.AsyncJob`1"/>, this always completes the set.
|
||||
</summary>
|
||||
<param name="callback">The callback.</param>
|
||||
<returns>Always <c>true</c>.</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJob`1.SetFailed(System.Boolean)">
|
||||
<summary>
|
||||
Sets this job as failed, either remotely or due to a message timeout.
|
||||
</summary>
|
||||
<param name="dueToRemoteFailure">
|
||||
If set to <c>true</c> this job is marked as failed because Steam informed us of a job failure;
|
||||
otherwise, this job has failed due to a message timeout.
|
||||
</param>
|
||||
</member>
|
||||
<member name="T:SteamKit2.AsyncJobMultiple`1">
|
||||
<summary>
|
||||
Represents an awaitable version of a <see cref="T:SteamKit2.JobID"/>.
|
||||
Can either be converted to a TPL <see cref="T:System.Threading.Tasks.Task"/> with <see cref="M:SteamKit2.AsyncJobMultiple`1.ToTask"/> or can be awaited directly.
|
||||
This type of async job can contain multiple callback results.
|
||||
</summary>
|
||||
<typeparam name="T">The callback type that will be returned by this async job.</typeparam>
|
||||
</member>
|
||||
<member name="T:SteamKit2.AsyncJobMultiple`1.ResultSet">
|
||||
<summary>
|
||||
The set of callback results for an <see cref="T:SteamKit2.AsyncJobMultiple`1"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.AsyncJobMultiple`1.ResultSet.Complete">
|
||||
<summary>
|
||||
Gets a value indicating whether this <see cref="T:SteamKit2.AsyncJobMultiple`1.ResultSet" /> is complete and contains every result sent by Steam.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.AsyncJobMultiple`1.ResultSet.Failed">
|
||||
<summary>
|
||||
Gets a value indicating whether the parent <see cref="T:SteamKit2.AsyncJobMultiple`1" /> received an incomplete result set and then encountered a remote failure.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.AsyncJobMultiple`1.ResultSet.Results">
|
||||
<summary>
|
||||
Gets a read only collection of callback results for this async job.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobMultiple`1.#ctor(SteamKit2.SteamClient,SteamKit2.JobID,System.Predicate{`0})">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.AsyncJob`1" /> class.
|
||||
</summary>
|
||||
<param name="client">The <see cref="T:SteamKit2.SteamClient"/> that this job will be associated with.</param>
|
||||
<param name="jobId">The Job ID value associated with this async job.</param>
|
||||
<param name="finishCondition">The condition that must be fulfilled for the result set to be considered complete.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobMultiple`1.ToTask">
|
||||
<summary>
|
||||
Converts this <see cref="T:SteamKit2.AsyncJob`1"/> instance into a TPL <see cref="T:System.Threading.Tasks.Task`1"/>.
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobMultiple`1.GetAwaiter">
|
||||
<summary>Gets an awaiter used to await this <see cref="T:SteamKit2.AsyncJob`1"/>.</summary>
|
||||
<returns>An awaiter instance.</returns>
|
||||
<remarks>This method is intended for compiler use rather than use directly in code.</remarks>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobMultiple`1.AddResult(SteamKit2.CallbackMsg)">
|
||||
<summary>
|
||||
Adds a callback to the async job's result set.
|
||||
</summary>
|
||||
<param name="callback">The callback.</param>
|
||||
<returns><c>true</c> if this result completes the set; otherwise, <c>false</c>.</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.AsyncJobMultiple`1.SetFailed(System.Boolean)">
|
||||
<summary>
|
||||
Sets this job as failed, either remotely or due to a message timeout.
|
||||
</summary>
|
||||
<param name="dueToRemoteFailure">
|
||||
If set to <c>true</c> this job is marked as failed because Steam informed us of a job failure;
|
||||
otherwise, this job has failed due to a message timeout.
|
||||
</param>
|
||||
</member>
|
||||
<member name="T:SteamKit2.MessageObject">
|
||||
<summary>
|
||||
Represents a <see cref="T:SteamKit2.KeyValue"/> backed MessageObject structure, which are often sent by the Steam servers.
|
||||
@@ -3840,6 +4092,60 @@
|
||||
The result of the operator.
|
||||
</returns>
|
||||
</member>
|
||||
<member name="T:SteamKit2.IDebugNetworkListener">
|
||||
<summary>
|
||||
This is a debug utility, do not use it to implement your business logic.
|
||||
|
||||
This interface is used for logging network messages sent to and received from the Steam server that the client is connected to.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.IDebugNetworkListener.OnIncomingNetworkMessage(SteamKit2.EMsg,System.Byte[])">
|
||||
<summary>
|
||||
Called when a packet is received from the Steam server.
|
||||
</summary>
|
||||
<param name="msgType">Network message type of this packet message.</param>
|
||||
<param name="data">Raw packet data that was received.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.IDebugNetworkListener.OnOutgoingNetworkMessage(SteamKit2.EMsg,System.Byte[])">
|
||||
<summary>
|
||||
Called when a packet is about to be sent to the Steam server.
|
||||
</summary>
|
||||
<param name="msgType">Network message type of this packet message.</param>
|
||||
<param name="data">Raw packet data that will be sent.</param>
|
||||
</member>
|
||||
<member name="T:SteamKit2.NetHookNetworkListener">
|
||||
<summary>
|
||||
Dump any network messages sent to and received from the Steam server that the client is connected to.
|
||||
These messages are dumped to file, and can be analyzed further with NetHookAnalyzer, a hex editor, or your own purpose-built tools.
|
||||
|
||||
Be careful with this, sensitive data may be written to the disk (such as your Steam password).
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.NetHookNetworkListener.#ctor">
|
||||
<summary>
|
||||
Will create a folder in path "%assembly%/nethook/%currenttime%/"
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.NetHookNetworkListener.#ctor(System.String)">
|
||||
<summary>
|
||||
Log to your own folder.
|
||||
</summary>
|
||||
<param name="path">Path to folder.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.NetHookNetworkListener.OnIncomingNetworkMessage(SteamKit2.EMsg,System.Byte[])">
|
||||
<summary>
|
||||
Called when a packet is received from the Steam server.
|
||||
</summary>
|
||||
<param name="msgType">Network message type of this packet message.</param>
|
||||
<param name="data">Raw packet data that was received.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.NetHookNetworkListener.OnOutgoingNetworkMessage(SteamKit2.EMsg,System.Byte[])">
|
||||
<summary>
|
||||
Called when a packet is about to be sent to the Steam server.
|
||||
</summary>
|
||||
<param name="msgType">Network message type of this packet message.</param>
|
||||
<param name="data">Raw packet data that will be sent.</param>
|
||||
</member>
|
||||
<member name="P:SteamKit2.UdpPacket.IsValid">
|
||||
<summary>
|
||||
Gets a value indicating whether this instance is valid.
|
||||
@@ -4356,7 +4662,7 @@
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamApps.PICSProductInfoCallback.ResponsePending">
|
||||
<summary>
|
||||
Gets if the are more product information responses pending
|
||||
Gets if there are more product information responses pending
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamApps.PICSProductInfoCallback.UnknownPackages">
|
||||
@@ -4507,6 +4813,7 @@
|
||||
<summary>
|
||||
Requests an app ownership ticket for the specified AppID.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.AppOwnershipTicketCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="appid">The appid to request the ownership ticket of.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamApps.AppOwnershipTicketCallback"/>.</returns>
|
||||
@@ -4515,6 +4822,7 @@
|
||||
<summary>
|
||||
Requests app information for a single app. Use the overload for requesting information on a batch of apps.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.AppInfoCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
|
||||
Consider using <see cref="o:SteamApps.PICSGetProductInfo"/> instead.
|
||||
</summary>
|
||||
@@ -4526,6 +4834,7 @@
|
||||
<summary>
|
||||
Requests app information for a single app. Use the overload for requesting information on a batch of apps.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.AppInfoCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
|
||||
Consider using <see cref="o:SteamApps.PICSGetProductInfo"/> instead.
|
||||
</summary>
|
||||
@@ -4537,6 +4846,7 @@
|
||||
<summary>
|
||||
Requests app information for a list of apps.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.AppInfoCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
|
||||
Consider using <see cref="o:SteamApps.PICSGetProductInfo"/> instead.
|
||||
</summary>
|
||||
@@ -4548,6 +4858,7 @@
|
||||
<summary>
|
||||
Requests app information for a list of apps.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.AppInfoCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
|
||||
Consider using <see cref="o:SteamApps.PICSGetProductInfo"/> instead.
|
||||
</summary>
|
||||
@@ -4559,6 +4870,7 @@
|
||||
<summary>
|
||||
Requests package information for a single package. Use the overload for requesting information on a batch of packages.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.PackageInfoCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
|
||||
Consider using <see cref="o:SteamApps.PICSGetProductInfo"/> instead.
|
||||
</summary>
|
||||
@@ -4570,6 +4882,7 @@
|
||||
<summary>
|
||||
Requests package information for a list of packages.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.PackageInfoCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
|
||||
Consider using <see cref="o:SteamApps.PICSGetProductInfo"/> instead.
|
||||
</summary>
|
||||
@@ -4591,15 +4904,27 @@
|
||||
<summary>
|
||||
Request the depot decryption key for a specified DepotID.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.DepotKeyCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="depotid">The DepotID to request a decryption key for.</param>
|
||||
<param name="appid">The AppID to request the decryption key for.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamApps.DepotKeyCallback"/>.</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamApps.PICSGetAccessTokens(System.Nullable{System.UInt32},System.Nullable{System.UInt32})">
|
||||
<summary>
|
||||
Request PICS access tokens for an app or package.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.PICSTokensCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="app">App id to request access token for.</param>
|
||||
<param name="package">Package id to request access token for.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamApps.PICSTokensCallback"/>.</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamApps.PICSGetAccessTokens(System.Collections.Generic.IEnumerable{System.UInt32},System.Collections.Generic.IEnumerable{System.UInt32})">
|
||||
<summary>
|
||||
Request PICS access tokens for a list of app ids and package ids
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.PICSTokensCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="appIds">List of app ids to request access tokens for.</param>
|
||||
<param name="packageIds">List of package ids to request access tokens for.</param>
|
||||
@@ -4609,6 +4934,7 @@
|
||||
<summary>
|
||||
Request changes for apps and packages since a given change number
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.PICSChangesCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="lastChangeNumber">Last change number seen.</param>
|
||||
<param name="sendAppChangelist">Whether to send app changes.</param>
|
||||
@@ -4619,6 +4945,7 @@
|
||||
<summary>
|
||||
Request product information for an app or package
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.PICSProductInfoCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="app">App id requested.</param>
|
||||
<param name="package">Package id requested.</param>
|
||||
@@ -4630,6 +4957,7 @@
|
||||
<summary>
|
||||
Request product information for a list of apps or packages
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.PICSProductInfoCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="apps">List of app ids requested.</param>
|
||||
<param name="packages">List of package ids requested.</param>
|
||||
@@ -4641,6 +4969,7 @@
|
||||
<summary>
|
||||
Request product information for a list of apps or packages
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.PICSProductInfoCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="apps">List of <see cref="T:SteamKit2.SteamApps.PICSRequest"/> requests for apps.</param>
|
||||
<param name="packages">List of <see cref="T:SteamKit2.SteamApps.PICSRequest"/> requests for packages.</param>
|
||||
@@ -4651,6 +4980,7 @@
|
||||
<summary>
|
||||
Request product information for an app or package
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.CDNAuthTokenCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="app">App id requested.</param>
|
||||
<param name="host_name">CDN host name being requested.</param>
|
||||
@@ -4660,6 +4990,7 @@
|
||||
<summary>
|
||||
Request a free license for given appid, can be used for free on demand apps
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.FreeLicenseCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="app">The app to request a free license for.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamApps.FreeLicenseCallback"/>.</returns>
|
||||
@@ -4668,6 +4999,7 @@
|
||||
<summary>
|
||||
Request a free license for given appids, can be used for free on demand apps
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamApps.FreeLicenseCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="apps">The apps to request a free license for.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamApps.FreeLicenseCallback"/>.</returns>
|
||||
@@ -5027,6 +5359,54 @@
|
||||
</summary>
|
||||
<value>The message.</value>
|
||||
</member>
|
||||
<member name="T:SteamKit2.SteamFriends.FriendMsgHistoryCallback">
|
||||
<summary>
|
||||
<para>This callback is fired in response to receiving historical messages.</para>
|
||||
See also <seealso cref="M:SteamKit2.SteamFriends.RequestOfflineMessages"/> and
|
||||
<seealso cref="M:SteamKit2.SteamFriends.RequestMessageHistory(SteamKit2.SteamID)"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamFriends.FriendMsgHistoryCallback.Result">
|
||||
<summary>
|
||||
Gets the result of the request.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamFriends.FriendMsgHistoryCallback.SteamID">
|
||||
<summary>
|
||||
Gets the SteamID of the user with whom these messages were exchanged.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamFriends.FriendMsgHistoryCallback.Messages">
|
||||
<summary>
|
||||
The messages exchanged with the user.
|
||||
Offline messages are marked by having set <see cref="P:SteamKit2.SteamFriends.FriendMsgHistoryCallback.FriendMessage.Unread"/> to <c>true</c>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:SteamKit2.SteamFriends.FriendMsgHistoryCallback.FriendMessage">
|
||||
<summary>
|
||||
Represents a single Message sent to or received from a friend
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamFriends.FriendMsgHistoryCallback.FriendMessage.SteamID">
|
||||
<summary>
|
||||
The SteamID of the User that wrote the message
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamFriends.FriendMsgHistoryCallback.FriendMessage.Unread">
|
||||
<summary>
|
||||
Whether or not the message has been read, i.e., is an offline message.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamFriends.FriendMsgHistoryCallback.FriendMessage.Message">
|
||||
<summary>
|
||||
The actual message
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamFriends.FriendMsgHistoryCallback.FriendMessage.Timestamp">
|
||||
<summary>
|
||||
The time (in UTC) when the message was sent
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:SteamKit2.SteamFriends.FriendAddedCallback">
|
||||
<summary>
|
||||
This callback is fired in response to adding a user to your friends list.
|
||||
@@ -5345,6 +5725,7 @@
|
||||
<summary>
|
||||
Sets the local user's persona name and broadcasts it over the network.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamFriends.PersonaChangeCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="name">The name.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamFriends.PersonaChangeCallback"/>.</returns>
|
||||
@@ -5359,6 +5740,7 @@
|
||||
<summary>
|
||||
Sets the local user's persona state and broadcasts it over the network.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamFriends.PersonaChangeCallback"/> callback.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="state">The state.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamFriends.PersonaChangeCallback"/>.</returns>
|
||||
@@ -5547,6 +5929,7 @@
|
||||
<summary>
|
||||
Ignores or unignores a friend on Steam.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamFriends.IgnoreFriendCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="steamId">The SteamID of the friend to ignore or unignore.</param>
|
||||
<param name="setIgnore">if set to <c>true</c>, the friend will be ignored; otherwise, they will be unignored.</param>
|
||||
@@ -5556,10 +5939,25 @@
|
||||
<summary>
|
||||
Requests profile information for the given <see cref="T:SteamKit2.SteamID"/>.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamFriends.ProfileInfoCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<param name="steamId">The SteamID of the friend to request the details of.</param>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamFriends.ProfileInfoCallback"/>.</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamFriends.RequestMessageHistory(SteamKit2.SteamID)">
|
||||
<summary>
|
||||
Requests the last few chat messages with a friend.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamFriends.FriendMsgHistoryCallback"/>
|
||||
</summary>
|
||||
<param name="steamId">SteamID of the friend</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamFriends.RequestOfflineMessages">
|
||||
<summary>
|
||||
Requests all offline messages.
|
||||
This also marks them as read server side.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamFriends.FriendMsgHistoryCallback"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamFriends.HandleMsg(SteamKit2.IPacketMsg)">
|
||||
<summary>
|
||||
Handles a client message. This should not be called directly.
|
||||
@@ -5920,6 +6318,18 @@
|
||||
</summary>
|
||||
<value>The CellID.</value>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamUser.LogOnDetails.LoginID">
|
||||
<summary>
|
||||
Gets or sets the LoginID. This number is used for identifying logon session.
|
||||
The purpose of this field is to allow multiple sessions to the same steam account from the same machine.
|
||||
This is because Steam Network doesn't allow more than one session with the same LoginID to access given account at the same time.
|
||||
If you want to establish more than one active session to given account, you must make sure that every session (to that account) has unique LoginID.
|
||||
By default LoginID is automatically generated based on machine's primary bind address, which is the same for all sessions.
|
||||
Null value will cause this property to be automatically generated based on default behaviour.
|
||||
If in doubt, set this property to null.
|
||||
</summary>
|
||||
<value>The LoginID.</value>
|
||||
</member>
|
||||
<member name="P:SteamKit2.SteamUser.LogOnDetails.AuthCode">
|
||||
<summary>
|
||||
Gets or sets the Steam Guard auth code used to login. This is the code sent to the user's email.
|
||||
@@ -6139,9 +6549,8 @@
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamUser.LogOff">
|
||||
<summary>
|
||||
Logs the user off of the Steam3 network.
|
||||
This method does not disconnect the client.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamUser.LoggedOffCallback"/>.
|
||||
Informs the Steam servers that this client wishes to log off from the network.
|
||||
The Steam server will disconnect the client, and a <see cref="T:SteamKit2.SteamClient.DisconnectedCallback"/> will be posted.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.SteamUser.SendMachineAuthResponse(SteamKit2.SteamUser.MachineAuthDetails)">
|
||||
@@ -6155,6 +6564,7 @@
|
||||
<summary>
|
||||
Requests a new WebAPI authentication user nonce.
|
||||
Results are returned in a <see cref="T:SteamKit2.SteamUser.WebAPIUserNonceCallback"/>.
|
||||
The returned <see cref="T:SteamKit2.AsyncJob`1"/> can also be awaited to retrieve the callback result.
|
||||
</summary>
|
||||
<returns>The Job ID of the request. This can be used to find the appropriate <see cref="T:SteamKit2.SteamUser.WebAPIUserNonceCallback"/>.</returns>
|
||||
</member>
|
||||
@@ -6181,37 +6591,6 @@
|
||||
then this will be <see cref="P:JobID.Invalid"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:SteamKit2.CallbackMsgExtensions">
|
||||
<summary>
|
||||
Useful extensions for ICallbackMsg
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.CallbackMsgExtensions.IsType``1(SteamKit2.ICallbackMsg)">
|
||||
<summary>
|
||||
Determines whether this callback is a certain type.
|
||||
</summary>
|
||||
<typeparam name="T">The type to check against.</typeparam>
|
||||
<returns>
|
||||
<c>true</c> if this callback is the type specified; otherwise, <c>false</c>.
|
||||
</returns>
|
||||
<exception cref="T:System.ArgumentNullException">
|
||||
<c>msg</c> is null.
|
||||
</exception>
|
||||
</member>
|
||||
<member name="M:SteamKit2.CallbackMsgExtensions.Handle``1(SteamKit2.ICallbackMsg,System.Action{``0})">
|
||||
<summary>
|
||||
Invokes the specified handler delegate if the callback matches the type parameter.
|
||||
</summary>
|
||||
<typeparam name="T">The type to check against.</typeparam>
|
||||
<param name="msg">The callback in question.</param>
|
||||
<param name="handler">The handler to invoke.</param>
|
||||
<returns>
|
||||
<c>true</c> if the callback matches and the handler was called; otherwise, <c>false</c>.
|
||||
</returns>
|
||||
<exception cref="T:System.ArgumentNullException">
|
||||
<c>msg</c> is null or <c>handler</c> is null.
|
||||
</exception>
|
||||
</member>
|
||||
<member name="T:SteamKit2.CallbackMsg">
|
||||
<summary>
|
||||
Represents the base object all callbacks are based off.
|
||||
@@ -6394,6 +6773,13 @@
|
||||
Gets the underlying <see cref="T:SteamKit2.SteamClient"/> for use in sending replies.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamKit2.ClientMsgHandler.ExpectDisconnection">
|
||||
<summary>
|
||||
Gets or sets whether or not the related <see cref="T:SteamKit2.SteamClient" /> should imminently expect the server to close the connection.
|
||||
If this is true when the connection is closed, the <see cref="T:SteamKit2.SteamClient.DisconnectedCallback"/>'s <see cref="P:SteamKit2.SteamClient.DisconnectedCallback.UserInitiated"/> property
|
||||
will be set to <c>true</c>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.ClientMsgHandler.#ctor">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:SteamKit2.ClientMsgHandler"/> class.
|
||||
@@ -7104,11 +7490,11 @@
|
||||
</summary>
|
||||
<param name="packet">The packet.</param>
|
||||
</member>
|
||||
<member name="M:SteamKit2.UdpConnection.SetNetEncryptionFilter(SteamKit2.NetFilterEncryption)">
|
||||
<member name="M:SteamKit2.UdpConnection.SetNetEncryptionFilter(SteamKit2.INetFilterEncryption)">
|
||||
<summary>
|
||||
Sets the network encryption filter for this connection
|
||||
</summary>
|
||||
<param name="filter">filter implementing <see cref="T:SteamKit2.NetFilterEncryption"/></param>
|
||||
<param name="filter">filter implementing <see cref="T:SteamKit2.INetFilterEncryption"/></param>
|
||||
</member>
|
||||
<member name="T:SteamKit2.NetMsgEventArgs">
|
||||
<summary>
|
||||
@@ -7166,11 +7552,11 @@
|
||||
</summary>
|
||||
<returns>The local IP.</returns>
|
||||
</member>
|
||||
<member name="M:SteamKit2.Connection.SetNetEncryptionFilter(SteamKit2.NetFilterEncryption)">
|
||||
<member name="M:SteamKit2.Connection.SetNetEncryptionFilter(SteamKit2.INetFilterEncryption)">
|
||||
<summary>
|
||||
Sets the network encryption filter for this connection
|
||||
</summary>
|
||||
<param name="filter">filter implementing <see cref="T:SteamKit2.NetFilterEncryption"/></param>
|
||||
<param name="filter">filter implementing <see cref="T:SteamKit2.INetFilterEncryption"/></param>
|
||||
</member>
|
||||
<member name="T:SteamKit2.KeyDictionary">
|
||||
<summary>
|
||||
@@ -7229,16 +7615,36 @@
|
||||
Decrypts an input byte array using AES/CBC/PKCS7 with a given key and IV
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.CryptoHelper.SymmetricEncryptWithIV(System.Byte[],System.Byte[],System.Byte[])">
|
||||
<summary>
|
||||
Performs an encryption using AES/CBC/PKCS7 with an input byte array and key, with a random IV prepended using AES/ECB/None
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.CryptoHelper.SymmetricEncrypt(System.Byte[],System.Byte[])">
|
||||
<summary>
|
||||
Performs an encryption using AES/CBC/PKCS7 with an input byte array and key, with a random IV prepended using AES/ECB/None
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.CryptoHelper.SymmetricEncryptWithHMACIV(System.Byte[],System.Byte[],System.Byte[])">
|
||||
<summary>
|
||||
Performs an encryption using AES/CBC/PKCS7 with an input byte array and key, with a IV (comprised of random bytes and the HMAC-SHA1 of the random bytes and plaintext) prepended using AES/ECB/None
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.CryptoHelper.SymmetricDecrypt(System.Byte[],System.Byte[])">
|
||||
<summary>
|
||||
Decrypts using AES/CBC/PKCS7 with an input byte array and key, using the random IV prepended using AES/ECB/None
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.CryptoHelper.SymmetricDecryptHMACIV(System.Byte[],System.Byte[],System.Byte[])">
|
||||
<summary>
|
||||
Decrypts using AES/CBC/PKCS7 with an input byte array and key, using the IV (comprised of random bytes and the HMAC-SHA1 of the random bytes and plaintext) prepended using AES/ECB/None
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.CryptoHelper.SymmetricDecrypt(System.Byte[],System.Byte[],System.Byte[]@)">
|
||||
<summary>
|
||||
Decrypts using AES/CBC/PKCS7 with an input byte array and key, using the random IV prepended using AES/ECB/None
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SteamKit2.CryptoHelper.VerifyAndDecryptPassword(System.Byte[],System.String)">
|
||||
<summary>
|
||||
Verifies and performs a symmetricdecrypt on the input using the given password as a key
|
||||
@@ -1,3 +1,30 @@
|
||||
------------------------------------------------------------------------------
|
||||
v 1.7.0 Dec 21, 2015
|
||||
------------------------------------------------------------------------------
|
||||
* Added awaitable API for job-based messages. APIs which returned a `JobID` now return an `AsyncJob<>`, which can be used to asynchronously await for results. (pr #170)
|
||||
* Added `SteamApps.PICSGetAccessTokens` overload with singular parameters. (pr #190)
|
||||
* Added `SteamFriends.RequestMessageHistory` and `SteamFriends.RequestOfflineMessages` (pr #193)
|
||||
* Added the ability to connect to Developer instances of Steam (`EUniverse.Dev`). If anyone at Valve is using this internally, hi!
|
||||
* Added the ability to set a `LoginID` in `SteamUser.LogOnDetails` so that multiple instances can connect from the same host concurrenctly. (pr #217)
|
||||
* Added `SteamClient.DebugNetworkListener` API to intercept and log raw messages. (pr #204)
|
||||
* Added the ability to dump messages in NetHook2 format for debugging purposes. (pr #204)
|
||||
* Upgraded the encryption protocol used to communicate with the Steam servers.
|
||||
* Implemented protection against man-in-the-middle attacks. (pr #214)
|
||||
* Server List will now maintain ordering from Steam, increasing the chances of a successful and geographically local connection. (pr #218)
|
||||
* After calling `SteamUser.LogOff` or `SteamGameServer.LogOff`, `SteamClient.DisconnectedCallback.UserInitiated` will be `true`. (pr #205)
|
||||
* Fixed a crash when parsing a Steam ID of the format '[i:1:234]'.
|
||||
* Fixed a crash when logging on in an enviromnent where the hard disk has no serial ID, such as Hyper-V.
|
||||
* Fixed a bug when parsing a KeyValue file that contains a `/` followed by a newline. (pr #187)
|
||||
* Updated Steam enums and protobufs.
|
||||
* Updated game-related GC messages and protobufs.
|
||||
|
||||
BREAKING CHANGES
|
||||
* SteamKit2 now requires .NET 4.5 or equivalent (Mono 3.0), or higher.
|
||||
* Removed obsoleted `ICallbackMsg` extension methods `IsType<>` and `Handle<>`. (pr #221)
|
||||
* Game Coordinator base messages are now generated per-game, instead of relying on Dota 2. GC messages should use the base messages for their game, which is separated by namespace. (pr #180)
|
||||
* Cell IDs are now consistently `uint`s within `SteamDirectory`.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
v 1.6.5 Oct 17, 2015
|
||||
------------------------------------------------------------------------------
|
||||
BIN
tools/ILMerge.doc
Normal file
BIN
tools/ILMerge.doc
Normal file
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user