#!/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; my %mtime; sub init { 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; } } for my $guild (keys %slaying) { $count{$guild} = @{ $members{$guild} }; } } sub in_days { my ($secs) = @_; ($NOW - $secs) / 3600 / 24; } sub guild_list { print "short name full name\n"; print "-" x 27 . "\n"; print "$_" . (length $_ == 3 ? "" : " ") . " " x 15 . $slaying{$_} . "\n" for keys %slaying; } sub members_mtime_avg { init; print "Guild: mtime:\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 { init; print "Guild: mtime:\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 { init; print "Guild: members:\n"; print $slaying{$_} . " " x (20 - length $slaying{$_}) . $count{$_} . "\n" for keys %slaying; } sub members_list { init; my ($guild) = @_; if ($guild) { print "Members for guild " . $slaying{$guild} . ":\n"; print "-" x 32 . "\n"; print "$_\n" for @{ $members{$guild} }; } else { guild_list; return; } } sub usage { print <] 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 . lst without lists all guild names 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; } elsif ($ARGV[0] eq "lst") { members_list $ARGV[1]; } else { usage; }