pizza.pm 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. use POE;
  2. use Time::Local;
  3. my %timers = ();
  4. my $tick = sub {
  5. my ($ctx, $key, $data) = @_;
  6. BotIrc::send_wisdom($ctx, "your $data->{type} is ready, enjoy!");
  7. };
  8. my $parse_ts = sub {
  9. my $ts = shift;
  10. my $delta = 0;
  11. if ($ts =~ s/^\@(\d{1,2}):(\d\d)(?::(\d\d))?(?:\+|$)//) {
  12. my $hr = $1;
  13. my $min = $2;
  14. my $sec = $3 // 0;
  15. my ($cursec, $curmin, $curhr, $curday, $curmon, $curyr) = localtime(time);
  16. my $ts = timelocal($sec, $min, $hr, $curday, $curmon, $curyr);
  17. $delta = $ts - time();
  18. $delta += 86400 if $delta <= 0;
  19. }
  20. while ($ts =~ s/^(\d+)([dhms]?)[,;]?//i) {
  21. my $val = $1;
  22. my $unit = lc($2);
  23. my $multiplier = 60;
  24. $multiplier = 1 if $unit eq 's';
  25. $multiplier = 3600 if $unit eq 'h';
  26. $multiplier = 86400 if $unit eq 'd';
  27. $delta += $val * $multiplier;
  28. }
  29. return if $ts ne '';
  30. return $delta;
  31. };
  32. my $format_ts = sub {
  33. my $delta = shift;
  34. my @res;
  35. if ($delta >= 86400) {
  36. my $days = int($delta / 86400);
  37. push @res, "$days days";
  38. $delta %= 86400;
  39. }
  40. if ($delta >= 3600) {
  41. my $hours = int($delta / 3600);
  42. push @res, "$hours hours";
  43. $delta %= 3600;
  44. }
  45. if ($delta >= 60) {
  46. my $minutes = int($delta / 60);
  47. push @res, "$minutes minutes";
  48. $delta %= 60;
  49. }
  50. if ($delta > 0) {
  51. my $seconds = int($delta);
  52. push @res, "$seconds seconds";
  53. }
  54. join(', ', @res);
  55. };
  56. {
  57. irc_commands => {
  58. pizza => sub {
  59. my ($source, $targets, $args, $auth) = @_;
  60. BotIrc::check_ctx() or return;
  61. my ($ts, $desc) = split(/\s+/, $args, 2);
  62. my $nick = BotIrc::ctx_source();
  63. $desc //= 'pizza';
  64. $desc =~ s/^\s+|\s+$//g;
  65. my $delta = $parse_ts->($ts);
  66. if (!$delta) {
  67. BotIrc::send_noise("invalid alarm time: $ts");
  68. return;
  69. }
  70. if ($delta > (86400 * 7)) {
  71. BotIrc::send_noise("for timers this long you shouldn't be relying on a puny bot like me...");
  72. return;
  73. }
  74. my $timerid = "pizza:$nick:$desc";
  75. BotIrc::ctx_set_addressee($nick);
  76. BotIrc::set_timer($timerid, $delta, $tick, {type => $desc});
  77. my $readable = $format_ts->($delta);
  78. BotIrc::send_wisdom("I'll let you know when your $desc is done, in $readable.");
  79. },
  80. unpizza => sub {
  81. my ($source, $targets, $args, $auth) = @_;
  82. BotIrc::check_ctx() or return;
  83. my $desc = $args;
  84. my $nick = BotIrc::ctx_source();
  85. $desc = 'pizza' if $desc =~ /^\s*$/;
  86. $desc =~ s/^\s+|\s+$//g;
  87. my $timerid = "pizza:$nick:$desc";
  88. if (BotIrc::clear_timer($timerid)) {
  89. BotIrc::send_noise("'$desc' timer cleared.");
  90. } else {
  91. BotIrc::send_noise("No '$desc' timer was active for you.");
  92. }
  93. },
  94. },
  95. };