unefede.pl 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. #!/usr/bin/perl
  2. # Copyright (c) 2014 Daniel Jakots <vigdis@chown.me>
  3. #
  4. # Permission to use, copy, modify, and distribute this software for any
  5. # purpose with or without fee is hereby granted, provided that the above
  6. # copyright notice and this permission notice appear in all copies.
  7. #
  8. # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. use warnings;
  16. use strict;
  17. package MyBot;
  18. use base qw( Bot::BasicBot );
  19. binmode STDOUT, ":utf8";
  20. use utf8;
  21. my $nb_adh = 0; # nombre d'adhérents
  22. my $nb_abo = 0; # nombre d'abonnés
  23. my $site = ""; # site web
  24. my $salon = ""; # salon irc/xmpp
  25. my $statut = 0; # étape de 1 à 8 du FAI
  26. my $date_crea = ""; # date de la création de l'asso
  27. my $date_jffdn = ""; # date de la rentrée dans la fédé
  28. my $contact = ""; # email de contact
  29. my $description = ""; # description de l'asso
  30. # le repectoire des données du bot aka autoconf
  31. my $bot_dir = `pwd`; chomp $bot_dir ; $bot_dir .= "/";
  32. my $wrk_dir = "wrk-dir/";
  33. my $dir = $bot_dir.$wrk_dir;
  34. # symbol auquel le bot répond
  35. my $symbol = "+";
  36. # dictionnaire contenant les regex permettants de trouver les FAI
  37. my %regex = (
  38. "apinnet" => "\\b(ap[in]|Poitou|Charente|Rochelle|(Deux[- ])?S[èe]vres?|Vienne|Angoul[eêè]me|Niort|Poitiers)",
  39. "aquilenet" => "\\b(aq(ui|n)|Bord(o|e?au)|Landes|Gironde)",
  40. "arn" => "\\b(a(lsace|rn)|Stras|Colma)",
  41. "auvernet" => "\\b(Auver|Puy[- ](de[- ])D[oô]me|avn)",
  42. "cafai" => "\\b(cafai|champagne|ardenn?e)",
  43. "faimaison" => "\\b(fma|fail?m|Nantes|Loire[- ]Atlantique)",
  44. "fdn" => "\\bf(rench|dn)",
  45. "franciliens" => "\\b(f(ranc|cn)|idf|Paris)",
  46. "grifon" => "\\b(grif|rennes|[îi]l?le[- ](et[- ])?vilaine)",
  47. "ilico" => "\\b(ilc|ill?[iy][ck])|(Corr?[éêèe][sz])",
  48. "illyse" => "\\b(ill?y|ill?i[sz]|lyon|rh[ôo]ne|loire|((st|saint)[- ]etienn?e))",
  49. "iloth" => "\\b(ilo|mont?pel|h[ée]rault)",
  50. "ldn" => "\\b(l(or|dn)|Nancy|Metz|Moselle|Meuse|Meurthe|Vosges)",
  51. "ndn" => "\\b(n(ice|dn)|Antibes|Cannes|Valbonne|Alpes[- ]Maritimes)",
  52. "netopi" => "\\b(netopi|Seine[- ](et[- ])?Marne)",
  53. "pclight" => "\\b(yonne|beon|cheny|pc[- ]?l)",
  54. "rezine" => "\\b(r[eé]z|Isère|Grenoble)",
  55. "rhizome" => "\\b(rh?[iy][sz]om|Oise|Compi[eéêè]gne)",
  56. "sames" => "\\bsam|(Pyrénées[- ]Atlantiques)",
  57. "sdn" => "\\b(s(all|dn)|Savoie|Haute[- ]Savoie)",
  58. "teleragno" => "\\b(mars|telerag|telegrano)",
  59. "tetaneutral" => "\\b(t(eta|tn|nn)|Toulouse|Comminges|(Haute[- ]Garon?ne))",
  60. "ail" => "\\bail/",
  61. "chaul" => "\\b(c(haul|hz)|hertz|tarn|autan)",
  62. "igwan" => "\\b(ig[wn]|sbg|saint[- ]barth)",
  63. "neutrinet" => "\\b(neutri|n[tre]n|belgique)",
  64. "ffdn" => "\\bf(ede|fdn|rance|édé)",
  65. );
  66. # Lis le fichier contenant les infos d'un FAI
  67. sub info {
  68. my $fai = shift @_;
  69. my $filename = $dir.$fai.".info";
  70. if (-e $filename)
  71. {
  72. my $fh;
  73. open ($fh, '<', $filename) or die "Impossible d'ouvrir le fichier $filename en lecture";
  74. while (my $line = <$fh>)
  75. {
  76. return $line;
  77. }
  78. close $fh;
  79. }
  80. else
  81. {
  82. return "pas d'information pour ". $fai ."\n";
  83. }
  84. }
  85. # Lis le fichier contenant les nombres adh/abo d'un FAI
  86. sub adh {
  87. my $fai = shift @_;
  88. my $filename = $dir.$fai.".adh";
  89. if (-e $filename)
  90. {
  91. my $fh;
  92. open ($fh, '<', $filename) or die "Impossible d'ouvrir le fichier $filename en lecture";
  93. while (my $line = <$fh>)
  94. {
  95. return $line;
  96. }
  97. close $fh;
  98. }
  99. else
  100. {
  101. return "pas d'information pour ". $fai ."\n";
  102. }
  103. }
  104. # lis le fichier et retourne le contenu
  105. sub lecture_fichier {
  106. my $fichier = shift @_;
  107. my $filename = $dir.$fichier;
  108. if (-e $filename)
  109. {
  110. my $fh;
  111. open ($fh, '<', $filename) or die "Impossible d'ouvrir le fichier $filename en lecture";
  112. while (my $line = <$fh>)
  113. {
  114. return $line;
  115. }
  116. close $fh;
  117. }
  118. else
  119. {
  120. return "pas d'information pour \n";
  121. }
  122. }
  123. # on compte le nombre d'adh et d'abo pour la fédé
  124. sub adh_abo_ffdn {
  125. my $filename = $dir."ffdn.adh";
  126. if (-e $filename)
  127. {
  128. my $fh;
  129. open ($fh, '<', $filename) or die "Impossible d'ouvrir le fichier $filename en lecture";
  130. while (my $line = <$fh>)
  131. {
  132. return $line;
  133. }
  134. close $fh;
  135. }
  136. else
  137. {
  138. return "pas d'information\n";
  139. }
  140. }
  141. ## Le bot lit le chan et réagit
  142. sub said {
  143. my ($self, $message) = @_;
  144. # si on veut des info
  145. if ($message->{body} =~ /^\Q$symbol\Einfo/) {
  146. shift @_;
  147. # Apinnet
  148. if($message->{body} =~ /$regex{"apinnet"}/i) {
  149. info("apinnet");
  150. }
  151. # Aquilenet
  152. elsif($message->{body} =~ /$regex{"aquilenet"}/i) {
  153. info("aquilenet");
  154. }
  155. # ARN
  156. elsif($message->{body} =~ /$regex{"arn"}/i) {
  157. info("arn");
  158. }
  159. # Auvernet
  160. elsif($message->{body} =~ /$regex{"auvernet"}/i) {
  161. info("auvernet");
  162. }
  163. # Cafai
  164. elsif($message->{body} =~ /$regex{"cafai"}/i) {
  165. info("cafai");
  166. }
  167. # faimaison
  168. elsif($message->{body} =~ /$regex{"faimaison"}/i) {
  169. info("faimaison");
  170. }
  171. # FDN
  172. elsif($message->{body} =~ /$regex{"fdn"}/i) {
  173. info("fdn");
  174. }
  175. # franciliens.net
  176. elsif($message->{body} =~ /$regex{"franciliens"}/i) {
  177. info("franciliens");
  178. }
  179. # grifon
  180. elsif($message->{body} =~ /$regex{"grifon"}/i) {
  181. info("grifon");
  182. }
  183. # ilico
  184. elsif($message->{body} =~ /$regex{"ilico"}/i) {
  185. info("ilico");
  186. }
  187. # illyse
  188. elsif($message->{body} =~ /$regex{"illyse"}/i) {
  189. info("illyse");
  190. }
  191. # iloth
  192. elsif($message->{body} =~ /$regex{"iloth"}/i) {
  193. info("iloth");
  194. }
  195. # ldn
  196. elsif($message->{body} =~ /$regex{"ldn"}/i) {
  197. info("ldn");
  198. }
  199. # ndn
  200. elsif($message->{body} =~ /$regex{"ndn"}/i) {
  201. info("ndn");
  202. }
  203. # netopi
  204. elsif($message->{body} =~ /$regex{"netopi"}/i) {
  205. info("netopi");
  206. }
  207. # pclight
  208. elsif($message->{body} =~ /$regex{"pclight"}/i) {
  209. info("pclight");
  210. }
  211. # rézine
  212. elsif($message->{body} =~ /$regex{"rezine"}/i) {
  213. info("rezine");
  214. }
  215. # rhizome
  216. elsif($message->{body} =~ /$regex{"rhizome"}/i) {
  217. info("rhizome");
  218. }
  219. # sames
  220. elsif($message->{body} =~ /$regex{"sames"}/i) {
  221. info("sames");
  222. }
  223. # sdn
  224. elsif($message->{body} =~ /$regex{"sdn"}/i) {
  225. info("sdn");
  226. }
  227. # teleragno
  228. elsif($message->{body} =~ /$regex{"teleragno"}/i) {
  229. info("teleragno");
  230. }
  231. # tetaneutral
  232. elsif($message->{body} =~ /$regex{"tetaneutral"}/i) {
  233. info("tetaneutral");
  234. }
  235. # ail-network
  236. elsif($message->{body} =~ /$regex{"ail"}/i) {
  237. info("ail-network");
  238. }
  239. # chaul'hertz
  240. elsif($message->{body} =~ /$regex{"chaul"}/i) {
  241. info("chaul-hertz");
  242. }
  243. # igwan
  244. elsif($message->{body} =~ /$regex{"igwan"}/i) {
  245. info("igwan");
  246. }
  247. # neutrinet
  248. elsif($message->{body} =~ /$regex{"neutrinet"}/i) {
  249. info("neutrinet");
  250. }
  251. elsif($message->{body} =~ /$regex{"ffdn"}/i) {
  252. 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.";
  253. }
  254. # Si le FAI n'est pas valide, on l'indique
  255. else {
  256. return "commande : ".$symbol."info <fai> ou ".$symbol."info <lieu geographique>";
  257. }
  258. }
  259. # si on veut le nombre d'adhérent
  260. elsif ($message->{body} =~ /^\Q$symbol\Eadh/) {
  261. shift @_;
  262. # Apinnet
  263. if($message->{body} =~ /$regex{"apinnet"}/i) {
  264. adh("apinnet");
  265. }
  266. # Aquilenet
  267. elsif($message->{body} =~ /$regex{"aquilenet"}/i) {
  268. adh("aquilenet");
  269. }
  270. # ARN
  271. elsif($message->{body} =~ /$regex{"arn"}/i) {
  272. adh("arn");
  273. }
  274. # Auvernet
  275. elsif($message->{body} =~ /$regex{"auvernet"}/i) {
  276. adh("auvernet");
  277. }
  278. # Cafai
  279. elsif($message->{body} =~ /$regex{"cafai"}/i) {
  280. adh("cafai");
  281. }
  282. # faimaison
  283. elsif($message->{body} =~ /$regex{"faimaison"}/i) {
  284. adh("faimaison");
  285. }
  286. # FDN
  287. elsif($message->{body} =~ /$regex{"fdn"}/i) {
  288. adh("fdn");
  289. }
  290. # franciliens.net
  291. elsif($message->{body} =~ /$regex{"franciliens"}/i) {
  292. adh("franciliens");
  293. }
  294. # grifon
  295. elsif($message->{body} =~ /$regex{"grifon"}/i) {
  296. adh("grifon");
  297. }
  298. # ilico
  299. elsif($message->{body} =~ /$regex{"ilico"}/i) {
  300. adh("ilico");
  301. }
  302. # illyse
  303. elsif($message->{body} =~ /$regex{"illyse"}/i) {
  304. adh("illyse");
  305. }
  306. # iloth
  307. elsif($message->{body} =~ /$regex{"iloth"}/i) {
  308. adh("iloth");
  309. }
  310. # ldn
  311. elsif($message->{body} =~ /$regex{"ldn"}/i) {
  312. adh("ldn");
  313. }
  314. # ndn
  315. elsif($message->{body} =~ /$regex{"ndn"}/i) {
  316. adh("ndn");
  317. }
  318. # netopi
  319. elsif($message->{body} =~ /$regex{"netopi"}/i) {
  320. adh("netopi");
  321. }
  322. # pclight
  323. elsif($message->{body} =~ /$regex{"pclight"}/i) {
  324. adh("pclight");
  325. }
  326. # rézine
  327. elsif($message->{body} =~ /$regex{"rezine"}/i) {
  328. adh("rezine");
  329. }
  330. # rhizome
  331. elsif($message->{body} =~ /$regex{"rhizome"}/i) {
  332. adh("rhizome");
  333. }
  334. # sames
  335. elsif($message->{body} =~ /$regex{"sames"}/i) {
  336. adh("sames");
  337. }
  338. # sdn
  339. elsif($message->{body} =~ /$regex{"sdn"}/i) {
  340. adh("sdn");
  341. }
  342. # teleragno
  343. elsif($message->{body} =~ /$regex{"teleragno"}/i) {
  344. adh("teleragno");
  345. }
  346. # tetaneutral
  347. elsif($message->{body} =~ /$regex{"tetaneutral"}/i) {
  348. adh("tetaneutral");
  349. }
  350. # ail-network
  351. elsif($message->{body} =~ /$regex{"ail"}/i) {
  352. adh("ail-network");
  353. }
  354. # chaul'hertz
  355. elsif($message->{body} =~ /$regex{"chaul"}/i) {
  356. adh("chaul-hertz");
  357. }
  358. # igwan
  359. elsif($message->{body} =~ /$regex{"igwan"}/i) {
  360. adh("igwan");
  361. }
  362. # neutrinet
  363. elsif($message->{body} =~ /$regex{"neutrinet"}/i) {
  364. adh("neutrinet");
  365. }
  366. elsif($message->{body} =~ /$regex{"ffdn"}/i) {
  367. 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.";
  368. }
  369. # Si le FAI n'est pas valide, on l'indique
  370. else {
  371. return "commande : ".$symbol."adh <fai> ou ".$symbol."adh <lieu geographique>";
  372. }
  373. }
  374. # si on veut de l'aide
  375. elsif ($message->{body} =~ /^\Q$symbol\Ehelp/) {
  376. return "commandes gérées : ".$symbol."info, ".$symbol."adh, ".$symbol."suivi, ".$symbol."vote, ".$symbol."source";
  377. }
  378. # les sources du bot
  379. elsif ($message->{body} =~ /^\Q$symbol\Esource/) {
  380. lecture_fichier("source");
  381. }
  382. # les infos par rapport aux réunions de suivies
  383. elsif ($message->{body} =~ /^\Q$symbol\Esuivi/) {
  384. lecture_fichier("suivi");
  385. }
  386. # les infos par rapport aux réunions de suivies
  387. elsif ($message->{body} =~ /^\Q$symbol\Evote/) {
  388. lecture_fichier("vote");
  389. }
  390. elsif ($message->{body} =~ /datafoin/) {
  391. my $de = int rand(5);
  392. if ($de==1) {
  393. return "il ne faut pas me donner à manger après minuit /o\\";
  394. }
  395. elsif($de==2){
  396. return "omnomnom";
  397. }
  398. elsif($de==3){
  399. return "mais je vais grossir /o\\";
  400. }
  401. elsif($de==4){
  402. return "vouiii";
  403. }
  404. elsif($de==5){
  405. return "datafoin <3";
  406. }
  407. }
  408. }
  409. # tout ce qu'on écrit dans /tmp/log apparait dans $channel
  410. my $channel = '#ffdn';
  411. sub connected {
  412. my $self = shift;
  413. $self->forkit({ channel => $channel,
  414. run => [ qw( /usr/bin/tail -f /tmp/log ) ],
  415. });
  416. }
  417. # aucune idée de comment on déclenche cette ligne
  418. sub help { "Je suis le bot de la fédé." }
  419. #Info de connexion du bot
  420. MyBot->new(
  421. server => 'irc.geeknode.org',
  422. channels => [ '#bottestbot', '#ffdn'],
  423. nick => 'UneFede',
  424. username => 'bot',
  425. name => 'Droide de la Federation FDN, run by Vigdis'
  426. )->run();