Code:
package cPGS::synergy;
use strict;
use IPC::Open2;
use cPGS::Shared;
our $VERSION="1.0";
my $short = 'synergy';
my $long = 'Synergy: Real HL2 Multi-Player';
sub new {
my $class = shift;
return bless {}, $class;
}
sub register_self {
return(1,__PACKAGE__,$short,$VERSION,$long);
}
sub showsimpleconfig {
my($self,$s,$srvargs_hashref,$home,$servdir,$user,$game,$srvn,$portdata,$ipdata,$ports_list,$ips_list) = @_;
my %srvargs = %{$srvargs_hashref};
my $map_list;
open(CONF,'<'."$home/.gameservers/$servdir\_$srvn/orangebox/synergy/cfg/server.cfg") or print $s "Could not open config file ($home/.gameservers/$servdir\_$srvn/orangebox/synergy/cfg/server.cfg) : $!\n";
while(<CONF>) {
s/(\r|\n|\")//g;
next if /^\/\//;
if(/^(.*?)\s+(.*)/) {
$srvargs{$1}=$2;
$srvargs{$1} =~ s/(\s+)?\/\/.*$//;
} else {
next;
}
}
close(CONF);
opendir(DIRS,"$home/.gameservers/$servdir\_$srvn/orangebox/synergy/maps/");
my @maps= readdir(DIRS);
closedir(DIRS);
foreach (@maps) { if(($_ =~ /(.*)\.bsp$/i) and ($1 ne $srvargs{'defmap'}) and ($1 ne 'credits')) { $map_list .= "<option value=\"$1\">$1\n"; } }
return(\%srvargs,$map_list,$ports_list,$ips_list);
}
sub configsave {
my($self,$s,$form_hashref,$home,$servdir,$user,$game,$srvn,$maxc) = @_;
my %form = %{$form_hashref};
my $chg_cnt = 0;
my $cfg_file = delete $form{'cfg_file'};
if( $cfg_file eq 'advconfig') {
my @realform = split(/\n/,$form{'conf'});
if(open(CONF,'>',"$home/.gameservers/$servdir\_$srvn/orangebox/synergy/cfg/server.cfg")) {
foreach my $line(@realform) {
$line =~ s/(\r|\n)//g;
print CONF "$line\n";
}
close(CONF);
return("Config file saved.");
} else {
print $s "ERROR: Can not open config file: $!\n";
}
}
return("Unknown config, can not save.");
}
sub formsave {
my($self,$s,$form_hashref,$home,$servdir,$user,$game,$srvn,$maxc) = @_;
my %form = %{$form_hashref};
my $chg_cnt = 0;
open(CONF,'<',"$home/.gameservers/$servdir\_$srvn/.launchrc");
my @existconf=(<CONF>);
close(CONF);
open(CONFRE,'>',"$home/.gameservers/$servdir\_$srvn/.launchrc");
foreach my $line(@existconf) {
$line =~ s/(\n|\r)//g;
next if $line =~ /^\/\//;
if($line =~ /^(.*?)\s+(.*)/) {
my $var = $1;
my $val = $2;
if(defined($form{$var})) {
print CONFRE "$var $form{$var}\n";
if($val ne $form{$var}) {
$chg_cnt++;
print $s "<tr><td>$var</td><td>$val</td><td>$form{$var}</td></tr>\n";
}
delete($form{$var});
} else {
print CONFRE "$line\n";
}
}
}
close(CONFRE);
open(CONF,'<',"$home/.gameservers/$servdir\_$srvn/orangebox/synergy/cfg/server.cfg");
my @existconf=(<CONF>);
close(CONF);
open(CONFRE,'>',"$home/.gameservers/$servdir\_$srvn/orangebox/synergy/cfg/server.cfg");
foreach my $line(@existconf) {
$line =~ s/(\n|\r)//g;
$line =~ s/\"//g;
if($line =~ /^\/\//) {
print CONFRE "$line\n";
} elsif($line =~ /^(.*?)\s+(.*)/) {
my $var = $1;
my $val = $2;
if(defined($form{$var})) {
print CONFRE "$var \"". $form{$var} ."\"\n";
if($val ne $form{$var}) {
$chg_cnt++;
print $s "<tr><td>$var</td><td>$val</td><td>$form{$var}</td></tr>\n";
}
delete($form{$var});
} else {
print CONFRE "$line\n";
}
}
}
foreach my $new (keys %form) {
if($form{$new}) {
print CONFRE "$new \"". $form{$new} . "\"\n";
print $s "<tr><td>$new</td><td> </td><td>$form{$new}</td></tr>\n";
$chg_cnt++;
}
}
close(CONFRE);
return($chg_cnt);
}
sub showconfig {
my($self,$s,$query,$home,$servdir,$user,$game,$srvn) = @_;
if( $query eq 'servercfg' ) {
my $sercfg='server.cfg';
open(synergyCONF,'<',"$home/.gameservers/$servdir\_$srvn/orangebox/synergy/cfg/" . $sercfg) or print $s "ERROR: Could not open server config file \" $home/.gameservers/$servdir\_$srvn/orangebox/synergy/cfg/$sercfg \": $!\n";
my @confi=(<synergyCONF>);
close(synergyCONF);
foreach my $line(@confi) {
print $s "OK: $line";
}
}
}
sub get_servdir {
return('synergy');
}
sub isinstalledql {
my($self,$s,$user,$game,$srvn,$home,$servdir) = @_;
if(-x "$home/.gameservers/$servdir\_$srvn/orangebox/srcds_run") { return 0; }
else { return 1; }
}
# gather game specific data to send to startserver code in cpgsd
sub loadlaunchrc {
my($self,$user,$game,$srvn,$home)= @_;
my(%launchrc);
my $gd = &get_servdir;
open(my $launch_fh,'<',"$home/.gameservers/$gd\_$srvn/.launchrc") or main::msglog("Could not open config file ($home/.gameservers/$gd\_$srvn/.launchrc) : $!");
my @srvargs = (<$launch_fh>);
close($launch_fh);
foreach my $args(@srvargs) {
$args =~ s/(\r|\n)//g;
if($args =~ /^net_port(=|\s+)(.*)/i) { $launchrc{'port'}=$2; }
elsif($args =~ /^net_ip(=|\s+)(.*)/i) { $launchrc{'ip'}=$2; }
elsif($args =~ /^defmap(=|\s+)(.*)/i) { $launchrc{'defmap'}=$2; }
elsif($args =~ /^autoupdate(=|\s+)(.*)/i) { $launchrc{'autoupdate'}=$2; }
elsif($args =~ /^maxplayers(=|\s+)(.*)/i) { $launchrc{'maxplayers'}=$2; }
}
my $srcbin = 'srcds_i486';
$launchrc{'game_exec_bin'} = "$home/.gameservers/$gd\_$srvn/orangebox/$srcbin";
$launchrc{'chdir'} = "$home/.gameservers/$gd\_$srvn/orangebox/";
if($launchrc{'autoupdate'} == 1) { main::steamupdate($user,$game,$srvn,$short,$long,'synergy'); }
$launchrc{'ld_library_path'} = 'bin:synergy/bin:.';
$launchrc{'fullname'} = $long;
$launchrc{'cpgs-divider'} = ' ';
return(\%launchrc);
}
sub set_default_configs {
my($self,$s,$user,$game,$srvn,$dir,$maxc,$lowport,$defip) = @_;
my $pcnt = my @ports = split(/\_/,$lowport);
if($pcnt > 1) {
$lowport = shift(@ports);
}
my $err;
# not needed and overrides server.cfg
unlink("$dir/orangebox/synergy/cfg/config_arena.cfg") if -f "$dir/orangebox/synergy/cfg/config_arena.cfg";
if(open(DEF,'<','/var/cpanel/cpgs/games/synergy/custom_default_server.cfg') || open(DEF,'<','/var/cpanel/cpgs/games/synergy/default_server.cfg')) {
if(open(DEFC,'>',"$dir/orangebox/synergy/cfg/server.cfg")) {
while(<DEF>) {
print DEFC $_;
}
close(DEFC);
} else {
$err .= "Could not write to $dir/orangebox/synergy/cfg/server.cfg : $!\n";
main::msglog("Could not write to $dir/orangebox/synergy/cfg/server.cfg : $!");
}
close(DEF);
} else {
$err .= "Could not open default config file: $! \n";
main::msglog("Could not open default config file: $!");
}
if(open(LAUNCHRC,'>',"$dir/.launchrc")) {
print LAUNCHRC "net_ip $defip\n";
print LAUNCHRC "defmap syn_oldcanals\n";
print LAUNCHRC "net_port $lowport\n";
print LAUNCHRC "autoupdate 0\n";
print LAUNCHRC "maxplayers $maxc\n";
close(LAUNCHRC);
} else {
$err .= "Could not open $dir/.launchrc : $! \n";
main::msglog("Could not open $dir/.launchrc : $!");
}
return($err);
}
sub getserverip {
my($self,$s,$user,$game,$srvn,$home,$servdir) = @_;
open(ARGSF,"<$home/.gameservers/$servdir\_$srvn/.launchrc") or print $s "Could not open config file ($home/.gameservers/$servdir\_$srvn/.launchrc) : $! <br>\n";
my @srvargs = (<ARGSF>);
close(ARGSF);
foreach my $args(@srvargs) {
$args =~ s/(\r|\n)//g;
if($args =~ /net_ip\s+(.*)/i) { return($1); }
}
return(1);
}
sub getStats {
my($self,$user,$game,$srvn,$ipval,$pubip,$verbose,@targets) = @_;
my($sip,$players,$map,$gtype,$sname,@reply,$target,%seen,$matched,%retteam,$pname,$time,$score);
my($pkg,$calling_file,$calling_line)=caller;
foreach $target(@targets) {
if($target =~ /(\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})\:(\d+)\s+\((.*)\)/) {
my $ip=$1;
my $port=$2;
if($ip eq '0.0.0.0') { $ip=$pubip; }
$target = "$ip\:$port";
}
if($seen{$target} eq $target) { next; }
$seen{$target}=$target;
# print "user = $user <br> game = $game <br> srvn = $srvn <br> pubip = $pubip <br> verbose = $verbose <br> targets = @targets <br><br>\n";
@reply="";
if($verbose == 0) {
my @arg = ("-a2s",$target,"-nh","-timeout",$cPGS::Shared::to);
my $pid = open2(\*READ,\*WRITE,$cPGS::Shared::qstatpath,@arg); close(WRITE); while(<READ>) { push(@reply,$_); } close(READ);
foreach my $ln(@reply) {
if($ln =~ m/^(\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}.*)\s+(\d+\/\d+)\s+\d+\/\d+\s+([\w\s]+)\s+\d+\s+\/\s+\d+\s+(\w+)\s+(.*)/) {
$sip=$1;
$players=$2;
$map=$3;
$gtype=$4;
$sname=$5;
$matched=1;
} elsif($ln =~ m/^(\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}.*)\s+(\d+\/\d+)\s+\d+\/\d+\s+([\w\s]+)\s+\d+\s+\/\s+\d+\s+(\w+)\s+(.*)/) {
$sip=$1;
$players=$2;
$map=$3;
$gtype=$4;
$sname=$5;
$matched=1;
}
}
if($matched == 1) {
last;
}
} else {
my @arg = ("-a2s",$target,"-P","-nh","-timeout",$cPGS::Shared::to);
my @reply="";
my $pid = open2(\*READ,\*WRITE,$cPGS::Shared::qstatpath,@arg); close(WRITE); while(<READ>) { push(@reply,$_); } close(READ);
foreach my $ln(@reply) {
if($ln =~ m/^(\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}.*)\s+(\d+\/\d+)\s+\d+\/\d+\s+([\w\s]+)\s+\d+\s+\/\s+\d+\s+(\w+)\s+(.*)/) {
$sip=$1;
$players=$2;
$map=$3;
$gtype=$4;
$sname=$5;
$matched=1;
} elsif($ln =~ m/^(\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}.*)\s+(\d+\/\d+)\s+\d+\/\d+\s+([\w\s]+)\s+\d+\s+\/\s+\d+\s+(\w+)\s+(.*)/) {
$sip=$1;
$players=$2;
$map=$3;
$gtype=$4;
$sname=$5;
$matched=1;
}
elsif($ln =~ /^\s+(\d+)\s+frags\s+(\-\d+s|\d+s|.+?s)\s+(.+$)/) {
# elsif($ln =~ /^\s+(\d+)\s+frags\s+(\d+[\d\s\w]{2,10}s)\s+(.+$)/) {
$score=$1;
$time=$2;
$pname=$3;
$pname = $pkg->filter($pname);
$retteam{$pname}{'score'}=$score;
$retteam{$pname}{'time'}=$time;
$retteam{$pname}{'pname'}=$pname;
}
}
if($matched == 1) {
last;
}
}
}
return($matched,$sip,$players,$map,$gtype,$sname,undef,%retteam);
}
sub showPlayerStats {
my($self,$game,$retteam)=@_;
print "<table border=0 cellpadding=0 cellspacing=0 width=100\%><tr><th>Player Name</th><th>Score</th><th>Time Played</th></tr>";
foreach my $key(keys %{$retteam}) { print "<tr><td>$$retteam{$key}{'pname'}</td><td>$$retteam{$key}{'score'}</td><td>$$retteam{$key}{'time'}</td></tr>\n"; }
print "</div></table></div>\n";
}
sub showWHMopts {
my ($self,$user,$game,$srvn) = @_;
my ($pkg,$calling_file,$calling_line)=caller;
if((! $user) or (! $game) or ($srvn !~ m/^\d+$/)) {
print "Missing user($user) , game($game) or srvn($srvn) <br>\n";
return(0);
}
my ($tickrate) = main::sendssl("127.0.0.1 gettickrate $user $game $srvn");
$tickrate =~ s/(\r|\n)//g;
if ( $tickrate =~ /not connect/i ) { $tickrate = '' . $user . $game . $srvn; }
print "<tr><td>Tickrate</td><td>";
print "<input type=text name=\"$user\_$game\_$srvn\_tickrate\" value=\"$tickrate\" size=30></td></tr>";
}
1;
Now I do not see what is wrong here. I changed all the paths and update the other files.