Limit play time collection based on config settings

This commit is contained in:
Jamie Cameron
2013-05-22 15:56:57 -07:00
parent 004f70ec9e
commit a94c4b1344
4 changed files with 57 additions and 13 deletions

View File

@@ -57,17 +57,17 @@ my @links = ( "edit_conf.cgi", "edit_users.cgi",
"view_logs.cgi", "list_conns.cgi",
"list_worlds.cgi", "edit_cmds.cgi",
"console.cgi", "edit_backup.cgi",
"edit_manual.cgi" );
"list_playtime.cgi", "edit_manual.cgi" );
my @titles = ( $text{'conf_title'}, $text{'users_title'},
$text{'logs_title'}, $text{'conns_title'},
$text{'worlds_title'}, $text{'cmds_title'},
$text{'console_title'}, $text{'backup_title'},
$text{'manual_title'} );
$text{'playtime_title'}, $text{'manual_title'} );
my @icons = ( "images/conf.gif", "images/users.gif",
"images/logs.gif", "images/conns.gif",
"images/worlds.gif", "images/cmds.gif",
"images/console.gif", "images/backup.gif",
"images/manual.gif" );
"images/playtime.gif", "images/manual.gif" );
&icons_table(\@links, \@titles, \@icons, 5);
print &ui_hr();

View File

@@ -306,10 +306,11 @@ monitor_checklog=Check server response to commands?
playtime_title=Daily Play Time
playtime_user=Username
playtime_time=Time online
playtime_ltime=Enforced time
playtime_now=Status
playtime_none=No players were connected for this day.
playtime_on=Online
playtime_off=Off
playtime_off=Offline
playtime_header=Daily play limit settings
playtime_enabled=Limits enabled?
playtime_max=Maximum time per day

View File

@@ -8,12 +8,13 @@ our (%in, %text, %config);
&ui_print_header(undef, $text{'playtime_title'}, "");
my $playtime = &get_current_day_usage();
my ($playtime, $limit_playtime) = &get_current_day_usage();
my @conns = &list_connected_players();
if (keys %$playtime) {
print &ui_columns_start([ $text{'playtime_user'},
$text{'playtime_time'},
$text{'playtime_ltime'},
$text{'playtime_now'} ]);
foreach my $u (sort { $playtime->{$b} <=> $playtime->{$a} }
keys %$playtime) {
@@ -21,9 +22,10 @@ if (keys %$playtime) {
"<a href='view_conn.cgi?name=".&urlize($u)."'>".
&html_escape($u)."</a>",
&nice_seconds($playtime->{$u}),
&nice_seconds($limit_playtime->{$u} || 0),
&indexof($u, @conns) >= 0 ?
"<font color=green><b>$text{'playtime_on'}</b></font>" :
$text{'playtime_off'},
"<font color=red>$text{'playtime_off'}</a>",
]);
}
print &ui_columns_end();
@@ -64,6 +66,7 @@ print &ui_table_row($text{'playtime_ips'},
&ui_opt_textbox("ips", $config{'playtime_ips'}, 40,
$text{'playtime_all2'}, $text{'playtime_sel2'}));
print &ui_table_end();
print &ui_form_end([ [ undef, $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});

View File

@@ -13,6 +13,8 @@ our ($module_root_directory, %text, %gconfig, $root_directory, %config,
our $history_file = "$module_config_directory/history.txt";
our $server_jar_url = "https://s3.amazonaws.com/MinecraftDownload/launcher/minecraft_server.jar";
&foreign_require("webmin");
# check_minecraft_server()
# Returns an error message if the Minecraft server is not installed
sub check_minecraft_server
@@ -756,7 +758,8 @@ if (time() - $config{'last_check'} > 6*60*60) {
}
# get_current_day_usage()
# Returns a hash ref from usernames to usage over the last day
# Returns a hash ref from usernames to total usage over the last day, and
# usage that counts towards any limits
sub get_current_day_usage
{
my $logfile = $config{'minecraft_dir'}."/server.log";
@@ -783,15 +786,20 @@ while(1) {
}
# Read forwards, looking for logins and logouts for today
my %rv;
my %lastlogin;
my (%rv, %limit_rv);
my (%lastlogin, %limit_lastlogin);
while(my $line = <LOGFILE>) {
$line =~ /^((\d+)\-(\d+)\-(\d+))\s+(\d+):(\d+):(\d+)/ || next;
$1 eq $wantday || next;
my $day = $1;
$day eq $wantday || next;
my $secs = $5*60*60 + $6*60 + $7;
if ($line =~ /\s(\S+)\s*\[[^\]]+\]\s+logged\s+in\s/) {
if ($line =~ /\s(\S+)\[.*\/([0-9\.]+):(\d+)\]\s+logged\s+in\s/) {
# Login by a user
$lastlogin{$1} = $secs;
my ($u, $ip) = ($1, $2);
$lastlogin{$u} = $secs;
if (&limit_user($ip, $u, $day)) {
$limit_lastlogin{$u} = $secs;
}
}
elsif ($line =~ /\s(\S+)(\s*\[[^\]]+\])?\s+lost\s+connection/) {
# Logout .. count time
@@ -800,6 +808,11 @@ while(my $line = <LOGFILE>) {
$rv{$1} += $secs - $lastlogin{$1};
delete($lastlogin{$1});
}
if (defined($limit_lastlogin{$1})) {
# Also for login that counts towards limits
$limit_rv{$1} += $secs - $limit_lastlogin{$1};
delete($limit_lastlogin{$1});
}
}
}
close(LOGFILE);
@@ -809,8 +822,11 @@ my $now = $tm[2]*60*60 + $tm[1]*60 + $tm[0];
foreach my $u (keys %lastlogin) {
$rv{$u} += $now - $lastlogin{$u};
}
foreach my $u (keys %limit_lastlogin) {
$limit_rv{$u} += $now - $limit_lastlogin{$u};
}
return \%rv;
return (\%rv, \%limit_rv);
}
# nice_seconds(secs)
@@ -833,4 +849,28 @@ else {
}
}
# limit_user(ip, user, date)
# Returns 1 if some usage should be counted for limiting purposes
sub limit_user
{
my ($ip, $user, $date) = @_;
my @users = split(/\s+/, $config{'playtime_users'});
if (@users && &indexoflc($user, @users) < 0) {
return 0;
}
my @ips = split(/\s+/, $config{'playtime_ips'});
if (@ips && !&webmin::ip_match($ip, @ips)) {
return 0;
}
my @days = split(/\s+/, $config{'playtime_days'});
if (@days > 0 && @days < 7) {
my ($y, $m, $d) = split(/\-/, $date);
my @tm = localtime(timelocal(0, 0, 0, $d, $m-1, $y-1900));
if (@tm && &indexof($tm[6], @days) < 0) {
return 0;
}
}
return 1;
}
1;