-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchifan.pl.in
116 lines (101 loc) · 3.37 KB
/
chifan.pl.in
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
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/env perl
use v5.20;
use utf8;
use warnings;
use feature 'signatures';
use open qw(:std :utf8);
use DateTime;
use Encode;
use Data::Dumper;
if (defined $ARGV[0] and $ARGV[0] eq '-h') {
print <<"EOF";
使用说明:
$0 -- 查询当前还有哪些食堂能吃饭
$0 还有什么吃的 -- 查询当前还有哪些食堂能吃饭
$0 <REGEX> -- 查询名字匹配 <REGEX> 的食堂什么时候开饭
$0 什么时候开饭 <REGEX> -- 查询名字匹配 <REGEX> 的食堂什么时候开饭
$0 -h -- 打印帮助手册
数据来自华中大微校园
EOF
exit;
}
my @data = map {
[
$_->{name},
[
map {
[
map {
my ($h, $m) = split /[::]/;
$h * 60 + $m
} $_->{begin}, $_->{end}
]
}
grep { defined $_ }
$_->{breakfast}, $_->{lunch}, $_->{dinner}
]
]
} @$data;
open STDOUT, "|column -t";
my ($sec, $min, $hour, @dontcare) = localtime(time);
@ARGV = map { Encode::decode_utf8($_) } @ARGV;
if (!defined $ARGV[0] or $ARGV[0] eq "还有什么吃的") {
my $stamp = $hour * 60 + $min;
my @available;
for my $entry (@data) {
for my $opening (@{$entry->[1]}) {
if ($opening->[0] <= $stamp && $stamp <= $opening->[1]) {
push @available, [ $entry->[0], $opening, $opening->[1] - $stamp ];
last;
}
}
}
@available = sort { $a->[2] <=> $b->[2] } @available;
if (int @available) {
for (@available) {
my ($res_h, $res_m) = (int($_->[2] / 60), $_->[2] % 60);
if ($res_h) {
say "$_->[0] 还可以吃${res_h}小时${res_m}分钟";
} else {
say "$_->[0] 还可以吃${res_m}分钟";
}
}
} else {
say "坏了,今天没有吃的了";
}
} else {
my $stamp = $hour * 60 + $min;
shift @ARGV if $ARGV[0] eq "什么时候开饭";
my $pattern = $ARGV[0] // "";
for my $entry (@data) {
next unless $entry->[0] =~ /$pattern/;
my ($start_time, $end_time) = undef;
for my $opening (@{$entry->[1]}) {
if ($opening->[0] <= $stamp && $stamp <= $opening->[1]) {
($start_time, $end_time) = @$opening;
} elsif ($opening->[0] > $stamp) {
$start_time //= $opening->[0];
$start_time = $opening->[0] if $start_time > $opening->[0];
}
}
if (!defined $start_time) {
say "$entry->[0] 今天已经没有饭了";
} elsif ($start_time < $stamp) {
my $res = $end_time - $stamp;
my ($res_h, $res_m) = (int($res / 60), $res % 60);
if ($res_h) {
say "$entry->[0] 已开饭 还可以吃${res_h}小时${res_m}分钟";
} else {
say "$entry->[0] 已开饭 还可以吃${res_m}分钟";
}
} else {
my $res = $start_time - $stamp;
my ($res_h, $res_m) = (int($res / 60), $res % 60);
if ($res_h) {
say "$entry->[0] 还有${res_h}小时${res_m}分钟开饭";
} else {
say "$entry->[0] 还有${res_m}分钟开饭";
}
}
}
}