--- deliantra/server/ext/schmorplog.ext 2010/04/11 04:52:07 1.25 +++ deliantra/server/ext/schmorplog.ext 2010/04/12 05:57:53 1.27 @@ -5,6 +5,8 @@ use Fcntl; use Coro::AIO; +our %PLAYERSEEN; + our $UPDATE_LOGINS = AE::idle sub { $_[0]->stop; @@ -45,6 +47,7 @@ cf::player->attach ( on_login => sub { my ($pl) = @_; + $pl->ob->kv_set (schmorplog_last_login => time); $pl->ob->kv_set (schmorplog_login_count => @@ -52,8 +55,11 @@ $pl->ob->kv_set (schmorplog_client => $pl->ns->{who_version}); - ext::irc::do_notice (sprintf "%s logged in", $pl->ob->name); + my $name = $pl->ob->name; + ext::irc::do_notice $name . " logged in"; + + undef $PLAYERSEEN{$name}; $UPDATE_LOGINS->start; warn "LOGIN: ", $pl->ob->name, " from ", $pl->ns->host; @@ -61,7 +67,7 @@ on_logout => sub { my ($pl, $cleanly) = @_; $pl->ob->kv_set (schmorplog_last_logout => time); - ext::irc::do_notice (sprintf "%s left", $pl->ob->name); + ext::irc::do_notice $pl->ob->name . " left"; $UPDATE_LOGINS->start; @@ -69,22 +75,22 @@ }, on_birth => sub { my ($pl) = @_; - ext::irc::do_notice (sprintf "%s was just born", $pl->ob->name); $pl->ob->kv_set (schmorplog_birthdate => time); + ext::irc::do_notice $pl->ob->name . " was just born"; warn "BIRTH: ", $pl->ob->name, " from ", $pl->ns->host; }, on_quit => sub { my ($pl) = @_; - ext::irc::do_notice (sprintf "%s quit the game", $pl->ob->name); + ext::irc::do_notice $pl->ob->name . " quit the game"; warn "QUIT: ", $pl->ob->name, " from ", $pl->ns->host; }, on_death => sub { my ($pl) = @_; - my $msg = $pl->expand_cfpod (sprintf "%s was killed by %s.", $pl->ob->name, $pl->killer_name); - ext::irc::do_notice ($msg); + my $msg = $pl->expand_cfpod ($pl->ob->name . " was killed by " . $pl->killer_name . "."); + ext::irc::do_notice $msg; ++$pl->ob->{stats_death}{$pl->killer_name}; @@ -168,3 +174,40 @@ () }; +# log max playercount every minute +############################################################################# + +our $STATSDIR = "$LOCALDIR/maxplayers"; + +mkdir $STATSDIR; + +our $WRITE_MAXPLAYERS = EV::periodic 0, 60, undef, sub { + my $now = AE::now; + my $cnt = scalar keys %PLAYERSEEN; + + %PLAYERSEEN = map +($_->ob->name => undef), grep $_->ns, cf::player::list; + + my @time = gmtime $now; + + my $path = sprintf "%s/%04d-%02d-%02d", $STATSDIR, $time[5] + 1900, $time[4] + 1, $time[3]; + my $offs = $time [2] * 60 + $time [1]; + + $cnt++; + $cnt = 254 if $cnt > 254; + $cnt = chr $cnt; + + IO::AIO::aio_open $path, O_WRONLY | O_CREAT, 0666, sub { + my $fh = shift + or return; + + # the truncate is 1440 extra syscalls, but saves 1439 + # slow metadata updates. + IO::AIO::aio_truncate $fh, 1440, sub { + IO::AIO::aio_write $fh, $offs, 1, $cnt, 0, sub { + IO::AIO::aio_close $fh; + }; + }; + }; +}; + +