/* Copyright 2013 [GWC]XpKillerhx
This plugin file is part of PRoCon Frostbite.
This plugin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This plugin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with PRoCon Frostbite. If not, see .
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
//using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
//using System.Net;
//MySQL native includes
//using MySql.Data;
using MySql.Data.MySqlClient;
//Procon includes
using PRoCon.Core;
using PRoCon.Core.Players;
using PRoCon.Core.Players.Items;
using PRoCon.Core.Plugin;
using PRoCon.Core.Plugin.Commands;
namespace PRoConEvents
{
public class CChatGUIDStatsLogger : PRoConPluginAPI, IPRoConPluginInterface
{
#region Variables and Constructor
private MatchCommand loggerStatusCommand;
//Proconvariables
private string m_strHostName;
private string m_strPort;
private string m_strPRoConVersion;
//Tablebuilder
private readonly object tablebuilderlock;
//other locks
private readonly object chatloglock;
private readonly object sqlquerylock;
private readonly object sessionlock;
private readonly object streamlock;
private readonly object ConnectionStringBuilderlock;
private readonly object registerallcomandslock;
//Dateoffset
private myDateTime_W MyDateTime;
private double m_dTimeOffset;
//Logging
private Dictionary m_dicPbInfo = new Dictionary();
//Chatlog
private static List ChatLog = new List();
private List lstStrChatFilterRules;
private List lstChatFilterRules;
//Statslog
private Dictionary StatsTracker = new Dictionary();
//Dogtags
private Dictionary m_dicKnifeKills = new Dictionary();
//Session
private Dictionary m_dicSession = new Dictionary();
private CMapstats Mapstats;
private CMapstats Nextmapinfo;
private List lstpassedSessions = new List();
//GameMod
//private string m_strGameMod;
//Spamprotection
private int numberOfAllowedRequests;
private CSpamprotection Spamprotection;
//Keywords
private List m_lstTableconfig = new List();
private Dictionary> m_dicKeywords = new Dictionary>();
//Weapondic
private Dictionary> weaponDic = new Dictionary>();
//DamageClassDic
private Dictionary DamageClass = new Dictionary();
//WelcomeStatsDic
private Dictionary welcomestatsDic = new Dictionary();
//Weapon Mapping Dictionary
private Dictionary WeaponMappingDic = new Dictionary();
//ServerID
private int ServerID;
//Awards
private List m_lstAwardTable = new List();
//Tablenames
private string tbl_playerdata;
private string tbl_playerstats;
private string tbl_weaponstats;
private string tbl_dogtags;
private string tbl_mapstats;
private string tbl_chatlog;
private string tbl_bfbcs;
private string tbl_awards;
private string tbl_server;
private string tbl_server_player;
private string tbl_server_stats;
private string tbl_playerrank;
private string tbl_sessions;
private string tbl_currentplayers;
private string tbl_weapons;
private string tbl_weapons_stats;
private string tbl_games;
private string tbl_teamscores;
// Timelogging
private bool bool_roundStarted;
private DateTime Time_RankingStarted;
//Other
private Dictionary m_dicPlayers = new Dictionary(); //Players
//ID Cache
private Dictionary m_ID_cache = new Dictionary();
//Various Variables
//private int m_strUpdateInterval;
private bool isStreaming;
private string serverName;
private bool m_isPluginEnabled;
private bool boolTableEXISTS;
private bool boolKeywordDicReady;
private string tableSuffix;
private bool MySql_Connection_is_activ;
//Last time Stat Logger actively interacted with the database
private DateTime lastDBInteraction = DateTime.MinValue;
//Update skipswitches
private bool boolSkipGlobalUpdate;
private bool boolSkipServerUpdate;
private bool boolSkipServerStatsUpdate;
//Transaction retry
private int TransactionRetryCount;
//Playerstartcount
private int intRoundStartCount;
private int intRoundRestartCount;
//Webrequest
private int m_requestIntervall;
private string m_webAddress;
//BFBCS
//private double BFBCS_UpdateInterval;
//private int BFBCS_Min_Request;
//Database Connection Variables
private string m_strHost;
private string m_strDBPort;
private string m_strDatabase;
private string m_strUserName;
private string m_strPassword;
//private string m_strDatabaseDriver;
//Stats Message Variables
private List m_lstPlayerStatsMessage;
private List m_lstPlayerOfTheDayMessage;
private List m_lstPlayerWelcomeStatsMessage;
private List m_lstNewPlayerWelcomeMsg;
private List m_lstWeaponstatsMsg;
private List m_lstServerstatsMsg;
//private string m_strPlayerWelcomeMsg;
//private string m_strNewPlayerWelcomeMsg;
private int int_welcomeStatsDelay;
private string m_strTop10Header;
private string m_strTop10RowFormat;
private string m_strWeaponTop10Header;
private string m_strWeaponTop10RowFormat;
//top10 for Period
private string m_strTop10HeaderForPeriod;
//Session
private List m_lstSessionMessage;
//Debug
private string GlobalDebugMode;
//ServerGroup
private int intServerGroup;
//Bools for switch on and off funktions
private enumBoolYesNo m_enNoServerMsg; //Logging of Server Messages
private enumBoolYesNo m_enLogSTATS; //Statslogging
private enumBoolYesNo m_enWelcomeStats; //WelcomeStats
private enumBoolYesNo m_enYellWelcomeMSG; // Yell Welcome Message
private enumBoolYesNo m_enTop10ingame; //Top10 ingame
private enumBoolYesNo m_enRankingByScore; //Ranking by Score
private enumBoolYesNo m_enInstantChatlogging; //Realtime Chatlogging
private enumBoolYesNo m_enChatloggingON; // Chatlogging On
private enumBoolYesNo m_enChatlogFilter; //Turn on the Chatlogfilter
private enumBoolYesNo m_enSendStatsToAll; //All Player see the Stats if someone enter @stats @rank
private enumBoolYesNo m_mapstatsON; //Mapstats
private enumBoolYesNo m_sessionON; //Sessionstats
private enumBoolYesNo m_weaponstatsON; //Turn Weaponstats On and Off
private enumBoolYesNo m_getStatsfromBFBCS; //Turn Statsfetching from BFBCS On and Off
private enumBoolYesNo m_awardsON; //Turn Awards on or off
private enumBoolYesNo m_enWebrequest; // Webrequest
private enumBoolYesNo m_enOverallRanking; //Overall Ranking
private enumBoolYesNo m_enableInGameCommands; // Turn InGame Commands on and off
private enumBoolOnOff m_highPerformanceConnectionMode;
private enumBoolYesNo m_enSessionTracking;
private enumBoolYesNo m_kdrCorrection; //Kill death Ratio Correction
private enumBoolYesNo m_enableCurrentPlayerstatsTable; // experimental
private enumBoolYesNo m_enLogPlayerDataOnly;
private enumBoolOnOff m_connectionPooling; //Connection Pooling
private enumBoolOnOff m_Connectioncompression;
private int m_maxPoolSize; //Connection Pooling
private int m_minPoolSize; //Connection Pooling
//More Database Variables
//Commands
//Transactions
private MySql.Data.MySqlClient.MySqlTransaction MySqlTrans;
//Connections
private MySql.Data.MySqlClient.MySqlConnection MySqlCon; //Select Querys 1
private MySql.Data.MySqlClient.MySqlConnection MySqlChatCon; //MySqlConnection for Chatlogging
private MySql.Data.MySqlClient.MySqlConnection MySqlConn; //StartStreaming 2
private MySqlConnectionStringBuilder myCSB = new MySqlConnectionStringBuilder();
//ServerInfo Event fix
private DateTime dtLastServerInfoEvent;
private int minIntervalllenght;
//Double Roundendfix
private DateTime dtLastRoundendEvent;
private DateTime dtLastOnListPlayersEvent;
//Top10 for Period
private int m_intDaysForPeriodTop10;
//New In-Game Command System
private string m_IngameCommands_stats;
private string m_IngameCommands_serverstats;
private string m_IngameCommands_session;
private string m_IngameCommands_dogtags;
private string m_IngameCommands_top10;
private string m_IngameCommands_playerOfTheDay;
private string m_IngameCommands_top10ForPeriod;
private Dictionary dicIngameCommands = new Dictionary();
//ServerGametype
private string strServerGameType = String.Empty;
private int intServerGameType_ID;
public CChatGUIDStatsLogger()
{
loggerStatusCommand = new MatchCommand("CChatGUIDStatsLogger", "GetStatus", new List(), "CChatGUIDStatsLogger_Status", new List(), new ExecutionRequirements(ExecutionScope.None), "Useable by other plugins to determine the current status of this plugin.");
//tablebuilderlock
this.tablebuilderlock = new object();
//other locks
this.chatloglock = new object();
this.sqlquerylock = new object();
this.sessionlock = new object();
this.streamlock = new object();
this.ConnectionStringBuilderlock = new object();
this.registerallcomandslock = new object();
//update skipswitch
this.boolSkipGlobalUpdate = false;
this.boolSkipServerUpdate = false;
this.boolSkipServerStatsUpdate = false;
//Timeoffset
this.m_dTimeOffset = 0;
this.MyDateTime = new myDateTime_W(this.m_dTimeOffset);
//this.m_strUpdateInterval = 30;
this.isStreaming = true;
this.serverName = String.Empty;
this.m_ID_cache = new Dictionary();
this.m_dicKeywords = new Dictionary>();
this.boolKeywordDicReady = false;
this.tableSuffix = String.Empty;
this.Mapstats = new CMapstats(MyDateTime.Now, "START", 0, 0, this.m_dTimeOffset);
this.MySql_Connection_is_activ = false;
this.numberOfAllowedRequests = 10;
//Transaction retry count
TransactionRetryCount = 3;
//Chatlog
this.lstStrChatFilterRules = new List();
this.lstChatFilterRules = new List();
//BFBCS
//this.BFBCS_UpdateInterval = 72; // hours
//this.BFBCS_Min_Request = 2; //min Packrate
//Playerstartcount
this.intRoundStartCount = 2;
this.intRoundRestartCount = 1;
//Webrequest
this.m_webAddress = String.Empty;
this.m_requestIntervall = 60;
//Databasehost
this.m_strHost = String.Empty;
this.m_strDBPort = String.Empty;
this.m_strDatabase = String.Empty;
this.m_strUserName = String.Empty;
this.m_strPassword = String.Empty;
//Various Bools
this.bool_roundStarted = false;
this.m_isPluginEnabled = false;
this.boolTableEXISTS = false;
//ServerGroup
this.intServerGroup = 0;
//Debug
this.GlobalDebugMode = "Error";
//Functionswitches
this.m_enLogSTATS = enumBoolYesNo.No;
this.m_enWelcomeStats = enumBoolYesNo.No;
this.m_enYellWelcomeMSG = enumBoolYesNo.No;
this.m_enTop10ingame = enumBoolYesNo.No;
this.m_enRankingByScore = enumBoolYesNo.Yes;
this.m_enNoServerMsg = enumBoolYesNo.No;
this.m_enInstantChatlogging = enumBoolYesNo.No;
this.m_enChatloggingON = enumBoolYesNo.No;
this.m_enChatlogFilter = enumBoolYesNo.No;
this.m_enSendStatsToAll = enumBoolYesNo.No;
this.m_mapstatsON = enumBoolYesNo.No;
this.m_sessionON = enumBoolYesNo.No;
this.m_weaponstatsON = enumBoolYesNo.Yes;
this.m_getStatsfromBFBCS = enumBoolYesNo.No;
this.m_awardsON = enumBoolYesNo.No;
this.m_enOverallRanking = enumBoolYesNo.No;
this.m_enableInGameCommands = enumBoolYesNo.Yes;
this.m_highPerformanceConnectionMode = enumBoolOnOff.Off;
this.m_kdrCorrection = enumBoolYesNo.Yes; //Kill death Ratio Correction
this.m_enableCurrentPlayerstatsTable = enumBoolYesNo.No; // experimental
this.m_enLogPlayerDataOnly = enumBoolYesNo.No;
this.m_connectionPooling = enumBoolOnOff.On; //Connection Pooling
this.m_Connectioncompression = enumBoolOnOff.Off;
this.m_minPoolSize = 0; //Connection Pooling
this.m_maxPoolSize = 10; //Connection Pooling
//Welcomestats
//this.m_strPlayerWelcomeMsg = "[yell,4]Nice to see you on our Server again, %playerName%";
//this.m_strNewPlayerWelcomeMsg = "[yell,4]Welcome to the %serverName% Server, %playerName%";
this.int_welcomeStatsDelay = 5;
this.welcomestatsDic = new Dictionary();
//Playerstats
this.m_lstPlayerStatsMessage = new List();
this.m_lstPlayerStatsMessage.Add("Serverstats for %playerName%:");
this.m_lstPlayerStatsMessage.Add("Score: %playerScore% %playerKills% Kills %playerHeadshots% HS %playerDeaths% Deaths K/D: %playerKDR%");
this.m_lstPlayerStatsMessage.Add("Your Serverrank is: %playerRank% of %allRanks%");
//Player of the day
this.m_lstPlayerOfTheDayMessage = new List();
this.m_lstPlayerOfTheDayMessage.Add("%playerName% is the Player of the day");
this.m_lstPlayerOfTheDayMessage.Add("Score: %playerScore% %playerKills% Kills %playerHeadshots% HS %playerDeaths% Deaths K/D: %playerKDR%");
this.m_lstPlayerOfTheDayMessage.Add("His Serverrank is: %playerRank% of %allRanks%");
this.m_lstPlayerOfTheDayMessage.Add("Overall playtime for today: %playerPlaytime%");
//Welcomestats
this.m_lstPlayerWelcomeStatsMessage = new List();
this.m_lstPlayerWelcomeStatsMessage.Add("Nice to see you on our Server again, %playerName%");
this.m_lstPlayerWelcomeStatsMessage.Add("Serverstats for %playerName%:");
this.m_lstPlayerWelcomeStatsMessage.Add("Score: %playerScore% %playerKills% Kills %playerHeadshots% HS %playerDeaths% Deaths K/D: %playerKDR%");
this.m_lstPlayerWelcomeStatsMessage.Add("Your Serverrank is: %playerRank% of %allRanks%");
//Welcomestats new Player
this.m_lstNewPlayerWelcomeMsg = new List();
this.m_lstNewPlayerWelcomeMsg.Add("Welcome to the %serverName% Server, %playerName%");
//Weaponstats
this.m_lstWeaponstatsMsg = new List();
this.m_lstWeaponstatsMsg.Add("%playerName%'s Stats for %Weapon%:");
this.m_lstWeaponstatsMsg.Add("%playerKills% Kills %playerHeadshots% Headshots Headshotrate: %playerKHR%%");
this.m_lstWeaponstatsMsg.Add("Your Weaponrank is: %playerRank% of %allRanks%");
//Serverstats
this.m_lstServerstatsMsg = new List();
this.m_lstServerstatsMsg.Add("Serverstatistics for server %serverName%");
this.m_lstServerstatsMsg.Add("Unique Players: %countPlayer% Totalplaytime: %sumPlaytime%");
this.m_lstServerstatsMsg.Add("Totalscore: %sumScore% Avg. Score: %avgScore% Avg. SPM: %avgSPM%");
this.m_lstServerstatsMsg.Add("Totalkills: %sumKills% Avg. Kills: %avgKills% Avg. KPM: %avgKPM%");
//Session
this.m_lstSessionMessage = new List();
this.m_lstSessionMessage.Add("%playerName%'s Session Data Session started %SessionStarted%");
this.m_lstSessionMessage.Add("Score: %playerScore% %playerKills% Kills %playerHeadshots% HS %playerDeaths% Deaths K/D: %playerKDR%");
this.m_lstSessionMessage.Add("Your Rank: %playerRank% (%RankDif%) Sessionlength: %SessionDuration% Minutes");
//Top10 Headers
this.m_strTop10Header = "Top 10 Player of the %serverName% Server";
this.m_strTop10RowFormat = "%Rank%. %playerName% Score: %playerScore% %playerKills% Kills %playerHeadshots% Headshots %playerDeaths% Deaths KDR: %playerKDR%";
this.m_strWeaponTop10Header = "Top 10 Player with %Weapon% of the %serverName%";
this.m_strWeaponTop10RowFormat = "%Rank%. %playerName% %playerKills% Kills %playerHeadshots% Headshots %playerDeaths% Deaths Headshotrate: %playerKHR%%";
//Top10 for Period
this.m_strTop10HeaderForPeriod = "Top 10 Player of the %serverName% Server over the last %intervaldays% days";
//Awards
this.m_lstAwardTable = new List();
this.m_lstAwardTable.Add("First");
this.m_lstAwardTable.Add("Second");
this.m_lstAwardTable.Add("Third");
this.m_lstAwardTable.Add("Purple_Heart");
this.m_lstAwardTable.Add("Best_Combat");
this.m_lstAwardTable.Add("Killstreak_5");
this.m_lstAwardTable.Add("Killstreak_10");
this.m_lstAwardTable.Add("Killstreak_15");
this.m_lstAwardTable.Add("Killstreak_20");
//ServerID
this.ServerID = 0;
//Tableconfig Tweaks for friendly weapon names
this.m_lstTableconfig = new List();
this.m_lstTableconfig.Add("870MCS{870,870MCS}");
this.m_lstTableconfig.Add("AEK-971{AEK,AEK971,AEK-971}");
this.m_lstTableconfig.Add("AKS-74u{AKSU,AKS-74,AKSU-74,AKS-74U}");
this.m_lstTableconfig.Add("AN-94 Abakan{ABAKAN,AN94,AN-94}");
this.m_lstTableconfig.Add("AS Val{ASVAL,AS-VAL,AS VAL}");
this.m_lstTableconfig.Add("DAO-12{DAO12,DAO,DAO-12}");
this.m_lstTableconfig.Add("death{DEATH}");
this.m_lstTableconfig.Add("Defib{DEFIBRILLATOR,DEFIB,PADDLE,PADDLES}");
this.m_lstTableconfig.Add("F2000{F2000}");
this.m_lstTableconfig.Add("FAMAS{FAMAS}");
this.m_lstTableconfig.Add("FGM-148{JAVELIN,FGM148,FGM-148}");
this.m_lstTableconfig.Add("FIM92{STINGER,FIM92,FIM-92}");
this.m_lstTableconfig.Add("Glock18{GLOCK,GLOCK18,GLOCK-18}");
this.m_lstTableconfig.Add("HK53{HK53,HK-53,G53,G-53,HK-G53}");
this.m_lstTableconfig.Add("jackhammer{JACKHAMMER,MK3A1,MK3}");
this.m_lstTableconfig.Add("JNG90{JNG-90,JNG90,JNG}");
this.m_lstTableconfig.Add("L96{L-96,L96}");
this.m_lstTableconfig.Add("LSAT{LSAT}");
this.m_lstTableconfig.Add("M416{M-416,M416}");
this.m_lstTableconfig.Add("M417{M-417,M417}");
this.m_lstTableconfig.Add("M1014{M-1014,1014,M1014}");
this.m_lstTableconfig.Add("M15 AT Mine{M15,M15 MINE,AT MINE,ATMINE,ATM,M15-ATM}");
this.m_lstTableconfig.Add("M16A4{M-16,M16,M16A3,M16-A3,M16A4,M16-A4}");
this.m_lstTableconfig.Add("M1911{1911,M1911}");
this.m_lstTableconfig.Add("M240{M-240,M240}");
this.m_lstTableconfig.Add("M249{M-249,M249,SAW}");
this.m_lstTableconfig.Add("M26Mass{M26,M-26,MASS,M26MASS}");
this.m_lstTableconfig.Add("M27IAR{M27,M-27,M27IAR}");
this.m_lstTableconfig.Add("M320{M-320,GRENADE LAUNCHER,M320}");
this.m_lstTableconfig.Add("M39{M-39,M39}");
this.m_lstTableconfig.Add("M40A5{M40,M-40,M40A5}");
this.m_lstTableconfig.Add("M4A1{M4,M-4,M4A1}");
this.m_lstTableconfig.Add("M60{M-60,M60}");
this.m_lstTableconfig.Add("M67{HANDGRENADE,GRENADE,M67,M-67}");
this.m_lstTableconfig.Add("M9{M-9,M9}");
this.m_lstTableconfig.Add("M93R{M93,M93R}");
this.m_lstTableconfig.Add("Medkit{MEDKIT}");
this.m_lstTableconfig.Add("MG36{MG-36,MG36}");
this.m_lstTableconfig.Add("Mk11{MK-11,MK11}");
this.m_lstTableconfig.Add("Model98B{M98,M98B,MODEL98,MODEL-98,MODEL98B,MODEL-98B}");
this.m_lstTableconfig.Add("MP7{MP-7,MP7}");
this.m_lstTableconfig.Add("Pecheneg{PKP-PECHENEG,PKP,PECHENEG}");
this.m_lstTableconfig.Add("PP-19{PP19,PP-19}");
this.m_lstTableconfig.Add("PP-2000{PP2000,PP-2000}");
this.m_lstTableconfig.Add("QBB-95{QBB,QBB95,QBB-95}");
this.m_lstTableconfig.Add("QBU-88{QBU,QBU88,QBU-88}");
this.m_lstTableconfig.Add("QBZ-95{QBZ,QBZ95,QBZ-95}");
this.m_lstTableconfig.Add("Repair Tool{REPAIRTOOL,TOOL,TORCH,BLOWTORCH}");
this.m_lstTableconfig.Add("RoadKill{ROADKILL}");
this.m_lstTableconfig.Add("RPG-7{RPG,RPG7,RPG7V2,RPG-7V2}");
this.m_lstTableconfig.Add("RPK-74M{RPK,RPK74,RPK-74,RPK74M,RPK-74M}");
this.m_lstTableconfig.Add("Weapons/SCAR-H/SCAR-H{SCAR,SCAR-H,SCARH}");
this.m_lstTableconfig.Add("SCAR-L{SCARL,SCAR-L}");
this.m_lstTableconfig.Add("SG 553 LB{SG553,SG-553,SG-553LB}");
this.m_lstTableconfig.Add("Siaga20k{SAIGA,SAIGA20K,SIAGA,SIAGA20K}");
this.m_lstTableconfig.Add("SKS{SKS}");
this.m_lstTableconfig.Add("SMAW{SMAW}");
this.m_lstTableconfig.Add("SPAS-12{SPAS12,SPAS,SPAS-12}");
this.m_lstTableconfig.Add("Suicide{SUICIDE}");
this.m_lstTableconfig.Add("SV98{SV-98,SV98}");
this.m_lstTableconfig.Add("SVD{SVD,DRAGUNOV}");
this.m_lstTableconfig.Add("Steyr AUG{STEYR,AUGA3,AUG-A3,AUG}");
this.m_lstTableconfig.Add("Taurus .44{TAURUS,.44MAGNUM,TAURUS.44,MAGNUM,.44}");
this.m_lstTableconfig.Add("Type88{TYPE88,TYPE-88}");
this.m_lstTableconfig.Add("USAS-12{USAS12,USAS}");
this.m_lstTableconfig.Add("Weapons/A91/A91{A91,A-91}");
this.m_lstTableconfig.Add("Weapons/AK74M/AK74{AK74,AK-74,AKM,AK-74M,AK74M}");
this.m_lstTableconfig.Add("Weapons/G36C/G36C{G36,G36C,G-36,G-36C}");
this.m_lstTableconfig.Add("Weapons/G3A3/G3A3{G3,G-3,G3A3,G3-A3}");
this.m_lstTableconfig.Add("Weapons/Gadgets/C4/C4{C4,C-4}");
this.m_lstTableconfig.Add("Weapons/Gadgets/Claymore/Claymore{CLAYMORE,LANDMINE,APMINE,AP-MINE,APM,M18,M-18,M18-CLAYMORE}");
this.m_lstTableconfig.Add("Weapons/KH2002/KH2002{KH2002,KH-2002}");
this.m_lstTableconfig.Add("Weapons/Knife/Knife{KNIFE,MELEE}");
this.m_lstTableconfig.Add("Weapons/MagpulPDR/MagpulPDR{PDW-R,PDWR,PDR,PDW}");
this.m_lstTableconfig.Add("Weapons/MP412Rex/MP412REX{MP412REX,REX,MP-412,MP412}");
this.m_lstTableconfig.Add("Weapons/MP443/MP443{MP-443,MP443,GRACH}");
this.m_lstTableconfig.Add("Weapons/P90/P90{P-90,P90}");
this.m_lstTableconfig.Add("Weapons/Sa18IGLA/Sa18IGLA{SA18,SA-18,IGLA,SA18IGLA,SA18-IGLA,SA-18IGLA}");
this.m_lstTableconfig.Add("Weapons/UMP45/UMP45{UMP45,UMP-45,UMP}");
this.m_lstTableconfig.Add("Weapons/XP1_L85A2/L85A2{L85,L85A2,L-85,L-85A2,L85-A2}");
this.m_lstTableconfig.Add("Weapons/XP2_ACR/ACR{ACWR,ACW-R,ACR,AC-R}");
this.m_lstTableconfig.Add("Weapons/XP2_L86/L86{L86,L86A2,L-86,L-86A2,L86-A2}");
this.m_lstTableconfig.Add("Weapons/XP2_MP5K/MP5K{MP5,MP5K,M5K,MP-5,MP-5K,M5-K}");
this.m_lstTableconfig.Add("Weapons/XP2_MTAR/MTAR{MTAR,MTAR21,MTAR-21}");
//ServerInfo Event fix
this.dtLastServerInfoEvent = DateTime.Now;
this.minIntervalllenght = 60;
//Double Roundendfix
this.dtLastRoundendEvent = DateTime.MinValue;
this.dtLastOnListPlayersEvent = DateTime.MinValue;
//Top10 for Period
this.m_intDaysForPeriodTop10 = 7;
//New In-Game Command System
this.m_IngameCommands_stats = "stats,rank";
this.m_IngameCommands_serverstats = "serverstats";
this.m_IngameCommands_session = "session";
this.m_IngameCommands_dogtags = "dogtags";
this.m_IngameCommands_top10 = "top10";
this.m_IngameCommands_playerOfTheDay = "playeroftheday,potd";
this.m_IngameCommands_top10ForPeriod = "weektop10,wtop10";
}
#endregion
#region PluginSetup
public string GetPluginName()
{
return "PRoCon Chat, GUID, Stats and Map Logger";
}
public string GetPluginVersion()
{
return "1.0.0.3";
}
public string GetPluginAuthor()
{
return "[GWC]XpKiller";
}
public string GetPluginWebsite()
{
return "www.german-wildcards.de";
}
public string GetPluginDescription()
{
return @"
If you like my Plugins, please feel free to donate
Description
This plugin is used to log player chat, player GUID's, player Stats, Weaponstats and Mapstats.
This inludes: Chat, PBGUID, EAGUID, IP, Stats, Weaponstats, Dogtags, Killstreaks, Country, ClanTag, ... to be continued.. ;-)
Requirements
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!!!)
Also you should give INNODB some more Ram because the plugin mainly uses this engine if you need help feel free to ask me
The Plugin will create the tables by itself.
Pls Give FEEDBACK !!!
Installation
Download and install this plugin
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
I recommend MySQL 5.1.x, 5.5.x or greater (5.0.x could work too, not tested) Important: Your database need INNODB Support
Start Procon
Go to Tools --> Options --> Plugins --> Enter you databaseserver under outgoing Connections and allow all outgoing connections
Restart Procon
Enter your settings into Plugin Settings and THEN enable the plugin
Now the plugin should work if not request help in the Forum
Things you have to know:
You can add additional Names for weapons in the Pluginsettings
Use comma to seperate the words.
Example: M16A4{M16} --> 40MMGL{M16,M16A3}
Ingame Commands (defaults!)
[@,#,!]stats
Tells the Player their own Serverstats
[@,#,!]rank
Tells the Player their own Serverstats
[@,#,!]potd
Show up the player of the day
[@,#,!]playeroftheday
Show up the player of the day
[@,#,!]session
Tells the Player their own Sessiondata
[@,#,!]top10
Tells the Player the Top10 players of the server
[@,#,!]wtop10
Tells the Player the Top10 players of the server for specific period
[@,#,!]weektop10
Tells the Player the Top10 players of the server for specific period
[@,#,!]stats WeaponName
Tells the Player their own Weaponstats for the specific Weapon
[@,#,!]rank WeaponName
Privately Tells the Player their own Weaponstats for the specific Weapon
[@,#,!]top10 WeaponName
Privately Tells the Player the Top10 Player for the specific Weapon of the server
[@,#,!]dogtags WeaponName
Privately Tells the Player his Dogtagstats
[@,#,!]serverstats
Tells the Player the Serverstats
Replacement Strings for Playerstats and Player of the day
Replacement String | Effect |
%playerName% | Will be replaced by the player's name |
%playerScore% | Will be replaced by the player's totalscore on this server |
%SPM% | Will be replaced by the Player's score per minute on this server |
%playerKills% | Will be replaced by the player's totalkills on this server |
%playerHeadshots% | Will be replaced by the player's totalheadshots on this server |
%playerDeaths% | Will be replaced by the player's totaldeaths on this server |
%playerKDR% | Will be replaced by the player's kill death ratio on this server |
%playerSucide% | Will be replaced by the player's sucides on this server |
%playerPlaytime% | Will be replaced by the player's totalplaytime on this server in hh:mm:ss format |
%rounds% | Will be replaced by the player's totalrounds played on this server |
%playerRank% | Will be replaced by the player's concurrent serverrank |
%allRanks% | Will be replaced by the player's concurrent serverrank |
%killstreak% | Will be replaced by the player's best Killstreak |
%deathstreak% | Will be replaced by the player's worst Deathstreak |
Replacement Strings for Top10
Replacement String | Effect |
%serverName% | Will be replaced by the Server name (Header only) |
%Rank% | Will be replaced by the player's rank |
%playerName% | Will be replaced by the player's name |
%playerScore% | Will be replaced by the player's totalscore on this server |
%playerKills% | Will be replaced by the player's totalkills on this server |
%playerHeadshots% | Will be replaced by the player's totalheadshots on this server |
%playerDeaths% | Will be replaced by the player's totaldeaths on this server |
%playerKDR% | Will be replaced by the player's kill death ratio on this server |
%playerKHR% | Will be replaced by the player's Headshot Kill ratio on this server |
%intervaldays% | Will be replaced interval of days (top10 for a period only) |
Replacement Strings for Weaponstats
Replacement String | Effect |
%playerName% | Will be replaced by the player's name |
%playerKills% | Will be replaced by the player's Totalkills on this server with the specific Weapon |
%playerHeadshots% | Will be replaced by the player's Totalheadshotkills on this server the specific Weapon |
%playerDeaths% | Will be replaced by the player's totaldeaths on this server caused by this specific Weapon |
%playerKHR% | Will be replaced by the player's Headshotkill ratio on this server with the specific Weapon |
%playerKDR% | Will be replaced by the player's kill death ratio on this server with the specific Weapon |
%playerRank% | Will be replaced by the player's current Serverrank for the specific Weapon |
%allRanks% | Will be replaced by current Number of Player in Serverrank for the specific Weapon |
%killstreak% | Will be replaced by the player's best Killstreak |
%deathstreak% | Will be replaced by the player's worst Deathstreak |
Replacement Strings for serverstats
Replacement String | Effect |
%countPlayer% | Will be replaced by the number of unique players on this server |
%sumScore% | Will be replaced by the Totalscore of all players combined on this server |
%sumKills% | Will be replaced by the Totalkills of all players combined on this server |
%sumHeadshots% | Will be replaced by the TotalHeadshots of all players combined on this server |
%sumDeaths% | Will be replaced by the Totaldeaths of all players combined on this server |
%sumTKs% | Will be replaced by the TotalTeamkills of all players combined on this server |
%sumRounds% | Will be replaced by the Totalrounds of all players combined on this server |
%sumSuicide% | Will be replaced by the Totalsuicide of all players combined on this server |
%avgScore% | Will be replaced by the average score of all players combined on this server |
%avgKills% | Will be replaced by the average kills of all players combined on this server |
%avgHeadshots% | Will be replaced by the average Headshots of all players combined on this server |
%avgDeaths% | Will be replaced by the average deaths of all players combined on this server |
%avgTKs% | Will be replaced by the average teamkills of all players combined on this server |
%avgSuicide | Will be replaced by the average suicides of all players combined on this server |
%avgRounds% | Will be replaced by the average rounds of all players combined on this server |
%avgSPM% | Will be replaced by the average Score per Minute of all players combined on this server |
%avgKPM% | Will be replaced by the average Kills per Minute of all players combined on this server |
%avgHPM% | Will be replaced by the average Headshots per Minute of all players combined on this server |
%avgHPK% | Will be replaced by the average Headshots per Kills (unit procent (%)) of all players combined on this server |
%sumPlaytime% | Will be replaced by the Total Playtime (format: dd:hh:mm:ss) of all players combined on this server |
%avgPlaytime% | Will be replaced by the average Playtime (format: dd:hh:mm:ss) of all players combined on this server |
%sumPlaytimeHours% | Will be replaced by the Total Playtime (format rounded hours) of all players combined on this server |
%avgPlaytimeHours% | Will be replaced by the average Playtime (format rounded hours) of all players combined on this server |
%sumPlaytimeDays% | Will be replaced by the Total Playtime (format rounded days) of all players combined on this server |
%avgPlaytimeDays% | Will be replaced by the average Playtime (format rounded days) of all players combined on this server |
Replacement Strings for PlayerSession
Replacement String | Effect |
%playerName% | Will be replaced by the player's name |
%playerScore% | Will be replaced by the player's totalscore of the concurrent Session |
%playerKills% | Will be replaced by the player's totalkills of the concurrent Session |
%playerHeadshots% | Will be replaced by the player's totalheadshots of the concurrent Session |
%playerDeaths% | Will be replaced by the player's totaldeaths of the concurrent Session |
%playerKDR% | Will be replaced by the player's kill death ratio of the concurrent Session |
%playerSucide% | Will be replaced by the player's sucides of the concurrent Session |
%SessionDuration% | Will be replaced by the player's totalplaytime of the concurrent Session in Minutes |
%playerRank% | Will be replaced by the player's concurrent serverrank |
%RankDif% | Will be replaced by the player's rank change |
%SessionStarted% | Will be replaced by the player's start of the Session |
%killstreak% | Will be replaced by the player's best Killstreak of the Session |
%deathstreak% | Will be replaced by the player's worst Deathstreak of the Session |
How to yell/say messages
Every ingame messages can be yelled to the Player.
Just add the yelltag in front of every line of you message which should be yelled.
Usage:[yell,duration in seconds]Your messages
Like:[yell,3]Welcome on our server!
This would be yell for 3 seconds
Hint: You can mixed normal say and yell without any problems.
Messages without Tag will will be transmitted with the say command.
NOTE:
Tracked stats are: Kills, Headshots, Deaths, All Weapons, TKs, Suicides, Score, Playtime, Rounds, MapStats, Dogtags
The Rank is created dynamical from Query in my opinion much better than write it back to database.
The Stats are written to the Database at the end of the round
Known issues:
Vehicles cannot be tracked due limitations in the Rcon Protocol blame EA/Dice for it
Changelog:
1.0.0.2
Bugfixes for column errors.
Bugfixes for the sessions streaming bug
Weaponstats working again.
Bugfix for Identifier name is too long.
1.0.0.1
Bugfixes for value too long for column errors.
Bugfixes for some other bugs
Changed deprecated Tracemessages
Added an error prefix in pluginlog
New feature: Tickets/teamscores are now tracked in tbl_teamscores
New feature: Simple Stats (collects playerdata only)
New feature: Switch for disabling weaponstats
1.0.0.0
First Release
Multigame Support
";
}
public void OnPluginLoadingEnv(List lstPluginEnv)
{
this.strServerGameType = lstPluginEnv[1].ToUpper();
}
public void OnPluginLoaded(string strHostName, string strPort, string strPRoConVersion)
{
this.m_strHostName = strHostName;
this.m_strPort = strPort;
this.m_strPRoConVersion = strPRoConVersion;
this.RegisterEvents(this.GetType().Name, "OnListPlayers", "OnPlayerAuthenticated", "OnPlayerJoin", "OnGlobalChat", "OnTeamChat", "OnSquadChat", "OnPunkbusterMessage", "OnPunkbusterPlayerInfo", "OnServerInfo", "OnLevelLoaded",
"OnPlayerKilled", "OnPlayerLeft", "OnRoundOverPlayers", "OnPlayerSpawned", "OnLoadingLevel", "OnCommandStats", "OnCommandTop10", "OnCommandDogtags", "OnCommandServerStats",
"OnRoundStartPlayerCount", "OnRoundRestartPlayerCount", "OnRoundOver");
// Register the logger status match command
// This command can be called for status whether logger is enabled or not
this.RegisterCommand(loggerStatusCommand);
}
public void OnPluginEnable()
{
isStreaming = true;
this.serverName = String.Empty;
this.ExecuteCommand("procon.protected.pluginconsole.write", "^bPRoCon Chat, GUID and Stats Logger ^2Enabled");
this.Spamprotection = new CSpamprotection(numberOfAllowedRequests);
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");
// Register Commands
this.m_isPluginEnabled = true;
this.prepareTablenames();
this.setGameMod();
this.MyDateTime = new myDateTime_W(this.m_dTimeOffset);
//Webrequest
if (this.m_enWebrequest == enumBoolYesNo.Yes)
{
//this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger", "30", (this.m_requestIntervall * 60).ToString(), "-1", "procon.protected.plugins.call", "CChatGUIDStatsLogger", "Threadstarter_Webrequest");
}
this.RegisterAllCommands();
this.generateWeaponList();
//Start intial tablebuilder thread
ThreadPool.QueueUserWorkItem(delegate { this.tablebuilder(); });
}
public void OnPluginDisable()
{
isStreaming = false;
if (MySqlCon != null)
if (MySqlCon.State == ConnectionState.Open)
{
try
{
MySqlCon.Close();
}
catch { }
}
if (MySqlConn != null)
if (MySqlConn.State == ConnectionState.Open)
{
try
{
MySqlConn.Close();
}
catch { }
}
//Destroying all current Coonection Pool if availble:
try
{
MySqlConnection.ClearAllPools();
}
catch { }
this.ExecuteCommand("procon.protected.pluginconsole.write", "^bPRoCon Chat, GUID and Stats Logger ^1Disabled");
//Unregister Commands
this.m_isPluginEnabled = false;
//Webrequest
this.ExecuteCommand("procon.protected.tasks.remove", "CChatGUIDStatsLogger");
this.UnregisterAllCommands();
}
// Lists only variables you want shown.. for instance enabling one option might hide another option
// It's the best I got until I implement a way for plugins to display their own small interfaces.
public List GetDisplayPluginVariables()
{
List lstReturn = new List();
lstReturn.Add(new CPluginVariable("Server Details|Host", this.m_strHost.GetType(), this.m_strHost));
lstReturn.Add(new CPluginVariable("Server Details|Port", this.m_strDBPort.GetType(), this.m_strDBPort));
lstReturn.Add(new CPluginVariable("Server Details|Database Name", this.m_strDatabase.GetType(), this.m_strDatabase));
lstReturn.Add(new CPluginVariable("Server Details|UserName", this.m_strUserName.GetType(), this.m_strUserName));
lstReturn.Add(new CPluginVariable("Server Details|Password", this.m_strPassword.GetType(), this.m_strPassword));
if (this.m_connectionPooling == enumBoolOnOff.Off)
{
lstReturn.Add(new CPluginVariable("Server Details|High performance mode(no connection limit!)", typeof(enumBoolOnOff), this.m_highPerformanceConnectionMode));
}
lstReturn.Add(new CPluginVariable("Server Details|Connection Pooling", typeof(enumBoolOnOff), this.m_connectionPooling));
if (this.m_connectionPooling == enumBoolOnOff.On)
{
lstReturn.Add(new CPluginVariable("Server Details|Min Connection Pool Size", this.m_minPoolSize.GetType(), this.m_minPoolSize));
lstReturn.Add(new CPluginVariable("Server Details|Max Connection Pool Size", this.m_maxPoolSize.GetType(), this.m_maxPoolSize));
}
lstReturn.Add(new CPluginVariable("Server Details|Failed Transaction retry attempts", this.TransactionRetryCount.GetType(), this.TransactionRetryCount));
lstReturn.Add(new CPluginVariable("Server Details|Minimum time(sec) between ServerInfo Updates", this.minIntervalllenght.GetType(), this.minIntervalllenght));
lstReturn.Add(new CPluginVariable("Chatlogging|Enable Chatlogging?", typeof(enumBoolYesNo), this.m_enChatloggingON));
if (this.m_enChatloggingON == enumBoolYesNo.Yes)
{
lstReturn.Add(new CPluginVariable("Chatlogging|Log ServerSPAM?", typeof(enumBoolYesNo), this.m_enNoServerMsg));
lstReturn.Add(new CPluginVariable("Chatlogging|Instant Logging of Chat Messages?", typeof(enumBoolYesNo), this.m_enInstantChatlogging));
lstReturn.Add(new CPluginVariable("Chatlogging|Enable chatlog filter(Regex)?", typeof(enumBoolYesNo), this.m_enChatlogFilter));
if (this.m_enChatlogFilter == enumBoolYesNo.Yes)
{
this.lstStrChatFilterRules = new List(this.ListReplace(this.lstStrChatFilterRules, "|", "|"));
this.lstStrChatFilterRules = this.ListReplace(this.lstStrChatFilterRules, "+", "+");
lstReturn.Add(new CPluginVariable("Chatlogging|Chatfilterrules(Regex)", typeof(string[]), this.lstStrChatFilterRules.ToArray()));
}
}
lstReturn.Add(new CPluginVariable("Stats|Enable Statslogging?", typeof(enumBoolYesNo), this.m_enLogSTATS));
if (this.m_enLogSTATS == enumBoolYesNo.Yes)
{
lstReturn.Add(new CPluginVariable("Stats|Enable Weaponstats?", typeof(enumBoolYesNo), this.m_weaponstatsON));
lstReturn.Add(new CPluginVariable("Stats|Ranking by Score?", typeof(enumBoolYesNo), this.m_enRankingByScore));
lstReturn.Add(new CPluginVariable("Stats|Enable ingame commands?", typeof(enumBoolYesNo), this.m_enableInGameCommands));
lstReturn.Add(new CPluginVariable("Stats|Overall ranking(merged Serverranking)", typeof(enumBoolYesNo), this.m_enOverallRanking));
lstReturn.Add(new CPluginVariable("Stats|Server group (0 - 128)", this.intServerGroup.GetType(), this.intServerGroup));
lstReturn.Add(new CPluginVariable("Stats|Send Stats to all Players?", typeof(enumBoolYesNo), this.m_enSendStatsToAll));
lstReturn.Add(new CPluginVariable("Stats|Enable KDR correction?", typeof(enumBoolYesNo), this.m_kdrCorrection));
lstReturn.Add(new CPluginVariable("Stats|PlayerMessage", typeof(string[]), this.m_lstPlayerStatsMessage.ToArray()));
//Player of the day
lstReturn.Add(new CPluginVariable("Stats|Player of the day Message", typeof(string[]), this.m_lstPlayerOfTheDayMessage.ToArray()));
lstReturn.Add(new CPluginVariable("Stats|Weaponstats Message ", typeof(string[]), this.m_lstWeaponstatsMsg.ToArray()));
//Serverstats
lstReturn.Add(new CPluginVariable("Stats|Serverstats Message", typeof(string[]), this.m_lstServerstatsMsg.ToArray()));
lstReturn.Add(new CPluginVariable("Stats|Enable Livescoreboard in DB?", typeof(enumBoolYesNo), this.m_enableCurrentPlayerstatsTable));
//Simplestats
lstReturn.Add(new CPluginVariable("Stats|Log playerdata only (no playerstats)?", typeof(enumBoolYesNo), this.m_enLogPlayerDataOnly));
//lstReturn.Add(new CPluginVariable("Stats|Awards ON?", typeof(enumBoolYesNo), this.m_awardsON));
lstReturn.Add(new CPluginVariable("WelcomeStats|Enable Welcomestats?", typeof(enumBoolYesNo), this.m_enWelcomeStats));
if (this.m_enWelcomeStats == enumBoolYesNo.Yes)
{
//lstReturn.Add(new CPluginVariable("WelcomeStats|Yell Welcome Message(not the stats)?", typeof(enumBoolYesNo), this.m_enYellWelcomeMSG));
//lstReturn.Add(new CPluginVariable("WelcomeStats|Welcome Message", this.m_strPlayerWelcomeMsg.GetType(), this.m_strPlayerWelcomeMsg));
lstReturn.Add(new CPluginVariable("WelcomeStats|Welcome Message", typeof(string[]), this.m_lstPlayerWelcomeStatsMessage.ToArray()));
lstReturn.Add(new CPluginVariable("WelcomeStats|Welcome Message for new Player", typeof(string[]), this.m_lstNewPlayerWelcomeMsg.ToArray()));
lstReturn.Add(new CPluginVariable("WelcomeStats|Welcomestats Delay", this.int_welcomeStatsDelay.GetType(), this.int_welcomeStatsDelay));
}
//top10
lstReturn.Add(new CPluginVariable("Stats|Top10 ingame", this.m_enTop10ingame.GetType(), this.m_enTop10ingame));
if (this.m_enTop10ingame == enumBoolYesNo.Yes)
{
lstReturn.Add(new CPluginVariable("Stats|Top10 header line", this.m_strTop10Header.GetType(), this.m_strTop10Header));
lstReturn.Add(new CPluginVariable("Stats|Top10 row format", this.m_strTop10RowFormat.GetType(), this.m_strTop10RowFormat));
//top10 for period
lstReturn.Add(new CPluginVariable("Stats|Top10 for period header line", this.m_strTop10HeaderForPeriod.GetType(), this.m_strTop10HeaderForPeriod));
lstReturn.Add(new CPluginVariable("Stats|Top10 for period interval days", this.m_intDaysForPeriodTop10.GetType(), this.m_intDaysForPeriodTop10));
//Weapontop10
lstReturn.Add(new CPluginVariable("Stats|WeaponTop10 header line", this.m_strWeaponTop10Header.GetType(), this.m_strWeaponTop10Header));
lstReturn.Add(new CPluginVariable("Stats|WeaponTop10 row format", this.m_strWeaponTop10RowFormat.GetType(), this.m_strWeaponTop10RowFormat));
}
}
lstReturn.Add(new CPluginVariable("Debug|DebugLevel", "enum.Actions(Trace|Info|Warning|Error)", this.GlobalDebugMode));
lstReturn.Add(new CPluginVariable("Table|Keywordlist", typeof(string[]), this.m_lstTableconfig.ToArray()));
lstReturn.Add(new CPluginVariable("Table|tableSuffix", this.tableSuffix.GetType(), this.tableSuffix));
lstReturn.Add(new CPluginVariable("MapStats|MapStats ON?", typeof(enumBoolYesNo), this.m_mapstatsON));
lstReturn.Add(new CPluginVariable("Session|Session ON?", typeof(enumBoolYesNo), this.m_sessionON));
lstReturn.Add(new CPluginVariable("Session|SessionMessage", typeof(string[]), this.m_lstSessionMessage.ToArray()));
lstReturn.Add(new CPluginVariable("Session|Save Sessiondata to DB?", typeof(enumBoolYesNo), this.m_enSessionTracking));
lstReturn.Add(new CPluginVariable("FloodProtection|Playerrequests per Round", this.numberOfAllowedRequests.GetType(), this.numberOfAllowedRequests));
lstReturn.Add(new CPluginVariable("TimeOffset|Servertime Offset", this.m_dTimeOffset.GetType(), this.m_dTimeOffset));
//Ingame Command Setup
/*
this.m_IngameCommands_stats = "stats,rank";
this.m_IngameCommands_serverstats = "serverstats";
this.m_IngameCommands_session = "session";
this.m_IngameCommands_dogtags = "dogtags";
this.m_IngameCommands_top10 = "top10";
this.m_IngameCommands_playerOfTheDay = "playeroftheday,potd";
this.m_IngameCommands_top10ForPeriod = "weektop10,wtop10";
*/
lstReturn.Add(new CPluginVariable("Ingame Command Setup|Stats Command:", this.m_IngameCommands_stats.GetType(), this.m_IngameCommands_stats));
lstReturn.Add(new CPluginVariable("Ingame Command Setup|ServerStats Command:", this.m_IngameCommands_serverstats.GetType(), this.m_IngameCommands_serverstats));
lstReturn.Add(new CPluginVariable("Ingame Command Setup|Session Command:", this.m_IngameCommands_session.GetType(), this.m_IngameCommands_session));
lstReturn.Add(new CPluginVariable("Ingame Command Setup|Dogtags Command:", this.m_IngameCommands_dogtags.GetType(), this.m_IngameCommands_dogtags));
lstReturn.Add(new CPluginVariable("Ingame Command Setup|Top10 Command:", this.m_IngameCommands_top10.GetType(), this.m_IngameCommands_top10));
lstReturn.Add(new CPluginVariable("Ingame Command Setup|Player Of The Day Command:", this.m_IngameCommands_playerOfTheDay.GetType(), this.m_IngameCommands_playerOfTheDay));
lstReturn.Add(new CPluginVariable("Ingame Command Setup|Top10 for period Command:", this.m_IngameCommands_top10ForPeriod.GetType(), this.m_IngameCommands_top10ForPeriod));
//lstReturn.Add(new CPluginVariable("BFBCS|Fetch Stats from BFBCS", typeof(enumBoolYesNo), this.m_getStatsfromBFBCS));
if (this.m_getStatsfromBFBCS == enumBoolYesNo.Yes)
{
//lstReturn.Add(new CPluginVariable("BFBCS|Updateinterval (hours)", this.BFBCS_UpdateInterval.GetType(), this.BFBCS_UpdateInterval));
//lstReturn.Add(new CPluginVariable("BFBCS|Request Packrate", this.BFBCS_Min_Request.GetType(), this.BFBCS_Min_Request));
//lstReturn.Add(new CPluginVariable("Cheaterprotection|Statsbased Protection", typeof(enumBoolYesNo), this.m_cheaterProtection));
//lstReturn.Add(new CPluginVariable("Ranklimiter|Ranklimiter ON?", typeof(enumBoolYesNo), this.m_enRanklimiter));
}
/*
lstReturn.Add(new CPluginVariable("Webrequest|Periodical Webrequest On?(P&S Stats)", typeof(enumBoolYesNo), this.m_enWebrequest));
if (this.m_enWebrequest == enumBoolYesNo.Yes)
{
lstReturn.Add(new CPluginVariable("Webrequest|Webaddress", this.m_webAddress.GetType(), this.m_webAddress));
lstReturn.Add(new CPluginVariable("Webrequest|Webrequest Intervall", this.m_requestIntervall.GetType(), this.m_requestIntervall));
}
*/
return lstReturn;
}
// Lists all of the plugin variables.
public List GetPluginVariables()
{
List lstReturn = new List();
lstReturn.Add(new CPluginVariable("Host", this.m_strHost.GetType(), this.m_strHost));
lstReturn.Add(new CPluginVariable("Port", this.m_strDBPort.GetType(), this.m_strDBPort));
lstReturn.Add(new CPluginVariable("Database Name", this.m_strDatabase.GetType(), this.m_strDatabase));
lstReturn.Add(new CPluginVariable("UserName", this.m_strUserName.GetType(), this.m_strUserName));
lstReturn.Add(new CPluginVariable("Password", this.m_strPassword.GetType(), this.m_strPassword));
if (this.m_connectionPooling == enumBoolOnOff.Off)
{
lstReturn.Add(new CPluginVariable("High performance mode(no connection limit!)", typeof(enumBoolOnOff), this.m_highPerformanceConnectionMode));
}
lstReturn.Add(new CPluginVariable("Connection Pooling", typeof(enumBoolOnOff), this.m_connectionPooling));
if (this.m_connectionPooling == enumBoolOnOff.On)
{
lstReturn.Add(new CPluginVariable("Min Connection Pool Size", this.m_minPoolSize.GetType(), this.m_minPoolSize));
lstReturn.Add(new CPluginVariable("Max Connection Pool Size", this.m_maxPoolSize.GetType(), this.m_maxPoolSize));
}
lstReturn.Add(new CPluginVariable("Failed Transaction retry attempts", this.TransactionRetryCount.GetType(), this.TransactionRetryCount));
lstReturn.Add(new CPluginVariable("Minimum time(sec) between ServerInfo Updates", this.minIntervalllenght.GetType(), this.minIntervalllenght));
// Switch for Stats Logging
lstReturn.Add(new CPluginVariable("Enable Chatlogging?", typeof(enumBoolYesNo), this.m_enChatloggingON));
if (this.m_enChatloggingON == enumBoolYesNo.Yes)
{
lstReturn.Add(new CPluginVariable("Log ServerSPAM?", typeof(enumBoolYesNo), this.m_enNoServerMsg));
lstReturn.Add(new CPluginVariable("Instant Logging of Chat Messages?", typeof(enumBoolYesNo), this.m_enInstantChatlogging));
lstReturn.Add(new CPluginVariable("Enable chatlog filter(Regex)?", typeof(enumBoolYesNo), this.m_enChatlogFilter));
if (this.m_enChatlogFilter == enumBoolYesNo.Yes)
{
this.lstStrChatFilterRules = new List(this.ListReplace(this.lstStrChatFilterRules, "|", "|"));
this.lstStrChatFilterRules = this.ListReplace(this.lstStrChatFilterRules, "+", "+");
lstReturn.Add(new CPluginVariable("Chatfilterrules(Regex)", typeof(string[]), this.lstStrChatFilterRules.ToArray()));
}
}
lstReturn.Add(new CPluginVariable("Enable Statslogging?", typeof(enumBoolYesNo), this.m_enLogSTATS));
lstReturn.Add(new CPluginVariable("Enable Weaponstats?", typeof(enumBoolYesNo), this.m_weaponstatsON));
//lstReturn.Add(new CPluginVariable("Update EA GUID?", typeof(enumBoolYesNo), this.m_UpdateEA_GUID));
//lstReturn.Add(new CPluginVariable("Update PB-GUID (NOT recommended!!!)?", typeof(enumBoolYesNo), this.m_UpdatePB_GUID));
lstReturn.Add(new CPluginVariable("Ranking by Score?", typeof(enumBoolYesNo), this.m_enRankingByScore));
lstReturn.Add(new CPluginVariable("Enable ingame commands?", typeof(enumBoolYesNo), this.m_enableInGameCommands));
lstReturn.Add(new CPluginVariable("Overall ranking(merged Serverranking)", typeof(enumBoolYesNo), this.m_enOverallRanking));
lstReturn.Add(new CPluginVariable("Server group (0 - 128)", this.intServerGroup.GetType(), this.intServerGroup));
lstReturn.Add(new CPluginVariable("Send Stats to all Players?", typeof(enumBoolYesNo), this.m_enSendStatsToAll));
lstReturn.Add(new CPluginVariable("Enable Livescoreboard in DB?", typeof(enumBoolYesNo), this.m_enableCurrentPlayerstatsTable));
lstReturn.Add(new CPluginVariable("Enable KDR correction?", typeof(enumBoolYesNo), this.m_kdrCorrection));
lstReturn.Add(new CPluginVariable("PlayerMessage", typeof(string[]), this.m_lstPlayerStatsMessage.ToArray()));
//Player of the day
lstReturn.Add(new CPluginVariable("Player of the day Message", typeof(string[]), this.m_lstPlayerOfTheDayMessage.ToArray()));
lstReturn.Add(new CPluginVariable("Weaponstats Message ", typeof(string[]), this.m_lstWeaponstatsMsg.ToArray()));
//Serverstats
lstReturn.Add(new CPluginVariable("Serverstats Message", typeof(string[]), this.m_lstServerstatsMsg.ToArray()));
lstReturn.Add(new CPluginVariable("Awards ON?", typeof(enumBoolYesNo), this.m_awardsON));
lstReturn.Add(new CPluginVariable("Enable Welcomestats?", typeof(enumBoolYesNo), this.m_enWelcomeStats));
lstReturn.Add(new CPluginVariable("Yell Welcome Message(not the stats)?", typeof(enumBoolYesNo), this.m_enYellWelcomeMSG));
lstReturn.Add(new CPluginVariable("Welcome Message", typeof(string[]), this.m_lstPlayerWelcomeStatsMessage.ToArray()));
lstReturn.Add(new CPluginVariable("Welcome Message for new Player", typeof(string[]), this.m_lstNewPlayerWelcomeMsg.ToArray()));
lstReturn.Add(new CPluginVariable("Welcomestats Delay", this.int_welcomeStatsDelay.GetType(), this.int_welcomeStatsDelay));
lstReturn.Add(new CPluginVariable("Top10 ingame", this.m_enTop10ingame.GetType(), this.m_enTop10ingame));
lstReturn.Add(new CPluginVariable("Top10 header line", this.m_strTop10Header.GetType(), this.m_strTop10Header));
lstReturn.Add(new CPluginVariable("Top10 row format", this.m_strTop10RowFormat.GetType(), this.m_strTop10RowFormat));
//top10 for period
lstReturn.Add(new CPluginVariable("Top10 for period header line", this.m_strTop10HeaderForPeriod.GetType(), this.m_strTop10HeaderForPeriod));
lstReturn.Add(new CPluginVariable("Top10 for period interval days", this.m_intDaysForPeriodTop10.GetType(), this.m_intDaysForPeriodTop10));
//Weapontop10
lstReturn.Add(new CPluginVariable("WeaponTop10 header line", this.m_strWeaponTop10Header.GetType(), this.m_strWeaponTop10Header));
lstReturn.Add(new CPluginVariable("WeaponTop10 row format", this.m_strWeaponTop10RowFormat.GetType(), this.m_strWeaponTop10RowFormat));
//
lstReturn.Add(new CPluginVariable("DebugLevel", "enum.Actions(Trace|Info|Warning|Error)", this.GlobalDebugMode));
lstReturn.Add(new CPluginVariable("Keywordlist", typeof(string[]), this.m_lstTableconfig.ToArray()));
lstReturn.Add(new CPluginVariable("tableSuffix", this.tableSuffix.GetType(), this.tableSuffix));
lstReturn.Add(new CPluginVariable("MapStats ON?", typeof(enumBoolYesNo), this.m_mapstatsON));
lstReturn.Add(new CPluginVariable("Session ON?", typeof(enumBoolYesNo), this.m_sessionON));
lstReturn.Add(new CPluginVariable("SessionMessage", typeof(string[]), this.m_lstSessionMessage.ToArray()));
lstReturn.Add(new CPluginVariable("Save Sessiondata to DB?", typeof(enumBoolYesNo), this.m_enSessionTracking));
lstReturn.Add(new CPluginVariable("Playerrequests per Round", this.numberOfAllowedRequests.GetType(), this.numberOfAllowedRequests));
lstReturn.Add(new CPluginVariable("Servertime Offset", this.m_dTimeOffset.GetType(), this.m_dTimeOffset));
//Ingame Command Setup
/*
this.m_IngameCommands_stats = "stats,rank";
this.m_IngameCommands_serverstats = "serverstats";
this.m_IngameCommands_session = "session";
this.m_IngameCommands_dogtags = "dogtags";
this.m_IngameCommands_top10 = "top10";
this.m_IngameCommands_playerOfTheDay = "playeroftheday,potd";
this.m_IngameCommands_top10ForPeriod = "weektop10,wtop10";
*/
lstReturn.Add(new CPluginVariable("Stats Command:", this.m_IngameCommands_stats.GetType(), this.m_IngameCommands_stats));
lstReturn.Add(new CPluginVariable("ServerStats Command:", this.m_IngameCommands_serverstats.GetType(), this.m_IngameCommands_serverstats));
lstReturn.Add(new CPluginVariable("Session Command:", this.m_IngameCommands_session.GetType(), this.m_IngameCommands_session));
lstReturn.Add(new CPluginVariable("Dogtags Command:", this.m_IngameCommands_dogtags.GetType(), this.m_IngameCommands_dogtags));
lstReturn.Add(new CPluginVariable("Top10 Command:", this.m_IngameCommands_top10.GetType(), this.m_IngameCommands_top10));
lstReturn.Add(new CPluginVariable("Player Of The Day Command:", this.m_IngameCommands_playerOfTheDay.GetType(), this.m_IngameCommands_playerOfTheDay));
lstReturn.Add(new CPluginVariable("Top10 for period Command:", this.m_IngameCommands_top10ForPeriod.GetType(), this.m_IngameCommands_top10ForPeriod));
lstReturn.Add(new CPluginVariable("Periodical Webrequest On?(P&S Stats)", typeof(enumBoolYesNo), this.m_enWebrequest));
if (this.m_enWebrequest == enumBoolYesNo.Yes)
{
lstReturn.Add(new CPluginVariable("Webaddress", this.m_webAddress.GetType(), this.m_webAddress));
lstReturn.Add(new CPluginVariable("Webrequest Intervall", this.m_requestIntervall.GetType(), this.m_requestIntervall));
}
//Simple Stats
lstReturn.Add(new CPluginVariable("Log playerdata only (no playerstats)?", typeof(enumBoolYesNo), this.m_enLogPlayerDataOnly));
return lstReturn;
}
public void SetPluginVariable(string strVariable, string strValue)
{
if (strVariable.CompareTo("Host") == 0)
{
this.m_strHost = strValue;
}
else if (strVariable.CompareTo("Port") == 0)
{
this.m_strDBPort = strValue;
}
else if (strVariable.CompareTo("Database Name") == 0)
{
this.m_strDatabase = strValue;
}
else if (strVariable.CompareTo("UserName") == 0)
{
this.m_strUserName = strValue;
}
else if (strVariable.CompareTo("Password") == 0)
{
this.m_strPassword = strValue;
}
else if (strVariable.CompareTo("High performance mode(no connection limit!)") == 0 && Enum.IsDefined(typeof(enumBoolOnOff), strValue) == true)
{
this.m_highPerformanceConnectionMode = (enumBoolOnOff)Enum.Parse(typeof(enumBoolOnOff), strValue);
}
else if (strVariable.CompareTo("Connection Pooling") == 0 && Enum.IsDefined(typeof(enumBoolOnOff), strValue) == true)
{
this.m_connectionPooling = (enumBoolOnOff)Enum.Parse(typeof(enumBoolOnOff), strValue);
this.m_highPerformanceConnectionMode = enumBoolOnOff.On;
}
else if (strVariable.CompareTo("Min Connection Pool Size") == 0)
{
Int32.TryParse(strValue, out this.m_minPoolSize);
if (this.m_minPoolSize < 0 || this.m_minPoolSize > this.m_maxPoolSize)
{
this.m_minPoolSize = 0;
}
}
else if (strVariable.CompareTo("Max Connection Pool Size") == 0)
{
Int32.TryParse(strValue, out this.m_maxPoolSize);
if (this.m_maxPoolSize < 1 || this.m_minPoolSize > this.m_maxPoolSize)
{
this.m_maxPoolSize = 10;
}
}
else if (strVariable.CompareTo("Failed Transaction retry attempts") == 0)
{
Int32.TryParse(strValue, out TransactionRetryCount);
if (TransactionRetryCount < 1)
{
TransactionRetryCount = 3;
}
}
else if (strVariable.CompareTo("Minimum time(sec) between ServerInfo Updates") == 0)
{
if (Int32.TryParse(strValue, out this.minIntervalllenght))
{
if (this.minIntervalllenght < 1)
{
this.minIntervalllenght = 30;
}
}
else
{
this.minIntervalllenght = 30;
}
}
else if (strVariable.CompareTo("Enable Chatlogging?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enChatloggingON = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Log ServerSPAM?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enNoServerMsg = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Instant Logging of Chat Messages?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enInstantChatlogging = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Enable chatlog filter(Regex)?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enChatlogFilter = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Chatfilterrules(Regex)") == 0)
{
this.lstStrChatFilterRules = new List(CPluginVariable.DecodeStringArray(strValue));
this.BuildRegexRuleset();
}
else if (strVariable.CompareTo("Enable Statslogging?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enLogSTATS = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
//Log playerdata only (no playerstats)?
else if (strVariable.CompareTo("Log playerdata only (no playerstats)?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enLogPlayerDataOnly = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Enable Weaponstats?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_weaponstatsON = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Ranking by Score?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enRankingByScore = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Enable ingame commands?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enableInGameCommands = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Overall ranking(merged Serverranking)") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enOverallRanking = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Server group (0 - 128)") == 0)
{
if (Int32.TryParse(strValue, out this.intServerGroup))
{
if (this.intServerGroup > 128 || this.intServerGroup < 0)
{
this.intServerGroup = 0;
}
}
else
{
this.intServerGroup = 0;
}
}
else if (strVariable.CompareTo("Send Stats to all Players?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enSendStatsToAll = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Enable Livescoreboard in DB?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enableCurrentPlayerstatsTable = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Enable KDR correction?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_kdrCorrection = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("PlayerMessage") == 0)
{
this.m_lstPlayerStatsMessage = new List(CPluginVariable.DecodeStringArray(strValue));
}
// player of the day
else if (strVariable.CompareTo("Player of the day Message") == 0)
{
this.m_lstPlayerOfTheDayMessage = new List(CPluginVariable.DecodeStringArray(strValue));
}
else if (strVariable.CompareTo("Weaponstats Message ") == 0)
{
this.m_lstWeaponstatsMsg = new List(CPluginVariable.DecodeStringArray(strValue));
}
//Serverstats
else if (strVariable.CompareTo("Serverstats Message") == 0)
{
this.m_lstServerstatsMsg = new List(CPluginVariable.DecodeStringArray(strValue));
}
else if (strVariable.CompareTo("Enable Welcomestats?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enWelcomeStats = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Awards ON?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_awardsON = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Yell Welcome Message(not the stats)?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enYellWelcomeMSG = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Welcome Message") == 0)
{
//this.m_strPlayerWelcomeMsg = strValue;
this.m_lstPlayerWelcomeStatsMessage = new List(CPluginVariable.DecodeStringArray(strValue));
}
else if (strVariable.CompareTo("Welcome Message for new Player") == 0)
{
this.m_lstNewPlayerWelcomeMsg = new List(CPluginVariable.DecodeStringArray(strValue));
}
else if (strVariable.CompareTo("Welcomestats Delay") == 0 && Int32.TryParse(strValue, out int_welcomeStatsDelay) == true)
{
this.int_welcomeStatsDelay = Convert.ToInt32(strValue);
}
else if (strVariable.CompareTo("Top10 ingame") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enTop10ingame = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
//top10
else if (strVariable.CompareTo("Top10 header line") == 0)
{
this.m_strTop10Header = strValue;
}
else if (strVariable.CompareTo("Top10 row format") == 0)
{
this.m_strTop10RowFormat = strValue;
}
// top10 for period
else if (strVariable.CompareTo("Top10 for period header line") == 0)
{
this.m_strTop10HeaderForPeriod = strValue;
}
else if (strVariable.CompareTo("Top10 for period interval days") == 0)
{
if (Int32.TryParse(strValue, out this.m_intDaysForPeriodTop10) == false)
{
this.m_intDaysForPeriodTop10 = 7;
}
}
else if (strVariable.CompareTo("WeaponTop10 header line") == 0)
{
this.m_strWeaponTop10Header = strValue;
}
else if (strVariable.CompareTo("WeaponTop10 row format") == 0)
{
this.m_strWeaponTop10RowFormat = strValue;
}
else if (strVariable.CompareTo("DebugLevel") == 0)
{
this.GlobalDebugMode = strValue;
}
else if (strVariable.CompareTo("Keywordlist") == 0)
{
this.m_lstTableconfig = new List(CPluginVariable.DecodeStringArray(strValue));
}
else if (strVariable.CompareTo("tableSuffix") == 0)
{
this.tableSuffix = strValue;
this.prepareTablenames();
this.setGameMod();
this.boolTableEXISTS = false;
}
else if (strVariable.CompareTo("MapStats ON?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_mapstatsON = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Session ON?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_sessionON = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("SessionMessage") == 0)
{
this.m_lstSessionMessage = new List(CPluginVariable.DecodeStringArray(strValue));
}
else if (strVariable.CompareTo("Save Sessiondata to DB?") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enSessionTracking = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Playerrequests per Round") == 0 && Int32.TryParse(strValue, out numberOfAllowedRequests) == true)
{
this.numberOfAllowedRequests = Convert.ToInt32(strValue);
}
else if (strVariable.CompareTo("Servertime Offset") == 0 && Double.TryParse(strValue, out m_dTimeOffset) == true)
{
this.m_dTimeOffset = Convert.ToDouble(strValue);
this.MyDateTime = new myDateTime_W(this.m_dTimeOffset);
}
//Webrequest
/*
else if (strVariable.CompareTo("Periodical Webrequest On?(P&S Stats)") == 0 && Enum.IsDefined(typeof(enumBoolYesNo), strValue) == true)
{
this.m_enWebrequest = (enumBoolYesNo)Enum.Parse(typeof(enumBoolYesNo), strValue);
}
else if (strVariable.CompareTo("Webaddress") == 0)
{
this.m_webAddress = strValue;
}
else if (strVariable.CompareTo("Webrequest Intervall") == 0 && Int32.TryParse(strValue, out this.m_requestIntervall) == true)
{
this.m_requestIntervall = Convert.ToInt32(strValue);
}
*/
else if (strVariable.CompareTo("Stats Command:") == 0)
{
this.m_IngameCommands_stats = strValue;
}
else if (strVariable.CompareTo("ServerStats Command:") == 0)
{
this.m_IngameCommands_serverstats = strValue;
}
else if (strVariable.CompareTo("Session Command:") == 0)
{
this.m_IngameCommands_session = strValue;
}
else if (strVariable.CompareTo("Dogtags Command:") == 0)
{
this.m_IngameCommands_dogtags = strValue;
}
else if (strVariable.CompareTo("Top10 Command:") == 0)
{
this.m_IngameCommands_top10 = strValue;
}
else if (strVariable.CompareTo("Player Of The Day Command:") == 0)
{
this.m_IngameCommands_playerOfTheDay = strValue;
}
else if (strVariable.CompareTo("Top10 for period Command:") == 0)
{
this.m_IngameCommands_top10ForPeriod = strValue;
}
this.RegisterAllCommands();
}
private List GetExcludedCommandStrings(string strAccountName)
{
List lstReturnCommandStrings = new List();
List lstCommands = this.GetRegisteredCommands();
CPrivileges privileges = this.GetAccountPrivileges(strAccountName);
foreach (MatchCommand mtcCommand in lstCommands)
{
if (mtcCommand.Requirements.HasValidPermissions(privileges) == true && lstReturnCommandStrings.Contains(mtcCommand.Command) == false)
{
lstReturnCommandStrings.Add(mtcCommand.Command);
}
}
return lstReturnCommandStrings;
}
private List GetCommandStrings()
{
List lstReturnCommandStrings = new List();
List lstCommands = this.GetRegisteredCommands();
foreach (MatchCommand mtcCommand in lstCommands)
{
if (lstReturnCommandStrings.Contains(mtcCommand.Command) == false)
{
lstReturnCommandStrings.Add(mtcCommand.Command);
}
}
return lstReturnCommandStrings;
}
private void UnregisterAllCommands()
{
this.setupIngameCommandDic();
try
{
foreach (KeyValuePair kvp in this.dicIngameCommands)
{
if (kvp.Value.commands != string.Empty)
{
foreach (string command in kvp.Value.commands.Split(','))
{
this.UnregisterCommand(new MatchCommand("CChatGUIDStatsLogger", kvp.Value.functioncall.ToString(), this.Listify("@", "!", "#"), command.ToString(), this.Listify(), new ExecutionRequirements(ExecutionScope.All), kvp.Value.description.ToString()));
}
}
}
}
catch (Exception e)
{
this.DebugInfo("Error", "Error in UnregisterAllCommands: " + e);
}
}
private void SetupHelpCommands()
{
}
private void RegisterAllCommands()
{
lock (this.registerallcomandslock)
{
this.setupIngameCommandDic();
if (this.m_isPluginEnabled == true)
{
if (this.m_enableInGameCommands == enumBoolYesNo.No)
{
this.UnregisterAllCommands();
return;
}
this.SetupHelpCommands();
try
{
foreach (KeyValuePair kvp in this.dicIngameCommands)
{
if (kvp.Value.commands != string.Empty)
{
foreach (string command in kvp.Value.commands.Split(','))
{
if (kvp.Value.boolEnabled)
{
this.RegisterCommand(new MatchCommand("CChatGUIDStatsLogger", kvp.Value.functioncall, this.Listify("@", "!", "#"), command, this.Listify(), new ExecutionRequirements(ExecutionScope.All), kvp.Value.description));
}
else
{
this.UnregisterCommand(new MatchCommand("CChatGUIDStatsLogger", kvp.Value.functioncall, this.Listify("@", "!", "#"), command, this.Listify(), new ExecutionRequirements(ExecutionScope.All), kvp.Value.description));
}
}
}
}
}
catch (Exception e)
{
this.DebugInfo("Error", "Error in RegisterAllCommands: " + e);
}
}
}
}
private void setupIngameCommandDic()
{
lock (this.dicIngameCommands)
{
bool boolenable = false;
this.dicIngameCommands.Clear();
if (this.m_enLogSTATS == enumBoolYesNo.Yes && this.m_enableInGameCommands == enumBoolYesNo.Yes)
{
boolenable = true;
}
this.dicIngameCommands.Add("playerstats", new CStatsIngameCommands(this.m_IngameCommands_stats, "OnCommandStats", boolenable, "Provides a player his personal serverstats"));
this.dicIngameCommands.Add("serverstats", new CStatsIngameCommands(this.m_IngameCommands_serverstats, "OnCommandServerStats", boolenable, "Provides a player his personal serverstats"));
this.dicIngameCommands.Add("dogtagstats", new CStatsIngameCommands(this.m_IngameCommands_dogtags, "OnCommandDogtags", boolenable, "Provides a player his personal dogtagstats"));
this.dicIngameCommands.Add("session", new CStatsIngameCommands(this.m_IngameCommands_session, "OnCommandSession", boolenable, "Provides a player his personal sessiondata"));
this.dicIngameCommands.Add("playeroftheday", new CStatsIngameCommands(this.m_IngameCommands_playerOfTheDay, "OnCommandPlayerOfTheDay", boolenable, "Provides the player of the day stats"));
if (this.m_enLogSTATS == enumBoolYesNo.Yes && this.m_enTop10ingame == enumBoolYesNo.Yes && this.m_enableInGameCommands == enumBoolYesNo.Yes)
{
this.dicIngameCommands.Add("top10", new CStatsIngameCommands(this.m_IngameCommands_top10, "OnCommandTop10", true, "Provides a player top10 Players"));
this.dicIngameCommands.Add("top10forperiode", new CStatsIngameCommands(this.m_IngameCommands_top10ForPeriod, "OnCommandTop10ForPeriod", true, "Provides a player top10 Players for a specific timeframe"));
}
else
{
this.dicIngameCommands.Add("top10", new CStatsIngameCommands(this.m_IngameCommands_top10, "OnCommandTop10", false, "Provides a player top10 Players"));
this.dicIngameCommands.Add("top10forperiode", new CStatsIngameCommands(this.m_IngameCommands_top10ForPeriod, "OnCommandTop10ForPeriod", false, "Provides a player top10 Players for a specific timeframe"));
}
}
}
#endregion
#region IPRoConPluginInterface
/*=======ProCon Events========*/
// Player events
public override void OnPlayerJoin(string strSoldierName)
{
if (this.StatsTracker.ContainsKey(strSoldierName) == false)
{
CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic);
StatsTracker.Add(strSoldierName, newEntry);
}
ThreadPool.QueueUserWorkItem(delegate { this.CreateSession(strSoldierName, 0, String.Empty); });
if (bool_roundStarted == true && StatsTracker.ContainsKey(strSoldierName) == true)
{
if (StatsTracker[strSoldierName].PlayerOnServer == false)
{
if (this.StatsTracker[strSoldierName].TimePlayerjoined == null)
{
this.StatsTracker[strSoldierName].TimePlayerjoined = MyDateTime.Now;
}
this.StatsTracker[strSoldierName].Playerjoined = MyDateTime.Now;
this.StatsTracker[strSoldierName].PlayerOnServer = true;
}
}
//Mapstatscounter for Player who joined the server
this.Mapstats.IntplayerjoinedServer++;
if (this.m_enWelcomeStats == enumBoolYesNo.Yes)
{
if (this.welcomestatsDic.ContainsKey(strSoldierName))
{
//Update jointime
this.welcomestatsDic[strSoldierName] = MyDateTime.Now;
}
else
{
//Insert
this.DebugInfo("Trace", "Added Player: " + strSoldierName + " to welcomestatslist");
this.welcomestatsDic.Add(strSoldierName, MyDateTime.Now);
}
}
}
public override void OnPlayerAuthenticated(string soldierName, string guid)
{
if (this.StatsTracker.ContainsKey(soldierName) == false)
{
CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic);
StatsTracker.Add(soldierName, newEntry);
if (guid.Length > 0)
{
StatsTracker[soldierName].EAGuid = guid;
}
}
}
// Will receive ALL chat global/team/squad in R3.
public override void OnGlobalChat(string strSpeaker, string strMessage)
{
if (strMessage.Length > 0)
{
ThreadPool.QueueUserWorkItem(delegate { this.LogChat(strSpeaker, strMessage, "Global"); });
}
}
// Place holder, non-functioning in R3. It recieves the same data as OnGlobalChat though so look out for now.
public override void OnTeamChat(string strSpeaker, string strMessage, int iTeamID)
{
if (strMessage.Length > 0)
{
ThreadPool.QueueUserWorkItem(delegate { this.LogChat(strSpeaker, strMessage, "Team"); });
}
}
// Place holder, non-functioning in R3. It recieves the same data as OnGlobalChat though so look out for now.
public override void OnSquadChat(string strSpeaker, string strMessage, int iTeamID, int iSquadID)
{
if (strMessage.Length > 0)
{
ThreadPool.QueueUserWorkItem(delegate { this.LogChat(strSpeaker, strMessage, "Squad"); });
}
}
public override void OnPunkbusterMessage(string strPunkbusterMessage)
{
try
{
// This piece of code gets the number of player out of Punkbustermessages
string playercount = String.Empty;
if (strPunkbusterMessage.Contains("End of Player List"))
{
playercount = strPunkbusterMessage.Remove(0, 1 + strPunkbusterMessage.LastIndexOf("("));
playercount = playercount.Replace(" ", "");
playercount = playercount.Remove(playercount.LastIndexOf("P"), playercount.LastIndexOf(")"));
//this.DebugInfo("EoPl: "+playercount);
int players = Convert.ToInt32(playercount);
if (players >= intRoundStartCount && bool_roundStarted == false)
{
bool_roundStarted = true;
Time_RankingStarted = MyDateTime.Now;
//Mapstats Roundstarted
this.Mapstats.MapStarted();
}
else if (players >= intRoundStartCount && this.Mapstats.TimeMapStarted == DateTime.MinValue)
{
this.Mapstats.MapStarted();
}
//MapStats Playercount
this.Mapstats.ListADD(players);
}
}
catch (Exception c)
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error in OnPunkbusterMessage: " + c);
}
}
public override void OnPunkbusterPlayerInfo(CPunkbusterInfo cpbiPlayer)
{
this.RegisterAllCommands();
if (this.m_enLogSTATS == enumBoolYesNo.Yes)
{
try
{
this.AddPBInfoToStats(cpbiPlayer);
if (this.StatsTracker.ContainsKey(cpbiPlayer.SoldierName))
{
if (this.StatsTracker[cpbiPlayer.SoldierName].TimePlayerjoined == null)
{
this.StatsTracker[cpbiPlayer.SoldierName].TimePlayerjoined = MyDateTime.Now;
}
this.StatsTracker[cpbiPlayer.SoldierName].IP = cpbiPlayer.Ip;
}
}
catch (Exception c)
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error in OnPunkbusterPlayerInfo: " + c);
}
}
}
// Query Events
public override void OnServerInfo(CServerInfo csiServerInfo)
{
this.serverName = csiServerInfo.ServerName;
this.Mapstats.StrGamemode = csiServerInfo.GameMode;
this.Mapstats.ListADD(csiServerInfo.PlayerCount);
//Mapstats
if (csiServerInfo.PlayerCount >= intRoundStartCount && this.Mapstats.TimeMapStarted == DateTime.MinValue)
{
this.Mapstats.MapStarted();
}
this.Mapstats.StrMapname = csiServerInfo.Map;
this.Mapstats.IntRound = csiServerInfo.CurrentRound;
this.Mapstats.IntNumberOfRounds = csiServerInfo.TotalRounds;
this.Mapstats.IntServerplayermax = csiServerInfo.MaxPlayerCount;
if (this.ServerID == 0 || this.minIntervalllenght <= (DateTime.Now.Subtract(this.dtLastServerInfoEvent).TotalSeconds))
{
this.dtLastServerInfoEvent = DateTime.Now;
try
{
ThreadPool.QueueUserWorkItem(delegate { this.getUpdateServerID(csiServerInfo); });
}
catch { };
}
}
public override void OnListPlayers(List lstPlayers, CPlayerSubset cpsSubset)
{
//List PlayerList = new List();
//Mapstats Add Playercount to list
this.Mapstats.ListADD(lstPlayers.Count);
if (bool_roundStarted == false)
{
if (lstPlayers.Count >= intRoundStartCount)
{
bool_roundStarted = true;
Time_RankingStarted = MyDateTime.Now;
this.DebugInfo("Trace", "OLP: roundstarted");
//Mapstats Roundstarted
this.Mapstats.MapStarted();
}
}
if (lstPlayers.Count >= intRoundStartCount && this.Mapstats.TimeMapStarted == DateTime.MinValue)
{
this.Mapstats.MapStarted();
}
try
{
foreach (CPlayerInfo cpiPlayer in lstPlayers)
{
if (this.m_dicPlayers.ContainsKey(cpiPlayer.SoldierName) == true)
{
this.m_dicPlayers[cpiPlayer.SoldierName] = cpiPlayer;
}
else
{
this.m_dicPlayers.Add(cpiPlayer.SoldierName, cpiPlayer);
}
//Timelogging
if (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true)
{
if (this.StatsTracker[cpiPlayer.SoldierName].PlayerOnServer == false)
{
this.StatsTracker[cpiPlayer.SoldierName].Playerjoined = MyDateTime.Now;
this.StatsTracker[cpiPlayer.SoldierName].PlayerOnServer = true;
}
//EA-GUID, ClanTag, usw.
if (cpiPlayer.GUID.Length > 3)
{
this.StatsTracker[cpiPlayer.SoldierName].EAGuid = cpiPlayer.GUID;
//ID - Cache
if (this.m_ID_cache.ContainsKey(cpiPlayer.GUID))
{
this.m_ID_cache[cpiPlayer.GUID].PlayeronServer = true;
}
}
this.StatsTracker[cpiPlayer.SoldierName].ClanTag = cpiPlayer.ClanTag;
//TeamId
this.StatsTracker[cpiPlayer.SoldierName].TeamId = cpiPlayer.TeamID;
if (cpiPlayer.Score != 0)
{
this.StatsTracker[cpiPlayer.SoldierName].Score = cpiPlayer.Score;
}
//GlobalRank
if (cpiPlayer.Rank >= 0)
{
this.StatsTracker[cpiPlayer.SoldierName].GlobalRank = cpiPlayer.Rank;
}
//KDR Correction
if (this.m_kdrCorrection == enumBoolYesNo.Yes && ((cpiPlayer.Deaths == 0 && cpiPlayer.Kills == 0 && cpiPlayer.Score == 0) == false))
{
if (this.StatsTracker[cpiPlayer.SoldierName].Deaths > (cpiPlayer.Deaths + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftDeaths))
{
this.DebugInfo("Trace", "OnListPlayers Player: " + cpiPlayer.SoldierName + " has " + this.StatsTracker[cpiPlayer.SoldierName].Deaths + " deaths; correcting to " + cpiPlayer.Deaths + " deaths now");
this.StatsTracker[cpiPlayer.SoldierName].Deaths = (cpiPlayer.Deaths + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftDeaths);
}
if (this.StatsTracker[cpiPlayer.SoldierName].Kills > (cpiPlayer.Kills + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftKills))
{
this.StatsTracker[cpiPlayer.SoldierName].Kills = (cpiPlayer.Kills + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftKills);
}
}
}
//Session Score
if (this.m_sessionON == enumBoolYesNo.Yes)
{
lock (this.sessionlock)
{
if (this.m_dicSession.ContainsKey(cpiPlayer.SoldierName))
{
this.m_dicSession[cpiPlayer.SoldierName].AddScore(cpiPlayer.Score);
//KDR Correction
if (this.m_kdrCorrection == enumBoolYesNo.Yes && ((cpiPlayer.Deaths == 0 && cpiPlayer.Kills == 0 && cpiPlayer.Score == 0) == false))
{
if (this.m_dicSession[cpiPlayer.SoldierName].Deaths > (cpiPlayer.Deaths + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftDeaths))
{
this.DebugInfo("Trace", "Player: " + cpiPlayer.SoldierName + " has " + this.m_dicSession[cpiPlayer.SoldierName].Deaths + " deaths; correcting to " + cpiPlayer.Deaths + " deaths now");
this.m_dicSession[cpiPlayer.SoldierName].Deaths = (cpiPlayer.Deaths + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftDeaths);
}
if (this.m_dicSession[cpiPlayer.SoldierName].Kills > (cpiPlayer.Kills + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftKills))
{
this.m_dicSession[cpiPlayer.SoldierName].Kills = (cpiPlayer.Kills + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftKills);
}
}
if (cpiPlayer.GUID.Length > 2)
{
this.m_dicSession[cpiPlayer.SoldierName].EAGuid = cpiPlayer.GUID;
}
//TeamId
this.m_dicSession[cpiPlayer.SoldierName].TeamId = cpiPlayer.TeamID;
}
else
{
ThreadPool.QueueUserWorkItem(delegate { this.CreateSession(cpiPlayer.SoldierName, cpiPlayer.Score, cpiPlayer.GUID); });
}
}
}
//Checking the sessiondic
//ThreadPool.QueueUserWorkItem(delegate { this.CheckSessionDic(lstPlayers); });
//this.CreateSession(cpiPlayer.SoldierName, cpiPlayer.Score);
}
if (this.m_enableCurrentPlayerstatsTable == enumBoolYesNo.Yes && this.ServerID > 0 && this.minIntervalllenght <= (DateTime.Now.Subtract(this.dtLastOnListPlayersEvent).TotalSeconds))
{
ThreadPool.QueueUserWorkItem(delegate { this.UpdateCurrentPlayerTable(lstPlayers); });
this.dtLastOnListPlayersEvent = DateTime.Now;
}
}
catch (Exception c)
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error in OnListPlayers: " + c);
}
}
public override void OnPlayerKilled(Kill kKillerVictimDetails)
{
bool_roundStarted = true;
if (bool_roundStarted == true)
{
this.playerKilled(kKillerVictimDetails);
}
}
public override void OnPlayerLeft(CPlayerInfo cpiPlayer)
{
this.playerLeftServer(cpiPlayer);
this.RegisterAllCommands();
}
public override void OnRoundOverPlayers(List lstPlayers)
{
this.DebugInfo("Trace", "OnRoundOverPlayers Event");
foreach (CPlayerInfo cpiPlayer in lstPlayers)
{
if (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true)
{
this.StatsTracker[cpiPlayer.SoldierName].Score = cpiPlayer.Score;
//EA-GUID, ClanTag, usw.
if (cpiPlayer.GUID.Length > 3)
{
this.StatsTracker[cpiPlayer.SoldierName].EAGuid = cpiPlayer.GUID;
//ID - Cache
if (this.m_ID_cache.ContainsKey(cpiPlayer.GUID))
{
this.m_ID_cache[cpiPlayer.GUID].PlayeronServer = true;
}
}
this.StatsTracker[cpiPlayer.SoldierName].ClanTag = cpiPlayer.ClanTag;
//TeamId
this.StatsTracker[cpiPlayer.SoldierName].TeamId = cpiPlayer.TeamID;
//KDR Correction
if (this.m_kdrCorrection == enumBoolYesNo.Yes && ((cpiPlayer.Deaths == 0 && cpiPlayer.Kills == 0 && cpiPlayer.Score == 0) == false))
{
if (this.StatsTracker[cpiPlayer.SoldierName].Deaths > (cpiPlayer.Deaths + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftDeaths))
{
this.DebugInfo("Trace", "Player: " + cpiPlayer.SoldierName + " has " + this.StatsTracker[cpiPlayer.SoldierName].Deaths + " deaths; correcting to " + cpiPlayer.Deaths + " deaths now");
this.StatsTracker[cpiPlayer.SoldierName].Deaths = (cpiPlayer.Deaths + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftDeaths);
}
if (this.StatsTracker[cpiPlayer.SoldierName].Kills > (cpiPlayer.Kills + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftKills))
{
this.StatsTracker[cpiPlayer.SoldierName].Kills = (cpiPlayer.Kills + this.StatsTracker[cpiPlayer.SoldierName].BeforeLeftKills);
}
}
//GlobalRank
if (cpiPlayer.Rank >= 0)
{
this.StatsTracker[cpiPlayer.SoldierName].GlobalRank = cpiPlayer.Rank;
}
}
//Session Score
lock (this.sessionlock)
{
if (this.m_dicSession.ContainsKey(cpiPlayer.SoldierName) && this.m_sessionON == enumBoolYesNo.Yes)
{
//KDR Correction
if (this.m_kdrCorrection == enumBoolYesNo.Yes && ((cpiPlayer.Deaths == 0 && cpiPlayer.Kills == 0 && cpiPlayer.Score == 0) == false))
{
if (this.m_dicSession[cpiPlayer.SoldierName].Deaths > (cpiPlayer.Deaths + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftDeaths))
{
this.DebugInfo("Trace", "Player: " + cpiPlayer.SoldierName + " has " + this.m_dicSession[cpiPlayer.SoldierName].Deaths + " deaths; correcting to " + cpiPlayer.Deaths + " deaths now");
this.m_dicSession[cpiPlayer.SoldierName].Deaths = (cpiPlayer.Deaths + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftDeaths);
}
if (this.m_dicSession[cpiPlayer.SoldierName].Kills > (cpiPlayer.Kills + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftKills))
{
this.m_dicSession[cpiPlayer.SoldierName].Kills = (cpiPlayer.Kills + this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftKills);
}
}
this.m_dicSession[cpiPlayer.SoldierName].AddScore(cpiPlayer.Score);
this.m_dicSession[cpiPlayer.SoldierName].LastScore = 0;
this.m_dicSession[cpiPlayer.SoldierName].Rounds++;
this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftKills += this.m_dicSession[cpiPlayer.SoldierName].Kills;
this.m_dicSession[cpiPlayer.SoldierName].BeforeLeftDeaths += this.m_dicSession[cpiPlayer.SoldierName].Deaths;
//TeamId
this.m_dicSession[cpiPlayer.SoldierName].TeamId = cpiPlayer.TeamID;
if (cpiPlayer.GUID.Length > 2)
{
this.m_dicSession[cpiPlayer.SoldierName].EAGuid = cpiPlayer.GUID;
}
}
else
{
ThreadPool.QueueUserWorkItem(delegate { this.CreateSession(cpiPlayer.SoldierName, cpiPlayer.Score, cpiPlayer.GUID); });
}
}
}
this.Mapstats.MapEnd();
}
public override void OnRoundOver(int winningTeamId)
{
this.DebugInfo("Trace", "OnRoundOver: TeamId -> " + winningTeamId);
//StatsTracker
foreach (KeyValuePair kvp in this.StatsTracker)
{
if (kvp.Value.PlayerOnServer == true)
{
if (kvp.Value.TeamId == winningTeamId)
{
this.StatsTracker[kvp.Key].Wins++;
}
else
{
this.StatsTracker[kvp.Key].Losses++;
}
}
}
//Session
lock (this.sessionlock)
{
foreach (KeyValuePair kvp in this.m_dicSession)
{
if (kvp.Value.PlayerOnServer == true)
{
if (kvp.Value.TeamId == winningTeamId)
{
this.m_dicSession[kvp.Key].Wins++;
}
else
{
this.m_dicSession[kvp.Key].Losses++;
}
}
}
}
}
public override void OnPlayerSpawned(string soldierName, Inventory spawnedInventory)
{
if (bool_roundStarted == true && StatsTracker.ContainsKey(soldierName) == true)
{
if (StatsTracker[soldierName].PlayerOnServer == false)
{
this.StatsTracker[soldierName].Playerjoined = MyDateTime.Now;
this.StatsTracker[soldierName].PlayerOnServer = true;
}
}
if (this.m_enWelcomeStats == enumBoolYesNo.Yes)
{
if (this.welcomestatsDic.ContainsKey(soldierName))
{
//Call of the Welcomstatsfunction
ThreadPool.QueueUserWorkItem(delegate { this.WelcomeStats(soldierName); });
lock (this.welcomestatsDic)
{
this.welcomestatsDic.Remove(soldierName);
}
}
}
}
public override void OnLevelLoaded(string mapFileName, string Gamemode, int roundsPlayed, int roundsTotal)
{
if ((DateTime.Now.Subtract(this.dtLastRoundendEvent)).TotalSeconds > 30)
{
this.dtLastRoundendEvent = DateTime.Now;
this.DebugInfo("Info", "OnLevelLoaded: " + mapFileName + " Gamemode: " + Gamemode + " Round: " + (roundsPlayed + 1) + "/" + roundsTotal);
this.DebugInfo("Info", "update sql server");
this.Nextmapinfo = new CMapstats(MyDateTime.Now, mapFileName, (roundsPlayed + 1), roundsTotal, this.m_dTimeOffset);
//Calculate Awards
this.calculateAwards();
new Thread(StartStreaming).Start();
m_dicPlayers.Clear();
this.Spamprotection.Reset();
}
}
public override void OnRoundStartPlayerCount(int limit)
{
this.intRoundStartCount = limit;
}
public override void OnRoundRestartPlayerCount(int limit)
{
this.intRoundRestartCount = limit;
}
#endregion
#region External Commands (ColColonCleaner)
public void GetStatus(params String[] commands)
{
this.DebugInfo("Info", "GetStatus starting!");
if (commands.Length < 1)
{
this.DebugInfo("Error", "Status fetch request canceled, no parameters provided.");
return;
}
new Thread(new ParameterizedThreadStart(SendStatus)).Start(commands[0]);
this.DebugInfo("Info", "GetStatus finished!");
}
private void SendStatus(Object clientInformation)
{
this.DebugInfo("Info", "SendStatus starting!");
try
{
//Set current thread name
Thread.CurrentThread.Name = "SendStatus";
//Parse client plugin information
Hashtable parsedClientInformation = (Hashtable)JSON.JsonDecode((String)clientInformation);
String pluginName = String.Empty;
String pluginMethod = String.Empty;
if (!parsedClientInformation.ContainsKey("pluginName"))
{
this.DebugInfo("Error", "Parsed command didn't contain a pluginName!");
return;
}
else
{
pluginName = (String)parsedClientInformation["pluginName"];
}
if (!parsedClientInformation.ContainsKey("pluginMethod"))
{
this.DebugInfo("Error", "Parsed command didn't contain a pluginMethod!");
return;
}
else
{
pluginMethod = (String)parsedClientInformation["pluginMethod"];
}
//Check for active connection to the database using a simple query
Boolean activeConnection = false;
this.tablebuilder();
if ((m_strHost != null) || (m_strDatabase != null) || (m_strDBPort != null) || (m_strUserName != null) || (m_strPassword != null))
{
try
{
using (MySqlConnection Connection = new MySqlConnection(this.DBConnectionStringBuilder()))
{
Connection.Open();
if (Connection.State == ConnectionState.Open)
{
string query = "SELECT `ServerID` from `" + this.tbl_server + "` LIMIT 1";
using (MySqlCommand command = new MySqlCommand(query, Connection))
{
DataTable resultTable = this.SQLquery(command);
if (resultTable.Rows != null)
{
activeConnection = true;
}
}
}
//Connection automatically closed by end of 'using' clause
}
}
catch (Exception e)
{
this.DebugInfo("Error", "Query could not be performed while sending plugin status.");
}
}
//Create response hashtable
Hashtable response = new Hashtable();
//Add Plugin General Settings
response["pluginVersion"] = this.GetPluginVersion();
response["pluginEnabled"] = this.m_isPluginEnabled.ToString();
//Add Database connection info, without username and password
response["DBHost"] = this.m_strHost;
response["DBPort"] = this.m_strDBPort;
response["DBName"] = this.m_strDatabase;
//Add Database time offset
response["DBTimeOffset"] = this.m_dTimeOffset.ToString();
//Add Whether the connection is active
response["DBConnectionActive"] = activeConnection.ToString();
//Add Specific logging settings
response["ChatloggingEnabled"] = (this.m_enChatloggingON == enumBoolYesNo.Yes).ToString();
response["InstantChatLoggingEnabled"] = (this.m_enInstantChatlogging == enumBoolYesNo.Yes).ToString();
response["StatsLoggingEnabled"] = (this.m_enLogSTATS == enumBoolYesNo.Yes).ToString();
response["DBliveScoreboardEnabled"] = (this.m_enableCurrentPlayerstatsTable == enumBoolYesNo.Yes).ToString();
//Add Plugin Debug Mode
response["DebugMode"] = this.GlobalDebugMode;
//Add Error as "no error"
response["Error"] = false.ToString();
//Encode JSON response
String JSONResponse = JSON.JsonEncode(response);
//Send the response
this.ExecuteCommand("procon.protected.plugins.call", pluginName, pluginMethod, JSONResponse);
}
catch (Exception e)
{
//Log the error in console
this.DebugInfo("Error", e.ToString());
}
this.DebugInfo("Info", "SendStatus finished!");
}
#endregion
#region In Game Commands
public void OnCommandStats(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
{
/*
this.DebugInfo("Trace", "MatchCommand:" + mtcCommand.Command);
this.DebugInfo("Trace", "CapturedCommand:" + capCommand.Command);
this.DebugInfo("Trace", "CapturedCommand:" + capCommand.ResposeScope);
this.DebugInfo("Trace", "CapturedCommand:" + capCommand.ExtraArguments);
*/
if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
{
string scope = String.Empty;
if (capCommand.ResposeScope.Contains("!") == true)
{
if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
{
scope = "all";
}
else
{
scope = "player";
}
}
else
{
scope = "player";
}
if (capCommand.ExtraArguments.Length > 0)
{
ThreadPool.QueueUserWorkItem(delegate { this.GetWeaponStats(this.FindKeyword(capCommand.ExtraArguments.Trim().ToUpper()), strSpeaker, scope); });
}
else
{
ThreadPool.QueueUserWorkItem(delegate { this.GetPlayerStats(strSpeaker, 0, scope); });
}
}
}
public void OnCommandTop10(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
{
if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
{
string scope = String.Empty;
if (capCommand.ResposeScope.Contains("!") == true)
{
if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
{
scope = "all";
}
else
{
scope = "player";
}
}
else
{
scope = "player";
}
if (capCommand.ExtraArguments.Length > 0)
{
ThreadPool.QueueUserWorkItem(delegate { this.GetWeaponTop10(this.FindKeyword(capCommand.ExtraArguments.Trim().ToUpper()), strSpeaker, 2, scope); });
}
else
{
ThreadPool.QueueUserWorkItem(delegate { this.GetTop10(strSpeaker, 2, scope); });
}
}
}
public void OnCommandDogtags(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
{
if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
{
string scope = String.Empty;
if (capCommand.ResposeScope.Contains("!") == true)
{
if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
{
scope = "all";
}
else
{
scope = "player";
}
}
else
{
scope = "player";
}
ThreadPool.QueueUserWorkItem(delegate { this.GetDogtags(strSpeaker, 1, scope); });
}
}
public void OnCommandSession(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
{
if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
{
string scope = String.Empty;
if (capCommand.ResposeScope.Contains("!") == true)
{
if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
{
scope = "all";
}
else
{
scope = "player";
}
}
else
{
scope = "player";
}
ThreadPool.QueueUserWorkItem(delegate { this.GetSession(strSpeaker, 1, scope); });
}
}
public void OnCommandServerStats(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
{
if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
{
string scope = String.Empty;
if (capCommand.ResposeScope.Contains("!") == true)
{
if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
{
scope = "all";
}
else
{
scope = "player";
}
}
else
{
scope = "player";
}
ThreadPool.QueueUserWorkItem(delegate { this.GetServerStats(strSpeaker, 1, scope); });
}
}
public void OnCommandPlayerOfTheDay(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
{
if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
{
string scope = String.Empty;
if (capCommand.ResposeScope.Contains("!") == true)
{
if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
{
scope = "all";
}
else
{
scope = "player";
}
}
else
{
scope = "player";
}
ThreadPool.QueueUserWorkItem(delegate { this.GetPlayerOfTheDay(strSpeaker, 1, scope); });
}
}
public void OnCommandTop10ForPeriod(string strSpeaker, string strText, MatchCommand mtcCommand, CapturedCommand capCommand, CPlayerSubset subMatchedScope)
{
if ((this.m_enLogSTATS == enumBoolYesNo.Yes) && (this.Spamprotection.isAllowed(strSpeaker) == true))
{
string scope = String.Empty;
if (capCommand.ResposeScope.Contains("!") == true)
{
if (this.m_enSendStatsToAll == enumBoolYesNo.Yes)
{
scope = "all";
}
else
{
scope = "player";
}
}
else
{
scope = "player";
}
ThreadPool.QueueUserWorkItem(delegate { this.GetTop10ForPeriod(strSpeaker, 2, scope, this.m_intDaysForPeriodTop10); });
}
}
#endregion
#region CChatGUIDStatsLogger Methodes
private string DBConnectionStringBuilder()
{
string conString = String.Empty;
lock (this.ConnectionStringBuilderlock)
{
uint uintport = 3306;
uint.TryParse(m_strDBPort, out uintport);
myCSB.Port = uintport;
myCSB.Server = m_strHost;
myCSB.UserID = m_strUserName;
myCSB.Password = m_strPassword;
myCSB.Database = m_strDatabase;
//Connection Pool
if (this.m_connectionPooling == enumBoolOnOff.On)
{
myCSB.Pooling = true;
myCSB.MinimumPoolSize = Convert.ToUInt32(this.m_minPoolSize);
myCSB.MaximumPoolSize = Convert.ToUInt32(this.m_maxPoolSize);
myCSB.ConnectionLifeTime = 600;
}
else
{
myCSB.Pooling = false;
}
//Compression
if (this.m_Connectioncompression == enumBoolOnOff.On)
{
myCSB.UseCompression = true;
}
else
{
myCSB.UseCompression = false;
}
myCSB.AllowUserVariables = true;
myCSB.DefaultCommandTimeout = 3600;
myCSB.ConnectionTimeout = 50;
conString = myCSB.ConnectionString;
}
return conString;
}
private int GetPlayerTeamID(string strSoldierName)
{
int iTeamID = 0; // Neutral Team ID
if (this.m_dicPlayers.ContainsKey(strSoldierName) == true)
{
iTeamID = this.m_dicPlayers[strSoldierName].TeamID;
}
return iTeamID;
}
private void playerLeftServer(CPlayerInfo cpiPlayer)
{
try
{
this.DebugInfo("Trace", "playerLeftServer: " + cpiPlayer.SoldierName + " EAGUID: " + cpiPlayer.GUID);
if (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true)
{
this.StatsTracker[cpiPlayer.SoldierName].Score = cpiPlayer.Score;
this.StatsTracker[cpiPlayer.SoldierName].TimePlayerleft = MyDateTime.Now;
this.StatsTracker[cpiPlayer.SoldierName].playerleft();
//EA-GUID, ClanTag, usw.
if (cpiPlayer.GUID.Length > 2)
{
this.StatsTracker[cpiPlayer.SoldierName].EAGuid = cpiPlayer.GUID;
}
//ID cache System
if (this.StatsTracker[cpiPlayer.SoldierName].EAGuid.Length > 2)
{
if (this.m_ID_cache.ContainsKey(this.StatsTracker[cpiPlayer.SoldierName].EAGuid) == true)
{
this.m_ID_cache[this.StatsTracker[cpiPlayer.SoldierName].EAGuid].PlayeronServer = false;
}
}
this.StatsTracker[cpiPlayer.SoldierName].ClanTag = cpiPlayer.ClanTag;
}
//Mapstats
this.Mapstats.IntplayerleftServer++;
//Session
if (this.m_dicSession.ContainsKey(cpiPlayer.SoldierName) == true)
{
if (cpiPlayer.Score > 0)
{
this.m_dicSession[cpiPlayer.SoldierName].AddScore(cpiPlayer.Score);
}
this.m_dicSession[cpiPlayer.SoldierName].TimePlayerleft = MyDateTime.Now;
this.m_dicSession[cpiPlayer.SoldierName].playerleft();
this.DebugInfo("Trace", "Score: " + this.m_dicSession[cpiPlayer.SoldierName].TotalScore.ToString() + " Playtime: " + this.m_dicSession[cpiPlayer.SoldierName].TotalPlaytime.ToString());
if (this.m_dicSession[cpiPlayer.SoldierName].TotalScore > 10 || this.m_dicSession[cpiPlayer.SoldierName].Kills > 0 || this.m_dicSession[cpiPlayer.SoldierName].Deaths > 0)
{
if ((this.m_dicSession[cpiPlayer.SoldierName].EAGuid.Length < 2) && (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true))
{
if (this.StatsTracker[cpiPlayer.SoldierName].EAGuid.Length > 2)
{
this.m_dicSession[cpiPlayer.SoldierName].EAGuid = this.StatsTracker[cpiPlayer.SoldierName].EAGuid;
}
}
this.DebugInfo("Trace", "Adding Session of Player " + cpiPlayer.SoldierName + " to passed sessions");
//Adding passed session to list if player has a Score greater than 0 or a Player greater than 120 sec
this.lstpassedSessions.Add(this.m_dicSession[cpiPlayer.SoldierName]);
}
//Removing old session
lock (this.sessionlock)
{
this.m_dicSession.Remove(cpiPlayer.SoldierName);
}
}
else
{
this.DebugInfo("Trace", "playerLeftServer: " + cpiPlayer.SoldierName + " not in session dic");
}
}
catch (Exception c)
{
this.DebugInfo("Error", "playerLeftServer:" + c);
}
}
private void playerKilled(Kill kKillerVictimDetails)
{
if (this.DamageClass.ContainsKey(kKillerVictimDetails.DamageType) == false && !kKillerVictimDetails.DamageType.Equals("Death"))
{
this.DebugInfo("Trace", "Weapon: " + kKillerVictimDetails.DamageType + " is missing in the " + this.strServerGameType + ".def file!!!");
}
//this.DebugInfo("Trace","PlayerKilled Killer: "+ kKillerVictimDetails.Killer.SoldierName + "Victim: " + kKillerVictimDetails.Victim.SoldierName + "Weapon: " + kKillerVictimDetails.DamageType);
//TEAMKILL OR SUICID
if (String.Compare(kKillerVictimDetails.Killer.SoldierName, kKillerVictimDetails.Victim.SoldierName) == 0)
{ // A Suicide
this.AddSuicideToStats(kKillerVictimDetails.Killer.SoldierName, this.DamageClass[kKillerVictimDetails.DamageType], kKillerVictimDetails.DamageType);
}
else
{
if (this.GetPlayerTeamID(kKillerVictimDetails.Killer.SoldierName) == this.GetPlayerTeamID(kKillerVictimDetails.Victim.SoldierName))
{ //TeamKill
this.AddTeamKillToStats(kKillerVictimDetails.Killer.SoldierName);
this.AddDeathToStats(kKillerVictimDetails.Victim.SoldierName, this.DamageClass[kKillerVictimDetails.DamageType], kKillerVictimDetails.DamageType);
}
else
{
//this.DebugInfo("Trace","PlayerKilled: Regular Kill");
//Regular Kill: Player killed an Enemy
this.AddKillToStats(kKillerVictimDetails.Killer.SoldierName, this.DamageClass[kKillerVictimDetails.DamageType], kKillerVictimDetails.DamageType, kKillerVictimDetails.Headshot);
this.AddDeathToStats(kKillerVictimDetails.Victim.SoldierName, this.DamageClass[kKillerVictimDetails.DamageType], kKillerVictimDetails.DamageType);
if (string.Equals(kKillerVictimDetails.DamageType, "Melee"))
{ //Dogtagstracking
CKillerVictim KnifeKill = new CKillerVictim(kKillerVictimDetails.Killer.SoldierName, kKillerVictimDetails.Victim.SoldierName);
if (m_dicKnifeKills.ContainsKey(KnifeKill) == true)
{
m_dicKnifeKills[KnifeKill]++;
}
else
{
m_dicKnifeKills.Add(KnifeKill, 1);
}
}
}
}
}
private DataTable SQLquery(MySqlCommand selectQuery)
{
DataTable MyDataTable = new DataTable();
try
{
this.tablebuilder();
//this.DebugInfo("Trace", "SQLquery: " + selectQuery);
if (selectQuery == null)
{
this.DebugInfo("Warning", "SQLquery: selectQuery is null");
return MyDataTable;
}
else if (selectQuery.CommandText.Equals(String.Empty) == true)
{
this.DebugInfo("Warning", "SQLquery: CommandText is empty");
return MyDataTable;
}
if (this.m_highPerformanceConnectionMode == enumBoolOnOff.On)
{
try
{
using (MySqlConnection Connection = new MySqlConnection(this.DBConnectionStringBuilder()))
{
selectQuery.Connection = Connection;
using (MySqlDataAdapter MyAdapter = new MySqlDataAdapter(selectQuery))
{
if (MyAdapter != null)
{
MyAdapter.Fill(MyDataTable);
}
else
{
this.DebugInfo("Warning", "SQLquery: MyAdapter is null");
}
}
Connection.Close();
}
}
catch (MySqlException me)
{
this.DebugInfo("Error", "SQLQuery:");
this.DisplayMySqlErrorCollection(me);
}
catch (Exception c)
{
this.DebugInfo("Error", "SQLQuery:" + c);
}
}
else
{
lock (this.sqlquerylock)
{
if (this.MySqlCon == null)
{
this.MySqlCon = new MySqlConnection(this.DBConnectionStringBuilder());
}
try
{
selectQuery.Connection = this.MySqlCon;
using (MySqlDataAdapter MyAdapter = new MySqlDataAdapter(selectQuery))
{
if (MyAdapter != null)
{
MyAdapter.Fill(MyDataTable);
}
else
{
this.DebugInfo("Warning", "SQLquery: MyAdapter is null");
}
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "SQLQuery:");
this.DisplayMySqlErrorCollection(oe);
if (MySqlCon.State == ConnectionState.Open)
{
MySqlCon.Close();
MySqlCon = null;
}
}
catch (Exception c)
{
this.DebugInfo("Error", "SQLQuery:" + c);
if (MySqlCon.State == ConnectionState.Open)
{
MySqlCon.Close();
MySqlCon = null;
}
}
finally
{
try
{
this.MySqlCon.Close();
}
catch
{
this.MySqlCon = null;
}
}
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "SQLQuery OuterException:" + c);
}
return MyDataTable;
}
// Updates database with player stats and chatlogs
private void StartStreaming()
{
lock (this.streamlock)
{
bool success = false;
int attemptCount = 0;
try
{
DateTime StartStreamingTime = MyDateTime.Now;
//Make a copy of Statstracker to prevent unwanted errors
Dictionary StatsTrackerCopy = new Dictionary(this.StatsTracker);
//C_ID_Cache id_cache;
List lstEAGUIDs = new List();
//Clearing the old Dictionary
StatsTracker.Clear();
if (isStreaming)
{
this.DebugInfo("Info", "Started streaming to the DB-Server");
// Uploads chat logs and Stats for round to database
if (ChatLog.Count > 0 || this.m_enLogSTATS == enumBoolYesNo.Yes)
{
this.tablebuilder(); //Build the tables if not exists
if ((m_strHost != null) && (m_strDatabase != null) && (m_strDBPort != null) && (m_strUserName != null) && (m_strPassword != null))
{
try
{
this.OpenMySqlConnection(2);
this.MySql_Connection_is_activ = true;
if (ChatLog.Count > 0 && MySqlConn.State == ConnectionState.Open)
{
string ChatSQL = @"INSERT INTO " + this.tbl_chatlog + @" (logDate, ServerID, logSubset, logSoldierName, logMessage) VALUES ";
lock (ChatLog)
{
int i = 0;
foreach (CLogger log in ChatLog)
{
ChatSQL = string.Concat(ChatSQL, "(@logDate" + i + ", @ServerID" + i + ", @logSubset" + i + ", @logSoldierName" + i + ", @logMessage" + i + "),");
i++;
}
ChatSQL = ChatSQL.Remove(ChatSQL.LastIndexOf(","));
using (MySqlCommand OdbcCom = new MySqlCommand(ChatSQL, MySqlConn))
{
i = 0;
foreach (CLogger log in ChatLog)
{
OdbcCom.Parameters.AddWithValue("@logDate" + i, log.Time);
OdbcCom.Parameters.AddWithValue("@ServerID" + i, this.ServerID);
OdbcCom.Parameters.AddWithValue("@logSubset" + i, log.Subset);
OdbcCom.Parameters.AddWithValue("@logSoldierName" + i, log.Name);
OdbcCom.Parameters.AddWithValue("@logMessage" + i, log.Message);
i++;
}
OdbcCom.ExecuteNonQuery();
}
ChatLog.Clear();
}
}
if (this.m_mapstatsON == enumBoolYesNo.Yes && MySqlConn.State == ConnectionState.Open)
{
this.DebugInfo("Trace", "Mapstats Write querys");
this.Mapstats.calcMaxMinAvgPlayers();
string MapSQL = @"INSERT INTO " + tbl_mapstats + @" (ServerID, TimeMapLoad, TimeRoundStarted, TimeRoundEnd, MapName, Gamemode, Roundcount, NumberofRounds, MinPlayers, AvgPlayers, MaxPlayers, PlayersJoinedServer, PlayersLeftServer)
VALUES (@ServerID, @TimeMapLoad, @TimeRoundStarted, @TimeRoundEnd, @MapName, @Gamemode, @Roundcount, @NumberofRounds, @MinPlayers, @AvgPlayers, @MaxPlayers, @PlayersJoinedServer, @PlayersLeftServer)";
using (MySqlCommand OdbcCom = new MySqlCommand(MapSQL, MySqlConn))
{
OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
OdbcCom.Parameters.AddWithValue("@TimeMapLoad", this.Mapstats.TimeMaploaded);
OdbcCom.Parameters.AddWithValue("@TimeRoundStarted", this.Mapstats.TimeMapStarted);
OdbcCom.Parameters.AddWithValue("@TimeRoundEnd", this.Mapstats.TimeRoundEnd);
OdbcCom.Parameters.AddWithValue("@MapName", this.Mapstats.StrMapname);
OdbcCom.Parameters.AddWithValue("@Gamemode", this.Mapstats.StrGamemode);
OdbcCom.Parameters.AddWithValue("@Roundcount", this.Mapstats.IntRound);
OdbcCom.Parameters.AddWithValue("@NumberofRounds", this.Mapstats.IntNumberOfRounds);
OdbcCom.Parameters.AddWithValue("@MinPlayers", this.Mapstats.IntMinPlayers);
OdbcCom.Parameters.AddWithValue("@AvgPlayers", this.Mapstats.DoubleAvgPlayers);
OdbcCom.Parameters.AddWithValue("@MaxPlayers", this.Mapstats.IntMaxPlayers);
OdbcCom.Parameters.AddWithValue("@PlayersJoinedServer", this.Mapstats.IntplayerjoinedServer);
OdbcCom.Parameters.AddWithValue("@PlayersLeftServer", this.Mapstats.IntplayerleftServer);
OdbcCom.ExecuteNonQuery();
}
}
if (this.m_enLogSTATS == enumBoolYesNo.Yes && MySqlConn.State == ConnectionState.Open)
{
this.DebugInfo("Trace", "PlayerStats Write querys");
//Prepare EAGUID List
foreach (KeyValuePair kvp in StatsTrackerCopy)
{
if (kvp.Value.EAGuid.Length > 1)
{
if (GlobalDebugMode.Equals("Trace"))
{
this.DebugInfo("Trace", "Adding EAGUID " + kvp.Value.EAGuid + " to searchlist");
}
lstEAGUIDs.Add(kvp.Value.EAGuid);
}
}
//Perform Cache Update
this.UpdateIDCache(lstEAGUIDs);
while (!success)
{
attemptCount++;
try
{
MySqlTrans = MySqlConn.BeginTransaction();
foreach (KeyValuePair kvp in StatsTrackerCopy)
{
if (kvp.Key.Length > 0 && kvp.Value.EAGuid.Length > 1)
{
if (this.m_ID_cache.ContainsKey(kvp.Value.EAGuid) == false)
{
if (GlobalDebugMode.Equals("Trace"))
{
this.DebugInfo("Trace", kvp.Value.EAGuid + " is not in Cache!");
}
continue;
}
if (this.m_ID_cache[kvp.Value.EAGuid].Id >= 1)
{
string UpdatedataSQL = @"UPDATE " + this.tbl_playerdata + @" SET SoldierName = @SoldierName, ClanTag = @ClanTag, PBGUID = @PBGUID, IP_Address = @IP_Address, CountryCode = @CountryCode, GlobalRank = @GlobalRank WHERE PlayerID = @PlayerID";
using (MySqlCommand OdbcCom = new MySqlCommand(UpdatedataSQL, MySqlConn, MySqlTrans))
{
//Update
if (GlobalDebugMode.Equals("Trace"))
{
this.DebugInfo("Trace", "Update for Player " + kvp.Key);
this.DebugInfo("Trace", "ClanTag " + kvp.Value.ClanTag);
this.DebugInfo("Trace", "SoldierName " + kvp.Key);
this.DebugInfo("Trace", "PBGUID " + kvp.Value.Guid);
this.DebugInfo("Trace", "EAGUID " + kvp.Value.EAGuid);
this.DebugInfo("Trace", "IP_Address " + kvp.Value.IP);
this.DebugInfo("Trace", "CountryCode " + kvp.Value.PlayerCountryCode);
this.DebugInfo("Trace", "GlobalRank " + kvp.Value.GlobalRank);
}
//OdbcCom.Parameters.AddWithValue("@pr", kvp.Value.ClanTag);
OdbcCom.Parameters.AddWithValue("@SoldierName", kvp.Key);
if (kvp.Value.ClanTag != null)
{
if (kvp.Value.ClanTag.Length > 0)
{
OdbcCom.Parameters.AddWithValue("@ClanTag", kvp.Value.ClanTag);
}
else
{
OdbcCom.Parameters.AddWithValue("@ClanTag", Convert.DBNull);
}
}
else
{
OdbcCom.Parameters.AddWithValue("@ClanTag", Convert.DBNull);
}
OdbcCom.Parameters.AddWithValue("@PBGUID", kvp.Value.Guid);
OdbcCom.Parameters.AddWithValue("@IP_Address", kvp.Value.IP);
OdbcCom.Parameters.AddWithValue("@CountryCode", kvp.Value.PlayerCountryCode);
OdbcCom.Parameters.AddWithValue("@PlayerID", this.m_ID_cache[kvp.Value.EAGuid].Id);
OdbcCom.Parameters.AddWithValue("@GlobalRank", kvp.Value.GlobalRank);
OdbcCom.ExecuteNonQuery();
}
}
else if (this.m_ID_cache[kvp.Value.EAGuid].Id <= 0)
{
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)";
using (MySqlCommand OdbcCom = new MySqlCommand(InsertdataSQL, MySqlConn, MySqlTrans))
{
//Insert
if (GlobalDebugMode.Equals("Trace"))
{
this.DebugInfo("Trace", "Insert for Player " + kvp.Key);
this.DebugInfo("Trace", "ClanTag " + kvp.Value.ClanTag);
this.DebugInfo("Trace", "SoldierName " + kvp.Key);
this.DebugInfo("Trace", "PBGUID " + kvp.Value.Guid);
this.DebugInfo("Trace", "EAGUID " + kvp.Value.EAGuid);
this.DebugInfo("Trace", "IP_Address " + kvp.Value.IP);
this.DebugInfo("Trace", "CountryCode " + kvp.Value.PlayerCountryCode);
this.DebugInfo("Trace", "GlobalRank " + kvp.Value.GlobalRank);
}
if (kvp.Value.ClanTag != null)
{
if (kvp.Value.ClanTag.Length > 0)
{
OdbcCom.Parameters.AddWithValue("@ClanTag", kvp.Value.ClanTag);
}
else
{
OdbcCom.Parameters.AddWithValue("@ClanTag", Convert.DBNull);
}
}
else
{
OdbcCom.Parameters.AddWithValue("@ClanTag", Convert.DBNull);
}
OdbcCom.Parameters.AddWithValue("@SoldierName", kvp.Key);
OdbcCom.Parameters.AddWithValue("@PBGUID", kvp.Value.Guid);
OdbcCom.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
OdbcCom.Parameters.AddWithValue("@EAGUID", kvp.Value.EAGuid);
OdbcCom.Parameters.AddWithValue("@IP_Address", kvp.Value.IP);
OdbcCom.Parameters.AddWithValue("@CountryCode", kvp.Value.PlayerCountryCode);
OdbcCom.Parameters.AddWithValue("@GlobalRank", kvp.Value.GlobalRank);
OdbcCom.ExecuteNonQuery();
}
}
}
}
MySqlTrans.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
if (attemptCount < this.TransactionRetryCount)
{
this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(Playerdata). Attempt: " + attemptCount);
try
{
MySqlTrans.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
}
else
{
this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction Playerdata)");
throw;
}
break;
default:
throw; //Other exceptions
}
}
}
//Reset bool and counter
attemptCount = 0;
success = false;
//tbl_server_player
this.DebugInfo("Trace", "tbl_server_player Write querys");
this.UpdateIDCache(lstEAGUIDs);
while (!success)
{
attemptCount++;
try
{
//Start of the Transaction
MySqlTrans = MySqlConn.BeginTransaction();
foreach (KeyValuePair kvp in StatsTrackerCopy)
{
if (kvp.Value.EAGuid.Length > 0)
{
if (this.m_ID_cache.ContainsKey(kvp.Value.EAGuid) == false)
{
this.DebugInfo("Trace", kvp.Value.EAGuid + " is not in Cache!");
continue;
}
if (GlobalDebugMode.Equals("Trace"))
{
this.DebugInfo("Trace", "PlayerID: " + this.m_ID_cache[kvp.Value.EAGuid].Id);
this.DebugInfo("Trace", "StatsID: " + this.m_ID_cache[kvp.Value.EAGuid].StatsID);
}
if (this.m_ID_cache[kvp.Value.EAGuid].Id > 0 && this.m_ID_cache[kvp.Value.EAGuid].StatsID == 0)
{
string InsertdataSQL = @"INSERT INTO " + this.tbl_server_player + @" (ServerID, PlayerID) VALUES(@ServerID, @PlayerID)";
using (MySqlCommand OdbcCom = new MySqlCommand(InsertdataSQL, MySqlConn, MySqlTrans))
{
//Insert
this.DebugInfo("Trace", "Insert PlayerID " + this.m_ID_cache[kvp.Value.EAGuid].Id + "into tbl_server_player");
OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
OdbcCom.Parameters.AddWithValue("@PlayerID", this.m_ID_cache[kvp.Value.EAGuid].Id);
OdbcCom.ExecuteNonQuery();
}
}
}
}
MySqlTrans.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
if (attemptCount < this.TransactionRetryCount)
{
this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(server_player). Attempt: " + attemptCount);
try
{
MySqlTrans.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
}
else
{
this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction server_player)");
throw;
}
break;
default:
throw; //Other exceptions
}
}
}
//Reset bool and counter
attemptCount = 0;
success = false;
this.DebugInfo("Trace", "Combatstats Write querys");
//Perform Cache Update
this.UpdateIDCache(lstEAGUIDs);
if (this.m_enLogPlayerDataOnly == enumBoolYesNo.No)
{
while (!success)
{
attemptCount++;
try
{
//Start of the Transaction
MySqlTrans = MySqlConn.BeginTransaction();
foreach (KeyValuePair kvp in StatsTrackerCopy)
{
if (this.m_ID_cache.ContainsKey(kvp.Value.EAGuid) == false)
{
if (GlobalDebugMode.Equals("Trace"))
{
this.DebugInfo("Trace", kvp.Value.EAGuid + " is not in Cache!(empty GUID?)");
}
continue;
}
Dictionary> tempdic;
//tempdic = StatsTrackerCopy[kvp.Key].getWeaponKills();
tempdic = new Dictionary>(kvp.Value.getWeaponKills());
if (GlobalDebugMode.Equals("Trace"))
{
this.DebugInfo("Trace", "PlayerID: " + this.m_ID_cache[kvp.Value.EAGuid].Id);
this.DebugInfo("Trace", "StatsID: " + this.m_ID_cache[kvp.Value.EAGuid].StatsID);
}
if (this.m_ID_cache[kvp.Value.EAGuid].StatsID >= 1)
{
string playerstatsSQL = @"INSERT INTO " + this.tbl_playerstats + @"(StatsID, Score, Kills, Headshots, Deaths, Suicide, TKs, Playtime, Rounds, FirstSeenOnServer, LastSeenOnServer, Killstreak, Deathstreak, HighScore , Wins, Losses)
VALUES(@StatsID, @Score, @Kills, @Headshots, @Deaths, @Suicide, @TKs, @Playtime, @Rounds, @FirstSeenOnServer, @LastSeenOnServer, @Killstreak, @Deathstreak, @HighScore , @Wins, @Losses)
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 ";
using (MySqlCommand OdbcCom = new MySqlCommand(playerstatsSQL, MySqlConn, MySqlTrans))
{
//Insert
OdbcCom.Parameters.AddWithValue("@StatsID", this.m_ID_cache[kvp.Value.EAGuid].StatsID);
OdbcCom.Parameters.AddWithValue("@Score", kvp.Value.TotalScore);
OdbcCom.Parameters.AddWithValue("@Kills", kvp.Value.Kills);
OdbcCom.Parameters.AddWithValue("@Headshots", kvp.Value.Headshots);
if (kvp.Value.Deaths >= 0)
{
OdbcCom.Parameters.AddWithValue("@Deaths", kvp.Value.Deaths);
}
else
{
OdbcCom.Parameters.AddWithValue("@Deaths", 0);
}
OdbcCom.Parameters.AddWithValue("@Suicide", kvp.Value.Suicides);
OdbcCom.Parameters.AddWithValue("@TKs", kvp.Value.Teamkills);
OdbcCom.Parameters.AddWithValue("@Playtime", kvp.Value.TotalPlaytime);
OdbcCom.Parameters.AddWithValue("@Rounds", 1);
OdbcCom.Parameters.AddWithValue("@FirstSeenOnServer", kvp.Value.TimePlayerjoined);
if (kvp.Value.TimePlayerleft != DateTime.MinValue)
{
OdbcCom.Parameters.AddWithValue("@LastSeenOnServer", kvp.Value.TimePlayerleft);
}
else
{
OdbcCom.Parameters.AddWithValue("@LastSeenOnServer", MyDateTime.Now);
}
OdbcCom.Parameters.AddWithValue("@Killstreak", kvp.Value.Killstreak);
OdbcCom.Parameters.AddWithValue("@Deathstreak", kvp.Value.Deathstreak);
OdbcCom.Parameters.AddWithValue("@HighScore", kvp.Value.TotalScore);
OdbcCom.Parameters.AddWithValue("@Wins", kvp.Value.Wins);
OdbcCom.Parameters.AddWithValue("@Losses", kvp.Value.Losses);
OdbcCom.ExecuteNonQuery();
}
if (this.m_weaponstatsON == enumBoolYesNo.Yes)
{
this.DebugInfo("Trace", "Weaponstats Write querys");
string NewWeaponStatsSQL = @"INSERT INTO `" + this.tbl_weapons_stats + @"` (`StatsID`,`WeaponID`,`Kills`,`Headshots`,`Deaths`)
VALUES(@StatsID, @WeaponID, @Kills, @Headshots, @Deaths)
ON DUPLICATE KEY UPDATE `Kills` = `Kills` + @Kills ,`Headshots` = `Headshots` + @Headshots,`Deaths` = `Deaths` + @Deaths";
foreach (KeyValuePair> branch in tempdic)
{
//Build Query for Weaponstats
if (tempdic != null)
{
foreach (KeyValuePair leaf in branch.Value)
{
if (leaf.Value.Kills != 0 || leaf.Value.Kills != 0 || leaf.Value.Deaths != 0)
{
if (this.WeaponMappingDic.ContainsKey(leaf.Value.Name))
{
using (MySqlCommand OdbcCom = new MySqlCommand(NewWeaponStatsSQL, MySqlConn, MySqlTrans))
{
OdbcCom.Parameters.AddWithValue("@StatsID", this.m_ID_cache[kvp.Value.EAGuid].StatsID);
OdbcCom.Parameters.AddWithValue("@WeaponID", this.WeaponMappingDic[leaf.Value.Name]);
OdbcCom.Parameters.AddWithValue("@Kills", leaf.Value.Kills);
OdbcCom.Parameters.AddWithValue("@Headshots", leaf.Value.Headshots);
OdbcCom.Parameters.AddWithValue("@Deaths", leaf.Value.Deaths);
OdbcCom.ExecuteNonQuery();
}
}
}
}
}
}
}
//Awards
/*
if (this.m_awardsON == enumBoolYesNo.Yes && StatsTrackerCopy[kvp.Key].Awards.DicAwards.Count > 0)
{
string awardsInsert = "INSERT INTO " + tbl_awards + @" (`AwardID` ";
string awardsValues = ") VALUES (" + int_id;
string awardsUpdate = " ON DUPLICATE KEY UPDATE ";
foreach (KeyValuePair award in StatsTrackerCopy[kvp.Key].Awards.DicAwards)
{
awardsInsert = String.Concat(awardsInsert, ", `", award.Key, "`");
awardsValues = String.Concat(awardsValues, ", ", award.Value.ToString());
awardsUpdate = String.Concat(awardsUpdate, " `", award.Key, "` = `", award.Key, "` + ", award.Value.ToString(), ", ");
}
// Remove the last comma
int charindex2 = awardsUpdate.LastIndexOf(",");
if (charindex2 > 0)
{
awardsUpdate = awardsUpdate.Remove(charindex2);
}
awardsInsert = String.Concat(awardsInsert, awardsValues, ") ", awardsUpdate);
//Sent Query to the Server
this.DebugInfo("Awardquery: " + awardsInsert);
using (MySqlCommand OdbcCom = new MySqlCommand(awardsInsert, OdbcConn, OdbcTrans))
{
OdbcCom.ExecuteNonQuery();
}
}
*/
}
}
MySqlTrans.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
if (attemptCount < this.TransactionRetryCount)
{
this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(Stats). Attempt: " + attemptCount);
try
{
MySqlTrans.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
}
else
{
this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction Stats)");
throw;
}
break;
default:
throw; //Other exceptions
}
}
}
}
//Reset bool and counter
attemptCount = 0;
success = false;
if (this.m_enLogPlayerDataOnly == enumBoolYesNo.No)
{
while (!success)
{
attemptCount++;
try
{
//Start of the Transaction
MySqlTrans = MySqlConn.BeginTransaction();
this.DebugInfo("Trace", "Dogtagstats Write querys");
string KnifeSQL = String.Empty;
foreach (KeyValuePair kvp in m_dicKnifeKills)
{
if (StatsTrackerCopy.ContainsKey(kvp.Key.Killer) == false || StatsTrackerCopy.ContainsKey(kvp.Key.Victim) == false)
{
continue;
}
if (this.m_ID_cache.ContainsKey(StatsTrackerCopy[kvp.Key.Killer].EAGuid) == false || this.m_ID_cache.ContainsKey(StatsTrackerCopy[kvp.Key.Victim].EAGuid) == false)
{
continue;
}
if (this.m_ID_cache[StatsTrackerCopy[kvp.Key.Killer].EAGuid].StatsID > 0 && this.m_ID_cache[StatsTrackerCopy[kvp.Key.Victim].EAGuid].StatsID > 0)
{
KnifeSQL = "INSERT INTO " + this.tbl_dogtags + @"(KillerID, VictimID, Count) VALUES(@KillerID, @VictimID, @Count)
ON DUPLICATE KEY UPDATE Count = Count + @Count";
using (MySqlCommand OdbcCom = new MySqlCommand(KnifeSQL, MySqlConn, MySqlTrans))
{
OdbcCom.Parameters.AddWithValue("@KillerID", this.m_ID_cache[StatsTrackerCopy[kvp.Key.Killer].EAGuid].StatsID);
OdbcCom.Parameters.AddWithValue("@VictimID", this.m_ID_cache[StatsTrackerCopy[kvp.Key.Victim].EAGuid].StatsID);
OdbcCom.Parameters.AddWithValue("@Count", m_dicKnifeKills[kvp.Key]);
OdbcCom.ExecuteNonQuery();
}
}
}
MySqlTrans.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
if (attemptCount < this.TransactionRetryCount)
{
this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(Dogtags). Attempt: " + attemptCount);
try
{
MySqlTrans.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
}
else
{
this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction Dogtags)");
throw;
}
break;
default:
throw; //Other exceptions
}
}
}
}
//Reset bool and counter
attemptCount = 0;
success = false;
while (!success)
{
attemptCount++;
try
{
//Start of the Transaction
MySqlTrans = MySqlConn.BeginTransaction();
//Write the Player Sessions
if (this.m_sessionON == enumBoolYesNo.Yes && this.m_enSessionTracking == enumBoolYesNo.Yes)
{
bool containsvaildsessions = false;
StringBuilder InsertSQLSession = new StringBuilder(500);
InsertSQLSession.Append(@"INSERT INTO " + this.tbl_sessions + @" (`StatsID`, `StartTime`,`EndTime`, `Score`, `Kills`, `Headshots`, `Deaths`, `TKs`, `Suicide`,`RoundCount`, `Playtime`, `HighScore`, `Killstreak`, `Deathstreak`, `Wins`, `Losses`) VALUES");
this.DebugInfo("Trace", this.lstpassedSessions.Count + " Sessions to write to Sessiontable");
int i = 0;
foreach (CStats session in this.lstpassedSessions)
{
if (this.m_ID_cache.ContainsKey(session.EAGuid) == true)
{
if (this.m_ID_cache[session.EAGuid].StatsID > 0)
{
//write session
containsvaildsessions = true;
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 + "),");
i++;
}
}
}
if (containsvaildsessions)
{
//remove last comma
InsertSQLSession.Length = InsertSQLSession.Length - 1;
using (MySqlCommand sessionInsert = new MySqlCommand(InsertSQLSession.ToString(), MySqlConn, MySqlTrans))
{
i = 0;
foreach (CStats session in this.lstpassedSessions)
{
if (this.m_ID_cache.ContainsKey(session.EAGuid) == true)
{
if (this.m_ID_cache[session.EAGuid].StatsID > 0)
{
sessionInsert.Parameters.AddWithValue("@StatsID" + i, this.m_ID_cache[session.EAGuid].StatsID);
sessionInsert.Parameters.AddWithValue("@StartTime" + i, session.TimePlayerjoined);
sessionInsert.Parameters.AddWithValue("@EndTime" + i, session.TimePlayerleft);
sessionInsert.Parameters.AddWithValue("@Score" + i, session.TotalScore);
sessionInsert.Parameters.AddWithValue("@Kills" + i, session.Kills);
sessionInsert.Parameters.AddWithValue("@Headshots" + i, session.Headshots);
if (session.Deaths >= 0)
{
sessionInsert.Parameters.AddWithValue("@Deaths" + i, session.Deaths);
}
else
{
sessionInsert.Parameters.AddWithValue("@Deaths" + i, 0);
}
sessionInsert.Parameters.AddWithValue("@TKs" + i, session.Teamkills);
sessionInsert.Parameters.AddWithValue("@Suicide" + i, session.Suicides);
sessionInsert.Parameters.AddWithValue("@RoundCount" + i, session.Rounds);
sessionInsert.Parameters.AddWithValue("@Playtime" + i, session.TotalPlaytime);
sessionInsert.Parameters.AddWithValue("@HighScore" + i, session.HighScore);
sessionInsert.Parameters.AddWithValue("@Killstreak" + i, session.Killstreak);
sessionInsert.Parameters.AddWithValue("@Deathstreak" + i, session.Deathstreak);
sessionInsert.Parameters.AddWithValue("@Wins" + i, session.Wins);
sessionInsert.Parameters.AddWithValue("@Losses" + i, session.Losses);
i++;
}
}
}
sessionInsert.ExecuteNonQuery();
this.lstpassedSessions.Clear();
}
}
}
//Commit the Transaction for the Playerstats
MySqlTrans.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
if (attemptCount < this.TransactionRetryCount)
{
this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(Sessions). Attempt: " + attemptCount);
try
{
MySqlTrans.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
}
else
{
this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction Sessions)");
throw;
}
break;
default:
throw; //Other exceptions
}
}
}
//Reset bool and counter
attemptCount = 0;
success = false;
//Calculate ServerStats
if (this.boolSkipServerStatsUpdate == false && this.m_enLogPlayerDataOnly == enumBoolYesNo.No)
{
this.DebugInfo("Trace", "Serverstats Write query");
while (!success)
{
attemptCount++;
try
{
MySqlTrans = MySqlConn.BeginTransaction();
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,
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,
SUM(tps.Playtime) AS SumPlaytime, AVG(tps.Playtime) AS AvgPlaytime, SUM(tps.Rounds) AS SumRounds, AVG(tps.Rounds) AS AvgRounds
FROM " + this.tbl_playerstats + @" tps
INNER JOIN " + this.tbl_server_player + @" tsp ON tps.StatsID = tsp.StatsID
WHERE tsp.ServerID = @ServerID GROUP BY tsp.ServerID";
using (MySqlCommand OdbcCom = new MySqlCommand(serverstats, MySqlConn, MySqlTrans))
{
OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
OdbcCom.ExecuteNonQuery();
}
MySqlTrans.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
if (attemptCount < this.TransactionRetryCount)
{
this.DebugInfo("Warning", "Warning in StartStreaming: Locktimeout or Deadlock occured restarting Transaction(Serverstats). Attempt: " + attemptCount);
try
{
MySqlTrans.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
}
else
{
this.DebugInfo("Error", "Error in StartStreaming: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction Serverstats)");
throw;
}
break;
default:
throw; //Other exceptions
}
}
}
}
//Reset bool and counter
attemptCount = 0;
success = false;
StatsTrackerCopy.Clear();
this.m_dicKnifeKills.Clear();
List leftplayerlist = new List();
foreach (KeyValuePair kvp in this.m_ID_cache)
{
if (this.m_ID_cache[kvp.Key].PlayeronServer == false)
{
leftplayerlist.Add(kvp.Key);
}
// Because so playerleft event seems not been reported by the server
this.m_ID_cache[kvp.Key].PlayeronServer = false;
}
foreach (string player in leftplayerlist)
{
this.m_ID_cache.Remove(player);
//this.DebugInfo("Removed " + player);
}
this.DebugInfo("Info", "Status ID-Cache: " + m_ID_cache.Count + " ID's in cache");
if (this.m_ID_cache.Count > 500)
{
this.DebugInfo("Warning", "Forced Cache clear due the Nummber of cached IDs reached over 500 entries(overflowProtection)");
this.m_ID_cache.Clear();
}
}
else
{
StatsTracker.Clear();
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "Error in Startstreaming: ");
this.DisplayMySqlErrorCollection(oe);
this.m_ID_cache.Clear();
this.m_dicKnifeKills.Clear();
try { MySqlTrans.Rollback(); }
catch { }
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in Startstreaming: " + c);
this.m_ID_cache.Clear();
this.m_dicKnifeKills.Clear();
try { MySqlTrans.Rollback(); }
catch { }
}
finally
{
StatsTrackerCopy = null;
this.Mapstats = this.Nextmapinfo;
this.MySql_Connection_is_activ = false;
this.CloseMySqlConnection(2);
//Update Serverranking
this.UpdateRanking();
//Welcomestats dic
this.checkWelcomeStatsDic();
if (GlobalDebugMode.Equals("Info"))
{
TimeSpan duration = MyDateTime.Now - StartStreamingTime;
this.DebugInfo("Info", "Streamingprocess duration: " + Math.Round(duration.TotalSeconds, 3) + " seconds");
}
}
}
else
{
this.DebugInfo("Error", "Streaming cancelled. Please enter all database information");
}
}
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "Error in Startstreaming OuterException: ");
this.DisplayMySqlErrorCollection(oe);
this.m_ID_cache.Clear();
this.m_dicKnifeKills.Clear();
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in Startstreaming OuterException: " + c);
this.m_ID_cache.Clear();
this.m_dicKnifeKills.Clear();
}
}
}
private void UpdateCurrentPlayerTable(List lstPlayers)
{
if (this.boolTableEXISTS == false || ServerID <= 0)
{
return;
}
this.DebugInfo("Trace", "UpdateCurrentPlayerTable");
bool success = false;
int attemptCount = 0;
try
{
using (MySqlConnection DBConnection = new MySqlConnection(this.DBConnectionStringBuilder()))
{
string deleteSQL = "DELETE FROM " + this.tbl_currentplayers + " WHERE ServerID = @ServerID";
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 ");
MySql.Data.MySqlClient.MySqlTransaction Tx = null;
DBConnection.Open();
while (!success)
{
attemptCount++;
try
{
//Start of the Transaction
Tx = DBConnection.BeginTransaction();
using (MySqlCommand OdbcCom = new MySqlCommand(deleteSQL, DBConnection, Tx))
{
OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
OdbcCom.ExecuteNonQuery();
}
if (lstPlayers.Count > 0)
{
int i = 0;
foreach (CPlayerInfo cpiPlayer in lstPlayers)
{
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 + "),");
i++;
}
InsertSQL.Length = InsertSQL.Length - 1;
using (MySqlCommand OdbcCom = new MySqlCommand(InsertSQL.ToString(), DBConnection, Tx))
{
i = 0;
OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
foreach (CPlayerInfo cpiPlayer in lstPlayers)
{
OdbcCom.Parameters.AddWithValue("@SoldierName" + i, cpiPlayer.SoldierName);
OdbcCom.Parameters.AddWithValue("@ClanTag" + i, cpiPlayer.ClanTag + "");
OdbcCom.Parameters.AddWithValue("@EA_GUID" + i, cpiPlayer.GUID);
if (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true)
{
OdbcCom.Parameters.AddWithValue("@PB_GUID" + i, this.StatsTracker[cpiPlayer.SoldierName].Guid);
}
else
{
OdbcCom.Parameters.AddWithValue("@PB_GUID" + i, ""); //placeholder
}
OdbcCom.Parameters.AddWithValue("@Score" + i, cpiPlayer.Score);
OdbcCom.Parameters.AddWithValue("@Kills" + i, cpiPlayer.Kills);
OdbcCom.Parameters.AddWithValue("@Deaths" + i, cpiPlayer.Deaths);
if (this.StatsTracker.ContainsKey(cpiPlayer.SoldierName) == true)
{
OdbcCom.Parameters.AddWithValue("@Headshots" + i, this.StatsTracker[cpiPlayer.SoldierName].Headshots);
OdbcCom.Parameters.AddWithValue("@PlayerJoined" + i, this.StatsTracker[cpiPlayer.SoldierName].Playerjoined);
OdbcCom.Parameters.AddWithValue("@CountryCode" + i, this.StatsTracker[cpiPlayer.SoldierName].PlayerCountryCode);
OdbcCom.Parameters.AddWithValue("@Killstreak" + i, this.StatsTracker[cpiPlayer.SoldierName].Killstreak);
OdbcCom.Parameters.AddWithValue("@Deathstreak" + i, this.StatsTracker[cpiPlayer.SoldierName].Deathstreak);
OdbcCom.Parameters.AddWithValue("@Suicide" + i, this.StatsTracker[cpiPlayer.SoldierName].Suicides);
// Check if string is empty or null. If it is then send a 0.0.0.0 instead for ip address
if (string.IsNullOrEmpty(this.StatsTracker[cpiPlayer.SoldierName].IP.Trim()))
{
OdbcCom.Parameters.AddWithValue("@IP_aton" + i, "0.0.0.0");
}
else
{
OdbcCom.Parameters.AddWithValue("@IP_aton" + i, this.StatsTracker[cpiPlayer.SoldierName].IP.Trim());
}
}
else
{
OdbcCom.Parameters.AddWithValue("@Headshots" + i, 0); //Headshot placeholder
OdbcCom.Parameters.AddWithValue("@PlayerJoined" + i, MyDateTime.Now);
OdbcCom.Parameters.AddWithValue("@CountryCode" + i, "");
OdbcCom.Parameters.AddWithValue("@Killstreak" + i, 0);
OdbcCom.Parameters.AddWithValue("@Deathstreak" + i, 0);
OdbcCom.Parameters.AddWithValue("@Suicide" + i, 0);
OdbcCom.Parameters.AddWithValue("@IP_aton" + i, "0.0.0.0");
}
OdbcCom.Parameters.AddWithValue("@TeamID" + i, cpiPlayer.TeamID);
OdbcCom.Parameters.AddWithValue("@SquadID" + i, cpiPlayer.SquadID);
if (cpiPlayer.Ping >= 0 && cpiPlayer.Ping < 65000)
{
OdbcCom.Parameters.AddWithValue("@Ping" + i, cpiPlayer.Ping);
}
else
{
OdbcCom.Parameters.AddWithValue("@Ping" + i, 0);
}
if (cpiPlayer.Rank >= 0 && cpiPlayer.Rank < 6500)
{
OdbcCom.Parameters.AddWithValue("@GlobalRank" + i, cpiPlayer.Rank);
}
else
{
OdbcCom.Parameters.AddWithValue("@GlobalRank" + i, 0);
}
//Increment Index
i++;
}
OdbcCom.ExecuteNonQuery();
}
}
Tx.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
if (attemptCount < this.TransactionRetryCount)
{
this.DebugInfo("Warning", "Warning in UpdateCurrentPlayerTable: Locktimeout or Deadlock occured restarting Transaction(delete and Insert). Attempt: " + attemptCount);
try
{
if (Tx.Connection != null)
{
Tx.Rollback();
}
}
catch { }
Thread.Sleep(attemptCount * 1000);
}
else
{
this.DebugInfo("Error", "Error in UpdateCurrentPlayerTable: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction delete und Insert)");
throw;
}
break;
default:
throw; //Other exceptions
}
}
}
//Reset bool and counter
attemptCount = 0;
success = false;
try
{
DBConnection.Close();
}
catch { };
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "Error in UpdateCurrentPlayerTable: ");
this.DisplayMySqlErrorCollection(oe);
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in UpdateCurrentPlayerTable: " + c.ToString());
}
}
//Fetch data from the db
private C_ID_Cache GetID(string EAguid)
{
int playerID = 0;
int StatsID = 0;
if (GlobalDebugMode.Equals("Trace"))
{
this.DebugInfo("Trace", "Tying to get IDs form DB or cache for EAGuid: " + EAguid);
}
try
{
if (this.m_ID_cache.ContainsKey(EAguid) == true)
{
if (this.m_ID_cache[EAguid].Id >= 1 && this.m_ID_cache[EAguid].StatsID >= 1)
{
//CacheHit
if (GlobalDebugMode.Equals("Trace"))
{
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);
}
return this.m_ID_cache[EAguid];
}
else
{
//Cachemiss
if (this.m_ID_cache[EAguid].Id <= 0)
{
using (MySqlCommand MyCommand = new MySqlCommand(@"SELECT `PlayerID` FROM `" + this.tbl_playerdata + "` WHERE `GameID` = @GameID AND `EAGUID` = @EAGUID "))
{
MyCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
MyCommand.Parameters.AddWithValue("@EAGUID", EAguid);
DataTable resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
playerID = Convert.ToInt32(row["PlayerID"]);
this.m_ID_cache[EAguid].Id = playerID;
}
}
}
}
else
{
playerID = this.m_ID_cache[EAguid].Id;
}
if (playerID >= 1)
{
using (MySqlCommand MyCommand = new MySqlCommand(@"SELECT `StatsID` FROM `" + this.tbl_server_player + "` WHERE `PlayerID` = @PlayerID AND `ServerID`= @ServerID "))
{
MyCommand.Parameters.AddWithValue("@PlayerID", playerID);
MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
DataTable resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
StatsID = Convert.ToInt32(row["StatsID"]);
this.m_ID_cache[EAguid].StatsID = StatsID;
}
}
}
}
}
}
else
{
//Cache has no entry
using (MySqlCommand MyCommand = new MySqlCommand(@"SELECT `PlayerID` FROM `" + this.tbl_playerdata + "` WHERE `GameID` = @GameID AND `EAGUID` = @EAGUID "))
{
MyCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
MyCommand.Parameters.AddWithValue("@EAGUID", EAguid);
DataTable resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
playerID = Convert.ToInt32(row["PlayerID"]);
}
}
}
if (playerID >= 1)
{
using (MySqlCommand MyCommand = new MySqlCommand(@"SELECT `StatsID` FROM `" + this.tbl_server_player + "` WHERE `PlayerID` = @PlayerID AND `ServerID`= @ServerID"))
{
MyCommand.Parameters.AddWithValue("@PlayerID", playerID);
MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
DataTable resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
StatsID = Convert.ToInt32(row["StatsID"]);
}
}
}
}
this.m_ID_cache.Add(EAguid, new C_ID_Cache(StatsID, playerID, true));
}
}
catch (Exception c)
{
this.DebugInfo("Error", "GetID: " + c);
return null;
}
if (GlobalDebugMode.Equals("Trace"))
{
this.DebugInfo("Trace", "Returning ID: PlayerID: " + playerID + " StatsID: " + StatsID);
}
return this.m_ID_cache[EAguid];
}
private void UpdateIDCache(List lstEAGUID)
{
foreach (string EAGUID in lstEAGUID)
{
if (this.m_ID_cache.ContainsKey(EAGUID) == false)
{
//Adding an empty entry
this.m_ID_cache.Add(EAGUID, new C_ID_Cache(0, 0, true));
}
}
if (lstEAGUID.Count == 0)
{
this.DebugInfo("Trace", "UpdateIDCache: Empty List!");
return;
}
StringBuilder SQL = new StringBuilder(@"SELECT EAGUID, tpd.PlayerID, tsp.StatsID
FROM " + this.tbl_playerdata + @" tpd
LEFT JOIN " + this.tbl_server_player + @" tsp ON tpd.PlayerID = tsp.PlayerID AND ServerID = @ServerID
WHERE tpd.GameID = @GameID AND tpd.EAGUID IN (");
for (int i = 1; i <= lstEAGUID.Count; i++)
{
SQL.Append("@EAGUID" + i + ",");
}
SQL.Length = SQL.Length - 1;
SQL.Append(')');
try
{
using (MySqlCommand SelectCommand = new MySqlCommand(SQL.ToString()))
{
SelectCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
SelectCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
int i = 1;
foreach (string EAGUID in lstEAGUID)
{
SelectCommand.Parameters.AddWithValue("@EAGUID" + i, EAGUID);
i++;
}
DataTable result;
result = this.SQLquery(SelectCommand);
if (result != null)
{
foreach (DataRow row in result.Rows)
{
if (row[1] == Convert.DBNull)
{
this.m_ID_cache.Add(row[0].ToString(), new C_ID_Cache(0, 0, true));
continue;
}
if (this.m_ID_cache.ContainsKey(row[0].ToString()))
{
this.m_ID_cache[row[0].ToString()].Id = Convert.ToInt32(row[1]);
if (row[2] == Convert.DBNull)
{
this.m_ID_cache[row[0].ToString()].StatsID = 0;
}
else
{
this.m_ID_cache[row[0].ToString()].StatsID = Convert.ToInt32(row[2]);
}
}
else
{
if (row[2] == Convert.DBNull)
{
this.m_ID_cache.Add(row[0].ToString(), new C_ID_Cache(0, Convert.ToInt32(row[1]), true));
}
else
{
this.m_ID_cache.Add(row[0].ToString(), new C_ID_Cache(Convert.ToInt32(row[2]), Convert.ToInt32(row[1]), true));
}
}
}
}
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "Error in UpdateCacheID: ");
this.DisplayMySqlErrorCollection(oe);
}
catch (Exception c)
{
this.DebugInfo("Error", "UpdateIDCache: " + c);
}
}
private void WelcomeStats(string strSpeaker)
{
List result = new List();
if (this.m_enWelcomeStats == enumBoolYesNo.Yes)
{
if (this.m_enLogSTATS == enumBoolYesNo.Yes)
{
string SQL = String.Empty;
string strMSG = String.Empty;
//Statsquery with KDR
//Rankquery
if (m_enRankingByScore == enumBoolYesNo.Yes)
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
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,
SUM(tps.Rounds) AS Rounds, MAX(tps.Killstreak) AS Killstreak, MAX(tps.Deathstreak) AS Deathstreak
FROM " + this.tbl_playerdata + @" tpd
INNER JOIN " + this.tbl_playerrank + @" tpr ON tpd.PlayerID = tpr.PlayerID AND tpr.ServerGroup = @ServerGroup
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID
WHERE tpd.SoldierName = @SoldierName
GROUP BY tpd.PlayerID";
}
else
{
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 ,
tps.Playtime AS Playtime, tps.Headshots AS Headshots, tps.Rounds AS Rounds, tps.Killstreak AS Killstreak, tps.Deathstreak AS Deathstreak
FROM " + this.tbl_playerdata + @" tpd
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
INNER JOIN " + this.tbl_playerstats + @" tps ON tps.StatsID = tsp.StatsID
WHERE tsp.ServerID = @ServerID AND tpd.SoldierName = @SoldierName";
}
}
else
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
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,
SUM(tps.Rounds) AS Rounds, MAX(tps.Killstreak) AS Killstreak, MAX(tps.Deathstreak) AS Deathstreak
FROM " + this.tbl_playerdata + @" tpd
INNER JOIN " + this.tbl_playerrank + @" tpr ON tpd.PlayerID = tpr.PlayerID AND tpr.ServerGroup = @ServerGroup
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID
WHERE tpd.SoldierName = @SoldierName
GROUP BY tpd.PlayerID";
}
else
{
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 ,
tps.Playtime AS Playtime, tps.Headshots AS Headshots, tps.Rounds AS Rounds, tps.Killstreak AS Killstreak, tps.Deathstreak AS Deathstreak
FROM " + this.tbl_playerdata + @" tpd
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
INNER JOIN " + this.tbl_playerstats + @" tps ON tps.StatsID = tsp.StatsID
WHERE tsp.ServerID = @ServerID AND tpd.SoldierName = @SoldierName";
}
}
using (MySqlCommand MyCommand = new MySqlCommand(SQL))
{
DataTable resultTable;
double kdr = 0;
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
MyCommand.Parameters.AddWithValue("@SoldierName", strSpeaker);
}
else
{
MyCommand.Parameters.AddWithValue("@ServerID", ServerID);
MyCommand.Parameters.AddWithValue("@SoldierName", strSpeaker);
}
try
{
resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
result = new List(this.m_lstPlayerWelcomeStatsMessage);
result = this.ListReplace(result, "%serverName%", this.serverName);
result = this.ListReplace(result, "%playerName%", row["SoldierName"].ToString());
result = this.ListReplace(result, "%playerScore%", row["Score"].ToString());
result = this.ListReplace(result, "%playerKills%", row["Kills"].ToString());
result = this.ListReplace(result, "%playerDeaths%", row["Deaths"].ToString());
result = this.ListReplace(result, "%playerSuicide%", row["Suicide"].ToString());
result = this.ListReplace(result, "%playerTKs%", row["TKs"].ToString());
result = this.ListReplace(result, "%playerRank%", row["rank"].ToString());
result = this.ListReplace(result, "%allRanks%", row["allrank"].ToString());
result = this.ListReplace(result, "%playerHeadshots%", row["Headshots"].ToString());
result = this.ListReplace(result, "%rounds%", row["Rounds"].ToString());
result = this.ListReplace(result, "%killstreak%", row["Killstreak"].ToString());
result = this.ListReplace(result, "%deathstreak%", row["Deathstreak"].ToString());
//KDR
if (Convert.ToInt32(row["Deaths"]) != 0)
{
kdr = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Deaths"]);
kdr = Math.Round(kdr, 2);
result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
}
else
{
kdr = Convert.ToDouble(row["Kills"]);
result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
}
//Playtime
TimeSpan span = new TimeSpan(0, 0, Convert.ToInt32(row["Playtime"]));
result = this.ListReplace(result, "%playerPlaytime%", span.ToString());
//SPM
double SPM;
if (Convert.ToDouble(row["Playtime"]) != 0)
{
SPM = (Convert.ToDouble(row["Score"]) / (Convert.ToDouble(row["Playtime"]) / 60));
SPM = Math.Round(SPM, 2);
result = this.ListReplace(result, "%SPM%", SPM.ToString());
}
else
{
result = this.ListReplace(result, "%SPM%", "0");
}
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "WelcomeStats: " + c);
}
}
if (result.Count > 0)
{
//result.Insert(0, m_strPlayerWelcomeMsg.Replace("%serverName%", this.serverName).Replace("%playerName%", strSpeaker));
}
else
{
result.Clear();
result = new List(this.m_lstNewPlayerWelcomeMsg);
result = this.ListReplace(result, "%serverName%", this.serverName);
result = this.ListReplace(result, "%playerName%", strSpeaker);
//result.Add(m_strNewPlayerWelcomeMsg.Replace("%serverName%", this.serverName).Replace("%playerName%", strSpeaker));
}
this.SendMultiLineChatMessage(result, int_welcomeStatsDelay, 0, "player", strSpeaker);
}
}
}
private void GetPlayerStats(string strSpeaker, int delay, string scope)
{
List result = new List();
if (this.m_enLogSTATS == enumBoolYesNo.Yes)
{
string SQL = String.Empty;
string strMSG = String.Empty;
double kdr = 0;
//Statsquery with KDR
//Rankquery
if (m_enRankingByScore == enumBoolYesNo.Yes)
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
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,
SUM(tps.Rounds) AS Rounds, MAX(tps.Killstreak) AS Killstreak, MAX(tps.Deathstreak) AS Deathstreak
FROM " + this.tbl_playerdata + @" tpd
INNER JOIN " + this.tbl_playerrank + @" tpr ON tpd.PlayerID = tpr.PlayerID AND tpr.ServerGroup = @ServerGroup
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID
WHERE tpd.SoldierName = @SoldierName
GROUP BY tpd.PlayerID";
}
else
{
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 ,
tps.Playtime AS Playtime, tps.Headshots AS Headshots, tps.Rounds AS Rounds, tps.Killstreak AS Killstreak, tps.Deathstreak AS Deathstreak
FROM " + this.tbl_playerdata + @" tpd
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
INNER JOIN " + this.tbl_playerstats + @" tps ON tps.StatsID = tsp.StatsID
WHERE tsp.ServerID = @ServerID AND tpd.SoldierName = @SoldierName";
}
}
else
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
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,
SUM(tps.Rounds) AS Rounds, MAX(tps.Killstreak) AS Killstreak, MAX(tps.Deathstreak) AS Deathstreak
FROM " + this.tbl_playerdata + @" tpd
INNER JOIN " + this.tbl_playerrank + @" tpr ON tpd.PlayerID = tpr.PlayerID AND tpr.ServerGroup = @ServerGroup
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID
WHERE tpd.SoldierName = @SoldierName
GROUP BY tpd.PlayerID";
}
else
{
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 ,
tps.Playtime AS Playtime, tps.Headshots AS Headshots, tps.Rounds AS Rounds, tps.Killstreak AS Killstreak, tps.Deathstreak AS Deathstreak
FROM " + this.tbl_playerdata + @" tpd
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.PlayerID = tpd.PlayerID
INNER JOIN " + this.tbl_playerstats + @" tps ON tps.StatsID = tsp.StatsID
WHERE tsp.ServerID = @ServerID AND tpd.SoldierName = @SoldierName";
}
}
using (MySqlCommand MyCommand = new MySqlCommand(SQL))
{
DataTable resultTable;
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
MyCommand.Parameters.AddWithValue("@SoldierName", strSpeaker);
}
else
{
MyCommand.Parameters.AddWithValue("@ServerID", ServerID);
MyCommand.Parameters.AddWithValue("@SoldierName", strSpeaker);
}
try
{
resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
result = new List(m_lstPlayerStatsMessage);
result = this.ListReplace(result, "%playerName%", row["SoldierName"].ToString());
result = this.ListReplace(result, "%playerScore%", row["Score"].ToString());
result = this.ListReplace(result, "%playerKills%", row["Kills"].ToString());
result = this.ListReplace(result, "%playerDeaths%", row["Deaths"].ToString());
result = this.ListReplace(result, "%playerSuicide%", row["Suicide"].ToString());
result = this.ListReplace(result, "%playerTKs%", row["TKs"].ToString());
result = this.ListReplace(result, "%playerRank%", row["rank"].ToString());
result = this.ListReplace(result, "%allRanks%", row["allrank"].ToString());
result = this.ListReplace(result, "%playerHeadshots%", row["Headshots"].ToString());
result = this.ListReplace(result, "%rounds%", row["Rounds"].ToString());
result = this.ListReplace(result, "%killstreak%", row["Killstreak"].ToString());
result = this.ListReplace(result, "%deathstreak%", row["Deathstreak"].ToString());
//KDR
if (Convert.ToInt32(row["Deaths"]) != 0)
{
kdr = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Deaths"]);
kdr = Math.Round(kdr, 2);
result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
}
else
{
kdr = Convert.ToDouble(row["Kills"]);
result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
}
//Playtime
TimeSpan span = new TimeSpan(0, 0, Convert.ToInt32(row["Playtime"]));
result = this.ListReplace(result, "%playerPlaytime%", span.ToString());
//SPM
double SPM;
if (Convert.ToDouble(row["Playtime"]) != 0)
{
SPM = (Convert.ToDouble(row["Score"]) / (Convert.ToDouble(row["Playtime"]) / 60));
SPM = Math.Round(SPM, 2);
result = this.ListReplace(result, "%SPM%", SPM.ToString());
}
else
{
result = this.ListReplace(result, "%SPM%", "0");
}
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "GetPlayerStats: " + c);
}
}
if (result.Count != 0)
{
this.SendMultiLineChatMessage(result, delay, 0, scope, strSpeaker);
}
else
{
result.Clear();
result.Add("No Stats are available yet! Please wait one Round!");
this.SendMultiLineChatMessage(result, delay, 0, scope, strSpeaker);
}
}
}
private void GetTop10(string strSpeaker, int delay, string scope)
{
List result = new List();
if (this.m_enTop10ingame == enumBoolYesNo.Yes)
{
string SQL = String.Empty;
int rank = 0;
//Top10 Query
if (this.m_enRankingByScore == enumBoolYesNo.Yes)
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
SQL = @"SELECT tpd.SoldierName, SUM(tps.Score) AS Score, SUM(tps.Kills) AS Kills, SUM(tps.Deaths) AS Deaths , SUM(tps.Headshots) AS Headshots
FROM " + this.tbl_playerstats + @" tps
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID
INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
INNER JOIN " + this.tbl_playerrank + @" tpr ON tpr.PlayerID = tsp.PlayerID
WHERE tpr.ServerGroup = @ServerGroup AND tpr.rankScore BETWEEN 1 AND 10
GROUP BY tsp.PlayerID
ORDER BY tpr.rankScore ASC";
}
else
{
SQL = @"SELECT tpd.SoldierName, tps.Score, tps.Kills, tps.Deaths, tps.Headshots
FROM " + this.tbl_playerstats + @" tps
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID
INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
WHERE tsp.ServerID = @ServerID AND tps.rankScore BETWEEN 1 AND 10
ORDER BY tps.rankScore ASC";
}
}
else
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
SQL = @"SELECT tpd.SoldierName, SUM(tps.Score) AS Score, SUM(tps.Kills) AS Kills, SUM(tps.Deaths) AS Deaths , SUM(tps.Headshots) AS Headshots
FROM " + this.tbl_playerstats + @" tps
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID
INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
INNER JOIN " + this.tbl_playerrank + @" tpr ON tpr.PlayerID = tsp.PlayerID
WHERE tpr.ServerGroup = @ServerGroup AND tpr.rankKills BETWEEN 1 AND 10
GROUP BY tsp.PlayerID
ORDER BY tpr.rankKills ASC";
}
else
{
SQL = @"SELECT tpd.SoldierName, tps.Score, tps.Kills, tps.Deaths, tps.Headshots
FROM " + this.tbl_playerstats + @" tps
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID
INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
WHERE tsp.ServerID = @ServerID AND tps.rankKills BETWEEN 1 AND 10
ORDER BY tps.rankKills ASC";
}
}
using (MySqlCommand MyCommand = new MySqlCommand(SQL))
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
}
else
{
MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
}
DataTable resultTable;
try
{
resultTable = this.SQLquery(MyCommand);
result = new List();
//Top 10 Header
result.Add(this.m_strTop10Header.Replace("%serverName%", this.serverName));
StringBuilder Top10Row = new StringBuilder();
double kdr1;
double khr;
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
Top10Row.Append(this.m_strTop10RowFormat);
if (Convert.ToDouble(row["Deaths"]) != 0)
{
kdr1 = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Deaths"]);
Top10Row.Replace("%playerKDR%", Math.Round(kdr1, 2).ToString());
}
else
{
Top10Row.Replace("%playerKDR%", Convert.ToDouble(row["Kills"]).ToString());
}
if (Convert.ToDouble(row["Headshots"]) != 0)
{
khr = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Headshots"]);
khr = Math.Round(khr, 4);
khr = khr * 100;
Top10Row.Replace("%playerKHR%", khr.ToString());
}
else
{
khr = 0;
}
rank = rank + 1;
Top10Row.Replace("%Rank%", rank.ToString()).Replace("%playerName%", row["SoldierName"].ToString()).Replace("%playerScore%", row["Score"].ToString()).Replace("%playerKills%", row["Kills"].ToString());
Top10Row.Replace("%playerDeaths%", row["Deaths"].ToString()).Replace("%playerHeadshots%", row["Headshots"].ToString());
result.Add(Top10Row.ToString());
Top10Row.Length = 0;
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "GetTop10: " + c);
}
}
if (result.Count > 0)
{
this.SendMultiLineChatMessage(result, 0, delay, scope, strSpeaker);
}
}
}
private void GetWeaponStats(string strWeapon, string strPlayer, string scope)
{
this.DebugInfo("Trace", "GetWeaponStats: " + strPlayer + " " + strWeapon);
int delay = 0;
string SQL = String.Empty;
List result = new List();
if (this.DamageClass.ContainsKey(strWeapon) == true)
//if (this.WeaponMappingDic.ContainsKey(strWeapon) == true)
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
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
FROM (SELECT sub.PlayerID, (@num := @num + 1) AS rank, `Kills`, `Headshots`, `Deaths`
FROM
(SELECT tsp.PlayerID, SUM(`Kills`) AS `Kills`, SUM(`Headshots`) AS `Headshots`, SUM(`Deaths`) AS `Deaths`
FROM " + this.tbl_weapons_stats + @" tw
INNER JOIN " + this.tbl_server_player + @" tsp ON tw.StatsID = tsp.StatsID
INNER JOIN " + this.tbl_server + @" tserver ON tsp.ServerID = tserver.ServerID AND tserver.ServerGroup = @ServerGroup ,(SELECT @num := 0) x
WHERE tw.WeaponID = @WeaponID
GROUP BY tsp.PlayerID
ORDER BY `Kills` DESC, `Headshots` DESC) sub )sub2
INNER JOIN " + this.tbl_playerdata + @" tpd ON tpd.PlayerID = sub2.PlayerID
WHERE tpd.SoldierName = @SoldierName AND tpd.GameID = @GameID LIMIT 1";
}
else
{
SQL = @"SELECT
Kills,
Headshots,
Deaths,
(SELECT
rank
FROM
(SELECT
@rownum:=@rownum + 1 AS rank, sub.PlayerID
FROM
(SELECT @rownum:=0) r, (SELECT
tsp.PlayerID
FROM
" + this.tbl_weapons_stats + @" tw
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.ServerID = @ServerID
AND tw.StatsID = tsp.StatsID
WHERE
tw.WeaponID = @WeaponID
ORDER BY tw.Kills DESC , tw.Headshots DESC) sub) sub2
WHERE
PlayerID = tpd.PlayerID
LIMIT 1) AS rank,
(SELECT
COUNT(*)
FROM
" + this.tbl_server_player + @"
WHERE
ServerID = @ServerID) AS allrank
FROM
" + this.tbl_weapons_stats + @" tw
INNER JOIN
" + this.tbl_server_player + @" tsp ON tw.StatsID = tsp.StatsID
AND tsp.ServerID = @ServerID
INNER JOIN
" + this.tbl_playerdata + @" tpd ON tpd.PlayerID = tsp.PlayerID
WHERE
tpd.SoldierName = @SoldierName
AND tpd.GameID = @GameID
AND WeaponID = @WeaponID
LIMIT 1";
}
this.DebugInfo("Trace", "GetWeaponStats: Query:" + SQL);
using (MySqlCommand MyCommand = new MySqlCommand(SQL))
{
//MyCommand.Parameters.AddWithValue("@WeaponID", this.weaponDic[this.DamageClass[strWeapon]][strWeapon].Name);
MyCommand.Parameters.AddWithValue("@WeaponID", this.WeaponMappingDic[this.weaponDic[this.DamageClass[strWeapon]][strWeapon].Name]);
MyCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
MyCommand.Parameters.AddWithValue("@SoldierName", strPlayer);
MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
}
else
{
MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
MyCommand.Parameters.AddWithValue("@SoldierName", strPlayer);
}
try
{
DataTable resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
result = new List(this.m_lstWeaponstatsMsg);
if (row[0] != Convert.DBNull || row[1] != Convert.DBNull || row[2] != Convert.DBNull)
{
result = this.ListReplace(result, "%playerKills%", row[0].ToString());
result = this.ListReplace(result, "%playerHeadshots%", row[1].ToString());
result = this.ListReplace(result, "%playerDeaths%", row[2].ToString());
result = this.ListReplace(result, "%playerRank%", row[3].ToString());
result = this.ListReplace(result, "%allRanks%", row[4].ToString());
double khr = 0;
if (Convert.ToDouble(row[0]) != 0)
{
khr = Convert.ToDouble(row[1]) / Convert.ToDouble(row[0]);
khr = Math.Round(khr, 2);
khr = khr * 100;
}
else
{
khr = 0;
}
double kdr = 0;
if (Convert.ToDouble(row[2]) != 0)
{
kdr = Convert.ToDouble(row[0]) / Convert.ToDouble(row[2]);
kdr = Math.Round(kdr, 2);
}
else
{
kdr = Convert.ToDouble(row[2]);
}
result = this.ListReplace(result, "%playerKHR%", khr.ToString());
result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
}
else
{
result.Clear();
}
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "GetWeaponStats: " + c);
}
}
result = this.ListReplace(result, "%playerName%", strPlayer);
result = this.ListReplace(result, "%Weapon%", this.weaponDic[this.DamageClass[strWeapon]][strWeapon].FieldName);
if (result.Count > 0)
{
this.SendMultiLineChatMessage(result, delay, 0, scope, strPlayer);
}
else
{
result.Clear();
result.Add("No Stats are available for this Weapon!!!");
this.SendMultiLineChatMessage(result, delay, 0, scope, strPlayer);
}
}
else
{
result.Clear();
result.Add("Specific Weapon not found!!");
this.SendMultiLineChatMessage(result, delay, 0, scope, strPlayer);
}
}
private void GetWeaponTop10(string strWeapon, string strPlayer, int delay, string scope)
{
this.DebugInfo("Trace", "GetWeaponTop10: strWeapon = " + strWeapon);
int delaytop10 = 0;
double kdr = 0;
double khr = 0;
int rank = 0;
string SQL = String.Empty;
List result = new List();
if (this.DamageClass.ContainsKey(strWeapon) == true)
{
//string tbl_weapons = "tbl_weapons_" + this.DamageClass[strWeapon].ToLower() + this.tableSuffix;
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
SQL = @"SELECT tpd.SoldierName, SUM(`Kills`) AS `Kills`, SUM(`Headshots`) AS `Headshots`, SUM(`Deaths`) AS `Deaths`
FROM " + this.tbl_weapons_stats + @" tw
INNER JOIN " + this.tbl_server_player + @" tsp ON tw.StatsID = tsp.StatsID
INNER JOIN " + this.tbl_playerdata + @" tpd ON tpd.PlayerID = tsp.PlayerID
INNER JOIN " + this.tbl_server + @" ts ON ts.ServerID = tsp.ServerID
WHERE ts.ServerGroup = @ServerGroup AND tw.WeaponID = @WeaponID
GROUP BY tsp.PlayerID
ORDER BY SUM(`Kills`) DESC, SUM(`Headshots`) DESC
LIMIT 10";
}
else
{
SQL = @"SELECT tpd.SoldierName, `Kills`, `Headshots`, `Deaths`
FROM " + this.tbl_weapons_stats + @" tw
INNER JOIN " + this.tbl_server_player + @" tsp ON tw.StatsID = tsp.StatsID
INNER JOIN " + this.tbl_playerdata + @" tpd ON tpd.PlayerID = tsp.PlayerID
WHERE tsp.ServerID = @ServerID AND tw.WeaponID = @WeaponID
ORDER BY `Kills` DESC, `Headshots` DESC
LIMIT 10";
}
//SQL = SQL.Replace("%Weapon%", this.weaponDic[this.DamageClass[strWeapon]][strWeapon].FieldName);
this.DebugInfo("Trace", "GetWeaponTop10: Query:" + SQL);
using (MySqlCommand MyCommand = new MySqlCommand(SQL))
{
MyCommand.Parameters.AddWithValue("@WeaponID", this.WeaponMappingDic[this.weaponDic[this.DamageClass[strWeapon]][strWeapon].Name]);
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
}
else
{
MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
}
DataTable resultTable;
try
{
result = new List();
//result.Add("Top 10 Killers with %Weapon%");
result.Add(this.m_strWeaponTop10Header.Replace("%serverName%", this.serverName));
resultTable = this.SQLquery(MyCommand);
StringBuilder Top10Row = new StringBuilder(this.m_strWeaponTop10RowFormat);
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
if (Convert.ToDouble(row[3]) != 0)
{
kdr = Convert.ToDouble(row[1]) / Convert.ToDouble(row[3]);
kdr = Math.Round(kdr, 2);
}
else
{
kdr = Convert.ToDouble(row[1]);
}
if (Convert.ToDouble(row[1]) != 0)
{
khr = Convert.ToDouble(row[2]) / Convert.ToDouble(row[1]);
khr = Math.Round(khr, 4);
khr = khr * 100;
}
else
{
khr = 0;
}
Top10Row.Length = 0;
Top10Row.Append(this.m_strWeaponTop10RowFormat);
rank = rank + 1;
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());
result.Add(Top10Row.ToString());
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "GetWeaponTop10: " + c);
}
}
result = this.ListReplace(result, "%Player%", strPlayer);
result = this.ListReplace(result, "%Weapon%", this.weaponDic[this.DamageClass[strWeapon]][strWeapon].FieldName);
if (result.Count > 0)
{
this.SendMultiLineChatMessage(result, 0, delay, scope, strPlayer);
}
else
{
result.Clear();
result.Add("No Stats are available for this Weapon!!!");
this.SendMultiLineChatMessage(result, 0, delay, scope, strPlayer);
}
}
else
{
result.Clear();
result.Add("Specific Weapon not found!!");
this.SendMultiLineChatMessage(result, 0, delay, scope, strPlayer);
}
}
private void GetDogtags(string strPlayer, int delay, string scope)
{
int delaydogtags = 0;
string SQL = String.Empty;
string SQL2 = String.Empty;
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
SQL = @"SELECT pd.SoldierName, SUM(dt.Count) AS Count
FROM " + this.tbl_server_player + @" sp
INNER JOIN " + this.tbl_server + @" ts ON ts.ServerID = sp.ServerID AND ts.ServerGroup = @ServerGroup
INNER JOIN " + this.tbl_dogtags + @" dt ON sp.StatsID = dt.VictimID
INNER JOIN " + this.tbl_playerdata + @" pd ON sp.PlayerID = pd.PlayerID
WHERE KillerID IN (SELECT StatsID AS KillerID FROM " + this.tbl_server_player + @" WHERE PlayerID = @KillerID)
GROUP BY pd.PlayerID ORDER BY Count DESC Limit 3";
SQL2 = @"SELECT pd.SoldierName, SUM(dt.Count) AS Count
FROM " + this.tbl_server_player + @" sp
INNER JOIN " + this.tbl_server + @" ts ON ts.ServerID = sp.ServerID AND ts.ServerGroup = @ServerGroup
INNER JOIN " + this.tbl_dogtags + @" dt ON sp.StatsID = dt.KillerID
INNER JOIN " + this.tbl_playerdata + @" pd ON sp.PlayerID = pd.PlayerID
WHERE VictimID IN (SELECT StatsID AS VictimID FROM " + this.tbl_server_player + @" WHERE PlayerID = @VictimID)
GROUP BY pd.PlayerID ORDER BY Count DESC Limit 3";
}
else
{
SQL = @"SELECT pd.SoldierName, dt.Count
FROM " + this.tbl_server_player + @" sp
INNER JOIN " + this.tbl_dogtags + @" dt ON sp.StatsID = dt.VictimID
INNER JOIN " + this.tbl_playerdata + @" pd ON sp.PlayerID = pd.PlayerID
WHERE KillerID = @KillerID AND sp.ServerID = @ServerID
ORDER BY Count DESC Limit 3";
SQL2 = @"SELECT pd.SoldierName, dt.Count
FROM " + this.tbl_server_player + @" sp
INNER JOIN " + this.tbl_dogtags + @" dt ON sp.StatsID = dt.KillerID
INNER JOIN " + this.tbl_playerdata + @" pd ON sp.PlayerID = pd.PlayerID
WHERE VictimID = @VictimID AND sp.ServerID = @ServerID
ORDER BY Count DESC Limit 3";
}
List result = new List();
List result2 = new List();
if (this.StatsTracker.ContainsKey(strPlayer) == false)
{
return;
}
using (MySqlCommand MyCommand = new MySqlCommand(SQL))
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
MyCommand.Parameters.AddWithValue("@KillerID", this.GetID(this.StatsTracker[strPlayer].EAGuid).Id);
}
else
{
MyCommand.Parameters.AddWithValue("@KillerID", this.GetID(this.StatsTracker[strPlayer].EAGuid).StatsID);
MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
}
try
{
result = new List();
result.Add("Your favorite Victims:");
DataTable resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows.Count > 0)
{
foreach (DataRow row in resultTable.Rows)
{
result.Add(" " + row["Count"] + "x " + row["SoldierName"]);
}
}
else
{
result.Add("None - Get some dogtags!!");
}
resultTable.Dispose();
}
catch (Exception c)
{
this.DebugInfo("Error", "GetDogtags: " + c);
}
}
using (MySqlCommand MyCommand = new MySqlCommand(SQL2))
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
MyCommand.Parameters.AddWithValue("@VictimID", this.GetID(this.StatsTracker[strPlayer].EAGuid).Id);
}
else
{
MyCommand.Parameters.AddWithValue("@VictimID", this.GetID(this.StatsTracker[strPlayer].EAGuid).StatsID);
MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
}
try
{
result2 = new List();
result2.Add("Your worst Enemies:");
DataTable resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows.Count > 0)
{
foreach (DataRow row in resultTable.Rows)
{
result2.Add(" " + row["Count"] + "x " + row["SoldierName"]);
}
}
else
{
result2.Add("Nobody got your Tag yet!");
}
resultTable.Dispose();
}
catch (Exception c)
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "Error in GetDogtags: " + c);
}
}
this.CloseMySqlConnection(1);
result.AddRange(result2);
if (result[0].Equals("0") == false)
{
this.SendMultiLineChatMessage(result, delaydogtags, delay, scope, strPlayer);
}
else
{
result.Clear();
result.Add("No Stats are available!!!");
this.SendMultiLineChatMessage(result, delaydogtags, delay, scope, strPlayer);
}
}
private void GetPlayerOfTheDay(string strSpeaker, int delay, string scope)
{
List result = new List();
if (this.m_enLogSTATS == enumBoolYesNo.Yes)
{
string SQL = string.Empty;
string SQL_SELECT = @"SELECT
tpd.SoldierName AS SoldierName,
SUM(ts.Score) AS Score,
SUM(ts.Kills) AS Kills,
SUM(ts.Headshots) AS Headshots,
SUM(ts.Deaths) AS Deaths,
SUM(ts.TKs) AS TKs,
SUM(ts.Suicide) AS Suicide,
SUM(ts.RoundCount ) AS RoundCount,
SUM(ts.Playtime) AS Playtime,
MAX(ts.Killstreak) AS Killstreak,
MAX(ts.Deathstreak) AS Deathstreak,
MAX(ts.HighScore) AS HighScore,
SUM(ts.Wins ) AS Wins,
SUM(ts.Losses ) AS Losses, ";
string SQL_JOINS = @" FROM " + this.tbl_sessions + @" ts
INNER JOIN " + this.tbl_server_player + @" tsp USING(StatsID)
INNER JOIN " + this.tbl_playerdata + @" tpd USING(PlayerID) ";
string SQL_CONDS = string.Empty;
string strMSG = String.Empty;
double kdr = 0;
//Statsquery with KDR
//Rankquery
if (m_enRankingByScore == enumBoolYesNo.Yes)
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
//Ranking by Score overall Server
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 ";
SQL_JOINS = SQL_JOINS + @" INNER JOIN " + this.tbl_server + @" ts2 USING(ServerID)
INNER JOIN " + this.tbl_playerrank + @" tpr USING(PlayerID)";
SQL_CONDS = @" WHERE ts.StartTime >= CURRENT_DATE() AND ts2.ServerGroup = @ServerGroup
Group BY tsp.StatsID
ORDER BY SUM(ts.Score) DESC ";
}
else
{
//Ranking by Score specfic Server
SQL_SELECT = SQL_SELECT + @"(SELECT tss.CountPlayers FROM " + this.tbl_server_stats + @" tss WHERE ServerID = @ServerID ) AS allrank, tps.rankScore AS rank ";
SQL_JOINS = SQL_JOINS + @" INNER JOIN " + this.tbl_playerstats + @" tps USING(StatsID) ";
SQL_CONDS = @" WHERE ts.StartTime >= CURRENT_DATE() AND tsp.ServerID = @ServerID
Group BY tsp.StatsID
ORDER BY SUM(ts.Score) DESC ";
}
}
else
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
//Ranking by Kills overall Server
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 ";
SQL_JOINS = SQL_JOINS + @" INNER JOIN " + this.tbl_server + @" ts2 USING(ServerID)
INNER JOIN " + this.tbl_playerrank + @" tpr USING(PlayerID)";
SQL_CONDS = @" WHERE ts.StartTime >= CURRENT_DATE() AND ts2.ServerGroup = @ServerGroup
Group BY tsp.StatsID
ORDER BY SUM(ts.Kills) DESC, SUM(ts.Deaths) ASC ";
}
else
{
//Ranking by Kills specfic Server
SQL_SELECT = SQL_SELECT + @"(SELECT tss.CountPlayers FROM " + this.tbl_server_stats + @" tss WHERE ServerID = @ServerID ) AS allrank , tps.rankKills AS rank ";
SQL_JOINS = SQL_JOINS + @" INNER JOIN " + this.tbl_playerstats + @" tps USING(StatsID) ";
SQL_CONDS = @" WHERE ts.StartTime >= CURRENT_DATE() AND tsp.ServerID = @ServerID
Group BY tsp.StatsID
ORDER BY SUM(ts.Kills) DESC, SUM(ts.Deaths) ASC ";
}
}
//Add LIMIT
SQL = SQL_SELECT + SQL_JOINS + SQL_CONDS + @" LIMIT 1";
using (MySqlCommand MyCommand = new MySqlCommand(SQL))
{
DataTable resultTable;
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
}
else
{
MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
}
try
{
resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
result = new List(m_lstPlayerOfTheDayMessage);
result = this.ListReplace(result, "%playerName%", row["SoldierName"].ToString());
result = this.ListReplace(result, "%playerScore%", row["Score"].ToString());
result = this.ListReplace(result, "%playerKills%", row["Kills"].ToString());
result = this.ListReplace(result, "%playerDeaths%", row["Deaths"].ToString());
result = this.ListReplace(result, "%playerSuicide%", row["Suicide"].ToString());
result = this.ListReplace(result, "%playerTKs%", row["TKs"].ToString());
result = this.ListReplace(result, "%playerRank%", row["rank"].ToString());
result = this.ListReplace(result, "%allRanks%", row["allrank"].ToString());
result = this.ListReplace(result, "%playerHeadshots%", row["Headshots"].ToString());
result = this.ListReplace(result, "%rounds%", row["RoundCount"].ToString());
result = this.ListReplace(result, "%killstreak%", row["Killstreak"].ToString());
result = this.ListReplace(result, "%deathstreak%", row["Deathstreak"].ToString());
//KDR
if (Convert.ToInt32(row["Deaths"]) != 0)
{
kdr = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Deaths"]);
kdr = Math.Round(kdr, 2);
result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
}
else
{
kdr = Convert.ToDouble(row["Kills"]);
result = this.ListReplace(result, "%playerKDR%", kdr.ToString());
}
//Playtime
TimeSpan span = new TimeSpan(0, 0, Convert.ToInt32(row["Playtime"]));
result = this.ListReplace(result, "%playerPlaytime%", span.ToString());
//SPM
double SPM;
if (Convert.ToDouble(row["Playtime"]) != 0)
{
SPM = (Convert.ToDouble(row["Score"]) / (Convert.ToDouble(row["Playtime"]) / 60));
SPM = Math.Round(SPM, 2);
result = this.ListReplace(result, "%SPM%", SPM.ToString());
}
else
{
result = this.ListReplace(result, "%SPM%", "0");
}
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "GetPlayerOfTheDay: " + c);
}
}
if (result.Count != 0)
{
this.SendMultiLineChatMessage(result, delay, 0, scope, strSpeaker);
}
else
{
result.Clear();
result.Add("No Stats are available yet! Please wait one Round!");
this.SendMultiLineChatMessage(result, delay, 0, scope, strSpeaker);
}
}
}
private void GetTop10ForPeriod(string strSpeaker, int delay, string scope, int intdays)
{
List result = new List();
if (this.m_enTop10ingame == enumBoolYesNo.Yes)
{
string SQL = @"SELECT
tpd.SoldierName AS SoldierName,
SUM(ts.Score) AS Score,
SUM(ts.Kills) AS Kills,
SUM(ts.Headshots) AS Headshots,
SUM(ts.Deaths) AS Deaths,
SUM(ts.TKs) AS TKs,
SUM(ts.Suicide) AS Suicide,
SUM(ts.RoundCount ) AS RoundCount,
SUM(ts.Playtime) AS Playtime
FROM " + this.tbl_sessions + @" ts
INNER JOIN " + this.tbl_server_player + @" tsp USING(StatsID)
INNER JOIN " + this.tbl_playerdata + @" tpd USING(PlayerID) ";
int rank = 0;
//Top10 Query
if (m_enRankingByScore == enumBoolYesNo.Yes)
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
//Ranking by Score overall Server
SQL = SQL + @" INNER JOIN " + this.tbl_server + @" ts2 USING(ServerID)
WHERE ts.StartTime >= DATE_SUB(CURRENT_DATE(),INTERVAL @DAYS DAY) AND ts2.ServerGroup = @ServerGroup
Group BY tsp.StatsID
ORDER BY SUM(ts.Score) DESC ";
}
else
{
//Ranking by Score specfic Server
SQL = SQL + @" WHERE ts.StartTime >= DATE_SUB(CURRENT_DATE(),INTERVAL @DAYS DAY) AND tsp.ServerID = @ServerID
Group BY tsp.StatsID
ORDER BY SUM(ts.Score) DESC ";
}
}
else
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
//Ranking by Kills overall Server
SQL = SQL + @" INNER JOIN " + this.tbl_server + @" ts2 USING(ServerID)
WHERE ts.StartTime >= DATE_SUB(CURRENT_DATE(),INTERVAL @DAYS DAY) AND ts2.ServerGroup = @ServerGroup
Group BY tsp.StatsID
ORDER BY SUM(ts.Kills) DESC, SUM(ts.Deaths) ASC ";
}
else
{
//Ranking by Kills specfic Server
SQL = SQL + @" WHERE ts.StartTime >= DATE_SUB(CURRENT_DATE(),INTERVAL @DAYS DAY) AND tsp.ServerID = @ServerID
Group BY tsp.StatsID
ORDER BY SUM(ts.Kills) DESC, SUM(ts.Deaths) ASC ";
}
}
//Add LIMIT
SQL = SQL + @" LIMIT 10";
using (MySqlCommand MyCommand = new MySqlCommand(SQL))
{
MyCommand.Parameters.AddWithValue("@DAYS", intdays);
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
MyCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
}
else
{
MyCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
}
DataTable resultTable;
try
{
resultTable = this.SQLquery(MyCommand);
result = new List();
//Top 10 Header
result.Add(this.m_strTop10HeaderForPeriod.Replace("%serverName%", this.serverName).Replace("%intervaldays%", intdays.ToString()));
StringBuilder Top10Row = new StringBuilder();
double kdr1;
double khr;
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
Top10Row.Append(this.m_strTop10RowFormat);
if (Convert.ToDouble(row["Deaths"]) != 0)
{
kdr1 = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Deaths"]);
Top10Row.Replace("%playerKDR%", Math.Round(kdr1, 2).ToString());
}
else
{
Top10Row.Replace("%playerKDR%", Convert.ToDouble(row["Kills"]).ToString());
}
if (Convert.ToDouble(row["Headshots"]) != 0)
{
khr = Convert.ToDouble(row["Kills"]) / Convert.ToDouble(row["Headshots"]);
khr = Math.Round(khr, 4);
khr = khr * 100;
Top10Row.Replace("%playerKHR%", khr.ToString());
}
else
{
khr = 0;
}
rank = rank + 1;
Top10Row.Replace("%Rank%", rank.ToString()).Replace("%playerName%", row["SoldierName"].ToString()).Replace("%playerScore%", row["Score"].ToString()).Replace("%playerKills%", row["Kills"].ToString());
Top10Row.Replace("%playerDeaths%", row["Deaths"].ToString()).Replace("%playerHeadshots%", row["Headshots"].ToString());
result.Add(Top10Row.ToString());
Top10Row.Length = 0;
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "GetTop10ForPeriod: " + c);
}
}
if (result.Count > 0)
{
this.SendMultiLineChatMessage(result, 0, delay, scope, strSpeaker);
}
}
}
//Add to stats
private void AddKillToStats(string strPlayerName, string DmgType, string weapon, bool headshot)
{
if (StatsTracker.ContainsKey(strPlayerName))
{
StatsTracker[strPlayerName].addKill(DmgType, weapon, headshot);
}
else
{
CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic);
StatsTracker.Add(strPlayerName, newEntry);
StatsTracker[strPlayerName].addKill(DmgType, weapon, headshot);
}
//Session
if (m_dicSession.ContainsKey(strPlayerName) && this.m_sessionON == enumBoolYesNo.Yes)
{
m_dicSession[strPlayerName].addKill(DmgType, weapon, headshot);
}
}
public void AddDeathToStats(string strPlayerName, string DmgType, string weapon)
{
if (StatsTracker.ContainsKey(strPlayerName))
{
StatsTracker[strPlayerName].addDeath(DmgType, weapon);
}
else
{
CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic);
StatsTracker.Add(strPlayerName, newEntry);
StatsTracker[strPlayerName].addDeath(DmgType, weapon);
}
//Session
if (m_dicSession.ContainsKey(strPlayerName) && this.m_sessionON == enumBoolYesNo.Yes)
{
m_dicSession[strPlayerName].addDeath(DmgType, weapon);
}
}
private void AddSuicideToStats(string strPlayerName, string DmgType, string weapon)
{
if (StatsTracker.ContainsKey(strPlayerName))
{
StatsTracker[strPlayerName].addDeath(DmgType, weapon);
StatsTracker[strPlayerName].Suicides++;
}
else
{
CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 1, 0, 0, this.m_dTimeOffset, this.weaponDic);
StatsTracker.Add(strPlayerName, newEntry);
StatsTracker[strPlayerName].addDeath(DmgType, weapon);
}
//Session
if (m_dicSession.ContainsKey(strPlayerName) && this.m_sessionON == enumBoolYesNo.Yes)
{
m_dicSession[strPlayerName].addDeath(DmgType, weapon);
m_dicSession[strPlayerName].Suicides++;
}
}
private void AddTeamKillToStats(string strPlayerName)
{
if (StatsTracker.ContainsKey(strPlayerName))
{
StatsTracker[strPlayerName].Teamkills++;
}
else
{
CStats newEntry = new CStats(String.Empty, 0, 0, 0, 0, 0, 1, 0, this.m_dTimeOffset, this.weaponDic);
StatsTracker.Add(strPlayerName, newEntry);
}
//Session
if (m_dicSession.ContainsKey(strPlayerName) && this.m_sessionON == enumBoolYesNo.Yes)
{
m_dicSession[strPlayerName].Teamkills++;
}
}
//Misc
private void AddPBInfoToStats(CPunkbusterInfo cpbiPlayer)
{
if (StatsTracker.ContainsKey(cpbiPlayer.SoldierName))
{
StatsTracker[cpbiPlayer.SoldierName].Guid = cpbiPlayer.GUID;
if (cpbiPlayer.PlayerCountryCode.Length <= 2)
{
StatsTracker[cpbiPlayer.SoldierName].PlayerCountryCode = cpbiPlayer.PlayerCountryCode;
}
else
{
StatsTracker[cpbiPlayer.SoldierName].PlayerCountryCode = "--";
}
if (StatsTracker[cpbiPlayer.SoldierName].TimePlayerjoined == null)
StatsTracker[cpbiPlayer.SoldierName].TimePlayerjoined = MyDateTime.Now;
}
else
{
CStats newEntry = new CStats(cpbiPlayer.GUID, 0, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic);
StatsTracker.Add(cpbiPlayer.SoldierName, newEntry);
if (cpbiPlayer.PlayerCountryCode.Length <= 2)
{
StatsTracker[cpbiPlayer.SoldierName].PlayerCountryCode = cpbiPlayer.PlayerCountryCode;
}
else
{
StatsTracker[cpbiPlayer.SoldierName].PlayerCountryCode = "--";
}
}
}
private void OpenMySqlConnection(int type)
{
try
{
switch (type)
{
//OdbcCon
case 1:
if (MySqlCon == null)
{
MySqlCon = new MySqlConnection(this.DBConnectionStringBuilder());
MySqlCon.Open();
}
if (MySqlCon.State == ConnectionState.Closed)
{
MySqlCon = new MySqlConnection(this.DBConnectionStringBuilder());
MySqlCon.Open();
//this.DebugInfo("Info", "MySqlCon was close Current State is open");
}
break;
//ODBCConn
case 2:
if (MySqlConn == null)
{
MySqlConn = new MySqlConnection(this.DBConnectionStringBuilder());
MySqlConn.Open();
}
if (MySqlConn.State == ConnectionState.Closed)
{
MySqlConn = new MySqlConnection(this.DBConnectionStringBuilder());
MySqlConn.Open();
//this.DebugInfo("Info", "MySqlConn was close, Reopen it, Current State is open");
}
break;
default:
break;
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "OpenConnection:");
this.DisplayMySqlErrorCollection(oe);
}
catch (Exception c)
{
this.DebugInfo("Error", "OpenConnection: " + c);
}
}
private void CloseMySqlConnection(int type)
{
if (this.MySql_Connection_is_activ == false)
{
try
{
switch (type)
{
case 1:
//OdbcCon
if (this.MySqlCon != null)
{
this.MySqlCon.Close();
this.DebugInfo("Info", "Connection MySqlCon closed");
}
break;
case 2:
//ODBCConn
if (this.MySqlConn != null)
{
this.MySqlConn.Close();
this.DebugInfo("Info", "Connection MySqlConn closed");
}
break;
default:
break;
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "CloseMySqlConnection:");
this.DisplayMySqlErrorCollection(oe);
}
catch (Exception c)
{
this.ExecuteCommand("Error", "CloseMySqlConnection: " + c);
}
}
}
private void tablebuilder()
{
if (boolTableEXISTS)
{
return;
}
lock (this.tablebuilderlock)
{
Thread.Sleep(3000);
if ((m_strHost.Length == 0) || (m_strDatabase.Length == 0) || (m_strDBPort.Length == 0) || (m_strUserName.Length == 0))
{
this.DebugInfo("Error", "Check you MySQL Server Details:, hostname, port, databasename and your login credentials!");
this.ExecuteCommand("procon.protected.plugins.enable", "CChatGUIDStatsLogger", "False");
return;
}
if ((m_strHost != null) && (m_strDatabase != null) && (m_strDBPort != null) && (m_strUserName != null) && (m_strPassword != null) && (boolTableEXISTS == false))
{
this.DebugInfo("Info", "Start tablebuilder");
//new
this.generateWeaponList();
try
{
using (MySqlConnection TablebuilderCon = new MySqlConnection(this.DBConnectionStringBuilder()))
{
MySql.Data.MySqlClient.MySqlTransaction TableTransaction = null;
try
{
this.MySql_Connection_is_activ = true;
MySql.Data.MySqlClient.MySqlParameter param = new MySql.Data.MySqlClient.MySqlParameter();
TablebuilderCon.Open();
//Chatlog Table
string SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_chatlog + @"` (
`ID` INT NOT NULL AUTO_INCREMENT ,
`logDate` DATETIME NULL DEFAULT NULL ,
`ServerID` SMALLINT UNSIGNED NOT NULL ,
`logSubset` VARCHAR(45) NULL DEFAULT NULL ,
`logSoldierName` VARCHAR(45) NULL DEFAULT NULL ,
`logMessage` TEXT NULL DEFAULT NULL ,
PRIMARY KEY (`ID`),
INDEX `INDEX_SERVERID` (`ServerID` ASC),
INDEX `INDEX_logDate` (`logDate` ASC))
ENGINE = InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon))
{
OdbcCom.ExecuteNonQuery();
}
//MapStats Table
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_mapstats + @"` (
`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`ServerID` SMALLINT UNSIGNED NOT NULL DEFAULT '0' ,
`TimeMapLoad` DATETIME NULL DEFAULT NULL ,
`TimeRoundStarted` DATETIME NULL DEFAULT NULL ,
`TimeRoundEnd` DATETIME NULL DEFAULT NULL ,
`MapName` VARCHAR(45) NULL DEFAULT NULL ,
`Gamemode` VARCHAR(45) NULL DEFAULT NULL ,
`Roundcount` SMALLINT NOT NULL DEFAULT '0' ,
`NumberofRounds` SMALLINT NOT NULL DEFAULT '0' ,
`MinPlayers` SMALLINT NOT NULL DEFAULT '0' ,
`AvgPlayers` DOUBLE NOT NULL DEFAULT '0' ,
`MaxPlayers` SMALLINT NOT NULL DEFAULT '0' ,
`PlayersJoinedServer` SMALLINT NOT NULL DEFAULT '0' ,
`PlayersLeftServer` SMALLINT NOT NULL DEFAULT '0' ,
PRIMARY KEY (`ID`) ,
INDEX `ServerID_INDEX` (`ServerID` ASC) )
ENGINE = InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon))
{
OdbcCom.ExecuteNonQuery();
}
//Start of the Transaction
TableTransaction = TablebuilderCon.BeginTransaction();
//Table tbl_games
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_games + @"` (
`GameID` tinyint(4) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`GameID`),
UNIQUE KEY `name_unique` (`Name`)
) ENGINE=InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Table playerdata
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_playerdata + @"` (
`PlayerID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`GameID` tinyint(4)unsigned NOT NULL DEFAULT '0',
`ClanTag` VARCHAR(10) NULL DEFAULT NULL ,
`SoldierName` VARCHAR(45) NULL DEFAULT NULL ,
`GlobalRank` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
`PBGUID` VARCHAR(32) NULL DEFAULT NULL ,
`EAGUID` VARCHAR(35) NULL DEFAULT NULL ,
`IP_Address` VARCHAR(15) NULL DEFAULT NULL ,
`IPv6_Address` VARBINARY(16) NULL DEFAULT NULL ,
`CountryCode` VARCHAR(2) NULL DEFAULT NULL ,
PRIMARY KEY (`PlayerID`) ,
UNIQUE INDEX `UNIQUE_playerdata` (`GameID` ASC,`EAGUID` ASC) ,
INDEX `INDEX_SoldierName` (`SoldierName` ASC) )
ENGINE = InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Server Table
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_server + @"` (
`ServerID` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT ,
`ServerGroup` TINYINT UNSIGNED NOT NULL DEFAULT 0 ,
`IP_Address` VARCHAR(45) NULL DEFAULT NULL ,
`ServerName` VARCHAR(200) NULL DEFAULT NULL ,
`GameID` tinyint(4)unsigned NOT NULL DEFAULT '0',
`usedSlots` SMALLINT UNSIGNED NULL DEFAULT 0 ,
`maxSlots` SMALLINT UNSIGNED NULL DEFAULT 0 ,
`mapName` VARCHAR(45) NULL DEFAULT NULL ,
`fullMapName` TEXT NULL DEFAULT NULL ,
`Gamemode` VARCHAR(45) NULL DEFAULT NULL ,
`GameMod` VARCHAR(45) NULL DEFAULT NULL ,
`PBversion` VARCHAR(45) NULL DEFAULT NULL ,
`ConnectionState` VARCHAR(45) NULL DEFAULT NULL ,
PRIMARY KEY (`ServerID`) ,
INDEX `INDEX_SERVERGROUP` (`ServerGroup` ASC) ,
UNIQUE INDEX `IP_Address_UNIQUE` (`IP_Address` ASC) )
ENGINE = InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Server Player Table
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_server_player + @"` (
`StatsID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`ServerID` SMALLINT UNSIGNED NOT NULL ,
`PlayerID` INT UNSIGNED NOT NULL ,
PRIMARY KEY (`StatsID`) ,
UNIQUE INDEX `UNIQUE_INDEX` (`ServerID` ASC, `PlayerID` ASC) ,
INDEX `fk_tbl_server_player_tbl_playerdata" + this.tableSuffix + @"` (`PlayerID` ASC) ,
INDEX `fk_tbl_server_player_tbl_server" + this.tableSuffix + @"` (`ServerID` ASC) ,
CONSTRAINT `fk_tbl_server_player_tbl_playerdata" + this.tableSuffix + @"`
FOREIGN KEY (`PlayerID` )
REFERENCES `" + this.tbl_playerdata + @"` (`PlayerID` )
ON DELETE CASCADE
ON UPDATE NO ACTION,
CONSTRAINT `fk_tbl_server_player_tbl_server" + this.tableSuffix + @"`
FOREIGN KEY (`ServerID` )
REFERENCES `" + this.tbl_server + @"` (`ServerID` )
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//
//ServerStatistics Table
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_server_stats + @"` (
`ServerID` SMALLINT(5) UNSIGNED NOT NULL ,
`CountPlayers` BIGINT NOT NULL DEFAULT 0 ,
`SumScore` BIGINT NOT NULL DEFAULT 0 ,
`AvgScore` FLOAT NOT NULL DEFAULT 0 ,
`SumKills` BIGINT NOT NULL DEFAULT 0 ,
`AvgKills` FLOAT NOT NULL DEFAULT 0 ,
`SumHeadshots` BIGINT NOT NULL DEFAULT 0 ,
`AvgHeadshots` FLOAT NOT NULL DEFAULT 0 ,
`SumDeaths` BIGINT NOT NULL DEFAULT 0 ,
`AvgDeaths` FLOAT NOT NULL DEFAULT 0 ,
`SumSuicide` BIGINT NOT NULL DEFAULT 0 ,
`AvgSuicide` FLOAT NOT NULL DEFAULT 0 ,
`SumTKs` BIGINT NOT NULL DEFAULT 0 ,
`AvgTKs` FLOAT NOT NULL DEFAULT 0 ,
`SumPlaytime` BIGINT NOT NULL DEFAULT 0 ,
`AvgPlaytime` FLOAT NOT NULL DEFAULT 0 ,
`SumRounds` BIGINT NOT NULL DEFAULT 0 ,
`AvgRounds` FLOAT NOT NULL DEFAULT 0 ,
PRIMARY KEY (`ServerID`) ,
INDEX `fk_tbl_server_stats_tbl_server" + this.tableSuffix + @"` (`ServerID` ASC) ,
CONSTRAINT `fk_tbl_server_stats_tbl_server" + this.tableSuffix + @"`
FOREIGN KEY (`ServerID` )
REFERENCES `" + this.tbl_server + @"` (`ServerID` )
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Stats Table
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_playerstats + @"` (
`StatsID` INT UNSIGNED NOT NULL ,
`Score` INT NOT NULL DEFAULT '0' ,
`Kills` INT UNSIGNED NOT NULL DEFAULT '0' ,
`Headshots` INT UNSIGNED NOT NULL DEFAULT '0' ,
`Deaths` INT UNSIGNED NOT NULL DEFAULT '0' ,
`Suicide` INT UNSIGNED NOT NULL DEFAULT '0' ,
`TKs` INT UNSIGNED NOT NULL DEFAULT '0' ,
`Playtime` INT UNSIGNED NOT NULL DEFAULT '0' ,
`Rounds` INT UNSIGNED NOT NULL DEFAULT '0' ,
`FirstSeenOnServer` DATETIME NULL DEFAULT NULL ,
`LastSeenOnServer` DATETIME NULL DEFAULT NULL ,
`Killstreak` SMALLINT UNSIGNED NOT NULL DEFAULT '0' ,
`Deathstreak` SMALLINT UNSIGNED NOT NULL DEFAULT '0' ,
`HighScore` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0' ,
`rankScore` INT UNSIGNED NOT NULL DEFAULT '0' ,
`rankKills` INT UNSIGNED NOT NULL DEFAULT '0' ,
`Wins` INT UNSIGNED NOT NULL DEFAULT '0' ,
`Losses` INT UNSIGNED NOT NULL DEFAULT '0' ,
PRIMARY KEY (`StatsID`) ,
INDEX `INDEX_Score" + this.tableSuffix + @"` (`Score`),
KEY `INDEX_RANK_SCORE" + this.tableSuffix + @"` (`rankScore`),
KEY `INDEX_RANK_KILLS" + this.tableSuffix + @"` (`rankKills`),
CONSTRAINT `fk_tbl_playerstats_tbl_server_player1" + this.tableSuffix + @"`
FOREIGN KEY (`StatsID` )
REFERENCES `" + this.tbl_server_player + @"` (`StatsID` )
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Playerrank Table
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_playerrank + @"` (
`PlayerID` INT UNSIGNED NOT NULL DEFAULT 0 ,
`ServerGroup` SMALLINT UNSIGNED NOT NULL DEFAULT 0 ,
`rankScore` INT UNSIGNED NOT NULL DEFAULT 0 ,
`rankKills` INT UNSIGNED NOT NULL DEFAULT 0 ,
INDEX `INDEX_SCORERANKING" + this.tableSuffix + @"` (`rankScore` ASC) ,
INDEX `INDEX_KILLSRANKING" + this.tableSuffix + @"` (`rankKills` ASC) ,
PRIMARY KEY (`PlayerID`,`ServerGroup`) ,
CONSTRAINT `fk_tbl_playerrank_tbl_playerdata" + this.tableSuffix + @"`
FOREIGN KEY (`PlayerID` )
REFERENCES `" + this.tbl_playerdata + @"` (`PlayerID` )
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Playersession Table
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_sessions + @"` (
`SessionID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`StatsID` INT UNSIGNED NOT NULL,
`StartTime` DATETIME NOT NULL,
`EndTime` DATETIME NOT NULL,
`Score` MEDIUMINT NOT NULL DEFAULT '0',
`Kills` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
`Headshots` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
`Deaths` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
`TKs` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
`Suicide` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
`RoundCount` TINYINT UNSIGNED NOT NULL DEFAULT '0',
`Playtime` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
`Killstreak` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' ,
`Deathstreak` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' ,
`HighScore` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0' ,
`Wins` TINYINT UNSIGNED NOT NULL DEFAULT '0' ,
`Losses` TINYINT UNSIGNED NOT NULL DEFAULT '0' ,
PRIMARY KEY (`SessionID`),
INDEX `INDEX_STATSID" + this.tableSuffix + @"` (`StatsID` ASC),
INDEX `INDEX_STARTTIME" + this.tableSuffix + @"` (`StartTime` ASC),
CONSTRAINT `fk_tbl_sessions_tbl_server_player" + this.tableSuffix + @"`
FOREIGN KEY (`StatsID`)
REFERENCES `" + this.tbl_server_player + @"` (`StatsID`)
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE=InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//currentplayers
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_currentplayers + @"` (
`ServerID` smallint(6) NOT NULL,
`Soldiername` varchar(45) NOT NULL,
`GlobalRank` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
`ClanTag` varchar(45) DEFAULT NULL,
`Score` int(11) NOT NULL DEFAULT '0',
`Kills` int(11) NOT NULL DEFAULT '0',
`Headshots` int(11) NOT NULL DEFAULT '0',
`Deaths` int(11) NOT NULL DEFAULT '0',
`Suicide` int(11) DEFAULT NULL,
`Killstreak` smallint(6) DEFAULT '0',
`Deathstreak` smallint(6) DEFAULT '0',
`TeamID` tinyint(4) DEFAULT NULL,
`SquadID` tinyint(4) DEFAULT NULL,
`EA_GUID` varchar(45) NOT NULL DEFAULT '',
`PB_GUID` varchar(45) NOT NULL DEFAULT '',
`IP_aton` int(11) unsigned DEFAULT NULL,
`CountryCode` varchar(2) DEFAULT '',
`Ping` smallint(6) DEFAULT NULL,
`PlayerJoined` datetime DEFAULT NULL,
PRIMARY KEY (`ServerID`,`Soldiername`)
) ENGINE=InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Awards
/*
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_awards + @"` (
`AwardID` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ";
foreach (string strcolumn in this.m_lstAwardTable)
{
SQLTable = String.Concat(SQLTable, ",`", strcolumn, "` mediumint(8) unsigned DEFAULT '0' ");
}
SQLTable = String.Concat(SQLTable, ")ENGINE = InnoDB DEFAULT CHARACTER SET = latin1");
if (this.m_awardsON == enumBoolYesNo.Yes)
{
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
}
*/
//New Weapon table
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_weapons + @"` (
`WeaponID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`GameID` tinyint(4)unsigned NOT NULL,
`Friendlyname` varchar(45) DEFAULT NULL,
`Fullname` varchar(100) DEFAULT NULL,
`Damagetype` varchar(45) DEFAULT NULL,
`Slot` varchar(45) DEFAULT NULL,
`Kitrestriction` varchar(45) DEFAULT NULL,
PRIMARY KEY (`WeaponID`),
UNIQUE KEY `unique` (`GameID`,`fullname`)
) ENGINE=InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//New Weapon stats table
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_weapons_stats + @"` (
`StatsID` INT unsigned NOT NULL,
`WeaponID` int(11) unsigned NOT NULL,
`Kills` int(11) unsigned NOT NULL DEFAULT '0',
`Headshots` int(11) unsigned NOT NULL DEFAULT '0',
`Deaths` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`StatsID`,`WeaponID`),
KEY `Kills_Death_idx` (`Kills`,`Deaths`),
KEY `Kills_Head_idx` (`Kills`,`Headshots`),
CONSTRAINT `fk_tbl_weapons_stats_tbl_server_player_" + this.tableSuffix + @"`
FOREIGN KEY (`StatsID` )
REFERENCES `" + this.tbl_server_player + @"` (`StatsID` )
ON DELETE CASCADE
ON UPDATE NO ACTION
) ENGINE=InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Dogtagstable
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_dogtags + @"` (
`KillerID` INT UNSIGNED NOT NULL ,
`VictimID` INT UNSIGNED NOT NULL ,
`Count` SMALLINT UNSIGNED NOT NULL DEFAULT '0' ,
PRIMARY KEY (`KillerID`, `VictimID`) ,
INDEX `fk_tbl_dogtags_tbl_server_player1" + this.tableSuffix + @"` (`KillerID` ASC) ,
INDEX `fk_tbl_dogtags_tbl_server_player2" + this.tableSuffix + @"` (`VictimID` ASC) ,
CONSTRAINT `fk_tbl_dogtags_tbl_server_player1" + this.tableSuffix + @"`
FOREIGN KEY (`KillerID` )
REFERENCES `" + this.tbl_server_player + @"` (`StatsID` )
ON DELETE CASCADE
ON UPDATE NO ACTION,
CONSTRAINT `fk_tbl_dogtags_tbl_server_player2" + this.tableSuffix + @"`
FOREIGN KEY (`VictimID` )
REFERENCES `" + this.tbl_server_player + @"` (`StatsID` )
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Score and Tickettable
SQLTable = @"CREATE TABLE IF NOT EXISTS `" + this.tbl_teamscores + @"` (
`ServerID` smallint(5) unsigned NOT NULL,
`TeamID` smallint(5) unsigned NOT NULL,
`Score` int(11) DEFAULT NULL,
`WinningScore` int(11) DEFAULT NULL,
PRIMARY KEY (`ServerID`,`TeamID` )
) ENGINE=InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Commit the Transaction
TableTransaction.Commit();
this.boolTableEXISTS = true;
//fill weapon table
//get GameID
this.intServerGameType_ID = this.GetGameIDfromDB(this.strServerGameType);
List addedWeaponList = new List();
foreach (KeyValuePair> branch in this.weaponDic)
{
string sqlCheckweapon = @"SELECT
`GameID`,
`Friendlyname`,
`Fullname`,
`Damagetype`
FROM `" + this.tbl_weapons + @"`
WHERE `GameID` = @GameID
AND `Damagetype` = @Damagetype";
using (MySqlCommand MyCommand = new MySqlCommand(sqlCheckweapon))
{
MyCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
MyCommand.Parameters.AddWithValue("@Damagetype", branch.Key.ToLower());
using (DataTable result = this.SQLquery(MyCommand))
{
//this.DebugInfo("Info", "Rowcount:" + result.Rows.Count.ToString());
if (result.Rows.Count >= 1)
{
result.PrimaryKey = new DataColumn[] { result.Columns["GameID"], result.Columns["Fullname"] };
}
TableTransaction = null;
TableTransaction = TablebuilderCon.BeginTransaction();
foreach (KeyValuePair leap in branch.Value)
{
if (result.Rows.Count == 0 || result.Rows.Contains(new object[] { this.intServerGameType_ID, leap.Value.Name }) == false || addedWeaponList.Contains(leap.Value.Name) == true)
{
addedWeaponList.Add(leap.Value.Name);
//add weapon entry
string sqlInsertQuery = "INSERT INTO `" + this.tbl_weapons + @"` ( `GameID`, `Friendlyname`, `Fullname`,`Damagetype`,`Slot`,`Kitrestriction`) VALUES(@GameID, @Friendlyname, @Fullname, @Damagetype,@Slot,@Kitrestriction)
ON DUPLICATE KEY UPDATE `Friendlyname` = @Friendlyname ,`Damagetype` = @Damagetype,`Slot` = @Slot,`Kitrestriction` = @Kitrestriction";
using (MySqlCommand OdbcCom = new MySqlCommand(sqlInsertQuery, TablebuilderCon, TableTransaction))
{
OdbcCom.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
OdbcCom.Parameters.AddWithValue("@Friendlyname", leap.Value.FieldName);
OdbcCom.Parameters.AddWithValue("@Fullname", leap.Value.Name);
OdbcCom.Parameters.AddWithValue("@Damagetype", branch.Key.ToLower());
OdbcCom.Parameters.AddWithValue("@Slot", leap.Value.Slot);
OdbcCom.Parameters.AddWithValue("@Kitrestriction", leap.Value.KitRestriction);
if (this.intServerGameType_ID != 0)
{
OdbcCom.ExecuteNonQuery();
}
}
}
}
TableTransaction.Commit();
}
}
}
//Create WeaponMapping
this.WeaponMappingDic = new Dictionary(this.GetWeaponMappingfromDB());
//TableCheck & Adjustemnts tbl_playerstats
/*
string sqlCheckplayerstats = "DESC `" + this.tbl_playerstats + "`";
string sqlAltertableplayerstats = "ALTER TABLE `" + this.tbl_playerstats + "` ";
string sqlIndex = "";
this.DebugInfo("Trace", "Tablecheck playerstats");
bool column_Missing = false;
using (DataTable result = this.SQLquery(new MySqlCommand(sqlCheckplayerstats)))
{
DataColumn[] key = new DataColumn[1];
key[0] = result.Columns[0];
result.PrimaryKey = key;
column_Missing = false;
if (result.Rows.Contains("rankScore") == false)
{
this.DebugInfo("Trace", "Column rankScore is missing, Adding it to the table!");
sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `rankScore` INT(10) UNSIGNED NOT NULL DEFAULT '0', ");
column_Missing = true;
sqlIndex = string.Concat(sqlIndex, "ADD INDEX `INDEX_RANK_SCORE" + this.tableSuffix + @"` (`rankScore` ASC), ");
}
if (result.Rows.Contains("rankKills") == false)
{
this.DebugInfo("Trace", "Column rankScore is missing, Adding it to the table!");
sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `rankKills` INT(10) UNSIGNED NOT NULL DEFAULT '0', ");
column_Missing = true;
sqlIndex = string.Concat(sqlIndex, "ADD INDEX `INDEX_RANK_KILLS" + this.tableSuffix + @"` (`rankKills` ASC), ");
}
//Wins & Losses
if (result.Rows.Contains("Wins") == false)
{
this.DebugInfo("Trace", "Column Wins is missing, Adding it to the table!");
sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `Wins` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0', ");
column_Missing = true;
}
if (result.Rows.Contains("Losses") == false)
{
this.DebugInfo("Trace", "Column Losses is missing, Adding it to the table!");
sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `Losses` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0', ");
column_Missing = true;
}
//HighScore
if (result.Rows.Contains("HighScore") == false)
{
this.DebugInfo("Trace", "Column HighScore is missing, Adding it to the table!");
sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `HighScore` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0' , ");
column_Missing = true;
}
}
if (column_Missing == true)
{
TableTransaction = null;
TableTransaction = TablebuilderCon.BeginTransaction();
//Adding Columns
sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, sqlIndex);
int charindex = sqlAltertableplayerstats.LastIndexOf(",");
if (charindex > 0)
{
sqlAltertableplayerstats = sqlAltertableplayerstats.Remove(charindex);
}
using (MySqlCommand OdbcCom = new MySqlCommand(sqlAltertableplayerstats, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
TableTransaction.Commit();
}
//TableCheck & Adjustemnts tbl_server
sqlCheckplayerstats = "DESC `" + this.tbl_server + "`";
sqlAltertableplayerstats = "ALTER TABLE `" + this.tbl_server + "` ";
sqlIndex = "";
this.DebugInfo("Trace", "Tablecheck tbl_server");
column_Missing = false;
using (DataTable result = this.SQLquery(new MySqlCommand(sqlCheckplayerstats)))
{
DataColumn[] key = new DataColumn[1];
key[0] = result.Columns[0];
result.PrimaryKey = key;
column_Missing = false;
if (result.Rows.Contains("ServerGroup") == false)
{
this.DebugInfo("Trace", "Column ServerGroup is missing, Adding it to the table!");
sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, "ADD COLUMN `ServerGroup` TINYINT UNSIGNED NOT NULL DEFAULT 0 ,");
column_Missing = true;
sqlIndex = string.Concat(sqlIndex, "ADD INDEX `INDEX_SERVERGROUP" + this.tableSuffix + @"` (`ServerGroup` ASC) ,");
}
}
if (column_Missing == true)
{
TableTransaction = null;
TableTransaction = TablebuilderCon.BeginTransaction();
//Adding Columns
sqlAltertableplayerstats = string.Concat(sqlAltertableplayerstats, sqlIndex);
int charindex = sqlAltertableplayerstats.LastIndexOf(",");
if (charindex > 0)
{
sqlAltertableplayerstats = sqlAltertableplayerstats.Remove(charindex);
}
using (MySqlCommand OdbcCom = new MySqlCommand(sqlAltertableplayerstats, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
TableTransaction.Commit();
}
*/
//TableCheck Adjustments playerstats
/*
//TableCheck Awards
sqlCheck = "DESC `" + this.tbl_awards + "`";
sqlAltertable = "ALTER TABLE `" + this.tbl_awards + "` ";
//result = new List(this.SQLquery(sqlCheck,9));
this.DebugInfo("Tablecheck Awards");
using (DataTable result = this.SQLquery(new MySqlCommand(sqlCheck)))
{
DataColumn[] key = new DataColumn[1];
key[0] = result.Columns[0];
result.PrimaryKey = key;
fieldMissing = false;
foreach (string strField in this.m_lstAwardTable)
{
if (result.Rows.Contains(strField) == false)
{
this.DebugInfo(strField + " is missing, Adding it to the table!");
sqlAltertable = string.Concat(sqlAltertable, "ADD COLUMN `" + strField + "` mediumint(8) unsigned DEFAULT '0', ");
fieldMissing = true;
}
}
}
if (fieldMissing == true)
{
TableTransaction = null;
TableTransaction = TablebuilderCon.BeginTransaction();
SQLTable = "ALTER TABLE `" + this.tbl_awards + "` ENGINE = MyISAM";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
//Adding Columns
int charindex = sqlAltertable.LastIndexOf(",");
if (charindex > 0)
{
sqlAltertable = sqlAltertable.Remove(charindex);
}
using (MySqlCommand OdbcCom = new MySqlCommand(sqlAltertable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
SQLTable = "ALTER TABLE `" + this.tbl_awards + "` ENGINE = InnoDB";
using (MySqlCommand OdbcCom = new MySqlCommand(SQLTable, TablebuilderCon, TableTransaction))
{
OdbcCom.ExecuteNonQuery();
}
TableTransaction.Commit();
}
*/
}
catch (MySqlException oe)
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error in Tablebuilder: ");
this.DisplayMySqlErrorCollection(oe);
TableTransaction.Rollback();
}
catch (Exception c)
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error: " + c);
TableTransaction.Rollback();
this.boolTableEXISTS = false;
this.m_ID_cache.Clear();
}
finally
{
TablebuilderCon.Close();
}
}
}
catch (MySqlException oe)
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error in Tablebuilder: ");
this.DisplayMySqlErrorCollection(oe);
}
catch (Exception c)
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Error: " + c);
}
}
}
}
private void LogChat(string strSpeaker, string strMessage, string strType)
{
try
{
if (this.m_enChatloggingON == enumBoolYesNo.No)
{
return;
}
if (this.m_enNoServerMsg == enumBoolYesNo.No && strSpeaker.CompareTo("Server") == 0)
{
return;
}
if (this.m_enChatlogFilter == enumBoolYesNo.Yes)
{
//Filter Messages
foreach (Regex FilterRule in this.lstChatFilterRules)
{
if (FilterRule.IsMatch(strMessage))
{
//dont log
this.DebugInfo("Trace", "Chatmessage: '" + strMessage + "' was filtered out by the Regex rule: " + FilterRule.ToString());
return;
}
}
}
if (m_enInstantChatlogging == enumBoolYesNo.Yes)
{
string query = "INSERT INTO " + this.tbl_chatlog + @" (logDate, ServerID, logSubset, logSoldierName, logMessage) VALUES (@logDate, @ServerID, @logSubset, @logSoldierName, @logMessage)";
this.tablebuilder();
if ((m_strHost != null) || (m_strDatabase != null) || (m_strDBPort != null) || (m_strUserName != null) || (m_strPassword != null))
{
if (this.m_highPerformanceConnectionMode == enumBoolOnOff.On)
{
try
{
using (MySqlConnection Connection = new MySqlConnection(this.DBConnectionStringBuilder()))
{
Connection.Open();
if (Connection.State == ConnectionState.Open)
{
using (MySqlCommand OdbcCom = new MySqlCommand(query, Connection))
{
OdbcCom.Parameters.AddWithValue("@logDate", MyDateTime.Now);
OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
OdbcCom.Parameters.AddWithValue("@logSubset", strType);
OdbcCom.Parameters.AddWithValue("@logSoldierName", strSpeaker);
OdbcCom.Parameters.AddWithValue("@logMessage", strMessage);
OdbcCom.ExecuteNonQuery();
}
}
Connection.Close();
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "LogChat: ");
this.DisplayMySqlErrorCollection(oe);
}
catch (Exception c)
{
this.DebugInfo("Error", "LogChat: " + c);
}
}
else
{
lock (this.chatloglock)
{
try
{
if (this.MySqlChatCon == null)
{
this.MySqlChatCon = new MySqlConnection(this.DBConnectionStringBuilder());
}
if (MySqlChatCon.State != ConnectionState.Open)
{
this.MySqlChatCon.Open();
}
if (MySqlChatCon.State == ConnectionState.Open)
{
using (MySqlCommand OdbcCom = new MySqlCommand(query, MySqlChatCon))
{
OdbcCom.Parameters.AddWithValue("@logDate", MyDateTime.Now);
OdbcCom.Parameters.AddWithValue("@ServerID", this.ServerID);
OdbcCom.Parameters.AddWithValue("@logSubset", strType);
OdbcCom.Parameters.AddWithValue("@logSoldierName", strSpeaker);
OdbcCom.Parameters.AddWithValue("@logMessage", strMessage);
OdbcCom.ExecuteNonQuery();
}
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "LogChat: ");
this.DisplayMySqlErrorCollection(oe);
try
{
if (MySqlChatCon.State == ConnectionState.Open)
{
MySqlChatCon.Dispose();
}
}
catch { }
}
catch (Exception c)
{
this.DebugInfo("Error", "LogChat: " + c);
try
{
if (MySqlChatCon.State == ConnectionState.Open)
{
MySqlChatCon.Close();
}
}
catch { }
}
finally
{
try
{
if (MySqlChatCon != null)
{
MySqlChatCon.Close();
}
}
catch { }
}
}
}
}
}
else
{
CLogger chat = new CLogger(MyDateTime.Now, strSpeaker, strMessage, strType);
ChatLog.Add(chat);
}
}
catch (Exception c)
{
this.DebugInfo("Error", "LogChat_2: " + c);
}
}
public void DebugInfo(string debuglevel, string DebugMessage)
{
switch (this.GlobalDebugMode)
{
case "Trace":
//Post every Message
break;
case "Info":
if (String.Equals(debuglevel, "Trace") == true)
{
return;
}
break;
case "Warning":
if (String.Equals(debuglevel, "Trace") == true || String.Equals(debuglevel, "Info") == true)
{
return;
}
break;
case "Error":
if (String.Equals(debuglevel, "Error") == false)
{
return;
}
break;
}
// Post error Message in correct Format
if (String.Equals(debuglevel, "Trace"))
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "[Statslogger]Trace: " + DebugMessage);
}
else if (String.Equals(debuglevel, "Info"))
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "^2" + "[Statslogger]Info: " + DebugMessage);
}
else if (String.Equals(debuglevel, "Warning"))
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "^3" + "[Statslogger]Warning: " + DebugMessage);
}
else if (String.Equals(debuglevel, "Error"))
{
this.ExecuteCommand("procon.protected.pluginconsole.write", "^8" + "[Statslogger]Error: " + DebugMessage);
}
}
private void PrepareKeywordDic()
{
if (boolKeywordDicReady == false)
{
this.DebugInfo("Trace", "PrepareKeywordDic: Preparing");
this.m_dicKeywords.Clear();
try
{
foreach (KeyValuePair kvp in this.DamageClass)
{
if (this.m_dicKeywords.ContainsKey(kvp.Key) == false)
{
this.m_dicKeywords.Add(kvp.Key, new List());
this.m_dicKeywords[kvp.Key].Add(kvp.Key.ToUpper());
string[] weaponName = Regex.Replace(kvp.Key.Replace("Weapons/", "").Replace("Gadgets/", ""), @"XP\d_", "").Split('/');
string friendlyname = weaponName[0].Replace(' ', '_').Replace(".", "").Replace("U_", "").ToUpper();
if (this.m_dicKeywords.ContainsKey(friendlyname) == false)
{
this.m_dicKeywords[kvp.Key].Add(friendlyname);
}
}
}
string dicKey = String.Empty;
string dicValue = String.Empty;
foreach (string line in m_lstTableconfig)
{
if (line.Contains("{") && line.Contains("}"))
{
dicKey = line.Remove(line.IndexOf("{"));
dicValue = line.Replace("{", ",");
dicValue = dicValue.Replace("}", "").ToUpper();
string[] arrStrings = dicValue.Split(',');
if (this.m_dicKeywords.ContainsKey(dicKey))
{
//Prüfen
this.m_dicKeywords[dicKey].AddRange(arrStrings);
/*
foreach (string entry in this.m_dicKeywords[dicKey])
{
this.DebugInfo("Trace", "PrepareKeywordDic: " + entry);
}
*/
}
else
{
this.DebugInfo("Warning", "PrepareKeywordDic: Mainkey " + dicKey + " not found!");
}
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in PrepareKeywordDic: " + c);
}
}
}
public string FindKeyword(string strToFind)
{
try
{
this.DebugInfo("Trace", "FindKeyword: " + strToFind);
foreach (KeyValuePair> kvp in this.m_dicKeywords)
{
if (kvp.Value.Contains(strToFind.Replace(" ", "")))
{
this.DebugInfo("Trace", "FindKeyword: Returning Key " + kvp.Key);
return kvp.Key;
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "FindKeyword: " + c);
}
return String.Empty;
}
public List ListReplace(List targetlist, string wordToReplace, string replacement)
{
List lstResult = new List();
foreach (string substring in targetlist)
{
lstResult.Add(substring.Replace(wordToReplace, replacement));
}
return lstResult;
}
private void CheckMessageLength(string strMessage, int intMessagelength)
{
if (strMessage.Length > intMessagelength)
{
//Send Warning
this.DebugInfo("Warning", strMessage);
this.DebugInfo("Warning", "This Ingamemessage is too long and wont sent to Server!!!");
this.DebugInfo("Warning", "The Message has a Length of " + strMessage.Length.ToString() + " Chars, Allow are 128 Chars");
}
}
private void CreateSession(string SoldierName, int intScore, string EAGUID)
{
if (this.ServerID == 0)
{
return;
}
try
{
if (this.m_sessionON == enumBoolYesNo.Yes)
{
//Session
lock (this.sessionlock)
{
if (this.m_dicSession.ContainsKey(SoldierName) == false)
{
//this.DebugInfo("Trace", "Session for Player: " + SoldierName + " created");
this.m_dicSession.Add(SoldierName, new CStats(String.Empty, intScore, 0, 0, 0, 0, 0, 0, this.m_dTimeOffset, this.weaponDic));
this.m_dicSession[SoldierName].Rank = this.GetRank(SoldierName);
}
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "CreateSession: " + c);
}
finally
{
lock (this.sessionlock)
{
//Session Score
if (this.m_dicSession.ContainsKey(SoldierName) && this.m_sessionON == enumBoolYesNo.Yes)
{
this.m_dicSession[SoldierName].AddScore(intScore);
if (EAGUID.Length > 2)
{
this.m_dicSession[SoldierName].EAGuid = EAGUID;
}
}
}
}
}
/*
private void RemoveSession(string SoldierName)
{
try
{
if (m_sessionON == enumBoolYesNo.Yes)
{
if (this.m_dicSession.ContainsKey(SoldierName) == true)
{
//Passed seesion to list
this.lstpassedSessions.Add(m_dicSession[SoldierName]);
this.m_dicSession.Remove(SoldierName);
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "RemoveSession: " + c);
}
}
*/
private void GetServerStats(string SoldierName, int delay, string scope)
{
string SQL = @"SELECT * FROM " + this.tbl_server_stats + @" WHERE ServerID = @ServerID";
List result = new List(this.m_lstServerstatsMsg);
try
{
using (MySqlCommand SelectCommand = new MySqlCommand(SQL))
{
SelectCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
DataTable sqlresult = this.SQLquery(SelectCommand);
if (sqlresult != null)
{
foreach (DataRow row in sqlresult.Rows)
{
result = this.ListReplace(result, "%serverName%", this.serverName);
//COUNT
result = this.ListReplace(result, "%countPlayer%", Convert.ToInt64(row["CountPlayers"]).ToString());
//SUM
result = this.ListReplace(result, "%sumScore%", Convert.ToInt64(row["SumScore"]).ToString());
result = this.ListReplace(result, "%sumKills%", Convert.ToInt64(row["SumKills"]).ToString());
result = this.ListReplace(result, "%sumHeadshots%", Convert.ToInt64(row["SumHeadshots"]).ToString());
result = this.ListReplace(result, "%sumDeaths%", Convert.ToInt64(row["SumDeaths"]).ToString());
result = this.ListReplace(result, "%sumSuicide%", Convert.ToInt64(row["SumSuicide"]).ToString());
result = this.ListReplace(result, "%sumTKs%", Convert.ToInt64(row["SumTKs"]).ToString());
result = this.ListReplace(result, "%sumRounds%", Convert.ToInt64(row["SumRounds"]).ToString());
//AVG
result = this.ListReplace(result, "%avgScore%", Convert.ToInt64(row["AvgScore"]).ToString());
result = this.ListReplace(result, "%avgKills%", Convert.ToInt64(row["AvgKills"]).ToString());
result = this.ListReplace(result, "%avgHeadshots%", Convert.ToInt64(row["AvgHeadshots"]).ToString());
result = this.ListReplace(result, "%avgDeaths%", Convert.ToInt64(row["AvgDeaths"]).ToString());
result = this.ListReplace(result, "%avgSuicide%", Convert.ToInt64(row["AvgSuicide"]).ToString());
result = this.ListReplace(result, "%avgTKs%", Convert.ToInt64(row["AvgTKs"]).ToString());
result = this.ListReplace(result, "%avgRounds%", Convert.ToInt64(row["AvgRounds"]).ToString());
//MISC.
//SPM
result = this.ListReplace(result, "%avgSPM%", Math.Round(Convert.ToDouble(row["SumScore"]) / (Convert.ToDouble(row["SumPlaytime"]) / 60), 2).ToString());
//KPM
result = this.ListReplace(result, "%avgKPM%", Math.Round(Convert.ToDouble(row["SumKills"]) / (Convert.ToDouble(row["SumPlaytime"]) / 60), 2).ToString());
//HPM
result = this.ListReplace(result, "%avgHPM%", Math.Round(Convert.ToDouble(row["SumHeadshots"]) / (Convert.ToDouble(row["SumPlaytime"]) / 60), 2).ToString());
//HPK
result = this.ListReplace(result, "%avgHPK%", Math.Round(Convert.ToDouble(row["SumHeadshots"]) / (Convert.ToDouble(row["SumKills"])), 2).ToString());
//Playtime
TimeSpan span = new TimeSpan(0, 0, Convert.ToInt32(row["SumPlaytime"]), 0, 0);
result = this.ListReplace(result, "%sumPlaytime%", span.Days + "d:" + span.Hours + "h:" + span.Minutes + "m:" + span.Seconds + "s");
result = this.ListReplace(result, "%sumPlaytimeHours%", Math.Round(span.TotalHours, 2).ToString());
result = this.ListReplace(result, "%sumPlaytimeDays%", Math.Round(span.TotalDays, 2).ToString());
//avg. Playtime
span = new TimeSpan(0, 0, Convert.ToInt32(row["AvgPlaytime"]), 0, 0);
result = this.ListReplace(result, "%avgPlaytime%", span.Days + "d:" + span.Hours + "h:" + span.Minutes + "m:" + span.Seconds + "s");
result = this.ListReplace(result, "%avgPlaytimeHours%", Math.Round(span.TotalHours, 2).ToString());
result = this.ListReplace(result, "%avgPlaytimeDays%", Math.Round(span.TotalDays, 2).ToString());
}
if (result.Count != 0)
{
this.SendMultiLineChatMessage(result, delay, 0, scope, SoldierName);
}
else
{
result.Clear();
result.Add("No Serverdata available!");
this.SendMultiLineChatMessage(result, delay, 0, scope, SoldierName);
}
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "GetServerStats: " + c);
}
}
private void GetSession(string SoldierName, int delay, string scope)
{
if (this.ServerID == 0)
{
return;
}
try
{
if (this.m_dicSession.ContainsKey(SoldierName) && this.m_sessionON == enumBoolYesNo.Yes)
{
List result = new List();
result = m_lstSessionMessage;
result = ListReplace(result, "%playerName%", SoldierName);
result = ListReplace(result, "%playerScore%", this.m_dicSession[SoldierName].Score.ToString());
result = ListReplace(result, "%playerKills%", this.m_dicSession[SoldierName].Kills.ToString());
result = ListReplace(result, "%killstreak%", this.m_dicSession[SoldierName].Killstreak.ToString());
result = ListReplace(result, "%playerDeaths%", this.m_dicSession[SoldierName].Deaths.ToString());
result = ListReplace(result, "%deathstreak%", this.m_dicSession[SoldierName].Deathstreak.ToString());
result = ListReplace(result, "%playerKDR%", this.m_dicSession[SoldierName].KDR().ToString());
result = ListReplace(result, "%playerHeadshots%", this.m_dicSession[SoldierName].Headshots.ToString());
result = ListReplace(result, "%playerSuicide%", this.m_dicSession[SoldierName].Suicides.ToString());
result = ListReplace(result, "%playerTK%", this.m_dicSession[SoldierName].Teamkills.ToString());
result = ListReplace(result, "%startRank%", this.m_dicSession[SoldierName].Rank.ToString());
//Rankdiff
int playerRank = this.GetRank(SoldierName);
//int playerRank = 0;
result = ListReplace(result, "%playerRank%", playerRank.ToString());
int Rankdif = this.m_dicSession[SoldierName].Rank;
Rankdif = Rankdif - playerRank;
if (Rankdif == 0)
{
result = ListReplace(result, "%RankDif%", "0");
}
else if (Rankdif > 0)
{
result = ListReplace(result, "%RankDif%", "+" + Rankdif.ToString());
}
else
{
result = ListReplace(result, "%RankDif%", Rankdif.ToString());
}
result = ListReplace(result, "%SessionStarted%", this.m_dicSession[SoldierName].TimePlayerjoined.ToString());
TimeSpan duration = MyDateTime.Now - this.m_dicSession[SoldierName].TimePlayerjoined;
result = ListReplace(result, "%SessionDuration%", Math.Round(duration.TotalMinutes, 2).ToString());
if (result.Count != 0)
{
this.SendMultiLineChatMessage(result, delay, 0, scope, SoldierName);
}
else
{
result.Clear();
result.Add("No Sessiondata are available!");
this.SendMultiLineChatMessage(result, delay, 0, scope, SoldierName);
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "GetSession: " + c);
}
}
private int GetRank(string SoldierName)
{
//this.DebugInfo("Trace", "GetRank: " + SoldierName);
int rank = 0;
try
{
string SQL = String.Empty;
if (m_enRankingByScore == enumBoolYesNo.Yes)
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
SQL = @"SELECT tpr.rankScore AS rank
FROM " + this.tbl_playerrank + @" tpr
INNER JOIN " + this.tbl_playerdata + @" tpd ON tpr.PlayerID = tpd.PlayerID
WHERE tpd.SoldierName = @SoldierName AND tpr.ServerGroup = @ServerGroup";
}
else
{
SQL = @"SELECT tps.rankScore AS rank
FROM " + this.tbl_playerstats + @" tps
INNER JOIN " + this.tbl_server_player + @" tsp ON tps.StatsID = tsp.StatsID
INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
WHERE tpd.SoldierName = @SoldierName AND tsp.ServerID = @ServerID";
}
}
else
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
SQL = @"SELECT tpr.rankKills AS rank
FROM " + this.tbl_playerrank + @" tpr
INNER JOIN " + this.tbl_playerdata + @" tpd ON tpr.PlayerID = tpd.PlayerID
WHERE tpd.SoldierName = @SoldierName AND tpr.ServerGroup = @ServerGroup";
}
else
{
SQL = @"SELECT tps.rankKills AS rank
FROM " + this.tbl_playerstats + @" tps
INNER JOIN " + this.tbl_server_player + @" tsp ON tps.StatsID = tsp.StatsID
INNER JOIN " + this.tbl_playerdata + @" tpd ON tsp.PlayerID = tpd.PlayerID
WHERE tpd.SoldierName = @SoldierName AND tsp.ServerID = @ServerID";
}
}
using (MySqlCommand SelectCommand = new MySqlCommand(SQL))
{
if (this.m_enOverallRanking == enumBoolYesNo.Yes)
{
SelectCommand.Parameters.AddWithValue("@SoldierName", SoldierName);
SelectCommand.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
}
else
{
SelectCommand.Parameters.AddWithValue("@SoldierName", SoldierName);
SelectCommand.Parameters.AddWithValue("@ServerID", this.ServerID);
}
DataTable result = this.SQLquery(SelectCommand);
if (result != null)
{
foreach (DataRow row in result.Rows)
{
if (Convert.DBNull.Equals(row[0]) == false)
{
rank = Convert.ToInt32(row[0]);
this.DebugInfo("Trace", SoldierName + " Rank: " + row[0].ToString());
}
}
}
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "Error in GetRank: ");
this.DisplayMySqlErrorCollection(oe);
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in GetRank: " + c);
}
return rank;
}
public void PluginInfo(string strPlayer)
{
//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);
}
public void DisplayMySqlErrorCollection(MySqlException myException)
{
if (myException == null) return;
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Message: " + myException.Message);
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Native: " + myException.ErrorCode.ToString());
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Source: " + myException.Source.ToString());
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1StackTrace: " + myException.StackTrace.ToString());
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1InnerException: " + myException.InnerException.ToString());
// this.ExecuteCommand("procon.protected.pluginconsole.write", "^1SQL: " + myException.);
}
private void prepareTablenames()
{
this.tbl_playerdata = "tbl_playerdata" + this.tableSuffix;
this.tbl_playerstats = "tbl_playerstats" + this.tableSuffix;
this.tbl_weaponstats = "tbl_weaponstats" + this.tableSuffix;
this.tbl_dogtags = "tbl_dogtags" + this.tableSuffix;
this.tbl_mapstats = "tbl_mapstats" + this.tableSuffix;
this.tbl_chatlog = "tbl_chatlog" + this.tableSuffix;
this.tbl_bfbcs = "tbl_bfbcs" + this.tableSuffix;
this.tbl_awards = "tbl_awards" + this.tableSuffix;
this.tbl_server = "tbl_server" + this.tableSuffix;
this.tbl_server_player = "tbl_server_player" + this.tableSuffix;
this.tbl_server_stats = "tbl_server_stats" + this.tableSuffix;
this.tbl_playerrank = "tbl_playerrank" + this.tableSuffix;
this.tbl_sessions = "tbl_sessions" + this.tableSuffix;
this.tbl_currentplayers = "tbl_currentplayers" + this.tableSuffix;
this.tbl_weapons = "tbl_weapons" + this.tableSuffix;
this.tbl_weapons_stats = "tbl_weapons_stats" + this.tableSuffix;
this.tbl_games = "tbl_games" + this.tableSuffix;
this.tbl_teamscores = "tbl_teamscores" + this.tableSuffix;
}
private void setGameMod()
{
//this.PrepareKeywordDic();
this.boolTableEXISTS = false;
}
/*private void getBFBCStats(List lstPlayers)
{
//Disabled temp
return;
try
{
List lstSoldierName = new List();
foreach (CPlayerInfo Player in lstPlayers)
{
DateTime lastUpdate = DateTime.MinValue;
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)
{
string SQL = @"SELECT b.LastUpdate, b.Rank, b.Kills, b.Deaths, b.Score, b.Time
FROM " + tbl_playerdata + @" a
INNER JOIN " + tbl_bfbcs + @" b ON a.PlayerID = b.bfbcsID
WHERE a.SoldierName = @SoldierName";
using (MySqlCommand SelectCommand = new MySqlCommand(SQL))
{
SelectCommand.Parameters.AddWithValue("@SoldierName", Player.SoldierName);
DataTable result = this.SQLquery(SelectCommand);
foreach (DataRow row in result.Rows)
{
//this.DebugInfo("Last Update: " + row[0].ToString());
lastUpdate = Convert.ToDateTime(row[0]);
TimeSpan TimeDifference = MyDateTime.Now.Subtract(lastUpdate);
//this.DebugInfo(TimeDifference.TotalHours.ToString());
if (TimeDifference.TotalHours >= this.BFBCS_UpdateInterval && this.StatsTracker[Player.SoldierName].BFBCS_Stats.Fetching == false)
{
this.StatsTracker[Player.SoldierName].BFBCS_Stats.Fetching = true;
lstSoldierName.Add(Player.SoldierName);
}
else if (this.StatsTracker.ContainsKey(Player.SoldierName) == true && this.StatsTracker[Player.SoldierName].BFBCS_Stats.Fetching == true)
{
//Do nothing
}
else
{
if (this.StatsTracker.ContainsKey(Player.SoldierName) == true)
{
//this.DebugInfo("No Update needed");
this.StatsTracker[Player.SoldierName].BFBCS_Stats.Updated = true;
this.StatsTracker[Player.SoldierName].BFBCS_Stats.Rank = Convert.ToInt32(row[1]);
this.StatsTracker[Player.SoldierName].BFBCS_Stats.Kills = Convert.ToInt32(row[2]);
this.StatsTracker[Player.SoldierName].BFBCS_Stats.Deaths = Convert.ToInt32(row[3]);
this.StatsTracker[Player.SoldierName].BFBCS_Stats.Score = Convert.ToInt32(row[4]);
this.StatsTracker[Player.SoldierName].BFBCS_Stats.Time = Convert.ToDouble(row[5]);
this.StatsTracker[Player.SoldierName].BFBCS_Stats.NoUpdate = true;
this.checkPlayerStats(Player.SoldierName, this.m_strReasonMsg);
}
}
}
}
}
}
if (lstSoldierName != null && lstSoldierName.Count > 0 && lstSoldierName.Count >= this.BFBCS_Min_Request)
{
//Start Fetching
specialArrayObject ListObject = new specialArrayObject(lstSoldierName);
Thread newThread = new Thread(new ParameterizedThreadStart(this.DownloadBFBCS));
newThread.Start(ListObject);
}
else
{
foreach (string player in lstSoldierName)
{
this.StatsTracker[player].BFBCS_Stats.Fetching = false;
this.StatsTracker[player].BFBCS_Stats.Updated = false;
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", " getBFBCStats: " + c);
}
}
private void DownloadBFBCS(object ListObject)
{
specialArrayObject ListString = (specialArrayObject)ListObject;
List lstSoldierName = new List();
lstSoldierName = ListString.LstString;
//Define a empty string for parameter
string ParameterString = String.Empty;
string result = String.Empty;
foreach (string SoldierName in lstSoldierName)
{
if (this.StatsTracker[SoldierName].BFBCS_Stats.Updated == false)
{
ParameterString = String.Concat(ParameterString, SoldierName, ",");
this.StatsTracker[SoldierName].BFBCS_Stats.Updated = true;
}
}
ParameterString = ParameterString.Remove(ParameterString.LastIndexOf(","));
try
{
this.DebugInfo("Trace", "Thread started and fetching Stats from BFBCS for Players: " + ParameterString);
using (WebClient wc = new WebClient())
{
//Thx to IIIAVIII
ParameterString = ParameterString.Replace("&", "%26");
ParameterString = ParameterString.Replace(" ", "%20");
ParameterString = ParameterString.Replace("$", "%24");
ParameterString = ParameterString.Replace("+", "%2B");
ParameterString = ParameterString.Replace("/", "%2F");
ParameterString = ParameterString.Replace("?", "%3F");
ParameterString = ParameterString.Replace("%", "%25");
ParameterString = ParameterString.Replace("#", "%23");
//ParameterString = ParameterString.Replace(",","%2C");
ParameterString = ParameterString.Replace(":", "%3A");
ParameterString = ParameterString.Replace(";", "%3B");
ParameterString = ParameterString.Replace("=", "%3D");
ParameterString = ParameterString.Replace("@", "%40");
ParameterString = ParameterString.Replace("<", "%3C");
ParameterString = ParameterString.Replace(">", "%3E");
ParameterString = ParameterString.Replace("{", "%7B");
ParameterString = ParameterString.Replace("}", "%7D");
ParameterString = ParameterString.Replace("|", "%7C");
ParameterString = ParameterString.Replace(@"\", @"%5C");
ParameterString = ParameterString.Replace("^", "%5E");
ParameterString = ParameterString.Replace("~", "%7E");
ParameterString = ParameterString.Replace("[", "%5B");
ParameterString = ParameterString.Replace("]", "%5D");
ParameterString = ParameterString.Replace("`", "%60");
result = wc.DownloadString("http://api.bfbcs.com/api/pc?players=" + ParameterString + "&fields=basic");
}
if (result == null || result.StartsWith("{") == false)
{
this.DebugInfo("Trace", "the String returned by BFBCS was invalid");
this.DebugInfo("Trace", "Trying to repair the String...");
if (result != null)
{
//result = result.Remove(result.IndexOf("<"),(result.LastIndexOf(">")+1));
if (result.IndexOf("{") > 0)
{
result = result.Substring(result.IndexOf("{"));
}
if (result == null || result.StartsWith("{") == false)
{
this.DebugInfo("Trace", "Repair failed!!!");
return;
}
else
{
this.DebugInfo("Trace", "Repair (might be) successful");
}
}
else
{
this.DebugInfo("Trace", "Empty String...");
return;
}
}
//JSON DECODE
Hashtable jsonHash = (Hashtable)JSON.JsonDecode(result);
if (jsonHash["players"] != null)
{
ArrayList jsonResults = (ArrayList)jsonHash["players"];
//Player with Stats
foreach (object objResult in jsonResults)
{
string stringvalue = String.Empty;
int intvalue = 0;
double doublevalue = 0;
Hashtable playerData = (Hashtable)objResult;
if (playerData != null && lstSoldierName.Contains(playerData["name"].ToString()) == true)
{
stringvalue = playerData["name"].ToString();
this.DebugInfo("Info", "Got BFBC2 stats for " + stringvalue);
int.TryParse(playerData["rank"].ToString(), out intvalue);
this.StatsTracker[stringvalue].BFBCS_Stats.Rank = intvalue;
int.TryParse(playerData["kills"].ToString(), out intvalue);
this.StatsTracker[stringvalue].BFBCS_Stats.Kills = intvalue;
int.TryParse(playerData["deaths"].ToString(), out intvalue);
this.StatsTracker[stringvalue].BFBCS_Stats.Deaths = intvalue;
int.TryParse(playerData["score"].ToString(), out intvalue);
this.StatsTracker[stringvalue].BFBCS_Stats.Score = intvalue;
double.TryParse(playerData["elo"].ToString(), out doublevalue);
this.StatsTracker[stringvalue].BFBCS_Stats.Elo = doublevalue;
double.TryParse(playerData["level"].ToString(), out doublevalue);
this.StatsTracker[stringvalue].BFBCS_Stats.Skilllevel = doublevalue;
double.TryParse(playerData["time"].ToString(), out doublevalue);
this.StatsTracker[stringvalue].BFBCS_Stats.Time = doublevalue;
this.StatsTracker[stringvalue].BFBCS_Stats.Updated = true;
// check Stats
this.checkPlayerStats(stringvalue, this.m_strReasonMsg);
}
}
}
if (jsonHash["players_unknown"] != null)
{
//Player without Stats
ArrayList jsonResults_2 = (ArrayList)jsonHash["players_unknown"];
foreach (object objResult in jsonResults_2)
{
Hashtable playerData = (Hashtable)objResult;
if (playerData != null && lstSoldierName.Contains(playerData["name"].ToString()) == true)
{
this.DebugInfo("Info", "No Stats found for Player: " + playerData["name"].ToString());
}
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", " DownloadBFBCS: " + c);
foreach (string SoldierName in lstSoldierName)
{
this.StatsTracker[SoldierName].BFBCS_Stats.Updated = false;
}
}
}
public void RemovePlayerfromServer(string targetSoldierName, string strReason, string removeAction)
{
try
{
if (targetSoldierName == string.Empty)
{
return;
}
switch (removeAction)
{
case "Kick":
this.ExecuteCommand("procon.protected.send", "admin.kickPlayer", targetSoldierName, strReason);
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Kicked Player: " + targetSoldierName + " - " + strReason);
break;
case "PBBan":
this.ExecuteCommand("procon.protected.send", "punkBuster.pb_sv_command", String.Format("pb_sv_ban \"{0}\" \"{1}\"", targetSoldierName, "BC2! " + strReason));
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1PB-Ban for Player: " + targetSoldierName + " - " + strReason);
break;
case "EAGUIDBan":
this.ExecuteCommand("procon.protected.send", "banList.add", "guid", this.StatsTracker[targetSoldierName].EAGuid, "perm", strReason);
this.ExecuteCommand("procon.protected.send", "banList.save");
this.ExecuteCommand("procon.protected.send", "banList.list");
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1EA-GUID Ban for Player: " + targetSoldierName + " - " + strReason);
break;
case "Nameban":
this.ExecuteCommand("procon.protected.send", "banList.add", "name", targetSoldierName, "perm", strReason);
this.ExecuteCommand("procon.protected.send", "banList.save");
this.ExecuteCommand("procon.protected.send", "banList.list");
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Nameban for Player: " + targetSoldierName + " - " + strReason);
break;
case "Warn":
this.ExecuteCommand("procon.protected.pluginconsole.write", "^1Warning Player: " + targetSoldierName + " - " + strReason);
break;
}
}
catch (Exception c)
{
this.DebugInfo("Error", " RemovePlayerfromServer: " + c);
}
}*/
private void calculateAwards()
{
//Disabled temp
return;
/*
string[] arrPlace = new string[] { "None", "None", "None" };
int[] arrScores = new int[] { 0, 0, 0 };
string BestCombat = "None";
int BestCombat_kills = 0;
// Place 1 to 3
if (this.bool_roundStarted == true && this.StatsTracker.Count >= 4)
{
foreach (KeyValuePair kvp in this.StatsTracker)
{
//Place 1. to 3.
if (kvp.Value.Score > arrScores[0])
{
// 2. to 3.
arrScores[2] = arrScores[1];
arrPlace[2] = arrPlace[1];
// 1. to 2.
arrScores[1] = arrScores[0];
arrPlace[1] = arrPlace[0];
// New 1.
arrScores[0] = kvp.Value.Score;
arrPlace[0] = kvp.Key;
}
else if (kvp.Value.Score > arrScores[1])
{
// 2. to 3.
arrScores[2] = arrScores[1];
arrPlace[2] = arrPlace[1];
//New 2.
arrScores[1] = kvp.Value.Score;
arrPlace[1] = kvp.Key;
}
else if (kvp.Value.Score > arrScores[2])
{
//New 3.
arrScores[2] = kvp.Value.Score;
arrPlace[2] = kvp.Key;
}
//Most Kills - Best Combat
if (kvp.Value.Kills >= 5 && BestCombat_kills < kvp.Value.Kills)
{
BestCombat = kvp.Key;
BestCombat_kills = kvp.Value.Kills;
}
}
//Set Awards
//1.Place
if (arrPlace[0] != null && String.Equals(arrPlace[0], "None") == false)
{
this.StatsTracker[arrPlace[0]].Awards.dicAdd("First", 1);
}
//2.Place
if (arrPlace[1] != null && String.Equals(arrPlace[1], "None") == false)
{
this.StatsTracker[arrPlace[1]].Awards.dicAdd("Second", 1);
}
//3.Place
if (arrPlace[1] != null && String.Equals(arrPlace[2], "None") == false)
{
this.StatsTracker[arrPlace[2]].Awards.dicAdd("Third", 1);
}
//Best Combat
if (BestCombat != null && String.Equals(BestCombat, "None") == false)
{
this.StatsTracker[BestCombat].Awards.dicAdd("Best_Combat", 1);
}
}
*/
}
public void Threadstarter_Webrequest()
{
if (this.m_enWebrequest == enumBoolYesNo.Yes)
{
//Temp disabled
// new Thread(Webrequest).Start();
}
}
public void Webrequest()
{
/*
try
{
this.DebugInfo("Info", "Thread started and calling the Website: " + this.m_webAddress);
using (WebClient wc = new WebClient())
{
string result = wc.DownloadString(this.m_webAddress);
if (result.Length > 0)
{
this.DebugInfo("Info", "Got response from Webserver!");
}
else
{
this.DebugInfo("Warning", "Webrequest: Page(" + this.m_webAddress + ") not found!");
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "Webrequest: " + c);
}
*/
}
public void generateWeaponList()
{
this.DebugInfo("Trace", "generateWeaponList");
List weapList = new List();
this.weaponDic.Clear();
this.DamageClass.Clear();
try
{
WeaponDictionary weapons = this.GetWeaponDefines();
foreach (PRoCon.Core.Players.Items.Weapon weapon in weapons)
{
string[] weaponName = Regex.Replace(weapon.Name.Replace("Weapons/", "").Replace("Gadgets/", ""), @"XP\d_", "").Split('/');
if (weapList.Contains(weaponName[0].Replace(' ', '_').Replace(".", "").Replace("U_", "")) == false)
{
weapList.Add(weaponName[0].Replace(' ', '_').Replace(".", "").Replace("U_", ""));
}
if (this.weaponDic.ContainsKey(weapon.Damage.ToString()) == false)
{
this.weaponDic.Add(weapon.Damage.ToString(), new Dictionary());
}
if (this.weaponDic[weapon.Damage.ToString()].ContainsKey(weapon.Name) == false)
{
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()));
}
this.DamageClass.Add(weapon.Name, weapon.Damage.ToString());
}
this.PrepareKeywordDic();
}
catch (Exception e)
{
this.DebugInfo("Error", "generateWeaponList: " + e.ToString());
}
foreach (KeyValuePair> branch in this.weaponDic)
{
foreach (KeyValuePair leap in branch.Value)
{
this.DebugInfo("Trace", "Weaponlist: DamageType: " + branch.Key + " Name: " + leap.Key);
}
}
}
private void getUpdateServerID(CServerInfo csiServerInfo)
{
try
{
//return;
this.DebugInfo("Trace", "getUpdateServerID");
/*
this.DebugInfo("Trace", "ExternalGameIpandPort: " + this.m_strHostName + ":" + this.m_strPort);
this.DebugInfo("Trace","ExternalGameIpandPort: "+ csiServerInfo.ExternalGameIpandPort);
this.DebugInfo("Trace","ServerName: "+csiServerInfo.ServerName);
this.DebugInfo("Trace","ConnectionState: "+csiServerInfo.ConnectionState);
this.DebugInfo("Trace","CurrentRound: "+csiServerInfo.CurrentRound.ToString());
//this.DebugInfo("Trace","GameMod: "+csiServerInfo.GameMod);
this.DebugInfo("Trace","GameMode: "+csiServerInfo.GameMode);
this.DebugInfo("Trace","JoinQueueEnabled: "+csiServerInfo.JoinQueueEnabled);
this.DebugInfo("Trace","Map: "+csiServerInfo.Map);
this.DebugInfo("Trace","Mappack: "+csiServerInfo.Mappack);
this.DebugInfo("Trace","MaxPlayerCount: "+csiServerInfo.MaxPlayerCount);
this.DebugInfo("Trace","Passworded: "+csiServerInfo.Passworded.ToString());
this.DebugInfo("Trace","PlayerCount: "+csiServerInfo.PlayerCount);
this.DebugInfo("Trace","Punkbuster: "+csiServerInfo.PunkBuster.ToString());
this.DebugInfo("Trace","PunkBusterVersion: "+csiServerInfo.PunkBusterVersion);
this.DebugInfo("Trace","Ranked: "+csiServerInfo.Ranked.ToString());
this.DebugInfo("Trace","RoundTime: "+csiServerInfo.RoundTime.ToString());
this.DebugInfo("Trace","ServerRegion: "+csiServerInfo.ServerRegion);
this.DebugInfo("Trace","ServerUptime: "+csiServerInfo.ServerUptime.ToString());
this.DebugInfo("Trace","TotalRounds: "+csiServerInfo.TotalRounds);
*/
//this.DebugInfo("Trace", "TeamScores: " + csiServerInfo.TeamScores.Count.ToString());
this.tablebuilder();
DataTable resultTable;
string SQL = String.Empty;
int attemptCount = 0;
bool success = false;
using (MySqlConnection DBConnection = new MySqlConnection(this.DBConnectionStringBuilder()))
{
MySql.Data.MySqlClient.MySqlTransaction Tx = null;
try
{
DBConnection.Open();
using (MySqlCommand MyCommand = new MySqlCommand("SELECT `ServerID` FROM " + this.tbl_server + @" WHERE IP_Address = @IP_Address"))
{
MyCommand.Parameters.AddWithValue("@IP_Address", this.m_strHostName + ":" + this.m_strPort);
resultTable = this.SQLquery(MyCommand);
if (resultTable.Rows != null)
{
foreach (DataRow row in resultTable.Rows)
{
//this.ServerID = Convert.ToInt32(row[0]);
int.TryParse(row[0].ToString(), out this.ServerID);
this.DebugInfo("Trace", "DB returns ServerID = " + this.ServerID);
}
}
}
if (ServerID <= 0)
{
SQL = @"INSERT INTO " + tbl_server + @" (IP_Address, ServerName, ServerGroup, usedSlots, maxSlots, mapName, GameID, Gamemode) VALUES (@IP_Address, @ServerName, @ServerGroup, @usedSlots, @maxSlots, @mapName, @GameID, @Gamemode)";
}
else
{
SQL = @"UPDATE " + tbl_server + @" SET ServerName = @ServerName, ServerGroup = @ServerGroup , usedSlots = @usedSlots, maxSlots = @maxSlots, mapName = @mapName, GameID = @GameID, Gamemode = @Gamemode WHERE IP_Address = @IP_Address";
}
while (attemptCount < this.TransactionRetryCount && !success)
{
attemptCount++;
try
{
Tx = DBConnection.BeginTransaction();
using (MySqlCommand MySqlCom = new MySqlCommand(SQL, DBConnection, Tx))
{
MySqlCom.Parameters.AddWithValue("@IP_Address", this.m_strHostName + ":" + this.m_strPort);
MySqlCom.Parameters.AddWithValue("@ServerName", csiServerInfo.ServerName);
MySqlCom.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
MySqlCom.Parameters.AddWithValue("@usedSlots", csiServerInfo.PlayerCount);
MySqlCom.Parameters.AddWithValue("@maxSlots", csiServerInfo.MaxPlayerCount);
MySqlCom.Parameters.AddWithValue("@mapName", csiServerInfo.Map);
MySqlCom.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
MySqlCom.Parameters.AddWithValue("@Gamemode", csiServerInfo.GameMode);
MySqlCom.ExecuteNonQuery();
if (ServerID == 0)
{
int.TryParse(MySqlCom.LastInsertedId.ToString(), out this.ServerID);
}
}
if (ServerID > 0 && this.m_enableCurrentPlayerstatsTable == enumBoolYesNo.Yes && csiServerInfo.TeamScores.Count > 0)
{
string ScoreSQL = "DELETE FROM `" + this.tbl_teamscores + "` WHERE `ServerID` = @ServerID";
using (MySqlCommand MySqlCom = new MySqlCommand(ScoreSQL, DBConnection, Tx))
{
MySqlCom.Parameters.AddWithValue("@ServerID", ServerID);
MySqlCom.ExecuteNonQuery();
}
foreach (TeamScore teamscore in csiServerInfo.TeamScores)
{
//this.DebugInfo("Trace", "Update Score Table TeamID: " + teamscore.TeamID );
ScoreSQL = "INSERT INTO `" + this.tbl_teamscores + "` (`ServerID`,`TeamID`,`Score`,`WinningScore`) VALUES(@ServerID, @TeamID, @Score, @WinningScore)";
using (MySqlCommand MySqlCom = new MySqlCommand(ScoreSQL, DBConnection, Tx))
{
MySqlCom.Parameters.AddWithValue("@ServerID", ServerID);
MySqlCom.Parameters.AddWithValue("@TeamID", teamscore.TeamID);
MySqlCom.Parameters.AddWithValue("@Score", teamscore.Score);
MySqlCom.Parameters.AddWithValue("@WinningScore", teamscore.WinningScore);
MySqlCom.ExecuteNonQuery();
}
}
}
Tx.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
this.DebugInfo("Warning", "Warning in getUpdateServer: Lock timeout or Deadlock occured restarting Transaction #1. Attempt: " + attemptCount);
try
{
Tx.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
break;
default:
throw; //Other exceptions
}
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "getUpdateServerID1: " + c);
try
{
Tx.Rollback();
}
catch { }
}
finally
{
try
{
DBConnection.Close();
}
catch { }
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "getUpdateServerID1: " + c);
}
}
private void UpdateRanking()
{
try
{
//retrycount
int attemptCount = 0;
bool success = false;
//ScoreRanking per server
/*
string sqlupdate1 = @"UPDATE " + this.tbl_playerstats + @" tps
INNER JOIN (
SELECT(@num := @num+1) AS rankScore, tsp.StatsID
FROM " + this.tbl_playerstats + @" tps
STRAIGHT_JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) x
WHERE tsp.ServerID = ?
ORDER BY tps.Score DESC, tps.StatsID ASC
) sub
ON sub.StatsID = tps.StatsID
SET tps.rankScore = sub.rankScore
WHERE sub.rankScore != tps.rankScore";
*/
string sqlupdate1 = @"UPDATE " + this.tbl_playerstats + @" tps
INNER JOIN (
SELECT (@num := @num+1) AS rankScore, innersub.StatsID FROM
(
SELECT tsp.StatsID
FROM " + this.tbl_playerstats + @" tps
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) x
WHERE tsp.ServerID = @ServerID
ORDER BY tps.Score DESC, tps.StatsID ASC
) innersub
) sub
ON sub.StatsID = tps.StatsID
SET tps.rankScore = sub.rankScore
WHERE sub.rankScore != tps.rankScore";
//KillsRanking per server
/*
string sqlupdate2 = @"UPDATE " + this.tbl_playerstats + @" tps
INNER JOIN (
SELECT(@num := @num+1) AS rankKills, tsp.StatsID
FROM " + this.tbl_playerstats + @" tps
STRAIGHT_JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) y
WHERE tsp.ServerID = ?
ORDER BY tps.Kills DESC, tps.Deaths ASC , tps.StatsID ASC
) sub
ON sub.StatsID = tps.StatsID
SET tps.rankKills = sub.rankKills
WHERE tps.rankKills != sub.rankKills";
*/
string sqlupdate2 = @"UPDATE " + this.tbl_playerstats + @" tps
INNER JOIN (
SELECT (@num := @num+1) AS rankKills, innersub.StatsID FROM
(
SELECT tsp.StatsID
FROM " + this.tbl_playerstats + @" tps
INNER JOIN " + this.tbl_server_player + @" tsp ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) x
WHERE tsp.ServerID = @ServerID
ORDER BY tps.Kills DESC, tps.Deaths ASC , tps.StatsID ASC
) innersub
) sub
ON sub.StatsID = tps.StatsID
SET tps.rankKills = sub.rankKills
WHERE sub.rankKills != tps.rankKills";
// Global Updates
string sqlInsert = @"INSERT INTO " + this.tbl_playerrank + @" (PlayerID, ServerGroup)
SELECT PlayerID, (" + this.intServerGroup + @") AS ServerGroup
FROM " + this.tbl_playerdata + @"
WHERE PlayerID NOT IN (SELECT PlayerID FROM " + this.tbl_playerrank + @" WHERE ServerGroup = @ServerGroup)";
string sqlupdate3 = @" UPDATE " + this.tbl_playerrank + @" tpr
INNER JOIN (SELECT (@num := @num + 1) AS rankKills, sub1.PlayerID ,sub1.ServerGroup
FROM(SELECT tsp.PlayerID, ts.ServerGroup
FROM " + this.tbl_server_player + @" tsp
INNER JOIN " + this.tbl_server + @" ts ON tsp.ServerID = ts.ServerID
INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) x
WHERE ts.ServerGroup = @ServerGroup
GROUP BY tsp.PlayerID, ts.ServerGroup
ORDER BY SUM(tps.Kills) DESC, SUM(tps.Deaths) ASC, tsp.PlayerID ASC
) sub1
) sub
ON sub.PlayerID = tpr.PlayerID
SET tpr.rankKills = sub.rankKills
WHERE tpr.rankKills != sub.rankKills AND sub.ServerGroup = tpr.ServerGroup";
string sqlupdate4 = @" UPDATE " + this.tbl_playerrank + @" tpr
INNER JOIN (SELECT (@num := @num + 1) AS rankScore, sub1.PlayerID ,sub1.ServerGroup
FROM(SELECT tsp.PlayerID, ts.ServerGroup
FROM " + this.tbl_server_player + @" tsp
INNER JOIN " + this.tbl_server + @" ts ON tsp.ServerID = ts.ServerID
INNER JOIN " + this.tbl_playerstats + @" tps ON tsp.StatsID = tps.StatsID ,(SELECT @num := 0) y
WHERE ts.ServerGroup = @ServerGroup
GROUP BY tsp.PlayerID, ts.ServerGroup
ORDER BY SUM(tps.Score) DESC, tsp.PlayerID ASC
) sub1
) sub
ON sub.PlayerID = tpr.PlayerID AND sub.ServerGroup = tpr.ServerGroup
SET tpr.rankScore = sub.rankScore
WHERE tpr.rankScore != sub.rankScore";
MySql.Data.MySqlClient.MySqlTransaction Tx = null;
using (MySqlConnection Con = new MySqlConnection(this.DBConnectionStringBuilder()))
{
try
{
if (Con.State == ConnectionState.Closed)
{
Con.Open();
}
if (boolSkipServerUpdate == false)
{
while (attemptCount < this.TransactionRetryCount && !success)
{
attemptCount++;
try
{
Tx = Con.BeginTransaction();
using (MySqlCommand Command = new MySqlCommand(sqlupdate1, Con, Tx))
{
Command.Parameters.AddWithValue("@ServerID", this.ServerID);
Command.ExecuteNonQuery();
}
//Commit
Tx.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
this.DebugInfo("Warning", "Warning in UpdateRanking: Lock timeout or Deadlock occured restarting Transaction #1. Attempt: " + attemptCount);
try
{
Tx.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
break;
default:
throw; //Other exceptions
}
}
}
if (attemptCount > this.TransactionRetryCount)
{
this.DebugInfo("Error", "Error in UpdateRanking: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction #1)");
}
attemptCount = 0;
success = false;
//Next query
while (attemptCount < this.TransactionRetryCount && !success)
{
attemptCount++;
try
{
//Start new Transaction
Tx = Con.BeginTransaction();
using (MySqlCommand Command = new MySqlCommand(sqlupdate2, Con, Tx))
{
Command.Parameters.AddWithValue("@ServerID", this.ServerID);
Command.ExecuteNonQuery();
}
//Commit
Tx.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
this.DebugInfo("Warning", "Warning in UpdateRanking: Lock timeout or Deadlock occured restarting Transaction #2. Attempt: " + attemptCount);
try
{
Tx.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
break;
default:
throw; //Other exceptions
}
}
}
if (attemptCount > this.TransactionRetryCount)
{
this.DebugInfo("Error", "Error in UpdateRanking: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction #2)");
}
}
attemptCount = 0;
success = false;
//Next query
if (boolSkipGlobalUpdate == false)
{
while (attemptCount < this.TransactionRetryCount && !success)
{
attemptCount++;
try
{
//Start new Transaction
Tx = Con.BeginTransaction();
using (MySqlCommand Command = new MySqlCommand(sqlInsert, Con, Tx))
{
Command.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
Command.ExecuteNonQuery();
}
//Commit
Tx.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
this.DebugInfo("Warning", "Warning in UpdateRanking: Lock timeout or Deadlock occured restarting Transaction #3. Attempt: " + attemptCount);
try
{
Tx.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
break;
default:
throw; //Other exceptions
}
}
}
if (attemptCount > this.TransactionRetryCount)
{
this.DebugInfo("Error", "Error in UpdateRanking: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction #3)");
}
attemptCount = 0;
success = false;
//Next query
while (attemptCount < this.TransactionRetryCount && !success)
{
attemptCount++;
try
{
//Start new Transaction
Tx = Con.BeginTransaction();
using (MySqlCommand Command = new MySqlCommand(sqlupdate3, Con, Tx))
{
Command.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
Command.ExecuteNonQuery();
}
//Commit
Tx.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
this.DebugInfo("Warning", "Warning in UpdateRanking: Lock timeout or Deadlock occured restarting Transaction #4. Attempt: " + attemptCount);
try
{
Tx.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
break;
default:
throw; //Other exceptions
}
}
}
if (attemptCount > this.TransactionRetryCount)
{
this.DebugInfo("Error", "Error in UpdateRanking: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction #4)");
}
attemptCount = 0;
success = false;
//Next query
while (attemptCount < this.TransactionRetryCount && !success)
{
attemptCount++;
try
{
//Start new Transaction
Tx = Con.BeginTransaction();
using (MySqlCommand Command = new MySqlCommand(sqlupdate4, Con, Tx))
{
Command.Parameters.AddWithValue("@ServerGroup", this.intServerGroup);
Command.ExecuteNonQuery();
}
Tx.Commit();
success = true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 1205: //(ER_LOCK_WAIT_TIMEOUT) Lock wait timeout exceeded
case 1213: //(ER_LOCK_DEADLOCK) Deadlock found when trying to get lock
this.DebugInfo("Warning", "Warning in UpdateRanking: Lock timeout or Deadlock occured restarting Transaction #5. Attempt: " + attemptCount);
try
{
Tx.Rollback();
}
catch { }
Thread.Sleep(attemptCount * 1000);
break;
default:
throw; //Other exceptions
}
}
}
if (attemptCount > this.TransactionRetryCount)
{
this.DebugInfo("Error", "Error in UpdateRanking: Maximum number of " + this.TransactionRetryCount + " transaction retrys exceeded (Transaction #5)");
}
}
attemptCount = 0;
success = false;
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "Error in UpdateRanking: ");
this.DisplayMySqlErrorCollection(oe);
if (Tx != null)
{
try
{
Tx.Rollback();
}
catch { };
}
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in UpdateRanking: " + c);
if (Tx != null)
{
try
{
Tx.Rollback();
}
catch { };
}
}
finally
{
try
{
Con.Close();
}
catch { };
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in UpdateRanking: " + c);
}
}
private void checkWelcomeStatsDic()
{
try
{
lock (this.welcomestatsDic)
{
TimeSpan duration = new TimeSpan(0, 10, 0);
List entryToRemove = new List();
foreach (KeyValuePair kvp in this.welcomestatsDic)
{
if (duration < (MyDateTime.Now - kvp.Value))
{
entryToRemove.Add(kvp.Key);
}
}
foreach (string entry in entryToRemove)
{
this.DebugInfo("Trace", "Removing Player " + entry + " from welcomestatslist Timeoutlimit of 10 minutes was exceeded!");
this.welcomestatsDic.Remove(entry);
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in checkWelcomeStatsDic: " + c);
}
}
private void BuildRegexRuleset()
{
try
{
this.lstChatFilterRules = new List();
foreach (string strRule in this.lstStrChatFilterRules)
{
this.lstChatFilterRules.Add(new Regex(strRule.Replace("|", "|").Replace("|", "+")));
}
if (this.GlobalDebugMode.Equals("Trace"))
{
this.DebugInfo("Trace", "Active Regex-Ruleset:");
foreach (Regex regexrule in this.lstChatFilterRules)
{
this.DebugInfo("Trace", regexrule.ToString());
}
}
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in BuildRegexRuleset: " + c);
}
}
private void SendMultiLineChatMessage(List lstMultiLineChatMSG, int intDelay, int delayIncreasePerLine, string strScope, string targetPlayerName)
{
int totalDelay = intDelay;
int yellduration = 8;
string duration = string.Empty;
string yelltagwithduration = @"^\[[y|Y][e|E][l|L]{2,2},\d+\]";
//string yelltag = @"^\[[y|Y][e|E][l|L]{2,2},";
try
{
switch (strScope)
{
case "all":
foreach (string line in lstMultiLineChatMSG)
{
if (Regex.IsMatch(line, yelltagwithduration))
{
MatchCollection matches = Regex.Matches(line, yelltagwithduration);
foreach (Match match in matches)
{
foreach (Capture capture in match.Captures)
{
if (int.TryParse(Regex.Replace(match.Value, @"\D", ""), out yellduration) == false)
{
this.DebugInfo("Trace", "SendMultiLineChatMessage: Could not parse Duration, using default");
yellduration = 8;
}
}
}
//yell this!
this.CheckMessageLength(Regex.Replace(line, yelltagwithduration, ""), 255);
this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger", totalDelay.ToString(), "1", "1", "procon.protected.send", "admin.yell", Regex.Replace(line, yelltagwithduration, ""), yellduration.ToString(), strScope);
totalDelay += delayIncreasePerLine;
totalDelay += yellduration;
}
else
{
//default say
this.CheckMessageLength(line, 128);
this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger", totalDelay.ToString(), "1", "1", "procon.protected.send", "admin.say", line, strScope);
totalDelay += delayIncreasePerLine;
}
}
break;
default:
foreach (string line in lstMultiLineChatMSG)
{
if (Regex.IsMatch(line, yelltagwithduration))
{
MatchCollection matches = Regex.Matches(line, yelltagwithduration);
foreach (Match match in matches)
{
foreach (Capture capture in match.Captures)
{
if (int.TryParse(Regex.Replace(match.Value, @"\D", ""), out yellduration) == false)
{
this.DebugInfo("Trace", "SendMultiLineChatMessage: Could not parse Duration, using default");
yellduration = 8;
}
}
}
//yell this!
this.CheckMessageLength(line, 255);
this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger", totalDelay.ToString(), "1", "1", "procon.protected.send", "admin.yell", Regex.Replace(line, yelltagwithduration, ""), yellduration.ToString(), "player", targetPlayerName);
totalDelay += delayIncreasePerLine;
totalDelay += yellduration;
}
else
{
//default say
this.CheckMessageLength(line, 128);
this.ExecuteCommand("procon.protected.tasks.add", "CChatGUIDStatsLogger", totalDelay.ToString(), "1", "1", "procon.protected.send", "admin.say", line, "player", targetPlayerName);
totalDelay += delayIncreasePerLine;
}
}
break;
}
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in PostMultiLineChat: " + c);
}
}
private Dictionary GetWeaponMappingfromDB()
{
Dictionary mappingDic = new Dictionary();
try
{
string sqlSelect = "SELECT `WeaponID`,`Fullname` FROM `" + this.tbl_weapons + @"` WHERE `GameID` = @GameID";
using (MySqlCommand SelectCommand = new MySqlCommand(sqlSelect))
{
SelectCommand.Parameters.AddWithValue("@GameID", this.intServerGameType_ID);
DataTable result = this.SQLquery(SelectCommand);
if (result != null || result.Rows.Count != 0)
{
foreach (DataRow row in result.Rows)
{
mappingDic.Add(row["Fullname"].ToString(), Convert.ToInt32(row["WeaponID"]));
this.DebugInfo("Trace", "WeaponMapping: ID: " + Convert.ToInt32(row["WeaponID"]).ToString() + " <--> Weapon:" + row["Fullname"].ToString());
}
}
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "Error in GetWeaponMappingfromDB: ");
this.DisplayMySqlErrorCollection(oe);
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in GetWeaponMappingfromDB: " + c);
}
return mappingDic;
}
private int GetGameIDfromDB(string strGame)
{
this.DebugInfo("Trace", "GetGameIDfromDB Game: " + strGame);
int intGameID = 0;
try
{
string sqlSelect = "SELECT `GameID` FROM `" + this.tbl_games + @"` WHERE `Name` = @Name";
using (MySqlCommand SelectCommand = new MySqlCommand(sqlSelect))
{
SelectCommand.Parameters.AddWithValue("@Name", strGame);
DataTable result = this.SQLquery(SelectCommand);
if (result.Rows.Count != 0)
{
intGameID = Convert.ToInt32(result.Rows[0][0]);
}
else
{
this.DebugInfo("Trace", "GetGameIDfromDB Game: no gameID found");
//Insert Game
using (MySqlConnection Con = new MySqlConnection(this.DBConnectionStringBuilder()))
{
Con.Open();
MySqlTransaction Transaction = null;
//Start of the Transaction
Transaction = Con.BeginTransaction();
string SQL = @"INSERT INTO `" + this.tbl_games + @"` (`Name`) VALUES (@Name)";
using (MySqlCommand MyCom = new MySqlCommand(SQL, Con, Transaction))
{
MyCom.Parameters.AddWithValue("@Name", this.strServerGameType);
MyCom.ExecuteNonQuery();
this.DebugInfo("Trace", "GetGameIDfromDB LastInsertedId: " + MyCom.LastInsertedId.ToString());
intGameID = Convert.ToInt32(MyCom.LastInsertedId);
}
Transaction.Commit();
}
}
}
}
catch (MySqlException oe)
{
this.DebugInfo("Error", "Error in GetGameIDfromDB: ");
this.DisplayMySqlErrorCollection(oe);
}
catch (Exception c)
{
this.DebugInfo("Error", "Error in GetGameIDfromDB: " + c);
}
this.DebugInfo("Trace", "GetGameIDfromDB GameID: " + intGameID);
return intGameID;
}
}
#endregion
#region Classes
/*==========Classes========*/
internal class CLogger
{
private readonly string _Name;
private string _Message = String.Empty;
private string _Subset = String.Empty;
private DateTime _Time;
public string Name
{
get { return _Name; }
}
public string Message
{
get { return _Message; }
}
public string Subset
{
get { return _Subset; }
}
public DateTime Time
{
get { return _Time; }
}
public CLogger(DateTime time, string name, string message, string subset)
{
_Name = name;
_Message = message;
_Subset = subset;
_Time = time;
}
}
internal class CStats
{
private string _ClanTag;
private string _Guid;
private string _EAGuid;
private string _IP;
private string _PlayerCountryCode;
private int _Score = 0;
private int _HighScore = 0;
private int _LastScore = 0;
private int _Kills = 0;
private int _Headshots = 0;
private int _Deaths = 0;
private int _Suicides = 0;
private int _Teamkills = 0;
private int _Playtime = 0;
private int _Rounds = 0;
private DateTime _Playerjoined;
private DateTime _TimePlayerleft;
private DateTime _TimePlayerjoined;
private int _PlayerleftServerScore = 0;
private bool _playerOnServer = true;
private int _rank = 0;
//KD Correction
private int _beforeleftKills = 0;
private int _beforeleftDeaths = 0;
//Streaks
private int _Killstreak;
private int _Deathstreak;
private int _Killcount;
private int _Deathcount;
//Wins&Loses
private int _Wins = 0;
private int _Losses = 0;
//TeamID
private int _TeamId = 0;
//BFBCS
private CBFBCS _BFBCS_Stats;
private myDateTime MyDateTime = new myDateTime(0);
public Dictionary> dicWeap = new Dictionary>();
//Awards
private CAwards _Awards;
//global Rank
private int _GlobalRank = 0;
public string ClanTag
{
get { return _ClanTag; }
set { _ClanTag = value; }
}
public string Guid
{
get { return _Guid; }
set { _Guid = value; }
}
public string EAGuid
{
get { return _EAGuid; }
set { _EAGuid = value; }
}
public string IP
{
get { return _IP; }
set { _IP = value.Remove(value.IndexOf(":")); }
}
public string PlayerCountryCode
{
get { return _PlayerCountryCode; }
set { _PlayerCountryCode = value; }
}
public int Score
{
get { return _Score; }
set { _Score = value; }
}
public int HighScore
{
get { return _HighScore; }
set { _HighScore = value; }
}
public int LastScore
{
get { return _LastScore; }
set { _LastScore = value; }
}
public int Kills
{
get { return _Kills; }
set { _Kills = value; }
}
public int BeforeLeftKills
{
get { return _beforeleftKills; }
set { _beforeleftKills = value; }
}
public int Headshots
{
get { return _Headshots; }
set { _Headshots = value; }
}
public int Deaths
{
get { return _Deaths; }
set { _Deaths = value; }
}
public int BeforeLeftDeaths
{
get { return _beforeleftDeaths; }
set { _beforeleftDeaths = value; }
}
public int Suicides
{
get { return _Suicides; }
set { _Suicides = value; }
}
public int Teamkills
{
get { return _Teamkills; }
set { _Teamkills = value; }
}
public int Playtime
{
get { return _Playtime; }
set { _Playtime = value; }
}
public int Rounds
{
get { return _Rounds; }
set { _Rounds = value; }
}
public DateTime Playerjoined
{
get { return _Playerjoined; }
set { _Playerjoined = value; }
}
public DateTime TimePlayerleft
{
get { return _TimePlayerleft; }
set { _TimePlayerleft = value; }
}
public DateTime TimePlayerjoined
{
get { return _TimePlayerjoined; }
set { _TimePlayerjoined = value; }
}
public int PlayerleftServerScore
{
get { return _PlayerleftServerScore; }
set { _PlayerleftServerScore = value; }
}
public bool PlayerOnServer
{
get { return _playerOnServer; }
set { _playerOnServer = value; }
}
public int Rank
{
get { return _rank; }
set { _rank = value; }
}
public int Killstreak
{
get { return _Killstreak; }
set { _Killstreak = value; }
}
public int Deathstreak
{
get { return _Deathstreak; }
set { _Deathstreak = value; }
}
public int Wins
{
get { return _Wins; }
set { _Wins = value; }
}
public int Losses
{
get { return _Losses; }
set { _Losses = value; }
}
public int TeamId
{
get { return _TeamId; }
set { _TeamId = value; }
}
public int GlobalRank
{
get { return _GlobalRank; }
set { _GlobalRank = value; }
}
//Methodes
public void AddScore(int intScore)
{
if (intScore != 0)
{
this._Score = this._Score + (intScore - this._LastScore);
this._LastScore = intScore;
if (intScore > this._HighScore)
{
this._HighScore = intScore;
}
}
else
{
this._LastScore = 0;
}
}
public double KDR()
{
double ratio = 0;
if (this._Deaths != 0)
{
ratio = Math.Round(Convert.ToDouble(this._Kills) / Convert.ToDouble(this._Deaths), 2);
}
else
{
ratio = this._Kills;
}
return ratio;
}
public Dictionary> getWeaponKills()
{
return this.dicWeap;
}
public void addKill(string strDmgType, string strweaponType, bool blheadshot)
{
this._Kills++;
if (blheadshot)
{
if (this.dicWeap.ContainsKey(strDmgType))
{
if (this.dicWeap[strDmgType].ContainsKey(strweaponType))
{
this.dicWeap[strDmgType][strweaponType].Kills++;
this.dicWeap[strDmgType][strweaponType].Headshots++;
}
}
this._Headshots++;
}
else
{
if (this.dicWeap.ContainsKey(strDmgType))
{
if (this.dicWeap[strDmgType].ContainsKey(strweaponType))
{
this.dicWeap[strDmgType][strweaponType].Kills++;
}
}
}
//Killstreaks
this._Killcount++;
this._Deathcount = 0;
if (this._Killcount > this._Killstreak)
{
this._Killstreak = this._Killcount;
}
//Awardchecks
this._Awards.CheckOnKill(_Kills, _Headshots, _Deaths, _Killcount, _Deathcount);
}
public void addDeath(string strDmgType, string strweaponType)
{
this._Deaths++;
if (this.dicWeap.ContainsKey(strDmgType))
{
if (this.dicWeap[strDmgType].ContainsKey(strweaponType))
{
this.dicWeap[strDmgType][strweaponType].Deaths++;
}
}
//Deathstreak
this._Deathcount++;
this._Killcount = 0;
if (this._Deathcount > this._Deathstreak)
{
this._Deathstreak = this._Deathcount;
}
//Awardchecks
this._Awards.CheckOnDeath(_Kills, _Headshots, _Deaths, _Killcount, _Deathcount);
}
public void playerleft()
{
//Score
this._PlayerleftServerScore += this._Score;
this._Score = 0;
//Kd Correction
this._beforeleftKills += this._Kills;
this._beforeleftDeaths += this._Deaths;
//Time
TimeSpan duration = MyDateTime.Now - this._Playerjoined;
this._Playtime += Convert.ToInt32(duration.TotalSeconds);
this._playerOnServer = false;
}
public int TotalScore
{
get { return (this._PlayerleftServerScore + this._Score); }
}
public int TotalPlaytime
{
get
{
if (this._playerOnServer)
{
TimeSpan duration = MyDateTime.Now - this._Playerjoined;
return (this._Playtime + Convert.ToInt32(duration.TotalSeconds));
}
return this._Playtime;
}
}
public CStats.CBFBCS BFBCS_Stats
{
get { return _BFBCS_Stats; }
set { _BFBCS_Stats = value; }
}
public CStats.CAwards Awards
{
get { return _Awards; }
set { _Awards = value; }
}
public class CUsedWeapon
{
private string _Name = "";
private string _FieldName = "";
private string _Slot = "";
private string _KitRestriction = "";
private int _Kills = 0;
private int _Headshots = 0;
private int _Deaths = 0;
public int Kills
{
get { return _Kills; }
set { _Kills = value; }
}
public int Headshots
{
get { return _Headshots; }
set { _Headshots = value; }
}
public int Deaths
{
get { return _Deaths; }
set { _Deaths = value; }
}
public string Name
{
get { return _Name; }
set { _Name = value; }
}
public string FieldName
{
get { return _FieldName; }
set { _FieldName = value; }
}
public string Slot
{
get { return _Slot; }
set { _Slot = value; }
}
public string KitRestriction
{
get { return _KitRestriction; }
set { _KitRestriction = value; }
}
public CUsedWeapon(string name, string fieldname, string slot, string kitrestriction)
{
this._Name = name;
this._FieldName = fieldname;
this._Slot = slot;
this._KitRestriction = kitrestriction;
this._Kills = 0;
this._Headshots = 0;
this._Deaths = 0;
}
}
public class CBFBCS
{
private int _rank;
private int _kills;
private int _deaths;
private int _score;
private double _skilllevel;
private double _time;
private double _elo;
private bool _Updated;
private bool _fetching;
private bool _noUpdate;
public int Rank
{
get { return _rank; }
set { _rank = value; }
}
public int Kills
{
get { return _kills; }
set { _kills = value; }
}
public int Deaths
{
get { return _deaths; }
set { _deaths = value; }
}
public double KDR
{
get
{
double ratio = 0;
if (this._deaths != 0)
{
ratio = Math.Round(Convert.ToDouble(this._kills) / Convert.ToDouble(this._deaths), 2);
}
else
{
ratio = this._kills;
}
return ratio;
}
}
public double SPM
{
get
{
return Convert.ToDouble(this._score) / (this._time / 60);
}
}
public int Score
{
get { return _score; }
set { _score = value; }
}
public double Skilllevel
{
get { return _skilllevel; }
set { _skilllevel = value; }
}
public double Time
{
get { return _time; }
set { _time = value; }
}
public double Elo
{
get { return _elo; }
set { _elo = value; }
}
public bool Updated
{
get { return _Updated; }
set { _Updated = value; }
}
public bool Fetching
{
get { return _fetching; }
set { _fetching = value; }
}
public bool NoUpdate
{
get { return _noUpdate; }
set { _noUpdate = value; }
}
public CBFBCS()
{
this._rank = 0;
this._kills = 0;
this._deaths = 0;
this._score = 0;
this._skilllevel = 0;
this._time = 0;
this._elo = 0;
this._Updated = false;
this._fetching = false;
this._noUpdate = false;
}
}
public class CAwards
{
//Awards
private Dictionary _dicAwards = new Dictionary();
//Constructor
public CAwards()
{
this._dicAwards = new Dictionary();
}
//Get and Set
public Dictionary DicAwards
{
get { return _dicAwards; }
set { _dicAwards = value; }
}
//Methodes
public void dicAdd(string strAward, int count)
{
if (this._dicAwards.ContainsKey(strAward))
{
this._dicAwards[strAward] = this._dicAwards[strAward] + count;
}
else
{
this._dicAwards.Add(strAward, count);
}
}
public void CheckOnKill(int kills, int hs, int deaths, int ks, int ds)
{
//Purple Heart
if (kills >= 5 && deaths >= 20 && ((Double)kills / (Double)deaths) == 0.25)
{
this.dicAdd("Purple_Heart", 1);
}
//Killstreaks
if (ks == 5)
{
//5 Kills in a row
this.dicAdd("Killstreak_5", 1);
}
else if (ks == 10)
{
//10 kills in a row
this.dicAdd("Killstreak_10", 1);
}
else if (ks == 15)
{
//15 kills in a row
this.dicAdd("Killstreak_15", 1);
}
else if (ks == 20)
{
//20 kills in a row
this.dicAdd("Killstreak_20", 1);
}
}
public void CheckOnDeath(int kills, int hs, int deaths, int ks, int ds)
{
//Purple Heart
if (kills >= 5 && deaths >= 20 && ((Double)kills / (Double)deaths) == 0.25)
{
this.dicAdd("Purple_Heart", 1);
}
}
}
public class myDateTime
{
private double _offset = 0;
public DateTime Now
{
get
{
DateTime dateValue = DateTime.Now;
return dateValue.AddHours(_offset);
}
}
public myDateTime(double offset)
{
this._offset = offset;
}
}
public CStats(string guid, int score, int kills, int headshots, int deaths, int suicides, int teamkills, int playtime, double timeoffset, Dictionary> _weaponDic)
{
this.MyDateTime = new myDateTime(timeoffset);
this._ClanTag = String.Empty;
this._Guid = guid;
this._EAGuid = String.Empty;
this._IP = String.Empty;
this._Score = score;
this._LastScore = 0;
this._HighScore = score;
this._Kills = kills;
this._Headshots = headshots;
this._Deaths = deaths;
this._Suicides = suicides;
this._Teamkills = teamkills;
this._Playtime = playtime;
this._Rounds = 0;
this._PlayerleftServerScore = 0;
this._PlayerCountryCode = String.Empty;
this._Playerjoined = MyDateTime.Now;
this._TimePlayerjoined = this._Playerjoined;
this._TimePlayerleft = DateTime.MinValue;
this._rank = 0;
this._Killcount = 0;
this._Killstreak = 0;
this._Deathcount = 0;
this._Deathstreak = 0;
this._Wins = 0;
this._Losses = 0;
this.BFBCS_Stats = new CStats.CBFBCS();
this._Awards = new CAwards();
//this.dicWeap = new Dictionary>(_weaponDic);
foreach (KeyValuePair> pair in _weaponDic)
{
this.dicWeap.Add(pair.Key, new Dictionary());
foreach (KeyValuePair subpair in pair.Value)
{
this.dicWeap[pair.Key].Add(subpair.Key, new CStats.CUsedWeapon(subpair.Value.Name, subpair.Value.FieldName, subpair.Value.Slot, subpair.Value.KitRestriction));
}
}
}
}
internal class C_ID_Cache
{
private int _Id;
private int _StatsID;
private bool _PlayeronServer;
public int Id
{
get { return _Id; }
set { _Id = value; }
}
public int StatsID
{
get { return _StatsID; }
set { _StatsID = value; }
}
public bool PlayeronServer
{
get { return _PlayeronServer; }
set { _PlayeronServer = value; }
}
//Constructor
public C_ID_Cache(int statsid, int id, bool playeronServer)
{
this._Id = id;
this._StatsID = statsid;
this._PlayeronServer = playeronServer;
}
}
internal class CKillerVictim
{
private string _Killer = String.Empty;
private string _Victim = String.Empty;
public string Killer
{
get { return _Killer; }
set { _Killer = value; }
}
public string Victim
{
get { return _Victim; }
set { _Victim = value; }
}
public CKillerVictim(string killer, string victim)
{
this._Killer = killer;
this._Victim = victim;
}
}
internal class CMapstats
{
private DateTime _timeMaploaded;
private DateTime _timeMapStarted;
private DateTime _timeRoundEnd;
private string _strMapname = String.Empty;
private string _strGamemode = String.Empty;
private int _intRound;
private int _intNumberOfRounds;
private List _lstPlayers;
private int _intMinPlayers;
private int _intMaxPlayers;
private int _intServerplayermax;
private double _doubleAvgPlayers;
private int _intplayerleftServer;
private int _intplayerjoinedServer;
private myDateTime MyDateTime = new myDateTime(0);
public DateTime TimeMaploaded
{
get { return _timeMaploaded; }
set { _timeMaploaded = value; }
}
public DateTime TimeMapStarted
{
get { return _timeMapStarted; }
set { _timeMapStarted = value; }
}
public DateTime TimeRoundEnd
{
get { return _timeRoundEnd; }
set { _timeRoundEnd = value; }
}
public string StrMapname
{
get { return _strMapname; }
set { _strMapname = value; }
}
public string StrGamemode
{
get { return _strGamemode; }
set { _strGamemode = value; }
}
public int IntRound
{
get { return _intRound; }
set { _intRound = value; }
}
public int IntNumberOfRounds
{
get { return _intNumberOfRounds; }
set { _intNumberOfRounds = value; }
}
public List LstPlayers
{
get { return _lstPlayers; }
set { _lstPlayers = value; }
}
public int IntMinPlayers
{
get { return _intMinPlayers; }
set { _intMinPlayers = value; }
}
public int IntMaxPlayers
{
get { return _intMaxPlayers; }
set { _intMaxPlayers = value; }
}
public int IntServerplayermax
{
get { return _intServerplayermax; }
set { _intServerplayermax = value; }
}
public double DoubleAvgPlayers
{
get { return _doubleAvgPlayers; }
set { _doubleAvgPlayers = value; }
}
public int IntplayerleftServer
{
get { return _intplayerleftServer; }
set { _intplayerleftServer = value; }
}
public int IntplayerjoinedServer
{
get { return _intplayerjoinedServer; }
set { _intplayerjoinedServer = value; }
}
public void MapStarted()
{
this._timeMapStarted = MyDateTime.Now;
}
public void MapEnd()
{
this._timeRoundEnd = MyDateTime.Now;
}
public void ListADD(int entry)
{
this._lstPlayers.Add(entry);
}
public void calcMaxMinAvgPlayers()
{
this._intMaxPlayers = 0;
this._intMinPlayers = _intServerplayermax;
this._doubleAvgPlayers = 0;
int entries = 0;
foreach (int playercount in this._lstPlayers)
{
if (playercount >= this._intMaxPlayers)
this._intMaxPlayers = playercount;
if (playercount <= this._intMinPlayers)
this._intMinPlayers = playercount;
this._doubleAvgPlayers = this._doubleAvgPlayers + playercount;
entries = entries + 1;
}
if (entries != 0)
{
this._doubleAvgPlayers = this._doubleAvgPlayers / (Convert.ToDouble(entries));
this._doubleAvgPlayers = Math.Round(this._doubleAvgPlayers, 1);
}
else
{
this._doubleAvgPlayers = 0;
this._intMaxPlayers = 0;
this._intMinPlayers = 0;
}
}
public class myDateTime
{
private double _offset = 0;
public DateTime Now
{
get
{
DateTime dateValue = DateTime.Now;
return dateValue.AddHours(_offset);
}
}
public myDateTime(double offset)
{
this._offset = offset;
}
}
public CMapstats(DateTime timeMaploaded, string strMapname, int intRound, int intNumberOfRounds, double timeoffset)
{
this._timeMaploaded = timeMaploaded;
this._strMapname = strMapname;
this._intRound = intRound;
this._intNumberOfRounds = intNumberOfRounds;
this._intMaxPlayers = 32;
this._intServerplayermax = 32;
this._intMinPlayers = 0;
this._intplayerjoinedServer = 0;
this._intplayerleftServer = 0;
this._lstPlayers = new List();
this._timeMapStarted = DateTime.MinValue;
this._timeRoundEnd = DateTime.MinValue;
this._strGamemode = String.Empty;
this.MyDateTime = new myDateTime(timeoffset);
}
}
internal class CSpamprotection
{
private Dictionary dicplayer;
private int _allowedRequests;
public CSpamprotection(int allowedRequests)
{
this._allowedRequests = allowedRequests;
this.dicplayer = new Dictionary();
}
public bool isAllowed(string strSpeaker)
{
bool result = false;
if (this.dicplayer.ContainsKey(strSpeaker) == true)
{
int i = this.dicplayer[strSpeaker];
if (0 >= i)
{
//Player is blocked
result = false;
this.dicplayer[strSpeaker]--;
}
else
{
//Player is not blocked
result = true;
this.dicplayer[strSpeaker]--;
}
}
else
{
this.dicplayer.Add(strSpeaker, this._allowedRequests);
result = true;
this.dicplayer[strSpeaker]--;
}
return result;
}
public void Reset()
{
this.dicplayer.Clear();
}
}
internal class myDateTime_W
{
private double _offset = 0;
public DateTime Now
{
get
{
DateTime dateValue = DateTime.Now;
return dateValue.AddHours(_offset);
}
}
public myDateTime_W(double offset)
{
this._offset = offset;
}
}
internal class CStatsIngameCommands
{
//Class variables
private string _functioncall;
private string _commands;
private string _description;
private bool _boolEnabled;
public CStatsIngameCommands(string commands, string functioncall, bool boolEnabled, string description)
{
this._commands = commands;
this._functioncall = functioncall;
this._boolEnabled = boolEnabled;
this._description = description;
}
public string commands
{
get { return this._commands; }
set { this._commands = value; }
}
public string functioncall
{
get { return this._functioncall; }
set { this._functioncall = value; }
}
public string description
{
get { return this._description; }
set { this._description = value; }
}
public bool boolEnabled
{
get { return this._boolEnabled; }
set { this._boolEnabled = value; }
}
}
#endregion
}