aboutsummaryrefslogtreecommitdiff
path: root/script/find-the-winner
blob: 4a6c6f39f10b9051c6326213faf6ba813e077897 (plain)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package PerlWeeklyChallenge;

use Moo;
use MooX::Options;

option 'members' => (is => 'ro', order => 1, format => 's', required => 1, doc => 'Team members file (JSON)');
option 'source'  => (is => 'ro', order => 2, format => 's', required => 1, doc => 'Weekly contributions folder');
option 'verbose' => (is => 'ro', order => 3, doc => 'Be more descriptive');

has 'member_names' => (is => 'rw');
has 'files'        => (is => 'rw');

use JSON;
use Data::Dumper;
use List::Util qw(shuffle);
use File::Find qw(finddepth);

sub run {
    my ($self) = @_;

    my $source  = $self->source;
    my $members = $self->members;

    $self->{member_names} = read_data($members);
    $self->{files}        = fetch_files($source);

    print sprintf("Congratulation %s.\n", $self->find_the_winner);
}

#
#
# PRIVATE METHODS

sub find_the_winner {
    my ($self) = @_;

    my $members = $self->{member_names};
    my $files   = $self->{files};
    my $contributions = [];
    foreach my $file (@$files) {
        $file =~ s/(.*?\/)?(challenge\-\d\d\d.*)/$2/;
        if (   ($file =~ /ch\-\d\.p[l6]$/)
            || ($file =~ /ch\-\d\.sh$/)
            || ($file =~ /blog\d?\.txt/)) {

            $file =~ /(challenge-\d\d\d)\/(.*?)\//;
            # Skip Mohammad Anwar from the pot.
            next if ($2 eq "mohammad-anwar");
            push @$contributions, $2;
        }
    }

    my $winner_pot = [ shuffle @$contributions ];
    print Dumper($winner_pot) if $self->verbose;
    return $self->{member_names}->{ $winner_pot->[ rand @$winner_pot ] };
}

sub fetch_files {
    my ($source) = @_;

    my @files;
    finddepth(
        sub {
            return if($_ eq '.' || $_ eq '..');
            push @files, $File::Find::name;
        },
        $source
    );

    return \@files;
}

sub read_data {
    my ($filename) = shift;

    my $json_text = do {
        open(my $json_fh, "<:encoding(UTF-8)", $filename)
            or die("Can't open \$filename\": $!\n");
        local $/;
        <$json_fh>
    };

    return JSON->new->allow_nonref->utf8(1)->decode($json_text);
}

#
#
# MAIN PROGRAM

package main;

PerlWeeklyChallenge->new_with_options->run;

END {
    my $time = time - $^T;
    my $mm   = $time / 60;
    my $ss   = $time % 60;
    my $hh   = $mm / 60;
    $mm = $mm % 60;

    print sprintf("The program ran for %02d:%02d:%02d.\n", $hh, $mm, $ss);
}