use warnings; use strict; my $username = `id -un`; chomp $username; $username eq 'dicebot' or die "Running as the wrong user ($username, should be dicebot)"; print "To: agora-business\@agoranomic.org\n"; print "Subject: Mad Engineer weekly random rule selection\n\n"; my $flr = `curl --range 0-10000 https://agoranomic.org/ruleset/flr-fresh.txt`; $flr =~ /-----\n(.*?)\n-----/s or die "Cannot parse table of contents"; my $toc = $1; $flr =~ /^Number of rules currently enacted: (\d+)$/m or die "Cannot parse rule count"; my $rulecount = $1; my @rulelist = $toc =~ /^ [*] Rule.*$/mg; my $rulesfound = scalar @rulelist; die "Rule count mismatch" unless $rulesfound == $rulecount; die "This script functions only with at most 256 rules" unless $rulecount <= 256; my @rulenumbers; my %rulenumbers_seen; my %rulenames; for my $rule (@rulelist) { $rule =~ /^ [*] Rule\s+(\d+):\s*(.*)/ or die "Cannot parse rule '$rule'"; my $rulenumber = $1; $rulenumber == 2602 and next; # was repealed, but still in online FLR $rulenames{$rulenumber} = $2; push @rulenumbers, $rulenumber; exists $rulenumbers_seen{$rulenumber} and die "Duplicate rule number $rulenumber"; $rulenumbers_seen{$rulenumber} = 1; } @rulenumbers = sort {$a <=> $b} @rulenumbers; print "This is an automated selection of a random rule from Agora's ruleset, as part of the Mad Engineer's weekly duties.\n"; print "Randomizing from $rulecount rules.\n\n"; print "Assignment of dice rolls to rules:\n"; print "$_:R" . $rulenumbers[$_-1] . "; " for 1..$#rulenumbers; print scalar(@rulenumbers) . ":R" . $rulenumbers[$#rulenumbers] . ".\n\n"; open my $system_rng, "<", "/dev/random" or die "Could not open system RNG"; my $roll; while (1) { my $read_into = ""; sysread($system_rng, $read_into, 1) == 1 or die "Could not read from system RNG"; # Rolls from system RNG are in the 0..255 range. # Add 1 to move it to the range 1..256. $roll = 1 + ord $read_into; # If the roll is in the range 1 to $rulecount inclusive, then we've # found a rule. Otherwise, roll again. $roll <= $rulecount and last; } print "The dice roll was: $roll\n"; my $rulenumber = $rulenumbers[$roll-1]; print "This is R$rulenumber, ", $rulenames{$rulenumber}, ".\n\n"; print "-- \n"; print "ruleroller.pl v0.1. For source code,\n"; print "see \n"; print "and .\n";