#!/usr/bin/perl # Fear Stats v1.0 # Jason Schofield Febuary 2007 # Changes in v1.1 # # Consolidated Database Rutines into main file # Created Code Pertection Rutines # Added Table Sorting by Table Headers all in DESC # Corrected Average Objective displaing TOTAL Objective, or incorrect average # Corrected Averages not being displayed as XX.XX # Added Support for Multiple servers in database. Players stats are Global accros all servers in database # V1.0 Initial Creation use CGI qw(:all); use DBI; my $clan_name = "{TLG}"; # Enter Clan Name Here my $game_type = "Death Match"; # Game type (TeamDeathMatch, Death Match, CTF, Control, Etc my $pointsrule = "0"; # Player must have at least 10 points in a game to processed in stats my $gamesplayedrule = "0"; # Player must play more that 1 game to appear in the stats my $scoreingsessions = "20"; # Display X Number of Scoring Sessions, minus Points rule my $refresh = "300"; # Refresh page after X seconds my $database_type = "local"; # set database type my $database = "fear1"; # Database Name my $table = "scores"; # Database Table my $ipaddress = "127.0.0.1";# IP Address of Database my $username = "feari"; # Username my $password = "feari"; # Password my $transaction = 1; #default is off, 0 = Use Transactions my $protect = "0"; # 0 for On 1 for Off my $version = "v1.1.7.540"; # --------------------------- Do Not Modify Below this line ------------------------------------------------ $player = new CGI; $serv = new CGI; my $start_center = "
"; my $end_center = "
"; if ($database_type eq "common") { $database = "f190067_fear"; # Database Name $table = "TDM_scores"; # Database Table $ipaddress = "mysql4-f.sourceforge.net";# IP Address of Database $username = "f190067rw"; # Username $password = "w721"; # Password } else { } if ($player->param("player_stats")) { &player_stats(); } elsif ($player->param("sort")) { &sort_table(); } elsif ($serv->param("servdata")) { &serv_data(); } else { &main_page(); } sub main_page { @table_heading = ('Server Name', 'Number of Players', 'Average Player Score', 'Average Player Kills', 'Average Player Deaths', 'Average Player Team Kills', 'Average Player Suicides', 'Average Player Objective'); &PageHeaders(); my $query = "SELECT server_name,count(player_name) as players, round(avg(player_score),2) as avg_score, round(avg(player_kills),2) as avg_kills, round(avg(player_deaths),2) as avg_deaths, round(avg(player_suicides),2) as avg_suicides, round(avg(player_objective),2) as avg_obj,round(avg(player_team_kills),2) as avg_team_kills FROM $table WHERE player_score > '$pointsrule' group by server_name"; &dbconnect($database,$ipaddress,$username,$password,$transaction,$query); my @table_rows = th(\@table_heading); if($sti->rows == 0) { print "No Servers Found"; } else { while( $resptr = $sti->fetchrow_hashref() ) { if ($resptr->{'games'} < "$_[0]") { my $numgames++; } else { push(@table_rows,th([a({-href=>"index.cgi?servdata=$resptr->{'server_name'}"},"$resptr->{'server_name'}"),"$resptr->{'players'}","$resptr->{'avg_score'}","$resptr->{'avg_kills'}","$resptr->{'avg_deaths'}","$resptr->{'avg_team_kills'}","$resptr->{'avg_suicides'}","$resptr->{'avg_obj'}"])); $i++ } } print center(); print table(Tr(\@table_rows)); } &dbfinish(); &dbdisconnect(); &footer(); } sub get_server_stats { my $server = $serv->param("servdata"); # &PageHeaders(); my $query = "SELECT player_name,count(player_name) as games,round(avg(player_score),2) as score,round(avg(player_kills),2) as kills,round(avg(player_deaths),2) as deaths,round(avg(player_team_kills),2) as team_kills,round(avg(player_suicides),2) as suicides,round(avg(player_objective),2) as obj, server_name from $table WHERE player_score > '$pointsrule' AND server_name = '$server' group by player_name order by score DESC"; &dbconnect($database,$ipaddress,$username,$password,$transaction,$query); &print_table_data($gamesplayedrule); &dbfinish(); &dbdisconnect(); &footer(); } sub serv_data { my $server = $serv->param("servdata"); &PageHeaders(); # print "

Server Stats for $server

"; &get_server_stats(); } sub print_table_data { my $server = $serv->param("servdata"); if ($player->param("player_stats")) { } else { print h1("Server Stats for $server"); print a({-href=>"index.cgi"},"Back to Server List"); } if ($player->param("player_stats")) { @table_heading = ('Rank','Player Name','Games Played','Score','Kills','Deaths','Team Kills','Suicides','Objective','Time Stamp','Server Name'); } else { @table_heading = ('Rank', a({-href=>"index.cgi?servdata=$server&sort=player_name"},"Player Name"), a({-href=>"index.cgi?servdata=$server&sort=games"},"Games Played"), a({-href=>"index.cgi?servdata=$server&sort=score"},"Average Score"), a({-href=>"index.cgi?servdata=$server&sort=kills"},"Average Kills"), a({-href=>"index.cgi?servdata=$server&sort=deaths"},"Average Deaths"), a({-href=>"index.cgi?servdata=$server&sort=team_kill"},"Average Team Kills"), a({-href=>"index.cgi?servdata=$server&sort=suicides"},"Average Suicides"), a({-href=>"index.cgi?servdata=$server&sort=objective"},"Average Objective")); } my @table_rows = th(\@table_heading); if($sti->rows == 0) { print "No Player Data Found"; } else { $i = 1; while( $resptr = $sti->fetchrow_hashref() ) { if ($resptr->{'games'} < "$_[0]") { my $numgames++; } else { if ($player->param("player_stats")) { push(@table_rows,th(["$i",a({-href=>"index.cgi?servdata=$server&player_stats=$resptr->{'player_name'}"},"$resptr->{'player_name'}"),"$resptr->{'games'}","$resptr->{'score'}","$resptr->{'kills'}","$resptr->{'deaths'}","$resptr->{'team_kills'}","$resptr->{'suicides'}","$resptr->{'obj'}","$resptr->{'timestamp'}","$resptr->{'server_name'}"])); $i++; } else { push(@table_rows,th(["$i",a({-href=>"index.cgi?servdata=$server&player_stats=$resptr->{'player_name'}"},"$resptr->{'player_name'}"),"$resptr->{'games'}","$resptr->{'score'}","$resptr->{'kills'}","$resptr->{'deaths'}","$resptr->{'team_kills'}","$resptr->{'suicides'}","$resptr->{'obj'}"])); $i++; } } } print center(); print table(Tr(\@table_rows)); } } sub sort_table { my $server = $serv->param("servdata"); my $sort = 0; if ($player->param("sort") eq "score") { $sort = "score"; } elsif ($player->param("sort") eq "kills") { $sort = "kills"; } elsif ($player->param("sort") eq "deaths") { $sort = "deaths"; } elsif ($player->param("sort") eq "team_kill") { $sort = "team_kills"; } elsif ($player->param("sort") eq "suicides") { $sort = "suicides"; } elsif ($player->param("sort") eq "objective") { $sort = "obj"; } elsif ($player->param("sort") eq "player_name") { $sort = "player_name"; } elsif ($player->param("sort") eq "games") { $sort = "games"; } my $query = "SELECT player_name, count(player_name) as games, round(avg(player_score),2) as score, round(avg(player_kills),2) as kills, round(avg(player_deaths),2) as deaths, round(avg(player_team_kills),2) as team_kills, round(avg(player_suicides),2) as suicides, round(avg(player_objective),2) as obj from $table WHERE player_score > '$pointsrule' and server_name = '$server' group by player_name order by $sort DESC"; &PageHeaders(); # print $query; &dbconnect($database,$ipaddress,$username,$password,$transaction,$query); &print_table_data($gamesplayedrule); &footer(); } sub player_stats { my $server = $serv->param("servdata"); $pname = $player->param("player_stats"); &PageHeaders(); my $ query = "SELECT sum(player_score) as total_score, sum(player_kills) as total_kills, sum(player_deaths) as total_deaths, sum(player_team_kills) as total_team_kills, sum(player_suicides) as total_suicides, sum(player_objective) as total_objective, round(avg(player_score),2) as avg_score, round(avg(player_kills),2) as avg_kills, round(avg(player_deaths),2) as avg_deaths, round(avg(player_team_kills),2) as avg_team_kills, round(avg(player_suicides),7) as avg_suicides, round(avg(player_objective),7) as avg_objective from $table where player_name ='$pname' AND player_score > '$pointsrule'"; &dbconnect($database,$ipaddress,$username,$password,$transaction,$query); print "

Player Stats for $pname


Back"; print "
"; if($sti->rows == 0) { print "No Player Data Found"; } else { while( $resptr = $sti->fetchrow_hashref() ) { print ""; } print "
Total ScoreTotal KillsTotal DeathsTotal Team KillsTotal SuicidesTotal Objective
$resptr->{'total_score'}$resptr->{'total_kills'}$resptr->{'total_deaths'}$resptr->{'total_team_kills'}$resptr->{'total_suicides'}$resptr->{'total_objective'}
"; } my $avg = "SELECT round(avg(player_score)) as avg_score, round(avg(player_kills),2) as avg_kills, round(avg(player_deaths),2) as avg_deaths, round(avg(player_team_kills),2) as avg_team_kills, round(avg(player_suicides),2) as avg_suicides, round(avg(player_objective),2) as avg_objective from $table where player_name ='$pname' AND player_score > '$pointsrule'"; &dbconnect($database,$ipaddress,$username,$password,$transaction,$avg); while( $resptr = $sti->fetchrow_hashref()) { print "
"; print ""; print "
Average ScoreAverage KillsAverage DeathsAverage Team KillsAverage SuicidesAverage Objective
$resptr->{'avg_score'}$resptr->{'avg_kills'}$resptr->{'avg_deaths'}$resptr->{'avg_team_kills'}$resptr->{'avg_suicides'}$resptr->{'avg_objective'}
"; } print "

Top $scoreingsessions Scoring Sessions

"; my $details = "SELECT player_score as score, player_name, player_kills as kills, player_deaths as deaths, player_team_kills as team_kills, player_suicides as suicides,player_objective as obj, timestamp,server_name FROM $table WHERE player_name = '$pname' AND player_score > '$pointsrule' order by score DESC LIMIT $scoreingsessions"; &dbconnect($database,$ipaddress,$username,$password,$transaction,$details); &print_table_data(); &footer(); } sub PageHeaders { my @table_heading = ('Server Load','Time','UpTime','Users Logged in'); my @table_rows = th(\@table_heading); open(LOAD, "/proc/loadavg") or die "Cant Open Log File"; $loadavg = ; @load = split(' ', $loadavg); close LOAD; my $min5 = $load[1] * 100; my $sm = `uptime`; system($sm); my @s = split(' ',$sm); push(@table_rows,td(["%$min5",$s[0],"$s[2] D","$s[5] Users"])); print header(); print start_html(-title=>"F.E.A.R Combat Stats", -style=>{src=>"table.css"}, -head=>meta({-http_equiv=>'Refresh',-content=>"$refresh;url=index.cgi"}) ); &code_protection($protect); print $start_center; print a({-href=>"index.cgi"},img{src=>"fear.jpg", align=>'CENTER',border=>'0'}); print "
\"Support "; print table(caption(h3(strong('Server Stats'))), Tr({-align=>CENTER},\@table_rows)); print $end_center; # print center(h1("$clan_name Clan Tornament Stats")); # print center(a({-href=>"index.cgi"},"Main Page")); } sub footer { print center(); print "
Fear Stats $version, Jason Schofield Febuary 2007
"; my $running = `ps -a|grep fearserver.bin`; my @pid = split(' ', $running); if ($pid[0] > '0') { print h3("Game Server Running"); } else { print h3("Game server not running"); } } sub dbconnect { $dbh = DBI->connect("dbi:mysql:$_[0]:$_[1]","$_[2]","$_[3]",{ RaiseError=>1,PrintError=>0, AutoCommit=>$_[4], HandleError=>\&dberror}) || die ( &dberror() ); if ($_[4] == 0) { eval{ $dbh->do($_[5]); $id = $dbh->{'mysql_insertid'}; $dbh->commit(); }; if ($@) { print "Tranaction Error: $@"; $dbh->rollback(); } $dbh->disconnect(); } else { $sti = $dbh->prepare("$_[5]") || die (&dberror()); $sti->execute() || die (&dberror()); } } sub dbfinish { $sti->finish || die (&dberror()); } sub dbdisconnect { $dbh->disconnect || die (&dberror()); } sub dberror { print header(); print start_html(); print "Database Error:$DBI::errstr\n
"; print end_html(); } sub code_protection { print ""; }