unefede.pl 13 KB

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