unefede.pl 14 KB

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