From e480053f868283921739d387be775e7690c9080d Mon Sep 17 00:00:00 2001 From: JustArchi Date: Sun, 4 Dec 2016 01:07:37 +0100 Subject: [PATCH] Enhance Statistics This will be used for public list of ASF STM bots in the future --- ArchiSteamFarm/ArchiSteamFarm.csproj | 1 + ArchiSteamFarm/Bot.cs | 10 +++- ArchiSteamFarm/Events.cs | 2 +- ArchiSteamFarm/SharedInfo.cs | 1 + ArchiSteamFarm/Statistics.cs | 85 +++++++++++++++++++++++++++ ArchiSteamFarm/WebBrowser.cs | 22 +++---- GUI/Events.cs | 2 +- GUI/GUI.csproj | 3 + resources/Statistics.mwb | Bin 0 -> 6793 bytes 9 files changed, 111 insertions(+), 15 deletions(-) create mode 100644 ArchiSteamFarm/Statistics.cs create mode 100644 resources/Statistics.mwb diff --git a/ArchiSteamFarm/ArchiSteamFarm.csproj b/ArchiSteamFarm/ArchiSteamFarm.csproj index 007ec6914..3060a18ce 100644 --- a/ArchiSteamFarm/ArchiSteamFarm.csproj +++ b/ArchiSteamFarm/ArchiSteamFarm.csproj @@ -136,6 +136,7 @@ + diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index ebc26ab2d..0bcadbfeb 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -665,6 +665,9 @@ namespace ArchiSteamFarm { try { await SteamApps.PICSGetProductInfo(0, null); + if (Program.GlobalConfig.Statistics) { + Statistics.OnHeartBeat(this).Forget(); + } } catch { if (!IsConnectedAndLoggedOn || (HeartBeatFailures == byte.MaxValue)) { return; @@ -1210,7 +1213,7 @@ namespace ArchiSteamFarm { } if (Program.GlobalConfig.Statistics) { - ArchiWebHandler.JoinGroup(SharedInfo.ASFGroupSteamID).Forget(); + Statistics.OnLoggedOn(this).Forget(); } Trading.CheckTrades().Forget(); @@ -1320,7 +1323,10 @@ namespace ArchiSteamFarm { } if (callback.FriendID == SteamClient.SteamID) { - Events.OnStateUpdated(this, callback); + Events.OnPersonaState(this, callback); + if (Program.GlobalConfig.Statistics) { + Statistics.OnPersonaState(this, callback).Forget(); + } } else if ((callback.FriendID == LibraryLockedBySteamID) && (callback.GameID == 0)) { LibraryLockedBySteamID = 0; CheckOccupationStatus(); diff --git a/ArchiSteamFarm/Events.cs b/ArchiSteamFarm/Events.cs index 085220e26..0966611b1 100644 --- a/ArchiSteamFarm/Events.cs +++ b/ArchiSteamFarm/Events.cs @@ -38,6 +38,6 @@ namespace ArchiSteamFarm { Program.Shutdown(); } - internal static void OnStateUpdated(Bot bot, SteamFriends.PersonaStateCallback callback) { } + internal static void OnPersonaState(Bot bot, SteamFriends.PersonaStateCallback callback) { } } } \ No newline at end of file diff --git a/ArchiSteamFarm/SharedInfo.cs b/ArchiSteamFarm/SharedInfo.cs index 5fc5e450e..b476f2df0 100644 --- a/ArchiSteamFarm/SharedInfo.cs +++ b/ArchiSteamFarm/SharedInfo.cs @@ -43,6 +43,7 @@ namespace ArchiSteamFarm { internal const string LogFile = "log.txt"; internal const string ServiceDescription = "ASF is an application that allows you to farm steam cards using multiple steam accounts simultaneously."; internal const string ServiceName = "ArchiSteamFarm"; + internal const string StatisticsServer = "https://asf.justarchi.net"; internal const string VersionNumber = "2.1.7.0"; internal static readonly Version Version = Assembly.GetEntryAssembly().GetName().Version; diff --git a/ArchiSteamFarm/Statistics.cs b/ArchiSteamFarm/Statistics.cs new file mode 100644 index 000000000..1ac98c435 --- /dev/null +++ b/ArchiSteamFarm/Statistics.cs @@ -0,0 +1,85 @@ +/* + _ _ _ ____ _ _____ + / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___ + / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \ + / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | | +/_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_| + + Copyright 2015-2016 Łukasz "JustArchi" Domeradzki + Contact: JustArchi@JustArchi.net + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using SteamKit2; + +namespace ArchiSteamFarm { + internal static class Statistics { + internal static async Task OnHeartBeat(Bot bot) { + if (bot == null) { + ASF.ArchiLogger.LogNullError(nameof(bot)); + return; + } + + const string request = SharedInfo.StatisticsServer + "/api/HeartBeat"; + Dictionary data = new Dictionary(1) { + { "SteamID", bot.SteamID.ToString() } + }; + + // We don't need retry logic here + await Program.WebBrowser.UrlPost(request, data).ConfigureAwait(false); + } + + internal static async Task OnLoggedOn(Bot bot) { + if (bot == null) { + ASF.ArchiLogger.LogNullError(nameof(bot)); + return; + } + + await bot.ArchiWebHandler.JoinGroup(SharedInfo.ASFGroupSteamID).ConfigureAwait(false); + + const string request = SharedInfo.StatisticsServer + "/api/LoggedOn"; + Dictionary data = new Dictionary(4) { + { "SteamID", bot.SteamID.ToString() }, + { "HasMobileAuthenticator", bot.HasMobileAuthenticator ? "1" : "0" }, + { "SteamTradeMatcher", bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.SteamTradeMatcher) ? "1" : "0" }, + { "MatchEverything", bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.MatchEverything) ? "1" : "0" } + }; + + // We don't need retry logic here + await Program.WebBrowser.UrlPost(request, data).ConfigureAwait(false); + } + + internal static async Task OnPersonaState(Bot bot, SteamFriends.PersonaStateCallback callback) { + if ((bot == null) || (callback == null)) { + ASF.ArchiLogger.LogNullError(nameof(bot) + " || " + nameof(callback)); + return; + } + + string avatarHash = BitConverter.ToString(callback.AvatarHash).Replace("-", "").ToLowerInvariant(); + + const string request = SharedInfo.StatisticsServer + "/api/PersonaState"; + Dictionary data = new Dictionary(2) { + { "SteamID", bot.SteamID.ToString() }, + { "AvatarHash", avatarHash } + }; + + // We don't need retry logic here + await Program.WebBrowser.UrlPost(request, data).ConfigureAwait(false); + } + } +} \ No newline at end of file diff --git a/ArchiSteamFarm/WebBrowser.cs b/ArchiSteamFarm/WebBrowser.cs index b0516a4c9..e902f85b5 100644 --- a/ArchiSteamFarm/WebBrowser.cs +++ b/ArchiSteamFarm/WebBrowser.cs @@ -219,6 +219,17 @@ namespace ArchiSteamFarm { return null; } + internal async Task UrlPost(string request, IEnumerable> data = null, string referer = null) { + if (string.IsNullOrEmpty(request)) { + ArchiLogger.LogNullError(nameof(request)); + return false; + } + + using (HttpResponseMessage response = await UrlPostToResponse(request, data, referer).ConfigureAwait(false)) { + return response != null; + } + } + internal async Task UrlPostRetry(string request, ICollection> data = null, string referer = null) { if (string.IsNullOrEmpty(request)) { ArchiLogger.LogNullError(nameof(request)); @@ -428,17 +439,6 @@ namespace ArchiSteamFarm { } } - private async Task UrlPost(string request, IEnumerable> data = null, string referer = null) { - if (string.IsNullOrEmpty(request)) { - ArchiLogger.LogNullError(nameof(request)); - return false; - } - - using (HttpResponseMessage response = await UrlPostToResponse(request, data, referer).ConfigureAwait(false)) { - return response != null; - } - } - private async Task UrlPostToContent(string request, IEnumerable> data = null, string referer = null) { if (string.IsNullOrEmpty(request)) { ArchiLogger.LogNullError(nameof(request)); diff --git a/GUI/Events.cs b/GUI/Events.cs index f0b691e12..b040b7c50 100644 --- a/GUI/Events.cs +++ b/GUI/Events.cs @@ -31,7 +31,7 @@ namespace ArchiSteamFarm { internal static class Events { internal static void OnBotShutdown() { } - internal static void OnStateUpdated(Bot bot, SteamFriends.PersonaStateCallback callback) { + internal static void OnPersonaState(Bot bot, SteamFriends.PersonaStateCallback callback) { if (bot == null) { ASF.ArchiLogger.LogNullError(nameof(bot)); return; diff --git a/GUI/GUI.csproj b/GUI/GUI.csproj index f6ae2af71..199ca51d4 100644 --- a/GUI/GUI.csproj +++ b/GUI/GUI.csproj @@ -145,6 +145,9 @@ SharedInfo.cs + + Statistics.cs + Trading.cs diff --git a/resources/Statistics.mwb b/resources/Statistics.mwb new file mode 100644 index 0000000000000000000000000000000000000000..22149cc3d26bac0155d3c18cf91027fb79ae7411 GIT binary patch literal 6793 zcmZ`;Wl$X4k{#TFTY>}$!7^xYcY?b^aCeu$V1rw*!QF=d!3i#d5AGh^1BBoKmT%u~ zy{)a?+qbK$PWSoOU3KqiRRttuA^-q@4p>76%h8hg_&`Yjfc!%M0Ph90a5ndJv~==d zb@Vo4^>K7KHPUn6=1T(Q8E>A8z#YycP=bEWshwiva_3%iH&wRn4~r*$hjZd`%cWN3 zE_#vr@`$_-k^*JOv0vPs-I#vA$)T^Hk`+BI!e4!U=rI=gqP%ya zlyq_=pe(`gU`thReBxUxh-I5%WO>Q-X#4B~x~M7YFy7wrQhaw~b;fsX^Suj4M#kd# zC)<}Vd0m1%vA+hK_O=wRZ~V{79-r|rGRaa{sKq1z zQ=UjRr8J00gy4L~a!&f^W<+=A@-JEAy?NK09kIwkbQv+pXoOcrG?1`-6Y6^Xul6AvL>4?j%^puPPl)X>R!ajpZ|Av#7~xC?gBt;U-g{Da zWQ@|rUCm^5^lQXEk(?bFWyi<0UoCy>The~%jITp1pI$fX?xR=0G?y$G(^*{22w!;^ z!McfF_0PWwUTo6s81J{2P8BNtW?}m-j`wZY<)0f9i|@oRl0$V&I2>bI>FWxGn1#6I zh`5wV1*Dt_vDPA_vPAX!HilFZWYitufm&k*%p`RtYFb%M(NDO7dyqz#t3(yMel)+V zzd{=q%>T)~M~1WQMOW zWmk&PS1WHAONBAbN0A9LtFiQ?T!Iz9V+9%WEnlgNz00!= z^}W#B68cP{;;0c*-7o%g$5cEGr1jGW>)3Hk1!?1|{$m+>6DnZZ-kQXsYp3h1Qug?D z#NjXyUH^mT-0afW=3)5lLhwg9`!o~JLEO$gzn(URRa8$k9D^*djiD{Gg z#5Ek)0SReVR>!pCD{W0X1Cf)8^bKMnyp7k0{P%h?5~ zh>aXN<4(4*h;eUvRX5M=V%|QcTBOAXGijp~;#Z02Qr|uWQImv13Fd=ir6>uE2x_4x zx)*V^g|?AN&@EDli?dv#+JNBFSCO_*F&*L@{Q6RSNl1a%A4QMOrAa=XB;ws$ zxBTTgbfP|XY#V5F^hLbyhS`q&S$ebJC7JQWL{;)=+P1CiTXKfIajgm9(bnmIIVQ1TduxxX?FB3k%*WsUX>N<(I{_@&+{1Mik%<5gn@Yu-7)lQT z)YdRMEh3;^wNf%V4nb7Rbz6-SLpsc%$+?&20mi)_)w`FO2EMja#V9yS)O zdpxlj63PcmJT0Sc9`_tA!+J-x-Xy?a$O^UI<1uL%`sf00(+^aCpF-E+GS;|uNK!-o zMBE$218$|?3x)0dr=ecXmRy9^2{%qZk~AyBTC1=qW@yRRZrp{RmnO;@^4R*Hra~7x zI?kW-C27kjwi|qm{DP?52Nemi5U2fDAJ9GrtX5#B<%R{Bi=NlteMMlhD)pe57{^U$ zybQb<3&?p7I-t9ZfBU7M`3>D5@OL29*9k*7=9RK_C;^I-M276h-z#y0oW%JiL-7dW zZVIct3+ZI#Y2mkJh4DSML=96NBqS_11RbJ-H%??Rv2{U_7w18i?U+)_HY{g+CNs>} zA?P^|m$$5^E1C3!ey=$c(y_&F$s9ipVFN&1`AGO36Ahe#i-e{}EzM!i8{1V270DJL zWf>Wv6-c^6w4+aZynjRbgXCHC;*LM@Fq4(j|&$5jeQycfJ9Fdb#_uXq%m=A zyJunRgfd=njQk5PrM}%wGt<%iFVF_2rVY@wq&OBdV&TXPT;~xo zVp+%=sITllvahmpv6OX-h`oFUQ188=f1BhG2g~{M)gU>Rk zrk}N~I6HS+vZX)Au*1`67#?^>t9@yHFzpQxCc)%34*lUu)swD9BiPJQk_=n2-_nap zM<~*0w<6!W!nS5*Ng4%)vy*=mxMupUX0vE@uioyja4Fus$#zj}38sl6*PQe5j7jn6 zP|#g}ccIRveC(k>ES06Sd~CT)Iu!GzBN?QW5Ktw4G3QGmL<9`f4``iZ9Uv%LY>DK~ z`Bcb+6o>A%E=p*F+7w)FPEKP)ptS~FZ((ey21b9^p!9XPJZk&0jkfN~0icu*GViAV zcI#~g-XIAS;Ntp^9s-rrQ}e=62dS_?BYv}Qe|`D4tS2x?lUqm8nqRIGk~f2d9=D^G30zrI z8h{*)d_bQRR5c9W%0#Z6+L8h5_OU5~nSI|$F}{h8)09J_r|~^hm_ltW_-Md@70zU) z#`X2FDe_!>CgB@MsAX4|7Dvd(lu~bCccq|Ld-VEIoyJc`Q&*^(toGvEEWCajmbNDa z4@a_1LQ&MR1eHd+fOv8MbaX4N^ysBd(G>h@0eZ?(NHQ1jyVm$P( zhznwZY%xiINHhqN0IheTMDvruv|>oFGo6N{*k7&8-l?%mu_^YnKFKh?wo^3gR}W^g zhwtF`GV+NgiU+mQu0)q-&JSWJG-q$!vNE+)tDCAJK)(nkdw#E7`%v^(+v|{WaP9h` z$RBmb_^j|3X_>zUzNfUcA);0mHi_Ba!XqAX!6+7H;*oFwic?Ag@FMKv)NPe&r>O$^ z8v(>{iB~drNf<;VVMtS&$XXolwd!Y^rSJC3jM;Ei{07!~^KxUFK=rXT&QU}LRjb~L z(IJ20KXF7^XHZSyca;4C772dd8I4(M${X&3_VLbc8m^x_o5^SOE(lLfPhuc~Toh3r z^@ea0sMH^O#)P}8Ll-y0`W;NWF-Bsn;r)9kGDf01^!jT|1;Y8X@w(XiY1fIdY!nF{ zQ^&%)(P>!)vFn%mC=>bgX7w2SmK$ayHUZ2UVD5jTp>&JtJHXe);| zTg{iTH`T2nUMgZv_awi;Tl4+=yH-p(#Bkqj*W(lL0L@s7-i9rFBEyu$=FrlekTqSU zrD}F}XqSN}#dFM8uTAgkoe)|bU`Heqi^CV^aB+Xml59-kb0Yd!c&7**&dS+6cgb+k zfn$?b<$?lxR=RI^jo<6vY<}r^d^pS+{?XBc3z|U>IfTfbn-$wu9~oYQw$uaQoqW-i z?%yUlzf>*n^z3d9cj2nAK8HWGS(i$S3Ja5c{k)l_cbM0ER;4-{%aF9}xc}9S?l$O7x|g=dhWx+dGoS4`bL-b?lAZ7`&lT@;mu14RgPU+ zKq`~7f=B}oQ_bY3xjnnQKA9X))kgT7d|pZdR0VDzE+`6JPM{6Ai|3Z1(k(bY)+jIC z51GhUBZY?wjA+S|<*VN!Ri>QZYeFxU&OaW^)>^&=36H1BQ|4>-qG>~Q4pO?Z1&E`N zxWtl&(B_ME4!$lpa6XrfFc>FP zT}o~j*^y**=V)InFo$2Laoc(BOdiivwl1jVidVQrv^_(h?TuE3oxe^bn;k2loIVCe z%U-h$1?Zr)pub6ZLfLssM(t)!k`B76Jz_*k7T#JIT;KGpT2!ssMUKkU_Q^MU;o z0{(UeIqEv&vW>=DgMQ|~dtF7y0glE{`?Dp1jV+5M&6C;bgtz+gM*8$z`O5NXjwp*I zuAq_KZ`a^GM+FlOgE_}My+=XH^vOSFXHCj%@lpq~ZdU>>lH2RsVVY*p*2IPMQH2S- z|M{`Kp0RURLAD{QWMnqB=8O7R){yN)uu-z$nmxCvsY@zHrmgfL8@x26i*YH{itRo_ z9WIbxy=RoY8gIL^9$U(LIs2j*Slo}(x%OJ>Mg6vOM|<)bT>u+Ewjmt!(H01akGSag z+*TNtlqOS}C|dMnAEV|Vcvy@5Qq-podE_vrtERZ{d}0Lx<^1U>_rC9FfFxL{-aE z(dX*Mch;T1c|*4@djf$9Gmcrlv8_-{Uo~0;n`kSfJ?4>C2TUn7eVo6UI|v=DI|DW` zt8<|wuwRaBTG%;}(rTnnRMK};i@vaWpUfDgSsb$(?yk#@6RT%HLO$HGlPAMXtF{xn z-qVnI<8hXag!ZUbqR?xw>jvnf{ev1A1!^WTAfYor=H{n8#(X5!w5zH&f46St)aHjR zZy8qXqpx&-I(x$RoEDL=ngu15)c@-7AyiXtdPoxHIppKns+XPGZFEFRJkaSLV%|nL zXLvK>Pr?hm-(B-^Qd1hJaMx+G<_RPIz z$cal}R+=P?%lPHgCBOB_F&9YpG_Nxq?0{q=s?XmXkPG@Tj+z=S|Yn2%GeH z%cYE!`W6s&ETwIi+j^?rj4gj&a9FQdqH?9!b6aTi&wR4Y(_tRFmsGZuF3vkjvQYX_ zf{<~{Cg+t{doXKW2jpikqv9o$XQAz(mGsON-O+XPy7+OAF_au@7_iU9_ifp@XLqzw z%dlZA)z&RF5HkMm1{hWIDBI|ml?z-9-Lvi!vKWV%*t-%ih@58H81ykG#N(sP(6yoi z5lp)!JTS@&rGh>YO{GZBXcJe?3%jE*M?b7(TLwV(Jawi!F7?Ft8O9&@e^f2F%(ast zB~{RjWlxoS^i7|4`cNHhyQY`)olSrJMDE8GC1eZ-O_Uc1G<#(UH)r@^#IJ1XI_0Gm zBQaWDS${cc;2njmggrunM{PP&{E=l|Q4$%I9$kFJ1a^13+8W2U(O$lw!|0UJN$l51 z?jqE6yO79l#X)b-DGDl3^s|a?0J^6;p0kn+Tt)HDV~jCI<50=G?Fc-w@sQw5_Q}M7 z@d1@P-$bjwr5=~etzn{!Jg-caQcQlpbR$?1U2)}fFjU_9YwCNiQtD%E-{1Yk>~U+R zt-jm!P>I6l2ju~p2ibj0^7>`iB-Yl}eBQDsY3oXxD9S+JOvoUkmO@9*7T?U_Q0$uC zQ~M2jYdk4zB7IbfPc&D74rtR2!SG1VcpKW^04Y7jtPqs-6!Nk_iBFv)#0b}0>cS2^ zgx6&WkzU4)wajoaXJJrSCxZD4yuV1BReH_{88Tso*SnzX$78#@P%niZ$TE6LGM!Al zBf5P@uw2BolYC^Ll-v?~{#$nc%f;1aFUcDcUW3qYUZ8w@hqZDG-n}j5B?4>Zz3uRc z0XJcfM|j30R;FcG*auI_ichBT@u_<>4TuXhLVIML$h{GQ$E$e%DVRK zM9-5EQ^Od_3>D6ccf#X!oZ)oeZtO+->r-TM{X;x8cc8_IVzXCN70d#TG6HOuRzmr# zm&ls9`D2eXz?3LR@Hv-q9qgjMT3=^eL}O_*BF<-K?n$r)Wek3!t4|>p|ZkGG?){Ptyy6W zZn;G#lxZ^GM=M*3FH$l`ly98UAX}z}av5kj*4gfKyBnFFEzt941M>8rgzlrK}aq z&0Q-ZEuumHfi!|KQYhZPL?W!O8<(*|?ORu%EemT+wSF4zNR`lHocD^L-8wgO7Dpbq zieBQoyHIwII^x3&*YFI2kUy5U)!}Ww3xwgJtUpwd<9gJF8~086B?-(Sd2*~517l^Y zhvY(ktWlc~l8rsXd%-t6-Ft8lIzG_2PnSWjC&YRDe8Ru6u@b(ZDHQsLk=3)yho0e% zO6XAzQnLM*xAL?pPlWW8)xWguT(-Aay)#$enR`KPd$UfrvD-!H(}Z=6>|Qu**j9w; z)Ccs@oRex%I-ogPqDd5K#?H>}32XjaKXE>sTEWU!Ag83LA+JyN+(uyd=ih#pT|3Ct zGjY1MhK4(p&GLtNtviGMo37t!#xH>LEsm-J0wNL8|G$uVY0CdRO~LMD1DxjeLlSF#4ikF!11^^HQDEVrrDN^e= yyV;vrI+@#0D>++OI#8RsncLWUSyFSbvST{_gRr=p+gLi9x(oa(Wo+thh4~*srPVM1 literal 0 HcmV?d00001