· 9 years ago · Jul 19, 2017, 08:48 PM
1/* Copyright 2013 [GWC]XpKillerhx
2
3 This plugin file is part of PRoCon Frostbite.
4
5 This plugin is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This plugin is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with PRoCon Frostbite. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19using System;
20//using System.IO;
21using System.Text;
22using System.Text.RegularExpressions;
23using System.Reflection;
24using System.Collections;
25using System.Collections.Generic;
26using System.Collections.ObjectModel;
27
28using System.Data;
29using System.Configuration;
30using System.ComponentModel;
31using System.Threading;
32//using System.Net;
33
34//MySQL native includes
35//using MySql.Data;
36using MySql.Data.MySqlClient;
37
38
39//Procon includes
40using PRoCon.Core;
41using PRoCon.Core.Plugin;
42using PRoCon.Core.Plugin.Commands;
43using PRoCon.Core.Players;
44using PRoCon.Core.Players.Items;
45
46namespace PRoConEvents
47{
48 public class CChatGUIDStatsLogger : PRoConPluginAPI, IPRoConPluginInterface
49 {
50 #region Variables and Constructor
51
52 private MatchCommand loggerStatusCommand;
53
54 //Proconvariables
55 private string m_strHostName;
56 private string m_strPort;
57 private string m_strPRoConVersion;
58
59 //Tablebuilder
60 private readonly object tablebuilderlock;
61
62 //other locks
63 private readonly object chatloglock;
64 private readonly object sqlquerylock;
65 private readonly object sessionlock;
66 private readonly object streamlock;
67 private readonly object ConnectionStringBuilderlock;
68 private readonly object registerallcomandslock;
69
70 //Dateoffset
71 private myDateTime_W MyDateTime;
72 private double m_dTimeOffset;
73
74 //Logging
75 private Dictionary<string, CPunkbusterInfo> m_dicPbInfo = new Dictionary<string, CPunkbusterInfo>();
76 //Chatlog
77 private static List<CLogger> ChatLog = new List<CLogger>();
78 private List<string> lstStrChatFilterRules;
79 private List<Regex> lstChatFilterRules;
80 //Statslog
81 private Dictionary<string, CStats> StatsTracker = new Dictionary<string, CStats>();
82 //Dogtags
83 private Dictionary<CKillerVictim, int> m_dicKnifeKills = new Dictionary<CKillerVictim, int>();
84 //Session
85 private Dictionary<string, CStats> m_dicSession = new Dictionary<string, CStats>();
86 private CMapstats Mapstats;
87 private CMapstats Nextmapinfo;
88 private List<CStats> lstpassedSessions = new List<CStats>();
89
90 //GameMod
91 //private string m_strGameMod;
92
93 //Spamprotection
94 private int numberOfAllowedRequests;
95 private CSpamprotection Spamprotection;
96
97 //Keywords
98 private List<string> m_lstTableconfig = new List<string>();
99 private Dictionary<string, List<string>> m_dicKeywords = new Dictionary<string, List<string>>();
100
101 //Weapondic
102 private Dictionary<string, Dictionary<string, CStats.CUsedWeapon>> weaponDic = new Dictionary<string, Dictionary<string, CStats.CUsedWeapon>>();
103
104 //DamageClassDic
105 private Dictionary<string, string> DamageClass = new Dictionary<string, string>();
106
107 //WelcomeStatsDic
108 private Dictionary<string, DateTime> welcomestatsDic = new Dictionary<string, DateTime>();
109
110 //Weapon Mapping Dictionary
111 private Dictionary<string, int> WeaponMappingDic = new Dictionary<string, int>();
112
113 //ServerID
114 private int ServerID;
115
116 //Awards
117 private List<string> m_lstAwardTable = new List<string>();
118
119 //Tablenames
120 private string tbl_playerdata;
121 private string tbl_playerstats;
122 private string tbl_weaponstats;
123 private string tbl_dogtags;
124 private string tbl_mapstats;
125 private string tbl_chatlog;
126 private string tbl_bfbcs;
127 private string tbl_awards;
128 private string tbl_server;
129 private string tbl_server_player;
130 private string tbl_server_stats;
131 private string tbl_playerrank;
132 private string tbl_sessions;
133 private string tbl_currentplayers;
134 private string tbl_weapons;
135 private string tbl_weapons_stats;
136 private string tbl_games;
137 private string tbl_teamscores;
138
139 // Timelogging
140 private bool bool_roundStarted;
141 private DateTime Time_RankingStarted;
142
143 //Other
144 private Dictionary<string, CPlayerInfo> m_dicPlayers = new Dictionary<string, CPlayerInfo>(); //Players
145
146 //ID Cache
147 private Dictionary<string, C_ID_Cache> m_ID_cache = new Dictionary<string, C_ID_Cache>();
148
149 //Various Variables
150 //private int m_strUpdateInterval;
151 private bool isStreaming;
152 private string serverName;
153 private bool m_isPluginEnabled;
154 private bool boolTableEXISTS;
155 private bool boolKeywordDicReady;
156 private string tableSuffix;
157 private bool MySql_Connection_is_activ;
158 //Last time Stat Logger actively interacted with the database
159 private DateTime lastDBInteraction = DateTime.MinValue;
160
161 //Update skipswitches
162 private bool boolSkipGlobalUpdate;
163 private bool boolSkipServerUpdate;
164 private bool boolSkipServerStatsUpdate;
165
166 //Transaction retry
167 private int TransactionRetryCount;
168
169 //Playerstartcount
170 private int intRoundStartCount;
171 private int intRoundRestartCount;
172
173 //Webrequest
174 private int m_requestIntervall;
175 private string m_webAddress;
176
177 //BFBCS
178 //private double BFBCS_UpdateInterval;
179 //private int BFBCS_Min_Request;
180
181 //Database Connection Variables
182 private string m_strHost;
183 private string m_strDBPort;
184 private string m_strDatabase;
185 private string m_strUserName;
186 private string m_strPassword;
187 //private string m_strDatabaseDriver;
188
189 //Stats Message Variables
190 private List<string> m_lstPlayerStatsMessage;
191 private List<string> m_lstPlayerOfTheDayMessage;
192 private List<string> m_lstPlayerWelcomeStatsMessage;
193 private List<string> m_lstNewPlayerWelcomeMsg;
194 private List<string> m_lstWeaponstatsMsg;
195 private List<string> m_lstServerstatsMsg;
196 //private string m_strPlayerWelcomeMsg;
197 //private string m_strNewPlayerWelcomeMsg;
198 private int int_welcomeStatsDelay;
199 private string m_strTop10Header;
200 private string m_strTop10RowFormat;
201 private string m_strWeaponTop10Header;
202 private string m_strWeaponTop10RowFormat;
203
204 //top10 for Period
205 private string m_strTop10HeaderForPeriod;
206
207 //Session
208 private List<string> m_lstSessionMessage;
209
210 //Debug
211 private string GlobalDebugMode;
212
213 //ServerGroup
214 private int intServerGroup;
215
216 //Bools for switch on and off funktions
217 private enumBoolYesNo m_enNoServerMsg; //Logging of Server Messages
218 private enumBoolYesNo m_enLogSTATS; //Statslogging
219 private enumBoolYesNo m_enWelcomeStats; //WelcomeStats
220 private enumBoolYesNo m_enYellWelcomeMSG; // Yell Welcome Message
221 private enumBoolYesNo m_enTop10ingame; //Top10 ingame
222 private enumBoolYesNo m_enRankingByScore; //Ranking by Score
223 private enumBoolYesNo m_enInstantChatlogging; //Realtime Chatlogging
224 private enumBoolYesNo m_enChatloggingON; // Chatlogging On
225 private enumBoolYesNo m_enChatlogFilter; //Turn on the Chatlogfilter
226 private enumBoolYesNo m_enSendStatsToAll; //All Player see the Stats if someone enter @stats @rank
227 private enumBoolYesNo m_mapstatsON; //Mapstats
228 private enumBoolYesNo m_sessionON; //Sessionstats
229 private enumBoolYesNo m_weaponstatsON; //Turn Weaponstats On and Off
230 private enumBoolYesNo m_getStatsfromBFBCS; //Turn Statsfetching from BFBCS On and Off
231 private enumBoolYesNo m_awardsON; //Turn Awards on or off
232 private enumBoolYesNo m_enWebrequest; // Webrequest
233 private enumBoolYesNo m_enOverallRanking; //Overall Ranking
234 private enumBoolYesNo m_enableInGameCommands; // Turn InGame Commands on and off
235 private enumBoolOnOff m_highPerformanceConnectionMode;
236 private enumBoolYesNo m_enSessionTracking;
237 private enumBoolYesNo m_kdrCorrection; //Kill death Ratio Correction
238 private enumBoolYesNo m_enableCurrentPlayerstatsTable; // experimental
239 private enumBoolYesNo m_enLogPlayerDataOnly;
240 private enumBoolOnOff m_connectionPooling; //Connection Pooling
241 private enumBoolOnOff m_Connectioncompression;
242
243 private int m_maxPoolSize; //Connection Pooling
244 private int m_minPoolSize; //Connection Pooling
245
246 //More Database Variables
247 //Commands
248 //Transactions
249 private MySql.Data.MySqlClient.MySqlTransaction MySqlTrans;
250 //Connections
251 private MySql.Data.MySqlClient.MySqlConnection MySqlCon; //Select Querys 1
252 private MySql.Data.MySqlClient.MySqlConnection MySqlChatCon; //MySqlConnection for Chatlogging
253 private MySql.Data.MySqlClient.MySqlConnection MySqlConn; //StartStreaming 2
254
255 MySqlConnectionStringBuilder myCSB = new MySqlConnectionStringBuilder();
256
257 //ServerInfo Event fix
258 private DateTime dtLastServerInfoEvent;
259 private int minIntervalllenght;
260
261 //Double Roundendfix
262 private DateTime dtLastRoundendEvent;
263 private DateTime dtLastOnListPlayersEvent;
264
265 //Top10 for Period
266 private int m_intDaysForPeriodTop10;
267
268 //New In-Game Command System
269 private string m_IngameCommands_stats;
270 private string m_IngameCommands_serverstats;
271 private string m_IngameCommands_session;
272 private string m_IngameCommands_dogtags;
273 private string m_IngameCommands_top10;
274 private string m_IngameCommands_playerOfTheDay;
275 private string m_IngameCommands_top10ForPeriod;
276
277 private Dictionary<string,CStatsIngameCommands> dicIngameCommands = new Dictionary<string,CStatsIngameCommands>();
278
279 //ServerGametype
280 private string strServerGameType = String.Empty;
281 private int intServerGameType_ID;
282
283 public CChatGUIDStatsLogger()
284 {
285 loggerStatusCommand = new MatchCommand("CChatGUIDStatsLogger", "GetStatus", new List<string>(), "CChatGUIDStatsLogger_Status", new List<MatchArgumentFormat>(), new ExecutionRequirements(ExecutionScope.None), "Useable by other plugins to determine the current status of this plugin.");
286
287 //tablebuilderlock
288 this.tablebuilderlock = new object();
289 //other locks
290 this.chatloglock = new object();
291 this.sqlquerylock = new object();
292 this.sessionlock = new object();
293 this.streamlock = new object();
294 this.ConnectionStringBuilderlock = new object();
295 this.registerallcomandslock = new object();
296
297
298 //update skipswitch
299 this.boolSkipGlobalUpdate = false;
300 this.boolSkipServerUpdate = false;
301 this.boolSkipServerStatsUpdate = false;
302
303 //Timeoffset
304 this.m_dTimeOffset = 0;
305 this.MyDateTime = new myDateTime_W(this.m_dTimeOffset);
306
307 //this.m_strUpdateInterval = 30;
308 this.isStreaming = true;
309 this.serverName = String.Empty;
310 this.m_ID_cache = new Dictionary<string, C_ID_Cache>();
311 this.m_dicKeywords = new Dictionary<string, List<string>>();
312 this.boolKeywordDicReady = false;
313 this.tableSuffix = String.Empty;
314 this.Mapstats = new CMapstats(MyDateTime.Now, "START", 0, 0, this.m_dTimeOffset);
315 this.MySql_Connection_is_activ = false;
316 this.numberOfAllowedRequests = 10;
317
318 //Transaction retry count
319 TransactionRetryCount = 3;
320
321 //Chatlog
322 this.lstStrChatFilterRules = new List<string>();
323 this.lstChatFilterRules = new List<Regex>();
324
325 //BFBCS
326 //this.BFBCS_UpdateInterval = 72; // hours
327 //this.BFBCS_Min_Request = 2; //min Packrate
328
329 //Playerstartcount
330 this.intRoundStartCount = 2;
331 this.intRoundRestartCount = 1;
332
333 //Webrequest
334 this.m_webAddress = String.Empty;
335 this.m_requestIntervall = 60;
336
337 //Databasehost
338 this.m_strHost = String.Empty;
339 this.m_strDBPort = String.Empty;
340 this.m_strDatabase = String.Empty;
341 this.m_strUserName = String.Empty;
342 this.m_strPassword = String.Empty;
343
344 //Various Bools
345 this.bool_roundStarted = false;
346 this.m_isPluginEnabled = false;
347 this.boolTableEXISTS = false;
348
349 //ServerGroup
350 this.intServerGroup = 0;
351
352 //Debug
353 this.GlobalDebugMode = "Error";
354
355 //Functionswitches
356 this.m_enLogSTATS = enumBoolYesNo.No;
357 this.m_enWelcomeStats = enumBoolYesNo.No;
358 this.m_enYellWelcomeMSG = enumBoolYesNo.No;
359 this.m_enTop10ingame = enumBoolYesNo.No;
360 this.m_enRankingByScore = enumBoolYesNo.Yes;
361 this.m_enNoServerMsg = enumBoolYesNo.No;
362 this.m_enInstantChatlogging = enumBoolYesNo.No;
363 this.m_enChatloggingON = enumBoolYesNo.No;
364 this.m_enChatlogFilter = enumBoolYesNo.No;
365 this.m_enSendStatsToAll = enumBoolYesNo.No;
366 this.m_mapstatsON = enumBoolYesNo.No;
367 this.m_sessionON = enumBoolYesNo.No;
368 this.m_weaponstatsON = enumBoolYesNo.Yes;
369 this.m_getStatsfromBFBCS = enumBoolYesNo.No;
370 this.m_awardsON = enumBoolYesNo.No;
371 this.m_enOverallRanking = enumBoolYesNo.No;
372 this.m_enableInGameCommands = enumBoolYesNo.Yes;
373 this.m_highPerformanceConnectionMode = enumBoolOnOff.Off;
374
375 this.m_kdrCorrection = enumBoolYesNo.Yes; //Kill death Ratio Correction
376 this.m_enableCurrentPlayerstatsTable = enumBoolYesNo.No; // experimental
377
378 this.m_enLogPlayerDataOnly = enumBoolYesNo.No;
379
380 this.m_connectionPooling = enumBoolOnOff.On; //Connection Pooling
381 this.m_Connectioncompression = enumBoolOnOff.Off;
382
383 this.m_minPoolSize = 0; //Connection Pooling
384 this.m_maxPoolSize = 10; //Connection Pooling
385
386
387 //Welcomestats
388 //this.m_strPlayerWelcomeMsg = "[yell,4]Nice to see you on our Server again, %playerName%";
389 //this.m_strNewPlayerWelcomeMsg = "[yell,4]Welcome to the %serverName% Server, %playerName%";
390 this.int_welcomeStatsDelay = 5;
391 this.welcomestatsDic = new Dictionary<string, DateTime>();
392
393 //Playerstats
394 this.m_lstPlayerStatsMessage = new List<string>();
395 this.m_lstPlayerStatsMessage.Add("Serverstats for %playerName%:");
396 this.m_lstPlayerStatsMessage.Add("Score: %playerScore% %playerKills% Kills %playerHeadshots% HS %playerDeaths% Deaths K/D: %playerKDR%");
397 this.m_lstPlayerStatsMessage.Add("Your Serverrank is: %playerRank% of %allRanks%");
398
399 //Player of the day
400 this.m_lstPlayerOfTheDayMessage = new List<string>();
401 this.m_lstPlayerOfTheDayMessage.Add("%playerName% is the Player of the day");
402 this.m_lstPlayerOfTheDayMessage.Add("Score: %playerScore% %playerKills% Kills %playerHeadshots% HS %playerDeaths% Deaths K/D: %playerKDR%");
403 this.m_lstPlayerOfTheDayMessage.Add("His Serverrank is: %playerRank% of %allRanks%");
404 this.m_lstPlayerOfTheDayMessage.Add("Overall playtime for today: %playerPlaytime%");
405
406 //Welcomestats
407 this.m_lstPlayerWelcomeStatsMessage = new List<string>();
408 this.m_lstPlayerWelcomeStatsMessage.Add("Nice to see you on our Server again, %playerName%");
409 this.m_lstPlayerWelcomeStatsMessage.Add("Serverstats for %playerName%:");
410 this.m_lstPlayerWelcomeStatsMessage.Add("Score: %playerScore% %playerKills% Kills %playerHeadshots% HS %playerDeaths% Deaths K/D: %playerKDR%");
411 this.m_lstPlayerWelcomeStatsMessage.Add("Your Serverrank is: %playerRank% of %allRanks%");
412
413 //Welcomestats new Player
414 this.m_lstNewPlayerWelcomeMsg = new List<string>();
415 this.m_lstNewPlayerWelcomeMsg.Add("Welcome to the %serverName% Server, %playerName%");
416
417 //Weaponstats
418 this.m_lstWeaponstatsMsg = new List<string>();
419 this.m_lstWeaponstatsMsg.Add("%playerName%'s Stats for %Weapon%:");
420 this.m_lstWeaponstatsMsg.Add("%playerKills% Kills %playerHeadshots% Headshots Headshotrate: %playerKHR%%");
421 this.m_lstWeaponstatsMsg.Add("Your Weaponrank is: %playerRank% of %allRanks%");
422
423 //Serverstats
424 this.m_lstServerstatsMsg = new List<string>();
425 this.m_lstServerstatsMsg.Add("Serverstatistics for server %serverName%");
426 this.m_lstServerstatsMsg.Add("Unique Players: %countPlayer% Totalplaytime: %sumPlaytime%");
427 this.m_lstServerstatsMsg.Add("Totalscore: %sumScore% Avg. Score: %avgScore% Avg. SPM: %avgSPM%");
428 this.m_lstServerstatsMsg.Add("Totalkills: %sumKills% Avg. Kills: %avgKills% Avg. KPM: %avgKPM%");
429
430 //Session
431 this.m_lstSessionMessage = new List<string>();
432 this.m_lstSessionMessage.Add("%playerName%'s Session Data Session started %SessionStarted%");
433 this.m_lstSessionMessage.Add("Score: %playerScore% %playerKills% Kills %playerHeadshots% HS %playerDeaths% Deaths K/D: %playerKDR%");
434 this.m_lstSessionMessage.Add("Your Rank: %playerRank% (%RankDif%) Sessionlength: %SessionDuration% Minutes");
435
436 //Top10 Headers
437 this.m_strTop10Header = "Top 10 Player of the %serverName% Server";
438 this.m_strTop10RowFormat = "%Rank%. %playerName% Score: %playerScore% %playerKills% Kills %playerHeadshots% Headshots %playerDeaths% Deaths KDR: %playerKDR%";
439 this.m_strWeaponTop10Header = "Top 10 Player with %Weapon% of the %serverName%";
440 this.m_strWeaponTop10RowFormat = "%Rank%. %playerName% %playerKills% Kills %playerHeadshots% Headshots %playerDeaths% Deaths Headshotrate: %playerKHR%%";
441
442 //Top10 for Period
443 this.m_strTop10HeaderForPeriod = "Top 10 Player of the %serverName% Server over the last %intervaldays% days";
444
445 //Awards
446 this.m_lstAwardTable = new List<string>();
447 this.m_lstAwardTable.Add("First");
448 this.m_lstAwardTable.Add("Second");
449 this.m_lstAwardTable.Add("Third");
450 this.m_lstAwardTable.Add("Purple_Heart");
451 this.m_lstAwardTable.Add("Best_Combat");
452 this.m_lstAwardTable.Add("Killstreak_5");
453 this.m_lstAwardTable.Add("Killstreak_10");
454 this.m_lstAwardTable.Add("Killstreak_15");
455 this.m_lstAwardTable.Add("Killstreak_20");
456
457 //ServerID
458 this.ServerID = 0;
459
460 //Tableconfig Tweaks for friendly weapon names
461 this.m_lstTableconfig = new List<string>();
462 this.m_lstTableconfig.Add("RPG-7{RPG}");
463 this.m_lstTableconfig.Add("Weapons/SCAR-H/SCAR-H{SCAR,SCAR-H,SCARH}");
464 this.m_lstTableconfig.Add("USAS-12{USAS12,USAS}");
465 this.m_lstTableconfig.Add("M27IAR{M27}");
466 this.m_lstTableconfig.Add("M16A4{M16,M16A3}");
467 this.m_lstTableconfig.Add("AEK-971{AEK971,AEK}");
468 this.m_lstTableconfig.Add("Weapons/A91/A91{A91,A-91}");
469 this.m_lstTableconfig.Add("Weapons/AK74M/AK74{AK74,AK74M,AK74-M}");
470 this.m_lstTableconfig.Add("Weapons/G36C/G36C{G36C,G36}");
471 this.m_lstTableconfig.Add("Weapons/G3A3/G3A3{G3A3,G3}");
472 this.m_lstTableconfig.Add("Weapons/Gadgets/C4/C4{C4,C-4}");
473 this.m_lstTableconfig.Add("Weapons/Gadgets/Claymore/Claymore{CLAYMORE,CLAY,LANDMINE}");
474 this.m_lstTableconfig.Add("Weapons/KH2002/KH2002{KH2002}");
475 this.m_lstTableconfig.Add("Weapons/Knife/Knife{KNIFE,MESSER}");
476 this.m_lstTableconfig.Add("Weapons/M416/M416{M416,M-416}");
477 this.m_lstTableconfig.Add("Weapons/MagpulPDR/MagpulPDR{MagpulPDR,PDR}");
478 this.m_lstTableconfig.Add("Weapons/MP412Rex/MP412REX{MP412REX,REX,MP412}");
479 this.m_lstTableconfig.Add("Weapons/MP443/MP443{MP443}");
480 this.m_lstTableconfig.Add("Taurus .44{.44,TAURUS,TAURUS.44}");
481 this.m_lstTableconfig.Add("Weapons/P90/P90{P90}");
482 this.m_lstTableconfig.Add("Weapons/Sa18IGLA/Sa18IGLA{Sa18IGLA,Sa18,IGLA}");
483 this.m_lstTableconfig.Add("Weapons/UMP45/UMP45{UMP,UMP-45,UMP45}");
484 this.m_lstTableconfig.Add("Weapons/XP1_L85A2/L85A2{L85A2,L85A,L85}");
485 this.m_lstTableconfig.Add("Glock18{GLOCK}");
486
487 //ServerInfo Event fix
488 this.dtLastServerInfoEvent = DateTime.Now;
489 this.minIntervalllenght = 60;
490
491 //Double Roundendfix
492 this.dtLastRoundendEvent = DateTime.MinValue;
493 this.dtLastOnListPlayersEvent = DateTime.MinValue;
494
495 //Top10 for Period
496 this.m_intDaysForPeriodTop10 = 7;
497
498 //New In-Game Command System
499 this.m_IngameCommands_stats = "stats,rank";
500 this.m_IngameCommands_serverstats = "serverstats";
501 this.m_IngameCommands_session = "session";
502 this.m_IngameCommands_dogtags = "dogtags";
503 this.m_IngameCommands_top10 = "top10";
504 this.m_IngameCommands_playerOfTheDay = "playeroftheday,potd";
505 this.m_IngameCommands_top10ForPeriod = "weektop10,wtop10";
506 }
507 #endregion
508
509 #region PluginSetup
510 public string GetPluginName()
511 {
512 return "PRoCon Chat, GUID, Stats and Map Logger";
513 }
514
515 public string GetPluginVersion()
516 {
517 return "1.0.0.2";
518 }
519
520 public string GetPluginAuthor()
521 {
522 return "[GWC]XpKiller";
523 }
524
525 public string GetPluginWebsite()
526 {
527 return "www.german-wildcards.de";
528 }
529
530 public string GetPluginDescription()
531 {
532 return @"
533If you like my Plugins, please feel free to donate<br>
534<p><form action='https://www.paypal.com/cgi-bin/webscr' target='_blank' method='post'>
535<input type='hidden' name='cmd' value='_s-xclick'>
536<input type='hidden' name='hosted_button_id' value='3B2FEDDHHWUW8'>
537<input type='image' src='https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif' border='0' name='submit' alt='PayPal - The safer, easier way to pay online!'>
538<img alt='' border='0' src='https://www.paypal.com/de_DE/i/scr/pixel.gif' width='1' height='1'>
539</form></p>
540
541
542<h2>Description</h2>
543 <p>This plugin is used to log player chat, player GUID's, player Stats, Weaponstats and Mapstats.</p>
544 <p>This inludes: Chat, PBGUID, EAGUID, IP, Stats, Weaponstats, Dogtags, Killstreaks, Country, ClanTag, ... to be continued.. ;-)</p>
545
546<h2>Requirements</h2>
547 <p>It requires the use of a MySQL database with INNODB engine, that allows remote connections.(MYSQL Version 5.1.x, 5.5.x or higher is recommendend!!!)</p>
548 <p>Also you should give INNODB some more Ram because the plugin mainly uses this engine if you need help feel free to ask me</p>
549 <p>The Plugin will create the tables by itself.</p>
550 <p>Pls Give FEEDBACK !!!</p>
551
552<h2>Installation</h2>
553<p>Download and install this plugin</p>
554<p>Setup your Database, this means create a database and the user for it. I highly recommend NOT to use your root user. Just create a user with all rights for your newly created database </p>
555<p>I recommend MySQL 5.1.x, 5.5.x or greater (5.0.x could work too, not tested) Important: <b>Your database need INNODB Support</b></p>
556<p>Start Procon</p>
557<p>Go to Tools --> Options --> Plugins --> Enter you databaseserver under outgoing Connections and allow all outgoing connections</p>
558<p>Restart Procon</p>
559<p>Enter your settings into Plugin Settings and THEN enable the plugin</p>
560<p>Now the plugin should work if not request help in the <a href='https://forum.myrcon.com' target='_blank'>Forum</a></p>
561
562
563<h2>Things you have to know:</h2>
564You can add additional Names for weapons in the Pluginsettings
565Use comma to seperate the words. <br>
566Example: M16A4{M16} --> 40MMGL{M16,M16A3} <br><br>
567
568
569
570<h2>Ingame Commands (defaults!)</h2>
571 <blockquote><h4>[@,#,!]stats</h4>Tells the Player their own Serverstats</blockquote>
572 <blockquote><h4>[@,#,!]rank</h4>Tells the Player their own Serverstats</blockquote>
573 <blockquote><h4>[@,#,!]potd</h4>Show up the player of the day</blockquote>
574 <blockquote><h4>[@,#,!]playeroftheday</h4>Show up the player of the day</blockquote>
575 <blockquote><h4>[@,#,!]session</h4>Tells the Player their own Sessiondata</blockquote>
576 <blockquote><h4>[@,#,!]top10</h4>Tells the Player the Top10 players of the server</blockquote>
577 <blockquote><h4>[@,#,!]wtop10</h4>Tells the Player the Top10 players of the server for specific period</blockquote>
578 <blockquote><h4>[@,#,!]weektop10</h4>Tells the Player the Top10 players of the server for specific period</blockquote>
579 <blockquote><h4>[@,#,!]stats WeaponName</h4>Tells the Player their own Weaponstats for the specific Weapon</blockquote>
580 <blockquote><h4>[@,#,!]rank WeaponName</h4>Privately Tells the Player their own Weaponstats for the specific Weapon</blockquote>
581 <blockquote><h4>[@,#,!]top10 WeaponName</h4>Privately Tells the Player the Top10 Player for the specific Weapon of the server</blockquote>
582 <blockquote><h4>[@,#,!]dogtags WeaponName</h4>Privately Tells the Player his Dogtagstats </blockquote>
583 <blockquote><h4>[@,#,!]serverstats</h4>Tells the Player the Serverstats</blockquote>
584
585<h2>Replacement Strings for Playerstats and Player of the day</h2>
586
587 <table border ='1'>
588 <tr><th>Replacement String</th><th>Effect</th></tr>
589 <tr><td>%playerName%</td><td>Will be replaced by the player's name</td></tr>
590 <tr><td>%playerScore%</td><td>Will be replaced by the player's totalscore on this server</td></tr>
591 <tr><td>%SPM%</td><td>Will be replaced by the Player's score per minute on this server</td></tr>
592 <tr><td>%playerKills%</td><td>Will be replaced by the player's totalkills on this server</td></tr>
593 <tr><td>%playerHeadshots%</td><td>Will be replaced by the player's totalheadshots on this server</td></tr>
594 <tr><td>%playerDeaths%</td><td>Will be replaced by the player's totaldeaths on this server</td></tr>
595 <tr><td>%playerKDR%</td><td>Will be replaced by the player's kill death ratio on this server</td></tr>
596 <tr><td>%playerSucide%</td><td>Will be replaced by the player's sucides on this server</td></tr>
597 <tr><td>%playerPlaytime%</td><td>Will be replaced by the player's totalplaytime on this server in hh:mm:ss format</td></tr>
598 <tr><td>%rounds%</td><td>Will be replaced by the player's totalrounds played on this server</td></tr>
599 <tr><td>%playerRank%</td><td>Will be replaced by the player's concurrent serverrank</td></tr>
600 <tr><td>%allRanks%</td><td>Will be replaced by the player's concurrent serverrank</td></tr>
601 <tr><td>%killstreak%</td><td>Will be replaced by the player's best Killstreak</td></tr>
602 <tr><td>%deathstreak%</td><td>Will be replaced by the player's worst Deathstreak</td></tr>
603 </table>
604 <br>
605
606<h2>Replacement Strings for Top10</h2>
607
608 <table border ='1'>
609 <tr><th>Replacement String</th><th>Effect</th></tr>
610 <tr><td>%serverName%</td><td>Will be replaced by the Server name (Header only)</td></tr>
611 <tr><td>%Rank%</td><td>Will be replaced by the player's rank</td></tr>
612 <tr><td>%playerName%</td><td>Will be replaced by the player's name</td></tr>
613 <tr><td>%playerScore%</td><td>Will be replaced by the player's totalscore on this server</td></tr>
614 <tr><td>%playerKills%</td><td>Will be replaced by the player's totalkills on this server</td></tr>
615 <tr><td>%playerHeadshots%</td><td>Will be replaced by the player's totalheadshots on this server</td></tr>
616 <tr><td>%playerDeaths%</td><td>Will be replaced by the player's totaldeaths on this server</td></tr>
617 <tr><td>%playerKDR%</td><td>Will be replaced by the player's kill death ratio on this server</td></tr>
618 <tr><td>%playerKHR%</td><td>Will be replaced by the player's Headshot Kill ratio on this server</td></tr>
619 <tr><td>%intervaldays%</td><td>Will be replaced interval of days (top10 for a period only)</td></tr>
620 </table>
621 <br>
622
623 <h2>Replacement Strings for Weaponstats</h2>
624
625 <table border ='1'>
626 <tr><th>Replacement String</th><th>Effect</th></tr>
627 <tr><td>%playerName%</td><td>Will be replaced by the player's name</td></tr>
628 <tr><td>%playerKills%</td><td>Will be replaced by the player's Totalkills on this server with the specific Weapon</td></tr>
629 <tr><td>%playerHeadshots%</td><td>Will be replaced by the player's Totalheadshotkills on this server the specific Weapon</td></tr>
630 <tr><td>%playerDeaths%</td><td>Will be replaced by the player's totaldeaths on this server caused by this specific Weapon</td></tr>
631 <tr><td>%playerKHR%</td><td>Will be replaced by the player's Headshotkill ratio on this server with the specific Weapon</td></tr>
632 <tr><td>%playerKDR%</td><td>Will be replaced by the player's kill death ratio on this server with the specific Weapon</td></tr>
633 <tr><td>%playerRank%</td><td>Will be replaced by the player's current Serverrank for the specific Weapon</td></tr>
634 <tr><td>%allRanks%</td><td>Will be replaced by current Number of Player in Serverrank for the specific Weapon</td></tr>
635 <tr><td>%killstreak%</td><td>Will be replaced by the player's best Killstreak</td></tr>
636 <tr><td>%deathstreak%</td><td>Will be replaced by the player's worst Deathstreak</td></tr>
637 </table>
638
639 <h2>Replacement Strings for serverstats</h2>
640
641 <table border ='1'>
642 <tr><th>Replacement String</th><th>Effect</th></tr>
643 <tr><td>%countPlayer%</td><td>Will be replaced by the number of unique players on this server</td></tr>
644 <tr><td>%sumScore%</td><td>Will be replaced by the Totalscore of all players combined on this server</td></tr>
645 <tr><td>%sumKills%</td><td>Will be replaced by the Totalkills of all players combined on this server</td></tr>
646 <tr><td>%sumHeadshots%</td><td>Will be replaced by the TotalHeadshots of all players combined on this server</td></tr>
647 <tr><td>%sumDeaths%</td><td>Will be replaced by the Totaldeaths of all players combined on this server</td></tr>
648 <tr><td>%sumTKs%</td><td>Will be replaced by the TotalTeamkills of all players combined on this server</td></tr>
649 <tr><td>%sumRounds%</td><td>Will be replaced by the Totalrounds of all players combined on this server</td></tr>
650 <tr><td>%sumSuicide%</td><td>Will be replaced by the Totalsuicide of all players combined on this server</td></tr>
651 <tr><td>%avgScore%</td><td>Will be replaced by the average score of all players combined on this server</td></tr>
652 <tr><td>%avgKills%</td><td>Will be replaced by the average kills of all players combined on this server</td></tr>
653 <tr><td>%avgHeadshots%</td><td>Will be replaced by the average Headshots of all players combined on this server</td></tr>
654 <tr><td>%avgDeaths%</td><td>Will be replaced by the average deaths of all players combined on this server</td></tr>
655 <tr><td>%avgTKs%</td><td>Will be replaced by the average teamkills of all players combined on this server</td></tr>
656 <tr><td>%avgSuicide</td><td>Will be replaced by the average suicides of all players combined on this server</td></tr>
657 <tr><td>%avgRounds%</td><td>Will be replaced by the average rounds of all players combined on this server</td></tr>
658 <tr><td>%avgSPM%</td><td>Will be replaced by the average Score per Minute of all players combined on this server</td></tr>
659 <tr><td>%avgKPM%</td><td>Will be replaced by the average Kills per Minute of all players combined on this server</td></tr>
660 <tr><td>%avgHPM%</td><td>Will be replaced by the average Headshots per Minute of all players combined on this server</td></tr>
661 <tr><td>%avgHPK%</td><td>Will be replaced by the average Headshots per Kills (unit procent (%)) of all players combined on this server</td></tr>
662 <tr><td>%sumPlaytime%</td><td>Will be replaced by the Total Playtime (format: dd:hh:mm:ss) of all players combined on this server</td></tr>
663 <tr><td>%avgPlaytime%</td><td>Will be replaced by the average Playtime (format: dd:hh:mm:ss) of all players combined on this server</td></tr>
664 <tr><td>%sumPlaytimeHours%</td><td>Will be replaced by the Total Playtime (format rounded hours) of all players combined on this server</td></tr>
665 <tr><td>%avgPlaytimeHours%</td><td>Will be replaced by the average Playtime (format rounded hours) of all players combined on this server</td></tr>
666 <tr><td>%sumPlaytimeDays%</td><td>Will be replaced by the Total Playtime (format rounded days) of all players combined on this server</td></tr>
667 <tr><td>%avgPlaytimeDays%</td><td>Will be replaced by the average Playtime (format rounded days) of all players combined on this server</td></tr>
668 </table>
669
670 <h2>Replacement Strings for PlayerSession</h2>
671
672 <table border ='1'>
673 <tr><th>Replacement String</th><th>Effect</th></tr>
674 <tr><td>%playerName%</td><td>Will be replaced by the player's name</td></tr>
675 <tr><td>%playerScore%</td><td>Will be replaced by the player's totalscore of the concurrent Session</td></tr>
676 <tr><td>%playerKills%</td><td>Will be replaced by the player's totalkills of the concurrent Session</td></tr>
677 <tr><td>%playerHeadshots%</td><td>Will be replaced by the player's totalheadshots of the concurrent Session</td></tr>
678 <tr><td>%playerDeaths%</td><td>Will be replaced by the player's totaldeaths of the concurrent Session</td></tr>
679 <tr><td>%playerKDR%</td><td>Will be replaced by the player's kill death ratio of the concurrent Session</td></tr>
680 <tr><td>%playerSucide%</td><td>Will be replaced by the player's sucides of the concurrent Session</td></tr>
681 <tr><td>%SessionDuration%</td><td>Will be replaced by the player's totalplaytime of the concurrent Session in Minutes</td></tr>
682 <tr><td>%playerRank%</td><td>Will be replaced by the player's concurrent serverrank</td></tr>
683 <tr><td>%RankDif%</td><td>Will be replaced by the player's rank change</td></tr>
684 <tr><td>%SessionStarted%</td><td>Will be replaced by the player's start of the Session</td></tr>
685 <tr><td>%killstreak%</td><td>Will be replaced by the player's best Killstreak of the Session</td></tr>
686 <tr><td>%deathstreak%</td><td>Will be replaced by the player's worst Deathstreak of the Session</td></tr>
687 </table>
688 <br>
689
690 <h2>How to yell/say messages</h2>
691 <p>Every ingame messages can be yelled to the Player.</p>
692 <p>Just add the yelltag in front of every line of you message which should be yelled.</p>
693 <p>Usage:[yell,duration in seconds]Your messages</p>
694 <p>Like:[yell,3]Welcome on our server!</p>
695 <p>This would be yell for 3 seconds</p>
696 <p>Hint: You can mixed normal say and yell without any problems.</p>
697 <p>Messages without Tag will will be transmitted with the say command.</p>
698<br>
699
700
701
702 <h3>NOTE:</h3>
703 <p>Tracked stats are: Kills, Headshots, Deaths, All Weapons, TKs, Suicides, Score, Playtime, Rounds, MapStats, Dogtags </p>
704 <p>The Rank is created dynamical from Query in my opinion much better than write it back to database.</p>
705 <p>The Stats are written to the Database at the end of the round</p>
706
707<h3>Known issues:</h3>
708<p>Vehicles cannot be tracked due limitations in the Rcon Protocol blame EA/Dice for it</p>
709
710
711<h3>Changelog:</h3><br>
712<b>1.0.0.2</b><br>
713Bugfixes for column errors.<br>
714Bugfixes for the sessions streaming bug<br>
715Weaponstats working again. <br>
716Bugfix for Identifier name is too long.<br>
717
718<br>
719<b>1.0.0.1</b><br>
720Bugfixes for value too long for column errors.<br>
721Bugfixes for some other bugs<br>
722Changed deprecated Tracemessages<br>
723Added an error prefix in pluginlog <br>
724New feature: Tickets/teamscores are now tracked in tbl_teamscores<br>
725New feature: Simple Stats (collects playerdata only)<br>
726New feature: Switch for disabling weaponstats
727<br><br>
728<b>1.0.0.0</b><br>
729First Release<br>
730Multigame Support<br>
731<br><br>
732
733
734";
735 }
736
737 public void OnPluginLoadingEnv(List<string> lstPluginEnv)
738 {
739 this.strServerGameType = lstPluginEnv[1].ToUpper();
740 }
741
742 public void OnPluginLoaded(string strHostName, string strPort, string strPRoConVersion)
743 {
744 this.m_strHostName = strHostName;
745 this.m_strPort = strPort;
746 this.m_strPRoConVersion = strPRoConVersion;
747 this.RegisterEvents(this.GetType().Name, "OnListPlayers", "OnPlayerAuthenticated", "OnPlayerJoin", "OnGlobalChat", "OnTeamChat", "OnSquadChat", "OnPunkbusterMessage", "OnPunkbusterPlayerInfo", "OnServerInfo", "OnLevelLoaded",
748 "OnPlayerKilled", "OnPlayerLeft", "OnRoundOverPlayers", "OnPlayerSpawned", "OnLoadingLevel", "OnCommandStats", "OnCommandTop10", "OnCommandDogtags", "OnCommandServerStats",
749 "OnRoundStartPlayerCount", "OnRoundRestartPlayerCount", "OnRoundOver");
750
751 // Register the logger status match command
752 // This command can be called for status whether logger is enabled or not
753 this.RegisterCommand(loggerStatusCommand);
754 }
755
756 public void OnPluginEnable()
757 {
758 isStreaming = true;
759 this.serverName = String.Empty;
760 this.ExecuteCommand("procon.protected.pluginconsole.write", "^bPRoCon Chat, GUID and Stats Logger ^2Enabled");
761 this.Spamprotection = new CSpamprotection(numberOfAllowedRequests);
762 this.ExecuteCommand("procon.protected.pluginconsole.write", "^bPRoCon Chat, GUID and Stats Logger: ^2 Floodprotection set to " + this.numberOfAllowedRequests.ToString() + " Request per Round for each Player");
763 // Register Commands
764 this.m_isPluginEnabled = true;
765 this.prepareTablenames();
766 this.setGameMod();
767 this.MyDateTime = new myDateTime_W(this.m_dTimeOffset);
768 //Webrequest
769 if (this.m_enWebrequest == enumBoolYesNo.Yes)
770 {
771 //this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger", "30", (this.m_requestIntervall * 60).ToString(), "-1", "procon.protected.plugins.call", "CChatGUIDStatsLogger", "Threadstarter_Webrequest");
772 }
773 this.RegisterAllCommands();
774 this.generateWeaponList();
775 //Start intial tablebuilder thread
776 ThreadPool.QueueUserWorkItem(delegate { this.tablebuilder(); });
777 }
778
779 public void OnPluginDisable()
780 {
781 isStreaming = false;
782 if (MySqlCon != null)
783 if (MySqlCon.State == ConnectionState.Open)
784 {
785 try
786 {
787 MySqlCon.Close();
788 }
789 catch{}
790 }
791 if (MySqlConn != null)
792 if (MySqlConn.State == ConnectionState.Open)
793 {
794 try
795 {
796 MySqlConn.Close();
797 }
798 catch { }
799 }
800
801 //Destroying all current Coonection Pool if availble:
802 try
803 {
804 MySqlConnection.ClearAllPools();
805 }
806 catch { }
807
808 this.ExecuteCommand("procon.protected.pluginconsole.write", "^bPRoCon Chat, GUID and Stats Logger ^1Disabled");
809
810 //Unregister Commands
811 this.m_isPluginEnabled = false;
812 //Webrequest
813 this.ExecuteCommand("procon.protected.tasks.remove", "CChatGUIDStatsLogger");
814 this.UnregisterAllCommands();
815 }
816
817 // Lists only variables you want shown.. for instance enabling one option might hide another option
818 // It's the best I got until I implement a way for plugins to display their own small interfaces.
819 public List<CPluginVariable> GetDisplayPluginVariables()
820 {
821 List<CPluginVariable> lstReturn = new List<CPluginVariable>();
822 lstReturn.Add(new CPluginVariable("Server Details|Host", this.m_strHost.GetType(), this.m_strHost));
823 lstReturn.Add(new CPluginVariable("Server Details|Port", this.m_strDBPort.GetType(), this.m_strDBPort));
824 lstReturn.Add(new CPluginVariable("Server Details|Database Name", this.m_strDatabase.GetType(), this.m_strDatabase));
825 lstReturn.Add(new CPluginVariable("Server Details|UserName", this.m_strUserName.GetType(), this.m_strUserName));
826 lstReturn.Add(new CPluginVariable("Server Details|Password", this.m_strPassword.GetType(), this.m_strPassword));
827 if (this.m_connectionPooling == enumBoolOnOff.Off)
828 {
829 lstReturn.Add(new CPluginVariable("Server Details|High performance mode(no connection limit!)", typeof(enumBoolOnOff), this.m_highPerformanceConnectionMode));
830 }
831 lstReturn.Add(new CPluginVariable("Server Details|Connection Pooling", typeof(enumBoolOnOff), this.m_connectionPooling));
832 if (this.m_connectionPooling == enumBoolOnOff.On)
833 {
834 lstReturn.Add(new CPluginVariable("Server Details|Min Connection Pool Size", this.m_minPoolSize.GetType(), this.m_minPoolSize));
835 lstReturn.Add(new CPluginVariable("Server Details|Max Connection Pool Size", this.m_maxPoolSize.GetType(), this.m_maxPoolSize));
836 }
837 lstReturn.Add(new CPluginVariable("Server Details|Failed Transaction retry attempts", this.TransactionRetryCount.GetType(), this.TransactionRetryCount));
838 lstReturn.Add(new CPluginVariable("Server Details|Minimum time(sec) between ServerInfo Updates", this.minIntervalllenght.GetType(), this.minIntervalllenght));
839
840 lstReturn.Add(new CPluginVariable("Chatlogging|Enable Chatlogging?", typeof(enumBoolYesNo), this.m_enChatloggingON));
841 if (this.m_enChatloggingON == enumBoolYesNo.Yes)
842 {
843 lstReturn.Add(new CPluginVariable("Chatlogging|Log ServerSPAM?", typeof(enumBoolYesNo), this.m_enNoServerMsg));
844 lstReturn.Add(new CPluginVariable("Chatlogging|Instant Logging of Chat Messages?", typeof(enumBoolYesNo), this.m_enInstantChatlogging));
845 lstReturn.Add(new CPluginVariable("Chatlogging|Enable chatlog filter(Regex)?", typeof(enumBoolYesNo), this.m_enChatlogFilter));
846 if (this.m_enChatlogFilter == enumBoolYesNo.Yes)
847 {
848 this.lstStrChatFilterRules = new List<string>(this.ListReplace(this.lstStrChatFilterRules,"|","|"));
849 this.lstStrChatFilterRules = this.ListReplace(this.lstStrChatFilterRules, "+", "+");
850 lstReturn.Add(new CPluginVariable("Chatlogging|Chatfilterrules(Regex)", typeof(string[]), this.lstStrChatFilterRules.ToArray()));
851 }
852 }
853 lstReturn.Add(new CPluginVariable("Stats|Enable Statslogging?", typeof(enumBoolYesNo), this.m_enLogSTATS));
854 if (this.m_enLogSTATS == enumBoolYesNo.Yes)
855 {
856 lstReturn.Add(new CPluginVariable("Stats|Enable Weaponstats?", typeof(enumBoolYesNo), this.m_weaponstatsON));
857 lstReturn.Add(new CPluginVariable("Stats|Ranking by Score?", typeof(enumBoolYesNo), this.m_enRankingByScore));
858 lstReturn.Add(new CPluginVariable("Stats|Enable ingame commands?", typeof(enumBoolYesNo), this.m_enableInGameCommands));
859 lstReturn.Add(new CPluginVariable("Stats|Overall ranking(merged Serverranking)", typeof(enumBoolYesNo), this.m_enOverallRanking));
860 lstReturn.Add(new CPluginVariable("Stats|Server group (0 - 128)", this.intServerGroup.GetType(), this.intServerGroup));
861 lstReturn.Add(new CPluginVariable("Stats|Send Stats to all Players?", typeof(enumBoolYesNo), this.m_enSendStatsToAll));
862 lstReturn.Add(new CPluginVariable("Stats|Enable KDR correction?", typeof(enumBoolYesNo), this.m_kdrCorrection));
863 lstReturn.Add(new CPluginVariable("Stats|PlayerMessage", typeof(string[]), this.m_lstPlayerStatsMessage.ToArray()));
864 //Player of the day
865 lstReturn.Add(new CPluginVariable("Stats|Player of the day Message", typeof(string[]), this.m_lstPlayerOfTheDayMessage.ToArray()));
866 lstReturn.Add(new CPluginVariable("Stats|Weaponstats Message ", typeof(string[]), this.m_lstWeaponstatsMsg.ToArray()));
867 //Serverstats
868 lstReturn.Add(new CPluginVariable("Stats|Serverstats Message", typeof(string[]), this.m_lstServerstatsMsg.ToArray()));
869 lstReturn.Add(new CPluginVariable("Stats|Enable Livescoreboard in DB?", typeof(enumBoolYesNo), this.m_enableCurrentPlayerstatsTable));
870 //Simplestats
871 lstReturn.Add(new CPluginVariable("Stats|Log playerdata only (no playerstats)?", typeof(enumBoolYesNo), this.m_enLogPlayerDataOnly));
872 //lstReturn.Add(new CPluginVariable("Stats|Awards ON?", typeof(enumBoolYesNo), this.m_awardsON));
873 lstReturn.Add(new CPluginVariable("WelcomeStats|Enable Welcomestats?", typeof(enumBoolYesNo), this.m_enWelcomeStats));
874 if (this.m_enWelcomeStats == enumBoolYesNo.Yes)
875 {
876 //lstReturn.Add(new CPluginVariable("WelcomeStats|Yell Welcome Message(not the stats)?", typeof(enumBoolYesNo), this.m_enYellWelcomeMSG));
877 //lstReturn.Add(new CPluginVariable("WelcomeStats|Welcome Message", this.m_strPlayerWelcomeMsg.GetType(), this.m_strPlayerWelcomeMsg));
878 lstReturn.Add(new CPluginVariable("WelcomeStats|Welcome Message", typeof(string[]), this.m_lstPlayerWelcomeStatsMessage.ToArray()));
879 lstReturn.Add(new CPluginVariable("WelcomeStats|Welcome Message for new Player", typeof(string[]), this.m_lstNewPlayerWelcomeMsg.ToArray()));
880 lstReturn.Add(new CPluginVariable("WelcomeStats|Welcomestats Delay", this.int_welcomeStatsDelay.GetType(), this.int_welcomeStatsDelay));
881 }
882 //top10
883 lstReturn.Add(new CPluginVariable("Stats|Top10 ingame", this.m_enTop10ingame.GetType(), this.m_enTop10ingame));
884 if (this.m_enTop10ingame == enumBoolYesNo.Yes)
885 {
886 lstReturn.Add(new CPluginVariable("Stats|Top10 header line", this.m_strTop10Header.GetType(), this.m_strTop10Header));
887 lstReturn.Add(new CPluginVariable("Stats|Top10 row format", this.m_strTop10RowFormat.GetType(), this.m_strTop10RowFormat));
888 //top10 for period
889 lstReturn.Add(new CPluginVariable("Stats|Top10 for period header line", this.m_strTop10HeaderForPeriod.GetType(), this.m_strTop10HeaderForPeriod));
890 lstReturn.Add(new CPluginVariable("Stats|Top10 for period interval days", this.m_intDaysForPeriodTop10.GetType(), this.m_intDaysForPeriodTop10));
891 //Weapontop10
892 lstReturn.Add(new CPluginVariable("Stats|WeaponTop10 header line", this.m_strWeaponTop10Header.GetType(), this.m_strWeaponTop10Header));
893 lstReturn.Add(new CPluginVariable("Stats|WeaponTop10 row format", this.m_strWeaponTop10RowFormat.GetType(), this.m_strWeaponTop10RowFormat));
894 }
895 }
896 lstReturn.Add(new CPluginVariable("Debug|DebugLevel", "enum.Actions(Trace|Info|Warning|Error)", this.GlobalDebugMode));
897 lstReturn.Add(new CPluginVariable("Table|Keywordlist", typeof(string[]), this.m_lstTableconfig.ToArray()));
898 lstReturn.Add(new CPluginVariable("Table|tableSuffix", this.tableSuffix.GetType(), this.tableSuffix));
899 lstReturn.Add(new CPluginVariable("MapStats|MapStats ON?", typeof(enumBoolYesNo), this.m_mapstatsON));
900 lstReturn.Add(new CPluginVariable("Session|Session ON?", typeof(enumBoolYesNo), this.m_sessionON));
901 lstReturn.Add(new CPluginVariable("Session|SessionMessage", typeof(string[]), this.m_lstSessionMessage.ToArray()));
902 lstReturn.Add(new CPluginVariable("Session|Save Sessiondata to DB?", typeof(enumBoolYesNo), this.m_enSessionTracking));
903 lstReturn.Add(new CPluginVariable("FloodProtection|Playerrequests per Round", this.numberOfAllowedRequests.GetType(), this.numberOfAllowedRequests));
904 lstReturn.Add(new CPluginVariable("TimeOffset|Servertime Offset", this.m_dTimeOffset.GetType(), this.m_dTimeOffset));
905 //Ingame Command Setup
906 /*
907 this.m_IngameCommands_stats = "stats,rank";
908 this.m_IngameCommands_serverstats = "serverstats";
909 this.m_IngameCommands_session = "session";
910 this.m_IngameCommands_dogtags = "dogtags";
911 this.m_IngameCommands_top10 = "top10";
912 this.m_IngameCommands_playerOfTheDay = "playeroftheday,potd";
913 this.m_IngameCommands_top10ForPeriod = "weektop10,wtop10";
914 */
915 lstReturn.Add(new CPluginVariable("Ingame Command Setup|Stats Command:", this.m_IngameCommands_stats.GetType(), this.m_IngameCommands_stats));
916 lstReturn.Add(new CPluginVariable("Ingame Command Setup|ServerStats Command:", this.m_IngameCommands_serverstats.GetType(), this.m_IngameCommands_serverstats));
917 lstReturn.Add(new CPluginVariable("Ingame Command Setup|Session Command:", this.m_IngameCommands_session.GetType(), this.m_IngameCommands_session));
918 lstReturn.Add(new CPluginVariable("Ingame Command Setup|Dogtags Command:", this.m_IngameCommands_dogtags.GetType(), this.m_IngameCommands_dogtags));
919 lstReturn.Add(new CPluginVariable("Ingame Command Setup|Top10 Command:", this.m_IngameCommands_top10.GetType(), this.m_IngameCommands_top10));
920 lstReturn.Add(new CPluginVariable("Ingame Command Setup|Player Of The Day Command:", this.m_IngameCommands_playerOfTheDay.GetType(), this.m_IngameCommands_playerOfTheDay));
921 lstReturn.Add(new CPluginVariable("Ingame Command Setup|Top10 for period Command:", this.m_IngameCommands_top10ForPeriod.GetType(), this.m_IngameCommands_top10ForPeriod));
922
923
924 //lstReturn.Add(new CPluginVariable("BFBCS|Fetch Stats from BFBCS", typeof(enumBoolYesNo), this.m_getStatsfromBFBCS));
925
926 if (this.m_getStatsfromBFBCS == enumBoolYesNo.Yes)
927 {
928 //lstReturn.Add(new CPluginVariable("BFBCS|Updateinterval (hours)", this.BFBCS_UpdateInterval.GetType(), this.BFBCS_UpdateInterval));
929 //lstReturn.Add(new CPluginVariable("BFBCS|Request Packrate", this.BFBCS_Min_Request.GetType(), this.BFBCS_Min_Request));
930 //lstReturn.Add(new CPluginVariable("Cheaterprotection|Statsbased Protection", typeof(enumBoolYesNo), this.m_cheaterProtection));
931 //lstReturn.Add(new CPluginVariable("Ranklimiter|Ranklimiter ON?", typeof(enumBoolYesNo), this.m_enRanklimiter));
932 }
933 /*
934 lstReturn.Add(new CPluginVariable("Webrequest|Periodical Webrequest On?(P&S Stats)", typeof(enumBoolYesNo), this.m_enWebrequest));
935 if (this.m_enWebrequest == enumBoolYesNo.Yes)
936 {
937 lstReturn.Add(new CPluginVariable("Webrequest|Webaddress", this.m_webAddress.GetType(), this.m_webAddress));
938 lstReturn.Add(new CPluginVariable("Webrequest|Webrequest Intervall", this.m_requestIntervall.GetType(), this.m_requestIntervall));
939 }
940 */
941 return lstReturn;
942 }
943
944 // Lists all of the plugin variables.
945 public List<CPluginVariable> GetPluginVariables()
946 {
947 List<CPluginVariable> lstReturn = new List<CPluginVariable>();
948
949 lstReturn.Add(new CPluginVariable("Host", this.m_strHost.GetType(), this.m_strHost));
950 lstReturn.Add(new CPluginVariable("Port", this.m_strDBPort.GetType(), this.m_strDBPort));
951 lstReturn.Add(new CPluginVariable("Database Name", this.m_strDatabase.GetType(), this.m_strDatabase));
952 lstReturn.Add(new CPluginVariable("UserName", this.m_strUserName.GetType(), this.m_strUserName));
953 lstReturn.Add(new CPluginVariable("Password", this.m_strPassword.GetType(), this.m_strPassword));
954 if (this.m_connectionPooling == enumBoolOnOff.Off)
955 {
956 lstReturn.Add(new CPluginVariable("High performance mode(no connection limit!)", typeof(enumBoolOnOff), this.m_highPerformanceConnectionMode));
957 }
958 lstReturn.Add(new CPluginVariable("Connection Pooling", typeof(enumBoolOnOff), this.m_connectionPooling));
959 if (this.m_connectionPooling == enumBoolOnOff.On)
960 {
961 lstReturn.Add(new CPluginVariable("Min Connection Pool Size", this.m_minPoolSize.GetType(), this.m_minPoolSize));
962 lstReturn.Add(new CPluginVariable("Max Connection Pool Size", this.m_maxPoolSize.GetType(), this.m_maxPoolSize));
963 }
964 lstReturn.Add(new CPluginVariable("Failed Transaction retry attempts", this.TransactionRetryCount.GetType(), this.TransactionRetryCount));
965 lstReturn.Add(new CPluginVariable("Minimum time(sec) between ServerInfo Updates", this.minIntervalllenght.GetType(), this.minIntervalllenght));
966 // Switch for Stats Logging
967 lstReturn.Add(new CPluginVariable("Enable Chatlogging?", typeof(enumBoolYesNo), this.m_enChatloggingON));
968 if (this.m_enChatloggingON == enumBoolYesNo.Yes)
969 {
970 lstReturn.Add(new CPluginVariable("Log ServerSPAM?", typeof(enumBoolYesNo), this.m_enNoServerMsg));
971 lstReturn.Add(new CPluginVariable("Instant Logging of Chat Messages?", typeof(enumBoolYesNo), this.m_enInstantChatlogging));
972 lstReturn.Add(new CPluginVariable("Enable chatlog filter(Regex)?", typeof(enumBoolYesNo), this.m_enChatlogFilter));
973
974 if (this.m_enChatlogFilter == enumBoolYesNo.Yes)
975 {
976 this.lstStrChatFilterRules = new List<string>(this.ListReplace(this.lstStrChatFilterRules, "|", "|"));
977 this.lstStrChatFilterRules = this.ListReplace(this.lstStrChatFilterRules, "+", "+");
978 lstReturn.Add(new CPluginVariable("Chatfilterrules(Regex)", typeof(string[]), this.lstStrChatFilterRules.ToArray()));
979 }
980 }
981 lstReturn.Add(new CPluginVariable("Enable Statslogging?", typeof(enumBoolYesNo), this.m_enLogSTATS));
982 lstReturn.Add(new CPluginVariable("Enable Weaponstats?", typeof(enumBoolYesNo), this.m_weaponstatsON));
983 //lstReturn.Add(new CPluginVariable("Update EA GUID?", typeof(enumBoolYesNo), this.m_UpdateEA_GUID));
984 //lstReturn.Add(new CPluginVariable("Update PB-GUID (NOT recommended!!!)?", typeof(enumBoolYesNo), this.m_UpdatePB_GUID));
985 lstReturn.Add(new CPluginVariable("Ranking by Score?", typeof(enumBoolYesNo), this.m_enRankingByScore));
986 lstReturn.Add(new CPluginVariable("Enable ingame commands?", typeof(enumBoolYesNo), this.m_enableInGameCommands));
987 lstReturn.Add(new CPluginVariable("Overall ranking(merged Serverranking)", typeof(enumBoolYesNo), this.m_enOverallRanking));
988 lstReturn.Add(new CPluginVariable("Server group (0 - 128)", this.intServerGroup.GetType(), this.intServerGroup));
989 lstReturn.Add(new CPluginVariable("Send Stats to all Players?", typeof(enumBoolYesNo), this.m_enSendStatsToAll));
990 lstReturn.Add(new CPluginVariable("Enable Livescoreboard in DB?", typeof(enumBoolYesNo), this.m_enableCurrentPlayerstatsTable));
991 lstReturn.Add(new CPluginVariable("Enable KDR correction?", typeof(enumBoolYesNo), this.m_kdrCorrection));
992 lstReturn.Add(new CPluginVariable("PlayerMessage", typeof(string[]), this.m_lstPlayerStatsMessage.ToArray()));
993 //Player of the day
994 lstReturn.Add(new CPluginVariable("Player of the day Message", typeof(string[]), this.m_lstPlayerOfTheDayMessage.ToArray()));
995 lstReturn.Add(new CPluginVariable("Weaponstats Message ", typeof(string[]), this.m_lstWeaponstatsMsg.ToArray()));
996 //Serverstats
997 lstReturn.Add(new CPluginVariable("Serverstats Message", typeof(string[]), this.m_lstServerstatsMsg.ToArray()));
998
999 lstReturn.Add(new CPluginVariable("Awards ON?", typeof(enumBoolYesNo), this.m_awardsON));
1000 lstReturn.Add(new CPluginVariable("Enable Welcomestats?", typeof(enumBoolYesNo), this.m_enWelcomeStats));
1001 lstReturn.Add(new CPluginVariable("Yell Welcome Message(not the stats)?", typeof(enumBoolYesNo), this.m_enYellWelcomeMSG));
1002 lstReturn.Add(new CPluginVariable("Welcome Message", typeof(string[]), this.m_lstPlayerWelcomeStatsMessage.ToArray()));
1003 lstReturn.Add(new CPluginVariable("Welcome Message for new Player", typeof(string[]), this.m_lstNewPlayerWelcomeMsg.ToArray()));
1004 lstReturn.Add(new CPluginVariable("Welcomestats Delay", this.int_welcomeStatsDelay.GetType(), this.int_welcomeStatsDelay));
1005 lstReturn.Add(new CPluginVariable("Top10 ingame", this.m_enTop10ingame.GetType(), this.m_enTop10ingame));
1006 lstReturn.Add(new CPluginVariable("Top10 header line", this.m_strTop10Header.GetType(), this.m_strTop10Header));
1007 lstReturn.Add(new CPluginVariable("Top10 row format", this.m_strTop10RowFormat.GetType(), this.m_strTop10RowFormat));
1008 //top10 for period
1009 lstReturn.Add(new CPluginVariable("Top10 for period header line", this.m_strTop10HeaderForPeriod.GetType(), this.m_strTop10HeaderForPeriod));
1010 lstReturn.Add(new CPluginVariable("Top10 for period interval days", this.m_intDaysForPeriodTop10.GetType(), this.m_intDaysForPeriodTop10));
1011 //Weapontop10
1012 lstReturn.Add(new CPluginVariable("WeaponTop10 header line", this.m_strWeaponTop10Header.GetType(), this.m_strWeaponTop10Header));
1013 lstReturn.Add(new CPluginVariable("WeaponTop10 row format", this.m_strWeaponTop10RowFormat.GetType(), this.m_strWeaponTop10RowFormat));
1014 //
1015 lstReturn.Add(new CPluginVariable("DebugLevel", "enum.Actions(Trace|Info|Warning|Error)", this.GlobalDebugMode));
1016 lstReturn.Add(new CPluginVariable("Keywordlist", typeof(string[]), this.m_lstTableconfig.ToArray()));
1017 lstReturn.Add(new CPluginVariable("tableSuffix", this.tableSuffix.GetType(), this.tableSuffix));
1018 lstReturn.Add(new CPluginVariable("MapStats ON?", typeof(enumBoolYesNo), this.m_mapstatsON));
1019 lstReturn.Add(new CPluginVariable("Session ON?", typeof(enumBoolYesNo), this.m_sessionON));
1020 lstReturn.Add(new CPluginVariable("SessionMessage", typeof(string[]), this.m_lstSessionMessage.ToArray()));
1021 lstReturn.Add(new CPluginVariable("Save Sessiondata to DB?", typeof(enumBoolYesNo), this.m_enSessionTracking));
1022 lstReturn.Add(new CPluginVariable("Playerrequests per Round", this.numberOfAllowedRequests.GetType(), this.numberOfAllowedRequests));
1023 lstReturn.Add(new CPluginVariable("Servertime Offset", this.m_dTimeOffset.GetType(), this.m_dTimeOffset));
1024
1025 //Ingame Command Setup
1026 /*
1027 this.m_IngameCommands_stats = "stats,rank";
1028 this.m_IngameCommands_serverstats = "serverstats";
1029 this.m_IngameCommands_session = "session";
1030 this.m_IngameCommands_dogtags = "dogtags";
1031 this.m_IngameCommands_top10 = "top10";
1032 this.m_IngameCommands_playerOfTheDay = "playeroftheday,potd";
1033 this.m_IngameCommands_top10ForPeriod = "weektop10,wtop10";
1034 */
1035 lstReturn.Add(new CPluginVariable("Stats Command:", this.m_IngameCommands_stats.GetType(), this.m_IngameCommands_stats));
1036 lstReturn.Add(new CPluginVariable("ServerStats Command:", this.m_IngameCommands_serverstats.GetType(), this.m_IngameCommands_serverstats));
1037 lstReturn.Add(new CPluginVariable("Session Command:", this.m_IngameCommands_session.GetType(), this.m_IngameCommands_session));
1038 lstReturn.Add(new CPluginVariable("Dogtags Command:", this.m_IngameCommands_dogtags.GetType(), this.m_IngameCommands_dogtags));
1039 lstReturn.Add(new CPluginVariable("Top10 Command:", this.m_IngameCommands_top10.GetType(), this.m_IngameCommands_top10));
1040 lstReturn.Add(new CPluginVariable("Player Of The Day Command:", this.m_IngameCommands_playerOfTheDay.GetType(), this.m_IngameCommands_playerOfTheDay));
1041 lstReturn.Add(new CPluginVariable("Top10 for period Command:", this.m_IngameCommands_top10ForPeriod.GetType(), this.m_IngameCommands_top10ForPeriod));
1042
1043 lstReturn.Add(new CPluginVariable("Periodical Webrequest On?(P&S Stats)", typeof(enumBoolYesNo), this.m_enWebrequest));
1044 if (this.m_enWebrequest == enumBoolYesNo.Yes)
1045 {
1046 lstReturn.Add(new CPluginVariable("Webaddress", this.m_webAddress.GetType(), this.m_webAddress));
1047 lstReturn.Add(new CPluginVariable("Webrequest Intervall", this.m_requestIntervall.GetType(), this.m_requestIntervall));
1048 }
1049 //Simple Stats
1050 lstReturn.Add(new CPluginVariable("Log playerdata only (no playerstats)?", typeof(enumBoolYesNo), this.m_enLogPlayerDataOnly));
1051 return lstReturn;
1052 }
1053
1054 public void SetPluginVariable(string strVariable, string strValue)
1055 {
1056 if (strVariable.CompareTo("Host") == 0)
1057 {
1058 this.m_strHost = strValue;
1059 }
1060 else if (strVariable.CompareTo("Port") == 0)
1061 {
1062 this.m_strDBPort = strValue;
1063 }
1064 else if (strVariable.CompareTo("Database Name") == 0)
1065 {
1066 this.m_strDatabase = strValue;
1067 }
1068 else if (strVariable.CompareTo("UserName") == 0)
1069 {
1070 this.m_strUserName = strValue;
1071 }
1072 else if (strVariable.CompareTo("Password") == 0)
1073 {
1074 this.m_strPassword = strValue;
1075 }
1076 else if (strVariable.CompareTo("High performance mode(no connection limit!)") == 0 && Enum.IsDefined(typeof(enumBoolOnOff), strValue) == true)
1077 {
1078 this.m_highPerformanceConnectionMode = (enumBoolOnOff)Enum.Parse(typeof(enumBoolOnOff), strValue);
1079 }
1080 else if (strVariable.CompareTo("Connection Pooling") == 0 && Enum.IsDefined(typeof(enumBoolOnOff), strValue) == true)
1081 {
1082 this.m_connectionPooling = (enumBoolOnOff)Enum.Parse(typeof(enumBoolOnOff), strValue);
1083 this.m_highPerformanceConnectionMode = enumBoolOnOff.On;
1084 }
1085 else if (strVariable.CompareTo("Min Connection Pool Size") == 0)
1086 {
1087 Int32.TryParse(strValue, out this.m_minPoolSize);
1088 if (this.m_minPoolSize < 0 || this.m_minPoolSize > this.m_maxPoolSize)
1089 {
1090 this.m_minPoolSize = 0;
1091 }
1092 }
1093 else if (strVariable.CompareTo("Max Connection Pool Size") == 0)
1094 {
1095 Int32.TryParse(strValue, out this.m_maxPoolSize);
1096 if (this.m_maxPoolSize < 1 || this.m_minPoolSize > this.m_maxPoolSize)
1097 {
1098 this.m_maxPoolSize = 10;
1099 }
1100 }
1101 else if (strVariable.CompareTo("Failed Transaction retry attempts") == 0)
1102 {
1103 Int32.TryParse(strValue, out TransactionRetryCount);
1104 if (TransactionRetryCount < 1)
1105 {
1106 TransactionRetryCount = 3;
1107 }
1108 }
1109 else if (strVariable.CompareTo("Minimum time(sec) between ServerInfo Updates") == 0)
1110 {
1111 if (Int32.TryParse(strValue, out this.minIntervalllenght))
1112 {
1113 if (this.minIntervalllenght < 1)
1114 {
1115 this.minIntervalllenght = 30;
1116 }
1117 }
1118 else
1119 {
1120 this.minIntervalllenght = 30;
1121 }
1122 }
1123 else if (strVariable.CompareTo("Enable Chatlogging?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1124 {
1125 this.m_enChatloggingON = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1126 }
1127 else if (strVariable.CompareTo("Log ServerSPAM?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1128 {
1129 this.m_enNoServerMsg = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1130 }
1131 else if (strVariable.CompareTo("Instant Logging of Chat Messages?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1132 {
1133 this.m_enInstantChatlogging = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1134 }
1135
1136 else if (strVariable.CompareTo("Enable chatlog filter(Regex)?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1137 {
1138 this.m_enChatlogFilter = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1139 }
1140 else if (strVariable.CompareTo("Chatfilterrules(Regex)") == 0)
1141 {
1142 this.lstStrChatFilterRules = new List<string>(CPluginVariable.DecodeStringArray(strValue));
1143 this.BuildRegexRuleset();
1144 }
1145 else if (strVariable.CompareTo("Enable Statslogging?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1146 {
1147 this.m_enLogSTATS = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1148 }
1149 //Log playerdata only (no playerstats)?
1150 else if (strVariable.CompareTo("Log playerdata only (no playerstats)?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1151 {
1152 this.m_enLogPlayerDataOnly = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1153 }
1154 else if (strVariable.CompareTo("Enable Weaponstats?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1155 {
1156 this.m_weaponstatsON = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1157 }
1158 else if (strVariable.CompareTo("Ranking by Score?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1159 {
1160 this.m_enRankingByScore = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1161 }
1162 else if (strVariable.CompareTo("Enable ingame commands?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1163 {
1164 this.m_enableInGameCommands = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1165 }
1166 else if (strVariable.CompareTo("Overall ranking(merged Serverranking)") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1167 {
1168 this.m_enOverallRanking = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1169 }
1170 else if (strVariable.CompareTo("Server group (0 - 128)") == 0)
1171 {
1172 if (Int32.TryParse(strValue, out this.intServerGroup))
1173 {
1174 if (this.intServerGroup > 128 || this.intServerGroup < 0)
1175 {
1176 this.intServerGroup = 0;
1177 }
1178 }
1179 else
1180 {
1181 this.intServerGroup = 0;
1182 }
1183 }
1184 else if (strVariable.CompareTo("Send Stats to all Players?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1185 {
1186 this.m_enSendStatsToAll = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1187 }
1188 else if (strVariable.CompareTo("Enable Livescoreboard in DB?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1189 {
1190 this.m_enableCurrentPlayerstatsTable = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1191 }
1192 else if (strVariable.CompareTo("Enable KDR correction?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1193 {
1194 this.m_kdrCorrection = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1195 }
1196 else if (strVariable.CompareTo("PlayerMessage") == 0)
1197 {
1198 this.m_lstPlayerStatsMessage = new List<string>(CPluginVariable.DecodeStringArray(strValue));
1199 }
1200 // player of the day
1201 else if (strVariable.CompareTo("Player of the day Message") == 0)
1202 {
1203 this.m_lstPlayerOfTheDayMessage = new List<string>(CPluginVariable.DecodeStringArray(strValue));
1204 }
1205 else if (strVariable.CompareTo("Weaponstats Message ") == 0)
1206 {
1207 this.m_lstWeaponstatsMsg = new List<string>(CPluginVariable.DecodeStringArray(strValue));
1208 }
1209 //Serverstats
1210 else if (strVariable.CompareTo("Serverstats Message") == 0)
1211 {
1212 this.m_lstServerstatsMsg = new List<string>(CPluginVariable.DecodeStringArray(strValue));
1213 }
1214 else if (strVariable.CompareTo("Enable Welcomestats?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1215 {
1216 this.m_enWelcomeStats = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1217 }
1218 else if (strVariable.CompareTo("Awards ON?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1219 {
1220 this.m_awardsON = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1221 }
1222 else if (strVariable.CompareTo("Yell Welcome Message(not the stats)?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1223 {
1224 this.m_enYellWelcomeMSG = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1225 }
1226 else if (strVariable.CompareTo("Welcome Message") == 0)
1227 {
1228 //this.m_strPlayerWelcomeMsg = strValue;
1229 this.m_lstPlayerWelcomeStatsMessage = new List<string>(CPluginVariable.DecodeStringArray(strValue));
1230 }
1231 else if (strVariable.CompareTo("Welcome Message for new Player") == 0)
1232 {
1233 this.m_lstNewPlayerWelcomeMsg = new List<string>(CPluginVariable.DecodeStringArray(strValue));
1234 }
1235 else if (strVariable.CompareTo("Welcomestats Delay") == 0 && Int32.TryParse(strValue, out int_welcomeStatsDelay) == true)
1236 {
1237 this.int_welcomeStatsDelay = Convert.ToInt32(strValue);
1238 }
1239 else if (strVariable.CompareTo("Top10 ingame") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1240 {
1241 this.m_enTop10ingame = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1242 }
1243 //top10
1244 else if (strVariable.CompareTo("Top10 header line") == 0)
1245 {
1246 this.m_strTop10Header = strValue;
1247 }
1248 else if (strVariable.CompareTo("Top10 row format") == 0)
1249 {
1250 this.m_strTop10RowFormat = strValue;
1251 }
1252 // top10 for period
1253 else if (strVariable.CompareTo("Top10 for period header line") == 0)
1254 {
1255 this.m_strTop10HeaderForPeriod = strValue;
1256 }
1257 else if (strVariable.CompareTo("Top10 for period interval days") == 0)
1258 {
1259 if (Int32.TryParse(strValue, out this.m_intDaysForPeriodTop10) == false)
1260 {
1261 this.m_intDaysForPeriodTop10 = 7;
1262 }
1263 }
1264 else if (strVariable.CompareTo("WeaponTop10 header line") == 0)
1265 {
1266 this.m_strWeaponTop10Header = strValue;
1267 }
1268 else if (strVariable.CompareTo("WeaponTop10 row format") == 0)
1269 {
1270 this.m_strWeaponTop10RowFormat = strValue;
1271 }
1272 else if (strVariable.CompareTo("DebugLevel") == 0)
1273 {
1274 this.GlobalDebugMode = strValue;
1275 }
1276 else if (strVariable.CompareTo("Keywordlist") == 0)
1277 {
1278 this.m_lstTableconfig = new List<string>(CPluginVariable.DecodeStringArray(strValue));
1279 }
1280 else if (strVariable.CompareTo("tableSuffix") == 0)
1281 {
1282 this.tableSuffix = strValue;
1283 this.prepareTablenames();
1284 this.setGameMod();
1285 this.boolTableEXISTS = false;
1286 }
1287 else if (strVariable.CompareTo("MapStats ON?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1288 {
1289 this.m_mapstatsON = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1290 }
1291 else if (strVariable.CompareTo("Session ON?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1292 {
1293 this.m_sessionON = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1294 }
1295 else if (strVariable.CompareTo("SessionMessage") == 0)
1296 {
1297 this.m_lstSessionMessage = new List<string>(CPluginVariable.DecodeStringArray(strValue));
1298 }
1299 else if (strVariable.CompareTo("Save Sessiondata to DB?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1300 {
1301 this.m_enSessionTracking = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1302 }
1303 else if (strVariable.CompareTo("Playerrequests per Round") == 0 && Int32.TryParse(strValue, out numberOfAllowedRequests) == true)
1304 {
1305 this.numberOfAllowedRequests = Convert.ToInt32(strValue);
1306 }
1307 else if (strVariable.CompareTo("Servertime Offset") == 0 && Double.TryParse(strValue, out m_dTimeOffset) == true)
1308 {
1309 this.m_dTimeOffset = Convert.ToDouble(strValue);
1310 this.MyDateTime = new myDateTime_W(this.m_dTimeOffset);
1311 }
1312
1313 //Webrequest
1314 /*
1315 else if (strVariable.CompareTo("Periodical Webrequest On?(P&S Stats)") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
1316 {
1317 this.m_enWebrequest = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
1318 }
1319 else if (strVariable.CompareTo("Webaddress") == 0)
1320 {
1321 this.m_webAddress = strValue;
1322 }
1323 else if (strVariable.CompareTo("Webrequest Intervall") == 0 && Int32.TryParse(strValue, out this.m_requestIntervall) == true)
1324 {
1325 this.m_requestIntervall = Convert.ToInt32(strValue);
1326 }
1327 */
1328 else if (strVariable.CompareTo("Stats Command:") == 0)
1329 {
1330 this.m_IngameCommands_stats = strValue;
1331 }
1332 else if (strVariable.CompareTo("ServerStats Command:") == 0)
1333 {
1334 this.m_IngameCommands_serverstats = strValue;
1335 }
1336 else if (strVariable.CompareTo("Session Command:") == 0)
1337 {
1338 this.m_IngameCommands_session = strValue;
1339 }
1340 else if (strVariable.CompareTo("Dogtags Command:") == 0)
1341 {
1342 this.m_IngameCommands_dogtags = strValue;
1343 }
1344 else if (strVariable.CompareTo("Top10 Command:") == 0)
1345 {
1346 this.m_IngameCommands_top10 = strValue;
1347 }
1348 else if (strVariable.CompareTo("Player Of The Day Command:") == 0)
1349 {
1350 this.m_IngameCommands_playerOfTheDay = strValue;
1351 }
1352 else if (strVariable.CompareTo("Top10 for period Command:") == 0)
1353 {
1354 this.m_IngameCommands_top10ForPeriod = strValue;
1355 }
1356 this.RegisterAllCommands();
1357 }
1358
1359 private List<string> GetExcludedCommandStrings(string strAccountName)
1360 {
1361 List<string> lstReturnCommandStrings = new List<string>();
1362 List<MatchCommand> lstCommands = this.GetRegisteredCommands();
1363 CPrivileges privileges = this.GetAccountPrivileges(strAccountName);
1364 foreach (MatchCommand mtcCommand in lstCommands)
1365 {
1366 if (mtcCommand.Requirements.HasValidPermissions(privileges) == true && lstReturnCommandStrings.Contains(mtcCommand.Command) == false)
1367 {
1368 lstReturnCommandStrings.Add(mtcCommand.Command);
1369 }
1370 }
1371 return lstReturnCommandStrings;
1372 }
1373
1374 private List<string> GetCommandStrings()
1375 {
1376 List<string> lstReturnCommandStrings = new List<string>();
1377 List<MatchCommand> lstCommands = this.GetRegisteredCommands();
1378 foreach (MatchCommand mtcCommand in lstCommands)
1379 {
1380 if (lstReturnCommandStrings.Contains(mtcCommand.Command) == false)
1381 {
1382 lstReturnCommandStrings.Add(mtcCommand.Command);
1383 }
1384 }
1385 return lstReturnCommandStrings;
1386 }
1387
1388 private void UnregisterAllCommands()
1389 {
1390 this.setupIngameCommandDic();
1391 try
1392 {
1393 foreach (KeyValuePair<string, CStatsIngameCommands> kvp in this.dicIngameCommands)
1394 {
1395 if (kvp.Value.commands != string.Empty)
1396 {
1397 foreach (string command in kvp.Value.commands.Split(','))
1398 {
1399 this.UnregisterCommand(new MatchCommand("CChatGUIDStatsLogger", kvp.Value.functioncall.ToString(), this.Listify<string>("@", "!", "#"), command.ToString(), this.Listify<MatchArgumentFormat>(), new ExecutionRequirements(ExecutionScope.All), kvp.Value.description.ToString()));
1400 }
1401 }
1402 }
1403 }
1404 catch (Exception e)
1405 {
1406 this.DebugInfo("Error", "Error in UnregisterAllCommands: " + e);
1407 }
1408 }
1409
1410 private void SetupHelpCommands()
1411 {
1412
1413 }
1414
1415 private void RegisterAllCommands()
1416 {
1417 lock (this.registerallcomandslock)
1418 {
1419 this.setupIngameCommandDic();
1420 if (this.m_isPluginEnabled == true)
1421 {
1422 if (this.m_enableInGameCommands == enumBoolYesNo.No)
1423 {
1424 this.UnregisterAllCommands();
1425 return;
1426 }
1427 this.SetupHelpCommands();
1428
1429 try
1430 {
1431 foreach (KeyValuePair<string, CStatsIngameCommands> kvp in this.dicIngameCommands)
1432 {
1433 if (kvp.Value.commands != string.Empty)
1434 {
1435 foreach (string command in kvp.Value.commands.Split(','))
1436 {
1437 if (kvp.Value.boolEnabled)
1438 {
1439 this.RegisterCommand(new MatchCommand("CChatGUIDStatsLogger", kvp.Value.functioncall, this.Listify<string>("@", "!", "#"), command, this.Listify<MatchArgumentFormat>(), new ExecutionRequirements(ExecutionScope.All), kvp.Value.description));
1440 }
1441 else
1442 {
1443 this.UnregisterCommand(new MatchCommand("CChatGUIDStatsLogger", kvp.Value.functioncall, this.Listify<string>("@", "!", "#"), command, this.Listify<MatchArgumentFormat>(), new ExecutionRequirements(ExecutionScope.All), kvp.Value.description));
1444 }
1445 }
1446 }
1447 }
1448 }
1449 catch (Exception e)
1450 {
1451 this.DebugInfo("Error", "Error in RegisterAllCommands: " + e);
1452 }
1453 }
1454 }
1455 }
1456
1457 private void setupIngameCommandDic()
1458 {
1459 lock (this.dicIngameCommands)
1460 {
1461 bool boolenable = false;
1462 this.dicIngameCommands.Clear();
1463 if (this.m_enLogSTATS == enumBoolYesNo.Yes && this.m_enableInGameCommands == enumBoolYesNo.Yes)
1464 {
1465 boolenable = true;
1466 }
1467 this.dicIngameCommands.Add("playerstats", new CStatsIngameCommands(this.m_IngameCommands_stats, "OnCommandStats", boolenable, "Provides a player his personal serverstats"));
1468 this.dicIngameCommands.Add("serverstats", new CStatsIngameCommands(this.m_IngameCommands_serverstats, "OnCommandServerStats", boolenable, "Provides a player his personal serverstats"));
1469 this.dicIngameCommands.Add("dogtagstats", new CStatsIngameCommands(this.m_IngameCommands_dogtags, "OnCommandDogtags", boolenable, "Provides a player his personal dogtagstats"));
1470 this.dicIngameCommands.Add("session", new CStatsIngameCommands(this.m_IngameCommands_session, "OnCommandSession", boolenable, "Provides a player his personal sessiondata"));
1471 this.dicIngameCommands.Add("playeroftheday", new CStatsIngameCommands(this.m_IngameCommands_playerOfTheDay, "OnCommandPlayerOfTheDay", boolenable, "Provides the player of the day stats"));
1472
1473 if (this.m_enLogSTATS == enumBoolYesNo.Yes && this.m_enTop10ingame == enumBoolYesNo.Yes && this.m_enableInGameCommands == enumBoolYesNo.Yes)
1474 {
1475 this.dicIngameCommands.Add("top10", new CStatsIngameCommands(this.m_IngameCommands_top10, "OnCommandTop10", true, "Provides a player top10 Players"));
1476 this.dicIngameCommands.Add("top10forperiode", new CStatsIngameCommands(this.m_IngameCommands_top10ForPeriod, "OnCommandTop10ForPeriod", true, "Provides a player top10 Players for a specific timeframe"));
1477 }
1478 else
1479 {
1480 this.dicIngameCommands.Add("top10", new CStatsIngameCommands(this.m_IngameCommands_top10, "OnCommandTop10", false, "Provides a player top10 Players"));
1481 this.dicIngameCommands.Add("top10forperiode", new CStatsIngameCommands(this.m_IngameCommands_top10ForPeriod, "OnCommandTop10ForPeriod", false, "Provides a player top10 Players for a specific timeframe"));
1482 }
1483 }
1484 }
1485 #endregion
1486
1487 #region IPRoConPluginInterface
1488 /*=======ProCon Events========*/
1489 // Player events
1490 public override void OnPlayerJoin(string strSoldierName)
1491 {
1492 if (this.StatsTracker.ContainsKey(strSoldierName) == false)
1493 {
1494 CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic);
1495 StatsTracker.Add(strSoldierName, newEntry);
1496 }
1497 ThreadPool.QueueUserWorkItem(delegate { this.CreateSession(strSoldierName, 0, String.Empty); });
1498
1499 if (bool_roundStarted == true && StatsTracker.ContainsKey(strSoldierName) == true)
1500 {
1501 if (StatsTracker[strSoldierName].PlayerOnServer == false)
1502 {
1503 if (this.StatsTracker[strSoldierName].TimePlayerjoined == null)
1504 {
1505 this.StatsTracker[strSoldierName].TimePlayerjoined = MyDateTime.Now;
1506 }
1507 this.StatsTracker[strSoldierName].Playerjoined = MyDateTime.Now;
1508 this.StatsTracker[strSoldierName].PlayerOnServer = true;
1509 }
1510 }
1511 //Mapstatscounter for Player who joined the server
1512 this.Mapstats.IntplayerjoinedServer++;
1513
1514 if (this.m_enWelcomeStats == enumBoolYesNo.Yes)
1515 {
1516 if (this.welcomestatsDic.ContainsKey(strSoldierName))
1517 {
1518 //Update jointime
1519 this.welcomestatsDic[strSoldierName] = MyDateTime.Now;
1520 }
1521 else
1522 {
1523 //Insert
1524 this.DebugInfo("Trace", "Added Player: " + strSoldierName + " to welcomestatslist");
1525 this.welcomestatsDic.Add(strSoldierName, MyDateTime.Now);
1526 }
1527 }
1528 }
1529
1530 public override void OnPlayerAuthenticated(string soldierName, string guid)
1531 {
1532 if (this.StatsTracker.ContainsKey(soldierName) == false)
1533 {
1534 CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic);
1535 StatsTracker.Add(soldierName, newEntry);
1536 if (guid.Length > 0)
1537 {
1538 StatsTracker[soldierName].EAGuid = guid;
1539 }
1540 }
1541 }
1542
1543 // Will receive ALL chat global/team/squad in R3.
1544 public override void OnGlobalChat(string strSpeaker, string strMessage)
1545 {
1546 if (strMessage.Length > 0)
1547 {
1548 ThreadPool.QueueUserWorkItem(delegate { this.LogChat(strSpeaker, strMessage, "Global"); });
1549 }
1550 }
1551
1552 // Place holder, non-functioning in R3. It recieves the same data as OnGlobalChat though so look out for now.
1553 public override void OnTeamChat(string strSpeaker, string strMessage, int iTeamID)
1554 {
1555 if (strMessage.Length > 0)
1556 {
1557 ThreadPool.QueueUserWorkItem( delegate { this.LogChat(strSpeaker, strMessage, "Team"); });
1558 }
1559 }
1560
1561 // Place holder, non-functioning in R3. It recieves the same data as OnGlobalChat though so look out for now.
1562 public override void OnSquadChat(string strSpeaker, string strMessage, int iTeamID, int iSquadID)
1563 {
1564 if (strMessage.Length > 0)
1565 {
1566 ThreadPool.QueueUserWorkItem(delegate { this.LogChat(strSpeaker, strMessage, "Squad"); });
1567 }
1568 }
1569
1570 public override void OnPunkbusterMessage(string strPunkbusterMessage)
1571 {
1572 try
1573 {
1574 // This piece of code gets the number of player out of Punkbustermessages
1575 string playercount = String.Empty;
1576 if (strPunkbusterMessage.Contains("End of Player List"))
1577 {
1578 playercount = strPunkbusterMessage.Remove(0, 1 + strPunkbusterMessage.LastIndexOf("("));
1579 playercount = playercount.Replace(" ", "");
1580 playercount = playercount.Remove(playercount.LastIndexOf("P"), playercount.LastIndexOf(")"));
1581 //this.DebugInfo("EoPl: "+playercount);
1582 int players = Convert.ToInt32(playercount);
1583 if (players >= intRoundStartCount && bool_roundStarted == false)
1584 {
1585 bool_roundStarted = true;
1586 Time_RankingStarted = MyDateTime.Now;
1587 //Mapstats Roundstarted
1588 this.Mapstats.MapStarted();
1589 }
1590 else if (players >= intRoundStartCount && this.Mapstats.TimeMapStarted == DateTime.MinValue)
1591 {
1592 this.Mapstats.MapStarted();
1593 }
1594 //MapStats Playercount
1595 this.Mapstats.ListADD(players);
1596 }
1597 }
1598 catch (Exception c)
1599 {
1600 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error in OnPunkbusterMessage: " + c);
1601 }
1602 }
1603
1604 public override void OnPunkbusterPlayerInfo(CPunkbusterInfo cpbiPlayer)
1605 {
1606 this.RegisterAllCommands();
1607 if (this.m_enLogSTATS == enumBoolYesNo.Yes)
1608 {
1609 try
1610 {
1611 this.AddPBInfoToStats(cpbiPlayer);
1612 if (this.StatsTracker.ContainsKey(cpbiPlayer.SoldierName))
1613 {
1614 if (this.StatsTracker[cpbiPlayer.SoldierName].TimePlayerjoined == null)
1615 {
1616 this.StatsTracker[cpbiPlayer.SoldierName].TimePlayerjoined = MyDateTime.Now;
1617 }
1618 this.StatsTracker[cpbiPlayer.SoldierName].IP = cpbiPlayer.Ip;
1619 }
1620 }
1621 catch (Exception c)
1622 {
1623 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error in OnPunkbusterPlayerInfo: " + c);
1624 }
1625 }
1626 }
1627
1628 // Query Events
1629 public override void OnServerInfo(CServerInfo csiServerInfo)
1630 {
1631 this.serverName = csiServerInfo.ServerName;
1632 this.Mapstats.StrGamemode = csiServerInfo.GameMode;
1633 this.Mapstats.ListADD(csiServerInfo.PlayerCount);
1634 //Mapstats
1635 if (csiServerInfo.PlayerCount >= intRoundStartCount && this.Mapstats.TimeMapStarted == DateTime.MinValue)
1636 {
1637 this.Mapstats.MapStarted();
1638 }
1639 this.Mapstats.StrMapname = csiServerInfo.Map;
1640 this.Mapstats.IntRound = csiServerInfo.CurrentRound;
1641 this.Mapstats.IntNumberOfRounds = csiServerInfo.TotalRounds;
1642 this.Mapstats.IntServerplayermax = csiServerInfo.MaxPlayerCount;
1643
1644 if(this.ServerID == 0 || this.minIntervalllenght <= (DateTime.Now.Subtract(this.dtLastServerInfoEvent).TotalSeconds))
1645 {
1646 this.dtLastServerInfoEvent = DateTime.Now;
1647 try
1648 {
1649 ThreadPool.QueueUserWorkItem(delegate { this.getUpdateServerID(csiServerInfo); });
1650 }
1651 catch { };
1652 }
1653 }
1654
1655 public override void OnListPlayers(List<CPlayerInfo> lstPlayers, CPlayerSubset cpsSubset)
1656 {
1657 //List<CPlayerInfo> PlayerList = new List<CPlayerInfo>();
1658 //Mapstats Add Playercount to list
1659 this.Mapstats.ListADD(lstPlayers.Count);
1660 if (bool_roundStarted == false)
1661 {
1662 if (lstPlayers.Count >= intRoundStartCount)
1663 {
1664 bool_roundStarted = true;
1665 Time_RankingStarted = MyDateTime.Now;
1666 this.DebugInfo("Trace", "OLP: roundstarted");
1667 //Mapstats Roundstarted
1668 this.Mapstats.MapStarted();
1669 }
1670 }
1671 if (lstPlayers.Count >= intRoundStartCount && this.Mapstats.TimeMapStarted == DateTime.MinValue)
1672 {
1673 this.Mapstats.MapStarted();
1674 }
1675 try
1676 {
1677 foreach (CPlayerInfo cpiPlayer in lstPlayers)
1678 {
1679 if (this.m_dicPlayers.ContainsKey(cpiPlayer.SoldierName) == true)
1680 {
1681 this.m_dicPlayers[cpiPlayer.SoldierName] = cpiPlayer;
1682 }
1683 else
1684 {
1685 this.m_dicPlayers.Add(cpiPlayer.SoldierName, cpiPlayer);
1686 }
1687 //Timelogging
1688 if (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true)
1689 {
1690 if (this.StatsTracker[cpiPlayer.SoldierName].PlayerOnServer == false)
1691 {
1692 this.StatsTracker[cpiPlayer.SoldierName].Playerjoined = MyDateTime.Now;
1693 this.StatsTracker[cpiPlayer.SoldierName].PlayerOnServer = true;
1694 }
1695 //EA-GUID, ClanTag, usw.
1696 if (cpiPlayer.GUID.Length > 3)
1697 {
1698 this.StatsTracker[cpiPlayer.SoldierName].EAGuid = cpiPlayer.GUID;
1699 //ID - Cache
1700 if (this.m_ID_cache.ContainsKey(cpiPlayer.GUID))
1701 {
1702 this.m_ID_cache[cpiPlayer.GUID].PlayeronServer = true;
1703 }
1704 }
1705 this.StatsTracker[cpiPlayer.SoldierName].ClanTag = cpiPlayer.ClanTag;
1706 //TeamId
1707 this.StatsTracker[cpiPlayer.SoldierName].TeamId = cpiPlayer.TeamID;
1708 if (cpiPlayer.Score != 0)
1709 {
1710 this.StatsTracker[cpiPlayer.SoldierName].Score = cpiPlayer.Score;
1711 }
1712 //GlobalRank
1713 if (cpiPlayer.Rank >= 0)
1714 {
1715 this.StatsTracker[cpiPlayer.SoldierName].GlobalRank = cpiPlayer.Rank;
1716 }
1717
1718 //KDR Correction
1719 if (this.m_kdrCorrection == enumBoolYesNo.Yes && ((cpiPlayer.Deaths == 0 && cpiPlayer.Kills == 0 && cpiPlayer.Score == 0) == false))
1720 {
1721 if (this.StatsTracker[cpiPlayer.SoldierName].Deaths > (cpiPlayer.Deaths + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftDeaths))
1722 {
1723 this.DebugInfo("Trace", "OnListPlayers Player: " + cpiPlayer.SoldierName + " has " + this.StatsTracker[cpiPlayer.SoldierName].Deaths + " deaths; correcting to " + cpiPlayer.Deaths + " deaths now");
1724 this.StatsTracker[cpiPlayer.SoldierName].Deaths = (cpiPlayer.Deaths + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftDeaths);
1725 }
1726 if (this.StatsTracker[cpiPlayer.SoldierName].Kills > (cpiPlayer.Kills + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftKills))
1727 {
1728 this.StatsTracker[cpiPlayer.SoldierName].Kills = (cpiPlayer.Kills + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftKills);
1729 }
1730 }
1731
1732 }
1733 //Session Score
1734 if (this.m_sessionON == enumBoolYesNo.Yes)
1735 {
1736 lock (this.sessionlock)
1737 {
1738 if (this.m_dicSession.ContainsKey(cpiPlayer.SoldierName))
1739 {
1740 this.m_dicSession[cpiPlayer.SoldierName].AddScore(cpiPlayer.Score);
1741 //KDR Correction
1742 if (this.m_kdrCorrection == enumBoolYesNo.Yes && ((cpiPlayer.Deaths == 0 && cpiPlayer.Kills == 0 && cpiPlayer.Score == 0) == false))
1743 {
1744 if (this.m_dicSession[cpiPlayer.SoldierName].Deaths > (cpiPlayer.Deaths + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftDeaths))
1745 {
1746 this.DebugInfo("Trace", "Player: " + cpiPlayer.SoldierName + " has " + this.m_dicSession[cpiPlayer.SoldierName].Deaths + " deaths; correcting to " + cpiPlayer.Deaths + " deaths now");
1747 this.m_dicSession[cpiPlayer.SoldierName].Deaths = (cpiPlayer.Deaths + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftDeaths);
1748 }
1749 if (this.m_dicSession[cpiPlayer.SoldierName].Kills > (cpiPlayer.Kills + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftKills))
1750 {
1751 this.m_dicSession[cpiPlayer.SoldierName].Kills = (cpiPlayer.Kills + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftKills);
1752 }
1753 }
1754 if (cpiPlayer.GUID.Length > 2)
1755 {
1756 this.m_dicSession[cpiPlayer.SoldierName].EAGuid = cpiPlayer.GUID;
1757 }
1758 //TeamId
1759 this.m_dicSession[cpiPlayer.SoldierName].TeamId = cpiPlayer.TeamID;
1760 }
1761 else
1762 {
1763 ThreadPool.QueueUserWorkItem(delegate { this.CreateSession(cpiPlayer.SoldierName, cpiPlayer.Score, cpiPlayer.GUID); });
1764 }
1765 }
1766 }
1767 //Checking the sessiondic
1768 //ThreadPool.QueueUserWorkItem(delegate { this.CheckSessionDic(lstPlayers); });
1769 //this.CreateSession(cpiPlayer.SoldierName, cpiPlayer.Score);
1770 }
1771
1772 if (this.m_enableCurrentPlayerstatsTable == enumBoolYesNo.Yes && this.ServerID > 0 && this.minIntervalllenght <= (DateTime.Now.Subtract(this.dtLastOnListPlayersEvent).TotalSeconds))
1773 {
1774 ThreadPool.QueueUserWorkItem(delegate { this.UpdateCurrentPlayerTable(lstPlayers); });
1775 this.dtLastOnListPlayersEvent = DateTime.Now;
1776 }
1777 }
1778 catch (Exception c)
1779 {
1780 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error in OnListPlayers: " + c);
1781 }
1782 }
1783
1784 public override void OnPlayerKilled(Kill kKillerVictimDetails)
1785 {
1786 bool_roundStarted = true;
1787 if (bool_roundStarted == true)
1788 {
1789 this.playerKilled(kKillerVictimDetails);
1790 }
1791 }
1792
1793 public override void OnPlayerLeft(CPlayerInfo cpiPlayer)
1794 {
1795 this.playerLeftServer(cpiPlayer);
1796 this.RegisterAllCommands();
1797 }
1798
1799 public override void OnRoundOverPlayers(List<CPlayerInfo> lstPlayers)
1800 {
1801 this.DebugInfo("Trace", "OnRoundOverPlayers Event");
1802 foreach (CPlayerInfo cpiPlayer in lstPlayers)
1803 {
1804 if (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true)
1805 {
1806 this.StatsTracker[cpiPlayer.SoldierName].Score = cpiPlayer.Score;
1807 //EA-GUID, ClanTag, usw.
1808 if (cpiPlayer.GUID.Length > 3)
1809 {
1810 this.StatsTracker[cpiPlayer.SoldierName].EAGuid = cpiPlayer.GUID;
1811 //ID - Cache
1812 if (this.m_ID_cache.ContainsKey(cpiPlayer.GUID))
1813 {
1814 this.m_ID_cache[cpiPlayer.GUID].PlayeronServer = true;
1815 }
1816 }
1817 this.StatsTracker[cpiPlayer.SoldierName].ClanTag = cpiPlayer.ClanTag;
1818 //TeamId
1819 this.StatsTracker[cpiPlayer.SoldierName].TeamId = cpiPlayer.TeamID;
1820
1821 //KDR Correction
1822 if (this.m_kdrCorrection == enumBoolYesNo.Yes && ((cpiPlayer.Deaths == 0 && cpiPlayer.Kills == 0 && cpiPlayer.Score == 0) == false))
1823 {
1824 if (this.StatsTracker[cpiPlayer.SoldierName].Deaths > (cpiPlayer.Deaths + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftDeaths))
1825 {
1826 this.DebugInfo("Trace", "Player: " + cpiPlayer.SoldierName + " has " + this.StatsTracker[cpiPlayer.SoldierName].Deaths + " deaths; correcting to " + cpiPlayer.Deaths + " deaths now");
1827 this.StatsTracker[cpiPlayer.SoldierName].Deaths = (cpiPlayer.Deaths + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftDeaths);
1828 }
1829 if (this.StatsTracker[cpiPlayer.SoldierName].Kills > (cpiPlayer.Kills + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftKills))
1830 {
1831 this.StatsTracker[cpiPlayer.SoldierName].Kills = (cpiPlayer.Kills + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftKills);
1832 }
1833 }
1834 //GlobalRank
1835 if (cpiPlayer.Rank >= 0)
1836 {
1837 this.StatsTracker[cpiPlayer.SoldierName].GlobalRank = cpiPlayer.Rank;
1838 }
1839 }
1840 //Session Score
1841 lock (this.sessionlock)
1842 {
1843 if (this.m_dicSession.ContainsKey(cpiPlayer.SoldierName) && this.m_sessionON == enumBoolYesNo.Yes)
1844 {
1845 //KDR Correction
1846 if (this.m_kdrCorrection == enumBoolYesNo.Yes && ((cpiPlayer.Deaths == 0 && cpiPlayer.Kills == 0 && cpiPlayer.Score == 0) == false))
1847 {
1848 if (this.m_dicSession[cpiPlayer.SoldierName].Deaths > (cpiPlayer.Deaths + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftDeaths))
1849 {
1850 this.DebugInfo("Trace", "Player: " + cpiPlayer.SoldierName + " has " + this.m_dicSession[cpiPlayer.SoldierName].Deaths + " deaths; correcting to " + cpiPlayer.Deaths + " deaths now");
1851 this.m_dicSession[cpiPlayer.SoldierName].Deaths = (cpiPlayer.Deaths + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftDeaths);
1852 }
1853 if (this.m_dicSession[cpiPlayer.SoldierName].Kills > (cpiPlayer.Kills + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftKills))
1854 {
1855 this.m_dicSession[cpiPlayer.SoldierName].Kills = (cpiPlayer.Kills + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftKills);
1856 }
1857 }
1858 this.m_dicSession[cpiPlayer.SoldierName].AddScore(cpiPlayer.Score);
1859 this.m_dicSession[cpiPlayer.SoldierName].LastScore = 0;
1860 this.m_dicSession[cpiPlayer.SoldierName].Rounds++;
1861 this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftKills += this.m_dicSession[cpiPlayer.SoldierName].Kills;
1862 this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftDeaths += this.m_dicSession[cpiPlayer.SoldierName].Deaths;
1863 //TeamId
1864 this.m_dicSession[cpiPlayer.SoldierName].TeamId = cpiPlayer.TeamID;
1865 if (cpiPlayer.GUID.Length > 2)
1866 {
1867 this.m_dicSession[cpiPlayer.SoldierName].EAGuid = cpiPlayer.GUID;
1868 }
1869 }
1870 else
1871 {
1872 ThreadPool.QueueUserWorkItem(delegate { this.CreateSession(cpiPlayer.SoldierName, cpiPlayer.Score, cpiPlayer.GUID); });
1873 }
1874 }
1875 }
1876 this.Mapstats.MapEnd();
1877 }
1878
1879 public override void OnRoundOver(int winningTeamId)
1880 {
1881 this.DebugInfo("Trace", "OnRoundOver: TeamId -> " + winningTeamId);
1882 //StatsTracker
1883 foreach (KeyValuePair<string, CStats> kvp in this.StatsTracker)
1884 {
1885 if (kvp.Value.PlayerOnServer == true)
1886 {
1887 if (kvp.Value.TeamId == winningTeamId)
1888 {
1889 this.StatsTracker[kvp.Key].Wins++;
1890 }
1891 else
1892 {
1893 this.StatsTracker[kvp.Key].Losses++;
1894 }
1895 }
1896 }
1897 //Session
1898 lock (this.sessionlock)
1899 {
1900 foreach (KeyValuePair<string, CStats> kvp in this.m_dicSession)
1901 {
1902 if (kvp.Value.PlayerOnServer == true)
1903 {
1904 if (kvp.Value.TeamId == winningTeamId)
1905 {
1906 this.m_dicSession[kvp.Key].Wins++;
1907 }
1908 else
1909 {
1910 this.m_dicSession[kvp.Key].Losses++;
1911 }
1912 }
1913 }
1914 }
1915 }
1916
1917 public override void OnPlayerSpawned(string soldierName, Inventory spawnedInventory)
1918 {
1919 if (bool_roundStarted == true && StatsTracker.ContainsKey(soldierName) == true)
1920 {
1921 if (StatsTracker[soldierName].PlayerOnServer == false)
1922 {
1923 this.StatsTracker[soldierName].Playerjoined = MyDateTime.Now;
1924 this.StatsTracker[soldierName].PlayerOnServer = true;
1925 }
1926 }
1927 if (this.m_enWelcomeStats == enumBoolYesNo.Yes)
1928 {
1929 if(this.welcomestatsDic.ContainsKey(soldierName))
1930 {
1931 //Call of the Welcomstatsfunction
1932 ThreadPool.QueueUserWorkItem(delegate { this.WelcomeStats(soldierName); });
1933 lock(this.welcomestatsDic)
1934 {
1935 this.welcomestatsDic.Remove(soldierName);
1936 }
1937 }
1938 }
1939 }
1940
1941 public override void OnLevelLoaded(string mapFileName, string Gamemode, int roundsPlayed, int roundsTotal)
1942 {
1943 if ((DateTime.Now.Subtract(this.dtLastRoundendEvent)).TotalSeconds > 30)
1944 {
1945 this.dtLastRoundendEvent = DateTime.Now;
1946 this.DebugInfo("Info", "OnLevelLoaded: " + mapFileName + " Gamemode: " + Gamemode + " Round: " + (roundsPlayed + 1) + "/" + roundsTotal);
1947 this.DebugInfo("Info", "update sql server");
1948 this.Nextmapinfo = new CMapstats(MyDateTime.Now, mapFileName, (roundsPlayed + 1), roundsTotal, this.m_dTimeOffset);
1949 //Calculate Awards
1950 this.calculateAwards();
1951 new Thread(StartStreaming).Start();
1952 m_dicPlayers.Clear();
1953 this.Spamprotection.Reset();
1954 }
1955 }
1956
1957 public override void OnRoundStartPlayerCount(int limit)
1958 {
1959 this.intRoundStartCount = limit;
1960 }
1961
1962 public override void OnRoundRestartPlayerCount(int limit)
1963 {
1964 this.intRoundRestartCount = limit;
1965 }
1966
1967 #endregion
1968
1969 #region External Commands (ColColonCleaner)
1970
1971 public void GetStatus(params String[] commands)
1972 {
1973 this.DebugInfo("Info", "GetStatus starting!");
1974 if (commands.Length < 1)
1975 {
1976 this.DebugInfo("Error", "Status fetch request canceled, no parameters provided.");
1977 return;
1978 }
1979
1980 new Thread(new ParameterizedThreadStart(SendStatus)).Start(commands[0]);
1981 this.DebugInfo("Info", "GetStatus finished!");
1982 }
1983
1984 private void SendStatus(Object clientInformation)
1985 {
1986 this.DebugInfo("Info", "SendStatus starting!");
1987 try
1988 {
1989 //Set current thread name
1990 Thread.CurrentThread.Name = "SendStatus";
1991
1992 //Parse client plugin information
1993 Hashtable parsedClientInformation = (Hashtable)JSON.JsonDecode((String)clientInformation);
1994 String pluginName = String.Empty;
1995 String pluginMethod = String.Empty;
1996 if (!parsedClientInformation.ContainsKey("pluginName"))
1997 {
1998 this.DebugInfo("Error", "Parsed command didn't contain a pluginName!");
1999 return;
2000 }
2001 else
2002 {
2003 pluginName = (String)parsedClientInformation["pluginName"];
2004 }
2005
2006 if (!parsedClientInformation.ContainsKey("pluginMethod"))
2007 {
2008 this.DebugInfo("Error", "Parsed command didn't contain a pluginMethod!");
2009 return;
2010 }
2011 else
2012 {
2013 pluginMethod = (String)parsedClientInformation["pluginMethod"];
2014 }
2015
2016 //Check for active connection to the database using a simple query
2017 Boolean activeConnection = false;
2018 this.tablebuilder();
2019 if ((m_strHost != null) || (m_strDatabase != null) || (m_strDBPort != null) || (m_strUserName != null) || (m_strPassword != null))
2020 {
2021 try
2022 {
2023 using (MySqlConnection Connection = new MySqlConnection(this.DBConnectionStringBuilder()))
2024 {
2025 Connection.Open();
2026 if (Connection.State == ConnectionState.Open)
2027 {
2028 string query = "SELECT `ServerID` from `" + this.tbl_server + "` LIMIT 1";
2029 using (MySqlCommand command = new MySqlCommand(query, Connection))
2030 {
2031 DataTable resultTable = this.SQLquery(command);
2032 if (resultTable.Rows != null)
2033 {
2034 activeConnection = true;
2035 }
2036 }
2037 }
2038 //Connection automatically closed by end of 'using' clause
2039 }
2040 }
2041 catch (Exception e)
2042 {
2043 this.DebugInfo("Error", "Query could not be performed while sending plugin status.");
2044 }
2045 }
2046
2047 //Create response hashtable
2048 Hashtable response = new Hashtable();
2049
2050 //Add Plugin General Settings
2051 response["pluginVersion"] = this.GetPluginVersion();
2052 response["pluginEnabled"] = this.m_isPluginEnabled.ToString();
2053 //Add Database connection info, without username and password
2054 response["DBHost"] = this.m_strHost;
2055 response["DBPort"] = this.m_strDBPort;
2056 response["DBName"] = this.m_strDatabase;
2057 //Add Database time offset
2058 response["DBTimeOffset"] = this.m_dTimeOffset.ToString();
2059 //Add Whether the connection is active
2060 response["DBConnectionActive"] = activeConnection.ToString();
2061 //Add Specific logging settings
2062 response["ChatloggingEnabled"] = (this.m_enChatloggingON == enumBoolYesNo.Yes).ToString();
2063 response["InstantChatLoggingEnabled"] = (this.m_enInstantChatlogging == enumBoolYesNo.Yes).ToString();
2064 response["StatsLoggingEnabled"] = (this.m_enLogSTATS == enumBoolYesNo.Yes).ToString();
2065 response["DBliveScoreboardEnabled"] = (this.m_enableCurrentPlayerstatsTable == enumBoolYesNo.Yes).ToString();
2066 //Add Plugin Debug Mode
2067 response["DebugMode"] = this.GlobalDebugMode;
2068 //Add Error as "no error"
2069 response["Error"] = false.ToString();
2070
2071 //Encode JSON response
2072 String JSONResponse = JSON.JsonEncode(response);
2073
2074 //Send the response
2075 this.ExecuteCommand("procon.protected.plugins.call", pluginName, pluginMethod, JSONResponse);
2076 }
2077 catch (Exception e)
2078 {
2079 //Log the error in console
2080 this.DebugInfo("Error", e.ToString());
2081 }
2082
2083 this.DebugInfo("Info", "SendStatus finished!");
2084 }
2085
2086 #endregion
2087
2088 #region In Game Commands
2089
2090 public void OnCommandStats(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
2091 {
2092 /*
2093 this.DebugInfo("Trace", "MatchCommand:" + mtcCommand.Command);
2094 this.DebugInfo("Trace", "CapturedCommand:" + capCommand.Command);
2095 this.DebugInfo("Trace", "CapturedCommand:" + capCommand.ResposeScope);
2096 this.DebugInfo("Trace", "CapturedCommand:" + capCommand.ExtraArguments);
2097 */
2098 if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
2099 {
2100 string scope = String.Empty;
2101 if (capCommand.ResposeScope.Contains("!") == true)
2102 {
2103 if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
2104 {
2105 scope = "all";
2106 }
2107 else
2108 {
2109 scope = "player";
2110 }
2111 }
2112 else
2113 {
2114 scope = "player";
2115 }
2116
2117 if (capCommand.ExtraArguments.Length > 0)
2118 {
2119 ThreadPool.QueueUserWorkItem(delegate { this.GetWeaponStats(this.FindKeyword(capCommand.ExtraArguments.Trim().ToUpper()), strSpeaker, scope); });
2120 }
2121 else
2122 {
2123 ThreadPool.QueueUserWorkItem( delegate { this.GetPlayerStats(strSpeaker, 0, scope); });
2124 }
2125 }
2126 }
2127
2128 public void OnCommandTop10(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
2129 {
2130 if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
2131 {
2132 string scope = String.Empty;
2133 if (capCommand.ResposeScope.Contains("!") == true)
2134 {
2135 if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
2136 {
2137 scope = "all";
2138 }
2139 else
2140 {
2141 scope = "player";
2142 }
2143 }
2144 else
2145 {
2146 scope = "player";
2147 }
2148
2149 if (capCommand.ExtraArguments.Length > 0)
2150 {
2151 ThreadPool.QueueUserWorkItem(delegate { this.GetWeaponTop10(this.FindKeyword(capCommand.ExtraArguments.Trim().ToUpper()), strSpeaker, 2, scope); });
2152 }
2153 else
2154 {
2155 ThreadPool.QueueUserWorkItem( delegate { this.GetTop10(strSpeaker, 2, scope); });
2156 }
2157 }
2158 }
2159
2160 public void OnCommandDogtags(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
2161 {
2162 if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
2163 {
2164 string scope = String.Empty;
2165 if (capCommand.ResposeScope.Contains("!") == true)
2166 {
2167 if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
2168 {
2169 scope = "all";
2170 }
2171 else
2172 {
2173 scope = "player";
2174 }
2175 }
2176 else
2177 {
2178 scope = "player";
2179 }
2180 ThreadPool.QueueUserWorkItem(delegate { this.GetDogtags(strSpeaker, 1, scope); });
2181 }
2182 }
2183
2184 public void OnCommandSession(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
2185 {
2186 if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
2187 {
2188 string scope = String.Empty;
2189 if (capCommand.ResposeScope.Contains("!") == true)
2190 {
2191 if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
2192 {
2193 scope = "all";
2194 }
2195 else
2196 {
2197 scope = "player";
2198 }
2199 }
2200 else
2201 {
2202 scope = "player";
2203 }
2204 ThreadPool.QueueUserWorkItem(delegate { this.GetSession(strSpeaker, 1, scope); });
2205 }
2206 }
2207
2208 public void OnCommandServerStats(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
2209 {
2210 if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
2211 {
2212 string scope = String.Empty;
2213 if (capCommand.ResposeScope.Contains("!") == true)
2214 {
2215 if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
2216 {
2217 scope = "all";
2218 }
2219 else
2220 {
2221 scope = "player";
2222 }
2223 }
2224 else
2225 {
2226 scope = "player";
2227 }
2228 ThreadPool.QueueUserWorkItem(delegate { this.GetServerStats(strSpeaker, 1, scope); });
2229 }
2230 }
2231
2232 public void OnCommandPlayerOfTheDay(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
2233 {
2234 if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
2235 {
2236 string scope = String.Empty;
2237 if (capCommand.ResposeScope.Contains("!") == true)
2238 {
2239 if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
2240 {
2241 scope = "all";
2242 }
2243 else
2244 {
2245 scope = "player";
2246 }
2247 }
2248 else
2249 {
2250 scope = "player";
2251 }
2252 ThreadPool.QueueUserWorkItem(delegate { this.GetPlayerOfTheDay(strSpeaker, 1, scope); });
2253 }
2254 }
2255
2256 public void OnCommandTop10ForPeriod(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
2257 {
2258 if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
2259 {
2260 string scope = String.Empty;
2261 if (capCommand.ResposeScope.Contains("!") == true)
2262 {
2263 if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
2264 {
2265 scope = "all";
2266 }
2267 else
2268 {
2269 scope = "player";
2270 }
2271 }
2272 else
2273 {
2274 scope = "player";
2275 }
2276 ThreadPool.QueueUserWorkItem(delegate { this.GetTop10ForPeriod(strSpeaker, 2, scope, this.m_intDaysForPeriodTop10); });
2277 }
2278 }
2279
2280 #endregion
2281
2282 #region CChatGUIDStatsLogger Methodes
2283
2284 private string DBConnectionStringBuilder()
2285 {
2286 string conString = String.Empty;
2287 lock (this.ConnectionStringBuilderlock)
2288 {
2289 uint uintport = 3306;
2290 uint.TryParse(m_strDBPort, out uintport);
2291 myCSB.Port = uintport;
2292 myCSB.Server = m_strHost;
2293 myCSB.UserID = m_strUserName;
2294 myCSB.Password = m_strPassword;
2295 myCSB.Database = m_strDatabase;
2296 //Connection Pool
2297 if (this.m_connectionPooling == enumBoolOnOff.On)
2298 {
2299 myCSB.Pooling = true;
2300 myCSB.MinimumPoolSize = Convert.ToUInt32(this.m_minPoolSize);
2301 myCSB.MaximumPoolSize = Convert.ToUInt32(this.m_maxPoolSize);
2302 myCSB.ConnectionLifeTime = 600;
2303 }
2304 else
2305 {
2306 myCSB.Pooling = false;
2307 }
2308 //Compression
2309 if (this.m_Connectioncompression == enumBoolOnOff.On)
2310 {
2311 myCSB.UseCompression = true;
2312 }
2313 else
2314 {
2315 myCSB.UseCompression = false;
2316 }
2317 myCSB.AllowUserVariables = true;
2318 myCSB.DefaultCommandTimeout = 3600;
2319 myCSB.ConnectionTimeout = 50;
2320 conString = myCSB.ConnectionString;
2321 }
2322 return conString;
2323 }
2324
2325 private int GetPlayerTeamID(string strSoldierName)
2326 {
2327 int iTeamID = 0; // Neutral Team ID
2328 if (this.m_dicPlayers.ContainsKey(strSoldierName) == true)
2329 {
2330 iTeamID = this.m_dicPlayers[strSoldierName].TeamID;
2331 }
2332 return iTeamID;
2333 }
2334
2335 private void playerLeftServer(CPlayerInfo cpiPlayer)
2336 {
2337 try
2338 {
2339 this.DebugInfo("Trace", "playerLeftServer: " + cpiPlayer.SoldierName + " EAGUID: " + cpiPlayer.GUID);
2340 if (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true)
2341 {
2342 this.StatsTracker[cpiPlayer.SoldierName].Score = cpiPlayer.Score;
2343 this.StatsTracker[cpiPlayer.SoldierName].TimePlayerleft = MyDateTime.Now;
2344 this.StatsTracker[cpiPlayer.SoldierName].playerleft();
2345 //EA-GUID, ClanTag, usw.
2346 if (cpiPlayer.GUID.Length > 2)
2347 {
2348 this.StatsTracker[cpiPlayer.SoldierName].EAGuid = cpiPlayer.GUID;
2349 }
2350 //ID cache System
2351 if (this.StatsTracker[cpiPlayer.SoldierName].EAGuid.Length > 2)
2352 {
2353 if (this.m_ID_cache.ContainsKey(this.StatsTracker[cpiPlayer.SoldierName].EAGuid) == true)
2354 {
2355 this.m_ID_cache[this.StatsTracker[cpiPlayer.SoldierName].EAGuid].PlayeronServer = false;
2356 }
2357 }
2358 this.StatsTracker[cpiPlayer.SoldierName].ClanTag = cpiPlayer.ClanTag;
2359 }
2360 //Mapstats
2361 this.Mapstats.IntplayerleftServer++;
2362 //Session
2363 if (this.m_dicSession.ContainsKey(cpiPlayer.SoldierName) == true)
2364 {
2365 if (cpiPlayer.Score > 0)
2366 {
2367 this.m_dicSession[cpiPlayer.SoldierName].AddScore(cpiPlayer.Score);
2368 }
2369 this.m_dicSession[cpiPlayer.SoldierName].TimePlayerleft = MyDateTime.Now;
2370 this.m_dicSession[cpiPlayer.SoldierName].playerleft();
2371 this.DebugInfo("Trace", "Score: " + this.m_dicSession[cpiPlayer.SoldierName].TotalScore.ToString() + " Playtime: " + this.m_dicSession[cpiPlayer.SoldierName].TotalPlaytime.ToString());
2372 if (this.m_dicSession[cpiPlayer.SoldierName].TotalScore > 10 || this.m_dicSession[cpiPlayer.SoldierName].Kills > 0 || this.m_dicSession[cpiPlayer.SoldierName].Deaths > 0)
2373 {
2374 if ((this.m_dicSession[cpiPlayer.SoldierName].EAGuid.Length < 2) && (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true))
2375 {
2376 if (this.StatsTracker[cpiPlayer.SoldierName].EAGuid.Length > 2)
2377 {
2378 this.m_dicSession[cpiPlayer.SoldierName].EAGuid = this.StatsTracker[cpiPlayer.SoldierName].EAGuid;
2379 }
2380 }
2381 this.DebugInfo("Trace", "Adding Session of Player " + cpiPlayer.SoldierName + " to passed sessions");
2382 //Adding passed session to list if player has a Score greater than 0 or a Player greater than 120 sec
2383 this.lstpassedSessions.Add(this.m_dicSession[cpiPlayer.SoldierName]);
2384 }
2385 //Removing old session
2386 lock (this.sessionlock)
2387 {
2388 this.m_dicSession.Remove(cpiPlayer.SoldierName);
2389 }
2390 }
2391 else
2392 {
2393 this.DebugInfo("Trace", "playerLeftServer: " + cpiPlayer.SoldierName + " not in session dic");
2394 }
2395 }
2396 catch (Exception c)
2397 {
2398 this.DebugInfo("Error", "playerLeftServer:" + c);
2399 }
2400 }
2401
2402 private void playerKilled(Kill kKillerVictimDetails)
2403 {
2404 if (this.DamageClass.ContainsKey(kKillerVictimDetails.DamageType) == false && !kKillerVictimDetails.DamageType.Equals("Death"))
2405 {
2406 this.DebugInfo("Trace", "Weapon: " + kKillerVictimDetails.DamageType + " is missing in the " + this.strServerGameType +".def file!!!");
2407 }
2408 //this.DebugInfo("Trace","PlayerKilled Killer: "+ kKillerVictimDetails.Killer.SoldierName + "Victim: " + kKillerVictimDetails.Victim.SoldierName + "Weapon: " + kKillerVictimDetails.DamageType);
2409 //TEAMKILL OR SUICID
2410 if (String.Compare(kKillerVictimDetails.Killer.SoldierName, kKillerVictimDetails.Victim.SoldierName) == 0)
2411 { // A Suicide
2412 this.AddSuicideToStats(kKillerVictimDetails.Killer.SoldierName, this.DamageClass[kKillerVictimDetails.DamageType], kKillerVictimDetails.DamageType);
2413 }
2414 else
2415 {
2416 if (this.GetPlayerTeamID(kKillerVictimDetails.Killer.SoldierName) == this.GetPlayerTeamID(kKillerVictimDetails.Victim.SoldierName))
2417 { //TeamKill
2418 this.AddTeamKillToStats(kKillerVictimDetails.Killer.SoldierName);
2419 this.AddDeathToStats(kKillerVictimDetails.Victim.SoldierName, this.DamageClass[kKillerVictimDetails.DamageType], kKillerVictimDetails.DamageType);
2420 }
2421 else
2422 {
2423 //this.DebugInfo("Trace","PlayerKilled: Regular Kill");
2424 //Regular Kill: Player killed an Enemy
2425 this.AddKillToStats(kKillerVictimDetails.Killer.SoldierName, this.DamageClass[kKillerVictimDetails.DamageType], kKillerVictimDetails.DamageType, kKillerVictimDetails.Headshot);
2426 this.AddDeathToStats(kKillerVictimDetails.Victim.SoldierName, this.DamageClass[kKillerVictimDetails.DamageType], kKillerVictimDetails.DamageType);
2427 if (string.Equals(kKillerVictimDetails.DamageType, "Melee"))
2428 { //Dogtagstracking
2429 CKillerVictim KnifeKill = new CKillerVictim(kKillerVictimDetails.Killer.SoldierName, kKillerVictimDetails.Victim.SoldierName);
2430 if (m_dicKnifeKills.ContainsKey(KnifeKill) == true)
2431 {
2432 m_dicKnifeKills[KnifeKill]++;
2433 }
2434 else
2435 {
2436 m_dicKnifeKills.Add(KnifeKill, 1);
2437 }
2438 }
2439 }
2440 }
2441 }
2442
2443 private DataTable SQLquery(MySqlCommand selectQuery)
2444 {
2445 DataTable MyDataTable = new DataTable();
2446 try
2447 {
2448 this.tablebuilder();
2449 //this.DebugInfo("Trace", "SQLquery: " + selectQuery);
2450 if (selectQuery == null)
2451 {
2452 this.DebugInfo("Warning", "SQLquery: selectQuery is null");
2453 return MyDataTable;
2454 }
2455 else if (selectQuery.CommandText.Equals(String.Empty) == true)
2456 {
2457 this.DebugInfo("Warning", "SQLquery: CommandText is empty");
2458 return MyDataTable;
2459 }
2460
2461 if (this.m_highPerformanceConnectionMode == enumBoolOnOff.On)
2462 {
2463 try
2464 {
2465 using (MySqlConnection Connection = new MySqlConnection(this.DBConnectionStringBuilder()))
2466 {
2467 selectQuery.Connection = Connection;
2468 using (MySqlDataAdapter MyAdapter = new MySqlDataAdapter(selectQuery))
2469 {
2470 if (MyAdapter != null)
2471 {
2472 MyAdapter.Fill(MyDataTable);
2473 }
2474 else
2475 {
2476 this.DebugInfo("Warning", "SQLquery: MyAdapter is null");
2477 }
2478 }
2479 Connection.Close();
2480 }
2481 }
2482 catch (MySqlException me)
2483 {
2484 this.DebugInfo("Error", "SQLQuery:");
2485 this.DisplayMySqlErrorCollection(me);
2486 }
2487 catch (Exception c)
2488 {
2489 this.DebugInfo("Error", "SQLQuery:" + c);
2490 }
2491 }
2492 else
2493 {
2494 lock (this.sqlquerylock)
2495 {
2496 if (this.MySqlCon == null)
2497 {
2498 this.MySqlCon = new MySqlConnection(this.DBConnectionStringBuilder());
2499 }
2500 try
2501 {
2502 selectQuery.Connection = this.MySqlCon;
2503 using (MySqlDataAdapter MyAdapter = new MySqlDataAdapter(selectQuery))
2504 {
2505 if (MyAdapter != null)
2506 {
2507 MyAdapter.Fill(MyDataTable);
2508 }
2509 else
2510 {
2511 this.DebugInfo("Warning", "SQLquery: MyAdapter is null");
2512 }
2513 }
2514 }
2515 catch (MySqlException oe)
2516 {
2517 this.DebugInfo("Error", "SQLQuery:");
2518 this.DisplayMySqlErrorCollection(oe);
2519 if (MySqlCon.State == ConnectionState.Open)
2520 {
2521 MySqlCon.Close();
2522 MySqlCon = null;
2523 }
2524 }
2525 catch (Exception c)
2526 {
2527 this.DebugInfo("Error", "SQLQuery:" + c);
2528 if (MySqlCon.State == ConnectionState.Open)
2529 {
2530 MySqlCon.Close();
2531 MySqlCon = null;
2532 }
2533 }
2534 finally
2535 {
2536 try
2537 {
2538 this.MySqlCon.Close();
2539 }
2540 catch
2541 {
2542 this.MySqlCon = null;
2543 }
2544 }
2545 }
2546 }
2547 }
2548 catch (Exception c)
2549 {
2550 this.DebugInfo("Error", "SQLQuery OuterException:" + c);
2551 }
2552 return MyDataTable;
2553 }
2554
2555 // Updates database with player stats and chatlogs
2556 private void StartStreaming()
2557 {
2558 lock (this.streamlock)
2559 {
2560 bool success = false;
2561 int attemptCount = 0;
2562 try
2563 {
2564 DateTime StartStreamingTime = MyDateTime.Now;
2565 //Make a copy of Statstracker to prevent unwanted errors
2566 Dictionary<string, CStats> StatsTrackerCopy = new Dictionary<string, CStats>(this.StatsTracker);
2567 //C_ID_Cache id_cache;
2568 List<string> lstEAGUIDs = new List<string>();
2569 //Clearing the old Dictionary
2570 StatsTracker.Clear();
2571 if (isStreaming)
2572 {
2573 this.DebugInfo("Info", "Started streaming to the DB-Server");
2574 // Uploads chat logs and Stats for round to database
2575 if (ChatLog.Count > 0 || this.m_enLogSTATS == enumBoolYesNo.Yes)
2576 {
2577 this.tablebuilder(); //Build the tables if not exists
2578 if ((m_strHost != null) && (m_strDatabase != null) && (m_strDBPort != null) && (m_strUserName != null) && (m_strPassword != null))
2579 {
2580 try
2581 {
2582 this.OpenMySqlConnection(2);
2583 this.MySql_Connection_is_activ = true;
2584
2585 if (ChatLog.Count > 0 && MySqlConn.State == ConnectionState.Open)
2586 {
2587 string ChatSQL = @"INSERT INTO " + this.tbl_chatlog + @" (logDate, ServerID, logSubset, logSoldierName, logMessage) VALUES ";
2588 lock (ChatLog)
2589 {
2590 int i = 0;
2591 foreach (CLogger log in ChatLog)
2592 {
2593 ChatSQL = string.Concat(ChatSQL, "(@logDate" + i + ", @ServerID" + i + ", @logSubset" + i + ", @logSoldierName" + i + ", @logMessage" + i + "),");
2594 i++;
2595 }
2596 ChatSQL = ChatSQL.Remove(ChatSQL.LastIndexOf(","));
2597 using (MySqlCommand OdbcCom = new MySqlCommand(ChatSQL, MySqlConn))
2598 {
2599 i = 0;
2600 foreach (CLogger log in ChatLog)
2601 {
2602 OdbcCom.Parameters.AddWithValue("@logDate" + i, log.Time);
2603 OdbcCom.Parameters.AddWithValue("@ServerID" + i, this.ServerID);
2604 OdbcCom.Parameters.AddWithValue("@logSubset" + i, log.Subset);
2605 OdbcCom.Parameters.AddWithValue("@logSoldierName" + i, log.Name);
2606 OdbcCom.Parameters.AddWithValue("@logMessage" + i, log.Message);
2607 i++;
2608 }
2609 OdbcCom.ExecuteNonQuery();
2610 }
2611 ChatLog.Clear();
2612 }
2613 }
2614 if (this.m_mapstatsON == enumBoolYesNo.Yes && MySqlConn.State == ConnectionState.Open)
2615 {
2616 this.DebugInfo("Trace", "Mapstats Write querys");
2617 this.Mapstats.calcMaxMinAvgPlayers();
2618 string MapSQL = @"INSERT INTO " + tbl_mapstats + @" (ServerID, TimeMapLoad, TimeRoundStarted, TimeRoundEnd, MapName, Gamemode, Roundcount, NumberofRounds, MinPlayers, AvgPlayers, MaxPlayers, PlayersJoinedServer, PlayersLeftServer)
2619 VALUES (@ServerID, @TimeMapLoad, @TimeRoundStarted, @TimeRoundEnd, @MapName, @Gamemode, @Roundcount, @NumberofRounds, @MinPlayers, @AvgPlayers, @MaxPlayers, @PlayersJoinedServer, @PlayersLeftServer)";
2620 using (MySqlCommand OdbcCom = new MySqlCommand(MapSQL, MySqlConn))
2621 {
2622 OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
2623 OdbcCom.Parameters.AddWithValue("@TimeMapLoad", this.Mapstats.TimeMaploaded);
2624 OdbcCom.Parameters.AddWithValue("@TimeRoundStarted", this.Mapstats.TimeMapStarted);
2625 OdbcCom.Parameters.AddWithValue("@TimeRoundEnd", this.Mapstats.TimeRoundEnd);
2626 OdbcCom.Parameters.AddWithValue("@MapName", this.Mapstats.StrMapname);
2627 OdbcCom.Parameters.AddWithValue("@Gamemode", this.Mapstats.StrGamemode);
2628 OdbcCom.Parameters.AddWithValue("@Roundcount", this.Mapstats.IntRound);
2629 OdbcCom.Parameters.AddWithValue("@NumberofRounds", this.Mapstats.IntNumberOfRounds);
2630 OdbcCom.Parameters.AddWithValue("@MinPlayers", this.Mapstats.IntMinPlayers);
2631 OdbcCom.Parameters.AddWithValue("@AvgPlayers", this.Mapstats.DoubleAvgPlayers);
2632 OdbcCom.Parameters.AddWithValue("@MaxPlayers", this.Mapstats.IntMaxPlayers);
2633 OdbcCom.Parameters.AddWithValue("@PlayersJoinedServer", this.Mapstats.IntplayerjoinedServer);
2634 OdbcCom.Parameters.AddWithValue("@PlayersLeftServer", this.Mapstats.IntplayerleftServer);
2635 OdbcCom.ExecuteNonQuery();
2636 }
2637 }
2638 if (this.m_enLogSTATS == enumBoolYesNo.Yes && MySqlConn.State == ConnectionState.Open)
2639 {
2640 this.DebugInfo("Trace", "PlayerStats Write querys");
2641 //Prepare EAGUID List
2642 foreach (KeyValuePair<string, CStats> kvp in StatsTrackerCopy)
2643 {
2644 if (kvp.Value.EAGuid.Length > 1)
2645 {
2646 if (GlobalDebugMode.Equals("Trace"))
2647 {
2648 this.DebugInfo("Trace", "Adding EAGUID " + kvp.Value.EAGuid + " to searchlist");
2649 }
2650 lstEAGUIDs.Add(kvp.Value.EAGuid);
2651 }
2652 }
2653 //Perform Cache Update
2654 this.UpdateIDCache(lstEAGUIDs);
2655
2656 while (!success)
2657 {
2658 attemptCount++;
2659 try
2660 {
2661 MySqlTrans = MySqlConn.BeginTransaction();
2662 foreach (KeyValuePair<string, CStats> kvp in StatsTrackerCopy)
2663 {
2664 if (kvp.Key.Length > 0 && kvp.Value.EAGuid.Length > 1)
2665 {
2666 if (this.m_ID_cache.ContainsKey(kvp.Value.EAGuid) == false)
2667 {
2668 if (GlobalDebugMode.Equals("Trace"))
2669 {
2670 this.DebugInfo("Trace", kvp.Value.EAGuid + " is not in Cache!");
2671 }
2672 continue;
2673 }
2674 if (this.m_ID_cache[kvp.Value.EAGuid].Id >= 1)
2675 {
2676 string UpdatedataSQL = @"UPDATE " + this.tbl_playerdata + @" SET SoldierName = @SoldierName, ClanTag = @ClanTag, PBGUID = @PBGUID, IP_Address = @IP_Address, CountryCode = @CountryCode, GlobalRank = @GlobalRank WHERE PlayerID = @PlayerID";
2677 using (MySqlCommand OdbcCom = new MySqlCommand(UpdatedataSQL, MySqlConn, MySqlTrans))
2678 {
2679 //Update
2680 if (GlobalDebugMode.Equals("Trace"))
2681 {
2682 this.DebugInfo("Trace", "Update for Player " + kvp.Key);
2683 this.DebugInfo("Trace", "ClanTag " + kvp.Value.ClanTag);
2684 this.DebugInfo("Trace", "SoldierName " + kvp.Key);
2685 this.DebugInfo("Trace", "PBGUID " + kvp.Value.Guid);
2686 this.DebugInfo("Trace", "EAGUID " + kvp.Value.EAGuid);
2687 this.DebugInfo("Trace", "IP_Address " + kvp.Value.IP);
2688 this.DebugInfo("Trace", "CountryCode " + kvp.Value.PlayerCountryCode);
2689 this.DebugInfo("Trace", "GlobalRank " + kvp.Value.GlobalRank);
2690 }
2691 //OdbcCom.Parameters.AddWithValue("@pr", kvp.Value.ClanTag);
2692 OdbcCom.Parameters.AddWithValue("@SoldierName", kvp.Key);
2693 if (kvp.Value.ClanTag != null)
2694 {
2695 if (kvp.Value.ClanTag.Length > 0)
2696 {
2697 OdbcCom.Parameters.AddWithValue("@ClanTag", kvp.Value.ClanTag);
2698 }
2699 else
2700 {
2701 OdbcCom.Parameters.AddWithValue("@ClanTag", Convert.DBNull);
2702 }
2703 }
2704 else
2705 {
2706 OdbcCom.Parameters.AddWithValue("@ClanTag", Convert.DBNull);
2707 }
2708 OdbcCom.Parameters.AddWithValue("@PBGUID", kvp.Value.Guid);
2709 OdbcCom.Parameters.AddWithValue("@IP_Address", kvp.Value.IP);
2710 OdbcCom.Parameters.AddWithValue("@CountryCode", kvp.Value.PlayerCountryCode);
2711 OdbcCom.Parameters.AddWithValue("@PlayerID", this.m_ID_cache[kvp.Value.EAGuid].Id);
2712 OdbcCom.Parameters.AddWithValue("@GlobalRank", kvp.Value.GlobalRank);
2713 OdbcCom.ExecuteNonQuery();
2714 }
2715 }
2716 else if (this.m_ID_cache[kvp.Value.EAGuid].Id <= 0)
2717 {
2718 string InsertdataSQL = @"INSERT INTO " + this.tbl_playerdata + @" (ClanTag, SoldierName, PBGUID, GameID, EAGUID, IP_Address, CountryCode, GlobalRank) VALUES(@ClanTag, @SoldierName, @PBGUID, @GameID, @EAGUID, @IP_Address, @CountryCode, @GlobalRank)";
2719 using (MySqlCommand OdbcCom = new MySqlCommand(InsertdataSQL, MySqlConn, MySqlTrans))
2720 {
2721 //Insert
2722 if (GlobalDebugMode.Equals("Trace"))
2723 {
2724 this.DebugInfo("Trace", "Insert for Player " + kvp.Key);
2725 this.DebugInfo("Trace", "ClanTag " + kvp.Value.ClanTag);
2726 this.DebugInfo("Trace", "SoldierName " + kvp.Key);
2727 this.DebugInfo("Trace", "PBGUID " + kvp.Value.Guid);
2728 this.DebugInfo("Trace", "EAGUID " + kvp.Value.EAGuid);
2729 this.DebugInfo("Trace", "IP_Address " + kvp.Value.IP);
2730 this.DebugInfo("Trace", "CountryCode " + kvp.Value.PlayerCountryCode);
2731 this.DebugInfo("Trace", "GlobalRank " + kvp.Value.GlobalRank);
2732 }
2733 if (kvp.Value.ClanTag != null)
2734 {
2735 if (kvp.Value.ClanTag.Length > 0)
2736 {
2737 OdbcCom.Parameters.AddWithValue("@ClanTag", kvp.Value.ClanTag);
2738 }
2739 else
2740 {
2741 OdbcCom.Parameters.AddWithValue("@ClanTag", Convert.DBNull);
2742 }
2743 }
2744 else
2745 {
2746 OdbcCom.Parameters.AddWithValue("@ClanTag", Convert.DBNull);
2747 }
2748 OdbcCom.Parameters.AddWithValue("@SoldierName", kvp.Key);
2749 OdbcCom.Parameters.AddWithValue("@PBGUID", kvp.Value.Guid);
2750 OdbcCom.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
2751 OdbcCom.Parameters.AddWithValue("@EAGUID", kvp.Value.EAGuid);
2752 OdbcCom.Parameters.AddWithValue("@IP_Address", kvp.Value.IP);
2753 OdbcCom.Parameters.AddWithValue("@CountryCode", kvp.Value.PlayerCountryCode);
2754 OdbcCom.Parameters.AddWithValue("@GlobalRank", kvp.Value.GlobalRank);
2755 OdbcCom.ExecuteNonQuery();
2756 }
2757 }
2758 }
2759 }
2760 MySqlTrans.Commit();
2761 success = true;
2762 }
2763 catch (MySqlException ex)
2764 {
2765 switch (ex.Number)
2766 {
2767 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
2768 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
2769 if (attemptCount < this.TransactionRetryCount)
2770 {
2771 this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(Playerdata). Attempt: " + attemptCount);
2772 try
2773 {
2774 MySqlTrans.Rollback();
2775 }
2776 catch { }
2777 Thread.Sleep(attemptCount * 1000);
2778 }
2779 else
2780 {
2781 this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction Playerdata)");
2782 throw;
2783 }
2784 break;
2785 default:
2786 throw; //Other exceptions
2787 }
2788 }
2789 }
2790 //Reset bool and counter
2791 attemptCount = 0;
2792 success = false;
2793
2794 //tbl_server_player
2795
2796 this.DebugInfo("Trace", "tbl_server_player Write querys");
2797 this.UpdateIDCache(lstEAGUIDs);
2798 while (!success)
2799 {
2800 attemptCount++;
2801 try
2802 {
2803 //Start of the Transaction
2804 MySqlTrans = MySqlConn.BeginTransaction();
2805 foreach (KeyValuePair<string, CStats> kvp in StatsTrackerCopy)
2806 {
2807 if (kvp.Value.EAGuid.Length > 0)
2808 {
2809 if (this.m_ID_cache.ContainsKey(kvp.Value.EAGuid) == false)
2810 {
2811 this.DebugInfo("Trace", kvp.Value.EAGuid + " is not in Cache!");
2812 continue;
2813 }
2814 if (GlobalDebugMode.Equals("Trace"))
2815 {
2816 this.DebugInfo("Trace", "PlayerID: " + this.m_ID_cache[kvp.Value.EAGuid].Id);
2817 this.DebugInfo("Trace", "StatsID: " + this.m_ID_cache[kvp.Value.EAGuid].StatsID);
2818 }
2819 if (this.m_ID_cache[kvp.Value.EAGuid].Id > 0 && this.m_ID_cache[kvp.Value.EAGuid].StatsID == 0)
2820 {
2821 string InsertdataSQL = @"INSERT INTO " + this.tbl_server_player + @" (ServerID, PlayerID) VALUES(@ServerID, @PlayerID)";
2822 using (MySqlCommand OdbcCom = new MySqlCommand(InsertdataSQL, MySqlConn, MySqlTrans))
2823 {
2824 //Insert
2825 this.DebugInfo("Trace", "Insert PlayerID " + this.m_ID_cache[kvp.Value.EAGuid].Id + "into tbl_server_player");
2826 OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
2827 OdbcCom.Parameters.AddWithValue("@PlayerID", this.m_ID_cache[kvp.Value.EAGuid].Id);
2828 OdbcCom.ExecuteNonQuery();
2829 }
2830 }
2831 }
2832 }
2833 MySqlTrans.Commit();
2834 success = true;
2835 }
2836 catch (MySqlException ex)
2837 {
2838 switch (ex.Number)
2839 {
2840 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
2841 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
2842 if (attemptCount < this.TransactionRetryCount)
2843 {
2844 this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(server_player). Attempt: " + attemptCount);
2845 try
2846 {
2847 MySqlTrans.Rollback();
2848 }
2849 catch { }
2850 Thread.Sleep(attemptCount * 1000);
2851 }
2852 else
2853 {
2854 this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction server_player)");
2855 throw;
2856 }
2857 break;
2858 default:
2859 throw; //Other exceptions
2860 }
2861 }
2862 }
2863 //Reset bool and counter
2864 attemptCount = 0;
2865 success = false;
2866
2867 this.DebugInfo("Trace", "Combatstats Write querys");
2868 //Perform Cache Update
2869 this.UpdateIDCache(lstEAGUIDs);
2870 if (this.m_enLogPlayerDataOnly == enumBoolYesNo.No)
2871 {
2872 while (!success)
2873 {
2874 attemptCount++;
2875 try
2876 {
2877 //Start of the Transaction
2878 MySqlTrans = MySqlConn.BeginTransaction();
2879
2880 foreach (KeyValuePair<string, CStats> kvp in StatsTrackerCopy)
2881 {
2882 if (this.m_ID_cache.ContainsKey(kvp.Value.EAGuid) == false)
2883 {
2884 if (GlobalDebugMode.Equals("Trace"))
2885 {
2886 this.DebugInfo("Trace", kvp.Value.EAGuid + " is not in Cache!(empty GUID?)");
2887 }
2888 continue;
2889 }
2890 Dictionary<string, Dictionary<string, CStats.CUsedWeapon>> tempdic;
2891 //tempdic = StatsTrackerCopy[kvp.Key].getWeaponKills();
2892 tempdic = new Dictionary<string, Dictionary<string, CStats.CUsedWeapon>>(kvp.Value.getWeaponKills());
2893 if (GlobalDebugMode.Equals("Trace"))
2894 {
2895 this.DebugInfo("Trace", "PlayerID: " + this.m_ID_cache[kvp.Value.EAGuid].Id);
2896 this.DebugInfo("Trace", "StatsID: " + this.m_ID_cache[kvp.Value.EAGuid].StatsID);
2897 }
2898
2899 if (kvp.Key.Length > 0 && StatsTrackerCopy[kvp.Key].Guid.Length > 0 && this.m_ID_cache[kvp.Value.EAGuid].StatsID >= 1)
2900 {
2901 string playerstatsSQL = @"INSERT INTO " + this.tbl_playerstats + @"(StatsID, Score, Kills, Headshots, Deaths, Suicide, TKs, Playtime, Rounds, FirstSeenOnServer, LastSeenOnServer, Killstreak, Deathstreak, HighScore , Wins, Losses)
2902 VALUES(@StatsID, @Score, @Kills, @Headshots, @Deaths, @Suicide, @TKs, @Playtime, @Rounds, @FirstSeenOnServer, @LastSeenOnServer, @Killstreak, @Deathstreak, @HighScore , @Wins, @Losses)
2903 ON DUPLICATE KEY UPDATE Score = Score + @Score, Kills = Kills + @Kills,Headshots = Headshots + @Headshots, Deaths = Deaths + @Deaths, Suicide = Suicide + @Suicide, TKs = TKs + @TKs, Playtime = Playtime + @Playtime, Rounds = Rounds + @Rounds, LastSeenOnServer = @LastSeenOnServer, Killstreak = GREATEST(Killstreak,@Killstreak),Deathstreak = GREATEST(Deathstreak, @Deathstreak) ,HighScore = GREATEST(HighScore, @HighScore), Wins = Wins + @Wins, Losses = Losses + @Losses ";
2904
2905 using (MySqlCommand OdbcCom = new MySqlCommand(playerstatsSQL, MySqlConn, MySqlTrans))
2906 {
2907 //Insert
2908 OdbcCom.Parameters.AddWithValue("@StatsID", this.m_ID_cache[kvp.Value.EAGuid].StatsID);
2909 OdbcCom.Parameters.AddWithValue("@Score", kvp.Value.TotalScore);
2910 OdbcCom.Parameters.AddWithValue("@Kills", kvp.Value.Kills);
2911 OdbcCom.Parameters.AddWithValue("@Headshots", kvp.Value.Headshots);
2912 if (kvp.Value.Deaths >= 0)
2913 {
2914 OdbcCom.Parameters.AddWithValue("@Deaths", kvp.Value.Deaths);
2915 }
2916 else
2917 {
2918 OdbcCom.Parameters.AddWithValue("@Deaths", 0);
2919 }
2920 OdbcCom.Parameters.AddWithValue("@Suicide", kvp.Value.Suicides);
2921 OdbcCom.Parameters.AddWithValue("@TKs", kvp.Value.Teamkills);
2922 OdbcCom.Parameters.AddWithValue("@Playtime", kvp.Value.TotalPlaytime);
2923 OdbcCom.Parameters.AddWithValue("@Rounds", 1);
2924 OdbcCom.Parameters.AddWithValue("@FirstSeenOnServer", kvp.Value.TimePlayerjoined);
2925 if (kvp.Value.TimePlayerleft != DateTime.MinValue)
2926 {
2927 OdbcCom.Parameters.AddWithValue("@LastSeenOnServer", kvp.Value.TimePlayerleft);
2928 }
2929 else
2930 {
2931 OdbcCom.Parameters.AddWithValue("@LastSeenOnServer", MyDateTime.Now);
2932 }
2933 OdbcCom.Parameters.AddWithValue("@Killstreak", kvp.Value.Killstreak);
2934 OdbcCom.Parameters.AddWithValue("@Deathstreak", kvp.Value.Deathstreak);
2935 OdbcCom.Parameters.AddWithValue("@HighScore", kvp.Value.TotalScore);
2936 OdbcCom.Parameters.AddWithValue("@Wins", kvp.Value.Wins);
2937 OdbcCom.Parameters.AddWithValue("@Losses", kvp.Value.Losses);
2938
2939 OdbcCom.ExecuteNonQuery();
2940 }
2941
2942 if (this.m_weaponstatsON == enumBoolYesNo.Yes)
2943 {
2944 this.DebugInfo("Trace", "Weaponstats Write querys");
2945
2946 string NewWeaponStatsSQL = @"INSERT INTO `" + this.tbl_weapons_stats + @"` (`StatsID`,`WeaponID`,`Kills`,`Headshots`,`Deaths`)
2947 VALUES(@StatsID, @WeaponID, @Kills, @Headshots, @Deaths)
2948 ON DUPLICATE KEY UPDATE `Kills` = `Kills` + @Kills ,`Headshots` = `Headshots` + @Headshots,`Deaths` = `Deaths` + @Deaths";
2949
2950 foreach (KeyValuePair<string, Dictionary<string, CStats.CUsedWeapon>> branch in tempdic)
2951 {
2952 //Build Query for Weaponstats
2953 if (tempdic != null)
2954 {
2955 foreach (KeyValuePair<string, CStats.CUsedWeapon> leaf in branch.Value)
2956 {
2957 if (leaf.Value.Kills != 0 || leaf.Value.Kills != 0 || leaf.Value.Deaths != 0)
2958 {
2959 if (this.WeaponMappingDic.ContainsKey(leaf.Value.Name))
2960 {
2961 using (MySqlCommand OdbcCom = new MySqlCommand(NewWeaponStatsSQL, MySqlConn, MySqlTrans))
2962 {
2963 OdbcCom.Parameters.AddWithValue("@StatsID", this.m_ID_cache[kvp.Value.EAGuid].StatsID);
2964 OdbcCom.Parameters.AddWithValue("@WeaponID", this.WeaponMappingDic[leaf.Value.Name]);
2965 OdbcCom.Parameters.AddWithValue("@Kills", leaf.Value.Kills);
2966 OdbcCom.Parameters.AddWithValue("@Headshots", leaf.Value.Headshots);
2967 OdbcCom.Parameters.AddWithValue("@Deaths", leaf.Value.Deaths);
2968 OdbcCom.ExecuteNonQuery();
2969 }
2970 }
2971 }
2972 }
2973 }
2974 }
2975 }
2976
2977 //Awards
2978 /*
2979 if (this.m_awardsON == enumBoolYesNo.Yes && StatsTrackerCopy[kvp.Key].Awards.DicAwards.Count > 0)
2980 {
2981 string awardsInsert = "INSERT INTO " + tbl_awards + @" (`AwardID` ";
2982 string awardsValues = ") VALUES (" + int_id;
2983 string awardsUpdate = " ON DUPLICATE KEY UPDATE ";
2984 foreach (KeyValuePair<string, int> award in StatsTrackerCopy[kvp.Key].Awards.DicAwards)
2985 {
2986 awardsInsert = String.Concat(awardsInsert, ", `", award.Key, "`");
2987 awardsValues = String.Concat(awardsValues, ", ", award.Value.ToString());
2988 awardsUpdate = String.Concat(awardsUpdate, " `", award.Key, "` = `", award.Key, "` + ", award.Value.ToString(), ", ");
2989 }
2990 // Remove the last comma
2991 int charindex2 = awardsUpdate.LastIndexOf(",");
2992 if (charindex2 > 0)
2993 {
2994 awardsUpdate = awardsUpdate.Remove(charindex2);
2995 }
2996 awardsInsert = String.Concat(awardsInsert, awardsValues, ") ", awardsUpdate);
2997 //Sent Query to the Server
2998 this.DebugInfo("Awardquery: " + awardsInsert);
2999 using (MySqlCommand OdbcCom = new MySqlCommand(awardsInsert, OdbcConn, OdbcTrans))
3000 {
3001 OdbcCom.ExecuteNonQuery();
3002 }
3003 }
3004 */
3005 }
3006 }
3007 MySqlTrans.Commit();
3008 success = true;
3009 }
3010 catch (MySqlException ex)
3011 {
3012 switch (ex.Number)
3013 {
3014 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
3015 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
3016 if (attemptCount < this.TransactionRetryCount)
3017 {
3018 this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(Stats). Attempt: " + attemptCount);
3019 try
3020 {
3021 MySqlTrans.Rollback();
3022 }
3023 catch { }
3024 Thread.Sleep(attemptCount * 1000);
3025 }
3026 else
3027 {
3028 this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction Stats)");
3029 throw;
3030 }
3031 break;
3032 default:
3033 throw; //Other exceptions
3034 }
3035 }
3036 }
3037 }
3038 //Reset bool and counter
3039 attemptCount = 0;
3040 success = false;
3041 if (this.m_enLogPlayerDataOnly == enumBoolYesNo.No)
3042 {
3043 while (!success)
3044 {
3045 attemptCount++;
3046 try
3047 {
3048 //Start of the Transaction
3049 MySqlTrans = MySqlConn.BeginTransaction();
3050 this.DebugInfo("Trace", "Dogtagstats Write querys");
3051 string KnifeSQL = String.Empty;
3052 foreach (KeyValuePair<CKillerVictim, int> kvp in m_dicKnifeKills)
3053 {
3054 if (StatsTrackerCopy.ContainsKey(kvp.Key.Killer) == false || StatsTrackerCopy.ContainsKey(kvp.Key.Victim) == false)
3055 {
3056 continue;
3057 }
3058 if (this.m_ID_cache.ContainsKey(StatsTrackerCopy[kvp.Key.Killer].EAGuid) == false || this.m_ID_cache.ContainsKey(StatsTrackerCopy[kvp.Key.Victim].EAGuid) == false)
3059 {
3060 continue;
3061 }
3062 if (this.m_ID_cache[StatsTrackerCopy[kvp.Key.Killer].EAGuid].StatsID > 0 && this.m_ID_cache[StatsTrackerCopy[kvp.Key.Victim].EAGuid].StatsID > 0)
3063 {
3064 KnifeSQL = "INSERT INTO " + this.tbl_dogtags + @"(KillerID, VictimID, Count) VALUES(@KillerID, @VictimID, @Count)
3065 ON DUPLICATE KEY UPDATE Count = Count + @Count";
3066 using (MySqlCommand OdbcCom = new MySqlCommand(KnifeSQL, MySqlConn, MySqlTrans))
3067 {
3068 OdbcCom.Parameters.AddWithValue("@KillerID", this.m_ID_cache[StatsTrackerCopy[kvp.Key.Killer].EAGuid].StatsID);
3069 OdbcCom.Parameters.AddWithValue("@VictimID", this.m_ID_cache[StatsTrackerCopy[kvp.Key.Victim].EAGuid].StatsID);
3070 OdbcCom.Parameters.AddWithValue("@Count", m_dicKnifeKills[kvp.Key]);
3071 OdbcCom.ExecuteNonQuery();
3072 }
3073 }
3074 }
3075 MySqlTrans.Commit();
3076 success = true;
3077 }
3078 catch (MySqlException ex)
3079 {
3080 switch (ex.Number)
3081 {
3082 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
3083 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
3084 if (attemptCount < this.TransactionRetryCount)
3085 {
3086 this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(Dogtags). Attempt: " + attemptCount);
3087 try
3088 {
3089 MySqlTrans.Rollback();
3090 }
3091 catch { }
3092 Thread.Sleep(attemptCount * 1000);
3093 }
3094 else
3095 {
3096 this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction Dogtags)");
3097 throw;
3098 }
3099 break;
3100 default:
3101 throw; //Other exceptions
3102 }
3103 }
3104 }
3105 }
3106 //Reset bool and counter
3107 attemptCount = 0;
3108 success = false;
3109
3110 while (!success)
3111 {
3112 attemptCount++;
3113 try
3114 {
3115 //Start of the Transaction
3116 MySqlTrans = MySqlConn.BeginTransaction();
3117
3118 //Write the Player Sessions
3119
3120 if (this.m_sessionON == enumBoolYesNo.Yes && this.m_enSessionTracking == enumBoolYesNo.Yes)
3121 {
3122 bool containsvaildsessions = false;
3123 StringBuilder InsertSQLSession = new StringBuilder(500);
3124 InsertSQLSession.Append(@"INSERT INTO " + this.tbl_sessions + @" (`StatsID`, `StartTime`,`EndTime`, `Score`, `Kills`, `Headshots`, `Deaths`, `TKs`, `Suicide`,`RoundCount`, `Playtime`, `HighScore`, `Killstreak`, `Deathstreak`, `Wins`, `Losses`) VALUES");
3125
3126 this.DebugInfo("Trace", this.lstpassedSessions.Count + " Sessions to write to Sessiontable");
3127 int i = 0;
3128 foreach (CStats session in this.lstpassedSessions)
3129 {
3130 if (this.m_ID_cache.ContainsKey(session.EAGuid) == true)
3131 {
3132 if (this.m_ID_cache[session.EAGuid].StatsID > 0)
3133 {
3134 //write session
3135 containsvaildsessions = true;
3136 InsertSQLSession.Append(" (@StatsID" + i + ", @StartTime" + i + ", @EndTime" + i + ", @Score" + i + ", @Kills" + i + ", @Headshots" + i + ", @Deaths" + i + ", @TKs" + i + ", @Suicide" + i + ", @RoundCount" + i + ", @Playtime" + i + ", @HighScore" + i + ", @Killstreak" + i + ", @Deathstreak" + i + ", @Wins" + i + ", @Losses" + i + "),");
3137 i++;
3138 }
3139 }
3140 }
3141 if (containsvaildsessions)
3142 {
3143 //remove last comma
3144 InsertSQLSession.Length = InsertSQLSession.Length - 1;
3145 using (MySqlCommand sessionInsert = new MySqlCommand(InsertSQLSession.ToString(), MySqlConn, MySqlTrans))
3146 {
3147 i = 0;
3148 foreach (CStats session in this.lstpassedSessions)
3149 {
3150 if (this.m_ID_cache.ContainsKey(session.EAGuid) == true)
3151 {
3152 if (this.m_ID_cache[session.EAGuid].StatsID > 0)
3153 {
3154 sessionInsert.Parameters.AddWithValue("@StatsID" + i, this.m_ID_cache[session.EAGuid].StatsID);
3155 sessionInsert.Parameters.AddWithValue("@StartTime" + i, session.TimePlayerjoined);
3156 sessionInsert.Parameters.AddWithValue("@EndTime" + i, session.TimePlayerleft);
3157 sessionInsert.Parameters.AddWithValue("@Score" + i, session.TotalScore);
3158 sessionInsert.Parameters.AddWithValue("@Kills" + i, session.Kills);
3159 sessionInsert.Parameters.AddWithValue("@Headshots" + i, session.Headshots);
3160 if (session.Deaths >= 0)
3161 {
3162 sessionInsert.Parameters.AddWithValue("@Deaths" + i, session.Deaths);
3163 }
3164 else
3165 {
3166 sessionInsert.Parameters.AddWithValue("@Deaths" + i, 0);
3167 }
3168 sessionInsert.Parameters.AddWithValue("@TKs" + i, session.Teamkills);
3169 sessionInsert.Parameters.AddWithValue("@Suicide" + i, session.Suicides);
3170 sessionInsert.Parameters.AddWithValue("@RoundCount" + i, session.Rounds);
3171 sessionInsert.Parameters.AddWithValue("@Playtime" + i, session.TotalPlaytime);
3172 sessionInsert.Parameters.AddWithValue("@HighScore" + i, session.HighScore);
3173 sessionInsert.Parameters.AddWithValue("@Killstreak" + i, session.Killstreak);
3174 sessionInsert.Parameters.AddWithValue("@Deathstreak" + i, session.Deathstreak);
3175 sessionInsert.Parameters.AddWithValue("@Wins" + i, session.Wins);
3176 sessionInsert.Parameters.AddWithValue("@Losses" + i, session.Losses);
3177 i++;
3178 }
3179 }
3180 }
3181 sessionInsert.ExecuteNonQuery();
3182 this.lstpassedSessions.Clear();
3183 }
3184 }
3185 }
3186 //Commit the Transaction for the Playerstats
3187 MySqlTrans.Commit();
3188 success = true;
3189 }
3190 catch (MySqlException ex)
3191 {
3192 switch (ex.Number)
3193 {
3194 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
3195 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
3196 if (attemptCount < this.TransactionRetryCount)
3197 {
3198 this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(Sessions). Attempt: " + attemptCount);
3199 try
3200 {
3201 MySqlTrans.Rollback();
3202 }
3203 catch { }
3204 Thread.Sleep(attemptCount * 1000);
3205 }
3206 else
3207 {
3208 this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction Sessions)");
3209 throw;
3210 }
3211 break;
3212 default:
3213 throw; //Other exceptions
3214 }
3215 }
3216 }
3217 //Reset bool and counter
3218 attemptCount = 0;
3219 success = false;
3220
3221 //Calculate ServerStats
3222 if (this.boolSkipServerStatsUpdate == false && this.m_enLogPlayerDataOnly == enumBoolYesNo.No)
3223 {
3224 this.DebugInfo("Trace", "Serverstats Write query");
3225 while (!success)
3226 {
3227 attemptCount++;
3228 try
3229 {
3230 MySqlTrans = MySqlConn.BeginTransaction();
3231 string serverstats = @"REPLACE INTO " + this.tbl_server_stats + @" SELECT tsp.ServerID, Count(*) AS CountPlayers, SUM(tps.Score) AS SumScore, AVG(tps.Score) AS AvgScore, SUM(tps.Kills) AS SumKills, AVG(tps.Kills) AS AvgKills, SUM(tps.Headshots) AS SumHeadshots,
3232 AVG(tps.Headshots) AS AvgHeadshots, SUM(tps.Deaths) AS SumDeaths, AVG(tps.Deaths) AS AvgDeaths, SUM(tps.Suicide) AS SumSuicide, AVG(tps.Suicide) AS AvgSuicide, SUM(tps.TKs) AS SumTKs, AVG(tps.TKs) AS AvgTKs,
3233 SUM(tps.Playtime) AS SumPlaytime, AVG(tps.Playtime) AS AvgPlaytime, SUM(tps.Rounds) AS SumRounds, AVG(tps.Rounds) AS AvgRounds
3234 FROM " + this.tbl_playerstats + @" tps
3235 INNER JOIN " + this.tbl_server_player + @" tsp ON tps.StatsID = tsp.StatsID
3236 WHERE tsp.ServerID = @ServerID GROUP BY tsp.ServerID";
3237 using (MySqlCommand OdbcCom = new MySqlCommand(serverstats, MySqlConn, MySqlTrans))
3238 {
3239 OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
3240 OdbcCom.ExecuteNonQuery();
3241 }
3242 MySqlTrans.Commit();
3243 success = true;
3244 }
3245 catch (MySqlException ex)
3246 {
3247 switch (ex.Number)
3248 {
3249 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
3250 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
3251 if (attemptCount < this.TransactionRetryCount)
3252 {
3253 this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(Serverstats). Attempt: " + attemptCount);
3254 try
3255 {
3256 MySqlTrans.Rollback();
3257 }
3258 catch { }
3259 Thread.Sleep(attemptCount * 1000);
3260 }
3261 else
3262 {
3263 this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction Serverstats)");
3264 throw;
3265 }
3266 break;
3267 default:
3268 throw; //Other exceptions
3269 }
3270 }
3271 }
3272 }
3273 //Reset bool and counter
3274 attemptCount = 0;
3275 success = false;
3276
3277 StatsTrackerCopy.Clear();
3278 this.m_dicKnifeKills.Clear();
3279
3280 List<string> leftplayerlist = new List<string>();
3281
3282 foreach (KeyValuePair<string, C_ID_Cache> kvp in this.m_ID_cache)
3283 {
3284 if (this.m_ID_cache[kvp.Key].PlayeronServer == false)
3285 {
3286 leftplayerlist.Add(kvp.Key);
3287 }
3288 // Because so playerleft event seems not been reported by the server
3289 this.m_ID_cache[kvp.Key].PlayeronServer = false;
3290 }
3291 foreach (string player in leftplayerlist)
3292 {
3293 this.m_ID_cache.Remove(player);
3294 //this.DebugInfo("Removed " + player);
3295 }
3296 this.DebugInfo("Info", "Status ID-Cache: " + m_ID_cache.Count + " ID's in cache");
3297 if (this.m_ID_cache.Count > 500)
3298 {
3299 this.DebugInfo("Warning", "Forced Cache clear due the Nummber of cached IDs reached over 500 entries(overflowProtection)");
3300 this.m_ID_cache.Clear();
3301 }
3302 }
3303 else
3304 {
3305 StatsTracker.Clear();
3306 }
3307 }
3308 catch (MySqlException oe)
3309 {
3310 this.DebugInfo("Error", "Error in Startstreaming: ");
3311 this.DisplayMySqlErrorCollection(oe);
3312 this.m_ID_cache.Clear();
3313 this.m_dicKnifeKills.Clear();
3314 try { MySqlTrans.Rollback(); }
3315 catch { }
3316 }
3317 catch (Exception c)
3318 {
3319 this.DebugInfo("Error", "Error in Startstreaming: " + c);
3320 this.m_ID_cache.Clear();
3321 this.m_dicKnifeKills.Clear();
3322 try { MySqlTrans.Rollback(); }
3323 catch { }
3324 }
3325 finally
3326 {
3327 StatsTrackerCopy = null;
3328 this.Mapstats = this.Nextmapinfo;
3329 this.MySql_Connection_is_activ = false;
3330 this.CloseMySqlConnection(2);
3331
3332 //Update Serverranking
3333 this.UpdateRanking();
3334 //Welcomestats dic
3335 this.checkWelcomeStatsDic();
3336 if (GlobalDebugMode.Equals("Info"))
3337 {
3338 TimeSpan duration = MyDateTime.Now - StartStreamingTime;
3339 this.DebugInfo("Info", "Streamingprocess duration: " + Math.Round(duration.TotalSeconds, 3) + " seconds");
3340 }
3341 }
3342 }
3343 else
3344 {
3345 this.DebugInfo("Error", "Streaming cancelled. Please enter all database information");
3346 }
3347 }
3348 }
3349 }
3350 catch (MySqlException oe)
3351 {
3352 this.DebugInfo("Error", "Error in Startstreaming OuterException: ");
3353 this.DisplayMySqlErrorCollection(oe);
3354 this.m_ID_cache.Clear();
3355 this.m_dicKnifeKills.Clear();
3356 }
3357 catch (Exception c)
3358 {
3359 this.DebugInfo("Error", "Error in Startstreaming OuterException: " + c);
3360 this.m_ID_cache.Clear();
3361 this.m_dicKnifeKills.Clear();
3362 }
3363 }
3364 }
3365
3366 private void UpdateCurrentPlayerTable(List<CPlayerInfo> lstPlayers)
3367 {
3368 if (this.boolTableEXISTS == false || ServerID <= 0)
3369 {
3370 return;
3371 }
3372 this.DebugInfo("Trace", "UpdateCurrentPlayerTable");
3373 bool success = false;
3374 int attemptCount = 0;
3375 try
3376 {
3377 using (MySqlConnection DBConnection = new MySqlConnection(this.DBConnectionStringBuilder()))
3378 {
3379 string deleteSQL = "DELETE FROM " + this.tbl_currentplayers + " WHERE ServerID = @ServerID";
3380 StringBuilder InsertSQL = new StringBuilder("INSERT INTO " + this.tbl_currentplayers + " (ServerID, SoldierName, ClanTag ,EA_GUID, PB_GUID, Score, Kills, Deaths, Headshots, Suicide, TeamID, SquadID, PlayerJoined, Ping, IP_aton, CountryCode, Killstreak, Deathstreak, GlobalRank ) VALUES ");
3381 MySql.Data.MySqlClient.MySqlTransaction Tx = null;
3382
3383 DBConnection.Open();
3384 while (!success)
3385 {
3386 attemptCount++;
3387 try
3388 {
3389 //Start of the Transaction
3390 Tx = DBConnection.BeginTransaction();
3391
3392 using (MySqlCommand OdbcCom = new MySqlCommand(deleteSQL, DBConnection, Tx))
3393 {
3394 OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
3395 OdbcCom.ExecuteNonQuery();
3396 }
3397 if (lstPlayers.Count > 0)
3398 {
3399 int i = 0;
3400 foreach (CPlayerInfo cpiPlayer in lstPlayers)
3401 {
3402 InsertSQL.Append("( @ServerID, @SoldierName" + i + ",@ClanTag" + i + ", @EA_GUID" + i + ", @PB_GUID" + i + ", @Score" + i + ", @Kills" + i + ", @Deaths" + i + ", @Suicide" + i + ", @Headshots" + i + ",@TeamID" + i + ",@SquadID" + i + " ,@PlayerJoined" + i + ",@Ping" + i + ", INET_ATON( @IP_aton" + i + ")" + ",@CountryCode" + i + ",@Killstreak" + i + ",@Deathstreak" + i + ",@GlobalRank" + i + "),");
3403 i++;
3404 }
3405 InsertSQL.Length = InsertSQL.Length - 1;
3406 using (MySqlCommand OdbcCom = new MySqlCommand(InsertSQL.ToString(), DBConnection, Tx))
3407 {
3408 i = 0;
3409 OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
3410 foreach (CPlayerInfo cpiPlayer in lstPlayers)
3411 {
3412 OdbcCom.Parameters.AddWithValue("@SoldierName" + i, cpiPlayer.SoldierName);
3413 OdbcCom.Parameters.AddWithValue("@ClanTag" + i, cpiPlayer.ClanTag + "");
3414 OdbcCom.Parameters.AddWithValue("@EA_GUID" + i, cpiPlayer.GUID);
3415 if (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true)
3416 {
3417 OdbcCom.Parameters.AddWithValue("@PB_GUID" + i, this.StatsTracker[cpiPlayer.SoldierName].Guid);
3418 }
3419 else
3420 {
3421 OdbcCom.Parameters.AddWithValue("@PB_GUID" + i, ""); //placeholder
3422 }
3423 OdbcCom.Parameters.AddWithValue("@Score" + i, cpiPlayer.Score);
3424 OdbcCom.Parameters.AddWithValue("@Kills" + i, cpiPlayer.Kills);
3425 OdbcCom.Parameters.AddWithValue("@Deaths" + i, cpiPlayer.Deaths);
3426 if (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true)
3427 {
3428 OdbcCom.Parameters.AddWithValue("@Headshots" + i, this.StatsTracker[cpiPlayer.SoldierName].Headshots);
3429 OdbcCom.Parameters.AddWithValue("@PlayerJoined" + i, this.StatsTracker[cpiPlayer.SoldierName].Playerjoined);
3430 OdbcCom.Parameters.AddWithValue("@CountryCode" + i, this.StatsTracker[cpiPlayer.SoldierName].PlayerCountryCode);
3431 OdbcCom.Parameters.AddWithValue("@Killstreak" + i, this.StatsTracker[cpiPlayer.SoldierName].Killstreak);
3432 OdbcCom.Parameters.AddWithValue("@Deathstreak" + i, this.StatsTracker[cpiPlayer.SoldierName].Deathstreak);
3433 OdbcCom.Parameters.AddWithValue("@Suicide" + i, this.StatsTracker[cpiPlayer.SoldierName].Suicides);
3434 OdbcCom.Parameters.AddWithValue("@IP_aton" + i, this.StatsTracker[cpiPlayer.SoldierName].IP);
3435 }
3436 else
3437 {
3438 OdbcCom.Parameters.AddWithValue("@Headshots" + i, 0); //Headshot placeholder
3439 OdbcCom.Parameters.AddWithValue("@PlayerJoined" + i, MyDateTime.Now);
3440 OdbcCom.Parameters.AddWithValue("@CountryCode" + i, "");
3441 OdbcCom.Parameters.AddWithValue("@Killstreak" + i, 0);
3442 OdbcCom.Parameters.AddWithValue("@Deathstreak" + i, 0);
3443 OdbcCom.Parameters.AddWithValue("@Suicide" + i, 0);
3444 OdbcCom.Parameters.AddWithValue("@IP_aton" + i, "0.0.0.0");
3445 }
3446 OdbcCom.Parameters.AddWithValue("@TeamID" + i, cpiPlayer.TeamID);
3447 OdbcCom.Parameters.AddWithValue("@SquadID" + i, cpiPlayer.SquadID);
3448 if (cpiPlayer.Ping >= 0 && cpiPlayer.Ping < 65000)
3449 {
3450 OdbcCom.Parameters.AddWithValue("@Ping" + i, cpiPlayer.Ping);
3451 }
3452 else
3453 {
3454 OdbcCom.Parameters.AddWithValue("@Ping" + i, 0);
3455 }
3456 if (cpiPlayer.Rank >= 0 && cpiPlayer.Rank < 6500)
3457 {
3458 OdbcCom.Parameters.AddWithValue("@GlobalRank" + i, cpiPlayer.Rank);
3459 }
3460 else
3461 {
3462 OdbcCom.Parameters.AddWithValue("@GlobalRank" + i, 0);
3463 }
3464 //Increment Index
3465 i++;
3466 }
3467 OdbcCom.ExecuteNonQuery();
3468 }
3469 }
3470 Tx.Commit();
3471 success = true;
3472 }
3473 catch (MySqlException ex)
3474 {
3475 switch (ex.Number)
3476 {
3477 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
3478 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
3479 if (attemptCount < this.TransactionRetryCount)
3480 {
3481 this.DebugInfo("Warning", "Warning in UpdateCurrentPlayerTable: Locktimeout or Deadlock occured restarting Transaction(delete and Insert). Attempt: " + attemptCount);
3482 try
3483 {
3484 if (Tx.Connection != null)
3485 {
3486 Tx.Rollback();
3487 }
3488 }
3489 catch { }
3490 Thread.Sleep(attemptCount * 1000);
3491 }
3492 else
3493 {
3494 this.DebugInfo("Error", "Error in UpdateCurrentPlayerTable: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction delete und Insert)");
3495 throw;
3496 }
3497 break;
3498 default:
3499 throw; //Other exceptions
3500 }
3501 }
3502 }
3503 //Reset bool and counter
3504 attemptCount = 0;
3505 success = false;
3506 try
3507 {
3508 DBConnection.Close();
3509 }
3510 catch {};
3511 }
3512 }
3513 catch (MySqlException oe)
3514 {
3515 this.DebugInfo("Error", "Error in UpdateCurrentPlayerTable: ");
3516 this.DisplayMySqlErrorCollection(oe);
3517 }
3518 catch (Exception c)
3519 {
3520 this.DebugInfo("Error", "Error in UpdateCurrentPlayerTable: " + c.ToString());
3521 }
3522
3523 }
3524
3525 //Fetch data from the db
3526
3527 private C_ID_Cache GetID(string EAguid)
3528 {
3529 int playerID = 0;
3530 int StatsID = 0;
3531 if (GlobalDebugMode.Equals("Trace"))
3532 {
3533 this.DebugInfo("Trace", "Tying to get IDs form DB or cache for EAGuid: " + EAguid);
3534 }
3535 try
3536 {
3537 if (this.m_ID_cache.ContainsKey(EAguid) == true)
3538 {
3539 if (this.m_ID_cache[EAguid].Id >= 1 && this.m_ID_cache[EAguid].StatsID >= 1)
3540 {
3541 //CacheHit
3542 if (GlobalDebugMode.Equals("Trace"))
3543 {
3544 this.DebugInfo("Trace", "Status ID-Cache: used IDs(" + this.m_ID_cache[EAguid].Id + " | " + this.m_ID_cache[EAguid].StatsID + ") from cache for EAGuid " + EAguid);
3545 }
3546 return this.m_ID_cache[EAguid];
3547 }
3548 else
3549 {
3550 //Cachemiss
3551 if (this.m_ID_cache[EAguid].Id <= 0)
3552 {
3553 using (MySqlCommand MyCommand = new MySqlCommand(@"SELECT `PlayerID` FROM `" + this.tbl_playerdata + "` WHERE `GameID` = @GameID AND `EAGUID` = @EAGUID "))
3554 {
3555 MyCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
3556 MyCommand.Parameters.AddWithValue("@EAGUID", EAguid);
3557 DataTable resultTable = this.SQLquery(MyCommand);
3558 if (resultTable.Rows != null)
3559 {
3560 foreach (DataRow row in resultTable.Rows)
3561 {
3562 playerID = Convert.ToInt32(row["PlayerID"]);
3563 this.m_ID_cache[EAguid].Id = playerID;
3564 }
3565 }
3566 }
3567 }
3568 else
3569 {
3570 playerID = this.m_ID_cache[EAguid].Id;
3571 }
3572 if (playerID >= 1)
3573 {
3574 using (MySqlCommand MyCommand = new MySqlCommand(@"SELECT `StatsID` FROM `" + this.tbl_server_player + "` WHERE `PlayerID` = @PlayerID AND `ServerID`= @ServerID "))
3575 {
3576 MyCommand.Parameters.AddWithValue("@PlayerID", playerID);
3577 MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
3578 DataTable resultTable = this.SQLquery(MyCommand);
3579 if (resultTable.Rows != null)
3580 {
3581 foreach (DataRow row in resultTable.Rows)
3582 {
3583 StatsID = Convert.ToInt32(row["StatsID"]);
3584 this.m_ID_cache[EAguid].StatsID = StatsID;
3585 }
3586 }
3587 }
3588 }
3589 }
3590 }
3591 else
3592 {
3593 //Cache has no entry
3594 using (MySqlCommand MyCommand = new MySqlCommand(@"SELECT `PlayerID` FROM `" + this.tbl_playerdata + "` WHERE `GameID` = @GameID AND `EAGUID` = @EAGUID "))
3595 {
3596 MyCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
3597 MyCommand.Parameters.AddWithValue("@EAGUID", EAguid);
3598 DataTable resultTable = this.SQLquery(MyCommand);
3599 if (resultTable.Rows != null)
3600 {
3601 foreach (DataRow row in resultTable.Rows)
3602 {
3603 playerID = Convert.ToInt32(row["PlayerID"]);
3604 }
3605 }
3606 }
3607 if (playerID >= 1)
3608 {
3609 using (MySqlCommand MyCommand = new MySqlCommand(@"SELECT `StatsID` FROM `" + this.tbl_server_player + "` WHERE `PlayerID` = @PlayerID AND `ServerID`= @ServerID"))
3610 {
3611 MyCommand.Parameters.AddWithValue("@PlayerID", playerID);
3612 MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
3613 DataTable resultTable = this.SQLquery(MyCommand);
3614 if (resultTable.Rows != null)
3615 {
3616 foreach (DataRow row in resultTable.Rows)
3617 {
3618 StatsID = Convert.ToInt32(row["StatsID"]);
3619 }
3620 }
3621 }
3622 }
3623 this.m_ID_cache.Add(EAguid, new C_ID_Cache(StatsID, playerID, true));
3624 }
3625 }
3626 catch (Exception c)
3627 {
3628 this.DebugInfo("Error", "GetID: " + c);
3629 return null;
3630 }
3631 if (GlobalDebugMode.Equals("Trace"))
3632 {
3633 this.DebugInfo("Trace", "Returning ID: PlayerID: " + playerID + " StatsID: " + StatsID);
3634 }
3635 return this.m_ID_cache[EAguid];
3636 }
3637
3638 private void UpdateIDCache(List<string> lstEAGUID)
3639 {
3640 foreach (string EAGUID in lstEAGUID)
3641 {
3642 if (this.m_ID_cache.ContainsKey(EAGUID) == false)
3643 {
3644 //Adding an empty entry
3645 this.m_ID_cache.Add(EAGUID, new C_ID_Cache(0, 0, true));
3646 }
3647 }
3648 if (lstEAGUID.Count == 0)
3649 {
3650 this.DebugInfo("Trace", "UpdateIDCache: Empty List!");
3651 return;
3652 }
3653
3654 StringBuilder SQL = new StringBuilder(@"SELECT EAGUID, tpd.PlayerID, tsp.StatsID
3655 FROM " + this.tbl_playerdata + @" tpd
3656 LEFT JOIN " + this.tbl_server_player + @" tsp ON tpd.PlayerID = tsp.PlayerID AND ServerID = @ServerID
3657 WHERE tpd.GameID = @GameID AND tpd.EAGUID IN (");
3658 for (int i = 1; i <= lstEAGUID.Count; i++)
3659 {
3660 SQL.Append("@EAGUID" + i + ",");
3661 }
3662 SQL.Length = SQL.Length - 1;
3663 SQL.Append(')');
3664 try
3665 {
3666 using (MySqlCommand SelectCommand = new MySqlCommand(SQL.ToString()))
3667 {
3668 SelectCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
3669 SelectCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
3670 int i = 1;
3671 foreach (string EAGUID in lstEAGUID)
3672 {
3673 SelectCommand.Parameters.AddWithValue("@EAGUID" + i, EAGUID);
3674 i++;
3675 }
3676 DataTable result;
3677 result = this.SQLquery(SelectCommand);
3678 if (result != null)
3679 {
3680 foreach (DataRow row in result.Rows)
3681 {
3682 if (row[1] == Convert.DBNull)
3683 {
3684 this.m_ID_cache.Add(row[0].ToString(), new C_ID_Cache(0, 0, true));
3685 continue;
3686 }
3687 if (this.m_ID_cache.ContainsKey(row[0].ToString()))
3688 {
3689 this.m_ID_cache[row[0].ToString()].Id = Convert.ToInt32(row[1]);
3690 if (row[2] == Convert.DBNull)
3691 {
3692 this.m_ID_cache[row[0].ToString()].StatsID = 0;
3693 }
3694 else
3695 {
3696 this.m_ID_cache[row[0].ToString()].StatsID = Convert.ToInt32(row[2]);
3697 }
3698 }
3699 else
3700 {
3701 if (row[2] == Convert.DBNull)
3702 {
3703 this.m_ID_cache.Add(row[0].ToString(), new C_ID_Cache(0, Convert.ToInt32(row[1]), true));
3704 }
3705 else
3706 {
3707 this.m_ID_cache.Add(row[0].ToString(), new C_ID_Cache(Convert.ToInt32(row[2]), Convert.ToInt32(row[1]), true));
3708 }
3709 }
3710 }
3711 }
3712 }
3713 }
3714 catch (MySqlException oe)
3715 {
3716 this.DebugInfo("Error", "Error in UpdateCacheID: ");
3717 this.DisplayMySqlErrorCollection(oe);
3718 }
3719 catch (Exception c)
3720 {
3721 this.DebugInfo("Error", "UpdateIDCache: " + c);
3722 }
3723 }
3724
3725 private void WelcomeStats(string strSpeaker)
3726 {
3727 List<string> result = new List<string>();
3728 if (this.m_enWelcomeStats == enumBoolYesNo.Yes)
3729 {
3730 if (this.m_enLogSTATS == enumBoolYesNo.Yes)
3731 {
3732 string SQL = String.Empty;
3733 string strMSG = String.Empty;
3734 //Statsquery with KDR
3735 //Rankquery
3736 if (m_enRankingByScore == enumBoolYesNo.Yes)
3737 {
3738 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
3739 {
3740 SQL = @"SELECT tpd.SoldierName, SUM(tps.Score) AS Score, SUM(tps.Kills) AS Kills, SUM(tps.Deaths) AS Deaths, SUM(tps.Suicide) AS Suicide, SUM(tps.TKs) AS TKs, tpr.rankScore AS rank, (SELECT SUM(tss.CountPlayers) FROM " + this.tbl_server_stats + @" tss INNER JOIN " + this.tbl_server + @" ts ON tss.ServerID = ts.ServerID AND ServerGroup = @ServerGroup GROUP BY ts.ServerGroup ) AS allrank , SUM(tps.Playtime) AS Playtime, SUM(tps.Headshots) AS Headshots,
3741 SUM(tps.Rounds) AS Rounds, MAX(tps.Killstreak) AS Killstreak, MAX(tps.Deathstreak) AS Deathstreak
3742 FROM " + this.tbl_playerdata + @" tpd
3743 INNER JOIN " + this.tbl_playerrank + @" tpr ON tpd.PlayerID = tpr.PlayerID AND tpr.ServerGroup = @ServerGroup
3744 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
3745 INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID
3746 WHERE tpd.SoldierName = @SoldierName
3747 GROUP BY tpd.PlayerID";
3748 }
3749 else
3750 {
3751 SQL = @"SELECT tpd.SoldierName AS SoldierName, tps.Score AS Score, tps.Kills AS Kills, tps.Deaths AS Deaths, tps.Suicide AS Suicide, tps.TKs AS TKs, tps.rankScore AS rank, (SELECT tss.CountPlayers FROM " + this.tbl_server_stats + @" tss WHERE ServerID = @ServerID ) AS allrank ,
3752 tps.Playtime AS Playtime, tps.Headshots AS Headshots, tps.Rounds AS Rounds, tps.Killstreak AS Killstreak, tps.Deathstreak AS Deathstreak
3753 FROM " + this.tbl_playerdata + @" tpd
3754 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
3755 INNER JOIN " + this.tbl_playerstats + @" tps ON tps.StatsID = tsp.StatsID
3756 WHERE tsp.ServerID = @ServerID AND tpd.SoldierName = @SoldierName";
3757 }
3758 }
3759 else
3760 {
3761 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
3762 {
3763 SQL = @"SELECT tpd.SoldierName, SUM(tps.Score) AS Score, SUM(tps.Kills) AS Kills, SUM(tps.Deaths) AS Deaths, SUM(tps.Suicide) AS Suicide, SUM(tps.TKs) AS TKs, tpr.rankKills AS rank, (SELECT SUM(tss.CountPlayers) FROM " + this.tbl_server_stats + @" tss INNER JOIN " + this.tbl_server + @" ts ON tss.ServerID = ts.ServerID AND ServerGroup = @ServerGroup GROUP BY ts.ServerGroup ) AS allrank , SUM(tps.Playtime) AS Playtime, SUM(tps.Headshots) AS Headshots,
3764 SUM(tps.Rounds) AS Rounds, MAX(tps.Killstreak) AS Killstreak, MAX(tps.Deathstreak) AS Deathstreak
3765 FROM " + this.tbl_playerdata + @" tpd
3766 INNER JOIN " + this.tbl_playerrank + @" tpr ON tpd.PlayerID = tpr.PlayerID AND tpr.ServerGroup = @ServerGroup
3767 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
3768 INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID
3769 WHERE tpd.SoldierName = @SoldierName
3770 GROUP BY tpd.PlayerID";
3771 }
3772 else
3773 {
3774 SQL = @"SELECT tpd.SoldierName AS SoldierName, tps.Score AS Score, tps.Kills AS Kills, tps.Deaths AS Deaths, tps.Suicide AS Suicide, tps.TKs AS TKs, tps.rankKills AS rank, (SELECT tss.CountPlayers FROM " + this.tbl_server_stats + @" tss WHERE ServerID = @ServerID ) AS allrank ,
3775 tps.Playtime AS Playtime, tps.Headshots AS Headshots, tps.Rounds AS Rounds, tps.Killstreak AS Killstreak, tps.Deathstreak AS Deathstreak
3776 FROM " + this.tbl_playerdata + @" tpd
3777 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
3778 INNER JOIN " + this.tbl_playerstats + @" tps ON tps.StatsID = tsp.StatsID
3779 WHERE tsp.ServerID = @ServerID AND tpd.SoldierName = @SoldierName";
3780 }
3781 }
3782 using (MySqlCommand MyCommand = new MySqlCommand(SQL))
3783 {
3784 DataTable resultTable;
3785 double kdr = 0;
3786 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
3787 {
3788 MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
3789 MyCommand.Parameters.AddWithValue("@SoldierName", strSpeaker);
3790 }
3791 else
3792 {
3793 MyCommand.Parameters.AddWithValue("@ServerID", ServerID);
3794 MyCommand.Parameters.AddWithValue("@SoldierName", strSpeaker);
3795 }
3796 try
3797 {
3798 resultTable = this.SQLquery(MyCommand);
3799 if (resultTable.Rows != null)
3800 {
3801 foreach (DataRow row in resultTable.Rows)
3802 {
3803 result = new List<string>(this.m_lstPlayerWelcomeStatsMessage);
3804 result = this.ListReplace(result, "%serverName%", this.serverName);
3805 result = this.ListReplace(result, "%playerName%", row["SoldierName"].ToString());
3806 result = this.ListReplace(result, "%playerScore%", row["Score"].ToString());
3807 result = this.ListReplace(result, "%playerKills%", row["Kills"].ToString());
3808 result = this.ListReplace(result, "%playerDeaths%", row["Deaths"].ToString());
3809 result = this.ListReplace(result, "%playerSuicide%", row["Suicide"].ToString());
3810 result = this.ListReplace(result, "%playerTKs%", row["TKs"].ToString());
3811 result = this.ListReplace(result, "%playerRank%", row["rank"].ToString());
3812 result = this.ListReplace(result, "%allRanks%", row["allrank"].ToString());
3813 result = this.ListReplace(result, "%playerHeadshots%", row["Headshots"].ToString());
3814 result = this.ListReplace(result, "%rounds%", row["Rounds"].ToString());
3815 result = this.ListReplace(result, "%killstreak%", row["Killstreak"].ToString());
3816 result = this.ListReplace(result, "%deathstreak%", row["Deathstreak"].ToString());
3817 //KDR
3818 if (Convert.ToInt32(row["Deaths"]) != 0)
3819 {
3820 kdr = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Deaths"]);
3821 kdr = Math.Round(kdr, 2);
3822 result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
3823 }
3824 else
3825 {
3826 kdr = Convert.ToDouble(row["Kills"]);
3827 result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
3828 }
3829 //Playtime
3830 TimeSpan span = new TimeSpan(0, 0, Convert.ToInt32(row["Playtime"]));
3831 result = this.ListReplace(result, "%playerPlaytime%", span.ToString());
3832 //SPM
3833 double SPM;
3834 if (Convert.ToDouble(row["Playtime"]) != 0)
3835 {
3836 SPM = (Convert.ToDouble(row["Score"]) / (Convert.ToDouble(row["Playtime"]) / 60));
3837 SPM = Math.Round(SPM, 2);
3838 result = this.ListReplace(result, "%SPM%", SPM.ToString());
3839 }
3840 else
3841 {
3842 result = this.ListReplace(result, "%SPM%", "0");
3843 }
3844 }
3845 }
3846 }
3847 catch (Exception c)
3848 {
3849 this.DebugInfo("Error", "WelcomeStats: " + c);
3850 }
3851 }
3852 if (result.Count > 0)
3853 {
3854 //result.Insert(0, m_strPlayerWelcomeMsg.Replace("%serverName%", this.serverName).Replace("%playerName%", strSpeaker));
3855 }
3856 else
3857 {
3858 result.Clear();
3859 result = new List<string>(this.m_lstNewPlayerWelcomeMsg);
3860 result = this.ListReplace(result, "%serverName%", this.serverName);
3861 result = this.ListReplace(result, "%playerName%", strSpeaker);
3862 //result.Add(m_strNewPlayerWelcomeMsg.Replace("%serverName%", this.serverName).Replace("%playerName%", strSpeaker));
3863 }
3864 this.SendMultiLineChatMessage(result, int_welcomeStatsDelay, 0, "player", strSpeaker);
3865 }
3866 }
3867 }
3868
3869 private void GetPlayerStats(string strSpeaker, int delay, string scope)
3870 {
3871 List<string> result = new List<string>();
3872 if (this.m_enLogSTATS == enumBoolYesNo.Yes)
3873 {
3874 string SQL = String.Empty;
3875 string strMSG = String.Empty;
3876 double kdr = 0;
3877 //Statsquery with KDR
3878 //Rankquery
3879 if (m_enRankingByScore == enumBoolYesNo.Yes)
3880 {
3881 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
3882 {
3883 SQL = @"SELECT tpd.SoldierName, SUM(tps.Score) AS Score, SUM(tps.Kills) AS Kills, SUM(tps.Deaths) AS Deaths, SUM(tps.Suicide) AS Suicide, SUM(tps.TKs) AS TKs, tpr.rankScore AS rank, (SELECT SUM(tss.CountPlayers) FROM " + this.tbl_server_stats + @" tss INNER JOIN " + this.tbl_server + @" ts ON tss.ServerID = ts.ServerID AND ServerGroup = @ServerGroup GROUP BY ts.ServerGroup ) AS allrank , SUM(tps.Playtime) AS Playtime, SUM(tps.Headshots) AS Headshots,
3884 SUM(tps.Rounds) AS Rounds, MAX(tps.Killstreak) AS Killstreak, MAX(tps.Deathstreak) AS Deathstreak
3885 FROM " + this.tbl_playerdata + @" tpd
3886 INNER JOIN " + this.tbl_playerrank + @" tpr ON tpd.PlayerID = tpr.PlayerID AND tpr.ServerGroup = @ServerGroup
3887 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
3888 INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID
3889 WHERE tpd.SoldierName = @SoldierName
3890 GROUP BY tpd.PlayerID";
3891 }
3892 else
3893 {
3894 SQL = @"SELECT tpd.SoldierName AS SoldierName, tps.Score AS Score, tps.Kills AS Kills, tps.Deaths AS Deaths, tps.Suicide AS Suicide, tps.TKs AS TKs, tps.rankScore AS rank, (SELECT tss.CountPlayers FROM " + this.tbl_server_stats + @" tss WHERE ServerID = @ServerID ) AS allrank ,
3895 tps.Playtime AS Playtime, tps.Headshots AS Headshots, tps.Rounds AS Rounds, tps.Killstreak AS Killstreak, tps.Deathstreak AS Deathstreak
3896 FROM " + this.tbl_playerdata + @" tpd
3897 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
3898 INNER JOIN " + this.tbl_playerstats + @" tps ON tps.StatsID = tsp.StatsID
3899 WHERE tsp.ServerID = @ServerID AND tpd.SoldierName = @SoldierName";
3900 }
3901 }
3902 else
3903 {
3904 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
3905 {
3906 SQL = @"SELECT tpd.SoldierName, SUM(tps.Score) AS Score, SUM(tps.Kills) AS Kills, SUM(tps.Deaths) AS Deaths, SUM(tps.Suicide) AS Suicide, SUM(tps.TKs) AS TKs, tpr.rankKills AS rank, (SELECT SUM(tss.CountPlayers) FROM " + this.tbl_server_stats + @" tss INNER JOIN " + this.tbl_server + @" ts ON tss.ServerID = ts.ServerID AND ServerGroup = @ServerGroup GROUP BY ts.ServerGroup ) AS allrank , SUM(tps.Playtime) AS Playtime, SUM(tps.Headshots) AS Headshots,
3907 SUM(tps.Rounds) AS Rounds, MAX(tps.Killstreak) AS Killstreak, MAX(tps.Deathstreak) AS Deathstreak
3908 FROM " + this.tbl_playerdata + @" tpd
3909 INNER JOIN " + this.tbl_playerrank + @" tpr ON tpd.PlayerID = tpr.PlayerID AND tpr.ServerGroup = @ServerGroup
3910 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
3911 INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID
3912 WHERE tpd.SoldierName = @SoldierName
3913 GROUP BY tpd.PlayerID";
3914 }
3915 else
3916 {
3917 SQL = @"SELECT tpd.SoldierName AS SoldierName, tps.Score AS Score, tps.Kills AS Kills, tps.Deaths AS Deaths, tps.Suicide AS Suicide, tps.TKs AS TKs, tps.rankKills AS rank, (SELECT tss.CountPlayers FROM " + this.tbl_server_stats + @" tss WHERE ServerID = @ServerID ) AS allrank ,
3918 tps.Playtime AS Playtime, tps.Headshots AS Headshots, tps.Rounds AS Rounds, tps.Killstreak AS Killstreak, tps.Deathstreak AS Deathstreak
3919 FROM " + this.tbl_playerdata + @" tpd
3920 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
3921 INNER JOIN " + this.tbl_playerstats + @" tps ON tps.StatsID = tsp.StatsID
3922 WHERE tsp.ServerID = @ServerID AND tpd.SoldierName = @SoldierName";
3923 }
3924 }
3925 using (MySqlCommand MyCommand = new MySqlCommand(SQL))
3926 {
3927 DataTable resultTable;
3928 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
3929 {
3930 MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
3931 MyCommand.Parameters.AddWithValue("@SoldierName", strSpeaker);
3932 }
3933 else
3934 {
3935 MyCommand.Parameters.AddWithValue("@ServerID", ServerID);
3936 MyCommand.Parameters.AddWithValue("@SoldierName", strSpeaker);
3937 }
3938 try
3939 {
3940 resultTable = this.SQLquery(MyCommand);
3941 if (resultTable.Rows != null)
3942 {
3943 foreach (DataRow row in resultTable.Rows)
3944 {
3945 result = new List<string>(m_lstPlayerStatsMessage);
3946 result = this.ListReplace(result, "%playerName%", row["SoldierName"].ToString());
3947 result = this.ListReplace(result, "%playerScore%", row["Score"].ToString());
3948 result = this.ListReplace(result, "%playerKills%", row["Kills"].ToString());
3949 result = this.ListReplace(result, "%playerDeaths%", row["Deaths"].ToString());
3950 result = this.ListReplace(result, "%playerSuicide%", row["Suicide"].ToString());
3951 result = this.ListReplace(result, "%playerTKs%", row["TKs"].ToString());
3952 result = this.ListReplace(result, "%playerRank%", row["rank"].ToString());
3953 result = this.ListReplace(result, "%allRanks%", row["allrank"].ToString());
3954 result = this.ListReplace(result, "%playerHeadshots%", row["Headshots"].ToString());
3955 result = this.ListReplace(result, "%rounds%", row["Rounds"].ToString());
3956 result = this.ListReplace(result, "%killstreak%", row["Killstreak"].ToString());
3957 result = this.ListReplace(result, "%deathstreak%", row["Deathstreak"].ToString());
3958 //KDR
3959 if (Convert.ToInt32(row["Deaths"]) != 0)
3960 {
3961 kdr = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Deaths"]);
3962 kdr = Math.Round(kdr, 2);
3963 result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
3964 }
3965 else
3966 {
3967 kdr = Convert.ToDouble(row["Kills"]);
3968 result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
3969 }
3970 //Playtime
3971 TimeSpan span = new TimeSpan(0, 0, Convert.ToInt32(row["Playtime"]));
3972 result = this.ListReplace(result, "%playerPlaytime%", span.ToString());
3973 //SPM
3974 double SPM;
3975 if (Convert.ToDouble(row["Playtime"]) != 0)
3976 {
3977 SPM = (Convert.ToDouble(row["Score"]) / (Convert.ToDouble(row["Playtime"]) / 60));
3978 SPM = Math.Round(SPM, 2);
3979 result = this.ListReplace(result, "%SPM%", SPM.ToString());
3980 }
3981 else
3982 {
3983 result = this.ListReplace(result, "%SPM%", "0");
3984 }
3985 }
3986 }
3987 }
3988 catch (Exception c)
3989 {
3990 this.DebugInfo("Error", "GetPlayerStats: " + c);
3991 }
3992 }
3993 if (result.Count != 0)
3994 {
3995 this.SendMultiLineChatMessage(result, delay,0 , scope, strSpeaker);
3996 }
3997 else
3998 {
3999 result.Clear();
4000 result.Add("No Stats are available yet! Please wait one Round!");
4001 this.SendMultiLineChatMessage(result, delay,0 , scope, strSpeaker);
4002 }
4003 }
4004 }
4005
4006 private void GetTop10(string strSpeaker, int delay, string scope)
4007 {
4008 List<string> result = new List<string>();
4009 if (this.m_enTop10ingame == enumBoolYesNo.Yes)
4010 {
4011 string SQL = String.Empty;
4012 int rank = 0;
4013 //Top10 Query
4014 if (this.m_enRankingByScore == enumBoolYesNo.Yes)
4015 {
4016 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4017 {
4018 SQL = @"SELECT tpd.SoldierName, SUM(tps.Score) AS Score, SUM(tps.Kills) AS Kills, SUM(tps.Deaths) AS Deaths , SUM(tps.Headshots) AS Headshots
4019 FROM " + this.tbl_playerstats + @" tps
4020 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID
4021 INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
4022 INNER JOIN " + this.tbl_playerrank + @" tpr ON tpr.PlayerID = tsp.PlayerID
4023 WHERE tpr.ServerGroup = @ServerGroup AND tpr.rankScore BETWEEN 1 AND 10
4024 GROUP BY tsp.PlayerID
4025 ORDER BY tpr.rankScore ASC";
4026 }
4027 else
4028 {
4029 SQL = @"SELECT tpd.SoldierName, tps.Score, tps.Kills, tps.Deaths, tps.Headshots
4030 FROM " + this.tbl_playerstats + @" tps
4031 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID
4032 INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
4033 WHERE tsp.ServerID = @ServerID AND tps.rankScore BETWEEN 1 AND 10
4034 ORDER BY tps.rankScore ASC";
4035 }
4036 }
4037 else
4038 {
4039 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4040 {
4041 SQL = @"SELECT tpd.SoldierName, SUM(tps.Score) AS Score, SUM(tps.Kills) AS Kills, SUM(tps.Deaths) AS Deaths , SUM(tps.Headshots) AS Headshots
4042 FROM " + this.tbl_playerstats + @" tps
4043 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID
4044 INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
4045 INNER JOIN " + this.tbl_playerrank + @" tpr ON tpr.PlayerID = tsp.PlayerID
4046 WHERE tpr.ServerGroup = @ServerGroup AND tpr.rankKills BETWEEN 1 AND 10
4047 GROUP BY tsp.PlayerID
4048 ORDER BY tpr.rankKills ASC";
4049 }
4050 else
4051 {
4052 SQL = @"SELECT tpd.SoldierName, tps.Score, tps.Kills, tps.Deaths, tps.Headshots
4053 FROM " + this.tbl_playerstats + @" tps
4054 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID
4055 INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
4056 WHERE tsp.ServerID = @ServerID AND tps.rankKills BETWEEN 1 AND 10
4057 ORDER BY tps.rankKills ASC";
4058 }
4059 }
4060 using (MySqlCommand MyCommand = new MySqlCommand(SQL))
4061 {
4062 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4063 {
4064 MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
4065 }
4066 else
4067 {
4068 MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
4069 }
4070 DataTable resultTable;
4071 try
4072 {
4073 resultTable = this.SQLquery(MyCommand);
4074 result = new List<string>();
4075 //Top 10 Header
4076 result.Add(this.m_strTop10Header.Replace("%serverName%", this.serverName));
4077 StringBuilder Top10Row = new StringBuilder();
4078 double kdr1;
4079 double khr;
4080 if (resultTable.Rows != null)
4081 {
4082 foreach (DataRow row in resultTable.Rows)
4083 {
4084 Top10Row.Append(this.m_strTop10RowFormat);
4085
4086 if (Convert.ToDouble(row["Deaths"]) != 0)
4087 {
4088 kdr1 = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Deaths"]);
4089 Top10Row.Replace("%playerKDR%", Math.Round(kdr1, 2).ToString());
4090 }
4091 else
4092 {
4093 Top10Row.Replace("%playerKDR%", Convert.ToDouble(row["Kills"]).ToString());
4094 }
4095
4096 if (Convert.ToDouble(row["Headshots"]) != 0)
4097 {
4098 khr = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Headshots"]);
4099 khr = Math.Round(khr, 4);
4100 khr = khr * 100;
4101 Top10Row.Replace("%playerKHR%", khr.ToString());
4102 }
4103 else
4104 {
4105 khr = 0;
4106 }
4107 rank = rank + 1;
4108 Top10Row.Replace("%Rank%", rank.ToString()).Replace("%playerName%", row["SoldierName"].ToString()).Replace("%playerScore%", row["Score"].ToString()).Replace("%playerKills%", row["Kills"].ToString());
4109 Top10Row.Replace("%playerDeaths%", row["Deaths"].ToString()).Replace("%playerHeadshots%", row["Headshots"].ToString());
4110 result.Add(Top10Row.ToString());
4111 Top10Row.Length = 0;
4112 }
4113 }
4114 }
4115 catch (Exception c)
4116 {
4117 this.DebugInfo("Error", "GetTop10: " + c);
4118 }
4119 }
4120 if (result.Count > 0)
4121 {
4122 this.SendMultiLineChatMessage(result, 0, delay, scope, strSpeaker);
4123 }
4124 }
4125 }
4126
4127 private void GetWeaponStats(string strWeapon, string strPlayer, string scope)
4128 {
4129
4130 this.DebugInfo("Trace", "GetWeaponStats: " + strPlayer + " " + strWeapon);
4131 int delay = 0;
4132 string SQL = String.Empty;
4133 List<string> result = new List<string>();
4134
4135 if (this.DamageClass.ContainsKey(strWeapon) == true)
4136 //if (this.WeaponMappingDic.ContainsKey(strWeapon) == true)
4137 {
4138 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4139 {
4140 SQL = @"SELECT `Kills`, `Headshots`, `Deaths`, rank, (SELECT COUNT(DISTINCT PlayerID) FROM " + this.tbl_server_player + @" tsp INNER JOIN " + this.tbl_server + @" ts ON ts.ServerID = tsp.ServerID AND ts.ServerGroup = @ServerGroup) AS allrank
4141 FROM (SELECT sub.PlayerID, (@num := @num + 1) AS rank, `Kills`, `Headshots`, `Deaths`
4142 FROM
4143 (SELECT tsp.PlayerID, SUM(`Kills`) AS `Kills`, SUM(`Headshots`) AS `Headshots`, SUM(`Deaths`) AS `Deaths`
4144 FROM " + this.tbl_weapons_stats + @" tw
4145 INNER JOIN " + this.tbl_server_player + @" tsp ON tw.StatsID = tsp.StatsID
4146 INNER JOIN " + this.tbl_server + @" tserver ON tsp.ServerID = tserver.ServerID AND tserver.ServerGroup = @ServerGroup ,(SELECT @num := 0) x
4147 WHERE tw.WeaponID = @WeaponID
4148 GROUP BY tsp.PlayerID
4149 ORDER BY `Kills` DESC, `Headshots` DESC) sub )sub2
4150 INNER JOIN " + this.tbl_playerdata + @" tpd ON tpd.PlayerID = sub2.PlayerID
4151 WHERE tpd.SoldierName = @SoldierName AND tpd.GameID = @GameID LIMIT 1";
4152 }
4153 else
4154 {
4155 SQL = @"SELECT
4156 Kills,
4157 Headshots,
4158 Deaths,
4159 (SELECT
4160 rank
4161 FROM
4162 (SELECT
4163 @rownum:=@rownum + 1 AS rank, sub.PlayerID
4164 FROM
4165 (SELECT @rownum:=0) r, (SELECT
4166 tsp.PlayerID
4167 FROM
4168 " + this.tbl_weapons_stats + @" tw
4169 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.ServerID = @ServerID
4170 AND tw.StatsID = tsp.StatsID
4171 WHERE
4172 tw.WeaponID = @WeaponID
4173 ORDER BY tw.Kills DESC , tw.Headshots DESC) sub) sub2
4174 WHERE
4175 PlayerID = tpd.PlayerID
4176 LIMIT 1) AS rank,
4177 (SELECT
4178 COUNT(*)
4179 FROM
4180 " + this.tbl_server_player + @"
4181 WHERE
4182 ServerID = @ServerID) AS allrank
4183 FROM
4184 " + this.tbl_weapons_stats + @" tw
4185 INNER JOIN
4186 " + this.tbl_server_player + @" tsp ON tw.StatsID = tsp.StatsID
4187 AND tsp.ServerID = @ServerID
4188 INNER JOIN
4189 " + this.tbl_playerdata + @" tpd ON tpd.PlayerID = tsp.PlayerID
4190 WHERE
4191 tpd.SoldierName = @SoldierName
4192 AND tpd.GameID = @GameID
4193 AND WeaponID = @WeaponID
4194 LIMIT 1";
4195 }
4196
4197 this.DebugInfo("Trace", "GetWeaponStats: Query:" + SQL);
4198 using (MySqlCommand MyCommand = new MySqlCommand(SQL))
4199 {
4200 //MyCommand.Parameters.AddWithValue("@WeaponID", this.weaponDic[this.DamageClass[strWeapon]][strWeapon].Name);
4201 MyCommand.Parameters.AddWithValue("@WeaponID", this.WeaponMappingDic[this.weaponDic[this.DamageClass[strWeapon]][strWeapon].Name]);
4202 MyCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
4203 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4204 {
4205 MyCommand.Parameters.AddWithValue("@SoldierName", strPlayer);
4206 MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
4207 }
4208 else
4209 {
4210 MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
4211 MyCommand.Parameters.AddWithValue("@SoldierName", strPlayer);
4212 }
4213 try
4214 {
4215 DataTable resultTable = this.SQLquery(MyCommand);
4216 if (resultTable.Rows != null)
4217 {
4218 foreach (DataRow row in resultTable.Rows)
4219 {
4220 result = new List<string>(this.m_lstWeaponstatsMsg);
4221 if (row[0] != Convert.DBNull || row[1] != Convert.DBNull || row[2] != Convert.DBNull)
4222 {
4223 result = this.ListReplace(result, "%playerKills%", row[0].ToString());
4224 result = this.ListReplace(result, "%playerHeadshots%", row[1].ToString());
4225 result = this.ListReplace(result, "%playerDeaths%", row[2].ToString());
4226 result = this.ListReplace(result, "%playerRank%", row[3].ToString());
4227 result = this.ListReplace(result, "%allRanks%", row[4].ToString());
4228
4229 double khr = 0;
4230 if (Convert.ToDouble(row[0]) != 0)
4231 {
4232 khr = Convert.ToDouble(row[1]) / Convert.ToDouble(row[0]);
4233 khr = Math.Round(khr, 2);
4234 khr = khr * 100;
4235 }
4236 else
4237 {
4238 khr = 0;
4239 }
4240 double kdr = 0;
4241 if (Convert.ToDouble(row[2]) != 0)
4242 {
4243 kdr = Convert.ToDouble(row[0]) / Convert.ToDouble(row[2]);
4244 kdr = Math.Round(kdr, 2);
4245 }
4246 else
4247 {
4248 kdr = Convert.ToDouble(row[2]);
4249 }
4250 result = this.ListReplace(result, "%playerKHR%", khr.ToString());
4251 result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
4252 }
4253 else
4254 {
4255 result.Clear();
4256 }
4257 }
4258 }
4259 }
4260 catch (Exception c)
4261 {
4262 this.DebugInfo("Error", "GetWeaponStats: " + c);
4263 }
4264 }
4265 result = this.ListReplace(result, "%playerName%", strPlayer);
4266 result = this.ListReplace(result, "%Weapon%", this.weaponDic[this.DamageClass[strWeapon]][strWeapon].FieldName);
4267 if (result.Count > 0)
4268 {
4269 this.SendMultiLineChatMessage(result, delay, 0, scope, strPlayer);
4270 }
4271 else
4272 {
4273 result.Clear();
4274 result.Add("No Stats are available for this Weapon!!!");
4275 this.SendMultiLineChatMessage(result, delay, 0, scope, strPlayer);
4276 }
4277 }
4278 else
4279 {
4280 result.Clear();
4281 result.Add("Specific Weapon not found!!");
4282 this.SendMultiLineChatMessage(result, delay, 0, scope, strPlayer);
4283 }
4284 }
4285
4286 private void GetWeaponTop10(string strWeapon, string strPlayer, int delay, string scope)
4287 {
4288 this.DebugInfo("Trace", "GetWeaponTop10: strWeapon = " + strWeapon);
4289 int delaytop10 = 0;
4290 double kdr = 0;
4291 double khr = 0;
4292 int rank = 0;
4293 string SQL = String.Empty;
4294 List<string> result = new List<string>();
4295 if (this.DamageClass.ContainsKey(strWeapon) == true)
4296 {
4297 //string tbl_weapons = "tbl_weapons_" + this.DamageClass[strWeapon].ToLower() + this.tableSuffix;
4298 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4299 {
4300 SQL = @"SELECT tpd.SoldierName, SUM(`Kills`) AS `Kills`, SUM(`Headshots`) AS `Headshots`, SUM(`Deaths`) AS `Deaths`
4301 FROM " + this.tbl_weapons_stats + @" tw
4302 INNER JOIN " + this.tbl_server_player + @" tsp ON tw.StatsID = tsp.StatsID
4303 INNER JOIN " + this.tbl_playerdata + @" tpd ON tpd.PlayerID = tsp.PlayerID
4304 INNER JOIN " + this.tbl_server + @" ts ON ts.ServerID = tsp.ServerID
4305 WHERE ts.ServerGroup = @ServerGroup AND tw.WeaponID = @WeaponID
4306 GROUP BY tsp.PlayerID
4307 ORDER BY SUM(`Kills`)` DESC, SUM(`Headshots`) DESC
4308 LIMIT 10";
4309 }
4310 else
4311 {
4312 SQL = @"SELECT tpd.SoldierName, `Kills`, `Headshots`, `Deaths`
4313 FROM " + this.tbl_weapons_stats + @" tw
4314 INNER JOIN " + this.tbl_server_player + @" tsp ON tw.StatsID = tsp.StatsID
4315 INNER JOIN " + this.tbl_playerdata + @" tpd ON tpd.PlayerID = tsp.PlayerID
4316 WHERE tsp.ServerID = @ServerID AND tw.WeaponID = @WeaponID
4317 ORDER BY `Kills` DESC, `Headshots` DESC
4318 LIMIT 10";
4319 }
4320
4321 //SQL = SQL.Replace("%Weapon%", this.weaponDic[this.DamageClass[strWeapon]][strWeapon].FieldName);
4322
4323 this.DebugInfo("Trace", "GetWeaponTop10: Query:" + SQL);
4324
4325 using (MySqlCommand MyCommand = new MySqlCommand(SQL))
4326 {
4327 MyCommand.Parameters.AddWithValue("@WeaponID", this.WeaponMappingDic[this.weaponDic[this.DamageClass[strWeapon]][strWeapon].Name]);
4328 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4329 {
4330 MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
4331 }
4332 else
4333 {
4334 MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
4335 }
4336 DataTable resultTable;
4337 try
4338 {
4339 result = new List<string>();
4340 //result.Add("Top 10 Killers with %Weapon%");
4341 result.Add(this.m_strWeaponTop10Header.Replace("%serverName%", this.serverName));
4342 resultTable = this.SQLquery(MyCommand);
4343 StringBuilder Top10Row = new StringBuilder(this.m_strWeaponTop10RowFormat);
4344 if (resultTable.Rows != null)
4345 {
4346 foreach (DataRow row in resultTable.Rows)
4347 {
4348 if (Convert.ToDouble(row[3]) != 0)
4349 {
4350 kdr = Convert.ToDouble(row[1]) / Convert.ToDouble(row[3]);
4351 kdr = Math.Round(kdr, 2);
4352 }
4353 else
4354 {
4355 kdr = Convert.ToDouble(row[1]);
4356 }
4357 if (Convert.ToDouble(row[1]) != 0)
4358 {
4359 khr = Convert.ToDouble(row[2]) / Convert.ToDouble(row[1]);
4360 khr = Math.Round(khr, 4);
4361 khr = khr * 100;
4362 }
4363 else
4364 {
4365 khr = 0;
4366 }
4367 Top10Row.Length = 0;
4368 Top10Row.Append(this.m_strWeaponTop10RowFormat);
4369 rank = rank + 1;
4370 Top10Row.Replace("%Rank%", rank.ToString()).Replace("%playerName%", row[0].ToString()).Replace("%playerKills%", row[1].ToString()).Replace("%playerHeadshots%", row[2].ToString()).Replace("%playerDeaths%", row[3].ToString()).Replace("%playerKHR%", khr.ToString());
4371 result.Add(Top10Row.ToString());
4372 }
4373 }
4374 }
4375 catch (Exception c)
4376 {
4377 this.DebugInfo("Error", "GetWeaponTop10: " + c);
4378 }
4379 }
4380 result = this.ListReplace(result, "%Player%", strPlayer);
4381 result = this.ListReplace(result, "%Weapon%", this.weaponDic[this.DamageClass[strWeapon]][strWeapon].FieldName);
4382 if (result.Count > 0)
4383 {
4384 this.SendMultiLineChatMessage(result, 0, delay, scope, strPlayer);
4385 }
4386 else
4387 {
4388 result.Clear();
4389 result.Add("No Stats are available for this Weapon!!!");
4390 this.SendMultiLineChatMessage(result, 0, delay, scope, strPlayer);
4391 }
4392 }
4393 else
4394 {
4395 result.Clear();
4396 result.Add("Specific Weapon not found!!");
4397 this.SendMultiLineChatMessage(result, 0, delay, scope, strPlayer);
4398 }
4399 }
4400
4401 private void GetDogtags(string strPlayer, int delay, string scope)
4402 {
4403 int delaydogtags = 0;
4404 string SQL = String.Empty;
4405 string SQL2 = String.Empty;
4406 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4407 {
4408 SQL = @"SELECT pd.SoldierName, SUM(dt.Count) AS Count
4409 FROM " + this.tbl_server_player + @" sp
4410 INNER JOIN " + this.tbl_server + @" ts ON ts.ServerID = sp.ServerID AND ts.ServerGroup = @ServerGroup
4411 INNER JOIN " + this.tbl_dogtags + @" dt ON sp.StatsID = dt.VictimID
4412 INNER JOIN " + this.tbl_playerdata + @" pd ON sp.PlayerID = pd.PlayerID
4413 WHERE KillerID IN (SELECT StatsID AS KillerID FROM " + this.tbl_server_player + @" WHERE PlayerID = @KillerID)
4414 GROUP BY pd.PlayerID ORDER BY Count DESC Limit 3";
4415
4416 SQL2 = @"SELECT pd.SoldierName, SUM(dt.Count) AS Count
4417 FROM " + this.tbl_server_player + @" sp
4418 INNER JOIN " + this.tbl_server + @" ts ON ts.ServerID = sp.ServerID AND ts.ServerGroup = @ServerGroup
4419 INNER JOIN " + this.tbl_dogtags + @" dt ON sp.StatsID = dt.KillerID
4420 INNER JOIN " + this.tbl_playerdata + @" pd ON sp.PlayerID = pd.PlayerID
4421 WHERE VictimID IN (SELECT StatsID AS VictimID FROM " + this.tbl_server_player + @" WHERE PlayerID = @VictimID)
4422 GROUP BY pd.PlayerID ORDER BY Count DESC Limit 3";
4423 }
4424 else
4425 {
4426 SQL = @"SELECT pd.SoldierName, dt.Count
4427 FROM " + this.tbl_server_player + @" sp
4428 INNER JOIN " + this.tbl_dogtags + @" dt ON sp.StatsID = dt.VictimID
4429 INNER JOIN " + this.tbl_playerdata + @" pd ON sp.PlayerID = pd.PlayerID
4430 WHERE KillerID = @KillerID AND sp.ServerID = @ServerID
4431 ORDER BY Count DESC Limit 3";
4432
4433 SQL2 = @"SELECT pd.SoldierName, dt.Count
4434 FROM " + this.tbl_server_player + @" sp
4435 INNER JOIN " + this.tbl_dogtags + @" dt ON sp.StatsID = dt.KillerID
4436 INNER JOIN " + this.tbl_playerdata + @" pd ON sp.PlayerID = pd.PlayerID
4437 WHERE VictimID = @VictimID AND sp.ServerID = @ServerID
4438 ORDER BY Count DESC Limit 3";
4439 }
4440
4441 List<string> result = new List<string>();
4442 List<string> result2 = new List<string>();
4443
4444 if (this.StatsTracker.ContainsKey(strPlayer) == false)
4445 {
4446 return;
4447 }
4448
4449 using (MySqlCommand MyCommand = new MySqlCommand(SQL))
4450 {
4451 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4452 {
4453 MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
4454 MyCommand.Parameters.AddWithValue("@KillerID", this.GetID(this.StatsTracker[strPlayer].EAGuid).Id);
4455 }
4456 else
4457 {
4458 MyCommand.Parameters.AddWithValue("@KillerID", this.GetID(this.StatsTracker[strPlayer].EAGuid).StatsID);
4459 MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
4460 }
4461 try
4462 {
4463 result = new List<string>();
4464 result.Add("Your favorite Victims:");
4465 DataTable resultTable = this.SQLquery(MyCommand);
4466 if (resultTable.Rows.Count > 0)
4467 {
4468 foreach (DataRow row in resultTable.Rows)
4469 {
4470 result.Add(" " + row["Count"] + "x " + row["SoldierName"]);
4471 }
4472 }
4473 else
4474 {
4475 result.Add("None - Get some dogtags!!");
4476 }
4477 resultTable.Dispose();
4478 }
4479 catch (Exception c)
4480 {
4481 this.DebugInfo("Error", "GetDogtags: " + c);
4482 }
4483 }
4484 using (MySqlCommand MyCommand = new MySqlCommand(SQL2))
4485 {
4486 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4487 {
4488 MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
4489 MyCommand.Parameters.AddWithValue("@VictimID", this.GetID(this.StatsTracker[strPlayer].EAGuid).Id);
4490 }
4491 else
4492 {
4493 MyCommand.Parameters.AddWithValue("@VictimID", this.GetID(this.StatsTracker[strPlayer].EAGuid).StatsID);
4494 MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
4495 }
4496 try
4497 {
4498 result2 = new List<string>();
4499 result2.Add("Your worst Enemies:");
4500 DataTable resultTable = this.SQLquery(MyCommand);
4501 if (resultTable.Rows.Count > 0)
4502 {
4503 foreach (DataRow row in resultTable.Rows)
4504 {
4505 result2.Add(" " + row["Count"] + "x " + row["SoldierName"]);
4506 }
4507 }
4508 else
4509 {
4510 result2.Add("Nobody got your Tag yet!");
4511 }
4512 resultTable.Dispose();
4513 }
4514 catch (Exception c)
4515 {
4516 this.ExecuteCommand("procon.protected.pluginconsole.write", "Error in GetDogtags: " + c);
4517 }
4518 }
4519 this.CloseMySqlConnection(1);
4520 result.AddRange(result2);
4521 if (result[0].Equals("0") == false)
4522 {
4523 this.SendMultiLineChatMessage(result, delaydogtags, delay, scope, strPlayer);
4524 }
4525 else
4526 {
4527 result.Clear();
4528 result.Add("No Stats are available!!!");
4529 this.SendMultiLineChatMessage(result, delaydogtags, delay, scope, strPlayer);
4530 }
4531 }
4532
4533 private void GetPlayerOfTheDay(string strSpeaker, int delay, string scope)
4534 {
4535 List<string> result = new List<string>();
4536 if (this.m_enLogSTATS == enumBoolYesNo.Yes)
4537 {
4538 string SQL = string.Empty;
4539
4540 string SQL_SELECT = @"SELECT
4541 tpd.SoldierName AS SoldierName,
4542 SUM(ts.Score) AS Score,
4543 SUM(ts.Kills) AS Kills,
4544 SUM(ts.Headshots) AS Headshots,
4545 SUM(ts.Deaths) AS Deaths,
4546 SUM(ts.TKs) AS TKs,
4547 SUM(ts.Suicide) AS Suicide,
4548 SUM(ts.RoundCount ) AS RoundCount,
4549 SUM(ts.Playtime) AS Playtime,
4550 MAX(ts.Killstreak) AS Killstreak,
4551 MAX(ts.Deathstreak) AS Deathstreak,
4552 MAX(ts.HighScore) AS HighScore,
4553 SUM(ts.Wins ) AS Wins,
4554 SUM(ts.Losses ) AS Losses, ";
4555
4556
4557 string SQL_JOINS = @" FROM " + this.tbl_sessions + @" ts
4558 INNER JOIN " + this.tbl_server_player + @" tsp USING(StatsID)
4559 INNER JOIN " + this.tbl_playerdata + @" tpd USING(PlayerID) ";
4560
4561 string SQL_CONDS = string.Empty;
4562
4563 string strMSG = String.Empty;
4564 double kdr = 0;
4565 //Statsquery with KDR
4566 //Rankquery
4567 if (m_enRankingByScore == enumBoolYesNo.Yes)
4568 {
4569 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4570 {
4571 //Ranking by Score overall Server
4572 SQL_SELECT = SQL_SELECT + @"(SELECT SUM(tss.CountPlayers) FROM " + this.tbl_server_stats + @" tss INNER JOIN " + this.tbl_server + @" ts ON tss.ServerID = ts.ServerID AND ServerGroup = @ServerGroup GROUP BY ts.ServerGroup ) AS allrank, tpr.rankScore AS rank ";
4573
4574 SQL_JOINS = SQL_JOINS + @" INNER JOIN " + this.tbl_server + @" ts2 USING(ServerID)
4575 INNER JOIN " + this.tbl_playerrank + @" tpr USING(PlayerID)";
4576
4577 SQL_CONDS = @" WHERE ts.StartTime >= CURRENT_DATE() AND ts2.ServerGroup = @ServerGroup
4578 Group BY tsp.StatsID
4579 ORDER BY SUM(ts.Score) DESC ";
4580 }
4581 else
4582 {
4583 //Ranking by Score specfic Server
4584 SQL_SELECT = SQL_SELECT + @"(SELECT tss.CountPlayers FROM " + this.tbl_server_stats + @" tss WHERE ServerID = @ServerID ) AS allrank, tps.rankScore AS rank ";
4585
4586 SQL_JOINS = SQL_JOINS + @" INNER JOIN " + this.tbl_playerstats + @" tps USING(StatsID) ";
4587
4588 SQL_CONDS = @" WHERE ts.StartTime >= CURRENT_DATE() AND tsp.ServerID = @ServerID
4589 Group BY tsp.StatsID
4590 ORDER BY SUM(ts.Score) DESC ";
4591 }
4592 }
4593 else
4594 {
4595 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4596 {
4597
4598 //Ranking by Kills overall Server
4599 SQL_SELECT = SQL_SELECT + @"(SELECT SUM(tss.CountPlayers) FROM " + this.tbl_server_stats + @" tss INNER JOIN " + this.tbl_server + @" ts ON tss.ServerID = ts.ServerID AND ServerGroup = @ServerGroup GROUP BY ts.ServerGroup ) AS allrank, tpr.rankKills AS rank ";
4600
4601 SQL_JOINS = SQL_JOINS + @" INNER JOIN " + this.tbl_server + @" ts2 USING(ServerID)
4602 INNER JOIN " + this.tbl_playerrank + @" tpr USING(PlayerID)";
4603
4604 SQL_CONDS = @" WHERE ts.StartTime >= CURRENT_DATE() AND ts2.ServerGroup = @ServerGroup
4605 Group BY tsp.StatsID
4606 ORDER BY SUM(ts.Kills) DESC, SUM(ts.Deaths) ASC ";
4607 }
4608 else
4609 {
4610 //Ranking by Kills specfic Server
4611 SQL_SELECT = SQL_SELECT + @"(SELECT tss.CountPlayers FROM " + this.tbl_server_stats + @" tss WHERE ServerID = @ServerID ) AS allrank , tps.rankKills AS rank ";
4612
4613 SQL_JOINS = SQL_JOINS + @" INNER JOIN " + this.tbl_playerstats + @" tps USING(StatsID) ";
4614
4615 SQL_CONDS = @" WHERE ts.StartTime >= CURRENT_DATE() AND tsp.ServerID = @ServerID
4616 Group BY tsp.StatsID
4617 ORDER BY SUM(ts.Kills) DESC, SUM(ts.Deaths) ASC ";
4618 }
4619 }
4620 //Add LIMIT
4621 SQL = SQL_SELECT + SQL_JOINS + SQL_CONDS + @" LIMIT 1";
4622 using (MySqlCommand MyCommand = new MySqlCommand(SQL))
4623 {
4624 DataTable resultTable;
4625 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4626 {
4627 MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
4628 }
4629 else
4630 {
4631 MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
4632 }
4633 try
4634 {
4635 resultTable = this.SQLquery(MyCommand);
4636 if (resultTable.Rows != null)
4637 {
4638 foreach (DataRow row in resultTable.Rows)
4639 {
4640 result = new List<string>(m_lstPlayerOfTheDayMessage);
4641 result = this.ListReplace(result, "%playerName%", row["SoldierName"].ToString());
4642 result = this.ListReplace(result, "%playerScore%", row["Score"].ToString());
4643 result = this.ListReplace(result, "%playerKills%", row["Kills"].ToString());
4644 result = this.ListReplace(result, "%playerDeaths%", row["Deaths"].ToString());
4645 result = this.ListReplace(result, "%playerSuicide%", row["Suicide"].ToString());
4646 result = this.ListReplace(result, "%playerTKs%", row["TKs"].ToString());
4647 result = this.ListReplace(result, "%playerRank%", row["rank"].ToString());
4648 result = this.ListReplace(result, "%allRanks%", row["allrank"].ToString());
4649 result = this.ListReplace(result, "%playerHeadshots%", row["Headshots"].ToString());
4650 result = this.ListReplace(result, "%rounds%", row["RoundCount"].ToString());
4651 result = this.ListReplace(result, "%killstreak%", row["Killstreak"].ToString());
4652 result = this.ListReplace(result, "%deathstreak%", row["Deathstreak"].ToString());
4653 //KDR
4654 if (Convert.ToInt32(row["Deaths"]) != 0)
4655 {
4656 kdr = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Deaths"]);
4657 kdr = Math.Round(kdr, 2);
4658 result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
4659 }
4660 else
4661 {
4662 kdr = Convert.ToDouble(row["Kills"]);
4663 result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
4664 }
4665 //Playtime
4666 TimeSpan span = new TimeSpan(0, 0, Convert.ToInt32(row["Playtime"]));
4667 result = this.ListReplace(result, "%playerPlaytime%", span.ToString());
4668 //SPM
4669 double SPM;
4670 if (Convert.ToDouble(row["Playtime"]) != 0)
4671 {
4672 SPM = (Convert.ToDouble(row["Score"]) / (Convert.ToDouble(row["Playtime"]) / 60));
4673 SPM = Math.Round(SPM, 2);
4674 result = this.ListReplace(result, "%SPM%", SPM.ToString());
4675 }
4676 else
4677 {
4678 result = this.ListReplace(result, "%SPM%", "0");
4679 }
4680 }
4681 }
4682 }
4683 catch (Exception c)
4684 {
4685 this.DebugInfo("Error", "GetPlayerOfTheDay: " + c);
4686 }
4687 }
4688 if (result.Count != 0)
4689 {
4690 this.SendMultiLineChatMessage(result, delay, 0, scope, strSpeaker);
4691 }
4692 else
4693 {
4694 result.Clear();
4695 result.Add("No Stats are available yet! Please wait one Round!");
4696 this.SendMultiLineChatMessage(result, delay, 0, scope, strSpeaker);
4697 }
4698 }
4699 }
4700
4701 private void GetTop10ForPeriod(string strSpeaker, int delay, string scope, int intdays)
4702 {
4703 List<string> result = new List<string>();
4704 if (this.m_enTop10ingame == enumBoolYesNo.Yes)
4705 {
4706 string SQL = @"SELECT
4707 tpd.SoldierName AS SoldierName,
4708 SUM(ts.Score) AS Score,
4709 SUM(ts.Kills) AS Kills,
4710 SUM(ts.Headshots) AS Headshots,
4711 SUM(ts.Deaths) AS Deaths,
4712 SUM(ts.TKs) AS TKs,
4713 SUM(ts.Suicide) AS Suicide,
4714 SUM(ts.RoundCount ) AS RoundCount,
4715 SUM(ts.Playtime) AS Playtime
4716 FROM " + this.tbl_sessions + @" ts
4717 INNER JOIN " + this.tbl_server_player + @" tsp USING(StatsID)
4718 INNER JOIN " + this.tbl_playerdata + @" tpd USING(PlayerID) ";
4719 int rank = 0;
4720 //Top10 Query
4721 if (m_enRankingByScore == enumBoolYesNo.Yes)
4722 {
4723 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4724 {
4725 //Ranking by Score overall Server
4726 SQL = SQL + @" INNER JOIN " + this.tbl_server + @" ts2 USING(ServerID)
4727 WHERE ts.StartTime >= DATE_SUB(CURRENT_DATE(),INTERVAL @DAYS DAY) AND ts2.ServerGroup = @ServerGroup
4728 Group BY tsp.StatsID
4729 ORDER BY SUM(ts.Score) DESC ";
4730 }
4731 else
4732 {
4733 //Ranking by Score specfic Server
4734 SQL = SQL + @" WHERE ts.StartTime >= DATE_SUB(CURRENT_DATE(),INTERVAL @DAYS DAY) AND tsp.ServerID = @ServerID
4735 Group BY tsp.StatsID
4736 ORDER BY SUM(ts.Score) DESC ";
4737 }
4738 }
4739 else
4740 {
4741 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4742 {
4743 //Ranking by Kills overall Server
4744 SQL = SQL + @" INNER JOIN " + this.tbl_server + @" ts2 USING(ServerID)
4745 WHERE ts.StartTime >= DATE_SUB(CURRENT_DATE(),INTERVAL @DAYS DAY) AND ts2.ServerGroup = @ServerGroup
4746 Group BY tsp.StatsID
4747 ORDER BY SUM(ts.Kills) DESC, SUM(ts.Deaths) ASC ";
4748 }
4749 else
4750 {
4751 //Ranking by Kills specfic Server
4752 SQL = SQL + @" WHERE ts.StartTime >= DATE_SUB(CURRENT_DATE(),INTERVAL @DAYS DAY) AND tsp.ServerID = @ServerID
4753 Group BY tsp.StatsID
4754 ORDER BY SUM(ts.Kills) DESC, SUM(ts.Deaths) ASC ";
4755 }
4756 }
4757 //Add LIMIT
4758 SQL = SQL + @" LIMIT 10";
4759
4760 using (MySqlCommand MyCommand = new MySqlCommand(SQL))
4761 {
4762 MyCommand.Parameters.AddWithValue("@DAYS", intdays);
4763 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
4764 {
4765 MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
4766 }
4767 else
4768 {
4769 MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
4770 }
4771 DataTable resultTable;
4772 try
4773 {
4774 resultTable = this.SQLquery(MyCommand);
4775 result = new List<string>();
4776 //Top 10 Header
4777 result.Add(this.m_strTop10HeaderForPeriod.Replace("%serverName%", this.serverName).Replace("%intervaldays%", intdays.ToString()));
4778 StringBuilder Top10Row = new StringBuilder();
4779 double kdr1;
4780 double khr;
4781 if (resultTable.Rows != null)
4782 {
4783 foreach (DataRow row in resultTable.Rows)
4784 {
4785 Top10Row.Append(this.m_strTop10RowFormat);
4786
4787 if (Convert.ToDouble(row["Deaths"]) != 0)
4788 {
4789 kdr1 = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Deaths"]);
4790 Top10Row.Replace("%playerKDR%", Math.Round(kdr1, 2).ToString());
4791 }
4792 else
4793 {
4794 Top10Row.Replace("%playerKDR%", Convert.ToDouble(row["Kills"]).ToString());
4795 }
4796
4797 if (Convert.ToDouble(row["Headshots"]) != 0)
4798 {
4799 khr = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Headshots"]);
4800 khr = Math.Round(khr, 4);
4801 khr = khr * 100;
4802 Top10Row.Replace("%playerKHR%", khr.ToString());
4803 }
4804 else
4805 {
4806 khr = 0;
4807 }
4808 rank = rank + 1;
4809 Top10Row.Replace("%Rank%", rank.ToString()).Replace("%playerName%", row["SoldierName"].ToString()).Replace("%playerScore%", row["Score"].ToString()).Replace("%playerKills%", row["Kills"].ToString());
4810 Top10Row.Replace("%playerDeaths%", row["Deaths"].ToString()).Replace("%playerHeadshots%", row["Headshots"].ToString());
4811 result.Add(Top10Row.ToString());
4812 Top10Row.Length = 0;
4813 }
4814 }
4815 }
4816 catch (Exception c)
4817 {
4818 this.DebugInfo("Error", "GetTop10ForPeriod: " + c);
4819 }
4820 }
4821 if (result.Count > 0)
4822 {
4823 this.SendMultiLineChatMessage(result, 0, delay, scope, strSpeaker);
4824 }
4825 }
4826 }
4827
4828 //Add to stats
4829 private void AddKillToStats(string strPlayerName, string DmgType, string weapon, bool headshot)
4830 {
4831 if (StatsTracker.ContainsKey(strPlayerName))
4832 {
4833 StatsTracker[strPlayerName].addKill(DmgType, weapon, headshot);
4834 }
4835 else
4836 {
4837 CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic);
4838 StatsTracker.Add(strPlayerName, newEntry);
4839 StatsTracker[strPlayerName].addKill(DmgType, weapon, headshot);
4840 }
4841 //Session
4842 if (m_dicSession.ContainsKey(strPlayerName) && this.m_sessionON == enumBoolYesNo.Yes)
4843 {
4844 m_dicSession[strPlayerName].addKill(DmgType, weapon, headshot);
4845 }
4846 }
4847
4848 public void AddDeathToStats(string strPlayerName, string DmgType, string weapon)
4849 {
4850 if (StatsTracker.ContainsKey(strPlayerName))
4851 {
4852 StatsTracker[strPlayerName].addDeath(DmgType, weapon);
4853 }
4854 else
4855 {
4856 CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic);
4857 StatsTracker.Add(strPlayerName, newEntry);
4858 StatsTracker[strPlayerName].addDeath(DmgType, weapon);
4859 }
4860
4861 //Session
4862 if (m_dicSession.ContainsKey(strPlayerName) && this.m_sessionON == enumBoolYesNo.Yes)
4863 {
4864 m_dicSession[strPlayerName].addDeath(DmgType, weapon);
4865 }
4866 }
4867
4868 private void AddSuicideToStats(string strPlayerName, string DmgType, string weapon)
4869 {
4870 if (StatsTracker.ContainsKey(strPlayerName))
4871 {
4872 StatsTracker[strPlayerName].addDeath(DmgType, weapon);
4873 StatsTracker[strPlayerName].Suicides++;
4874 }
4875 else
4876 {
4877 CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 1, 0, 0, this.m_dTimeOffset, this.weaponDic);
4878 StatsTracker.Add(strPlayerName, newEntry);
4879 StatsTracker[strPlayerName].addDeath(DmgType, weapon);
4880 }
4881
4882 //Session
4883 if (m_dicSession.ContainsKey(strPlayerName) && this.m_sessionON == enumBoolYesNo.Yes)
4884 {
4885 m_dicSession[strPlayerName].addDeath(DmgType, weapon);
4886 m_dicSession[strPlayerName].Suicides++;
4887 }
4888 }
4889
4890 private void AddTeamKillToStats(string strPlayerName)
4891 {
4892 if (StatsTracker.ContainsKey(strPlayerName))
4893 {
4894 StatsTracker[strPlayerName].Teamkills++;
4895 }
4896 else
4897 {
4898 CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 0, 1, 0, this.m_dTimeOffset, this.weaponDic);
4899 StatsTracker.Add(strPlayerName, newEntry);
4900 }
4901
4902 //Session
4903 if (m_dicSession.ContainsKey(strPlayerName) && this.m_sessionON == enumBoolYesNo.Yes)
4904 {
4905 m_dicSession[strPlayerName].Teamkills++;
4906 }
4907 }
4908 //Misc
4909 private void AddPBInfoToStats(CPunkbusterInfo cpbiPlayer)
4910 {
4911 if (StatsTracker.ContainsKey(cpbiPlayer.SoldierName))
4912 {
4913 StatsTracker[cpbiPlayer.SoldierName].Guid = cpbiPlayer.GUID;
4914 if (cpbiPlayer.PlayerCountryCode.Length <= 2)
4915 {
4916 StatsTracker[cpbiPlayer.SoldierName].PlayerCountryCode = cpbiPlayer.PlayerCountryCode;
4917 }
4918 else
4919 {
4920 StatsTracker[cpbiPlayer.SoldierName].PlayerCountryCode = "--";
4921 }
4922 if (StatsTracker[cpbiPlayer.SoldierName].TimePlayerjoined == null)
4923 StatsTracker[cpbiPlayer.SoldierName].TimePlayerjoined = MyDateTime.Now;
4924 }
4925 else
4926 {
4927 CStats newEntry = new CStats(cpbiPlayer.GUID, 0, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic);
4928 StatsTracker.Add(cpbiPlayer.SoldierName, newEntry);
4929 if (cpbiPlayer.PlayerCountryCode.Length <= 2)
4930 {
4931 StatsTracker[cpbiPlayer.SoldierName].PlayerCountryCode = cpbiPlayer.PlayerCountryCode;
4932 }
4933 else
4934 {
4935 StatsTracker[cpbiPlayer.SoldierName].PlayerCountryCode = "--";
4936 }
4937 }
4938 }
4939
4940 private void OpenMySqlConnection(int type)
4941 {
4942 try
4943 {
4944 switch (type)
4945 {
4946 //OdbcCon
4947 case 1:
4948
4949 if (MySqlCon == null)
4950 {
4951 MySqlCon = new MySqlConnection(this.DBConnectionStringBuilder());
4952 MySqlCon.Open();
4953 }
4954 if (MySqlCon.State == ConnectionState.Closed)
4955 {
4956 MySqlCon = new MySqlConnection(this.DBConnectionStringBuilder());
4957 MySqlCon.Open();
4958 //this.DebugInfo("Info", "MySqlCon was close Current State is open");
4959 }
4960
4961 break;
4962 //ODBCConn
4963 case 2:
4964 if (MySqlConn == null)
4965 {
4966 MySqlConn = new MySqlConnection(this.DBConnectionStringBuilder());
4967 MySqlConn.Open();
4968 }
4969 if (MySqlConn.State == ConnectionState.Closed)
4970 {
4971 MySqlConn = new MySqlConnection(this.DBConnectionStringBuilder());
4972 MySqlConn.Open();
4973 //this.DebugInfo("Info", "MySqlConn was close, Reopen it, Current State is open");
4974 }
4975
4976 break;
4977
4978 default:
4979 break;
4980 }
4981 }
4982 catch (MySqlException oe)
4983 {
4984 this.DebugInfo("Error", "OpenConnection:");
4985 this.DisplayMySqlErrorCollection(oe);
4986 }
4987 catch (Exception c)
4988 {
4989 this.DebugInfo("Error", "OpenConnection: " + c);
4990 }
4991 }
4992
4993 private void CloseMySqlConnection(int type)
4994 {
4995 if (this.MySql_Connection_is_activ == false)
4996 {
4997 try
4998 {
4999 switch (type)
5000 {
5001 case 1:
5002 //OdbcCon
5003 if (this.MySqlCon != null)
5004 {
5005 this.MySqlCon.Close();
5006 this.DebugInfo("Info", "Connection MySqlCon closed");
5007 }
5008 break;
5009
5010 case 2:
5011 //ODBCConn
5012 if (this.MySqlConn != null)
5013 {
5014 this.MySqlConn.Close();
5015 this.DebugInfo("Info", "Connection MySqlConn closed");
5016 }
5017 break;
5018 default:
5019 break;
5020 }
5021 }
5022 catch (MySqlException oe)
5023 {
5024 this.DebugInfo("Error", "CloseMySqlConnection:");
5025 this.DisplayMySqlErrorCollection(oe);
5026 }
5027 catch (Exception c)
5028 {
5029 this.ExecuteCommand("Error", "CloseMySqlConnection: " + c);
5030 }
5031 }
5032 }
5033
5034 private void tablebuilder()
5035 {
5036 if (boolTableEXISTS)
5037 {
5038 return;
5039 }
5040 lock (this.tablebuilderlock)
5041 {
5042 Thread.Sleep(3000);
5043 if ((m_strHost.Length == 0) || (m_strDatabase.Length == 0) || (m_strDBPort.Length == 0) || (m_strUserName.Length == 0))
5044 {
5045 this.DebugInfo("Error", "Check you MySQL Server Details:, hostname, port, databasename and your login credentials!");
5046 this.ExecuteCommand("procon.protected.plugins.enable", "CChatGUIDStatsLogger", "False");
5047 return;
5048 }
5049 if ((m_strHost != null) && (m_strDatabase != null) && (m_strDBPort != null) && (m_strUserName != null) && (m_strPassword != null) && (boolTableEXISTS == false))
5050 {
5051 this.DebugInfo("Info", "Start tablebuilder");
5052 //new
5053 this.generateWeaponList();
5054
5055 try
5056 {
5057 using (MySqlConnection TablebuilderCon = new MySqlConnection(this.DBConnectionStringBuilder()))
5058 {
5059 MySql.Data.MySqlClient.MySqlTransaction TableTransaction = null;
5060 try
5061 {
5062 this.MySql_Connection_is_activ = true;
5063 MySql.Data.MySqlClient.MySqlParameter param = new MySql.Data.MySqlClient.MySqlParameter();
5064 TablebuilderCon.Open();
5065 //Chatlog Table
5066 string SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_chatlog + @"` (
5067 `ID` INT NOT NULL AUTO_INCREMENT ,
5068 `logDate` DATETIME NULL DEFAULT NULL ,
5069 `ServerID` SMALLINT UNSIGNED NOT NULL ,
5070 `logSubset` VARCHAR(45) NULL DEFAULT NULL ,
5071 `logSoldierName` VARCHAR(45) NULL DEFAULT NULL ,
5072 `logMessage` TEXT NULL DEFAULT NULL ,
5073 PRIMARY KEY (`ID`),
5074 INDEX `INDEX_SERVERID` (`ServerID` ASC),
5075 INDEX `INDEX_logDate` (`logDate` ASC))
5076 ENGINE = InnoDB";
5077 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon))
5078 {
5079 OdbcCom.ExecuteNonQuery();
5080 }
5081
5082 //MapStats Table
5083 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_mapstats + @"` (
5084 `ID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
5085 `ServerID` SMALLINT UNSIGNED NOT NULL DEFAULT '0' ,
5086 `TimeMapLoad` DATETIME NULL DEFAULT NULL ,
5087 `TimeRoundStarted` DATETIME NULL DEFAULT NULL ,
5088 `TimeRoundEnd` DATETIME NULL DEFAULT NULL ,
5089 `MapName` VARCHAR(45) NULL DEFAULT NULL ,
5090 `Gamemode` VARCHAR(45) NULL DEFAULT NULL ,
5091 `Roundcount` SMALLINT NOT NULL DEFAULT '0' ,
5092 `NumberofRounds` SMALLINT NOT NULL DEFAULT '0' ,
5093 `MinPlayers` SMALLINT NOT NULL DEFAULT '0' ,
5094 `AvgPlayers` DOUBLE NOT NULL DEFAULT '0' ,
5095 `MaxPlayers` SMALLINT NOT NULL DEFAULT '0' ,
5096 `PlayersJoinedServer` SMALLINT NOT NULL DEFAULT '0' ,
5097 `PlayersLeftServer` SMALLINT NOT NULL DEFAULT '0' ,
5098 PRIMARY KEY (`ID`) ,
5099 INDEX `ServerID_INDEX` (`ServerID` ASC) )
5100 ENGINE = InnoDB";
5101 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon))
5102 {
5103 OdbcCom.ExecuteNonQuery();
5104 }
5105
5106 //Start of the Transaction
5107 TableTransaction = TablebuilderCon.BeginTransaction();
5108
5109
5110 //Table tbl_games
5111 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_games + @"` (
5112 `GameID` tinyint(4) unsigned NOT NULL AUTO_INCREMENT,
5113 `Name` varchar(45) DEFAULT NULL,
5114 PRIMARY KEY (`GameID`),
5115 UNIQUE KEY `name_unique` (`Name`)
5116 ) ENGINE=InnoDB";
5117 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5118 {
5119 OdbcCom.ExecuteNonQuery();
5120 }
5121
5122 //Table playerdata
5123 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_playerdata + @"` (
5124 `PlayerID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
5125 `GameID` tinyint(4)unsigned NOT NULL DEFAULT '0',
5126 `ClanTag` VARCHAR(10) NULL DEFAULT NULL ,
5127 `SoldierName` VARCHAR(45) NULL DEFAULT NULL ,
5128 `GlobalRank` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
5129 `PBGUID` VARCHAR(32) NULL DEFAULT NULL ,
5130 `EAGUID` VARCHAR(35) NULL DEFAULT NULL ,
5131 `IP_Address` VARCHAR(15) NULL DEFAULT NULL ,
5132 `IPv6_Address` VARBINARY(16) NULL DEFAULT NULL ,
5133 `CountryCode` VARCHAR(2) NULL DEFAULT NULL ,
5134 PRIMARY KEY (`PlayerID`) ,
5135 UNIQUE INDEX `UNIQUE_playerdata` (`GameID` ASC,`EAGUID` ASC) ,
5136 INDEX `INDEX_SoldierName` (`SoldierName` ASC) )
5137 ENGINE = InnoDB";
5138 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5139 {
5140 OdbcCom.ExecuteNonQuery();
5141 }
5142
5143 //Server Table
5144 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_server + @"` (
5145 `ServerID` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT ,
5146 `ServerGroup` TINYINT UNSIGNED NOT NULL DEFAULT 0 ,
5147 `IP_Address` VARCHAR(45) NULL DEFAULT NULL ,
5148 `ServerName` VARCHAR(200) NULL DEFAULT NULL ,
5149 `GameID` tinyint(4)unsigned NOT NULL DEFAULT '0',
5150 `usedSlots` SMALLINT UNSIGNED NULL DEFAULT 0 ,
5151 `maxSlots` SMALLINT UNSIGNED NULL DEFAULT 0 ,
5152 `mapName` VARCHAR(45) NULL DEFAULT NULL ,
5153 `fullMapName` TEXT NULL DEFAULT NULL ,
5154
5155 `Gamemode` VARCHAR(45) NULL DEFAULT NULL ,
5156 `GameMod` VARCHAR(45) NULL DEFAULT NULL ,
5157 `PBversion` VARCHAR(45) NULL DEFAULT NULL ,
5158 `ConnectionState` VARCHAR(45) NULL DEFAULT NULL ,
5159 PRIMARY KEY (`ServerID`) ,
5160 INDEX `INDEX_SERVERGROUP` (`ServerGroup` ASC) ,
5161 UNIQUE INDEX `IP_Address_UNIQUE` (`IP_Address` ASC) )
5162 ENGINE = InnoDB";
5163
5164 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5165 {
5166 OdbcCom.ExecuteNonQuery();
5167 }
5168
5169 //Server Player Table
5170 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_server_player + @"` (
5171 `StatsID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
5172 `ServerID` SMALLINT UNSIGNED NOT NULL ,
5173 `PlayerID` INT UNSIGNED NOT NULL ,
5174 PRIMARY KEY (`StatsID`) ,
5175 UNIQUE INDEX `UNIQUE_INDEX` (`ServerID` ASC, `PlayerID` ASC) ,
5176 INDEX `fk_tbl_server_player_tbl_playerdata" + this.tableSuffix + @"` (`PlayerID` ASC) ,
5177 INDEX `fk_tbl_server_player_tbl_server" + this.tableSuffix + @"` (`ServerID` ASC) ,
5178 CONSTRAINT `fk_tbl_server_player_tbl_playerdata" + this.tableSuffix + @"`
5179 FOREIGN KEY (`PlayerID` )
5180 REFERENCES `" + this.tbl_playerdata + @"` (`PlayerID` )
5181 ON DELETE CASCADE
5182 ON UPDATE NO ACTION,
5183 CONSTRAINT `fk_tbl_server_player_tbl_server" + this.tableSuffix + @"`
5184 FOREIGN KEY (`ServerID` )
5185 REFERENCES `" + this.tbl_server + @"` (`ServerID` )
5186 ON DELETE CASCADE
5187 ON UPDATE NO ACTION)
5188 ENGINE = InnoDB";
5189 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5190 {
5191 OdbcCom.ExecuteNonQuery();
5192 }
5193 //
5194 //ServerStatistics Table
5195 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_server_stats + @"` (
5196 `ServerID` SMALLINT(5) UNSIGNED NOT NULL ,
5197 `CountPlayers` BIGINT NOT NULL DEFAULT 0 ,
5198 `SumScore` BIGINT NOT NULL DEFAULT 0 ,
5199 `AvgScore` FLOAT NOT NULL DEFAULT 0 ,
5200 `SumKills` BIGINT NOT NULL DEFAULT 0 ,
5201 `AvgKills` FLOAT NOT NULL DEFAULT 0 ,
5202 `SumHeadshots` BIGINT NOT NULL DEFAULT 0 ,
5203 `AvgHeadshots` FLOAT NOT NULL DEFAULT 0 ,
5204 `SumDeaths` BIGINT NOT NULL DEFAULT 0 ,
5205 `AvgDeaths` FLOAT NOT NULL DEFAULT 0 ,
5206 `SumSuicide` BIGINT NOT NULL DEFAULT 0 ,
5207 `AvgSuicide` FLOAT NOT NULL DEFAULT 0 ,
5208 `SumTKs` BIGINT NOT NULL DEFAULT 0 ,
5209 `AvgTKs` FLOAT NOT NULL DEFAULT 0 ,
5210 `SumPlaytime` BIGINT NOT NULL DEFAULT 0 ,
5211 `AvgPlaytime` FLOAT NOT NULL DEFAULT 0 ,
5212 `SumRounds` BIGINT NOT NULL DEFAULT 0 ,
5213 `AvgRounds` FLOAT NOT NULL DEFAULT 0 ,
5214 PRIMARY KEY (`ServerID`) ,
5215 INDEX `fk_tbl_server_stats_tbl_server" + this.tableSuffix + @"` (`ServerID` ASC) ,
5216 CONSTRAINT `fk_tbl_server_stats_tbl_server" + this.tableSuffix + @"`
5217 FOREIGN KEY (`ServerID` )
5218 REFERENCES `" + this.tbl_server + @"` (`ServerID` )
5219 ON DELETE CASCADE
5220 ON UPDATE NO ACTION)
5221 ENGINE = InnoDB";
5222 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5223 {
5224 OdbcCom.ExecuteNonQuery();
5225 }
5226
5227 //Stats Table
5228 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_playerstats + @"` (
5229 `StatsID` INT UNSIGNED NOT NULL ,
5230 `Score` INT NOT NULL DEFAULT '0' ,
5231 `Kills` INT UNSIGNED NOT NULL DEFAULT '0' ,
5232 `Headshots` INT UNSIGNED NOT NULL DEFAULT '0' ,
5233 `Deaths` INT UNSIGNED NOT NULL DEFAULT '0' ,
5234 `Suicide` INT UNSIGNED NOT NULL DEFAULT '0' ,
5235 `TKs` INT UNSIGNED NOT NULL DEFAULT '0' ,
5236 `Playtime` INT UNSIGNED NOT NULL DEFAULT '0' ,
5237 `Rounds` INT UNSIGNED NOT NULL DEFAULT '0' ,
5238 `FirstSeenOnServer` DATETIME NULL DEFAULT NULL ,
5239 `LastSeenOnServer` DATETIME NULL DEFAULT NULL ,
5240 `Killstreak` SMALLINT UNSIGNED NOT NULL DEFAULT '0' ,
5241 `Deathstreak` SMALLINT UNSIGNED NOT NULL DEFAULT '0' ,
5242 `HighScore` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0' ,
5243 `rankScore` INT UNSIGNED NOT NULL DEFAULT '0' ,
5244 `rankKills` INT UNSIGNED NOT NULL DEFAULT '0' ,
5245 `Wins` INT UNSIGNED NOT NULL DEFAULT '0' ,
5246 `Losses` INT UNSIGNED NOT NULL DEFAULT '0' ,
5247 PRIMARY KEY (`StatsID`) ,
5248 INDEX `INDEX_Score" + this.tableSuffix + @"` (`Score`),
5249 KEY `INDEX_RANK_SCORE" + this.tableSuffix + @"` (`rankScore`),
5250 KEY `INDEX_RANK_KILLS" + this.tableSuffix + @"` (`rankKills`),
5251 CONSTRAINT `fk_tbl_playerstats_tbl_server_player1" + this.tableSuffix + @"`
5252 FOREIGN KEY (`StatsID` )
5253 REFERENCES `" + this.tbl_server_player + @"` (`StatsID` )
5254 ON DELETE CASCADE
5255 ON UPDATE NO ACTION)
5256 ENGINE = InnoDB";
5257
5258 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5259 {
5260 OdbcCom.ExecuteNonQuery();
5261 }
5262
5263 //Playerrank Table
5264 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_playerrank + @"` (
5265 `PlayerID` INT UNSIGNED NOT NULL DEFAULT 0 ,
5266 `ServerGroup` SMALLINT UNSIGNED NOT NULL DEFAULT 0 ,
5267 `rankScore` INT UNSIGNED NOT NULL DEFAULT 0 ,
5268 `rankKills` INT UNSIGNED NOT NULL DEFAULT 0 ,
5269 INDEX `INDEX_SCORERANKING" + this.tableSuffix + @"` (`rankScore` ASC) ,
5270 INDEX `INDEX_KILLSRANKING" + this.tableSuffix + @"` (`rankKills` ASC) ,
5271 PRIMARY KEY (`PlayerID`,`ServerGroup`) ,
5272 CONSTRAINT `fk_tbl_playerrank_tbl_playerdata" + this.tableSuffix + @"`
5273 FOREIGN KEY (`PlayerID` )
5274 REFERENCES `" + this.tbl_playerdata + @"` (`PlayerID` )
5275 ON DELETE CASCADE
5276 ON UPDATE NO ACTION)
5277 ENGINE = InnoDB";
5278
5279 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5280 {
5281 OdbcCom.ExecuteNonQuery();
5282 }
5283
5284 //Playersession Table
5285 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_sessions + @"` (
5286 `SessionID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
5287 `StatsID` INT UNSIGNED NOT NULL,
5288 `StartTime` DATETIME NOT NULL,
5289 `EndTime` DATETIME NOT NULL,
5290 `Score` MEDIUMINT NOT NULL DEFAULT '0',
5291 `Kills` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
5292 `Headshots` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
5293 `Deaths` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
5294 `TKs` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
5295 `Suicide` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
5296 `RoundCount` TINYINT UNSIGNED NOT NULL DEFAULT '0',
5297 `Playtime` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
5298 `Killstreak` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' ,
5299 `Deathstreak` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' ,
5300 `HighScore` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0' ,
5301 `Wins` TINYINT UNSIGNED NOT NULL DEFAULT '0' ,
5302 `Losses` TINYINT UNSIGNED NOT NULL DEFAULT '0' ,
5303 PRIMARY KEY (`SessionID`),
5304 INDEX `INDEX_STATSID" + this.tableSuffix + @"` (`StatsID` ASC),
5305 INDEX `INDEX_STARTTIME" + this.tableSuffix + @"` (`StartTime` ASC),
5306 CONSTRAINT `fk_tbl_sessions_tbl_server_player" + this.tableSuffix + @"`
5307 FOREIGN KEY (`StatsID`)
5308 REFERENCES `" + this.tbl_server_player + @"` (`StatsID`)
5309 ON DELETE CASCADE
5310 ON UPDATE NO ACTION)
5311 ENGINE=InnoDB";
5312
5313 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5314 {
5315 OdbcCom.ExecuteNonQuery();
5316 }
5317
5318 //currentplayers
5319 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_currentplayers + @"` (
5320 `ServerID` smallint(6) NOT NULL,
5321 `Soldiername` varchar(45) NOT NULL,
5322 `GlobalRank` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
5323 `ClanTag` varchar(45) DEFAULT NULL,
5324 `Score` int(11) NOT NULL DEFAULT '0',
5325 `Kills` int(11) NOT NULL DEFAULT '0',
5326 `Headshots` int(11) NOT NULL DEFAULT '0',
5327 `Deaths` int(11) NOT NULL DEFAULT '0',
5328 `Suicide` int(11) DEFAULT NULL,
5329 `Killstreak` smallint(6) DEFAULT '0',
5330 `Deathstreak` smallint(6) DEFAULT '0',
5331 `TeamID` tinyint(4) DEFAULT NULL,
5332 `SquadID` tinyint(4) DEFAULT NULL,
5333 `EA_GUID` varchar(45) NOT NULL DEFAULT '',
5334 `PB_GUID` varchar(45) NOT NULL DEFAULT '',
5335 `IP_aton` int(11) unsigned DEFAULT NULL,
5336 `CountryCode` varchar(2) DEFAULT '',
5337 `Ping` smallint(6) DEFAULT NULL,
5338 `PlayerJoined` datetime DEFAULT NULL,
5339 PRIMARY KEY (`ServerID`,`Soldiername`)
5340 ) ENGINE=InnoDB";
5341 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5342 {
5343 OdbcCom.ExecuteNonQuery();
5344 }
5345
5346 //Awards
5347 /*
5348 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_awards + @"` (
5349 `AwardID` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ";
5350 foreach (string strcolumn in this.m_lstAwardTable)
5351 {
5352 SQLTable = String.Concat(SQLTable, ",`", strcolumn, "` mediumint(8) unsigned DEFAULT '0' ");
5353 }
5354 SQLTable = String.Concat(SQLTable, ")ENGINE = InnoDB DEFAULT CHARACTER SET = latin1");
5355 if (this.m_awardsON == enumBoolYesNo.Yes)
5356 {
5357 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5358 {
5359 OdbcCom.ExecuteNonQuery();
5360 }
5361 }
5362 */
5363
5364 //New Weapon table
5365 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_weapons + @"` (
5366 `WeaponID` int(11) unsigned NOT NULL AUTO_INCREMENT,
5367 `GameID` tinyint(4)unsigned NOT NULL,
5368 `Friendlyname` varchar(45) DEFAULT NULL,
5369 `Fullname` varchar(100) DEFAULT NULL,
5370 `Damagetype` varchar(45) DEFAULT NULL,
5371 `Slot` varchar(45) DEFAULT NULL,
5372 `Kitrestriction` varchar(45) DEFAULT NULL,
5373 PRIMARY KEY (`WeaponID`),
5374 UNIQUE KEY `unique` (`GameID`,`fullname`)
5375 ) ENGINE=InnoDB";
5376 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5377 {
5378 OdbcCom.ExecuteNonQuery();
5379 }
5380
5381 //New Weapon stats table
5382 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_weapons_stats + @"` (
5383 `StatsID` INT unsigned NOT NULL,
5384 `WeaponID` int(11) unsigned NOT NULL,
5385 `Kills` int(11) unsigned NOT NULL DEFAULT '0',
5386 `Headshots` int(11) unsigned NOT NULL DEFAULT '0',
5387 `Deaths` int(11) unsigned NOT NULL DEFAULT '0',
5388 PRIMARY KEY (`StatsID`,`WeaponID`),
5389 KEY `Kills_Death_idx` (`Kills`,`Deaths`),
5390 KEY `Kills_Head_idx` (`Kills`,`Headshots`),
5391 CONSTRAINT `fk_tbl_weapons_stats_tbl_server_player_" + this.tableSuffix + @"`
5392 FOREIGN KEY (`StatsID` )
5393 REFERENCES `" + this.tbl_server_player + @"` (`StatsID` )
5394 ON DELETE CASCADE
5395 ON UPDATE NO ACTION
5396 ) ENGINE=InnoDB";
5397 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5398 {
5399 OdbcCom.ExecuteNonQuery();
5400 }
5401
5402 //Dogtagstable
5403 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_dogtags + @"` (
5404 `KillerID` INT UNSIGNED NOT NULL ,
5405 `VictimID` INT UNSIGNED NOT NULL ,
5406 `Count` SMALLINT UNSIGNED NOT NULL DEFAULT '0' ,
5407 PRIMARY KEY (`KillerID`, `VictimID`) ,
5408 INDEX `fk_tbl_dogtags_tbl_server_player1" + this.tableSuffix + @"` (`KillerID` ASC) ,
5409 INDEX `fk_tbl_dogtags_tbl_server_player2" + this.tableSuffix + @"` (`VictimID` ASC) ,
5410 CONSTRAINT `fk_tbl_dogtags_tbl_server_player1" + this.tableSuffix + @"`
5411 FOREIGN KEY (`KillerID` )
5412 REFERENCES `" + this.tbl_server_player + @"` (`StatsID` )
5413 ON DELETE CASCADE
5414 ON UPDATE NO ACTION,
5415 CONSTRAINT `fk_tbl_dogtags_tbl_server_player2" + this.tableSuffix + @"`
5416 FOREIGN KEY (`VictimID` )
5417 REFERENCES `" + this.tbl_server_player + @"` (`StatsID` )
5418 ON DELETE CASCADE
5419 ON UPDATE NO ACTION)
5420 ENGINE = InnoDB";
5421 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5422 {
5423 OdbcCom.ExecuteNonQuery();
5424 }
5425
5426 //Score and Tickettable
5427 SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_teamscores + @"` (
5428 `ServerID` smallint(5) unsigned NOT NULL,
5429 `TeamID` smallint(5) DEFAULT NULL,
5430 `Score` int(11) DEFAULT NULL,
5431 `WinningScore` int(11) DEFAULT NULL,
5432 PRIMARY KEY (`ServerID`,`TeamID` )
5433 ) ENGINE=InnoDB";
5434 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5435 {
5436 OdbcCom.ExecuteNonQuery();
5437 }
5438
5439 //Commit the Transaction
5440 TableTransaction.Commit();
5441
5442 this.boolTableEXISTS = true;
5443
5444 //fill weapon table
5445 //get GameID
5446 this.intServerGameType_ID = this.GetGameIDfromDB(this.strServerGameType);
5447
5448 List<string> addedWeaponList = new List<string>();
5449
5450 foreach (KeyValuePair<string, Dictionary<string, CStats.CUsedWeapon>> branch in this.weaponDic)
5451 {
5452 string sqlCheckweapon = @"SELECT
5453 `GameID`,
5454 `Friendlyname`,
5455 `Fullname`,
5456 `Damagetype`
5457 FROM `" + this.tbl_weapons + @"`
5458 WHERE `GameID` = @GameID
5459 AND `Damagetype` = @Damagetype";
5460 using (MySqlCommand MyCommand = new MySqlCommand(sqlCheckweapon))
5461 {
5462 MyCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
5463 MyCommand.Parameters.AddWithValue("@Damagetype", branch.Key.ToLower());
5464
5465 using (DataTable result = this.SQLquery(MyCommand))
5466 {
5467 //this.DebugInfo("Info", "Rowcount:" + result.Rows.Count.ToString());
5468 if (result.Rows.Count >= 1)
5469 {
5470 result.PrimaryKey = new DataColumn[] { result.Columns["GameID"], result.Columns["Fullname"] };
5471 }
5472 TableTransaction = null;
5473 TableTransaction = TablebuilderCon.BeginTransaction();
5474
5475 foreach (KeyValuePair<string, CStats.CUsedWeapon> leap in branch.Value)
5476 {
5477 if (result.Rows.Count == 0 || result.Rows.Contains(new object[] { this.intServerGameType_ID, leap.Value.Name }) == false || addedWeaponList.Contains(leap.Value.Name) == true)
5478 {
5479 addedWeaponList.Add(leap.Value.Name);
5480 //add weapon entry
5481 string sqlInsertQuery = "INSERT INTO `" + this.tbl_weapons + @"` ( `GameID`, `Friendlyname`, `Fullname`,`Damagetype`,`Slot`,`Kitrestriction`) VALUES(@GameID, @Friendlyname, @Fullname, @Damagetype,@Slot,@Kitrestriction)
5482 ON DUPLICATE KEY UPDATE `Friendlyname` = @Friendlyname ,`Damagetype` = @Damagetype,`Slot` = @Slot,`Kitrestriction` = @Kitrestriction";
5483
5484 using (MySqlCommand OdbcCom = new MySqlCommand(sqlInsertQuery, TablebuilderCon, TableTransaction))
5485 {
5486 OdbcCom.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
5487 OdbcCom.Parameters.AddWithValue("@Friendlyname", leap.Value.FieldName);
5488 OdbcCom.Parameters.AddWithValue("@Fullname", leap.Value.Name);
5489 OdbcCom.Parameters.AddWithValue("@Damagetype", branch.Key.ToLower());
5490 OdbcCom.Parameters.AddWithValue("@Slot", leap.Value.Slot);
5491 OdbcCom.Parameters.AddWithValue("@Kitrestriction", leap.Value.KitRestriction);
5492 if (this.intServerGameType_ID != 0)
5493 {
5494 OdbcCom.ExecuteNonQuery();
5495 }
5496 }
5497 }
5498 }
5499 TableTransaction.Commit();
5500 }
5501 }
5502 }
5503
5504 //Create WeaponMapping
5505 this.WeaponMappingDic = new Dictionary<string, int>(this.GetWeaponMappingfromDB());
5506
5507
5508 //TableCheck & Adjustemnts tbl_playerstats
5509 /*
5510 string sqlCheckplayerstats = "DESC `" + this.tbl_playerstats + "`";
5511 string sqlAltertableplayerstats = "ALTER TABLE `" + this.tbl_playerstats + "` ";
5512 string sqlIndex = "";
5513 this.DebugInfo("Trace", "Tablecheck playerstats");
5514 bool column_Missing = false;
5515 using (DataTable result = this.SQLquery(new MySqlCommand(sqlCheckplayerstats)))
5516 {
5517 DataColumn[] key = new DataColumn[1];
5518 key[0] = result.Columns[0];
5519 result.PrimaryKey = key;
5520 column_Missing = false;
5521
5522 if (result.Rows.Contains("rankScore") == false)
5523 {
5524 this.DebugInfo("Trace", "Column rankScore is missing, Adding it to the table!");
5525 sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `rankScore` INT(10) UNSIGNED NOT NULL DEFAULT '0', ");
5526 column_Missing = true;
5527 sqlIndex = string.Concat(sqlIndex, "ADD INDEX `INDEX_RANK_SCORE" + this.tableSuffix + @"` (`rankScore` ASC), ");
5528 }
5529 if (result.Rows.Contains("rankKills") == false)
5530 {
5531 this.DebugInfo("Trace", "Column rankScore is missing, Adding it to the table!");
5532 sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `rankKills` INT(10) UNSIGNED NOT NULL DEFAULT '0', ");
5533 column_Missing = true;
5534 sqlIndex = string.Concat(sqlIndex, "ADD INDEX `INDEX_RANK_KILLS" + this.tableSuffix + @"` (`rankKills` ASC), ");
5535 }
5536 //Wins & Losses
5537 if (result.Rows.Contains("Wins") == false)
5538 {
5539 this.DebugInfo("Trace", "Column Wins is missing, Adding it to the table!");
5540 sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `Wins` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0', ");
5541 column_Missing = true;
5542 }
5543 if (result.Rows.Contains("Losses") == false)
5544 {
5545 this.DebugInfo("Trace", "Column Losses is missing, Adding it to the table!");
5546 sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `Losses` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0', ");
5547 column_Missing = true;
5548 }
5549 //HighScore
5550 if (result.Rows.Contains("HighScore") == false)
5551 {
5552 this.DebugInfo("Trace", "Column HighScore is missing, Adding it to the table!");
5553 sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `HighScore` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0' , ");
5554 column_Missing = true;
5555 }
5556 }
5557 if (column_Missing == true)
5558 {
5559 TableTransaction = null;
5560 TableTransaction = TablebuilderCon.BeginTransaction();
5561 //Adding Columns
5562 sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, sqlIndex);
5563 int charindex = sqlAltertableplayerstats.LastIndexOf(",");
5564 if (charindex > 0)
5565 {
5566 sqlAltertableplayerstats = sqlAltertableplayerstats.Remove(charindex);
5567 }
5568 using (MySqlCommand OdbcCom = new MySqlCommand(sqlAltertableplayerstats, TablebuilderCon, TableTransaction))
5569 {
5570 OdbcCom.ExecuteNonQuery();
5571 }
5572 TableTransaction.Commit();
5573 }
5574
5575
5576 //TableCheck & Adjustemnts tbl_server
5577 sqlCheckplayerstats = "DESC `" + this.tbl_server + "`";
5578 sqlAltertableplayerstats = "ALTER TABLE `" + this.tbl_server + "` ";
5579 sqlIndex = "";
5580 this.DebugInfo("Trace", "Tablecheck tbl_server");
5581 column_Missing = false;
5582 using (DataTable result = this.SQLquery(new MySqlCommand(sqlCheckplayerstats)))
5583 {
5584 DataColumn[] key = new DataColumn[1];
5585 key[0] = result.Columns[0];
5586 result.PrimaryKey = key;
5587 column_Missing = false;
5588
5589 if (result.Rows.Contains("ServerGroup") == false)
5590 {
5591 this.DebugInfo("Trace", "Column ServerGroup is missing, Adding it to the table!");
5592 sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `ServerGroup` TINYINT UNSIGNED NOT NULL DEFAULT 0 ,");
5593 column_Missing = true;
5594 sqlIndex = string.Concat(sqlIndex, "ADD INDEX `INDEX_SERVERGROUP" + this.tableSuffix + @"` (`ServerGroup` ASC) ,");
5595 }
5596 }
5597 if (column_Missing == true)
5598 {
5599 TableTransaction = null;
5600 TableTransaction = TablebuilderCon.BeginTransaction();
5601 //Adding Columns
5602 sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, sqlIndex);
5603 int charindex = sqlAltertableplayerstats.LastIndexOf(",");
5604 if (charindex > 0)
5605 {
5606 sqlAltertableplayerstats = sqlAltertableplayerstats.Remove(charindex);
5607 }
5608 using (MySqlCommand OdbcCom = new MySqlCommand(sqlAltertableplayerstats, TablebuilderCon, TableTransaction))
5609 {
5610 OdbcCom.ExecuteNonQuery();
5611 }
5612 TableTransaction.Commit();
5613 }
5614
5615 */
5616
5617
5618 //TableCheck Adjustments playerstats
5619 /*
5620 //TableCheck Awards
5621 sqlCheck = "DESC `" + this.tbl_awards + "`";
5622 sqlAltertable = "ALTER TABLE `" + this.tbl_awards + "` ";
5623 //result = new List<string>(this.SQLquery(sqlCheck,9));
5624 this.DebugInfo("Tablecheck Awards");
5625 using (DataTable result = this.SQLquery(new MySqlCommand(sqlCheck)))
5626 {
5627 DataColumn[] key = new DataColumn[1];
5628 key[0] = result.Columns[0];
5629 result.PrimaryKey = key;
5630 fieldMissing = false;
5631
5632 foreach (string strField in this.m_lstAwardTable)
5633 {
5634 if (result.Rows.Contains(strField) == false)
5635 {
5636 this.DebugInfo(strField + " is missing, Adding it to the table!");
5637 sqlAltertable = string.Concat(sqlAltertable, "ADD COLUMN `" + strField + "` mediumint(8) unsigned DEFAULT '0', ");
5638 fieldMissing = true;
5639 }
5640 }
5641 }
5642 if (fieldMissing == true)
5643 {
5644 TableTransaction = null;
5645 TableTransaction = TablebuilderCon.BeginTransaction();
5646 SQLTable = "ALTER TABLE `" + this.tbl_awards + "` ENGINE = MyISAM";
5647 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5648 {
5649 OdbcCom.ExecuteNonQuery();
5650 }
5651 //Adding Columns
5652 int charindex = sqlAltertable.LastIndexOf(",");
5653 if (charindex > 0)
5654 {
5655 sqlAltertable = sqlAltertable.Remove(charindex);
5656 }
5657 using (MySqlCommand OdbcCom = new MySqlCommand(sqlAltertable, TablebuilderCon, TableTransaction))
5658 {
5659 OdbcCom.ExecuteNonQuery();
5660 }
5661 SQLTable = "ALTER TABLE `" + this.tbl_awards + "` ENGINE = InnoDB";
5662 using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
5663 {
5664 OdbcCom.ExecuteNonQuery();
5665 }
5666 TableTransaction.Commit();
5667 }
5668 */
5669 }
5670
5671 catch (MySqlException oe)
5672 {
5673 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error in Tablebuilder: ");
5674 this.DisplayMySqlErrorCollection(oe);
5675 TableTransaction.Rollback();
5676 }
5677 catch (Exception c)
5678 {
5679 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error: " + c);
5680 TableTransaction.Rollback();
5681 this.boolTableEXISTS = false;
5682 this.m_ID_cache.Clear();
5683 }
5684 finally
5685 {
5686 TablebuilderCon.Close();
5687 }
5688 }
5689 }
5690 catch (MySqlException oe)
5691 {
5692 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error in Tablebuilder: ");
5693 this.DisplayMySqlErrorCollection(oe);
5694 }
5695 catch (Exception c)
5696 {
5697 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error: " + c);
5698 }
5699 }
5700 }
5701 }
5702
5703 private void LogChat(string strSpeaker, string strMessage, string strType)
5704 {
5705 try
5706 {
5707 if (this.m_enChatloggingON == enumBoolYesNo.No)
5708 {
5709 return;
5710 }
5711 if (this.m_enNoServerMsg == enumBoolYesNo.No && strSpeaker.CompareTo("Server") == 0)
5712 {
5713 return;
5714 }
5715 if (this.m_enChatlogFilter == enumBoolYesNo.Yes)
5716 {
5717 //Filter Messages
5718 foreach (Regex FilterRule in this.lstChatFilterRules)
5719 {
5720 if (FilterRule.IsMatch(strMessage))
5721 {
5722 //dont log
5723 this.DebugInfo("Trace", "Chatmessage: '" + strMessage + "' was filtered out by the Regex rule: " + FilterRule.ToString());
5724 return;
5725 }
5726 }
5727 }
5728 if (m_enInstantChatlogging == enumBoolYesNo.Yes)
5729 {
5730 string query = "INSERT INTO " + this.tbl_chatlog + @" (logDate, ServerID, logSubset, logSoldierName, logMessage) VALUES (@logDate, @ServerID, @logSubset, @logSoldierName, @logMessage)";
5731 this.tablebuilder();
5732 if ((m_strHost != null) || (m_strDatabase != null) || (m_strDBPort != null) || (m_strUserName != null) || (m_strPassword != null))
5733 {
5734 if (this.m_highPerformanceConnectionMode == enumBoolOnOff.On)
5735 {
5736 try
5737 {
5738 using (MySqlConnection Connection = new MySqlConnection(this.DBConnectionStringBuilder()))
5739 {
5740 Connection.Open();
5741 if (Connection.State == ConnectionState.Open)
5742 {
5743 using (MySqlCommand OdbcCom = new MySqlCommand(query, Connection))
5744 {
5745 OdbcCom.Parameters.AddWithValue("@logDate", MyDateTime.Now);
5746 OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
5747 OdbcCom.Parameters.AddWithValue("@logSubset", strType);
5748 OdbcCom.Parameters.AddWithValue("@logSoldierName", strSpeaker);
5749 OdbcCom.Parameters.AddWithValue("@logMessage", strMessage);
5750 OdbcCom.ExecuteNonQuery();
5751 }
5752 }
5753 Connection.Close();
5754 }
5755 }
5756 catch (MySqlException oe)
5757 {
5758 this.DebugInfo("Error", "LogChat: ");
5759 this.DisplayMySqlErrorCollection(oe);
5760 }
5761 catch (Exception c)
5762 {
5763 this.DebugInfo("Error", "LogChat: " + c);
5764 }
5765 }
5766 else
5767 {
5768 lock (this.chatloglock)
5769 {
5770 try
5771 {
5772 if (this.MySqlChatCon == null)
5773 {
5774 this.MySqlChatCon = new MySqlConnection(this.DBConnectionStringBuilder());
5775 }
5776 if (MySqlChatCon.State != ConnectionState.Open)
5777 {
5778 this.MySqlChatCon.Open();
5779 }
5780 if (MySqlChatCon.State == ConnectionState.Open)
5781 {
5782 using (MySqlCommand OdbcCom = new MySqlCommand(query, MySqlChatCon))
5783 {
5784 OdbcCom.Parameters.AddWithValue("@logDate", MyDateTime.Now);
5785 OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
5786 OdbcCom.Parameters.AddWithValue("@logSubset", strType);
5787 OdbcCom.Parameters.AddWithValue("@logSoldierName", strSpeaker);
5788 OdbcCom.Parameters.AddWithValue("@logMessage", strMessage);
5789 OdbcCom.ExecuteNonQuery();
5790 }
5791 }
5792 }
5793 catch (MySqlException oe)
5794 {
5795 this.DebugInfo("Error", "LogChat: ");
5796 this.DisplayMySqlErrorCollection(oe);
5797 try
5798 {
5799 if (MySqlChatCon.State == ConnectionState.Open)
5800 {
5801 MySqlChatCon.Dispose();
5802 }
5803 }
5804 catch { }
5805 }
5806 catch (Exception c)
5807 {
5808 this.DebugInfo("Error", "LogChat: " + c);
5809 try
5810 {
5811 if (MySqlChatCon.State == ConnectionState.Open)
5812 {
5813 MySqlChatCon.Close();
5814 }
5815 }
5816 catch { }
5817 }
5818 finally
5819 {
5820 try
5821 {
5822 if (MySqlChatCon != null)
5823 {
5824 MySqlChatCon.Close();
5825 }
5826 }
5827 catch { }
5828
5829 }
5830 }
5831 }
5832 }
5833 }
5834 else
5835 {
5836 CLogger chat = new CLogger(MyDateTime.Now, strSpeaker, strMessage, strType);
5837 ChatLog.Add(chat);
5838 }
5839 }
5840 catch (Exception c)
5841 {
5842 this.DebugInfo("Error", "LogChat_2: " + c);
5843 }
5844 }
5845
5846 public void DebugInfo(string debuglevel, string DebugMessage)
5847 {
5848 switch (this.GlobalDebugMode)
5849 {
5850 case "Trace":
5851 //Post every Message
5852 break;
5853 case "Info":
5854 if (String.Equals(debuglevel, "Trace") == true)
5855 {
5856 return;
5857 }
5858 break;
5859 case "Warning":
5860 if (String.Equals(debuglevel, "Trace") == true || String.Equals(debuglevel, "Info") == true)
5861 {
5862 return;
5863 }
5864 break;
5865 case "Error":
5866 if (String.Equals(debuglevel, "Error") == false)
5867 {
5868 return;
5869 }
5870 break;
5871 }
5872 // Post error Message in correct Format
5873 if (String.Equals(debuglevel, "Trace"))
5874 {
5875 this.ExecuteCommand("procon.protected.pluginconsole.write", "[Statslogger]Trace: " + DebugMessage);
5876 }
5877 else if (String.Equals(debuglevel, "Info"))
5878 {
5879 this.ExecuteCommand("procon.protected.pluginconsole.write", "^2" + "[Statslogger]Info: " + DebugMessage);
5880 }
5881 else if (String.Equals(debuglevel, "Warning"))
5882 {
5883 this.ExecuteCommand("procon.protected.pluginconsole.write", "^3" + "[Statslogger]Warning: " + DebugMessage);
5884 }
5885 else if (String.Equals(debuglevel, "Error"))
5886 {
5887 this.ExecuteCommand("procon.protected.pluginconsole.write", "^8" + "[Statslogger]Error: " + DebugMessage);
5888 }
5889 }
5890
5891 private void PrepareKeywordDic()
5892 {
5893 if (boolKeywordDicReady == false)
5894 {
5895 this.DebugInfo("Trace", "PrepareKeywordDic: Preparing");
5896 this.m_dicKeywords.Clear();
5897 try
5898 {
5899 foreach (KeyValuePair<string, string> kvp in this.DamageClass)
5900 {
5901 if (this.m_dicKeywords.ContainsKey(kvp.Key) == false)
5902 {
5903 this.m_dicKeywords.Add(kvp.Key, new List<string>());
5904 this.m_dicKeywords[kvp.Key].Add(kvp.Key.ToUpper());
5905
5906 string[] weaponName = Regex.Replace(kvp.Key.Replace("Weapons/", "").Replace("Gadgets/", ""), @"XP\d_", "").Split('/');
5907 string friendlyname = weaponName[0].Replace(' ', '_').Replace(".", "").Replace("U_", "").ToUpper();
5908 if (this.m_dicKeywords.ContainsKey(friendlyname) == false)
5909 {
5910 this.m_dicKeywords[kvp.Key].Add(friendlyname);
5911 }
5912 }
5913 }
5914 string dicKey = String.Empty;
5915 string dicValue = String.Empty;
5916 foreach (string line in m_lstTableconfig)
5917 {
5918 if (line.Contains("{") && line.Contains("}"))
5919 {
5920 dicKey = line.Remove(line.IndexOf("{"));
5921 dicValue = line.Replace("{", ",");
5922 dicValue = dicValue.Replace("}", "").ToUpper();
5923 string[] arrStrings = dicValue.Split(',');
5924 if (this.m_dicKeywords.ContainsKey(dicKey))
5925 {
5926 //PrÑŒfen
5927 this.m_dicKeywords[dicKey].AddRange(arrStrings);
5928 /*
5929 foreach (string entry in this.m_dicKeywords[dicKey])
5930 {
5931 this.DebugInfo("Trace", "PrepareKeywordDic: " + entry);
5932 }
5933 */
5934 }
5935 else
5936 {
5937 this.DebugInfo("Warning", "PrepareKeywordDic: Mainkey " + dicKey + " not found!");
5938 }
5939 }
5940 }
5941 }
5942 catch (Exception c)
5943 {
5944 this.DebugInfo("Error", "Error in PrepareKeywordDic: " + c);
5945 }
5946 }
5947 }
5948
5949 public string FindKeyword(string strToFind)
5950 {
5951 try
5952 {
5953 this.DebugInfo("Trace", "FindKeyword: " + strToFind);
5954 foreach (KeyValuePair<string, List<string>> kvp in this.m_dicKeywords)
5955 {
5956 if (kvp.Value.Contains(strToFind.Replace(" ", "")))
5957 {
5958 this.DebugInfo("Trace", "FindKeyword: Returning Key " + kvp.Key);
5959 return kvp.Key;
5960 }
5961 }
5962 }
5963 catch (Exception c)
5964 {
5965 this.DebugInfo("Error", "FindKeyword: " + c);
5966 }
5967 return String.Empty;
5968 }
5969
5970 public List<string> ListReplace(List<string> targetlist, string wordToReplace, string replacement)
5971 {
5972 List<string> lstResult = new List<string>();
5973 foreach (string substring in targetlist)
5974 {
5975 lstResult.Add(substring.Replace(wordToReplace, replacement));
5976 }
5977 return lstResult;
5978 }
5979
5980 private void CheckMessageLength(string strMessage, int intMessagelength)
5981 {
5982 if (strMessage.Length > intMessagelength)
5983 {
5984 //Send Warning
5985 this.DebugInfo("Warning", strMessage);
5986 this.DebugInfo("Warning", "This Ingamemessage is too long and wont sent to Server!!!");
5987 this.DebugInfo("Warning", "The Message has a Length of " + strMessage.Length.ToString() + " Chars, Allow are 128 Chars");
5988 }
5989 }
5990
5991 private void CreateSession(string SoldierName, int intScore, string EAGUID)
5992 {
5993 if (this.ServerID == 0)
5994 {
5995 return;
5996 }
5997 try
5998 {
5999 if (this.m_sessionON == enumBoolYesNo.Yes)
6000 {
6001 //Session
6002 this.DebugInfo("Warning", "SessionON=enumBoolYesNo.Yes (" + SoldierName + ")");
6003 lock (this.sessionlock)
6004 {
6005 if (this.m_dicSession.ContainsKey(SoldierName) == false)
6006 {
6007 this.DebugInfo("Warning", "Session for Player: " + SoldierName + " created");
6008 this.m_dicSession.Add(SoldierName, new CStats(String.Empty,intScore, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic));
6009 this.m_dicSession[SoldierName].Rank = this.GetRank(SoldierName);
6010 }
6011 }
6012 }
6013 }
6014 catch (Exception c)
6015 {
6016 this.DebugInfo("Error", "CreateSession: " + c);
6017 }
6018 finally
6019 {
6020 lock (this.sessionlock)
6021 {
6022 //Session Score
6023 if (this.m_dicSession.ContainsKey(SoldierName) && this.m_sessionON == enumBoolYesNo.Yes)
6024 {
6025 this.m_dicSession[SoldierName].AddScore(intScore);
6026 if (EAGUID.Length > 2)
6027 {
6028 this.m_dicSession[SoldierName].EAGuid = EAGUID;
6029 }
6030 }
6031 }
6032 }
6033 }
6034 /*
6035 private void RemoveSession(string SoldierName)
6036 {
6037 try
6038 {
6039 if (m_sessionON == enumBoolYesNo.Yes)
6040 {
6041 if (this.m_dicSession.ContainsKey(SoldierName) == true)
6042 {
6043 //Passed seesion to list
6044 this.lstpassedSessions.Add(m_dicSession[SoldierName]);
6045 this.m_dicSession.Remove(SoldierName);
6046 }
6047 }
6048 }
6049 catch (Exception c)
6050 {
6051 this.DebugInfo("Error", "RemoveSession: " + c);
6052 }
6053 }
6054 */
6055 private void GetServerStats(string SoldierName, int delay, string scope)
6056 {
6057 string SQL = @"SELECT * FROM " + this.tbl_server_stats + @" WHERE ServerID = @ServerID";
6058 List<string> result = new List<string>(this.m_lstServerstatsMsg);
6059 try
6060 {
6061 using (MySqlCommand SelectCommand = new MySqlCommand(SQL))
6062 {
6063 SelectCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
6064 DataTable sqlresult = this.SQLquery(SelectCommand);
6065 if (sqlresult != null)
6066 {
6067 foreach (DataRow row in sqlresult.Rows)
6068 {
6069 result = this.ListReplace(result, "%serverName%", this.serverName);
6070 //COUNT
6071 result = this.ListReplace(result, "%countPlayer%", Convert.ToInt64(row["CountPlayers"]).ToString());
6072 //SUM
6073 result = this.ListReplace(result, "%sumScore%", Convert.ToInt64(row["SumScore"]).ToString());
6074 result = this.ListReplace(result, "%sumKills%", Convert.ToInt64(row["SumKills"]).ToString());
6075 result = this.ListReplace(result, "%sumHeadshots%", Convert.ToInt64(row["SumHeadshots"]).ToString());
6076 result = this.ListReplace(result, "%sumDeaths%", Convert.ToInt64(row["SumDeaths"]).ToString());
6077 result = this.ListReplace(result, "%sumSuicide%", Convert.ToInt64(row["SumSuicide"]).ToString());
6078 result = this.ListReplace(result, "%sumTKs%", Convert.ToInt64(row["SumTKs"]).ToString());
6079 result = this.ListReplace(result, "%sumRounds%", Convert.ToInt64(row["SumRounds"]).ToString());
6080
6081 //AVG
6082 result = this.ListReplace(result, "%avgScore%", Convert.ToInt64(row["AvgScore"]).ToString());
6083 result = this.ListReplace(result, "%avgKills%", Convert.ToInt64(row["AvgKills"]).ToString());
6084 result = this.ListReplace(result, "%avgHeadshots%", Convert.ToInt64(row["AvgHeadshots"]).ToString());
6085 result = this.ListReplace(result, "%avgDeaths%", Convert.ToInt64(row["AvgDeaths"]).ToString());
6086 result = this.ListReplace(result, "%avgSuicide%", Convert.ToInt64(row["AvgSuicide"]).ToString());
6087 result = this.ListReplace(result, "%avgTKs%", Convert.ToInt64(row["AvgTKs"]).ToString());
6088 result = this.ListReplace(result, "%avgRounds%", Convert.ToInt64(row["AvgRounds"]).ToString());
6089 //MISC.
6090 //SPM
6091 result = this.ListReplace(result, "%avgSPM%", Math.Round(Convert.ToDouble(row["SumScore"]) / (Convert.ToDouble(row["SumPlaytime"]) / 60), 2).ToString());
6092 //KPM
6093 result = this.ListReplace(result, "%avgKPM%", Math.Round(Convert.ToDouble(row["SumKills"]) / (Convert.ToDouble(row["SumPlaytime"]) / 60), 2).ToString());
6094 //HPM
6095 result = this.ListReplace(result, "%avgHPM%", Math.Round(Convert.ToDouble(row["SumHeadshots"]) / (Convert.ToDouble(row["SumPlaytime"]) / 60), 2).ToString());
6096 //HPK
6097 result = this.ListReplace(result, "%avgHPK%", Math.Round(Convert.ToDouble(row["SumHeadshots"]) / (Convert.ToDouble(row["SumKills"])), 2).ToString());
6098 //Playtime
6099 TimeSpan span = new TimeSpan(0, 0, Convert.ToInt32(row["SumPlaytime"]), 0, 0);
6100 result = this.ListReplace(result, "%sumPlaytime%", span.Days + "d:" + span.Hours + "h:" + span.Minutes + "m:" + span.Seconds + "s");
6101 result = this.ListReplace(result, "%sumPlaytimeHours%", Math.Round(span.TotalHours, 2).ToString());
6102 result = this.ListReplace(result, "%sumPlaytimeDays%", Math.Round(span.TotalDays, 2).ToString());
6103 //avg. Playtime
6104 span = new TimeSpan(0, 0, Convert.ToInt32(row["AvgPlaytime"]), 0, 0);
6105 result = this.ListReplace(result, "%avgPlaytime%", span.Days + "d:" + span.Hours + "h:" + span.Minutes + "m:" + span.Seconds + "s");
6106 result = this.ListReplace(result, "%avgPlaytimeHours%", Math.Round(span.TotalHours, 2).ToString());
6107 result = this.ListReplace(result, "%avgPlaytimeDays%", Math.Round(span.TotalDays, 2).ToString());
6108 }
6109
6110 if (result.Count != 0)
6111 {
6112 this.SendMultiLineChatMessage(result, delay, 0, scope, SoldierName);
6113 }
6114 else
6115 {
6116 result.Clear();
6117 result.Add("No Serverdata available!");
6118 this.SendMultiLineChatMessage(result, delay, 0, scope, SoldierName);
6119 }
6120 }
6121 }
6122 }
6123 catch (Exception c)
6124 {
6125 this.DebugInfo("Error", "GetServerStats: " + c);
6126 }
6127
6128 }
6129
6130 private void GetSession(string SoldierName, int delay, string scope)
6131 {
6132 if (this.ServerID == 0)
6133 {
6134 return;
6135 }
6136 try
6137 {
6138 if (this.m_dicSession.ContainsKey(SoldierName) && this.m_sessionON == enumBoolYesNo.Yes)
6139 {
6140 List<string> result = new List<string>();
6141 result = m_lstSessionMessage;
6142 result = ListReplace(result, "%playerName%", SoldierName);
6143 result = ListReplace(result, "%playerScore%", this.m_dicSession[SoldierName].Score.ToString());
6144 result = ListReplace(result, "%playerKills%", this.m_dicSession[SoldierName].Kills.ToString());
6145 result = ListReplace(result, "%killstreak%", this.m_dicSession[SoldierName].Killstreak.ToString());
6146 result = ListReplace(result, "%playerDeaths%", this.m_dicSession[SoldierName].Deaths.ToString());
6147 result = ListReplace(result, "%deathstreak%", this.m_dicSession[SoldierName].Deathstreak.ToString());
6148 result = ListReplace(result, "%playerKDR%", this.m_dicSession[SoldierName].KDR().ToString());
6149 result = ListReplace(result, "%playerHeadshots%", this.m_dicSession[SoldierName].Headshots.ToString());
6150 result = ListReplace(result, "%playerSuicide%", this.m_dicSession[SoldierName].Suicides.ToString());
6151 result = ListReplace(result, "%playerTK%", this.m_dicSession[SoldierName].Teamkills.ToString());
6152 result = ListReplace(result, "%startRank%", this.m_dicSession[SoldierName].Rank.ToString());
6153 //Rankdiff
6154 int playerRank = this.GetRank(SoldierName);
6155 //int playerRank = 0;
6156 result = ListReplace(result, "%playerRank%", playerRank.ToString());
6157 int Rankdif = this.m_dicSession[SoldierName].Rank;
6158 Rankdif = Rankdif - playerRank;
6159 if (Rankdif == 0)
6160 {
6161 result = ListReplace(result, "%RankDif%", "0");
6162 }
6163 else if (Rankdif > 0)
6164 {
6165 result = ListReplace(result, "%RankDif%", "+" + Rankdif.ToString());
6166 }
6167 else
6168 {
6169 result = ListReplace(result, "%RankDif%", Rankdif.ToString());
6170 }
6171 result = ListReplace(result, "%SessionStarted%", this.m_dicSession[SoldierName].TimePlayerjoined.ToString());
6172 TimeSpan duration = MyDateTime.Now - this.m_dicSession[SoldierName].TimePlayerjoined;
6173 result = ListReplace(result, "%SessionDuration%", Math.Round(duration.TotalMinutes, 2).ToString());
6174
6175 if (result.Count != 0)
6176 {
6177 this.SendMultiLineChatMessage(result, delay, 0, scope, SoldierName);
6178 }
6179 else
6180 {
6181 result.Clear();
6182 result.Add("No Sessiondata are available!");
6183 this.SendMultiLineChatMessage(result, delay, 0, scope, SoldierName);
6184 }
6185 }
6186 }
6187 catch (Exception c)
6188 {
6189 this.DebugInfo("Error", "GetSession: " + c);
6190 }
6191 }
6192
6193 private int GetRank(string SoldierName)
6194 {
6195 //this.DebugInfo("Trace", "GetRank: " + SoldierName);
6196 int rank = 0;
6197 try
6198 {
6199 string SQL = String.Empty;
6200 if (m_enRankingByScore == enumBoolYesNo.Yes)
6201 {
6202 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
6203 {
6204 SQL = @"SELECT tpr.rankScore AS rank
6205 FROM " + this.tbl_playerrank + @" tpr
6206 INNER JOIN " + this.tbl_playerdata + @" tpd ON tpr.PlayerID = tpd.PlayerID
6207 WHERE tpd.SoldierName = @SoldierName AND tpr.ServerGroup = @ServerGroup";
6208 }
6209 else
6210 {
6211 SQL = @"SELECT tps.rankScore AS rank
6212 FROM " + this.tbl_playerstats + @" tps
6213 INNER JOIN " + this.tbl_server_player + @" tsp ON tps.StatsID = tsp.StatsID
6214 INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
6215 WHERE tpd.SoldierName = @SoldierName AND tsp.ServerID = @ServerID";
6216 }
6217 }
6218 else
6219 {
6220 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
6221 {
6222 SQL = @"SELECT tpr.rankKills AS rank
6223 FROM " + this.tbl_playerrank + @" tpr
6224 INNER JOIN " + this.tbl_playerdata + @" tpd ON tpr.PlayerID = tpd.PlayerID
6225 WHERE tpd.SoldierName = @SoldierName AND tpr.ServerGroup = @ServerGroup";
6226 }
6227 else
6228 {
6229 SQL = @"SELECT tps.rankKills AS rank
6230 FROM " + this.tbl_playerstats + @" tps
6231 INNER JOIN " + this.tbl_server_player + @" tsp ON tps.StatsID = tsp.StatsID
6232 INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
6233 WHERE tpd.SoldierName = @SoldierName AND tsp.ServerID = @ServerID";
6234 }
6235 }
6236 using (MySqlCommand SelectCommand = new MySqlCommand(SQL))
6237 {
6238 if (this.m_enOverallRanking == enumBoolYesNo.Yes)
6239 {
6240 SelectCommand.Parameters.AddWithValue("@SoldierName", SoldierName);
6241 SelectCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
6242 }
6243 else
6244 {
6245 SelectCommand.Parameters.AddWithValue("@SoldierName", SoldierName);
6246 SelectCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
6247 }
6248 DataTable result = this.SQLquery(SelectCommand);
6249 if (result != null)
6250 {
6251 foreach (DataRow row in result.Rows)
6252 {
6253 if (Convert.DBNull.Equals(row[0]) == false)
6254 {
6255 rank = Convert.ToInt32(row[0]);
6256 this.DebugInfo("Trace", SoldierName + " Rank: " + row[0].ToString());
6257 }
6258 }
6259 }
6260 }
6261 }
6262 catch (MySqlException oe)
6263 {
6264 this.DebugInfo("Error", "Error in GetRank: ");
6265 this.DisplayMySqlErrorCollection(oe);
6266 }
6267 catch (Exception c)
6268 {
6269 this.DebugInfo("Error", "Error in GetRank: " + c);
6270 }
6271 return rank;
6272 }
6273
6274 public void PluginInfo(string strPlayer)
6275 {
6276 //this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger","0", "1", "1", "procon.protected.send", "admin.say","This Server running the PRoCon plugin "+this.GetPluginName+" "+this.GetPluginVersion+"running by "+ this.GetPluginAuthor,"player", strPlayer);
6277 }
6278
6279 public void DisplayMySqlErrorCollection(MySqlException myException)
6280 {
6281 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Message: " + myException.Message);
6282 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Native: " + myException.ErrorCode.ToString());
6283 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Source: " + myException.Source.ToString());
6284 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1StackTrace: " + myException.StackTrace.ToString());
6285 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1InnerException: " + myException.InnerException.ToString());
6286 // this.ExecuteCommand("procon.protected.pluginconsole.write", "^1SQL: " + myException.);
6287 }
6288
6289 private void prepareTablenames()
6290 {
6291 this.tbl_playerdata = "tbl_playerdata" + this.tableSuffix;
6292 this.tbl_playerstats = "tbl_playerstats" + this.tableSuffix;
6293 this.tbl_weaponstats = "tbl_weaponstats" + this.tableSuffix;
6294 this.tbl_dogtags = "tbl_dogtags" + this.tableSuffix;
6295 this.tbl_mapstats = "tbl_mapstats" + this.tableSuffix;
6296 this.tbl_chatlog = "tbl_chatlog" + this.tableSuffix;
6297 this.tbl_bfbcs = "tbl_bfbcs" + this.tableSuffix;
6298 this.tbl_awards = "tbl_awards" + this.tableSuffix;
6299 this.tbl_server = "tbl_server" + this.tableSuffix;
6300 this.tbl_server_player = "tbl_server_player" + this.tableSuffix;
6301 this.tbl_server_stats = "tbl_server_stats" + this.tableSuffix;
6302 this.tbl_playerrank = "tbl_playerrank" + this.tableSuffix;
6303 this.tbl_sessions = "tbl_sessions" + this.tableSuffix;
6304 this.tbl_currentplayers = "tbl_currentplayers" + this.tableSuffix;
6305 this.tbl_weapons = "tbl_weapons" + this.tableSuffix;
6306 this.tbl_weapons_stats = "tbl_weapons_stats" + this.tableSuffix;
6307 this.tbl_games = "tbl_games" + this.tableSuffix;
6308 this.tbl_teamscores = "tbl_teamscores" + this.tableSuffix;
6309
6310 }
6311
6312 private void setGameMod()
6313 {
6314 //this.PrepareKeywordDic();
6315 this.boolTableEXISTS = false;
6316 }
6317
6318 /*private void getBFBCStats(List<CPlayerInfo> lstPlayers)
6319 {
6320 //Disabled temp
6321 return;
6322 try
6323 {
6324 List<string> lstSoldierName = new List<string>();
6325 foreach (CPlayerInfo Player in lstPlayers)
6326 {
6327 DateTime lastUpdate = DateTime.MinValue;
6328 if (this.m_getStatsfromBFBCS == enumBoolYesNo.Yes && Player.SoldierName != null && this.StatsTracker.ContainsKey(Player.SoldierName) == true && this.StatsTracker[Player.SoldierName].BFBCS_Stats.Updated == false && this.StatsTracker[Player.SoldierName].BFBCS_Stats.Fetching == false)
6329 {
6330 string SQL = @"SELECT b.LastUpdate, b.Rank, b.Kills, b.Deaths, b.Score, b.Time
6331 FROM " + tbl_playerdata + @" a
6332 INNER JOIN " + tbl_bfbcs + @" b ON a.PlayerID = b.bfbcsID
6333 WHERE a.SoldierName = @SoldierName";
6334
6335 using (MySqlCommand SelectCommand = new MySqlCommand(SQL))
6336 {
6337 SelectCommand.Parameters.AddWithValue("@SoldierName", Player.SoldierName);
6338 DataTable result = this.SQLquery(SelectCommand);
6339
6340 foreach (DataRow row in result.Rows)
6341 {
6342 //this.DebugInfo("Last Update: " + row[0].ToString());
6343 lastUpdate = Convert.ToDateTime(row[0]);
6344 TimeSpan TimeDifference = MyDateTime.Now.Subtract(lastUpdate);
6345 //this.DebugInfo(TimeDifference.TotalHours.ToString());
6346 if (TimeDifference.TotalHours >= this.BFBCS_UpdateInterval && this.StatsTracker[Player.SoldierName].BFBCS_Stats.Fetching == false)
6347 {
6348 this.StatsTracker[Player.SoldierName].BFBCS_Stats.Fetching = true;
6349 lstSoldierName.Add(Player.SoldierName);
6350 }
6351 else if (this.StatsTracker.ContainsKey(Player.SoldierName) == true && this.StatsTracker[Player.SoldierName].BFBCS_Stats.Fetching == true)
6352 {
6353 //Do nothing
6354 }
6355 else
6356 {
6357 if (this.StatsTracker.ContainsKey(Player.SoldierName) == true)
6358 {
6359 //this.DebugInfo("No Update needed");
6360 this.StatsTracker[Player.SoldierName].BFBCS_Stats.Updated = true;
6361 this.StatsTracker[Player.SoldierName].BFBCS_Stats.Rank = Convert.ToInt32(row[1]);
6362 this.StatsTracker[Player.SoldierName].BFBCS_Stats.Kills = Convert.ToInt32(row[2]);
6363 this.StatsTracker[Player.SoldierName].BFBCS_Stats.Deaths = Convert.ToInt32(row[3]);
6364 this.StatsTracker[Player.SoldierName].BFBCS_Stats.Score = Convert.ToInt32(row[4]);
6365 this.StatsTracker[Player.SoldierName].BFBCS_Stats.Time = Convert.ToDouble(row[5]);
6366 this.StatsTracker[Player.SoldierName].BFBCS_Stats.NoUpdate = true;
6367 this.checkPlayerStats(Player.SoldierName, this.m_strReasonMsg);
6368 }
6369 }
6370 }
6371 }
6372 }
6373 }
6374 if (lstSoldierName != null && lstSoldierName.Count > 0 && lstSoldierName.Count >= this.BFBCS_Min_Request)
6375 {
6376 //Start Fetching
6377 specialArrayObject ListObject = new specialArrayObject(lstSoldierName);
6378 Thread newThread = new Thread(new ParameterizedThreadStart(this.DownloadBFBCS));
6379 newThread.Start(ListObject);
6380 }
6381 else
6382 {
6383 foreach (string player in lstSoldierName)
6384 {
6385 this.StatsTracker[player].BFBCS_Stats.Fetching = false;
6386 this.StatsTracker[player].BFBCS_Stats.Updated = false;
6387 }
6388 }
6389 }
6390 catch (Exception c)
6391 {
6392 this.DebugInfo("Error", " getBFBCStats: " + c);
6393 }
6394 }
6395
6396 private void DownloadBFBCS(object ListObject)
6397 {
6398 specialArrayObject ListString = (specialArrayObject)ListObject;
6399 List<string> lstSoldierName = new List<string>();
6400 lstSoldierName = ListString.LstString;
6401 //Define a empty string for parameter
6402 string ParameterString = String.Empty;
6403 string result = String.Empty;
6404 foreach (string SoldierName in lstSoldierName)
6405 {
6406 if (this.StatsTracker[SoldierName].BFBCS_Stats.Updated == false)
6407 {
6408 ParameterString = String.Concat(ParameterString, SoldierName, ",");
6409 this.StatsTracker[SoldierName].BFBCS_Stats.Updated = true;
6410 }
6411 }
6412 ParameterString = ParameterString.Remove(ParameterString.LastIndexOf(","));
6413 try
6414 {
6415 this.DebugInfo("Trace", "Thread started and fetching Stats from BFBCS for Players: " + ParameterString);
6416 using (WebClient wc = new WebClient())
6417 {
6418 //Thx to IIIAVIII
6419 ParameterString = ParameterString.Replace("&", "%26");
6420 ParameterString = ParameterString.Replace(" ", "%20");
6421 ParameterString = ParameterString.Replace("$", "%24");
6422 ParameterString = ParameterString.Replace("+", "%2B");
6423 ParameterString = ParameterString.Replace("/", "%2F");
6424 ParameterString = ParameterString.Replace("?", "%3F");
6425 ParameterString = ParameterString.Replace("%", "%25");
6426 ParameterString = ParameterString.Replace("#", "%23");
6427 //ParameterString = ParameterString.Replace(",","%2C");
6428 ParameterString = ParameterString.Replace(":", "%3A");
6429 ParameterString = ParameterString.Replace(";", "%3B");
6430 ParameterString = ParameterString.Replace("=", "%3D");
6431 ParameterString = ParameterString.Replace("@", "%40");
6432 ParameterString = ParameterString.Replace("<", "%3C");
6433 ParameterString = ParameterString.Replace(">", "%3E");
6434 ParameterString = ParameterString.Replace("{", "%7B");
6435 ParameterString = ParameterString.Replace("}", "%7D");
6436 ParameterString = ParameterString.Replace("|", "%7C");
6437 ParameterString = ParameterString.Replace(@"\", @"%5C");
6438 ParameterString = ParameterString.Replace("^", "%5E");
6439 ParameterString = ParameterString.Replace("~", "%7E");
6440 ParameterString = ParameterString.Replace("[", "%5B");
6441 ParameterString = ParameterString.Replace("]", "%5D");
6442 ParameterString = ParameterString.Replace("`", "%60");
6443
6444 result = wc.DownloadString("http://api.bfbcs.com/api/pc?players=" + ParameterString + "&fields=basic");
6445 }
6446 if (result == null || result.StartsWith("{") == false)
6447 {
6448 this.DebugInfo("Trace", "the String returned by BFBCS was invalid");
6449 this.DebugInfo("Trace", "Trying to repair the String...");
6450 if (result != null)
6451 {
6452 //result = result.Remove(result.IndexOf("<"),(result.LastIndexOf(">")+1));
6453 if (result.IndexOf("{") > 0)
6454 {
6455 result = result.Substring(result.IndexOf("{"));
6456 }
6457 if (result == null || result.StartsWith("{") == false)
6458 {
6459 this.DebugInfo("Trace", "Repair failed!!!");
6460 return;
6461 }
6462 else
6463 {
6464 this.DebugInfo("Trace", "Repair (might be) successful");
6465 }
6466 }
6467 else
6468 {
6469 this.DebugInfo("Trace", "Empty String...");
6470 return;
6471 }
6472 }
6473 //JSON DECODE
6474 Hashtable jsonHash = (Hashtable)JSON.JsonDecode(result);
6475 if (jsonHash["players"] != null)
6476 {
6477 ArrayList jsonResults = (ArrayList)jsonHash["players"];
6478 //Player with Stats
6479 foreach (object objResult in jsonResults)
6480 {
6481 string stringvalue = String.Empty;
6482 int intvalue = 0;
6483 double doublevalue = 0;
6484 Hashtable playerData = (Hashtable)objResult;
6485 if (playerData != null && lstSoldierName.Contains(playerData["name"].ToString()) == true)
6486 {
6487 stringvalue = playerData["name"].ToString();
6488 this.DebugInfo("Info", "Got BFBC2 stats for " + stringvalue);
6489 int.TryParse(playerData["rank"].ToString(), out intvalue);
6490 this.StatsTracker[stringvalue].BFBCS_Stats.Rank = intvalue;
6491 int.TryParse(playerData["kills"].ToString(), out intvalue);
6492 this.StatsTracker[stringvalue].BFBCS_Stats.Kills = intvalue;
6493 int.TryParse(playerData["deaths"].ToString(), out intvalue);
6494 this.StatsTracker[stringvalue].BFBCS_Stats.Deaths = intvalue;
6495 int.TryParse(playerData["score"].ToString(), out intvalue);
6496 this.StatsTracker[stringvalue].BFBCS_Stats.Score = intvalue;
6497 double.TryParse(playerData["elo"].ToString(), out doublevalue);
6498 this.StatsTracker[stringvalue].BFBCS_Stats.Elo = doublevalue;
6499 double.TryParse(playerData["level"].ToString(), out doublevalue);
6500 this.StatsTracker[stringvalue].BFBCS_Stats.Skilllevel = doublevalue;
6501 double.TryParse(playerData["time"].ToString(), out doublevalue);
6502 this.StatsTracker[stringvalue].BFBCS_Stats.Time = doublevalue;
6503 this.StatsTracker[stringvalue].BFBCS_Stats.Updated = true;
6504 // check Stats
6505 this.checkPlayerStats(stringvalue, this.m_strReasonMsg);
6506
6507 }
6508 }
6509 }
6510 if (jsonHash["players_unknown"] != null)
6511 {
6512 //Player without Stats
6513 ArrayList jsonResults_2 = (ArrayList)jsonHash["players_unknown"];
6514 foreach (object objResult in jsonResults_2)
6515 {
6516 Hashtable playerData = (Hashtable)objResult;
6517 if (playerData != null && lstSoldierName.Contains(playerData["name"].ToString()) == true)
6518 {
6519 this.DebugInfo("Info", "No Stats found for Player: " + playerData["name"].ToString());
6520 }
6521 }
6522 }
6523 }
6524 catch (Exception c)
6525 {
6526 this.DebugInfo("Error", " DownloadBFBCS: " + c);
6527 foreach (string SoldierName in lstSoldierName)
6528 {
6529 this.StatsTracker[SoldierName].BFBCS_Stats.Updated = false;
6530 }
6531 }
6532 }
6533
6534
6535 public void RemovePlayerfromServer(string targetSoldierName, string strReason, string removeAction)
6536 {
6537 try
6538 {
6539 if (targetSoldierName == string.Empty)
6540 {
6541 return;
6542 }
6543 switch (removeAction)
6544 {
6545 case "Kick":
6546 this.ExecuteCommand("procon.protected.send", "admin.kickPlayer", targetSoldierName, strReason);
6547 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Kicked Player: " + targetSoldierName + " - " + strReason);
6548 break;
6549
6550 case "PBBan":
6551 this.ExecuteCommand("procon.protected.send", "punkBuster.pb_sv_command", String.Format("pb_sv_ban \"{0}\" \"{1}\"", targetSoldierName, "BC2! " + strReason));
6552 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1PB-Ban for Player: " + targetSoldierName + " - " + strReason);
6553 break;
6554
6555 case "EAGUIDBan":
6556 this.ExecuteCommand("procon.protected.send", "banList.add", "guid", this.StatsTracker[targetSoldierName].EAGuid, "perm", strReason);
6557 this.ExecuteCommand("procon.protected.send", "banList.save");
6558 this.ExecuteCommand("procon.protected.send", "banList.list");
6559 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1EA-GUID Ban for Player: " + targetSoldierName + " - " + strReason);
6560 break;
6561 case "Nameban":
6562 this.ExecuteCommand("procon.protected.send", "banList.add", "name", targetSoldierName, "perm", strReason);
6563 this.ExecuteCommand("procon.protected.send", "banList.save");
6564 this.ExecuteCommand("procon.protected.send", "banList.list");
6565 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Nameban for Player: " + targetSoldierName + " - " + strReason);
6566 break;
6567 case "Warn":
6568 this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Warning Player: " + targetSoldierName + " - " + strReason);
6569 break;
6570 }
6571 }
6572 catch (Exception c)
6573 {
6574 this.DebugInfo("Error", " RemovePlayerfromServer: " + c);
6575 }
6576 }*/
6577
6578 private void calculateAwards()
6579 {
6580 //Disabled temp
6581 return;
6582 /*
6583 string[] arrPlace = new string[] { "None", "None", "None" };
6584 int[] arrScores = new int[] { 0, 0, 0 };
6585 string BestCombat = "None";
6586 int BestCombat_kills = 0;
6587 // Place 1 to 3
6588 if (this.bool_roundStarted == true && this.StatsTracker.Count >= 4)
6589 {
6590 foreach (KeyValuePair<string, CStats> kvp in this.StatsTracker)
6591 {
6592 //Place 1. to 3.
6593 if (kvp.Value.Score > arrScores[0])
6594 {
6595 // 2. to 3.
6596 arrScores[2] = arrScores[1];
6597 arrPlace[2] = arrPlace[1];
6598 // 1. to 2.
6599 arrScores[1] = arrScores[0];
6600 arrPlace[1] = arrPlace[0];
6601 // New 1.
6602 arrScores[0] = kvp.Value.Score;
6603 arrPlace[0] = kvp.Key;
6604 }
6605 else if (kvp.Value.Score > arrScores[1])
6606 {
6607 // 2. to 3.
6608 arrScores[2] = arrScores[1];
6609 arrPlace[2] = arrPlace[1];
6610 //New 2.
6611 arrScores[1] = kvp.Value.Score;
6612 arrPlace[1] = kvp.Key;
6613 }
6614 else if (kvp.Value.Score > arrScores[2])
6615 {
6616 //New 3.
6617 arrScores[2] = kvp.Value.Score;
6618 arrPlace[2] = kvp.Key;
6619 }
6620 //Most Kills - Best Combat
6621 if (kvp.Value.Kills >= 5 && BestCombat_kills < kvp.Value.Kills)
6622 {
6623 BestCombat = kvp.Key;
6624 BestCombat_kills = kvp.Value.Kills;
6625 }
6626
6627 }
6628 //Set Awards
6629 //1.Place
6630 if (arrPlace[0] != null && String.Equals(arrPlace[0], "None") == false)
6631 {
6632 this.StatsTracker[arrPlace[0]].Awards.dicAdd("First", 1);
6633 }
6634 //2.Place
6635 if (arrPlace[1] != null && String.Equals(arrPlace[1], "None") == false)
6636 {
6637 this.StatsTracker[arrPlace[1]].Awards.dicAdd("Second", 1);
6638 }
6639 //3.Place
6640 if (arrPlace[1] != null && String.Equals(arrPlace[2], "None") == false)
6641 {
6642 this.StatsTracker[arrPlace[2]].Awards.dicAdd("Third", 1);
6643 }
6644 //Best Combat
6645 if (BestCombat != null && String.Equals(BestCombat, "None") == false)
6646 {
6647 this.StatsTracker[BestCombat].Awards.dicAdd("Best_Combat", 1);
6648 }
6649 }
6650 */
6651 }
6652
6653 public void Threadstarter_Webrequest()
6654 {
6655 if (this.m_enWebrequest == enumBoolYesNo.Yes)
6656 {
6657 //Temp disabled
6658 // new Thread(Webrequest).Start();
6659 }
6660 }
6661
6662 public void Webrequest()
6663 {
6664 /*
6665 try
6666 {
6667 this.DebugInfo("Info", "Thread started and calling the Website: " + this.m_webAddress);
6668 using (WebClient wc = new WebClient())
6669 {
6670 string result = wc.DownloadString(this.m_webAddress);
6671 if (result.Length > 0)
6672 {
6673 this.DebugInfo("Info", "Got response from Webserver!");
6674 }
6675 else
6676 {
6677 this.DebugInfo("Warning", "Webrequest: Page(" + this.m_webAddress + ") not found!");
6678 }
6679 }
6680 }
6681 catch (Exception c)
6682 {
6683 this.DebugInfo("Error", "Webrequest: " + c);
6684 }
6685 */
6686 }
6687
6688 public void generateWeaponList()
6689 {
6690 this.DebugInfo("Trace", "generateWeaponList");
6691 List<string> weapList = new List<string>();
6692 this.weaponDic.Clear();
6693 this.DamageClass.Clear();
6694 try
6695 {
6696 WeaponDictionary weapons = this.GetWeaponDefines();
6697 foreach (PRoCon.Core.Players.Items.Weapon weapon in weapons)
6698 {
6699 string[] weaponName = Regex.Replace(weapon.Name.Replace("Weapons/", "").Replace("Gadgets/", ""),@"XP\d_","").Split('/');
6700 if (weapList.Contains(weaponName[0].Replace(' ', '_').Replace(".", "").Replace("U_", "")) == false)
6701 {
6702 weapList.Add(weaponName[0].Replace(' ', '_').Replace(".", "").Replace("U_", ""));
6703 }
6704 if (this.weaponDic.ContainsKey(weapon.Damage.ToString()) == false)
6705 {
6706 this.weaponDic.Add(weapon.Damage.ToString(), new Dictionary<string, CStats.CUsedWeapon>());
6707 }
6708 if (this.weaponDic[weapon.Damage.ToString()].ContainsKey(weapon.Name) == false)
6709 {
6710 this.weaponDic[weapon.Damage.ToString()].Add(weapon.Name, new CStats.CUsedWeapon(weapon.Name, weaponName[0].Replace(' ', '_').Replace(".", "").Replace("U_", ""),weapon.Slot.ToString(),weapon.KitRestriction.ToString()));
6711 }
6712 this.DamageClass.Add(weapon.Name, weapon.Damage.ToString());
6713 }
6714 this.PrepareKeywordDic();
6715 }
6716 catch (Exception e)
6717 {
6718 this.DebugInfo("Error", "generateWeaponList: " + e.ToString());
6719 }
6720 foreach (KeyValuePair<string, Dictionary<string, CStats.CUsedWeapon>> branch in this.weaponDic)
6721 {
6722 foreach (KeyValuePair<string, CStats.CUsedWeapon> leap in branch.Value)
6723 {
6724 this.DebugInfo("Trace", "Weaponlist: DamageType: " + branch.Key + " Name: " + leap.Key);
6725 }
6726 }
6727 }
6728
6729 private void getUpdateServerID(CServerInfo csiServerInfo)
6730 {
6731 try
6732 {
6733 //return;
6734 this.DebugInfo("Trace", "getUpdateServerID");
6735 /*
6736 this.DebugInfo("Trace", "ExternalGameIpandPort: " + this.m_strHostName + ":" + this.m_strPort);
6737 this.DebugInfo("Trace","ExternalGameIpandPort: "+ csiServerInfo.ExternalGameIpandPort);
6738 this.DebugInfo("Trace","ServerName: "+csiServerInfo.ServerName);
6739 this.DebugInfo("Trace","ConnectionState: "+csiServerInfo.ConnectionState);
6740 this.DebugInfo("Trace","CurrentRound: "+csiServerInfo.CurrentRound.ToString());
6741 //this.DebugInfo("Trace","GameMod: "+csiServerInfo.GameMod);
6742 this.DebugInfo("Trace","GameMode: "+csiServerInfo.GameMode);
6743 this.DebugInfo("Trace","JoinQueueEnabled: "+csiServerInfo.JoinQueueEnabled);
6744 this.DebugInfo("Trace","Map: "+csiServerInfo.Map);
6745 this.DebugInfo("Trace","Mappack: "+csiServerInfo.Mappack);
6746 this.DebugInfo("Trace","MaxPlayerCount: "+csiServerInfo.MaxPlayerCount);
6747 this.DebugInfo("Trace","Passworded: "+csiServerInfo.Passworded.ToString());
6748 this.DebugInfo("Trace","PlayerCount: "+csiServerInfo.PlayerCount);
6749 this.DebugInfo("Trace","Punkbuster: "+csiServerInfo.PunkBuster.ToString());
6750 this.DebugInfo("Trace","PunkBusterVersion: "+csiServerInfo.PunkBusterVersion);
6751 this.DebugInfo("Trace","Ranked: "+csiServerInfo.Ranked.ToString());
6752 this.DebugInfo("Trace","RoundTime: "+csiServerInfo.RoundTime.ToString());
6753 this.DebugInfo("Trace","ServerRegion: "+csiServerInfo.ServerRegion);
6754 this.DebugInfo("Trace","ServerUptime: "+csiServerInfo.ServerUptime.ToString());
6755
6756 this.DebugInfo("Trace","TotalRounds: "+csiServerInfo.TotalRounds);
6757
6758 */
6759 //this.DebugInfo("Trace", "TeamScores: " + csiServerInfo.TeamScores.Count.ToString());
6760
6761 this.tablebuilder();
6762 DataTable resultTable;
6763 string SQL = String.Empty;
6764 int attemptCount = 0;
6765 bool success = false;
6766 using (MySqlConnection DBConnection = new MySqlConnection(this.DBConnectionStringBuilder()))
6767 {
6768 MySql.Data.MySqlClient.MySqlTransaction Tx = null;
6769 try
6770 {
6771 DBConnection.Open();
6772 using (MySqlCommand MyCommand = new MySqlCommand("SELECT `ServerID` FROM " + this.tbl_server + @" WHERE IP_Address = @IP_Address"))
6773 {
6774 MyCommand.Parameters.AddWithValue("@IP_Address", this.m_strHostName + ":" + this.m_strPort);
6775 resultTable = this.SQLquery(MyCommand);
6776 if (resultTable.Rows != null)
6777 {
6778 foreach (DataRow row in resultTable.Rows)
6779 {
6780 //this.ServerID = Convert.ToInt32(row[0]);
6781 int.TryParse(row[0].ToString(), out this.ServerID);
6782 this.DebugInfo("Trace", "DB returns ServerID = " + this.ServerID);
6783 }
6784 }
6785 }
6786 if (ServerID <= 0)
6787 {
6788 SQL = @"INSERT INTO " + tbl_server + @" (IP_Address, ServerName, ServerGroup, usedSlots, maxSlots, mapName, GameID, Gamemode) VALUES (@IP_Address, @ServerName, @ServerGroup, @usedSlots, @maxSlots, @mapName, @GameID, @Gamemode)";
6789 }
6790 else
6791 {
6792 SQL = @"UPDATE " + tbl_server + @" SET ServerName = @ServerName, ServerGroup = @ServerGroup , usedSlots = @usedSlots, maxSlots = @maxSlots, mapName = @mapName, GameID = @GameID, Gamemode = @Gamemode WHERE IP_Address = @IP_Address";
6793 }
6794 while (attemptCount < this.TransactionRetryCount && !success)
6795 {
6796 attemptCount++;
6797 try
6798 {
6799 Tx = DBConnection.BeginTransaction();
6800 using (MySqlCommand MySqlCom = new MySqlCommand(SQL, DBConnection, Tx))
6801 {
6802 MySqlCom.Parameters.AddWithValue("@IP_Address", this.m_strHostName + ":" + this.m_strPort);
6803 MySqlCom.Parameters.AddWithValue("@ServerName", csiServerInfo.ServerName);
6804 MySqlCom.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
6805 MySqlCom.Parameters.AddWithValue("@usedSlots", csiServerInfo.PlayerCount);
6806 MySqlCom.Parameters.AddWithValue("@maxSlots", csiServerInfo.MaxPlayerCount);
6807 MySqlCom.Parameters.AddWithValue("@mapName", csiServerInfo.Map);
6808 MySqlCom.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
6809 MySqlCom.Parameters.AddWithValue("@Gamemode", csiServerInfo.GameMode);
6810 MySqlCom.ExecuteNonQuery();
6811 if (ServerID == 0)
6812 {
6813 int.TryParse(MySqlCom.LastInsertedId.ToString(), out this.ServerID);
6814 }
6815 }
6816 if (ServerID > 0 && this.m_enableCurrentPlayerstatsTable == enumBoolYesNo.Yes && csiServerInfo.TeamScores.Count > 0)
6817 {
6818 string ScoreSQL = "DELETE FROM `" + this.tbl_teamscores + "` WHERE `ServerID` = @ServerID";
6819 using (MySqlCommand MySqlCom = new MySqlCommand(ScoreSQL, DBConnection, Tx))
6820 {
6821 MySqlCom.Parameters.AddWithValue("@ServerID", ServerID);
6822 MySqlCom.ExecuteNonQuery();
6823 }
6824 foreach (TeamScore teamscore in csiServerInfo.TeamScores)
6825 {
6826 //this.DebugInfo("Trace", "Update Score Table TeamID: " + teamscore.TeamID );
6827 ScoreSQL = "INSERT INTO `" + this.tbl_teamscores + "` (`ServerID`,`TeamID`,`Score`,`WinningScore`) VALUES(@ServerID, @TeamID, @Score, @WinningScore)";
6828 using (MySqlCommand MySqlCom = new MySqlCommand(ScoreSQL, DBConnection, Tx))
6829 {
6830 MySqlCom.Parameters.AddWithValue("@ServerID", ServerID);
6831 MySqlCom.Parameters.AddWithValue("@TeamID", teamscore.TeamID);
6832 MySqlCom.Parameters.AddWithValue("@Score", teamscore.Score);
6833 MySqlCom.Parameters.AddWithValue("@WinningScore", teamscore.WinningScore);
6834 MySqlCom.ExecuteNonQuery();
6835 }
6836 }
6837 }
6838 Tx.Commit();
6839 success = true;
6840 }
6841 catch (MySqlException ex)
6842 {
6843 switch (ex.Number)
6844 {
6845 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
6846 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
6847 this.DebugInfo("Warning", "Warning in getUpdateServer: Lock timeout or Deadlock occured restarting Transaction #1. Attempt: " + attemptCount);
6848 try
6849 {
6850 Tx.Rollback();
6851 }
6852 catch { }
6853 Thread.Sleep(attemptCount * 1000);
6854 break;
6855 default:
6856 throw; //Other exceptions
6857 }
6858 }
6859 }
6860 }
6861 catch (Exception c)
6862 {
6863 this.DebugInfo("Error", "getUpdateServerID1: " + c);
6864 try
6865 {
6866 Tx.Rollback();
6867 }
6868 catch { }
6869 }
6870 finally
6871 {
6872 try
6873 {
6874 DBConnection.Close();
6875 }
6876 catch { }
6877 }
6878 }
6879 }
6880 catch (Exception c)
6881 {
6882 this.DebugInfo("Error", "getUpdateServerID1: " + c);
6883 }
6884 }
6885
6886 private void UpdateRanking()
6887 {
6888 try
6889 {
6890 //retrycount
6891 int attemptCount = 0;
6892 bool success = false;
6893
6894 //ScoreRanking per server
6895 /*
6896 string sqlupdate1 = @"UPDATE " + this.tbl_playerstats + @" tps
6897 INNER JOIN (
6898 SELECT(@num := @num+1) AS rankScore, tsp.StatsID
6899 FROM " + this.tbl_playerstats + @" tps
6900 STRAIGHT_JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) x
6901 WHERE tsp.ServerID = ?
6902 ORDER BY tps.Score DESC, tps.StatsID ASC
6903 ) sub
6904 ON sub.StatsID = tps.StatsID
6905 SET tps.rankScore = sub.rankScore
6906 WHERE sub.rankScore != tps.rankScore";
6907 */
6908 string sqlupdate1 = @"UPDATE " + this.tbl_playerstats + @" tps
6909 INNER JOIN (
6910 SELECT (@num := @num+1) AS rankScore, innersub.StatsID FROM
6911 (
6912 SELECT tsp.StatsID
6913 FROM " + this.tbl_playerstats + @" tps
6914 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) x
6915 WHERE tsp.ServerID = @ServerID
6916 ORDER BY tps.Score DESC, tps.StatsID ASC
6917 ) innersub
6918 ) sub
6919 ON sub.StatsID = tps.StatsID
6920 SET tps.rankScore = sub.rankScore
6921 WHERE sub.rankScore != tps.rankScore";
6922
6923
6924 //KillsRanking per server
6925 /*
6926 string sqlupdate2 = @"UPDATE " + this.tbl_playerstats + @" tps
6927 INNER JOIN (
6928 SELECT(@num := @num+1) AS rankKills, tsp.StatsID
6929 FROM " + this.tbl_playerstats + @" tps
6930 STRAIGHT_JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) y
6931 WHERE tsp.ServerID = ?
6932 ORDER BY tps.Kills DESC, tps.Deaths ASC , tps.StatsID ASC
6933 ) sub
6934 ON sub.StatsID = tps.StatsID
6935 SET tps.rankKills = sub.rankKills
6936 WHERE tps.rankKills != sub.rankKills";
6937 */
6938
6939 string sqlupdate2 = @"UPDATE " + this.tbl_playerstats + @" tps
6940 INNER JOIN (
6941 SELECT (@num := @num+1) AS rankKills, innersub.StatsID FROM
6942 (
6943 SELECT tsp.StatsID
6944 FROM " + this.tbl_playerstats + @" tps
6945 INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) x
6946 WHERE tsp.ServerID = @ServerID
6947 ORDER BY tps.Kills DESC, tps.Deaths ASC , tps.StatsID ASC
6948
6949 ) innersub
6950 ) sub
6951 ON sub.StatsID = tps.StatsID
6952 SET tps.rankKills = sub.rankKills
6953 WHERE sub.rankKills != tps.rankKills";
6954
6955 // Global Updates
6956 string sqlInsert = @"INSERT INTO " + this.tbl_playerrank + @" (PlayerID, ServerGroup)
6957 SELECT PlayerID, (" + this.intServerGroup + @") AS ServerGroup
6958 FROM " + this.tbl_playerdata + @"
6959 WHERE PlayerID NOT IN (SELECT PlayerID FROM " + this.tbl_playerrank + @" WHERE ServerGroup = @ServerGroup)";
6960
6961
6962 string sqlupdate3 = @" UPDATE " + this.tbl_playerrank + @" tpr
6963 INNER JOIN (SELECT (@num := @num + 1) AS rankKills, sub1.PlayerID ,sub1.ServerGroup
6964 FROM(SELECT tsp.PlayerID, ts.ServerGroup
6965 FROM " + this.tbl_server_player + @" tsp
6966 INNER JOIN " + this.tbl_server + @" ts ON tsp.ServerID = ts.ServerID
6967 INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) x
6968 WHERE ts.ServerGroup = @ServerGroup
6969 GROUP BY tsp.PlayerID, ts.ServerGroup
6970 ORDER BY SUM(tps.Kills) DESC, SUM(tps.Deaths) ASC, tsp.PlayerID ASC
6971 ) sub1
6972 ) sub
6973 ON sub.PlayerID = tpr.PlayerID
6974 SET tpr.rankKills = sub.rankKills
6975 WHERE tpr.rankKills != sub.rankKills AND sub.ServerGroup = tpr.ServerGroup";
6976
6977
6978 string sqlupdate4 = @" UPDATE " + this.tbl_playerrank + @" tpr
6979 INNER JOIN (SELECT (@num := @num + 1) AS rankScore, sub1.PlayerID ,sub1.ServerGroup
6980 FROM(SELECT tsp.PlayerID, ts.ServerGroup
6981 FROM " + this.tbl_server_player + @" tsp
6982 INNER JOIN " + this.tbl_server + @" ts ON tsp.ServerID = ts.ServerID
6983 INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) y
6984 WHERE ts.ServerGroup = @ServerGroup
6985 GROUP BY tsp.PlayerID, ts.ServerGroup
6986 ORDER BY SUM(tps.Score) DESC, tsp.PlayerID ASC
6987 ) sub1
6988 ) sub
6989 ON sub.PlayerID = tpr.PlayerID AND sub.ServerGroup = tpr.ServerGroup
6990 SET tpr.rankScore = sub.rankScore
6991 WHERE tpr.rankScore != sub.rankScore";
6992
6993 MySql.Data.MySqlClient.MySqlTransaction Tx = null;
6994 using (MySqlConnection Con = new MySqlConnection(this.DBConnectionStringBuilder()))
6995 {
6996 try
6997 {
6998 if (Con.State == ConnectionState.Closed)
6999 {
7000 Con.Open();
7001 }
7002
7003 if (boolSkipServerUpdate == false)
7004 {
7005 while (attemptCount < this.TransactionRetryCount && !success)
7006 {
7007 attemptCount++;
7008 try
7009 {
7010 Tx = Con.BeginTransaction();
7011 using (MySqlCommand Command = new MySqlCommand(sqlupdate1, Con, Tx))
7012 {
7013 Command.Parameters.AddWithValue("@ServerID", this.ServerID);
7014 Command.ExecuteNonQuery();
7015 }
7016 //Commit
7017 Tx.Commit();
7018 success = true;
7019 }
7020 catch (MySqlException ex)
7021 {
7022 switch (ex.Number)
7023 {
7024 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
7025 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
7026 this.DebugInfo("Warning", "Warning in UpdateRanking: Lock timeout or Deadlock occured restarting Transaction #1. Attempt: " + attemptCount);
7027 try
7028 {
7029 Tx.Rollback();
7030 }
7031 catch { }
7032 Thread.Sleep(attemptCount * 1000);
7033 break;
7034 default:
7035 throw; //Other exceptions
7036 }
7037 }
7038 }
7039 if (attemptCount > this.TransactionRetryCount)
7040 {
7041 this.DebugInfo("Error", "Error in UpdateRanking: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction #1)");
7042 }
7043 attemptCount = 0;
7044 success = false;
7045
7046 //Next query
7047 while (attemptCount < this.TransactionRetryCount && !success)
7048 {
7049 attemptCount++;
7050 try
7051 {
7052 //Start new Transaction
7053 Tx = Con.BeginTransaction();
7054 using (MySqlCommand Command = new MySqlCommand(sqlupdate2, Con, Tx))
7055 {
7056 Command.Parameters.AddWithValue("@ServerID", this.ServerID);
7057 Command.ExecuteNonQuery();
7058 }
7059 //Commit
7060 Tx.Commit();
7061 success = true;
7062 }
7063 catch (MySqlException ex)
7064 {
7065 switch (ex.Number)
7066 {
7067 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
7068 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
7069 this.DebugInfo("Warning", "Warning in UpdateRanking: Lock timeout or Deadlock occured restarting Transaction #2. Attempt: " + attemptCount);
7070 try
7071 {
7072 Tx.Rollback();
7073 }
7074 catch { }
7075 Thread.Sleep(attemptCount * 1000);
7076 break;
7077 default:
7078 throw; //Other exceptions
7079 }
7080 }
7081 }
7082 if (attemptCount > this.TransactionRetryCount)
7083 {
7084 this.DebugInfo("Error", "Error in UpdateRanking: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction #2)");
7085 }
7086 }
7087 attemptCount = 0;
7088 success = false;
7089
7090 //Next query
7091 if (boolSkipGlobalUpdate == false)
7092 {
7093 while (attemptCount < this.TransactionRetryCount && !success)
7094 {
7095 attemptCount++;
7096 try
7097 {
7098 //Start new Transaction
7099 Tx = Con.BeginTransaction();
7100 using (MySqlCommand Command = new MySqlCommand(sqlInsert, Con, Tx))
7101 {
7102 Command.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
7103 Command.ExecuteNonQuery();
7104 }
7105 //Commit
7106 Tx.Commit();
7107 success = true;
7108 }
7109 catch (MySqlException ex)
7110 {
7111 switch (ex.Number)
7112 {
7113 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
7114 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
7115 this.DebugInfo("Warning", "Warning in UpdateRanking: Lock timeout or Deadlock occured restarting Transaction #3. Attempt: " + attemptCount);
7116 try
7117 {
7118 Tx.Rollback();
7119 }
7120 catch { }
7121 Thread.Sleep(attemptCount * 1000);
7122 break;
7123 default:
7124 throw; //Other exceptions
7125 }
7126 }
7127 }
7128 if (attemptCount > this.TransactionRetryCount)
7129 {
7130 this.DebugInfo("Error", "Error in UpdateRanking: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction #3)");
7131 }
7132 attemptCount = 0;
7133 success = false;
7134
7135 //Next query
7136 while (attemptCount < this.TransactionRetryCount && !success)
7137 {
7138 attemptCount++;
7139 try
7140 {
7141 //Start new Transaction
7142 Tx = Con.BeginTransaction();
7143 using (MySqlCommand Command = new MySqlCommand(sqlupdate3, Con, Tx))
7144 {
7145 Command.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
7146 Command.ExecuteNonQuery();
7147 }
7148 //Commit
7149 Tx.Commit();
7150 success = true;
7151 }
7152 catch (MySqlException ex)
7153 {
7154 switch (ex.Number)
7155 {
7156 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
7157 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
7158 this.DebugInfo("Warning", "Warning in UpdateRanking: Lock timeout or Deadlock occured restarting Transaction #4. Attempt: " + attemptCount);
7159 try
7160 {
7161 Tx.Rollback();
7162 }
7163 catch { }
7164 Thread.Sleep(attemptCount * 1000);
7165 break;
7166 default:
7167 throw; //Other exceptions
7168 }
7169 }
7170 }
7171 if (attemptCount > this.TransactionRetryCount)
7172 {
7173 this.DebugInfo("Error", "Error in UpdateRanking: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction #4)");
7174 }
7175 attemptCount = 0;
7176 success = false;
7177
7178 //Next query
7179 while (attemptCount < this.TransactionRetryCount && !success)
7180 {
7181 attemptCount++;
7182 try
7183 {
7184 //Start new Transaction
7185 Tx = Con.BeginTransaction();
7186 using (MySqlCommand Command = new MySqlCommand(sqlupdate4, Con, Tx))
7187 {
7188 Command.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
7189 Command.ExecuteNonQuery();
7190 }
7191 Tx.Commit();
7192 success = true;
7193 }
7194 catch (MySqlException ex)
7195 {
7196 switch (ex.Number)
7197 {
7198 case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
7199 case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
7200 this.DebugInfo("Warning", "Warning in UpdateRanking: Lock timeout or Deadlock occured restarting Transaction #5. Attempt: " + attemptCount);
7201 try
7202 {
7203 Tx.Rollback();
7204 }
7205 catch { }
7206 Thread.Sleep(attemptCount * 1000);
7207 break;
7208 default:
7209 throw; //Other exceptions
7210 }
7211 }
7212 }
7213 if (attemptCount > this.TransactionRetryCount)
7214 {
7215 this.DebugInfo("Error", "Error in UpdateRanking: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction #5)");
7216 }
7217 }
7218 attemptCount = 0;
7219 success = false;
7220 }
7221 catch (MySqlException oe)
7222 {
7223 this.DebugInfo("Error", "Error in UpdateRanking: ");
7224 this.DisplayMySqlErrorCollection(oe);
7225 if (Tx != null)
7226 {
7227 try
7228 {
7229 Tx.Rollback();
7230 }
7231 catch { };
7232 }
7233 }
7234 catch (Exception c)
7235 {
7236 this.DebugInfo("Error", "Error in UpdateRanking: " + c);
7237 if (Tx != null)
7238 {
7239 try
7240 {
7241 Tx.Rollback();
7242 }
7243 catch { };
7244 }
7245 }
7246 finally
7247 {
7248 try
7249 {
7250 Con.Close();
7251 }
7252 catch { };
7253 }
7254 }
7255 }
7256 catch (Exception c)
7257 {
7258 this.DebugInfo("Error", "Error in UpdateRanking: " + c);
7259 }
7260 }
7261
7262 private void checkWelcomeStatsDic()
7263 {
7264 try
7265 {
7266 lock (this.welcomestatsDic)
7267 {
7268 TimeSpan duration = new TimeSpan(0, 10, 0);
7269 List<string> entryToRemove = new List<string>();
7270 foreach (KeyValuePair<string, DateTime> kvp in this.welcomestatsDic)
7271 {
7272 if (duration < (MyDateTime.Now - kvp.Value))
7273 {
7274 entryToRemove.Add(kvp.Key);
7275 }
7276 }
7277 foreach (string entry in entryToRemove)
7278 {
7279 this.DebugInfo("Trace", "Removing Player " + entry + " from welcomestatslist Timeoutlimit of 10 minutes was exceeded!");
7280 this.welcomestatsDic.Remove(entry);
7281 }
7282 }
7283 }
7284 catch (Exception c)
7285 {
7286 this.DebugInfo("Error", "Error in checkWelcomeStatsDic: " + c);
7287 }
7288 }
7289
7290 private void BuildRegexRuleset()
7291 {
7292 try
7293 {
7294 this.lstChatFilterRules = new List<Regex>();
7295 foreach (string strRule in this.lstStrChatFilterRules)
7296 {
7297 this.lstChatFilterRules.Add(new Regex(strRule.Replace("|", "|").Replace("|","+")));
7298 }
7299
7300 if (this.GlobalDebugMode.Equals("Trace"))
7301 {
7302 this.DebugInfo("Trace", "Active Regex-Ruleset:");
7303 foreach (Regex regexrule in this.lstChatFilterRules)
7304 {
7305 this.DebugInfo("Trace", regexrule.ToString());
7306 }
7307 }
7308 }
7309 catch (Exception c)
7310 {
7311 this.DebugInfo("Error", "Error in BuildRegexRuleset: " + c);
7312 }
7313 }
7314
7315 private void SendMultiLineChatMessage(List<string> lstMultiLineChatMSG, int intDelay, int delayIncreasePerLine , string strScope, string targetPlayerName)
7316 {
7317 int totalDelay = intDelay;
7318 int yellduration = 8;
7319 string duration = string.Empty;
7320 string yelltagwithduration = @"^\[[y|Y][e|E][l|L]{2,2},\d+\]";
7321 //string yelltag = @"^\[[y|Y][e|E][l|L]{2,2},";
7322 try
7323 {
7324 switch (strScope)
7325 {
7326 case "all":
7327 foreach (string line in lstMultiLineChatMSG)
7328 {
7329
7330 if (Regex.IsMatch(line, yelltagwithduration))
7331 {
7332 MatchCollection matches = Regex.Matches(line, yelltagwithduration);
7333 foreach (Match match in matches)
7334 {
7335 foreach (Capture capture in match.Captures)
7336 {
7337 if(int.TryParse(Regex.Replace(match.Value,@"\D",""), out yellduration) == false )
7338 {
7339 this.DebugInfo("Trace", "SendMultiLineChatMessage: Could not parse Duration, using default");
7340 yellduration = 8;
7341 }
7342 }
7343 }
7344 //yell this!
7345 this.CheckMessageLength(Regex.Replace(line,yelltagwithduration,"") , 255);
7346 this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger", totalDelay.ToString(), "1", "1", "procon.protected.send", "admin.yell", Regex.Replace(line, yelltagwithduration, ""), yellduration.ToString(), strScope);
7347 totalDelay += delayIncreasePerLine;
7348 totalDelay += yellduration;
7349 }
7350 else
7351 {
7352 //default say
7353 this.CheckMessageLength(line, 128);
7354 this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger", totalDelay.ToString(), "1", "1", "procon.protected.send", "admin.say", line, strScope);
7355 totalDelay += delayIncreasePerLine;
7356 }
7357 }
7358 break;
7359
7360 default:
7361 foreach (string line in lstMultiLineChatMSG)
7362 {
7363 if (Regex.IsMatch(line, yelltagwithduration))
7364 {
7365 MatchCollection matches = Regex.Matches(line, yelltagwithduration);
7366 foreach (Match match in matches)
7367 {
7368 foreach (Capture capture in match.Captures)
7369 {
7370 if (int.TryParse(Regex.Replace(match.Value, @"\D", ""), out yellduration) == false)
7371 {
7372 this.DebugInfo("Trace", "SendMultiLineChatMessage: Could not parse Duration, using default");
7373 yellduration = 8;
7374 }
7375 }
7376 }
7377 //yell this!
7378 this.CheckMessageLength(line, 255);
7379 this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger", totalDelay.ToString(), "1", "1", "procon.protected.send", "admin.yell", Regex.Replace(line, yelltagwithduration, ""), yellduration.ToString(), "player", targetPlayerName);
7380 totalDelay += delayIncreasePerLine;
7381 totalDelay += yellduration;
7382 }
7383 else
7384 {
7385 //default say
7386 this.CheckMessageLength(line, 128);
7387 this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger", totalDelay.ToString(), "1", "1", "procon.protected.send", "admin.say", line, "player", targetPlayerName);
7388 totalDelay += delayIncreasePerLine;
7389 }
7390 }
7391 break;
7392 }
7393
7394 }
7395 catch (Exception c)
7396 {
7397 this.DebugInfo("Error", "Error in PostMultiLineChat: " + c);
7398 }
7399 }
7400
7401 private Dictionary<string, int> GetWeaponMappingfromDB()
7402 {
7403 Dictionary<string,int> mappingDic = new Dictionary<string,int>();
7404 try
7405 {
7406 string sqlSelect = "SELECT `WeaponID`,`Fullname` FROM `" + this.tbl_weapons + @"` WHERE `GameID` = @GameID";
7407 using (MySqlCommand SelectCommand = new MySqlCommand(sqlSelect))
7408 {
7409 SelectCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
7410
7411 DataTable result = this.SQLquery(SelectCommand);
7412 if (result != null || result.Rows.Count != 0)
7413 {
7414 foreach (DataRow row in result.Rows)
7415 {
7416 mappingDic.Add(row["Fullname"].ToString(), Convert.ToInt32(row["WeaponID"]));
7417 this.DebugInfo("Trace", "WeaponMapping: ID: " + Convert.ToInt32(row["WeaponID"]).ToString() + " <--> Weapon:" + row["Fullname"].ToString());
7418 }
7419 }
7420 }
7421 }
7422 catch (MySqlException oe)
7423 {
7424 this.DebugInfo("Error", "Error in GetWeaponMappingfromDB: ");
7425 this.DisplayMySqlErrorCollection(oe);
7426 }
7427 catch (Exception c)
7428 {
7429 this.DebugInfo("Error", "Error in GetWeaponMappingfromDB: " + c);
7430 }
7431
7432 return mappingDic;
7433 }
7434
7435 private int GetGameIDfromDB(string strGame)
7436 {
7437 this.DebugInfo("Trace", "GetGameIDfromDB Game: " + strGame);
7438 int intGameID = 0;
7439 try
7440 {
7441 string sqlSelect = "SELECT `GameID` FROM `" + this.tbl_games + @"` WHERE `Name` = @Name";
7442 using (MySqlCommand SelectCommand = new MySqlCommand(sqlSelect))
7443 {
7444 SelectCommand.Parameters.AddWithValue("@Name", strGame);
7445
7446 DataTable result = this.SQLquery(SelectCommand);
7447 if (result.Rows.Count != 0)
7448 {
7449 intGameID = Convert.ToInt32(result.Rows[0][0]);
7450 }
7451 else
7452 {
7453 this.DebugInfo("Trace", "GetGameIDfromDB Game: no gameID found");
7454 //Insert Game
7455 using (MySqlConnection Con = new MySqlConnection(this.DBConnectionStringBuilder()))
7456 {
7457 Con.Open();
7458 MySqlTransaction Transaction = null;
7459 //Start of the Transaction
7460 Transaction = Con.BeginTransaction();
7461
7462 string SQL = @"INSERT INTO `" + this.tbl_games + @"` (`Name`) VALUES (@Name)";
7463 using (MySqlCommand MyCom = new MySqlCommand(SQL, Con, Transaction))
7464 {
7465 MyCom.Parameters.AddWithValue("@Name", this.strServerGameType);
7466 MyCom.ExecuteNonQuery();
7467 this.DebugInfo("Trace", "GetGameIDfromDB LastInsertedId: " + MyCom.LastInsertedId.ToString());
7468 intGameID = Convert.ToInt32(MyCom.LastInsertedId);
7469 }
7470 Transaction.Commit();
7471 }
7472 }
7473 }
7474 }
7475 catch (MySqlException oe)
7476 {
7477 this.DebugInfo("Error", "Error in GetGameIDfromDB: ");
7478 this.DisplayMySqlErrorCollection(oe);
7479 }
7480 catch (Exception c)
7481 {
7482 this.DebugInfo("Error", "Error in GetGameIDfromDB: " + c);
7483 }
7484 this.DebugInfo("Trace", "GetGameIDfromDB GameID: " + intGameID);
7485 return intGameID;
7486 }
7487 }
7488
7489 #endregion
7490
7491 #region Classes
7492 /*==========Classes========*/
7493 class CLogger
7494 {
7495 private readonly string _Name;
7496 private string _Message = String.Empty;
7497 private string _Subset = String.Empty;
7498 private DateTime _Time;
7499
7500 public string Name
7501 {
7502 get { return _Name; }
7503 }
7504
7505 public string Message
7506 {
7507 get { return _Message; }
7508 }
7509
7510 public string Subset
7511 {
7512 get { return _Subset; }
7513 }
7514
7515 public DateTime Time
7516 {
7517 get { return _Time; }
7518 }
7519
7520 public CLogger(DateTime time, string name, string message, string subset)
7521 {
7522 _Name = name;
7523 _Message = message;
7524 _Subset = subset;
7525 _Time = time;
7526 }
7527 }
7528
7529 class CStats
7530 {
7531 private string _ClanTag;
7532 private string _Guid;
7533 private string _EAGuid;
7534 private string _IP;
7535 private string _PlayerCountryCode;
7536 private int _Score = 0;
7537 private int _HighScore = 0;
7538 private int _LastScore = 0;
7539 private int _Kills = 0;
7540 private int _Headshots = 0;
7541 private int _Deaths = 0;
7542 private int _Suicides = 0;
7543 private int _Teamkills = 0;
7544 private int _Playtime = 0;
7545 private int _Rounds = 0;
7546 private DateTime _Playerjoined;
7547 private DateTime _TimePlayerleft;
7548 private DateTime _TimePlayerjoined;
7549 private int _PlayerleftServerScore = 0;
7550 private bool _playerOnServer = true;
7551 private int _rank = 0;
7552 //KD Correction
7553 private int _beforeleftKills = 0;
7554 private int _beforeleftDeaths = 0;
7555 //Streaks
7556 private int _Killstreak;
7557 private int _Deathstreak;
7558 private int _Killcount;
7559 private int _Deathcount;
7560 //Wins&Loses
7561 private int _Wins = 0;
7562 private int _Losses = 0;
7563 //TeamID
7564 private int _TeamId = 0;
7565 //BFBCS
7566 private CBFBCS _BFBCS_Stats;
7567 private myDateTime MyDateTime = new myDateTime(0);
7568 public Dictionary<string, Dictionary<string, CStats.CUsedWeapon>> dicWeap = new Dictionary<string, Dictionary<string, CStats.CUsedWeapon>>();
7569
7570 //Awards
7571 private CAwards _Awards;
7572
7573 //global Rank
7574 private int _GlobalRank = 0;
7575
7576 public string ClanTag
7577 {
7578 get { return _ClanTag; }
7579 set { _ClanTag = value; }
7580 }
7581
7582 public string Guid
7583 {
7584 get { return _Guid; }
7585 set { _Guid = value; }
7586 }
7587
7588 public string EAGuid
7589 {
7590 get { return _EAGuid; }
7591 set { _EAGuid = value; }
7592 }
7593
7594 public string IP
7595 {
7596 get { return _IP; }
7597 set { _IP = value.Remove(value.IndexOf(":")); }
7598 }
7599
7600 public string PlayerCountryCode
7601 {
7602 get { return _PlayerCountryCode; }
7603 set { _PlayerCountryCode = value; }
7604 }
7605
7606 public int Score
7607 {
7608 get { return _Score; }
7609 set { _Score = value; }
7610 }
7611
7612 public int HighScore
7613 {
7614 get { return _HighScore; }
7615 set { _HighScore = value; }
7616 }
7617
7618 public int LastScore
7619 {
7620 get { return _LastScore; }
7621 set { _LastScore = value; }
7622 }
7623
7624 public int Kills
7625 {
7626 get { return _Kills; }
7627 set { _Kills = value; }
7628 }
7629
7630 public int BeforeLeftKills
7631 {
7632 get { return _beforeleftKills; }
7633 set { _beforeleftKills = value; }
7634 }
7635
7636 public int Headshots
7637 {
7638 get { return _Headshots; }
7639 set { _Headshots = value; }
7640 }
7641
7642 public int Deaths
7643 {
7644 get { return _Deaths; }
7645 set { _Deaths = value; }
7646 }
7647
7648 public int BeforeLeftDeaths
7649 {
7650 get { return _beforeleftDeaths; }
7651 set { _beforeleftDeaths = value; }
7652 }
7653
7654 public int Suicides
7655 {
7656 get { return _Suicides; }
7657 set { _Suicides = value; }
7658 }
7659
7660 public int Teamkills
7661 {
7662 get { return _Teamkills; }
7663 set { _Teamkills = value; }
7664 }
7665
7666 public int Playtime
7667 {
7668 get { return _Playtime; }
7669 set { _Playtime = value; }
7670 }
7671
7672 public int Rounds
7673 {
7674 get { return _Rounds; }
7675 set { _Rounds = value; }
7676 }
7677
7678 public DateTime Playerjoined
7679 {
7680 get { return _Playerjoined; }
7681 set { _Playerjoined = value; }
7682 }
7683
7684 public DateTime TimePlayerleft
7685 {
7686 get { return _TimePlayerleft; }
7687 set { _TimePlayerleft = value; }
7688 }
7689
7690 public DateTime TimePlayerjoined
7691 {
7692 get { return _TimePlayerjoined; }
7693 set { _TimePlayerjoined = value; }
7694 }
7695
7696 public int PlayerleftServerScore
7697 {
7698 get { return _PlayerleftServerScore; }
7699 set { _PlayerleftServerScore = value; }
7700 }
7701
7702 public bool PlayerOnServer
7703 {
7704 get { return _playerOnServer; }
7705 set { _playerOnServer = value; }
7706 }
7707
7708 public int Rank
7709 {
7710 get { return _rank; }
7711 set { _rank = value; }
7712 }
7713
7714 public int Killstreak
7715 {
7716 get { return _Killstreak; }
7717 set { _Killstreak = value; }
7718 }
7719
7720 public int Deathstreak
7721 {
7722 get { return _Deathstreak; }
7723 set { _Deathstreak = value; }
7724 }
7725
7726 public int Wins
7727 {
7728 get { return _Wins; }
7729 set { _Wins = value; }
7730 }
7731
7732 public int Losses
7733 {
7734 get { return _Losses; }
7735 set { _Losses = value; }
7736 }
7737
7738 public int TeamId
7739 {
7740 get { return _TeamId; }
7741 set { _TeamId = value; }
7742 }
7743
7744 public int GlobalRank
7745 {
7746 get { return _GlobalRank; }
7747 set { _GlobalRank = value; }
7748 }
7749
7750 //Methodes
7751 public void AddScore(int intScore)
7752 {
7753 if (intScore != 0)
7754 {
7755 this._Score = this._Score + (intScore - this._LastScore);
7756 this._LastScore = intScore;
7757 if (intScore > this._HighScore)
7758 {
7759 this._HighScore = intScore;
7760 }
7761 }
7762 else
7763 {
7764 this._LastScore = 0;
7765 }
7766 }
7767
7768 public double KDR()
7769 {
7770 double ratio = 0;
7771 if (this._Deaths != 0)
7772 {
7773 ratio = Math.Round(Convert.ToDouble(this._Kills) / Convert.ToDouble(this._Deaths), 2);
7774 }
7775 else
7776 {
7777 ratio = this._Kills;
7778 }
7779 return ratio;
7780 }
7781
7782 public Dictionary<string, Dictionary<string, CStats.CUsedWeapon>> getWeaponKills()
7783 {
7784 return this.dicWeap;
7785 }
7786
7787 public void addKill(string strDmgType, string strweaponType, bool blheadshot)
7788 {
7789 this._Kills++;
7790 if (blheadshot)
7791 {
7792 if (this.dicWeap.ContainsKey(strDmgType))
7793 {
7794 if (this.dicWeap[strDmgType].ContainsKey(strweaponType))
7795 {
7796 this.dicWeap[strDmgType][strweaponType].Kills++;
7797 this.dicWeap[strDmgType][strweaponType].Headshots++;
7798 }
7799 }
7800 this._Headshots++;
7801 }
7802 else
7803 {
7804 if (this.dicWeap.ContainsKey(strDmgType))
7805 {
7806 if (this.dicWeap[strDmgType].ContainsKey(strweaponType))
7807 {
7808 this.dicWeap[strDmgType][strweaponType].Kills++;
7809 }
7810 }
7811 }
7812 //Killstreaks
7813 this._Killcount++;
7814 this._Deathcount = 0;
7815 if (this._Killcount > this._Killstreak)
7816 {
7817 this._Killstreak = this._Killcount;
7818 }
7819 //Awardchecks
7820 this._Awards.CheckOnKill(_Kills, _Headshots, _Deaths, _Killcount, _Deathcount);
7821 }
7822
7823 public void addDeath(string strDmgType, string strweaponType)
7824 {
7825 this._Deaths++;
7826 if (this.dicWeap.ContainsKey(strDmgType))
7827 {
7828 if (this.dicWeap[strDmgType].ContainsKey(strweaponType))
7829 {
7830 this.dicWeap[strDmgType][strweaponType].Deaths++;
7831 }
7832 }
7833 //Deathstreak
7834 this._Deathcount++;
7835 this._Killcount = 0;
7836 if (this._Deathcount > this._Deathstreak)
7837 {
7838 this._Deathstreak = this._Deathcount;
7839 }
7840 //Awardchecks
7841 this._Awards.CheckOnDeath(_Kills, _Headshots, _Deaths, _Killcount, _Deathcount);
7842 }
7843
7844 public void playerleft()
7845 {
7846 //Score
7847 this._PlayerleftServerScore += this._Score;
7848 this._Score = 0;
7849 //Kd Correction
7850 this._beforeleftKills += this._Kills;
7851 this._beforeleftDeaths += this._Deaths;
7852
7853 //Time
7854 TimeSpan duration = MyDateTime.Now - this._Playerjoined;
7855 this._Playtime += Convert.ToInt32(duration.TotalSeconds);
7856 this._playerOnServer = false;
7857 }
7858
7859 public int TotalScore
7860 {
7861 get { return (this._PlayerleftServerScore + this._Score); }
7862 }
7863
7864 public int TotalPlaytime
7865 {
7866 get
7867 {
7868 if (this._playerOnServer)
7869 {
7870 TimeSpan duration = MyDateTime.Now - this._Playerjoined;
7871 return (this._Playtime + Convert.ToInt32(duration.TotalSeconds));
7872 }
7873 return this._Playtime;
7874 }
7875 }
7876
7877 public CStats.CBFBCS BFBCS_Stats
7878 {
7879 get { return _BFBCS_Stats; }
7880 set { _BFBCS_Stats = value; }
7881 }
7882
7883 public CStats.CAwards Awards
7884 {
7885 get { return _Awards; }
7886 set { _Awards = value; }
7887 }
7888
7889 public class CUsedWeapon
7890 {
7891 private string _Name = "";
7892 private string _FieldName = "";
7893 private string _Slot = "";
7894 private string _KitRestriction = "";
7895 private int _Kills = 0;
7896 private int _Headshots = 0;
7897 private int _Deaths = 0;
7898
7899 public int Kills
7900 {
7901 get { return _Kills; }
7902 set { _Kills = value; }
7903 }
7904
7905 public int Headshots
7906 {
7907 get { return _Headshots; }
7908 set { _Headshots = value; }
7909 }
7910
7911 public int Deaths
7912 {
7913 get { return _Deaths; }
7914 set { _Deaths = value; }
7915 }
7916
7917 public string Name
7918 {
7919 get { return _Name; }
7920 set { _Name = value; }
7921 }
7922
7923 public string FieldName
7924 {
7925 get { return _FieldName; }
7926 set { _FieldName = value; }
7927 }
7928
7929 public string Slot
7930 {
7931 get { return _Slot; }
7932 set { _Slot = value; }
7933 }
7934
7935 public string KitRestriction
7936 {
7937 get { return _KitRestriction; }
7938 set { _KitRestriction = value; }
7939 }
7940
7941 public CUsedWeapon(string name, string fieldname, string slot, string kitrestriction)
7942 {
7943 this._Name = name;
7944 this._FieldName = fieldname;
7945 this._Slot = slot;
7946 this._KitRestriction = kitrestriction;
7947 this._Kills = 0;
7948 this._Headshots = 0;
7949 this._Deaths = 0;
7950 }
7951 }
7952
7953 public class CBFBCS
7954 {
7955 private int _rank;
7956 private int _kills;
7957 private int _deaths;
7958 private int _score;
7959 private double _skilllevel;
7960 private double _time;
7961 private double _elo;
7962 private bool _Updated;
7963 private bool _fetching;
7964 private bool _noUpdate;
7965
7966 public int Rank
7967 {
7968 get { return _rank; }
7969 set { _rank = value; }
7970 }
7971
7972 public int Kills
7973 {
7974 get { return _kills; }
7975 set { _kills = value; }
7976 }
7977
7978 public int Deaths
7979 {
7980 get { return _deaths; }
7981 set { _deaths = value; }
7982 }
7983
7984 public double KDR
7985 {
7986 get
7987 {
7988 double ratio = 0;
7989 if (this._deaths != 0)
7990 {
7991 ratio = Math.Round(Convert.ToDouble(this._kills) / Convert.ToDouble(this._deaths), 2);
7992 }
7993 else
7994 {
7995 ratio = this._kills;
7996 }
7997 return ratio;
7998 }
7999 }
8000 public double SPM
8001 {
8002 get
8003 {
8004 return Convert.ToDouble(this._score) / (this._time / 60);
8005 }
8006 }
8007
8008 public int Score
8009 {
8010 get { return _score; }
8011 set { _score = value; }
8012 }
8013
8014 public double Skilllevel
8015 {
8016 get { return _skilllevel; }
8017 set { _skilllevel = value; }
8018 }
8019
8020 public double Time
8021 {
8022 get { return _time; }
8023 set { _time = value; }
8024 }
8025
8026 public double Elo
8027 {
8028 get { return _elo; }
8029 set { _elo = value; }
8030 }
8031
8032 public bool Updated
8033 {
8034 get { return _Updated; }
8035 set { _Updated = value; }
8036 }
8037
8038 public bool Fetching
8039 {
8040 get { return _fetching; }
8041 set { _fetching = value; }
8042 }
8043
8044 public bool NoUpdate
8045 {
8046 get { return _noUpdate; }
8047 set { _noUpdate = value; }
8048 }
8049
8050 public CBFBCS()
8051 {
8052 this._rank = 0;
8053 this._kills = 0;
8054 this._deaths = 0;
8055 this._score = 0;
8056 this._skilllevel = 0;
8057 this._time = 0;
8058 this._elo = 0;
8059 this._Updated = false;
8060 this._fetching = false;
8061 this._noUpdate = false;
8062 }
8063 }
8064
8065 public class CAwards
8066 {
8067 //Awards
8068 private Dictionary<string, int> _dicAwards = new Dictionary<string, int>();
8069
8070 //Constructor
8071 public CAwards()
8072 {
8073 this._dicAwards = new Dictionary<string, int>();
8074 }
8075
8076 //Get and Set
8077 public Dictionary<string, int> DicAwards
8078 {
8079 get { return _dicAwards; }
8080 set { _dicAwards = value; }
8081 }
8082
8083 //Methodes
8084 public void dicAdd(string strAward, int count)
8085 {
8086 if (this._dicAwards.ContainsKey(strAward))
8087 {
8088 this._dicAwards[strAward] = this._dicAwards[strAward] + count;
8089 }
8090 else
8091 {
8092 this._dicAwards.Add(strAward, count);
8093 }
8094 }
8095
8096 public void CheckOnKill(int kills, int hs, int deaths, int ks, int ds)
8097 {
8098 //Purple Heart
8099 if (kills >= 5 && deaths >= 20 && ((Double)kills / (Double)deaths) == 0.25)
8100 {
8101 this.dicAdd("Purple_Heart", 1);
8102 }
8103 //Killstreaks
8104 if (ks == 5)
8105 {
8106 //5 Kills in a row
8107 this.dicAdd("Killstreak_5", 1);
8108 }
8109 else if (ks == 10)
8110 {
8111 //10 kills in a row
8112 this.dicAdd("Killstreak_10", 1);
8113 }
8114 else if (ks == 15)
8115 {
8116 //15 kills in a row
8117 this.dicAdd("Killstreak_15", 1);
8118 }
8119 else if (ks == 20)
8120 {
8121 //20 kills in a row
8122 this.dicAdd("Killstreak_20", 1);
8123 }
8124 }
8125
8126 public void CheckOnDeath(int kills, int hs, int deaths, int ks, int ds)
8127 {
8128 //Purple Heart
8129 if (kills >= 5 && deaths >= 20 && ((Double)kills / (Double)deaths) == 0.25)
8130 {
8131 this.dicAdd("Purple_Heart", 1);
8132 }
8133 }
8134 }
8135
8136 public class myDateTime
8137 {
8138 private double _offset = 0;
8139
8140 public DateTime Now
8141 {
8142 get
8143 {
8144 DateTime dateValue = DateTime.Now;
8145 return dateValue.AddHours(_offset);
8146 }
8147 }
8148 public myDateTime(double offset)
8149 {
8150 this._offset = offset;
8151 }
8152 }
8153
8154 public CStats(string guid, int score, int kills, int headshots, int deaths, int suicides, int teamkills, int playtime, double timeoffset, Dictionary<string, Dictionary<string, CStats.CUsedWeapon>> _weaponDic)
8155 {
8156 this.MyDateTime = new myDateTime(timeoffset);
8157 this._ClanTag = String.Empty;
8158 this._Guid = guid;
8159 this._EAGuid = String.Empty;
8160 this._IP = String.Empty;
8161 this._Score = score;
8162 this._LastScore = 0;
8163 this._HighScore = score;
8164 this._Kills = kills;
8165 this._Headshots = headshots;
8166 this._Deaths = deaths;
8167 this._Suicides = suicides;
8168 this._Teamkills = teamkills;
8169 this._Playtime = playtime;
8170 this._Rounds = 0;
8171 this._PlayerleftServerScore = 0;
8172 this._PlayerCountryCode = String.Empty;
8173 this._Playerjoined = MyDateTime.Now;
8174 this._TimePlayerjoined = this._Playerjoined;
8175 this._TimePlayerleft = DateTime.MinValue;
8176 this._rank = 0;
8177 this._Killcount = 0;
8178 this._Killstreak = 0;
8179 this._Deathcount = 0;
8180 this._Deathstreak = 0;
8181 this._Wins = 0;
8182 this._Losses = 0;
8183 this.BFBCS_Stats = new CStats.CBFBCS();
8184 this._Awards = new CAwards();
8185 //this.dicWeap = new Dictionary<string,Dictionary<string,CUsedWeapon>>(_weaponDic);
8186 foreach (KeyValuePair<string, Dictionary<string, CStats.CUsedWeapon>> pair in _weaponDic)
8187 {
8188 this.dicWeap.Add(pair.Key, new Dictionary<string, CStats.CUsedWeapon>());
8189 foreach (KeyValuePair<string, CStats.CUsedWeapon> subpair in pair.Value)
8190 {
8191 this.dicWeap[pair.Key].Add(subpair.Key, new CStats.CUsedWeapon(subpair.Value.Name, subpair.Value.FieldName,subpair.Value.Slot,subpair.Value.KitRestriction));
8192 }
8193 }
8194 }
8195 }
8196
8197 class C_ID_Cache
8198 {
8199 private int _Id;
8200 private int _StatsID;
8201 private bool _PlayeronServer;
8202
8203 public int Id
8204 {
8205 get { return _Id; }
8206 set { _Id = value; }
8207 }
8208
8209 public int StatsID
8210 {
8211 get { return _StatsID; }
8212 set { _StatsID = value; }
8213 }
8214
8215 public bool PlayeronServer
8216 {
8217 get { return _PlayeronServer; }
8218 set { _PlayeronServer = value; }
8219 }
8220 //Constructor
8221 public C_ID_Cache(int statsid, int id, bool playeronServer)
8222 {
8223 this._Id = id;
8224 this._StatsID = statsid;
8225 this._PlayeronServer = playeronServer;
8226 }
8227 }
8228
8229 class CKillerVictim
8230 {
8231 string _Killer = String.Empty;
8232 string _Victim = String.Empty;
8233
8234 public string Killer
8235 {
8236 get { return _Killer; }
8237 set { _Killer = value; }
8238 }
8239
8240 public string Victim
8241 {
8242 get { return _Victim; }
8243 set { _Victim = value; }
8244 }
8245
8246 public CKillerVictim(string killer, string victim)
8247 {
8248 this._Killer = killer;
8249 this._Victim = victim;
8250 }
8251 }
8252
8253 class CMapstats
8254 {
8255 private DateTime _timeMaploaded;
8256 private DateTime _timeMapStarted;
8257 private DateTime _timeRoundEnd;
8258 private string _strMapname = String.Empty;
8259 private string _strGamemode = String.Empty;
8260 private int _intRound;
8261 private int _intNumberOfRounds;
8262 private List<int> _lstPlayers;
8263 private int _intMinPlayers;
8264 private int _intMaxPlayers;
8265 private int _intServerplayermax;
8266 private double _doubleAvgPlayers;
8267 private int _intplayerleftServer;
8268 private int _intplayerjoinedServer;
8269 private myDateTime MyDateTime = new myDateTime(0);
8270
8271 public DateTime TimeMaploaded
8272 {
8273 get { return _timeMaploaded; }
8274 set { _timeMaploaded = value; }
8275 }
8276
8277 public DateTime TimeMapStarted
8278 {
8279 get { return _timeMapStarted; }
8280 set { _timeMapStarted = value; }
8281 }
8282
8283 public DateTime TimeRoundEnd
8284 {
8285 get { return _timeRoundEnd; }
8286 set { _timeRoundEnd = value; }
8287 }
8288
8289 public string StrMapname
8290 {
8291 get { return _strMapname; }
8292 set { _strMapname = value; }
8293 }
8294
8295 public string StrGamemode
8296 {
8297 get { return _strGamemode; }
8298 set { _strGamemode = value; }
8299 }
8300
8301 public int IntRound
8302 {
8303 get { return _intRound; }
8304 set { _intRound = value; }
8305 }
8306
8307 public int IntNumberOfRounds
8308 {
8309 get { return _intNumberOfRounds; }
8310 set { _intNumberOfRounds = value; }
8311 }
8312
8313 public List<int> LstPlayers
8314 {
8315 get { return _lstPlayers; }
8316 set { _lstPlayers = value; }
8317 }
8318
8319 public int IntMinPlayers
8320 {
8321 get { return _intMinPlayers; }
8322 set { _intMinPlayers = value; }
8323 }
8324
8325 public int IntMaxPlayers
8326 {
8327 get { return _intMaxPlayers; }
8328 set { _intMaxPlayers = value; }
8329 }
8330
8331 public int IntServerplayermax
8332 {
8333 get { return _intServerplayermax; }
8334 set { _intServerplayermax = value; }
8335 }
8336
8337 public double DoubleAvgPlayers
8338 {
8339 get { return _doubleAvgPlayers; }
8340 set { _doubleAvgPlayers = value; }
8341 }
8342
8343 public int IntplayerleftServer
8344 {
8345 get { return _intplayerleftServer; }
8346 set { _intplayerleftServer = value; }
8347 }
8348
8349 public int IntplayerjoinedServer
8350 {
8351 get { return _intplayerjoinedServer; }
8352 set { _intplayerjoinedServer = value; }
8353 }
8354
8355 public void MapStarted()
8356 {
8357 this._timeMapStarted = MyDateTime.Now;
8358 }
8359
8360 public void MapEnd()
8361 {
8362 this._timeRoundEnd = MyDateTime.Now;
8363 }
8364
8365 public void ListADD(int entry)
8366 {
8367 this._lstPlayers.Add(entry);
8368 }
8369
8370 public void calcMaxMinAvgPlayers()
8371 {
8372 this._intMaxPlayers = 0;
8373 this._intMinPlayers = _intServerplayermax;
8374 this._doubleAvgPlayers = 0;
8375 int entries = 0;
8376 foreach (int playercount in this._lstPlayers)
8377 {
8378 if (playercount >= this._intMaxPlayers)
8379 this._intMaxPlayers = playercount;
8380
8381 if (playercount <= this._intMinPlayers)
8382 this._intMinPlayers = playercount;
8383
8384 this._doubleAvgPlayers = this._doubleAvgPlayers + playercount;
8385 entries = entries + 1;
8386
8387 }
8388 if (entries != 0)
8389 {
8390 this._doubleAvgPlayers = this._doubleAvgPlayers / (Convert.ToDouble(entries));
8391 this._doubleAvgPlayers = Math.Round(this._doubleAvgPlayers, 1);
8392 }
8393 else
8394 {
8395 this._doubleAvgPlayers = 0;
8396 this._intMaxPlayers = 0;
8397 this._intMinPlayers = 0;
8398 }
8399 }
8400
8401 public class myDateTime
8402 {
8403 private double _offset = 0;
8404
8405 public DateTime Now
8406 {
8407 get
8408 {
8409 DateTime dateValue = DateTime.Now;
8410 return dateValue.AddHours(_offset);
8411 }
8412 }
8413 public myDateTime(double offset)
8414 {
8415 this._offset = offset;
8416 }
8417 }
8418
8419 public CMapstats(DateTime timeMaploaded, string strMapname, int intRound, int intNumberOfRounds, double timeoffset)
8420 {
8421 this._timeMaploaded = timeMaploaded;
8422 this._strMapname = strMapname;
8423 this._intRound = intRound;
8424 this._intNumberOfRounds = intNumberOfRounds;
8425 this._intMaxPlayers = 32;
8426 this._intServerplayermax = 32;
8427 this._intMinPlayers = 0;
8428 this._intplayerjoinedServer = 0;
8429 this._intplayerleftServer = 0;
8430 this._lstPlayers = new List<int>();
8431 this._timeMapStarted = DateTime.MinValue;
8432 this._timeRoundEnd = DateTime.MinValue;
8433 this._strGamemode = String.Empty;
8434 this.MyDateTime = new myDateTime(timeoffset);
8435 }
8436 }
8437
8438 class CSpamprotection
8439 {
8440 private Dictionary<string, int> dicplayer;
8441 private int _allowedRequests;
8442
8443 public CSpamprotection(int allowedRequests)
8444 {
8445 this._allowedRequests = allowedRequests;
8446 this.dicplayer = new Dictionary<string, int>();
8447 }
8448
8449 public bool isAllowed(string strSpeaker)
8450 {
8451 bool result = false;
8452 if (this.dicplayer.ContainsKey(strSpeaker) == true)
8453 {
8454 int i = this.dicplayer[strSpeaker];
8455 if (0 >= i)
8456 {
8457 //Player is blocked
8458 result = false;
8459 this.dicplayer[strSpeaker]--;
8460 }
8461 else
8462 {
8463 //Player is not blocked
8464 result = true;
8465 this.dicplayer[strSpeaker]--;
8466 }
8467 }
8468 else
8469 {
8470 this.dicplayer.Add(strSpeaker, this._allowedRequests);
8471 result = true;
8472 this.dicplayer[strSpeaker]--;
8473 }
8474 return result;
8475 }
8476
8477 public void Reset()
8478 {
8479 this.dicplayer.Clear();
8480 }
8481 }
8482
8483 class myDateTime_W
8484 {
8485 private double _offset = 0;
8486
8487 public DateTime Now
8488 {
8489 get
8490 {
8491 DateTime dateValue = DateTime.Now;
8492 return dateValue.AddHours(_offset);
8493 }
8494 }
8495 public myDateTime_W(double offset)
8496 {
8497 this._offset = offset;
8498 }
8499 }
8500
8501 class CStatsIngameCommands
8502 {
8503 //Class variables
8504 private string _functioncall;
8505 private string _commands;
8506 private string _description;
8507 private bool _boolEnabled;
8508
8509
8510 public CStatsIngameCommands(string commands, string functioncall, bool boolEnabled, string description)
8511 {
8512 this._commands = commands;
8513 this._functioncall = functioncall;
8514 this._boolEnabled = boolEnabled;
8515 this._description = description;
8516
8517 }
8518
8519 public string commands
8520 {
8521 get { return this._commands; }
8522 set { this._commands = value; }
8523 }
8524
8525 public string functioncall
8526 {
8527 get { return this._functioncall; }
8528 set { this._functioncall = value; }
8529 }
8530
8531 public string description
8532 {
8533 get { return this._description; }
8534 set { this._description = value; }
8535 }
8536
8537 public bool boolEnabled
8538 {
8539 get { return this._boolEnabled; }
8540 set { this._boolEnabled = value; }
8541 }
8542 }
8543
8544 #endregion
8545}