unefede.pl 13 KB

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