#!/usr/bin/env perl # Script to help drawing conclusions on guild activity # Usage is at the bottom use strict; use List::Util qw(max); my $PLAYERDIR = "/var/crossfire/players"; my $NOW = time; my %slaying = ( bs => "black_shield", dh => "damned_heretics", ds => "dreaming_sage", db => "drunken_barbarian", ls => "laughing_skull", mf => "mailed_fist", pd => "poisoned_dagger", pb => "purple_butterfly", sc => "smoking_cauldron", ki => "ketsueki_itsuryuu", ny => "nenshou_youso", zdr => "zaseki_dzuki_ryoku" ); my %members; my %count; sub init { chdir $PLAYERDIR; for my $pl (<*>) { my $pldata = do { local $/; open my $fh, "<$pl/$pl.pl" or die "$pl/$pl.pl: $!"; <$fh> }; for my $guild (keys %slaying) { $pldata =~ /^slaying $slaying{$guild}$/m && push @{ $members{$guild} }, $pl; } } for my $guild (keys %slaying) { $count{$guild} = @{ $members{$guild} }; } } sub init_with_age { my ($age) = @_; chdir $PLAYERDIR; for my $pl (<*>) { my $mtime = (stat $pl)[9]; my $pldata = do { local $/; open my $fh, "<$pl/$pl.pl" or die "$pl/$pl.pl: $!"; <$fh> }; for my $guild (keys %slaying) { $pldata =~ /^slaying $slaying{$guild}$/m && push @{ $members{$guild} }, $pl if ($NOW - $mtime < $age * 24 * 3600); } } for my $guild (keys %slaying) { $count{$guild} = @{ $members{$guild} } if $members{$guild}; } } sub in_days { my ($secs) = @_; ($NOW - $secs) / 3600 / 24; } sub guild_list { print STDERR "short name full name\n"; print STDERR "-" x 27 . "\n"; print "$_" . (length $_ == 3 ? "" : " ") . " " x 15 . $slaying{$_} . "\n" for keys %slaying; } sub members_mtime_avg { my %mtime; init; print STDERR "Guild: mtime:\n"; print STDERR "-" x 26 . "\n"; for my $guild (keys %slaying) { for my $member (@{ $members{$guild} }) { $mtime{$guild} += (stat "$member")[9]; } $mtime{$guild} /= $count{$guild}; print $slaying{$guild} . " " x (20 - length $slaying{$guild}) . in_days($mtime{$guild}) . "\n"; } } sub members_mtime_max { my %mtime; init; print STDERR "Guild: mtime:\n"; print STDERR "-" x 26 . "\n"; for my $guild (keys %slaying) { for my $member (@{ $members{$guild} }) { $mtime{$guild} = max +(stat $member)[9], $mtime{$guild}; } print $slaying{$guild} . " " x (20 - length $slaying{$guild}) . in_days($mtime{$guild}) . "\n"; } } sub members_cnt { my ($age) = @_; if ($age) { init_with_age $age; print STDERR "Guild member count for members with mtime < $age days\n"; } else { init; print STDERR "Guild member count\n"; } print STDERR "Guild: members:\n"; print STDERR "-" x 28 . "\n"; print $slaying{$_} . " " x (20 - length $slaying{$_}) . ($count{$_} or 0) . "\n" for keys %slaying; } sub members_list { my ($guild, $age) = @_; init; if ($guild) { print STDERR "Members for guild " . $slaying{$guild} . ($age ? " with mtime < $age" : "") . ":\n"; print STDERR "-" x 31 . "\n"; if ($age) { for my $member (@{ $members{$guild} }) { if ($NOW - (stat $member)[9] < $age * 24 * 3600) { print "$member\n"; } } } else { print "$_\n" for @{ $members{$guild} }; } } else { guild_list; return; } } sub usage { print < []\033[0m max: max(mtime of all guild members) for each guild avg: average mtime of all guild members for each guild cnt: member count (number of players owning a key) lst: list members for \033[1m\033[0m. lst without \033[1m\033[0m lists all guild names The optional is the maximum time in days a player can be logged out and still appear on the list. \033[1m\033[0m only applies to \033[1mcnt\033[0m and \033[1mlst\033[0m. Copyright (C) 2006 The Crossfire+ Development Team USAGE } if ($ARGV[0] eq "max") { members_mtime_max; } elsif ($ARGV[0] eq "avg") { members_mtime_avg; } elsif ($ARGV[0] eq "cnt") { members_cnt $ARGV[1]; } elsif ($ARGV[0] eq "lst") { members_list $ARGV[1], $ARGV[2]; } else { usage; }