fdnbot.pl 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #!/usr/bin/perl
  2. package Bot;
  3. use Mail::Sendmail;
  4. use MIME::Base64;
  5. use MIME::Words qw(encode_mimewords);
  6. use base qw(Bot::BasicBot);
  7. use warnings;
  8. use strict;
  9. use utf8;
  10. if(@ARGV && ! -w "$ARGV[0]" || !@ARGV) {
  11. if(@ARGV) {
  12. print "ERREUR: $ARGV[0] est inexistant ou non-inscriptible.\n";
  13. } else {
  14. print "USAGE: $0 fichier-a-ecrire\n";
  15. }
  16. exit 1;
  17. }
  18. my $nick = "fdnAlertBot";
  19. my $server = "irc.geeknode.org";
  20. my $chan = "#fdn";
  21. my $flag = "[ALERT]";
  22. my $url = "https://fdn.ldn-fai.net";
  23. my $git = "git clone https://code.ffdn.org/ldn/puppet.git";
  24. my $subscribe = "https://listes.ldn-fai.net/cgi-bin/mailman/listinfo/fdn";
  25. my $mail_support = 'support@fdn.fr';
  26. my $mail_liste = 'fdn@listes.ldn-fai.net';
  27. my $mail_from = 'fdnAlertBot <fdnAlertBot@ldn-fai.net>';
  28. my $mail_subject = "[ALERTE FDN]";
  29. my $isacc = 0;
  30. my $file = $ARGV[0];
  31. my $bot;
  32. sub said {
  33. my $self = shift;
  34. my $message = shift;
  35. return undef unless $message->{"address"};
  36. if($message->{"address"} eq $nick || $message->{"address"} eq "msg") {
  37. if($message->{"body"} =~ m/\br(?:e|é)ponse\b/i) {
  38. $self->reply($message, "42.");
  39. } elsif($message->{"body"} =~ m/\b(?:drapeau|flag|tag)\b/i) {
  40. $self->reply($message, $flag);
  41. } elsif($message->{"body"} =~ m/\b(?:url|adresse)\b/i) {
  42. $self->reply($message, $url);
  43. } elsif($message->{"body"} =~ m/\b(?:git|svn|source)\b/i) {
  44. $self->reply($message, $git);
  45. } elsif($message->{"body"} =~ m/\bliste\b/i) {
  46. $self->reply($message, "$mail_liste ($subscribe)");
  47. } elsif($message->{"body"} =~ m/\bmerci\b/i) {
  48. $self->reply($message, "De rien.");
  49. } else {
  50. $self->reply($message, "Pour signaler un problème, ajouter $flag à la suite "
  51. ."du /topic, suivi d'un court descriptif. Ce dernier sera reporté sur "
  52. ."<$url>, qui sera mis à jour chaque fois qu'il changera. Retirer $flag "
  53. ."du /topic vide la page, ce qui signale la fin du problème.");
  54. }
  55. }
  56. }
  57. sub topic {
  58. my $self = shift;
  59. my $args = shift;
  60. my %mail = (
  61. From => $mail_from,
  62. To => $mail_liste,
  63. Cc => $mail_support
  64. );
  65. if($args->{"topic"}) {
  66. if($args->{"topic"} =~ /\Q$flag\E\s*(.+)$/i) {
  67. my $msg = $1;
  68. $mail{"Message"} = $msg;
  69. utf8::decode($msg);
  70. open(OUT, ">$file");
  71. binmode(OUT, ":utf8");
  72. print OUT "$msg";
  73. close(OUT);
  74. if($isacc) {
  75. $mail{"Subject"} = "$mail_subject Mise à jour de l'intitulé du problème";
  76. $bot->emote(
  77. channel => $chan,
  78. body => "a bien actualisé le problème sur $url (et prévenu le support + $mail_liste)"
  79. );
  80. } else {
  81. $isacc = 1;
  82. $mail{"Subject"} = "$mail_subject Nouveau problème déclaré";
  83. $bot->emote(
  84. channel => $chan,
  85. body => "a bien reporté le problème sur $url (et prévenu le support + $mail_liste)"
  86. );
  87. }
  88. sendemail(\%mail) or die $Mail::Sendmail::error;
  89. } elsif($isacc) {
  90. $isacc = 0;
  91. $mail{"Subject"} = "$mail_subject Problème résolu";
  92. $mail{"Message"} = "Fin de l'alerte.";
  93. open(OUT, ">$file");
  94. print OUT "";
  95. close(OUT);
  96. $bot->emote(
  97. channel => $chan,
  98. body => "a bien pris en compte la fin du problème sur $url (et prévenu le support + $mail_liste)"
  99. );
  100. sendemail(\%mail) or die $Mail::Sendmail::error;
  101. }
  102. }
  103. }
  104. sub sendemail {
  105. my $mail = shift;
  106. my %mail = %{$mail};
  107. utf8::encode($mail{"Subject"});
  108. $mail{"Subject"} = encode_mimewords($mail{"Subject"}, Charset => "utf-8", Encoding => "Q");
  109. $mail{"Message"} = encode_base64($mail{"Message"});
  110. $mail{"Content-Type"} = 'text/plain; charset="utf-8"';
  111. $mail{"Content-Transfer-Encoding"} = "base64";
  112. sendmail(%mail) or die $Mail::Sendmail::error;
  113. }
  114. $bot = Bot->new(
  115. server => $server,
  116. port => "6667",
  117. channels => [$chan],
  118. nick => $nick,
  119. alt_nicks => ["${nick}_"],
  120. username => $nick,
  121. name => $url
  122. );
  123. $bot->run();
  124. exit 0;