From 1dbacd21884c49a61bbde7c6248bd4d5bfba2c34 Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sat, 10 Feb 2018 22:33:42 -0600 Subject: [PATCH] added 'none' and extra m16 variants to weapon list moved killstreak/deathstreak messages into configuration file cleaned up configuration manager fixed misc startup issue and threading added more importing stuff network id is a ulong now ip str is now ip added time played (per server) --- Admin/Manager.cs | 6 + Admin/Server.cs | 19 +- Admin/WebService.cs | 14 +- Admin/lib/SharedLibrary.dll | Bin 153600 -> 152064 bytes Plugins/SimpleStats/Helpers/StatManager.cs | 40 +++- Plugins/SimpleStats/Helpers/StreakMessage.cs | 63 +++++-- Plugins/SimpleStats/IW4Info.cs | 21 +++ .../SimpleStats/Models/EFClientStatistics.cs | 4 +- Plugins/SimpleStats/Pages/ClientMessages.cs | 2 + Plugins/SimpleStats/Pages/LiveStats.cs | 2 + Plugins/SimpleStats/Plugin.cs | 8 +- Plugins/SimpleStats/_Plugin.cs | 2 +- Plugins/Tests/Plugin.cs | 173 +++++++++++++++--- Plugins/VoteMap/Plugin.cs | 8 +- Plugins/Welcome/Plugin.cs | 2 +- SharedLibrary/Commands/NativeCommands.cs | 2 +- SharedLibrary/Database/Importer.cs | 58 ++++++ SharedLibrary/Database/Initializer.cs | 4 +- SharedLibrary/Database/Models/EFAlias.cs | 4 +- SharedLibrary/Database/Models/EFClient.cs | 8 +- SharedLibrary/Event.cs | 2 +- SharedLibrary/Helpers/AsyncStatus.cs | 5 + SharedLibrary/Helpers/ConfigurationManager.cs | 64 +------ SharedLibrary/Interfaces/IEntityService.cs | 2 +- SharedLibrary/Interfaces/ISerializable.cs | 2 +- SharedLibrary/Objects/Player.cs | 14 +- SharedLibrary/Server.cs | 2 +- SharedLibrary/Services/AliasService.cs | 2 +- SharedLibrary/Services/ClientService.cs | 8 +- SharedLibrary/Services/GenericService.cs | 68 ------- SharedLibrary/Services/PenaltyService.cs | 2 +- SharedLibrary/SharedLibrary.csproj | 1 - SharedLibrary/Utilities.cs | 19 +- 33 files changed, 418 insertions(+), 213 deletions(-) delete mode 100644 SharedLibrary/Services/GenericService.cs diff --git a/Admin/Manager.cs b/Admin/Manager.cs index d4b5d9201..958462be9 100644 --- a/Admin/Manager.cs +++ b/Admin/Manager.cs @@ -207,6 +207,12 @@ namespace IW4MAdmin if (Status.RunAverage > 1000 + UPDATE_FREQUENCY) Logger.WriteWarning($"Update task average execution is longer than desired for {(Status.Dependant as Server)} [{Status.RunAverage}ms]"); } + + if (Status.RequestedTask.Status == TaskStatus.Faulted) + { + Logger.WriteWarning($"Update task for {(Status.Dependant as Server)} faulted, restarting"); + Status.Abort(); + } } Thread.Sleep(UPDATE_FREQUENCY); diff --git a/Admin/Server.cs b/Admin/Server.cs index 015b138ad..0baa33750 100644 --- a/Admin/Server.cs +++ b/Admin/Server.cs @@ -380,6 +380,7 @@ namespace IW4MAdmin DateTime playerCountStart = DateTime.Now; DateTime lastCount = DateTime.Now; DateTime tickTime = DateTime.Now; + bool firstRun = true; override public async Task ProcessUpdatesAsync(CancellationToken cts) { @@ -388,6 +389,13 @@ namespace IW4MAdmin try #endif { + // first start + if (firstRun) + { + await ExecuteEvent(new Event(Event.GType.Start, "Server started", null, null, this)); + firstRun = false; + } + if ((DateTime.Now - LastPoll).TotalMinutes < 2 && ConnectionErrors >= 1) return true; @@ -596,7 +604,6 @@ namespace IW4MAdmin LogFile = new RemoteFile("https://raidmax.org/IW4MAdmin/getlog.php"); #endif Logger.WriteInfo("Log file is " + logPath); - await ExecuteEvent(new Event(Event.GType.Start, "Server started", null, null, this)); #if !DEBUG Broadcast("IW4M Admin is now ^2ONLINE"); #endif @@ -617,13 +624,13 @@ namespace IW4MAdmin else if (E.Type == Event.GType.Script) { - if (E.Origin == E.Target)// suicide/falling + /* if (E.Origin == E.Target)// suicide/falling await ExecuteEvent(new Event(Event.GType.Death, E.Data, E.Target, E.Target, this)); else - { + {*/ await ExecuteEvent(new Event(Event.GType.Kill, E.Data, E.Origin, E.Target, this)); - await ExecuteEvent(new Event(Event.GType.Death, E.Data, E.Target, E.Origin, this)); - } + //await ExecuteEvent(new Event(Event.GType.Death, E.Data, E.Target, E.Origin, this)); + // } } if (E.Type == Event.GType.Say && E.Data.Length >= 2) @@ -806,7 +813,7 @@ namespace IW4MAdmin } else - await Target.CurrentServer.ExecuteCommandAsync($"clientkick {Target.ClientNumber } \"^1Player Temporarily Banned: ^5{ Reason }\""); + await Target.CurrentServer.ExecuteCommandAsync($"clientkick {Target.ClientNumber } \"^7Player Temporarily Banned: ^5{ Reason }\""); #if DEBUG await Target.CurrentServer.RemovePlayer(Target.ClientNumber); diff --git a/Admin/WebService.cs b/Admin/WebService.cs index 6d1189391..f9647707c 100644 --- a/Admin/WebService.cs +++ b/Admin/WebService.cs @@ -232,7 +232,7 @@ namespace IW4MAdmin bool authed = querySet["IP"] == "127.0.0.1" || (await (ApplicationManager.GetInstance().GetClientService() as ClientService).GetPrivilegedClients()) - .Where(x => x.IPAddress == querySet["IP"]) + .Where(x => x.IPAddress == querySet["IP"].ConvertToIP()) .Where(x => x.Level > Player.Permission.Trusted).Count() > 0; @@ -384,7 +384,7 @@ namespace IW4MAdmin if (S != null) { // fixme - Func predicate = c => c.IPAddress == querySet["IP"]; + Func predicate = c => c.IPAddress == querySet["IP"].ConvertToIP(); Player admin = (await ApplicationManager.GetInstance().GetClientService().Find(predicate)).FirstOrDefault()?.AsPlayer(); if (admin == null) @@ -752,7 +752,7 @@ namespace IW4MAdmin contentType = GetContentType(), additionalHeaders = new Dictionary() }; - Func predicate = c => c.IPAddress == querySet["IP"] && c.Level > Player.Permission.Trusted; + Func predicate = c => c.IPAddress == querySet["IP"].ConvertToIP() && c.Level > Player.Permission.Trusted; bool authed = (await ApplicationManager.GetInstance().GetClientService().Find(predicate)).Count > 0 || querySet["IP"] == "127.0.0.1"; bool recent = false; @@ -765,7 +765,7 @@ namespace IW4MAdmin else if (querySet["npID"] != null) { - matchedPlayers.Add(await ApplicationManager.GetInstance().GetClientService().GetUnique(querySet["npID"])); + matchedPlayers.Add(await ApplicationManager.GetInstance().GetClientService().GetUnique(querySet["npID"].ConvertLong())); } else if (querySet["name"] != null) @@ -793,11 +793,11 @@ namespace IW4MAdmin PlayerInfo eachPlayer = new PlayerInfo() { - playerIP = pp.IPAddress, + playerIP = pp.IPAddressString, playerID = pp.ClientId, playerLevel = pp.Level.ToString(), playerName = pp.Name, - playernpID = pp.NetworkId, + playernpID = pp.NetworkId.ToString(), forumID = -1, authed = authed, showV2Features = false, @@ -815,7 +815,7 @@ namespace IW4MAdmin if (authed) eachPlayer.playerIPs = pp.AliasLink.Children - .Select(a => a.IPAddress) + .Select(a => a.IPAddress.ConvertIPtoString()) .Distinct() .ToList(); } diff --git a/Admin/lib/SharedLibrary.dll b/Admin/lib/SharedLibrary.dll index 0552f463b1d0e593a250961684612c34e5b3c0a9..c06a95ac181febd098d5bde0faad8b5d68707972 100644 GIT binary patch literal 152064 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 V`kt`iLtU?91N=Y!{{KgT{|78A4|o6o literal 153600 zcmd4437A|()&GBUyQh1mXC|RD(=*v1A&_uMCt(v95|pqb0sL zC?epBNZff}#0|xbMSKwz1Y{dfKm;PVzwXPc;x_z0-&1$%o=(tr`9HrrnOaU&opb8c zsZ*!w*1dh;E8pRjJkKlh_uO-ycQdj6t+H_A!CH!^&;Rmt?~8r+Z+`Q%1Mc7au-BbD zzTnJO_}bQSr!RQTac7(np0(ik6Bo4JaK?g@&seb6OJBC&^zeiemk$oswoFhTytn5a zFsTz7%FDv%V&Lr_}%-ySz2tdJO>M4IZt-hqhN-<$0@?w@y4Qq@sBB;Mr4^!>82S zL&a_XBv<~4H{a{=7Hl=mJ8Pe5-ZX>$>%nGzMAPz;g?=fv1OO;FK#~YH^Sqk3#2ebS zk1uQEO#ju)*}NkF4! zusQi)A%RHtq!cXi89y*I>)O$jg$631QAq&TO*KYw9eb7lP)z}r0Du~~8kV>)msE^| z$_Q$fiK8c&lga=Ix)zoIMJ)wbVrX06I~)nnlR5&A(HYRh$f4}_1dHG?M&@OIdO4n9 zaROu-0j#(hj6vBC7E`%4(+jpD4g$5D34F=V{gHUKRj{EJ5e5$;;nu2ye4rGMD1ykS z#XT|oC@+C8jnQ9W4iVMIdyreL;>Ta4kp4xAN7l60} z^rsdujhY#_+73>-*F2=!dS`}vus*o7F)!`paKg+`Z?jo#U7OXKUZ1|SF}F*to?)tb z_1-0i`)hU)1I#j}1{#EVmzT`lw(RXnZ(ytLjjy0W&9C^8%EFc8LJDia3zd2i!DzS} zVLX@O_5GEl)k?UEy!YgiX(+SrRlTjZ^_WG{xoI9MDjj1^1k87AP^5OXrdN@z@;!1` z$j{C#9xT_>nObrk*&WKY%F-RwmrX(Jmu8R79^V7#_?}{tsZ#d+NKv>K zfN*a?(V()~O5Z~g3H`3M{77|;jYHvGcor=yEpArAeL!S5dOY+j>0?r%ym+`d5;Bu& zqnDqAO;|KCzxF{VHrFG`#`l<;NK1V$wCk~UR!wvE9_nDD>RxGlKk(H?hRRKP>w3f_ zW10>#d6-&D2P@(J0EQ}KSJJ3b4UrkPsa|I4F-uF#Ip)~1ua`!T9B9tK3VMFIPw{^7}zX3nw)duc~)Ce6}XN~yWLboo(qaIgZlzL8Szk)ub3 z%(xm;y3caJ9iVThf(lk-o)4meEoPS3Cmm9jDZB=RdQt(h%#@}aU=-Y1v^lc2#+CpZ zBj^B@kj`nnc5)3cK9xk4zIPXJ{qx5UhEBYSh8d-Dguax6Gab1Iy(-7dUd(HRHkD)M zEy@)fVSf=W1ZnpX*4=2`@p6|{T)%*)Yef1G-?;0yzeAF4D`qIjIzwcr?+K1}IX zS=v|g+W2ZAM10g7iJ6CGKV;C!1q`er23!#Xi!f|{<$aCBZqipLgFdHQVm*PEylv^f zlmaZLgJsQsP-qMDS4d1&YBENLQ)SUwm4vS#nY8WkE}<qja6DpfGSiZVrC z_`&c98ugD1RIfOBbkZN}TRMm`j;^!XqXS;AEg1_OeazxuX8*7g%>ZN2)LN32Pw!gp z)q9p`tQlvGcikH{Hf>%pVBVnkoMC+W@i$NFz~;zouj(zFkqIO#jSjEV)>i zW@WYV8kpJ=H&2neH(mH#cl`G}=Zbc65Hf?Mw@YY3H35z3yZ-+Zl)g`2dc$> z#F|`gU|Z!&)%^Lp#sV~}ey=6G>QK)J)^pc-Prb5ksOr(SUJZ7q?b3mI)m$DXT65Zn zneyp=B<3i1iS-c?93lDCd+6g=65%p;e4Ee1d7pwKCHB^X8|#$DW4ClXmS*FT@*p}( zr~3gG0D36{$pR!9-=E9)cbQ01o-pQHz`0p>OPK6S-sZ$ip}N;P#AkD1hR%<6rs`#{ zW%02+gPZ+stX4|G)F0n0(cAS@tpvww+@4ah5kILYQpPE4zbUNp!3k8;Duog{RxAMk z<#Yf`09c#?ECFDv6krJeK?<-00Cdvfumk|~%KQFU z=3x${pBbG6=@N%cT8s(7v(g4eKG-IeDmKb?z5%*ft7R4jbCzs+?yn3sy}pG0tEYML z1M$0GXVrZc&aqtqR(sbCdVOZZWEWajA&$}DWGaQH5R7a$ST7sD^Y?ReAM(3Q(i>4s zz0L)R*Ev*a3{@MLhsvyVGkcxcsh8(3pFcA^6=b&Eaio~it&bY1(?sfY0$e`K>C9@{ ztaT^la&Fiw)%&eVMli9*BkR}>m0N$?aK)6f(RD#6OoQV;!e%V0_l4_ab{Exa;oUA# z4SyxOw5UE1KJ6gA;cpydF#NL;L(?nu>EW56q4(z2BJAC6oqX=O%Fqm)&KV|a-&;lT zY#ZzF^;E8n^f$Mx%$znkaxJ=H+fIYqc8>8cR|lIjtD{HsS2tti7=vXGH*Dmjr%ZW| z4HEMQ_nRGvQ+_eGEAJrE#})pt8D8_4 z)`_5NTqYI+l(p6m=u|+XMbH7Q*8`eY1ntr~2hd0nw73-mnpFf1wJrkW7eU6ZH+S0} z51KlkWAD*=E47^V;o57<4j(5~!?Q@7g-w|@Fupk!W6lkpNK>=; z2b#=%la+%EB7Qbb~RY43s%os zx@;w9pH}#VQx>dPNk=UsG%K%C&CqJT^Nd%#Sm<6e=g@stZk1FLaOFj0#`d>LuU+-f z!7E>#6z(`N?^P>D62f9|N zEvgG{*mLH&D;Fe~wq5d}t5?1-$q3ELOK3KBkJWtUH25? z@bt<*CAd{%6r%pUQx*5)j)%%^zmKg9ZG80e_JJZRkH_z&~cdomBI!27E39ZY|(h2JA1VeV-@b zF$NsXfHMT#-+-HDKwrQe4Y+j%{G-IKajdkq$$&o-u-||yGvE^fYRD?B-80|=0zPBF z7iYk)33#6YkIaBy6!0d3*2%yI#%@sZd`rqgv_5RfbxPi1$+s){geBjkCKA?54#e22BZ}G0J-&y>E*0hT7ENyLS@s_Qv zEuPm}Y4LFDIEx2b=UZI%ljYw0gqbi@)qJ1fwXUW-cq3LMF$nS_Fi6SS!Dw(H63cBx z$&?J*}^Tub*AyYT#Rdhkq|xHCZkl!(!6kx`)!iu@{4b zDsf)r)l@Oh|Im(tXLqAOPDQ=-1Z}Iq8X66bRdWm@!TEqLI|b9%`a@R5mWjc!??WC+ zYja9tt0qfwRAgvh+EHf2bOc*(^;dIZ8r1|zk=XpKiX+y11C=hwC{3K5P}0%T0YZ?M zc}7WRvC~^SWM~GPJ0!J=WcJR=6Ef3VugE~oiPD(Se{a6o@YeYh+xpFtT%Oh6Jj`#s zB?W0oAMJ1M?zi5Vg4m*!=kzz1`>m@}kPSt7Zhv#O-}+Pr)G(B1_czP<49R+4_B7cR zIJ#e;rny9HVo{qKVg~n&(UFnyi^vX@$G$@4imi?=bX%q)?TDQ%@9ApPUSgh^oTC9Y zfc2jFuiJ4G!V{LSz@;I#d~x#_;?tMUwEQ{Cx3Tz*%Xez-JJOrdZSLEf@z7jJdSskA z2}8~0y_>$Wke%PV;B+*r2pY)Q2X&b}W66^l-rUWfq7om35+m|?t-BD!3@^AC8qQ&t z()N!XOEbW4CNsMIFsZeqk~xA}mf5^AJo8#Vbj?+-*nD%>{DQpEZ+F{SXbO;d4h>?T z*ZP}7^Og=Y-(w6q8+D+O>WUjvgQcx{uXRU=PD|LGx9X^XMbb?>o0I*vr*A_Hns&r% zAATl5ELGaNwe=LlG?{|9*(_o;96jj_?rrT3j{atE>kx~b-=;BQf0fv<)-e>dUPEBs zRO@7APtUUB%AS*E&D5#=uV}x}^m>=4NjlHm5C4Jp9Zs4H?uU;k^JtR!wld#IGIuKT zP0NfVuDc)JFW>`7jeC^&R+70(8RzQz;l0Y-my|rD%)?3M31x0l;PwZ8Xpmb3c{-`{ zm@?nBj9KV#A}O${PZl$uQ`PSY(wyc_4(F`dN88cO{IwSE`&$1ijk>XIRwXt_D~+3;UiW&%y6+*ma04Fa=TI4G5M;tHesPa5WHKp z3chNg{MM=E?##Dh;}(g@WIT&}?aR4V&X@SzQuW6#rK>62_g)Nq5%BRX@Q3xB@TXwo z-0#PV%JEMW1#hEC%$`lBDL+&cDdSF4rsH{5Rx2M|PPHZAQ~&lLrswr>JYK_#q6zOW z6$Mua;V+bI#6MRQDdP~%Foenn?{Emyv)`@6f5+KxAR5ht#$SZ06hEuT(O}Og8aPDI zP{z^N#Aqm=({Ma*EqvQ2_)60ZA1)dA-YK4^DcOiUMUgTNAESj3l-EF}XUUQQ@~DsR zl;Fcz6Mr>Dj=w%78*#6qNEwF@&jozSJN`EF#@_>8T#;0^P2t@o!8@eprI=?FDc-u0 zjd&A9kunbNkl|Inv)@aFZ`TChY&9#zvlIpFEo$+ol8u;63HX$8_=XLi^1)T@{az+~ zdnfp|P_t6JP*Lzc;ls!a-vULEG7cYGIr^=9fHzW<<8tA9ae{AqH7mv2DRTIjdBV4i zqDUEsZ^ZB^--(Z1XMOyj1m8+EE5$1m1@9MsyC~U+#}q}%IDDgqPx;`3?fkJZu8$v@ z;A68Od~Bmq{&rWg5wB7dDdX^Q8bp7U@8oYg;p6^^&7A|(4CAB7^_N|P@V!`3q>RJI zi3j+U@5Hyg@Ex7tdxe^n;=>g=d@onB5g(=~QpVw%WB8OW;?p4pyYu?^F$uoo)XWL) zSS1@VTOAN7;}Fd?M9L?ElO78X>sNjJ_yo^u)ym;HNy$chqM}F{hX?aY2bC}2kqz5X zcuq|4ume{A@Ns0r&QRpAo~C3YK2=eqjKj*I09chzhc%mLI|=W}3Ep$mt`wiG$RT`# zl8u<{9tf3j2-!J+Q27*L+TWdp@3aKpS~UwkB!xR)$ws_JQKXDRgsTf8<%5ry!lih| zgonFFrXO!sD~IP|B^&XZ6h+E7JPQnu@)@3*Hw{l~7w~v%J__!oesk%_{FhB^&cRi1 z4S>C8&-a5bk_{0|Ggd)TZcQ~F z(m!~pkKah4*3g@X(UY4MmE&6!1z#qNZ&k7pvp?WAiZX6=@Dvzj<%8P@+!|W4`xLtx zKc#Z`Rh8mdxKnxK7n|d~(8`0aQCcf;vesW++FL0FTdHE2Jf3!~TnWEH`Czl`PNT&$ zmeG5WYipgu2WY}`cn1|1!+`2&|GZm{zZBjnD$Yq!x%ljc34UHbW-v>119s7p&so@8Na6}QpPDG9u>-{eDEYeq6@;em+(CWO!(FlgYWx_ z9KNTOY{btfij;Bqwl;jqcjDVy_3LXmt+A;@fQ^ZKc#lek)BNB=M_cDIDB|g;8Q;MPpTFAyRYzFn&7)l%}ViqC<=Zq zd|y$r5#OpPQpVxKihxh~;Fmc**@*pwkL#9Zv%jfkrT7j-<@ioT4(&ITY{Xwz6e;7- zE;F>sr)X`iXk5TuAAe_p_W`xzUV$Qq@IEEESD+|T#vxp82$fF}O813tf8o12!N}wND3+UT=WH zS9B$Ts2cvs==JelZ!c+3<&OCgWo`hvfZ;0nTDiQI#; z@NXpDMM)U{I~gADxgLc7AgA*Pt`{!5na5*@wANY#BktCrZU*+Z_9Z|5A=bh3(i(5f zYUoyAf9uMuM(f)o7wE}TFbOW6?m49CGrW53q4cRCkN1XVJhhfV7}~_EZ*tyHJ$szV z)r_H;^_kpwY(1W$9vZ3-h0hs(HSf%NJ@ls0Ej$XIf+htop&;p)uR`@Et#O_WUr@b{yZmmUJ;U4m065{_H~9M*f1g4dD#R~!&(SjY=YTVCJpJ&d(M|2Cz1bud@YhdT z|5CjMWqrI1N!gnoV)VMADBzs6rcIda4ZAMvjWTYYu*#y>$_M=fiG9#~K2Z2RoXnFy zX*!hRKPxK7&nj}$<&R1>;{Q?*>WOAuI(IU+Ru~h=18UYogUs`0 zb#RFcbq`fn=MOQQ!(a;=1OYqDTI*yq#~$XlxOshMFzRUOFif{*=I{U)CMvDBP#7YT ziZ?pcGqws9N$!E8#xIRwz;S+DGXt`cqk#K^$N zAkQA>QZ&>zb`>hcJej8)+FTnBHdT@dvP(n}kZ>~r2E6*f5SC&3*b!BV^NillmsirTUCuq0rRp^|LT#OtCc#RJlGg+yZdg$9rf9 zsF%LA{vaf;)hx13_l+JgIL3O;solpJ+@T>*w*E|=k#I{e3M93ly`(ge?2zhsDOQf~BCsfv70r!z)awE7@V_&P%;7QfL?irKIQpv;r>E`n|=s4zKL*eqsSp$ zreq^tswh&%A>G-KD&NMlWbq2&y)nVdIiK*pKv6l~QIW&DgOZJyb4BnfECB#HI)Ehr(0K>21oAH4n~vy$J3n5moAt`s z8rN3mh_*V)EqQZxPF|98f&P{QoB-mUfb||dhVqfBsdt$y0pOJ>z!CtCN&%K&T_}0W zkSiqWnjTH&8VmF;NUDGR>;bP;A7DE4=JsOz!_YcU*KX`i2%%S>>CKiuAY6#pgSO#X zCR~2FoTw6PLx`E#tlw)LDU=4TcH*`79E5Y$Y;Us^=MEXp(q+5rw8SCKaL!I~PDPjT z2tMPneJspJvgvz<-})eIwXRceC&4_9VK5l{w>{*R@PG*GJ}UnW1! z0M~-;2+Zt&>mH$bL_vL!1)?3-9^gXy_3>L1J?0!(dc0DRQ{WX!HewE(QD9}90l2iv=5(P&aO zKDDgafAM^@c)l&+c`vb6iuY9Hc-}+FM!dVCNEyd79uXEo`6AD|W;|aYcCS?M2*Iq; z(dXs4ldo5audgM1y;$T+@qUUNU;8TAi1$$xDdYHp1Nc(D$X71QC&bc^71XEy@5}Pl z;`xq*=a-7LQq1vq%JYFrHsS*mManpyUuZllU*tKL<$*kdYBgZD^$LR7BOS6l3Sh_h zcgpe@@pV_i*I^=GieIM4$&wRy@x@(X_)^C4^&;a-`66FuWn+A*Sc()(im%bx&pXDM zUY2J};d#-le_m&gRe!#f^yf&iU5bxT2$ z;1Ytl|I732IPrXc!t=3WtrTF!8YLU?@roj49A8*$=9%)2FRbG)#l>G0?7B&tbwFN;cxt6-CN8T6-ET<-5!KJkflUg0B#abk4=w0VeVuNo;ZFTs%>HJ)ZFO zMv*VY=PGhCI7i7we72%U8OPUN#+UM$3?{_I&lJq5Z$JhoiPn<|t+xneDSopeM~hQF z(R!1jNEt_KZ=zwvKT3Fhk60_k?^fh^ewUJsm_tE$R>twX zukoyWCZE5H!`_($hZ1zv$CE|trwOeO3S}w&fFeih{Yp0Cb&4Wo94$^e(S7AJT1SY? zNeXV*5Uo>0>*oorYlN~Ce^im9^${f-F^4YDQpVB36Ni@a8Lb;d<_-nrp$*LGQ$_1n z39XL{WhuT+k)!o7B^&XziXvqkt^JLb^2Kq_?OHG7TAL_XMKGsxo~ihG#`ZMv_1lE6 z&x(90{){5W*Y!#^;!i7zlyQ8$#Q0LaJ70T=rGpf#>Bd(VU#xTfpDw=snDBM8$d}@q z6gj?bRI(9&Nl~PXd|fD(-lgC>|4qKm5MTdD__|BvOYt`qIlk^xvJvCl zz?U+PFMJdDQa;m}?}>|_D5wo@Kxa5>tdH~dw4LEUER?1AAw`ZBtC46us3=m#(c(l8 zTFMt?klTvskZUbfaFPiBE4JdF@S)BW&!vQC?6-LSt|G_tV@fvSM-@fNIG#D`fM?}1 z`J5&W&r@&%L19OduU)Sftx7^`y-=3orxZC_Sai{PLQ$lQqs8tYTFQ5q&yAvayMk>S z^4I=%_Yp1e+?VkDL$Owhf1t?m{EU)~_-RFvGLC09=9A8*9@%0-;kur`ijxyj&`ApaTDlW<+1cwrIU6^4s`UGO!xSm>&m&}Ys-YMhRByN5be{oYoQGu&caHiuf6s;YtJQ6$e zXHWXvD5)mgab4(CYIM>>h(^jRIO zq(Sz?#2+8aE9h{TT?d%;?j0{*dUFRTeJ_$Ps4&2eiaChfShWMQyS&p}qupyo&FhXYr_m4Fs|>*sMeU4W183OFs(!yCubG;eGd zZyw%+uV*OCB=@h_GJGK|XZXR3T(q0;tRmPLUsKu#JUX)1kTU$SZng;uk9|^hqnnI`G84(`l3tLw=Un~KD{iOp~0>G&$z!JrW8gI1; zSq|Q2aZhl$4HW#!UTjBP6@RVuQs>|j3hkMvA6%LzFH4gFcXA81smFtwccICyH3k#)fVRPE&*Yl~;O zc>D@D-~}MP(qp>HwDT?!-BKu)eG88~Z41Eqw<}H+BEpdEmh%oK%1`kh-V)m7pO&@^?ldB&I9KIBM`BM?ezRzPV;fYNC zeJFc|TJtgL2UDBq5EmWlqL&fPU%7@|VwtkT$en7LQ;#|=csaR~Ul|-uG&24Q!k7)7 zY$$uCgr`0|8?k>G>&#$LA`&GcQ6ef(BKJ>GDkqdQpYp!178k7>QGoV$7Tdn{BNm;I z=dM-fmMlT0Tt%qyh)BtgNW8L*x`(A_-EY#k57#`qMa#=;M^bkre5G29^z&H$C{hDs zKccU_;nAeI6Tutt<9C3E=QEQ+H&h4L8Pd`H0iSqt{{F<@D6;J*)<3~Z{Bc{rTguwmBbO2MeX})!{w=*~)9h%)!>{w+ z{5<1+jEy^|7~c2`@CpZcq5oJw@d|uBQ-Qun$?(^br39Mff1l>v``uU4y^8g0f}Z-p zHHfqIv~>75ut|;+Y8)I-?ksjY(}LHK>YI2ptsI;{enO;z6G;UpDJvo!O}e28UQ6ZC z%aI|sZtK-+)Q$f|iD(%9M-p)#VVGtgN$eSWoM9XPJ2gc2#N3)%H@;%-^pf^e9M14&m`9e9or^(agK8&gg-iU zj*kGF&EE#*`1NqWtx~xEKb+(8MLx?2zD0A~Om(f@LOW481KoO7`snO)t9LGGv&xGq z&Q$l8Z1y@6J(9fsIg%Jmv+W?v&15gCMLHvPk8UvV1U~5iZ#UX{ zYB$)_HYX0xM&o!5sMZc7a{ES6vHfU zzPi|Z>Qdl%?cqhh!Z)d)r+F+E^-HQ0xSXGq7+~W066CksU-m5DLQ~90K7Q` zSONex-_@`L0F0UgSOUOXQ-CGf?~A&Z>TjZ#wuxXkyOrOPmV*tIbm%Ps;B6_u5(QzJ z0Dn*r=8sZgUY0ho1UN2F0hR!8MGCM4fVZarO8|IB3a|u#ccuVK0C-mlumpg2rvOU; zcuxwj1b{13fF%IDHw9P%z*Q;066m+~Y|DueZrxwH^@2M;IPU^|Xl&T8hRpq1<+ug! z=1cIetl5Xf+!lTtzxhmM$?|cZ$CYc}CyeiHy@Lr_(#N7Id|&1oGJIcVUv5s7@Eur1 z7J_QYX0F1LQ%Xx4C3C`k`;<5P{p~4d(oZSk2p}z5KHevKUlF|#y(YNi($dmROLnW+ zzJuo5hh5z#(XK%Ig>NHOc1%cWUsLi}kv&wR?nk#nfMX&*`UZ*MSh%0HylS82rb{={ zv-l1QlHx-t_M@+>CeyVN)}$lrXZ8E@Cu1SYNQ|d@L@DLz4kzXZ#M8G#EV5$p)LIYFkM0H<{*t`y1^nnP zH5a2cAdcIl)?;wKnZ1s<(3{^Myi=?d8@x+^O&y#9QHoXxJ?c@LKf}I!IR}{;%Lxs`psD^Hh%N~0Q;zL_+IG650dp%-ZO?h^Ts|&;QOlu4z5y# z303eTMQoIKZ?k6%E0#b)$&as^@~-M>u8tqwPtEYBQj7P|esE?fxSDv`UjE3US}b<_ zzW5&jb-%EZzN4Y_I{92Y1kM`82tdS75nHo zV6-x_%}fWK961_=3Rj`OD}tlI7b6fcXxxADkva>ksuKmGt|o6-_p9jOUub)C@!)2GQa~tqhYP zXj7{kob))=snr+dI`t*`f?=mGkAXPp%VG58dt{ToJWeuPs+q=$TMIVSAt9hc6kCVB zOKcrFJ?)T6=#Zj9ht#a2Lx#ydVcgcC9GnedHcu|NB=6HR^og~JK0OKUq)&{Yn=t#* zx%I$XywhRlyv>l4x!M4t|ENZ1Pa7SzSoF6?qW$X^Eat=y4K7QA4S`XtmxF6*a-NsiMEPiTD0bd6k1;N;cz@pY!HOS6ihJOIJx2lpjFTl13A=j9u>W-b?%rlhqF? z$4t)jCmSkwkRAE~r7c$Xmi79f6PHLn(Yf8f3G&j|fUVSl2q zBIVmRYWjlf@($+UYVh%-gQ?CQ_qud^D;_u7JZuW%`*RT0Dtc+uZ*Jj_FJ@7Ve{JMk z_)F69e-e1(p8(-`r~p64P#IlbZPx6geq(Hi>FkEL=zb(jk#L0ay^`H}5qy)twsDVt zOEu({HHm*GK=d26{uI>;o2hI&G}t$B8$}(PQ-@^YRG71aJ9ic*HVS8PUA9r(aJ3zj z^`6|pF+Ry^4_smLa{KJTbxWc%0ez%n!J=q?>d=&!Pc zW~ibGXe3P_^-91dG@Y0^yc&E_;3fH)^bV-kX6Wl7{LLnv{?ppRooDY9{_?e@YTtNc zPNCa>g6qU~1^)OFsrFyh*T{v>l8*mKfc7G=O8hsa-I|ZVW|aI$pit5+Y^1YI{6Oyn z;+(2?LO+4cF6y1=6!fl3yEYx`y(TzII`#&F`0up!BZbKkR>IeJ(vg)jVFSCnSzh%U zXW}1LSk&3X%iVDN3c3?_|RlSJBb~daMhKALIvdRssc??F-$lx&) zhBb%h!T9FH}V{f_&u7E_b9x+ z$8^x+?d3!VPx8l?O9#t<_z@}#eZp9@FbRT8R<@zaIJVF}Yu%KwH2ZQZapLv}CHAGF zh(Vl2YzymZ81>d4#}7yW!L}%xY@Cu#T5E=F`42GZU2%9&m@S%CZrE5fv8U3M8A9L%Z&LDYQ;azEc?gec=?|5mj5)T+X7qTlV$5n!K-VG}4=G~_doF55b zv#xV^v#E#4?=pq_NE9Zpv&E?=Qu)+tn`W4Dn`SYh(@}|u`s>8Y+)PqW5cLd2nn`^m z%#`ECA!}xmijcLU$p((6b1|(QvgX8vU(QnNNMSaU)IrT8>*%V&OtOYXrhO*m@N6cf zzPIKPZics6mwB`;u$|lHQOQFb@>#Htc;@LiRrBRtp1@hMeZv&nDEQG#CGSvYlyXH0 z^n4`2=Wgz#kdd=CnO%}cXm-i@>!OD=ne?W(bz)Q8wI<9r_>oEwrlNvbQZo=GW=RZW zauhkq(a0upG!M{7tri88xnPlUcqT`k_vuOX$8Sr`P}Q4wEY<6h$MWV~W%3#UU82_m zsqW4Jmbk@-(|={nPw}H!N`4cuun-$~Lt+tH#4=YA^O?Pp6UzmuSX6>o6cxmxX1Q2I zEfb5#Ni0UTC>A4S6cEeZ8Zze?=kRK9kHDJaCYQP1rPt11msgkUYnJ@J6qM}D z#ks`G$M=*SL>0?R7MDicgA{Ph-L}_zciHpaXL4LXaq4rjFz+S@zCX2HS6g(E=(E^$*nW3TAkm>KOBKl=;Y>Lq?0-`T__+?EI8b^xHc%u<^2;9MaugEPXMCG>(B!5W3kI%A&3&gB^Qfy{7-#pulkLJ1xGi*^AAtdoJP37DFEe!ZEhJk2 z+>XOkuwIFm2}P#971Z~w^u=3$Ha`zT5qpKziVMb0E%~levIdA^X6!WEW$bL$C&sR- z&4y948N%-k(f`!gH!C8d!sjV67*LT4bzfg@Mh1vea$_*R74YoI(?m4^~d{5vF>|g%G7=OU} zyb84WT;|-N67Oa7T(}46csGJ{F7K_ho6E?<>4Z+@Hmnh>4ja)3oRE!b1g-x?jR0e& z5d{s+tP2>sSP4H;hbP$U6s?PTo?DkTO9C0QBy0nldKhaX|0Hp;oswV~`F$1166{XG zychN(ZabwShF;NRgToIu^wy4{XN|7K`>1uKFtY?209gXXVbKy;LnG5}337O93G(wM z*@Ckf#_Rd(v;|)U_D%kZw%}RvA2hvrG30Z-dAaoFKtO)v!k3Va_ajL4<{+h=-Y|EN zawLc?0UNX>|Bqid6Fb0k_c=U_$Boc&3d=CCt!nxi5# zM^Qm@tX--(FIDSEVWv3}xHQKEU(_6HXk^+oCx@q+Q(QyNWf(upU#H%1wBX&%U#d3` zl=uu1q|JS6Eayq-%g9BCq@ZShp*-0|&E2-@t?lu=51FnVM%BU|>PRWu5y1S&g@==l zg)ddMBb6@hq4=hgH+BLJjX(ZMwSJ|wcA;>@VhNpe5H;^~PBJCHIq71M(ghCxf_+~z zz)|YDz|ndm#*o(CjA3TFHslzI?Fsf$Mbo7oy?pLh` zp0CzJs`c>m)w)-;*!GJrQ`*eEAFA?eii}2W**^9h$tg`Wezk@*|L`sW|bSzSl-8N`#Wwg1#; zs=tipDT*|jCy}txL^a)Ls)*54R2WTbmyYJiY8@%eMpH7=Xew@V!>yr_X&=oTo{eVi zhig2yW{lW_Oc_tS8;{keZ9H!w|4|#yQ=#8Eo@W9}#&b3m{YZfS16Mn{Z_o7Hh)={g zb@Pdet?!&VxeKF=<~9Sm%Le~+dZHT+B+pRt-&B+>@f|Z+vSI97iZu48k+8A%y~1$KwR4U;IX;i+(W@@y2F=5G7IJ|I7e)fA8wY z8=A7$G75za`qSAqYgmVTwGLz7HzDt#12_@2SNtioCN5})VT5@pT@sn#6uIakOEd+y z@)XX8-0c~yCc(d8YTWY*4F~GBT9MT44J1t6J|=a0YBOZbm3Dw=oT7rpS<_VGA|dc2 zMe%t`561?Ilvy*Mz<&N4d>ldTmAaLS)~dugm&st}UQEYr7$e8=c1(+$Ro#ZU&SnN@ z(<+jGqqyM0sAYZ|Mhs=MLi(dwVS1Fz3cCnn)Jz&&gn1m%CJ*9rcs482^-aFUp{V7h z{B^Exe7ns1H~#WDQSzRqKBj;ruGaD*l5ET_V4vd^!aVYn}d#F+>pbYAl4~|w*X7z5cB>4xsA>Dd#6sf zPMiG6DFSpZl!zlhESFQSi%Hl_z}0gSR1p$XRFI&xOC@-TT1N^q35sP&&{$6-XfBjB zTrDyf-hu>kcq+mCS?`Sx6}XU)L$JHYYp)i_d^ zo%~w4VMAB`KuI#0a(GprFPE-tLPt33e(O8(zHN$rV2$Y8_u!{fKmMq8?u_n2wZ#Yt zbDYV)UZg`foqppg=Ya@t5p0KRWJ%fULQ+)F6E#cJgpHKwWGW(tr6P(`zsx3?kunMh?(dW)g3IC6;2#2W zWS-pzxaB*!j{M|TsT_Oko;RivIX(j`opPKM8p+Xbo*^MBKOvFW>f)sL956ppnEu$1 z-TQUFrFu=sEe(EcgFsrv+a{@2i5vne0g=F-P6hT^6WIBFq!I+CXtKfT=nj>w8JNm| z;~q7R6xujtq7$1Eo#HmpS!<)!F1j3^iY~QJpS~-X+v88Cax2+>1*?nPe$qv56$3>tS!8p)~X;?ii6;(a1?wZi?o zs`prr=dm&&)6Y}AR+(k@o4ISUM*iT9!2HOCUnCuWnjrNDZ&JFlHwRtln{0*W4e-~T zF}5GDu?yMlk9nZS_z6R#w%9?!&V}Q7k0{lCf+urD|4Zl!{ujn`ihtK-W6<@e&+Z3c zN_7hI{{yR-JF zP(|~qHRUEN7vx^GN`lWz5bwh-+P(6tNpK#hcbPQhd_3u!73(g?7f8(P;rhlGXyQHf zLgp1d13)>`iVJTusWHy<`$5M2$0d^gKbEwl~Y0>%X{iJcw z^LrbTP2r0L+4&2XF1ncB)Ys>N#W5fazC^Hr*1w-RYrD1fqc0Y@F1kwSXeKV|+lFv1hIPv6#5>Mi5itr@9LTpYddjOOJPhKT>5{f1p=chiG zH3QQynBv>jI8vB-@>Xux@D&m_+SA!9OaY$2NzIX?HKBk4u2YvoJXght-yMQIW z{P|{B1PG-9;V4MEjU=adUG!jM&nr3E`!YfZZY9_N#xA;d54l;Q_* zMd*m4f{s|bR7dVs>quc{KQw5vA2xWaoc*v3uQfC>YrKBn2}tz|xAGmDQx6)iF1(*~{4Ijit(;KW?IYg>QeFxM@VvVB z%c&#dN1`xsRlD0LQn}mM=D7S53h+NupZ}*O$OhF>1BN<2tVrs39|=>(J5qI25$dR@ zppMoqRmX?aI#QUaqsCF{XyaK_M{8(g+SM_KXX==(XFH>h51<}wM5pK@Cd%G}OV=}f zt3mZS7pRZ#l6?Di6`va8+qb(Z3TDa5zDUVN{6a;MGQ331M+5Jq*ZPiW#pCMK?Fq!lW3FVKBQWyQ1f573vfF&Ov9uTq1j ztZ}5sE-S~6km4m{!bpv6LUgm5_`%(rb{3BfSuSpCe3L!~cM)s=BQw0SwI8Xg6IZv- zF7vkNjCHLo!Kr*32P51-%Ip1jTcq6^*cwk> zC+Fne7U}O2Gxnw6ZfX2e+nE_sA#ao`Dk#0R1evYV-&cE1Vu<4PN)N{diY#M;H(7Zv z!#h3?4#Q0euy6U8=02uwn|w|ig}v?KfKlPL$umNV7hw$Q%I`hKAlFyHqe9JB#RV@@ zZNc_=`Len)W;YaG&SM;n@rG z>DsX$?BSz%_wu&|>GYpY41NoY@3FV79h$!!w7?5*v!>@`2YIvn2(N`Bl?8tJCM`$A<4^)r`ln{7AitqTM(Pmb+3sF4-Rpu5F@6j@Pz=WkJu-J}&5N+0P7{aka_lvo&&MLW|!*yln zK}9%6*JWRKU6}khuYUdz3<|F}nT@k9_VBL7(hXAF+UhIZ5Ji=VqHvC^Yqem>zBv=% zE7oG({#B<{IBQB_GcTMorEsYVBefr2Mxgsgyf{N@V)yj;GFVRbT4nXqi?w=14z0a| zV1l=i;vEDGcIwdP@M^%Tqqe7+=QK$A!*uk1%3o^h^_>CCjK|>v`h&lg`W{C~e=soR z)`d0%e2`-cb$mZVc(4zDQH0KLJnTLZXsm40-&G#i%ZrIqD?3fQ@4zC6~ zxna!qC2xOke#ZMSedO?iK60p-_HloWolm~CjFDqK zuW|k5-M}re5q1(>wxoMEQ12C>zaHlY$bq#jm4lumv1pX_>*h3L5kdR{gu4N-BPJ>C z)iQ)m8fuK7PslLYPr|k-ZVt}Oem1W0 zn^N5^du+!&4gu&7HazW*-UG!pr~TQSqyw0BE{E8OuDucpdbOn@hH?S1ef;Epiit2X`ha!Pnf{8Pgs8XgfS%) zn776V!#y_8Ga;g97)|RLYl7?9x6_`fgq|rX^i0hv!D>$C4@ z=^I)aFaGEoRz2;T#tYM&_6=K3e+2L&ta&-yYXiL!3VMb4wqCI~xL)D!xbad6y;4-@ zm6~<*$}p`Kg0^1e;Ivm$$IJDJV;cIjJqR-U$y-%qlR3p*Z+atuA7Q@A;hr1llTgs7 zofV;jI}n==K9crHCG<&Ap-*bo(I>-X2-^CTgE!Qt;~5T2PC1&zXA#1K#b_OSV$UFD zL(asH;+Tp4Vu9%I-aL`PF6kQzp4Z3UbpD$4=CNZQE9h9PfW3p9qm}JwM?o8ML{4|?FzD(!)|1*FeK2g zC-hf$p+E9j1x>jcf&Y2wZDHe6kk-dp8S;;Y*>!ERgU*3AN;uHFiAc(%9O%c4$rl@w zDwG4QxG-dDivw-Ou&ZPepx6jGGp*PQJ$BZQ<180m$Hb0wyg~9$LZk&*6!p?q2ZE&<1aJ{&N4UF+_%JX<&gfGklbcLOrXDeD?&B)AU03v zaT^#ycu^txtEiwEY6&jWjIp&jBVsb)VK`4(SAL$FlUzghuq~c(frhrRAq_P)G*l{) zdUj(XQO|UfX2`53?VGe5p4yb+SRIJm596;mR!`9@4rm#xeITFM%+*L_KeCZJIuibl zKC%C~&m^D0-Nz2J6N>kzZqh=g%8vvHUzCcX!)Fm8EbB`YA@hBS&9Z(^;~{5TC0JHP zg~3p>4$Eqo3_+V^&B3V@@->kAP{|rt@oq(L*-Oy(1HfIdpW1lnQFooc=I|K)syDVR zf*a$6+#ADiOJxqCO;LRY3D#D*KzQD6TT?R=C^TzDelHehbcB>Hm2>SIESa2U7X(+qnMYq z+2XRt35xt!bo>wmk<9Ot(T$gpHOHd$0qd;g&4kIKCgoBF+dgk_G7Bq{`Q?gGwL^(* zGC!G4W|c6R6%}+)%{nHtVKM}5lQ{>cUC#C&@BLstmyf64JfESThl85A%vrAaLg`%Q z+RCGV#$Kf<`~#bqydg;4NSz$j$F3^j*0N@=1jz0%FT4CC?8l;!`3u|+^6+y!=u0I& zO7&bdlbc(`tXaDmXc#qD)6H=s5p^Q?&vdGFOm+2$seZH~rur+0ZK`9t@hncYiKas2 zuc#nqwallwv1a=H6&v!5Ro__Ams64t;Qln_q;t|6D@^(}UNq?)FK)`IP?NqJGs&d) z#@v+4S(-IpQ$J(LO}S-^M`6n8qH^N>$mMd(^t3ah`ESf<${8n2{%)KklbjB#r<|Fgb`)o*tOFdy6=rA-Po!L&pB3b(X_m{l z;_XfTYbN8@(nVVnd&ZtI*|yfxxp|l4_+jvQsf%(qDYYnGvuLyk`Xv&#*U+w6#PMZb zmB;Z^<7rs%mEQ}@;aW0+)!?~i(cB{Z`$7@0o36#D!a|{lAGHIJ+r(_N-Fcuo z#Au(Uh|zu>v5ofA>2jg2n+hRG1LEyp=HQ)#a#Z|&`7=?`%>k)rOP zeg=E^b(8n$&`IS@B_4(@)r$Li!2U?wa?v=^*jBXBE#HugJO4NxG4WF|h zKMJ>n*O4x;BlWpVeshCeeQj~_?ei&Q6KaJK|L-wS!1H{p@Jl;%e%5kSE*IkqU^Uzw zPDdxFHK&d0>DDe+AZsLNl{Cej)Lf@?S0Gz`-Q`A&r7kzVL9s43oE*_BS1gtsIJb4UX#2fp%g5e&5^9iKr5OA)jb3)Ivjwv*?n>FdPpFF^jkHit+tc|vc z?r?Azr4RSe+*qv&>Dr<1Q**ZGjcvyK7&}Olgg4EEnG=^<92>GoQP^v9%&5K|Ww*x_ z1HHSBrLvyb&(=1_2-bVuVDSa z^yXnC$8V?rWLZ#DP#ZO6jZTj0GJXg8wq(qPilMO^|#Wj;?+HCjjXNg$%VNBGkDCI{6hHYqgeUGx_6Anwqi;`W7 zBny4e2L{ZA+Q$wVT_36)eW+%AcrUviCp&#$pj#iRPI%tfO4}ff#B0<8H}%kOZG23u z?OGMDrATU{*s0hBf>dTNmwz(HzJdNb>DX(fV_$MQrYcUyF0|&k0@(>4FTkn7Oh#?e zguztZrR7vjth8=6t+Gl|Ow%%bl(H5sCs@queAJrb+V<7^cG<$UHU1mSiV^#zmieoA zqF$@lmU2-y>l#1wBih>t*^8t$@8cv_KX;c(Tc@i|+Wj5U?$4ynQ=e4YEUDe3-S4E` zhiA))xBCGIn*LqI-+2sRoy=^~`X~5b33M{?Bm;xAu+O5U%i zdxxz*Z$e((_n8;dcI*!dPNz0w|7NN>msUQKJ7a%yUZQ#5nzy;kdtOuikaP31xze$> z6a(xnFHwZq<|NAPEq`bxeP2lPvL-;3RZ+pDt7W>kY_<}r#zhM*3X`*AH)#~vO}3HL z;^0U+JyM~Tm~J$a-QYCFFY=ntuNPtfy|_XVdhs@5J9GGPK`&H@UMMQ)g<2N%BIjbS zg&WfgqljL#k(6FIl1?vFD81-LGu4Yr@Yve)BIn>^aIj&$a2)i+Z-+?MY3apJQoT@# z^g?k#FRaTQdSS>+ZtZ%J!~Z$G;P+d!FXac;plQ!_EMNHjma=yrcITU>H}9kpdV_y! zhDnNsb7jv%@c+EI{53ZlyPjz58kBDg1^31pcobtdE7%T1{`e1c&-F?$@dIoYzMC)> zeI}V8IWNV$98CKesq@;Zncw*p4Slv~cGw^>jjp{<5xVv+V$(J1bJFp981o|)qHBr@ zx~7(?u08c7RV*?z3`4r3TZ!LGJ$^inaNZ7^7ORLk^J(~{Fifg`rjdQs(yHHRYcs#t zMl&ir47AbSq>@&;`4>;^H`gi){kD$@7Y^2}<9tlGt>=35;ClWngX4OxU0S!UCr=-q z`m)tj{~D9Ny;?R4NV_zQZM%ywV)~?koUHs%mtJ?qeg;Ud8DC|Ba-qpIO(J@qOXQ-Aj6xq@zMtHTWD?_!Z42iZANh-LUuU!74 znf&vKRJflYXEwQ?Adk}V*&kmGE7|nuhff~xF+IMmagJ0tgfFYOa6dt9!G<*46=RKC z^Q@w@OoT5(g!$|o%3Rt#e0hG3fq`~G4Wxq7a%oc9!0b%iS==uB^*cjmQ@lP{bh~nR zVit>g`1fL#KFD9bR+hcT==WV_^VZR+amgbnZin=;!;1?R1U@Kkmu5N)W%If_YN2 zj?+2AWC+?0F>-LaDx~+M{_T_Lv$7uV@ATkq>+^@foSetK46XYky1#G6Zdc$-#+WQn}pyU@Digw=Krw9+S(pAVx0vy%nCRxC>Msr&XVz zbnFHuwk+dyWQqrrDs%^wpCsi+3YT&RU$HF_quXtgk>0Om^3 z%1O0$TqI+ap|lgtByT1Q?JVqTJI-I!InG}`rASWD$4J=u3!TIgEHjIxQWjA~1%az6 zGuB;*d3Vl~P5*z2soahhjuZ78T*ej0Gwp2Yc*e2yUZbW`c~0Hw&?ME(bAG7qNkXNZ!EYYTS&QPzmcE*uOr`}t%F*&@8jo}_NzeZWKF(q$*)+ly}imX+C3aJWt{ zUd&vLKc}*y(ta5{V|t)8cCyCQU#%L!{;K&u*H7rpC0vGkV}+cwq(AzX z6>@Bh!VZEHr8F+ZN$U_(%B)pj4{tZLVU#3r*1n(!J-eRRoHb74(ZRWhz>idjHBeO0 zLA6YswFOh0^o*T^|E1!89|d;8)3J#(F4!!zu^|n2Y`jNeGd46&y77^07M?oXgfVP# zP2~I%DnMkj1yEJ+HnK#a~u> z*nuKt(yO?GeYWk$nKp}lCyJP_*`0Smj0%(Ib|Fm})YSa7G03+r5Q7Rec@!5WvD#wV zZ6SH;4b+rTGlmWn&tIWfzb~yH9hMf4m4%FNZUGN5lC`tgg8K1)sG8sUDQwQop4kd$ z<7|&>Er%|qk6(FGYoNk&IG)rR$R4^b;?a}kenOk%5$tVXEDoq-<41xPgp)02ZfZK= z^t217Cliia%}h8<&2GX;S2Kpo=nq?O6A_$?+OGIz;eb|x(E+UqXqB@r!zM;nGrQkn z44D$OA0*`PDRb*>2z@bsSg9%Jk@o@nHh<~ddUMHs2P;`ez6LvPg6T0*XtQkj_}@_Z zwO^-5zj%HtGjR#?lezcr%)R?;?%hFQVSUsj9^jA1@w$h38_^hkq&N1T3KnPvj6bVM zcsK2MIo`r=62@Wx?Gq$Yx{%D5)L1+FDJ6Q!JA1Os?^x>qBE#TZ-$ND`XGF&Vgt%u- zyI&D&+MUFDw(YOMfQVNw`<{t zWj|iZq_7EkFp1=?QsajS`Tz|whP1kI&b+&2Ek@B0~IKT=Wh%WjtBkya(VonXy3 zD6x-|NRuZkf7dv?9Bhl$swChkSTp!Nfwc}6O8;}GH+!D9x82`&y|1?SzMA!((MWsG za{oxA9r7Nle44JNW4Q0UGF&k(XUtp_znU5=yqH`8~OYM0ZEXu2+p zeMJ42K4-lRO+rUXvoX!KfNBRj+n&x!m&SC1aBMr#;78)A61-BCzoW{XlC)nJSSt!S zf!3y5X>O=~hj(vZ!nac~_n_MKv)a*5J*am59LoENW_RmnqS?(gMd5bR&*fbBbd*lz z9R1!7`n?%_w|6x;^XaH=^s`S#4V!!tc^!qkR(!SK)Juw!BcRKjdIL2C@|a$B>BQJE z{c68-lEc%*H+`r6Gz9c&{;;!C{M!En_FMk)`PJj;7VrZ$zaE97?Ce7K2G1V*2gArX zewPwE`fr`6m&aUQN^9;?YYQ7(t7J#sd(qe2bY&+t?pmR!;GBL>5$oAw#O9p-mrb3g zjh+f|P8AiVj#{RNHU%D9FU-kjXRk@Qv9qwvl4eucT{ARx`r6siHA7=Z*9^r3)3_Ti z9oGyEm3657nqdyl#;WifZb#&=t#&>pC2u$K589YK0rj>qIdN>ljmcA#IP>;G%ok3_ z>;1@JW=xJlCixI_xEn%>yYYQRbnQuEb2t8ILvW`JfeINOMTH?y%hcV_>t;E@FSHTN zJ%0BNlTpN>Xd@{*Xe71SQ;AGzH-d?~&z!K26d5w(y8Rud9NtaNvS6FE$+_ZP#~BLZ z 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 diff --git a/Plugins/SimpleStats/Helpers/StatManager.cs b/Plugins/SimpleStats/Helpers/StatManager.cs index fcc305bb3..d1caf6fcf 100644 --- a/Plugins/SimpleStats/Helpers/StatManager.cs +++ b/Plugins/SimpleStats/Helpers/StatManager.cs @@ -15,13 +15,16 @@ namespace StatsPlugin.Helpers { private Dictionary Servers; private Dictionary ContextThreads; + private Dictionary StreakMessages; private ILogger Log; private IManager Manager; + public StatManager(IManager mgr) { Servers = new Dictionary(); ContextThreads = new Dictionary(); + StreakMessages= new Dictionary(); Log = mgr.GetLogger(); Manager = mgr; } @@ -44,6 +47,7 @@ namespace StatsPlugin.Helpers int serverId = sv.GetHashCode(); var statsSvc = new ThreadSafeStatsService(); ContextThreads.Add(serverId, statsSvc); + StreakMessages.Add(serverId, new StreakMessage(sv)); // get the server from the database if it exists, otherwise create and insert a new one var server = statsSvc.ServerSvc.Find(c => c.ServerId == serverId).FirstOrDefault(); @@ -157,7 +161,7 @@ namespace StatsPlugin.Helpers public async Task AddScriptKill(Player attacker, Player victim, int serverId, string map, string hitLoc, string type, string damage, string weapon, string killOrigin, string deathOrigin) { - AddStandardKill(attacker, victim); + await AddStandardKill(attacker, victim); var statsSvc = ContextThreads[serverId]; @@ -180,12 +184,19 @@ namespace StatsPlugin.Helpers await statsSvc.KillStatsSvc.SaveChangesAsync(); } - public void AddStandardKill(Player attacker, Player victim) + public async Task AddStandardKill(Player attacker, Player victim) { int serverId = attacker.CurrentServer.GetHashCode(); var attackerStats = Servers[serverId].PlayerStats[attacker.ClientNumber]; // set to access total time played attackerStats.Client = attacker; + + if (victim == null) + { + Log.WriteError($"Stats: Victim is null"); + return; + } + var victimStats = Servers[serverId].PlayerStats[victim.ClientNumber]; // update the total stats @@ -194,6 +205,15 @@ namespace StatsPlugin.Helpers // calculate for the clients CalculateKill(attackerStats, victimStats); + // show encouragement/discouragement + var streakMessageGen = StreakMessages[serverId]; + string streakMessage = (attackerStats.ClientId != victimStats.ClientId) ? + streakMessageGen.MessageOnStreak(attackerStats.KillStreak, attackerStats.DeathStreak) : + streakMessageGen.MessageOnStreak(-1, -1); + + if (streakMessage != string.Empty) + await attacker.Tell(streakMessage); + // immediately write changes in debug #if DEBUG var statsSvc = ContextThreads[serverId]; @@ -209,10 +229,16 @@ namespace StatsPlugin.Helpers /// Stats of the victim public void CalculateKill(EFClientStatistics attackerStats, EFClientStatistics victimStats) { - attackerStats.Kills += 1; - attackerStats.SessionKills += 1; - attackerStats.KillStreak += 1; - attackerStats.DeathStreak = 0; + bool suicide = attackerStats.ClientId == victimStats.ClientId; + + // only update their kills if they didn't kill themselves + if (!suicide) + { + attackerStats.Kills += 1; + attackerStats.SessionKills += 1; + attackerStats.KillStreak += 1; + attackerStats.DeathStreak = 0; + } victimStats.Deaths += 1; victimStats.SessionDeaths += 1; @@ -224,6 +250,8 @@ namespace StatsPlugin.Helpers attackerStats.Client = null; // update after calculation + attackerStats.TimePlayed += (int)(DateTime.UtcNow - attackerStats.LastActive).TotalSeconds; + victimStats.TimePlayed += (int)(DateTime.UtcNow - victimStats.LastActive).TotalSeconds; attackerStats.LastActive = DateTime.UtcNow; victimStats.LastActive = DateTime.UtcNow; } diff --git a/Plugins/SimpleStats/Helpers/StreakMessage.cs b/Plugins/SimpleStats/Helpers/StreakMessage.cs index 0bc04b9e6..f1a390219 100644 --- a/Plugins/SimpleStats/Helpers/StreakMessage.cs +++ b/Plugins/SimpleStats/Helpers/StreakMessage.cs @@ -1,4 +1,6 @@ -using System; +using SharedLibrary; +using SharedLibrary.Helpers; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -8,30 +10,55 @@ namespace StatsPlugin.Helpers { public class StreakMessage { - public static string MessageOnStreak(int killStreak, int deathStreak) + private ConfigurationManager config; + + public StreakMessage(Server sv) { - String Message = ""; - switch (killStreak) + config = new ConfigurationManager(sv); + + // initialize default messages + if (config.GetProperty>("KillstreakMessages") == null) { - case 5: - Message = "Great job! You're on a ^55 killstreak!"; - break; - case 10: - Message = "Amazing! ^510 kills ^7without dying!"; - break; + var killstreakMessages = new Dictionary() + { + { -1, "Try not to kill yourself anymore" }, + { 5, "Great job! You're on a ^55 killstreak!" }, + { 10, "Amazing! ^510 kills ^7without dying!" }, + { 25, "You better call in that nuke, ^525 killstreak!" } + }; + config.AddProperty(new KeyValuePair("KillstreakMessages", killstreakMessages)); } - switch (deathStreak) + if (config.GetProperty>("DeathstreakMessages") == null) { - case 5: - Message = "Pick it up soldier, you've died ^55 times ^7in a row..."; - break; - case 10: - Message = "Seriously? ^510 deaths ^7without getting a kill?"; - break; + var deathstreakMessages = new Dictionary() + { + { 5, "Pick it up soldier, you've died ^55 times ^7in a row..." }, + { 10, "Seriously? ^510 deaths ^7without getting a kill?" }, + }; + config.AddProperty(new KeyValuePair("DeathstreakMessages", deathstreakMessages)); } + } - return Message; + /// + /// Get a message from the configuration encouraging or discouraging clients + /// + /// how many kills the client has without dying + /// how many deaths the client has without getting a kill + /// message to send to the client + public string MessageOnStreak(int killStreak, int deathStreak) + { + var killstreakMessage = config.GetProperty>("KillstreakMessages"); + var deathstreakMessage = config.GetProperty>("DeathstreakMessages"); + + string message = ""; + + if (killstreakMessage.ContainsKey(killStreak)) + message =killstreakMessage[killStreak]; + else if (deathstreakMessage.ContainsKey(deathStreak)) + message = deathstreakMessage[deathStreak]; + + return message; } } } diff --git a/Plugins/SimpleStats/IW4Info.cs b/Plugins/SimpleStats/IW4Info.cs index 76fa08823..f5a7cc1ec 100644 --- a/Plugins/SimpleStats/IW4Info.cs +++ b/Plugins/SimpleStats/IW4Info.cs @@ -60,6 +60,7 @@ namespace StatsPlugin public enum WeaponName { + none = 0, defaultweapon_mp = 1, riotshield_mp = 2, beretta_mp = 3, @@ -1333,7 +1334,27 @@ namespace StatsPlugin ak74u_silencer_thermal_mp, ak74u_silencer_xmags_mp, ak74u_thermal_xmags_mp, + m16_fmj_thermal_mp, + m16_fmj_xmags_mp, + m16_gl_heartbeat_mp, + m16_gl_reflex_mp, + m16_gl_silencer_mp, + m16_gl_thermal_mp, + m16_gl_xmags_mp, m16_reflex_silencer_mp, + m16_heartbeat_reflex_mp, + m16_heartbeat_shotgun_mp, + m16_heartbeat_silencer_mp, + m16_heartbeat_thermal_mp, + m16_heartbeat_xmags_mp, + m16_reflex_shotgun_mp, + m16_reflex_xmags_mp, + m16_shotgun_silencer_mp, + m16_shotgun_thermal_mp, + m16_shotgun_xmags_mp, + m16_silencer_thermal_mp, + m16_silencer_xmags_mp, + m16_thermal_xmags_mp, m40a3_mp, peacekeeper_mp, dragunov_mp, diff --git a/Plugins/SimpleStats/Models/EFClientStatistics.cs b/Plugins/SimpleStats/Models/EFClientStatistics.cs index bf264e562..bd0f87ae0 100644 --- a/Plugins/SimpleStats/Models/EFClientStatistics.cs +++ b/Plugins/SimpleStats/Models/EFClientStatistics.cs @@ -28,12 +28,14 @@ namespace StatsPlugin.Models [NotMapped] public double KDR { - get => Deaths == 0 ? Kills : Math.Round((float)Kills / (float)Deaths, 2); + get => Deaths == 0 ? Kills : Math.Round(Kills / (double)Deaths, 2); } [Required] public double SPM { get; set; } [Required] public double Skill { get; set; } + [Required] + public int TimePlayed { get; set; } [NotMapped] public int SessionKills { get; set; } diff --git a/Plugins/SimpleStats/Pages/ClientMessages.cs b/Plugins/SimpleStats/Pages/ClientMessages.cs index cd23b3791..d5f441c6d 100644 --- a/Plugins/SimpleStats/Pages/ClientMessages.cs +++ b/Plugins/SimpleStats/Pages/ClientMessages.cs @@ -10,6 +10,8 @@ namespace StatsPlugin.Pages { public class ClientMessages : HTMLPage { + public ClientMessages() : base(false) { } + public override string GetContent(NameValueCollection querySet, IDictionary headers) { StringBuilder S = new StringBuilder(); diff --git a/Plugins/SimpleStats/Pages/LiveStats.cs b/Plugins/SimpleStats/Pages/LiveStats.cs index aee30f0d1..ab074e3ab 100644 --- a/Plugins/SimpleStats/Pages/LiveStats.cs +++ b/Plugins/SimpleStats/Pages/LiveStats.cs @@ -10,6 +10,8 @@ namespace StatsPlugin.Pages { public class LiveStats : HTMLPage { + public LiveStats() : base(false) { } + public override string GetContent(NameValueCollection querySet, IDictionary headers) { StringBuilder S = new StringBuilder(); diff --git a/Plugins/SimpleStats/Plugin.cs b/Plugins/SimpleStats/Plugin.cs index bc6ff0999..c9ec151f1 100644 --- a/Plugins/SimpleStats/Plugin.cs +++ b/Plugins/SimpleStats/Plugin.cs @@ -71,6 +71,8 @@ namespace StatsPlugin string[] killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0]; if (killInfo.Length >= 9 && killInfo[0].Contains("ScriptKill")) await Manager.AddScriptKill(E.Origin, E.Target, S.GetHashCode(), S.CurrentMap.Name, killInfo[7], killInfo[8], killInfo[5], killInfo[6], killInfo[3], killInfo[4]); + else + await Manager.AddStandardKill(E.Origin, E.Target); break; case Event.GType.Death: break; @@ -84,14 +86,14 @@ namespace StatsPlugin { var serverStats = new GenericRepository(); return serverStats.Find(s => s.Active) - .Sum(c => c.TotalKills).ToString(); + .Sum(c => c.TotalKills).ToString("#,##0"); } string totalPlayTime() { var serverStats = new GenericRepository(); - return serverStats.GetQuery(s => s.Active) - .Sum(c => c.TotalPlayTime).ToString(); + return Math.Ceiling((serverStats.GetQuery(s => s.Active) + .Sum(c => c.TotalPlayTime) / 3600.0)).ToString("#,##0"); } manager.GetMessageTokens().Add(new MessageToken("TOTALKILLS", totalKills)); diff --git a/Plugins/SimpleStats/_Plugin.cs b/Plugins/SimpleStats/_Plugin.cs index 59cce204b..0fb7aa670 100644 --- a/Plugins/SimpleStats/_Plugin.cs +++ b/Plugins/SimpleStats/_Plugin.cs @@ -66,7 +66,7 @@ namespace StatsPlugin ManagerInstance.GetMessageTokens().Add(new MessageToken("TOTALPLAYTIME", GetTotalPlaytime)); ClientStatsSvc = new SharedLibrary.Services.GenericService(); - ServerSvc = new SharedLibrary.Services.GenericService() + ServerSvc = new SharedLibrary.Services.GenericService(); ChatDB = new ChatDatabase("Database/ChatHistory.rm", ManagerInstance.GetLogger()); diff --git a/Plugins/Tests/Plugin.cs b/Plugins/Tests/Plugin.cs index 1bfe2b064..5df15f00d 100644 --- a/Plugins/Tests/Plugin.cs +++ b/Plugins/Tests/Plugin.cs @@ -11,6 +11,7 @@ using SharedLibrary.Interfaces; using SharedLibrary.Helpers; using SharedLibrary.Objects; using System.Text.RegularExpressions; +using StatsPlugin.Models; namespace IW4MAdmin.Plugins { @@ -59,10 +60,11 @@ namespace IW4MAdmin.Plugins public async Task OnLoadAsync(IManager manager) { Interval = DateTime.Now; + var clients = new List(); + var oldClients = new Dictionary(); #region CLIENTS if (File.Exists("import_clients.csv")) { - var clients = new List(); manager.GetLogger().WriteVerbose("Beginning import of existing clients"); var lines = File.ReadAllLines("import_clients.csv").Skip(1); @@ -81,34 +83,38 @@ namespace IW4MAdmin.Plugins return; } - if (fields[1].Contains("0110") || fields[0] == string.Empty || fields[1] == string.Empty || fields[6] == string.Empty) + if (fields[1].Substring(0, 5) == "01100" || fields[0] == string.Empty || fields[1] == string.Empty || fields[6] == string.Empty) continue; if (!Regex.Match(fields[6], @"^\d+\.\d+\.\d+.\d+$").Success) - continue; + fields[6] = "0"; var client = new Player() { + // for link + ClientId = Convert.ToInt32(fields[2]), Name = fields[0], - NetworkId = fields[1], - IPAddress = fields[6], + NetworkId = fields[1].Trim().ConvertLong(), + IPAddress = fields[6].ConvertToIP(), Level = (Player.Permission)Convert.ToInt32(fields[3]), Connections = Convert.ToInt32(fields[5]), LastConnection = DateTime.Parse(fields[7]), }; clients.Add(client); + oldClients.Add(client.ClientId, client); } - - clients = clients - .GroupBy(c => c.NetworkId, (key, c) => c.FirstOrDefault()) - .ToList(); +//#if DO_IMPORT + clients = clients.Distinct().ToList(); clients = clients .GroupBy(c => new { c.Name, c.IPAddress }) .Select(c => c.FirstOrDefault()) .ToList(); + //newClients = clients.ToList(); + //newClients.ForEach(c => c.ClientId = 0); + manager.GetLogger().WriteVerbose($"Read {clients.Count} clients for import"); try @@ -116,10 +122,11 @@ namespace IW4MAdmin.Plugins SharedLibrary.Database.Importer.ImportClients(clients); } - catch(Exception e) + catch (Exception e) { manager.GetLogger().WriteError("Saving imported clients failed"); } +//#endif } #endregion #region PENALTIES @@ -144,20 +151,20 @@ namespace IW4MAdmin.Plugins return; } - if (fields[2].Contains("0110") || fields[2].Contains("0000000") || fields.Any(p => p == string.Empty)) + if (fields[2].Contains("0110") || fields[2].Contains("0000000")) continue; try { - + var expires = DateTime.Parse(fields[6]); var when = DateTime.Parse(fields[5]); var penalty = new Penalty() { Type = (Penalty.PenaltyType)Int32.Parse(fields[0]), - Expires = expires == DateTime.MinValue ? when : expires, - Punisher = new SharedLibrary.Database.Models.EFClient() { NetworkId = fields[3]}, - Offender = new SharedLibrary.Database.Models.EFClient() { NetworkId = fields[2]}, + Expires = expires == DateTime.MinValue ? when : expires, + Punisher = new SharedLibrary.Database.Models.EFClient() { NetworkId = fields[3].ConvertLong() }, + Offender = new SharedLibrary.Database.Models.EFClient() { NetworkId = fields[2].ConvertLong() }, Offense = fields[1], Active = true, When = when, @@ -172,15 +179,133 @@ namespace IW4MAdmin.Plugins manager.GetLogger().WriteVerbose($"Could not import penalty with line {line}"); } } + //#if DO_IMPORT SharedLibrary.Database.Importer.ImportPenalties(penalties); manager.GetLogger().WriteVerbose($"Imported {penalties.Count} penalties"); + //#endif + } + #endregion + #region CHATHISTORY + // load the entire database lol + var cls = manager.GetClientService().Find(c => c.Active).Result; + + if (File.Exists("import_chathistory.csv")) + { + var chatHistory = new List(); + manager.GetLogger().WriteVerbose("Beginning import of existing messages"); + foreach (string line in File.ReadAllLines("import_chathistory.csv").Skip(1)) + { + string comma = Regex.Match(line, "\".*,.*\"").Value.Replace(",", ""); + string[] fields = Regex.Replace(line, "\".*,.*\"", comma).Split(','); + + fields.All(f => + { + f = f.StripColors().Trim(); + return true; + }); + + if (fields.Length != 4) + { + manager.GetLogger().WriteError("Invalid chat history import file... aborting import"); + return; + } + try + { + int cId = Convert.ToInt32(fields[0]); + var linkedClient = oldClients[cId]; + + var newcl = cls.FirstOrDefault(c => c.NetworkId == linkedClient.NetworkId); + if (newcl == null) + newcl = cls.FirstOrDefault(c => c.Name == linkedClient.Name && c.IPAddress == linkedClient.IPAddress); + int newCId = newcl.ClientId; + + var chatMessage = new EFClientMessage() + { + Active = true, + ClientId = newCId, + Message = fields[1], + TimeSent = DateTime.Parse(fields[3]), + ServerId = Math.Abs($"127.0.0.1:{Convert.ToInt32(fields[2]).ToString()}".GetHashCode()) + }; + + chatHistory.Add(chatMessage); + } + + catch (Exception e) + { + manager.GetLogger().WriteVerbose($"Could not import chatmessage with line {line}"); + } + } + manager.GetLogger().WriteVerbose($"Read {chatHistory.Count} messages for import"); + SharedLibrary.Database.Importer.ImportSQLite(chatHistory); + } + #endregion + #region STATS + if (File.Exists("import_stats.csv")) + { + var stats = new List(); + manager.GetLogger().WriteVerbose("Beginning import of existing client stats"); + + var lines = File.ReadAllLines("import_stats.csv").Skip(1); + foreach (string line in lines) + { + string[] fields = line.Split(','); + + if (fields.Length != 9) + { + manager.GetLogger().WriteError("Invalid client import file... aborting import"); + return; + } + + try + { + if (fields[0].Substring(0, 5) == "01100") + continue; + + long id = fields[0].ConvertLong(); + var client = cls.First(c => c.NetworkId == id); + + var time = Convert.ToInt32(fields[8]); + double spm = time < 60 ? 0 : Math.Round(Convert.ToInt32(fields[1]) * 100.0 / time, 3); + if (spm > 1000) + spm = 0; + + var st = new EFClientStatistics() + { + Active = true, + ClientId = client.ClientId, + ServerId = Math.Abs("127.0.0.1:28965".GetHashCode()), + Kills = Convert.ToInt32(fields[1]), + Deaths = Convert.ToInt32(fields[2]), + SPM = spm, + Skill = 0 + }; + stats.Add(st); + } + catch (Exception e) + { + continue; + } + } + + manager.GetLogger().WriteVerbose($"Read {stats.Count} clients stats for import"); + + try + { + SharedLibrary.Database.Importer.ImportSQLite(stats); + } + + catch (Exception e) + { + manager.GetLogger().WriteError("Saving imported stats failed"); + } } #endregion } public async Task OnTickAsync(Server S) { - + return; if ((DateTime.Now - Interval).TotalSeconds > 1) { var rand = new Random(); @@ -188,16 +313,16 @@ namespace IW4MAdmin.Plugins var p = new Player() { Name = $"Test_{index}", - NetworkId = $"_test_{index}", + NetworkId = (long)$"_test_{index}".GetHashCode(), ClientNumber = index, Ping = 1, - IPAddress = $"127.0.0.{index}" + IPAddress = $"127.0.0.{index}".ConvertToIP() }; if (S.Players.ElementAt(index) != null) await S.RemovePlayer(index); - // await S.AddPlayer(p); - + // await S.AddPlayer(p); + Interval = DateTime.Now; if (S.ClientNum > 0) @@ -221,8 +346,8 @@ namespace IW4MAdmin.Plugins eventLine = new string[] { "ScriptKill", - attackerPlayer.NetworkId, - victimPlayer.NetworkId, + attackerPlayer.NetworkId.ToString(), + victimPlayer.NetworkId.ToString(), new Vector3(rand.Next(minimapInfo.MaxRight, minimapInfo.MaxLeft), rand.Next(minimapInfo.MaxBottom, minimapInfo.MaxTop), rand.Next(0, 100)).ToString(), new Vector3(rand.Next(minimapInfo.MaxRight, minimapInfo.MaxLeft), rand.Next(minimapInfo.MaxBottom, minimapInfo.MaxTop), rand.Next(0, 100)).ToString(), rand.Next(50, 105).ToString(), @@ -237,11 +362,11 @@ namespace IW4MAdmin.Plugins eventLine = new string[] { "K", - victimPlayer.NetworkId, + victimPlayer.NetworkId.ToString(), victimPlayer.ClientNumber.ToString(), rand.Next(0, 1) == 0 ? "allies" : "axis", victimPlayer.Name, - attackerPlayer.NetworkId, + attackerPlayer.NetworkId.ToString(), attackerPlayer.ClientNumber.ToString(), rand.Next(0, 1) == 0 ? "allies" : "axis", attackerPlayer.Name.ToString(), diff --git a/Plugins/VoteMap/Plugin.cs b/Plugins/VoteMap/Plugin.cs index e47c32425..83606c413 100644 --- a/Plugins/VoteMap/Plugin.cs +++ b/Plugins/VoteMap/Plugin.cs @@ -40,7 +40,7 @@ namespace Votemap_Plugin // we only want to allow a vote during a vote session if (voting.voteInSession) { - if (voting.ClientHasVoted(E.Origin.NetworkId)) + if (voting.ClientHasVoted(E.Origin.NetworkId.ToString())) await E.Origin.Tell("You have already voted. Use ^5!vc ^7to ^5cancel ^7your vote"); else { @@ -51,7 +51,7 @@ namespace Votemap_Plugin await E.Origin.Tell("^1" + E.Data + " is not a recognized map"); else { - voting.CastClientVote(E.Origin.NetworkId, votedMap); + voting.CastClientVote(E.Origin.NetworkId.ToString(), votedMap); await E.Origin.Tell("You voted for ^5" + votedMap.Alias); } } @@ -72,9 +72,9 @@ namespace Votemap_Plugin if (voting.voteInSession) { - if (voting.ClientHasVoted(E.Origin.NetworkId)) + if (voting.ClientHasVoted(E.Origin.NetworkId.ToString())) { - voting.CancelClientVote(E.Origin.NetworkId); + voting.CancelClientVote(E.Origin.NetworkId.ToString()); await E.Origin.Tell("Vote cancelled"); } diff --git a/Plugins/Welcome/Plugin.cs b/Plugins/Welcome/Plugin.cs index 412214e76..a5307230e 100644 --- a/Plugins/Welcome/Plugin.cs +++ b/Plugins/Welcome/Plugin.cs @@ -95,7 +95,7 @@ namespace Welcome_Plugin try { CountryLookupProj.CountryLookup CLT = new CountryLookupProj.CountryLookup("Plugins/GeoIP.dat"); - await E.Owner.Broadcast($"^5{newPlayer.Name} ^7hails from ^5{CLT.lookupCountryName(newPlayer.IPAddress)}"); + await E.Owner.Broadcast($"^5{newPlayer.Name} ^7hails from ^5{CLT.lookupCountryName(newPlayer.IPAddressString)}"); } catch (Exception) diff --git a/SharedLibrary/Commands/NativeCommands.cs b/SharedLibrary/Commands/NativeCommands.cs index 4eae89f6c..64dbb12b9 100644 --- a/SharedLibrary/Commands/NativeCommands.cs +++ b/SharedLibrary/Commands/NativeCommands.cs @@ -854,7 +854,7 @@ namespace SharedLibrary.Commands { StringBuilder message = new StringBuilder(); var names = new List(E.Target.AliasLink.Children.Select(a => a.Name)); - var IPs = new List(E.Target.AliasLink.Children.Select(a => a.IPAddress).Distinct()); + var IPs = new List(E.Target.AliasLink.Children.Select(a => a.IPAddress.ConvertIPtoString()).Distinct()); await E.Target.Tell($"[^3{E.Target}^7]"); diff --git a/SharedLibrary/Database/Importer.cs b/SharedLibrary/Database/Importer.cs index c55650721..47219168b 100644 --- a/SharedLibrary/Database/Importer.cs +++ b/SharedLibrary/Database/Importer.cs @@ -19,6 +19,8 @@ namespace SharedLibrary.Database { context = new DatabaseContext(); context.Configuration.AutoDetectChangesEnabled = false; + context.Configuration.LazyLoadingEnabled = false; + context.Configuration.ProxyCreationEnabled = false; int count = 0; foreach (var entityToInsert in clients) @@ -96,6 +98,8 @@ namespace SharedLibrary.Database { context = new DatabaseContext(); context.Configuration.AutoDetectChangesEnabled = false; + context.Configuration.LazyLoadingEnabled = false; + context.Configuration.ProxyCreationEnabled = false; int count = 0; foreach (var entityToInsert in penalties) @@ -161,5 +165,59 @@ namespace SharedLibrary.Database return context; } + + public static void ImportSQLite(IList SQLiteData) where T : class + { + DatabaseContext context = null; + + try + { + context = new DatabaseContext(); + context.Configuration.AutoDetectChangesEnabled = false; + context.Configuration.LazyLoadingEnabled = false; + context.Configuration.ProxyCreationEnabled = false; + + int count = 0; + foreach (var entityToInsert in SQLiteData) + { + ++count; + context = AddSQLite(context, entityToInsert, count, 100, true); + } + + context.SaveChanges(); + } + finally + { + if (context != null) + context.Dispose(); + } + } + + private static DatabaseContext AddSQLite(DatabaseContext context, T entity, int count, int commitCount, bool recreateContext) where T : class + { + context.Set().Add(entity); + + if (count % commitCount == 0) + { + try + { + context.SaveChanges(); + } + + catch (Exception e) + { + var a = 1; + } + + if (recreateContext) + { + context.Dispose(); + context = new DatabaseContext(); + context.Configuration.AutoDetectChangesEnabled = false; + } + } + return context; + } } } + diff --git a/SharedLibrary/Database/Initializer.cs b/SharedLibrary/Database/Initializer.cs index afffe33cc..bb0a2dc26 100644 --- a/SharedLibrary/Database/Initializer.cs +++ b/SharedLibrary/Database/Initializer.cs @@ -17,7 +17,7 @@ namespace SharedLibrary.Database { Active = true, DateAdded = DateTime.UtcNow, - IPAddress = "0.0.0.0", + IPAddress = 0, Name = "IW4MAdmin", Link = aliasLink }; @@ -30,7 +30,7 @@ namespace SharedLibrary.Database LastConnection = DateTime.UtcNow, Level = Objects.Player.Permission.Console, Masked = true, - NetworkId = "0000000000000000", + NetworkId = 0, AliasLink = aliasLink, CurrentAlias = currentAlias }); diff --git a/SharedLibrary/Database/Models/EFAlias.cs b/SharedLibrary/Database/Models/EFAlias.cs index adcea7341..68108f604 100644 --- a/SharedLibrary/Database/Models/EFAlias.cs +++ b/SharedLibrary/Database/Models/EFAlias.cs @@ -14,10 +14,12 @@ namespace SharedLibrary.Database.Models public virtual EFAliasLink Link { get; set; } // [Index("IX_IPandName", 0, IsUnique = true)] //[MaxLength(24)] + [Required] public string Name { get; set; } // [Index("IX_IPandName", 1, IsUnique = true)] // [MaxLength(24)] - public string IPAddress { get; set; } + [Required] + public int IPAddress { get; set; } [Required] public DateTime DateAdded { get; set; } } diff --git a/SharedLibrary/Database/Models/EFClient.cs b/SharedLibrary/Database/Models/EFClient.cs index 8304cee15..82c120fae 100644 --- a/SharedLibrary/Database/Models/EFClient.cs +++ b/SharedLibrary/Database/Models/EFClient.cs @@ -13,8 +13,7 @@ namespace SharedLibrary.Database.Models [Key] public int ClientId { get; set; } [Index(IsUnique = true)] - public string NetworkId { get; set; } - + public long NetworkId { get; set; } [Required] public int Connections { get; set; } [Required] @@ -44,12 +43,15 @@ namespace SharedLibrary.Database.Models set { } } [NotMapped] - public virtual string IPAddress + public virtual int IPAddress { get { return CurrentAlias.IPAddress; } set { } } + [NotMapped] + public string IPAddressString => new System.Net.IPAddress(BitConverter.GetBytes(IPAddress)).ToString(); + public virtual ICollection ReceivedPenalties { get; set; } public virtual ICollection AdministeredPenalties { get; set; } diff --git a/SharedLibrary/Event.cs b/SharedLibrary/Event.cs index 9609d863f..5ad695e07 100644 --- a/SharedLibrary/Event.cs +++ b/SharedLibrary/Event.cs @@ -131,7 +131,7 @@ namespace SharedLibrary if (removeTime.Contains("ScriptKill")) { - return new Event(GType.Script, String.Join(";", line), SV.Players.FirstOrDefault(p => p != null && p.NetworkId == line[1]), SV.Players.FirstOrDefault(p => p != null && p.NetworkId == line[2]), SV); + return new Event(GType.Script, String.Join(";", line), SV.Players.FirstOrDefault(p => p != null && p.NetworkId == line[1].ConvertLong()), SV.Players.FirstOrDefault(p => p != null && p.NetworkId == line[2].ConvertLong()), SV); } if (removeTime.Contains("ExitLevel")) diff --git a/SharedLibrary/Helpers/AsyncStatus.cs b/SharedLibrary/Helpers/AsyncStatus.cs index 6162f85d8..dfebd736c 100644 --- a/SharedLibrary/Helpers/AsyncStatus.cs +++ b/SharedLibrary/Helpers/AsyncStatus.cs @@ -53,5 +53,10 @@ namespace SharedLibrary.Helpers RunAverage = RunAverage + ((DateTime.Now - StartTime).TotalMilliseconds - RunAverage - UpdateFrequency) / TimesRun; StartTime = DateTime.Now; } + + public void Abort() + { + RequestedTask = null; + } } } diff --git a/SharedLibrary/Helpers/ConfigurationManager.cs b/SharedLibrary/Helpers/ConfigurationManager.cs index f361bef3b..d6e303b2b 100644 --- a/SharedLibrary/Helpers/ConfigurationManager.cs +++ b/SharedLibrary/Helpers/ConfigurationManager.cs @@ -6,65 +6,32 @@ namespace SharedLibrary.Helpers { public class ConfigurationManager { - ConcurrentDictionary> ConfigurationSet; - ConcurrentDictionary ConfigSet; - Type PluginType; + ConcurrentDictionary ConfigSet; Server ServerInstance; - public ConfigurationManager(Type PluginType) - { - ConfigurationSet = new ConcurrentDictionary>(); - this.PluginType = PluginType; - } - public ConfigurationManager(Server S) { try { - ConfigSet = Interfaces.Serialize>.Read($"config/Plugins_{S}.cfg"); + ConfigSet = Interfaces.Serialize>.Read($"config/plugins_{S.ToString()}.cfg"); } catch (Exception) { S.Logger.WriteInfo("ConfigurationManager could not deserialize configuration file, so initializing default config set"); - ConfigSet = new ConcurrentDictionary(); + ConfigSet = new ConcurrentDictionary(); } ServerInstance = S; + SaveChanges(); } private void SaveChanges() { - Interfaces.Serialize>.Write($"config/Plugins_{ServerInstance}.cfg", ConfigSet); + Interfaces.Serialize>.Write($"config/plugins_{ServerInstance.ToString()}.cfg", ConfigSet); } - public void AddConfiguration(Server S) - { - /* if (ConfigurationSet.ContainsKey(S.ToString())) - { - S.Logger.WriteWarning($"not adding server configuration for {S} as it already exists"); - return; - }*/ - - try - { - var Config = Interfaces.Serialize>.Read($"config/{PluginType.ToString()}_{S.ToString()}.cfg"); - ConfigurationSet.TryAdd(S.ToString(), Config); - } - - catch (Exceptions.SerializeException) - { - ConfigurationSet.TryAdd(S.ToString(), new Dictionary()); - } - } - - public void AddProperty(Server S, KeyValuePair Property) - { - ConfigurationSet[S.ToString()].Add(Property.Key, Property.Value); - Interfaces.Serialize>.Write($"config/{PluginType.ToString()}_{S.ToString()}.cfg", ConfigurationSet[S.ToString()]); - } - - public void AddProperty(KeyValuePair prop) + public void AddProperty(KeyValuePair prop) { if (!ConfigSet.ContainsKey(prop.Key)) ConfigSet.TryAdd(prop.Key, prop.Value); @@ -72,13 +39,7 @@ namespace SharedLibrary.Helpers SaveChanges(); } - public void UpdateProperty(Server S, KeyValuePair Property) - { - ConfigurationSet[S.ToString()][Property.Key] = Property.Value; - Interfaces.Serialize>.Write($"config/{PluginType.ToString()}_{S.ToString()}.cfg", ConfigurationSet[S.ToString()]); - } - - public void UpdateProperty(KeyValuePair prop) + public void UpdateProperty(KeyValuePair prop) { if (ConfigSet.ContainsKey(prop.Key)) ConfigSet[prop.Key] = prop.Value; @@ -86,21 +47,16 @@ namespace SharedLibrary.Helpers SaveChanges(); } - public IDictionary GetConfiguration(Server S) - { - return ConfigurationSet[S.ToString()]; - } - - public object GetProperty(string prop) + public T GetProperty(string prop) { try { - return ConfigSet[prop]; + return ConfigSet[prop].ToObject(); } catch (Exception) { - return null; + return default(T); } } } diff --git a/SharedLibrary/Interfaces/IEntityService.cs b/SharedLibrary/Interfaces/IEntityService.cs index 3621e957c..625babc19 100644 --- a/SharedLibrary/Interfaces/IEntityService.cs +++ b/SharedLibrary/Interfaces/IEntityService.cs @@ -14,7 +14,7 @@ namespace SharedLibrary.Interfaces Task Delete(T entity); Task Update(T entity); Task Get(int entityID); - Task GetUnique(string entityProperty); + Task GetUnique(long entityProperty); Task> Find(Func expression); } } diff --git a/SharedLibrary/Interfaces/ISerializable.cs b/SharedLibrary/Interfaces/ISerializable.cs index 9a6f4484d..1af45f07b 100644 --- a/SharedLibrary/Interfaces/ISerializable.cs +++ b/SharedLibrary/Interfaces/ISerializable.cs @@ -45,7 +45,7 @@ namespace SharedLibrary.Interfaces { try { - string configText = Newtonsoft.Json.JsonConvert.SerializeObject(data); + string configText = Newtonsoft.Json.JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.Indented); File.WriteAllText(filename, configText); } diff --git a/SharedLibrary/Objects/Player.cs b/SharedLibrary/Objects/Player.cs index 74355b9c4..c677b070a 100644 --- a/SharedLibrary/Objects/Player.cs +++ b/SharedLibrary/Objects/Player.cs @@ -76,8 +76,8 @@ namespace SharedLibrary.Objects [NotMapped] public int Score { get; set; } - private string _ipaddress; - public override string IPAddress + private int _ipaddress; + public override int IPAddress { get { return _ipaddress; } set { _ipaddress = value; } @@ -88,5 +88,15 @@ namespace SharedLibrary.Objects get { return _name; } set { _name = value; } } + + public override bool Equals(object obj) + { + return ((Player)obj).NetworkId == NetworkId; + } + + public override int GetHashCode() + { + return NetworkId.GetHashCode(); + } } } diff --git a/SharedLibrary/Server.cs b/SharedLibrary/Server.cs index 8a6571d01..97aa74a5e 100644 --- a/SharedLibrary/Server.cs +++ b/SharedLibrary/Server.cs @@ -39,7 +39,7 @@ namespace SharedLibrary Reports = new List(); PlayerHistory = new Queue(); ChatHistory = new List(); - Configuration = new ConfigurationManager(this.GetType()); + //Configuration = new ConfigurationManager(this.GetType()); NextMessage = 0; InitializeTokens(); InitializeAutoMessages(); diff --git a/SharedLibrary/Services/AliasService.cs b/SharedLibrary/Services/AliasService.cs index 2c288d00b..979bb1ef8 100644 --- a/SharedLibrary/Services/AliasService.cs +++ b/SharedLibrary/Services/AliasService.cs @@ -73,7 +73,7 @@ namespace SharedLibrary.Services .SingleOrDefaultAsync(e => e.AliasId == entityID); } - public Task GetUnique(string entityProperty) + public Task GetUnique(long entityProperty) { throw new NotImplementedException(); } diff --git a/SharedLibrary/Services/ClientService.cs b/SharedLibrary/Services/ClientService.cs index cdf08f2ad..02c52e182 100644 --- a/SharedLibrary/Services/ClientService.cs +++ b/SharedLibrary/Services/ClientService.cs @@ -102,14 +102,18 @@ namespace SharedLibrary.Services public async Task Get(int entityID) { using (var context = new DatabaseContext()) + { + context.Configuration.LazyLoadingEnabled = false; + context.Configuration.ProxyCreationEnabled = false; return await new DatabaseContext().Clients .AsNoTracking() .Include(c => c.CurrentAlias) .Include(c => c.AliasLink.Children) .SingleOrDefaultAsync(e => e.ClientId == entityID); + } } - public async Task GetUnique(string entityAttribute) + public async Task GetUnique(long entityAttribute) { using (var context = new DatabaseContext()) { @@ -117,7 +121,7 @@ namespace SharedLibrary.Services .AsNoTracking() .Include(c => c.CurrentAlias) .Include(c => c.AliasLink.Children) - .SingleOrDefaultAsync(c => c.NetworkId == entityAttribute); + .SingleOrDefaultAsync(c => c.NetworkId == (long)entityAttribute); } } diff --git a/SharedLibrary/Services/GenericService.cs b/SharedLibrary/Services/GenericService.cs deleted file mode 100644 index eadb780e1..000000000 --- a/SharedLibrary/Services/GenericService.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using SharedLibrary.Database; - -namespace SharedLibrary.Services -{ - public class GenericService : Interfaces.IEntityService - { - public async Task Create(T entity) - { - using (var context = new DatabaseContext()) - { - var dbSet = context.Set(entity.GetType()); - T addedEntity = (T)dbSet.Add(entity); - await context.SaveChangesAsync(); - - return addedEntity; - } - } - - public Task CreateProxy() - { - throw new NotImplementedException(); - } - - public Task Delete(T entity) - { - throw new NotImplementedException(); - } - - public Task> Find(Func expression) - { - throw new NotImplementedException(); - } - - public async Task Get(int entityID) - { - using (var context = new DatabaseContext()) - { - var dbSet = context.Set(typeof(T)); - return (T)(await dbSet.FindAsync(entityID)); - } - } - - public async Task Get(params object[] entityKeys) - { - using (var context = new DatabaseContext()) - { - var dbSet = context.Set(typeof(T)); - return (T)(await dbSet.FindAsync(entityKeys)); - } - } - - public Task GetUnique(string entityProperty) - { - throw new NotImplementedException(); - } - - public Task Update(T entity) - { - throw new NotImplementedException(); - } - } -} diff --git a/SharedLibrary/Services/PenaltyService.cs b/SharedLibrary/Services/PenaltyService.cs index b7b7c76df..777fefb48 100644 --- a/SharedLibrary/Services/PenaltyService.cs +++ b/SharedLibrary/Services/PenaltyService.cs @@ -73,7 +73,7 @@ namespace SharedLibrary.Services throw new NotImplementedException(); } - public Task GetUnique(string entityProperty) + public Task GetUnique(long entityProperty) { throw new NotImplementedException(); } diff --git a/SharedLibrary/SharedLibrary.csproj b/SharedLibrary/SharedLibrary.csproj index dd143beed..7e84e3968 100644 --- a/SharedLibrary/SharedLibrary.csproj +++ b/SharedLibrary/SharedLibrary.csproj @@ -139,7 +139,6 @@ - diff --git a/SharedLibrary/Utilities.cs b/SharedLibrary/Utilities.cs index 96427cf14..d70c7b9cd 100644 --- a/SharedLibrary/Utilities.cs +++ b/SharedLibrary/Utilities.cs @@ -58,10 +58,10 @@ namespace SharedLibrary int Ping = -1; Int32.TryParse(playerInfo[2], out Ping); String cName = Utilities.StripColors(responseLine.Substring(46, 18)).Trim(); - string npID = Regex.Match(responseLine, @"([a-z]|[0-9]){16}", RegexOptions.IgnoreCase).Value; + long npID = Regex.Match(responseLine, @"([a-z]|[0-9]){16}", RegexOptions.IgnoreCase).Value.ConvertLong(); int.TryParse(playerInfo[0], out cID); var regex = Regex.Match(responseLine, @"\d+\.\d+\.\d+.\d+\:\d{1,5}"); - string cIP = regex.Value.Split(':')[0]; + int cIP = regex.Value.Split(':')[0].ConvertToIP(); regex = Regex.Match(responseLine, @"[0-9]{1,2}\s+[0-9]+\s+"); int score = Int32.Parse(regex.Value.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[1]); Player P = new Player() { Name = cName, NetworkId = npID, ClientNumber = cID, IPAddress = cIP, Ping = Ping, Score = score}; @@ -197,6 +197,21 @@ namespace SharedLibrary } } + public static long ConvertLong(this string str) + { + return Int64.Parse(str, System.Globalization.NumberStyles.HexNumber); + } + + public static int ConvertToIP(this string str) + { + return BitConverter.ToInt32(System.Net.IPAddress.Parse(str).GetAddressBytes(), 0); + } + + public static string ConvertIPtoString(this int ip) + { + return new System.Net.IPAddress(BitConverter.GetBytes(ip)).ToString(); + } + public static String DateTimeSQLite(DateTime datetime) { return datetime.ToString("yyyy-MM-dd H:mm:ss");