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
103
|
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Path::Tiny;
use IPC::Run3;
my $fortune_dir = "$ENV{HOME}/fortunes";
my %fortunes = (
# mst quotes.
mst => "http://www.trout.me.uk/quotes.txt",
# All these are from rindolf's website.
sholmif => "https://www.shlomifish.org/humour/fortunes/shlomif",
"shlomif-fav"
=> "https://www.shlomifish.org/humour/fortunes/shlomif-fav",
"shlomif-factoids"
=> "https://www.shlomifish.org/humour/fortunes/shlomif-factoids",
"sholmif-email-sig"
=> "https://raw.githubusercontent.com/shlomif/shlomif-email-signature/master/shlomif-sig-quotes.txt",
# Quotes from the Joel on Software site.
# (http://www.joelonsoftware.com/)
"joel-on-software"
=> "https://www.shlomifish.org/humour/fortunes/joel-on-software",
# Quotes from the essays and writings of Paul Graham.
# (http://www.paulgraham.com/)
"paul-graham"
=> "https://www.shlomifish.org/humour/fortunes/paul-graham",
# “The Rules of Open-Source Programming”.
osp_rules => "https://www.shlomifish.org/humour/fortunes/osp_rules",
# Excerpts from the online Subversion folklore.
# (http://subversion.tigris.org/)
"subversion"
=> "https://www.shlomifish.org/humour/fortunes/subversion",
# A collection of conversations from Freenode’s #perl .
"sharp-perl"
=> "https://www.shlomifish.org/humour/fortunes/sharp-perl",
# A collection of conversations from Freenode’s ##programming .
"sharp-programming"
=> "https://www.shlomifish.org/humour/fortunes/sharp-programming",
# katspace quotes (ref: rindolf's website).
"katspace_sayings"
=> "http://katspace.com/fandom/quotes/sayings",
"katspace_more-sayings"
=> "http://katspace.com/fandom/quotes/kaijen",
"katspace_books"
=> "http://katspace.com/fandom/quotes/book",
"katspace_quotes"
=> "http://katspace.com/fandom/quotes/quotes",
);
if ( $ARGV[0] ) {
if ($fortunes{ $ARGV[0] }) {
my $fortune_file = "$fortune_dir/$ARGV[0]";
random($fortune_file); }
elsif ( $ARGV[0] eq "latest") { get_latest(); }
elsif ( $ARGV[0] eq "mirror") { get_mirror(); }
elsif ( $ARGV[0] eq "ls") { run3[ "ls", $fortune_dir] }
} elsif ( scalar @ARGV == 0 ) {
say "Usage: lyra <fortune>";
} else {
say "lyra: no such fortune";
}
sub random {
my $fortune_file = shift @_;
my $file = path($fortune_file)->absolute;
my @fortunes = split/\n%\n/, $file->slurp;
say $fortunes[ rand @fortunes ]; # Print random fortune.
}
sub get_latest {
foreach my $fortune (sort keys %fortunes) {
ftp("$fortune_dir/$fortune", $fortunes{$fortune});
}
}
sub get_mirror {
require HTTP::Simple;
# Ignore a warning, next line would've printed a warning.
no warnings 'once';
$HTTP::Simple::UA->verify_SSL(1);
foreach my $fortune (sort keys %fortunes) {
say "$fortune $fortunes{$fortune}";
my $status =
HTTP::Simple::getstore($fortunes{$fortune},
"$fortune_dir/$fortune");
warn "[WARN] Failed to fetch latest fortune\n"
unless HTTP::Simple::is_success($status);
}
}
sub ftp { run3 ["ftp", "-mvo", @_]; }
|