1 | #!/usr/bin/env perl |
1 | #!/usr/bin/env perl |
2 | |
2 | |
3 | # Script to help making assertions on guild activity |
3 | # Script to help drawing conclusions on guild activity |
4 | # Usage is at the bottom |
4 | # Usage is at the bottom |
5 | |
5 | |
6 | use strict; |
6 | use strict; |
|
|
7 | use List::Util qw(max); |
7 | |
8 | |
8 | my $PLAYERDIR = "/var/crossfire/players"; |
9 | my $PLAYERDIR = "/var/crossfire/players"; |
9 | |
10 | |
10 | my $NOW = time; |
11 | my $NOW = time; |
11 | |
12 | |
12 | my @black_shield; |
13 | my %slaying = ( |
13 | my @damned_heretics; |
14 | bs => "black_shield", |
14 | my @dreaming_sage; |
15 | dh => "damned_heretics", |
15 | my @drunken_barbarian; |
16 | ds => "dreaming_sage", |
16 | my @laughing_skull; |
17 | db => "drunken_barbarian", |
17 | my @mailed_fist; |
18 | ls => "laughing_skull", |
18 | my @poisoned_dagger; |
19 | mf => "mailed_fist", |
19 | my @purple_butterfly; |
20 | pd => "poisoned_dagger", |
20 | my @smoking_cauldron; |
21 | pb => "purple_butterfly", |
21 | my @ketsueki_itsuryuu; |
22 | sc => "smoking_cauldron", |
22 | my @nenshou_youso; |
23 | ki => "ketsueki_itsuryuu", |
23 | my @zaseki_dzuki_ryoku; |
24 | ny => "nenshou_youso", |
|
|
25 | zdr => "zaseki_dzuki_ryoku" |
|
|
26 | ); |
24 | |
27 | |
25 | chdir $PLAYERDIR; |
28 | my %members; |
|
|
29 | my %count; |
|
|
30 | my %mtime; |
26 | |
31 | |
27 | for my $pl (<*>) { |
32 | sub init { |
28 | my $mtime = (stat $pl)[9]; |
33 | chdir $PLAYERDIR; |
29 | my $pldata = do { local $/; open my $fh, "<$pl/$pl.pl" or die; <$fh> }; |
|
|
30 | |
34 | |
31 | push @black_shield, $pl if $pldata =~ /black_shield/; |
35 | for my $pl (<*>) { |
32 | push @damned_heretics, $pl if $pldata =~ /damned_heretics/; |
36 | my $mtime = (stat $pl)[9]; |
33 | push @dreaming_sage, $pl if $pldata =~ /dreaming_sage/; |
37 | my $pldata = do { local $/; open my $fh, "<$pl/$pl.pl" or die "$pl/$pl.pl: $!"; <$fh> }; |
34 | push @drunken_barbarian, $pl if $pldata =~ /drunken_barbarian/; |
38 | |
35 | push @laughing_skull, $pl if $pldata =~ /laughing_skull/; |
39 | for my $guild (keys %slaying) { |
36 | push @mailed_fist, $pl if $pldata =~ /mailed_fist/; |
40 | $pldata =~ /^slaying $slaying{$guild}$/m && push @{ $members{$guild} }, $pl; |
37 | push @poisoned_dagger, $pl if $pldata =~ /poisoned_dagger/; |
41 | } |
38 | push @purple_butterfly, $pl if $pldata =~ /purple_butterfly/; |
42 | } |
39 | push @smoking_cauldron, $pl if $pldata =~ /smoking_cauldron/; |
43 | |
40 | push @ketsueki_itsuryuu, $pl if $pldata =~ /ketsueki_itsuryuu/; |
44 | for my $guild (keys %slaying) { |
41 | push @nenshou_youso, $pl if $pldata =~ /nenshou_youso/; |
45 | $count{$guild} = @{ $members{$guild} }; |
42 | push @zaseki_dzuki_ryoku, $pl if $pldata =~ /zaseki_dzuki_ryoku/; |
46 | } |
43 | } |
47 | } |
44 | |
|
|
45 | my $bs_cnt = @black_shield; |
|
|
46 | my $dh_cnt = @damned_heretics; |
|
|
47 | my $ds_cnt = @dreaming_sage; |
|
|
48 | my $db_cnt = @drunken_barbarian; |
|
|
49 | my $ls_cnt = @laughing_skull; |
|
|
50 | my $mf_cnt = @mailed_fist; |
|
|
51 | my $pd_cnt = @poisoned_dagger; |
|
|
52 | my $pb_cnt = @purple_butterfly; |
|
|
53 | my $sc_cnt = @smoking_cauldron; |
|
|
54 | my $ki_cnt = @ketsueki_itsuryuu; |
|
|
55 | my $ny_cnt = @nenshou_youso; |
|
|
56 | my $zdr_cnt = @zaseki_dzuki_ryoku; |
|
|
57 | |
48 | |
58 | sub in_days { |
49 | sub in_days { |
59 | my ($secs) = @_; |
50 | my ($secs) = @_; |
60 | ($NOW - $secs) / 3600 / 24; |
51 | ($NOW - $secs) / 3600 / 24; |
61 | } |
52 | } |
62 | |
53 | |
|
|
54 | sub guild_list { |
|
|
55 | print "short name full name\n"; |
|
|
56 | print "-" x 27 . "\n"; |
|
|
57 | print "$_" . (length $_ == 3 ? "" : " ") . " " x 15 . $slaying{$_} . "\n" for keys %slaying; |
|
|
58 | } |
|
|
59 | |
63 | sub members_mtime_avg { |
60 | sub members_mtime_avg { |
64 | my ($bs_mtime, $dh_mtime, $ds_mtime, $db_mtime, $ls_mtime, $mf_mtime) = 0; |
61 | init; |
65 | my ($pd_mtime, $pb_mtime, $sc_mtime, $ki_mtime, $ny_mtime, $zdr_mtime) = 0; |
62 | print "Guild: mtime:\n"; |
66 | |
63 | for my $guild (keys %slaying) { |
67 | for my $bs_member (@black_shield) { |
64 | for my $member (@{ $members{$guild} }) { |
68 | $bs_mtime += (stat "$bs_member")[9]; |
65 | $mtime{$guild} += (stat "$member")[9]; |
|
|
66 | } |
|
|
67 | $mtime{$guild} /= $count{$guild}; |
|
|
68 | print $slaying{$guild} . " " x (20 - length $slaying{$guild}) . in_days($mtime{$guild}) . "\n"; |
69 | } |
69 | } |
70 | |
|
|
71 | for my $dh_member (@damned_heretics) { |
|
|
72 | $dh_mtime += (stat "$dh_member")[9]; |
|
|
73 | } |
|
|
74 | |
|
|
75 | for my $ds_member (@dreaming_sage) { |
|
|
76 | $ds_mtime += (stat "$ds_member")[9]; |
|
|
77 | } |
|
|
78 | |
|
|
79 | for my $db_member (@drunken_barbarian) { |
|
|
80 | $db_mtime += (stat "$db_member")[9]; |
|
|
81 | } |
|
|
82 | |
|
|
83 | for my $ls_member (@laughing_skull) { |
|
|
84 | $ls_mtime += (stat "$ls_member")[9]; |
|
|
85 | } |
|
|
86 | |
|
|
87 | for my $mf_member (@mailed_fist) { |
|
|
88 | $mf_mtime += (stat "$mf_member")[9]; |
|
|
89 | } |
|
|
90 | |
|
|
91 | for my $pd_member (@poisoned_dagger) { |
|
|
92 | $pd_mtime += (stat "$pd_member")[9]; |
|
|
93 | } |
|
|
94 | |
|
|
95 | for my $pb_member (@purple_butterfly) { |
|
|
96 | $pb_mtime += (stat "$pb_member")[9]; |
|
|
97 | } |
|
|
98 | |
|
|
99 | for my $sc_member (@smoking_cauldron) { |
|
|
100 | $sc_mtime += (stat "$sc_member")[9]; |
|
|
101 | } |
|
|
102 | |
|
|
103 | for my $ki_member (@ketsueki_itsuryuu) { |
|
|
104 | $ki_mtime += (stat "$ki_member")[9]; |
|
|
105 | } |
|
|
106 | |
|
|
107 | for my $ny_member (@nenshou_youso) { |
|
|
108 | $ny_mtime += (stat "$ny_member")[9]; |
|
|
109 | } |
|
|
110 | |
|
|
111 | for my $zdr_member (@zaseki_dzuki_ryoku) { |
|
|
112 | $zdr_mtime += (stat "$zdr_member")[9]; |
|
|
113 | } |
|
|
114 | |
|
|
115 | $bs_mtime = $bs_mtime / $bs_cnt; |
|
|
116 | $dh_mtime = $dh_mtime / $dh_cnt; |
|
|
117 | $ds_mtime = $ds_mtime / $ds_cnt; |
|
|
118 | $db_mtime = $db_mtime / $db_cnt; |
|
|
119 | $ls_mtime = $ls_mtime / $ls_cnt; |
|
|
120 | $mf_mtime = $mf_mtime / $mf_cnt; |
|
|
121 | $pd_mtime = $pd_mtime / $pd_cnt; |
|
|
122 | $pb_mtime = $pb_mtime / $pb_cnt; |
|
|
123 | $sc_mtime = $sc_mtime / $sc_cnt; |
|
|
124 | $ki_mtime = $ki_mtime / $ki_cnt; |
|
|
125 | $ny_mtime = $ny_mtime / $ny_cnt; |
|
|
126 | $zdr_mtime = $zdr_mtime / $zdr_cnt; |
|
|
127 | |
|
|
128 | print "Guild: mtime:\n"; |
|
|
129 | print "black_shield: ".in_days($bs_mtime)."\n"; |
|
|
130 | print "damned_heretics: ".in_days($dh_mtime)."\n"; |
|
|
131 | print "dreaming_sage: ".in_days($ds_mtime)."\n"; |
|
|
132 | print "drunken_barbarian: ".in_days($db_mtime)."\n"; |
|
|
133 | print "laughing_skull: ".in_days($ls_mtime)."\n"; |
|
|
134 | print "mailed_fist: ".in_days($mf_mtime)."\n"; |
|
|
135 | print "poisoned_dagger: ".in_days($pd_mtime)."\n"; |
|
|
136 | print "purple_butterfly: ".in_days($pb_mtime)."\n"; |
|
|
137 | print "smoking_cauldron: ".in_days($sc_mtime)."\n"; |
|
|
138 | print "ketsueki_itsuryuu: ".in_days($ki_mtime)."\n"; |
|
|
139 | print "nenshou_youso: ".in_days($ny_mtime)."\n"; |
|
|
140 | print "zaseki_dzuki_ryoku: ".in_days($zdr_mtime)."\n"; |
|
|
141 | } |
70 | } |
142 | |
71 | |
143 | sub members_mtime_max { |
72 | sub members_mtime_max { |
144 | my ($bs_mtime, $dh_mtime, $ds_mtime, $db_mtime, $ls_mtime, $mf_mtime) = 0; |
73 | init; |
145 | my ($pd_mtime, $pb_mtime, $sc_mtime, $ki_mtime, $ny_mtime, $zdr_mtime) = 0; |
74 | print "Guild: mtime:\n"; |
|
|
75 | for my $guild (keys %slaying) { |
|
|
76 | for my $member (@{ $members{$guild} }) { |
|
|
77 | $mtime{$guild} = max +(stat $member)[9], $mtime{$guild}; |
|
|
78 | } |
|
|
79 | print $slaying{$guild} . " " x (20 - length $slaying{$guild}) . in_days($mtime{$guild}) . "\n"; |
|
|
80 | } |
|
|
81 | } |
146 | |
82 | |
147 | for my $bs_member (@black_shield) { |
83 | sub members_cnt { |
148 | $bs_member = (stat "$bs_member")[9]; |
84 | init; |
149 | $bs_mtime = $bs_member if $bs_member > $bs_mtime; |
85 | print "Guild: members:\n"; |
|
|
86 | print $slaying{$_} . " " x (20 - length $slaying{$_}) . $count{$_} . "\n" |
|
|
87 | for keys %slaying; |
|
|
88 | } |
|
|
89 | |
|
|
90 | sub members_list { |
|
|
91 | init; |
|
|
92 | my ($guild) = @_; |
|
|
93 | |
|
|
94 | if ($guild) { |
|
|
95 | print "Members for guild " . $slaying{$guild} . ":\n"; |
|
|
96 | print "-" x 32 . "\n"; |
|
|
97 | print "$_\n" for @{ $members{$guild} }; |
|
|
98 | } else { |
|
|
99 | guild_list; |
|
|
100 | return; |
150 | } |
101 | } |
151 | |
|
|
152 | for my $dh_member (@damned_heretics) { |
|
|
153 | $dh_member = (stat "$dh_member")[9]; |
|
|
154 | $dh_mtime = $dh_member if $dh_member > $dh_mtime; |
|
|
155 | } |
|
|
156 | |
|
|
157 | for my $ds_member (@dreaming_sage) { |
|
|
158 | $ds_member = (stat "$ds_member")[9]; |
|
|
159 | $ds_mtime = $ds_member if $ds_member > $ds_mtime; |
|
|
160 | } |
|
|
161 | |
|
|
162 | for my $db_member (@drunken_barbarian) { |
|
|
163 | $db_member = (stat "$db_member")[9]; |
|
|
164 | $db_mtime = $db_member if $db_member > $db_mtime; |
|
|
165 | } |
|
|
166 | |
|
|
167 | for my $ls_member (@laughing_skull) { |
|
|
168 | $ls_member = (stat "$ls_member")[9]; |
|
|
169 | $ls_mtime = $ls_member if $ls_member > $ls_mtime; |
|
|
170 | } |
|
|
171 | |
|
|
172 | for my $mf_member (@mailed_fist) { |
|
|
173 | $mf_member = (stat "$mf_member")[9]; |
|
|
174 | $mf_mtime = $mf_member if $mf_member > $mf_mtime; |
|
|
175 | } |
|
|
176 | |
|
|
177 | for my $pd_member (@poisoned_dagger) { |
|
|
178 | $pd_member = (stat "$pd_member")[9]; |
|
|
179 | $pd_mtime = $pd_member if $pd_member > $pd_mtime; |
|
|
180 | } |
|
|
181 | |
|
|
182 | for my $pb_member (@purple_butterfly) { |
|
|
183 | $pb_member = (stat "$pb_member")[9]; |
|
|
184 | $pb_mtime = $pb_member if $pb_member > $pb_mtime; |
|
|
185 | } |
|
|
186 | |
|
|
187 | for my $sc_member (@smoking_cauldron) { |
|
|
188 | $sc_member = (stat "$sc_member")[9]; |
|
|
189 | $sc_mtime = $sc_member if $sc_member > $sc_mtime; |
|
|
190 | } |
|
|
191 | |
|
|
192 | for my $ki_member (@ketsueki_itsuryuu) { |
|
|
193 | $ki_member = (stat "$ki_member")[9]; |
|
|
194 | $ki_mtime = $ki_member if $ki_member > $ki_mtime; |
|
|
195 | } |
|
|
196 | |
|
|
197 | for my $ny_member (@nenshou_youso) { |
|
|
198 | $ny_member = (stat "$ny_member")[9]; |
|
|
199 | $ny_mtime = $ny_member if $ny_member > $ny_mtime; |
|
|
200 | } |
|
|
201 | |
|
|
202 | for my $zdr_member (@zaseki_dzuki_ryoku) { |
|
|
203 | $zdr_member = (stat "$zdr_member")[9]; |
|
|
204 | $zdr_mtime = $zdr_member if $zdr_member > $zdr_mtime; |
|
|
205 | } |
|
|
206 | |
|
|
207 | print "Guild: mtime:\n"; |
|
|
208 | print "black_shield: ".in_days($bs_mtime)."\n"; |
|
|
209 | print "damned_heretics: ".in_days($dh_mtime)."\n"; |
|
|
210 | print "dreaming_sage: ".in_days($ds_mtime)."\n"; |
|
|
211 | print "drunken_barbarian: ".in_days($db_mtime)."\n"; |
|
|
212 | print "laughing_skull: ".in_days($ls_mtime)."\n"; |
|
|
213 | print "mailed_fist: ".in_days($mf_mtime)."\n"; |
|
|
214 | print "poisoned_dagger: ".in_days($pd_mtime)."\n"; |
|
|
215 | print "purple_butterfly: ".in_days($pb_mtime)."\n"; |
|
|
216 | print "smoking_cauldron: ".in_days($sc_mtime)."\n"; |
|
|
217 | print "ketsueki_itsuryuu: ".in_days($ki_mtime)."\n"; |
|
|
218 | print "nenshou_youso: ".in_days($ny_mtime)."\n"; |
|
|
219 | print "zaseki_dzuki_ryoku: ".in_days($zdr_mtime)."\n"; |
|
|
220 | } |
102 | } |
221 | |
103 | |
222 | sub usage { |
104 | sub usage { |
223 | print <<USAGE; |
105 | print <<USAGE; |
224 | Usage: perl guilds.pl [max|avg] |
106 | Usage: perl guilds.pl [max|avg|cnt|lst <guild>] |
225 | |
107 | |
226 | max: max(mtime of all guild members) for each guild |
108 | max: max(mtime of all guild members) for each guild |
227 | avg: average mtime of all guild members for each guild |
109 | avg: average mtime of all guild members for each guild |
|
|
110 | cnt: member count (number of players owning a key) |
|
|
111 | lst: list members for <guild>. lst without <guild> lists all guild names |
228 | |
112 | |
229 | Copyright (C) 2006 The Crossfire+ Development Team |
113 | Copyright (C) 2006 The Crossfire+ Development Team |
230 | USAGE |
114 | USAGE |
231 | } |
115 | } |
232 | |
116 | |
233 | if ($ARGV[0] eq "max") { |
117 | if ($ARGV[0] eq "max") { |
234 | members_mtime_max; |
118 | members_mtime_max; |
235 | } elsif ($ARGV[0] eq "avg") { |
119 | } elsif ($ARGV[0] eq "avg") { |
236 | members_mtime_avg; |
120 | members_mtime_avg; |
|
|
121 | } elsif ($ARGV[0] eq "cnt") { |
|
|
122 | members_cnt; |
|
|
123 | } elsif ($ARGV[0] eq "lst") { |
|
|
124 | members_list $ARGV[1]; |
237 | } else { |
125 | } else { |
238 | usage; |
126 | usage; |
239 | } |
127 | } |