unefede.pl 12 KB

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