-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathl4d2_rank.pl
70 lines (54 loc) · 2.65 KB
/
l4d2_rank.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/perl
use strict;
use warnings;
# generates a simple page which displays and ranks l4d2 players' win percentages
# for now only works if player's steam profile is public (even if you're friends with them)
use CGI;
use LWP::Simple;
use Data::Dumper;
my $cgi = CGI->new;
print $cgi->header;
print $cgi->start_html('l4d2 score thingie');
# LIST_OF_ASSHOLES.JPG
my $player_names = $cgi->param('players') || 'Kidane, djnite, jizmakdagusha, catawompus, frostyends';
my @players = map { { 'name' => $_ } } split(',', $player_names);
# length of longest name for text formatting purposes later
my $longest = (sort {$a <=> $b} map { length($_->{'name'}) } @players)[-1];
foreach my $player (@players) {
# leading or trailing whitespace breaks the request
$player->{'name'} =~ s/^\s+//;
$player->{'name'} =~ s/\s+$//;
# requires player has set up their steam nickname, if they just have an ID the URL is different ;_;
my $content = get("http://steamcommunity.com/id/" . $player->{'name'} . "/stats/L4D2?tab=stats&subtab=versus");
# it's ok if these are undefined, will just show up as 0 / 0 (0%)
if ($content =~ m/<div id="winlosstxtleft">(\d+)% won \((\d+) games\)<\/div>(\d+)% lost \((\d+) games\)/) {
$player->{'won_percent'} = $1;
$player->{'won_total'} = $2;
$player->{'loss_total'} = $4;
}
}
#NOW WE'RE COOKING WITH FIRE
print "<pre>";
# sorted by won_percent (descending) using schwartzian transform
foreach my $player (map { $_->[1] } sort { $b->[0] <=> $a->[0] } map { [ $_->{'won_percent'}, $_ ] } @players) {
# pad list by spaces equal to length of longest player name
printf("%${longest}s: %d / %d games (%d%%)\n",
$player->{'name'}, $player->{'won_total'}, $player->{'loss_total'}, $player->{'won_percent'});
}
# sorry i'm really bad at html
print "</pre><br>";
print "<p>Players are ordered by win percentage. Don't be jelly.<br>";
print "Enter comma-separated list of player IDs below. Doesn't work if user's profile is private.";
print '<p><form action="http://minecraft.nickforsale.com/l4d2/index.pl" method=get>';
print "<input type=\"text\" name=\"players\" size=\"80\" value=\"" . join(',', map { $_->{'name'} } @players) . "\">";
print '<input type=submit value="gimme"';
print '</form>';
print '<form action="http://minecraft.nickforsale.com/l4d2/index.pl" method="link">';
print '<input type="submit" value="default">';
print '</form>';
print '<p>TODO: <br>- historical data (daily?)<br>';
print '- graphs and shit<br>';
print '- steam id => nickname mapping<br>';
print '- handle steam profile id in addition to username<br>';
print '- whatever, i ain\'t even mad<br>';
print $cgi->end_html;