#!/usr/bin/perl # Copyright (c) 2014 Daniel Jakots # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use warnings; use strict; package MyBot; use base qw( Bot::BasicBot ); binmode STDOUT, ":utf8"; use utf8; my $nb_adh = 0; # nombre d'adhérents my $nb_abo = 0; # nombre d'abonnés my $site = ""; # site web my $salon = ""; # salon irc/xmpp my $statut = 0; # étape de 1 à 8 du FAI my $date_crea = ""; # date de la création de l'asso my $date_jffdn = ""; # date de la rentrée dans la fédé my $contact = ""; # email de contact my $description = ""; # description de l'asso # le repectoire des données du bot aka autoconf my $bot_dir = `pwd`; chomp $bot_dir ; $bot_dir .= "/"; my $wrk_dir = "wrk-dir/"; my $dir = $bot_dir.$wrk_dir; # dictionnaire contenant les regex permettants de trouver les FAI my %regex = ( "apinnet" => "\\b(ap[in]|Poitou|Charente|Rochelle|(Deux[- ])?S[èe]vres?|Vienne|Angoul[eêè]me|Niort|Poitiers)", "aquilenet" => "\\b(aq(ui|n)|Bord(o|e?au)|Landes|Gironde)", "arn" => "\\b(a(lsace|rn)|Stras|Colma)", "auvernet" => "\\b(Auver|Puy[- ](de[- ])D[oô]me|avn)", "cafai" => "\\b(cafai|champagne|ardenn?e)", "faimaison" => "\\b(fma|fail?m|Nantes|Loire[- ]Atlantique)", "fdn" => "\\bf(rench|dn)", "franciliens" => "\\b(f(ranc|cn)|idf|Paris)", "grifon" => "\\b(grif|rennes|[îi]l?le[- ](et[- ])?vilaine)", "ilico" => "\\b(ilc|ill?[iy][ck])|(Corr?[éêèe][sz])", "illyse" => "\\b(ill?y|ill?i[sz]|lyon|rh[ôo]ne|loire|((st|saint)[- ]etienn?e))", "iloth" => "\\b(ilo|mont?pel|h[ée]rault)", "ldn" => "\\b(l(or|dn)|Nancy|Metz|Moselle|Meuse|Meurthe|Vosges)", "ndn" => "\\b(n(ice|dn)|Antibes|Cannes|Valbonne|Alpes[- ]Maritimes)", "netopi" => "\\b(netopi|Seine[- ](et[- ])?Marne)", "pclight" => "\\b(yonne|beon|cheny|pc[- ]?l)", "rezine" => "\\b(r[eé]z|Isère|Grenoble)", "rhizome" => "\\b(rh?[iy][sz]om|Oise|Compi[eéêè]gne)", "sames" => "\\bsam|(Pyrénées[- ]Atlantiques)", "sdn" => "\\b(s(all|dn)|Savoie|Haute[- ]Savoie)", "teleragno" => "\\b(mars|telerag|telegrano)", "tetaneutral" => "\\b(t(eta|tn|nn)|Toulouse|Comminges|(Haute[- ]Garon?ne))", "ail" => "\\bail/", "chaul" => "\\b(c(haul|hz)|hertz|tarn|autan)", "igwan" => "\\b(ig[wn]|sbg|saint[- ]barth)", "neutrinet" => "\\b(neutri|n[tre]n|belgique)", "ffdn" => "\\bf(ede|fdn|rance|édé)", ); # Lis le fichier contenant les infos d'un FAI sub info { my $fai = shift @_; my $filename = $dir.$fai.".info"; if (-e $filename) { my $fh; open ($fh, '<', $filename) or die "Impossible d'ouvrir le fichier $filename en lecture"; while (my $line = <$fh>) { return $line; } close $fh; } else { return "pas d'information pour ". $fai ."\n"; } } # Lis le fichier contenant les nombres adh/abo d'un FAI sub adh { my $fai = shift @_; my $filename = $dir.$fai.".adh"; if (-e $filename) { my $fh; open ($fh, '<', $filename) or die "Impossible d'ouvrir le fichier $filename en lecture"; while (my $line = <$fh>) { return $line; } close $fh; } else { return "pas d'information pour ". $fai ."\n"; } } # lis le fichier et retourne le contenu sub lecture_fichier { my $fichier = shift @_; my $filename = $dir.$fichier; if (-e $filename) { my $fh; open ($fh, '<', $filename) or die "Impossible d'ouvrir le fichier $filename en lecture"; while (my $line = <$fh>) { return $line; } close $fh; } else { return "pas d'information pour \n"; } } # on compte le nombre d'adh et d'abo pour la fédé sub adh_abo_ffdn { my $filename = $dir."ffdn.adh"; if (-e $filename) { my $fh; open ($fh, '<', $filename) or die "Impossible d'ouvrir le fichier $filename en lecture"; while (my $line = <$fh>) { return $line; } close $fh; } else { return "pas d'information\n"; } } ## Le bot lit le chan et réagit sub said { my ($self, $message) = @_; # si on veut des info if ($message->{body} =~ /^\+info/) { shift @_; # Apinnet if($message->{body} =~ /$regex{"apinnet"}/i) { info("apinnet"); } # Aquilenet elsif($message->{body} =~ /$regex{"aquilenet"}/i) { info("aquilenet"); } # ARN elsif($message->{body} =~ /$regex{"arn"}/i) { info("arn"); } # Auvernet elsif($message->{body} =~ /$regex{"auvernet"}/i) { info("auvernet"); } # Cafai elsif($message->{body} =~ /$regex{"cafai"}/i) { info("cafai"); } # faimaison elsif($message->{body} =~ /$regex{"faimaison"}/i) { info("faimaison"); } # FDN elsif($message->{body} =~ /$regex{"fdn"}/i) { info("fdn"); } # franciliens.net elsif($message->{body} =~ /$regex{"franciliens"}/i) { info("franciliens"); } # grifon elsif($message->{body} =~ /$regex{"grifon"}/i) { info("grifon"); } # ilico elsif($message->{body} =~ /$regex{"ilico"}/i) { info("ilico"); } # illyse elsif($message->{body} =~ /$regex{"illyse"}/i) { info("illyse"); } # iloth elsif($message->{body} =~ /$regex{"iloth"}/i) { info("iloth"); } # ldn elsif($message->{body} =~ /$regex{"ldn"}/i) { info("ldn"); } # ndn elsif($message->{body} =~ /$regex{"ndn"}/i) { info("ndn"); } # netopi elsif($message->{body} =~ /$regex{"netopi"}/i) { info("netopi"); } # pclight elsif($message->{body} =~ /$regex{"pclight"}/i) { info("pclight"); } # rézine elsif($message->{body} =~ /$regex{"rezine"}/i) { info("rezine"); } # rhizome elsif($message->{body} =~ /$regex{"rhizome"}/i) { info("rhizome"); } # sames elsif($message->{body} =~ /$regex{"sames"}/i) { info("sames"); } # sdn elsif($message->{body} =~ /$regex{"sdn"}/i) { info("sdn"); } # teleragno elsif($message->{body} =~ /$regex{"teleragno"}/i) { info("teleragno"); } # tetaneutral elsif($message->{body} =~ /$regex{"tetaneutral"}/i) { info("tetaneutral"); } # ail-network elsif($message->{body} =~ /$regex{"ail"}/i) { info("ail-network"); } # chaul'hertz elsif($message->{body} =~ /$regex{"chaul"}/i) { info("chaul-hertz"); } # igwan elsif($message->{body} =~ /$regex{"igwan"}/i) { info("igwan"); } # neutrinet elsif($message->{body} =~ /$regex{"neutrinet"}/i) { info("neutrinet"); } elsif($message->{body} =~ /$regex{"ffdn"}/i) { return "La fédération FDN regroupe des Fournisseurs d'Accès à Internet associatifs se reconnaissant dans des valeurs communes : bénévolat, solidarité, fonctionnement démocratique et à but non lucratif; défense et promotion de la neutralité du Net."; } # Si le FAI n'est pas valide, on l'indique else { return "commande : +info ou +info "; } } # si on veut le nombre d'adhérent elsif ($message->{body} =~ /^\+adh/) { shift @_; # Apinnet if($message->{body} =~ /$regex{"apinnet"}/i) { adh("apinnet"); } # Aquilenet elsif($message->{body} =~ /$regex{"aquilenet"}/i) { adh("aquilenet"); } # ARN elsif($message->{body} =~ /$regex{"arn"}/i) { adh("arn"); } # Auvernet elsif($message->{body} =~ /$regex{"auvernet"}/i) { adh("auvernet"); } # Cafai elsif($message->{body} =~ /$regex{"cafai"}/i) { adh("cafai"); } # faimaison elsif($message->{body} =~ /$regex{"faimaison"}/i) { adh("faimaison"); } # FDN elsif($message->{body} =~ /$regex{"fdn"}/i) { adh("fdn"); } # franciliens.net elsif($message->{body} =~ /$regex{"franciliens"}/i) { adh("franciliens"); } # grifon elsif($message->{body} =~ /$regex{"grifon"}/i) { adh("grifon"); } # ilico elsif($message->{body} =~ /$regex{"ilico"}/i) { adh("ilico"); } # illyse elsif($message->{body} =~ /$regex{"illyse"}/i) { adh("illyse"); } # iloth elsif($message->{body} =~ /$regex{"iloth"}/i) { adh("iloth"); } # ldn elsif($message->{body} =~ /$regex{"ldn"}/i) { adh("ldn"); } # ndn elsif($message->{body} =~ /$regex{"ndn"}/i) { adh("ndn"); } # netopi elsif($message->{body} =~ /$regex{"netopi"}/i) { adh("netopi"); } # pclight elsif($message->{body} =~ /$regex{"pclight"}/i) { adh("pclight"); } # rézine elsif($message->{body} =~ /$regex{"rezine"}/i) { adh("rezine"); } # rhizome elsif($message->{body} =~ /$regex{"rhizome"}/i) { adh("rhizome"); } # sames elsif($message->{body} =~ /$regex{"sames"}/i) { adh("sames"); } # sdn elsif($message->{body} =~ /$regex{"sdn"}/i) { adh("sdn"); } # teleragno elsif($message->{body} =~ /$regex{"teleragno"}/i) { adh("teleragno"); } # tetaneutral elsif($message->{body} =~ /$regex{"tetaneutral"}/i) { adh("tetaneutral"); } # ail-network elsif($message->{body} =~ /$regex{"ail"}/i) { adh("ail-network"); } # chaul'hertz elsif($message->{body} =~ /$regex{"chaul"}/i) { adh("chaul-hertz"); } # igwan elsif($message->{body} =~ /$regex{"igwan"}/i) { adh("igwan"); } # neutrinet elsif($message->{body} =~ /$regex{"neutrinet"}/i) { adh("neutrinet"); } elsif($message->{body} =~ /$regex{"ffdn"}/i) { return "La fédération FDN regroupe des Fournisseurs d'Accès à Internet associatifs se reconnaissant dans des valeurs communes : bénévolat, solidarité, fonctionnement démocratique et à but non lucratif; défense et promotion de la neutralité du Net."; } # Si le FAI n'est pas valide, on l'indique else { return "commande : +adh ou +adh "; } } # si on veut de l'aide elsif ($message->{body} =~ /^\+help/) { return "commandes gérées : +info, +adh, +suivi, +vote, +source"; } # les sources du bot elsif ($message->{body} =~ /^\+source/) { lecture_fichier("source"); } # les infos par rapport aux réunions de suivies elsif ($message->{body} =~ /^\+suivi/) { lecture_fichier("suivi"); } # les infos par rapport aux réunions de suivies elsif ($message->{body} =~ /^\+vote/) { lecture_fichier("vote"); } elsif ($message->{body} =~ /datafoin/) { my $de = int rand(5); if ($de==1) { return "il ne faut pas me donner à manger après minuit /o\\"; } elsif($de==2){ return "omnomnom"; } elsif($de==3){ return "mais je vais grossir /o\\"; } elsif($de==4){ return "vouiii"; } elsif($de==5){ return "datafoin <3"; } } } # tout ce qu'on écrit dans /tmp/log apparait dans $channel my $channel = '#ffdn'; sub connected { my $self = shift; $self->forkit({ channel => $channel, run => [ qw( /usr/bin/tail -f /tmp/log ) ], }); } # aucune idée de comment on déclenche cette ligne sub help { "Je suis le bot de la fédé." } #Info de connexion du bot MyBot->new( server => 'irc.geeknode.org', channels => [ '#bottestbot', '#ffdn'], nick => 'UneFede', username => 'bot', name => 'Droide de la Federation FDN, run by Vigdis' )->run();