combine matches played by multiple members
[sc2-widget] / getsc2clan
index cc38e4d9c1da9f84bd0c8cda0122421b61018fb9..8c9fe9fd337a89793b7e65ac5631fb840d02bc26 100755 (executable)
@@ -18,6 +18,7 @@ $profiles && @{$profiles}
        or die "Usage: $0 <profile id>... [<clan name>...]\n";
 my ($clanmatch) = map { $_ && qr/\A(?:$_)\z/i } join '|', @{$clanmatches || []};
 
+my @realmget = (profile => 2 => 1); # common request path for european data
 sub blizget {
        state $bliz = do {
                my @authdata = do './.blizzard.passwd.pl' and not $@ || $!
@@ -40,7 +41,7 @@ sub blizget {
 
 # prefer deprecated interface to prevent costly ladder search
 my @ladderdata = map {
-       blizget(legacy => profile => 2 => 1 => $_ => 'ladders')
+       blizget(legacy => @realmget => $_ => 'ladders')
 } @{$profiles};
 
 # merge relevant ladder data of all users
@@ -66,6 +67,16 @@ my (@members, %memberidx);
 $memberidx{ $_->{id} } //= push(@members, $_) && $#members
        for map { $_->{characters}->@* } @ladders;
 
+my %game;
+for my $member (map { $_->{id} } @members) {
+       my $usergames = blizget(legacy => @realmget => $member => 'matches');
+       for ($usergames->{matches}->@*) {
+               my $match = join ':', sort values %{$_};
+               $game{$match} //= $_;
+               push $game{$match}->{players}->@*, $memberidx{$member};
+       }
+}
+
 say JSON->new->canonical->pretty->encode({
        name     => $members[0]->{clanName},
        tag      => $members[0]->{clanTag},
@@ -87,7 +98,8 @@ say JSON->new->canonical->pretty->encode({
                @ladders
        ],
        members  => [map {
-               blizget(metadata => profile => 2 => 1 => $_->{id})
+               blizget(metadata => @realmget => $_->{id})
                # lacks mmr, fav race (available in new api)
        } @members],
+       matches  => [nsort_by { -$_->{date} } values %game],
 }) =~ s/(?: \G \d,? | \[ ) \K \s+ (?=\d|\])/ /grx; # concat arrays of single digits