unefede.pl 12 KB

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