Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
580
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 42.73 KB | None | 0 0
  1. ##############################################################################
  2. #
  3. # Oracle
  4. # v2.31 (14/09/2017) ©2009-2017 MenzAgitat
  5. #
  6. # IRC: irc.epiknet.org #boulets / #eggdrop
  7. #
  8. # Mes scripts sont téléchargeables sur http://www.eggdrop.fr
  9. # Retrouvez aussi toute l'actualité de mes releases sur
  10. # http://wiki.eggdrop.fr/Utilisateur:MenzAgitat
  11. #
  12. ##############################################################################
  13.  
  14. #
  15. # Description
  16. #
  17. # Posez votre question à l'oracle, il vous répondra.
  18. # Il détecte plusieurs types de question différents et donne des réponses
  19. # appropriées (la plupart du temps) choisies parmi un total de 615 réponses
  20. # réparties dans 16 catégories.
  21. #
  22. # Si la question a déjà été posée, la réponse restera la même.
  23. #
  24. # Oracle utilise un algorithme phonétique nommé HaploPhone afin de détecter des
  25. # questions identiques même si l'orthographe et la ponctuation varient.
  26. # Oracle utilise également l'algorithme du Rapport de Relation Différentielle
  27. # afin de tolérer des variations et de reconnaître deux questions très
  28. # légèrement différentes ou formulées différemment, comme étant une seule
  29. # et même question.
  30. #
  31. # Les scripts HaploPhone (HaploPhone.tcl) et Related Differential Report
  32. # (RDR.tcl) sont requis par Oracle pour fonctionner.
  33. # Assurez-vous que vous possédez bien ces deux scripts et que vous les avez
  34. # ajoutés dans le fichier eggdrop.conf AVANT Oracle.tcl :
  35. # source scripts/HaploPhone.tcl
  36. # source scripts/RDR.tcl
  37. # source scripts/Oracle.tcl
  38. #
  39. # Si vous ajoutez de nouvelles réponses, assurez-vous de les placer dans la
  40. # bonne catégorie et de les formuler de la bonne façon (inspirez-vous des
  41. # réponses existantes), sans quoi l'oracle aura l'air d'être à côté de ses
  42. # pompes.
  43. #
  44. ###############################################################################
  45.  
  46. #
  47. # Syntaxe
  48. #
  49. # Pour activer l'Oracle sur un chan, vous devez taper ceci en partyline :
  50. # .chanset #NomDuChan +oracle
  51. # et ceci pour le désactiver :
  52. # .chanset #NomDuChan -oracle
  53. #
  54. # Poser une question à l'oracle :
  55. # !oracle <question>
  56. #
  57. # La commande !oracle_db_size permet au propriétaire de l'Eggdrop de compter et
  58. # d'afficher le nombre de réponses dans la base de données.
  59. #
  60. ###############################################################################
  61.  
  62. #
  63. # Changelog
  64. #
  65. # 1.0
  66. # - 1ère version
  67. # 2.0
  68. # - Le code a été en grande partie réécrit, ce qui induit la correction de
  69. # certains bugs potentiels, plus d'évolutivité, plus de rapidité.
  70. # - Utiliser le script tout seul sur un chan ne provoque plus d'erreur.
  71. # (merci à panfleto pour l'avoir découvert et à Artix pour la solution
  72. # élégante)
  73. # - La détection du type de question est maintenant plus fiable et tolère une
  74. # orthographe approximative ainsi que de nombreuses variantes.
  75. # - Ajout d'un grand nombre de nouvelles réponses.
  76. # - Ajout de plusieurs nouveaux types de réponses.
  77. # - Ajout de la commande !oracle_db_size qui permet de compter et d'afficher
  78. # le nombre de réponses dans la base de données (owner seulement).
  79. # - L'activation/désactivation du script sur chaque chan se fait maintenant
  80. # au moyen de la commande .chanset #NomDuChan [+/-]oracle (à taper en
  81. # partyline)
  82. # - Passage sous licence Creative Commons.
  83. # 2.1
  84. # - Correction du type de questions "que...." comme dans "que fais-tu ?"
  85. # - Ajout d'une nouvelle réponse (pour un nouveau total de 563).
  86. # - Amélioration de la détection des packages.
  87. # - Quelques optimisations mineures du code.
  88. # 2.2
  89. # - Amélioration de la détection du type de question : désormais, moins de
  90. # questions devraient retourner une réponse neutre.
  91. # - Le nombre de réponses directes oui/non a été légèrement augmenté.
  92. # - Le script requiert maintenant le package MenzAgitat's Soundex v2.1
  93. # - En raison de la mise à jour du soundex, les caractères non-alphabétiques
  94. # n'influent plus sur la phonétique et la détection de questions déjà posées
  95. # s'en trouve améliorée.
  96. # - Ajout de 47 nouvelles réponses (pour un nouveau total de 610).
  97. # 2.3
  98. # - Correction : les question du type "Qu'est" étaient parfois mal détectées.
  99. # - Modification : Le package Related Differential Report v1.1 est désormais
  100. # requis : l'Oracle utilise maintenant le Rapport de Relation Différentielle
  101. # plutôt que la Distance de Levenshtein pour détecter des questions
  102. # similaires mais écrites ou formulées différemment. (script du même auteur
  103. # à télécharger séparément).
  104. # - Modification : le package Levenshtein n'est désormais plus requis.
  105. # - Modification : Le package HaploPhone v3.0 est désormais requis : l'Oracle
  106. # utilise maintenant HaploPhone, qui est une version améliorée de l'ancien
  107. # package MenzAgitats_Soundex.
  108. # - Modification : Le package MenzAgitats_Soundex n'est désormais plus requis.
  109. # - Modification : Afin de diminuer la consommation de mémoire, les réponses
  110. # aux questions déjà posées ne seront plus stockées littéralement, mais sous
  111. # la forme type/index.
  112. # - Modification : si une question mémorisée ressemble à une question posée de
  113. # type différent, elle ne sera désormais plus considérée comme identique.
  114. # - Ajout de 5 nouvelles réponses (pour un nouveau total de 615).
  115. # - Nombreuses optimisations du code.
  116. # 2.31
  117. # - Correction : le script indiquait un problème de version lors du chargement
  118. # sur un Eggdrop v1.8.x
  119. # - Correction : utiliser la variable $question dans une réponse provoquait
  120. # une erreur.
  121. #
  122. ###############################################################################
  123.  
  124. #
  125. # LICENCE:
  126. # Cette création est mise à disposition selon le Contrat
  127. # Attribution-NonCommercial-ShareAlike 3.0 Unported disponible en ligne
  128. # http://creativecommons.org/licenses/by-nc-sa/3.0/ ou par courrier postal à
  129. # Creative Commons, 171 Second Street, Suite 300, San Francisco, California
  130. # 94105, USA.
  131. # Vous pouvez également consulter la version française ici :
  132. # http://creativecommons.org/licenses/by-nc-sa/3.0/deed.fr
  133. #
  134. ###############################################################################
  135.  
  136. if { [::tcl::info::commands ::Oracle::uninstall] eq "::Oracle::uninstall" } { ::Oracle::uninstall }
  137. # Note pour les programmeurs :
  138. # Dans la version 1.6.19 d'Eggdrop, le numéro de version affiché par .vbottree
  139. # et [numversion] est incorrect; il affiche 1061800 ou 1061801, ce qui
  140. # correspond à la version 1.6.18. On utilise donc une autre technique pour
  141. # vérifier le numéro de version.
  142. if { [package vcompare [regexp -inline {^[[:digit:]\.]+} $::version] 1.6.20] == -1 } { putloglev o * "\00304\[Oracle - erreur\]\003 La version de votre Eggdrop est\00304 ${::version}\003; Oracle ne fonctionnera correctement que sur les Eggdrops version 1.6.20 ou supérieure." ; return }
  143. if { [catch { package require Tcl 8.5 }] } { putloglev o * "\00304\[Oracle - Erreur\]\003 Oracle nécessite que Tcl 8.5 (ou plus) soit installé pour fonctionner. Votre version actuelle de Tcl est \00304${::tcl_version}\003." ; return }
  144. if { [catch { package require HaploPhone 3.0 }] } {
  145. putloglev o * "\00304\[Oracle - Erreur\]\003 Oracle nécessite que le script HaploPhone v3.0 (ou supérieur) soit chargé pour fonctionner."
  146. return
  147. }
  148. if { [catch { package require Related_Differential_Report 1.2 }] } {
  149. putloglev o * "\00304\[Oracle - Erreur\]\003 Oracle nécessite que le script Related Differential Report v1.1 (ou supérieur) soit chargé pour fonctionner."
  150. return
  151. }
  152. namespace eval ::Oracle {
  153.  
  154.  
  155.  
  156. ############################################################################
  157. ### Configuration
  158. ############################################################################
  159.  
  160. # Commande utilisée pour questionner l'oracle
  161. variable oracle_cmd "!oracle"
  162.  
  163. # Autorisations pour la commande
  164. variable oracleauth "-|-"
  165.  
  166. # Activer le contrôle de flood ? (0 = désactivé / 1 = activé)
  167. variable antiflood 1
  168.  
  169. # Seuil de déclenchement de l'antiflood.
  170. # Exemple : "6:60" = 6 requêtes maximum en 60 secondes.
  171. variable flood_threshold "6:60"
  172.  
  173. # Intervalle de temps minimum (en secondes) entre l'affichage de 2 messages
  174. # avertissant que l'antiflood a été déclenché (ne réglez pas cette valeur
  175. # trop bas afin de ne pas être floodé par les messages d'avertissement de
  176. # l'antiflood...)
  177. variable antiflood_msg_interval 30
  178.  
  179. # Filtrer les codes de styles (couleurs, gras, ...) dans l'affichage des
  180. # messages du script ? (0 = non / 1 = oui)
  181. # Remarque : le filtrage s'active automatiquement si le mode +c est mis sur
  182. # le chan.
  183. variable monochrome 0
  184.  
  185. # Pourcentage de chances de retourner une réponse neutre (neutral_response)
  186. variable neutral_rate 10
  187.  
  188. # Tolérance maximum pour le rapport de relation différentielle (ne touchez pas
  189. # à cette valeur sans savoir ce que vous faites)
  190. variable RDR_tolerance 20
  191.  
  192. # Nombre maximum de questions mémorisées par l'Eggdrop (si une question
  193. # mémorisée est posée plusieurs fois par la même personne, elle donnera
  194. # toujours la même réponse).
  195. # Afin de ne pas encombrer excessivement la mémoire, on stocke au maximum
  196. # $max_memory associations nick/question->réponse.
  197. variable max_memory 50
  198.  
  199. # Types de réponse activés, à l'exeption des types "yesno" et "notaquestion"
  200. # L'ordre est important et détermine la priorité.
  201. # Ne touchez pas à cette variable à moins de savoir ce que vous faites.
  202. variable enabledTypes {howmuchtime howmany howis howare howgoodis howgoodare howto withwhat howshould when why who where neutral}
  203.  
  204. # Expressions régulières utilisées pour la détection du type de la question.
  205. # N'y touchez pas si vous n'êtes pas familier avec ça.
  206. array set ::Oracle::regexpTypes {
  207. howmuchtime {(^|[^[:alpha:]]+)(co[mn]bien|cb(ien)?)\s+de\s+temps?[^[:alpha:]]}
  208. howmany {(^|[^[:alpha:]]+)co[mn]bien|cb(ien)?[^[:alpha:]]}
  209. howis {(^|[^[:alpha:]]+)((com+[ea]nt?\s+([eé](st|[st])(ait?)?|suis?|sera(i[ts]?)?))|(([eé](st|[st])(ait?)?|suis?|sera(i[ts]?)?)\s+com+[ea]nt?))[^[:alpha:]]}
  210. howare {(^|[^[:alpha:]]+)((com+[ea]nt?\s+(s(er)?ont|seraient|[ée]taient))|((s(er)?ont?|seraient|[ée]taient)\s+com+[ea]nt?))[^[:alpha:]]}
  211. howgoodis {(^|[^[:alpha:]]+)com+[ea]nt?\s+va[ts]?[^[:alpha:]]}
  212. howgoodare {(^|[^[:alpha:]]+)com+[ea]nt?\s+vont?[^[:alpha:]]}
  213. howto {com+[ea]nt?\s+([êe]tre?|f(ai|e|è)r+e?|pour+(a|e|io|on)[[:alpha:]]|peut?|puis?j?e?|doi[st]?|on)[^[:alpha:]]}
  214. withwhat {(^|[^[:alpha:]]+)(par|ave[ck])\s+(qu?|k)oi[^[:alpha:]]}
  215. howshould {(^|[^[:alpha:]]+)(com+[ea]nt?|de\s+(qu?|k)el+e?s?\s+(fa([çc]|s+)on|mani[èe]r+e?))[^[:alpha:]]}
  216. when {(^|[^[:alpha:]]+)(qu?|k)and?[^[:alpha:]]}
  217. why {(^|[^[:alpha:]]+)(pour(\s+)?(qu?|k)oi|pk(oi)?)[^[:alpha:]]}
  218. who {(^|(^([aà]|[eé](st|[st])(ait?)?|avec|par|pour|sur|sous|de|en)[^[:alpha:]])|([^[:alpha:]](est?|[eé]t(ai[st]?|é)?|avec|par|pour|sur|sous|de|en)[^[:alpha:]]))(qu?|k)i[^[:alpha:]]}
  219. where {((^|[^[:alpha:]]+)(où|(qu?|k)el+e?s?\s+([ea]ndroit?|coin|lieu|place|zon+e)|(dans?|vers?)\s+(qu?|k)el+e?)|^ou)[^[:alpha:]]}
  220. neutral {(^|[^[:alpha:]]+)((qu?|k)[e'](l+e?s?)?\s+([eé](st|[st])(ait?)?|s(er)?(ont?|a(i[ts]?|ient)?))|^(qu?|k)e|(qu?|k)el+e?s?|qu'est?(-?ce)?|(qu?|k)es(qu?|k)e?|(qu?|k)oi)[^[:alpha:]]}
  221. }
  222. # Pour ceux qui ne savent pas lire les expressions régulières, voici en clair
  223. # la liste des modèles pris en charge classés par type.
  224. # Remarque : cette liste n'est pas exhaustive car elle ne comprend pas les
  225. # variantes orthographiques que permet l'utilisation des expressions
  226. # régulières.
  227. # TYPE MODELE DE QUESTION
  228. # howmuchtime combien de temps
  229. # howmany combien
  230. # howis comment est/était/suis/sera/serait | est/était/suis/sera/serait comment
  231. # howare comment sont/seront/seraient/étaient | sont/seront/seraient/étaient comment
  232. # howgoodis comment va
  233. # howgoodare comment vont
  234. # howto comment être/faire/pourrais/pourrions/pourrons/peut/puis/doit/on
  235. # withwhat par/avec quoi
  236. # howshould comment | de quelle façon/manière
  237. # when quand
  238. # why pourquoi
  239. # who à/est/était/avec/par/pour/sur/sous/de/en qui
  240. # where où | quel endroit/coin/lieu/place/zone | dans/vers quel
  241. # neutral quel est/était/sera/serait/sont/seront | qu'est-ce | quoi
  242.  
  243.  
  244. ### BIBLIOTHEQUE DE REPONSES
  245.  
  246. # Vous pouvez utiliser des variables dans les réponses, elles seront
  247. # substituées par leur valeur au moment de l'affichage. Exemples :
  248. # $nick = nick de la personne qui a posé la question
  249. # $chan = chan sur lequel la question a été posée
  250. # $question = la question qui a été posée
  251. # $randnick = nick d'une personne choisie aléatoirement sur le chan
  252. # (ne peut pas être le nom de l'Eggdrop ni le nick de
  253. # la personne qui a posé la question)
  254. # Vous pouvez aussi utiliser des couleurs (selon la syntaxe habituelle),
  255. # du gras, du soulignement, ...
  256.  
  257. # Réponses si la question n'en est pas une
  258. set ::Oracle::replyTypes(notaquestion) {
  259. {si tu le dis...}
  260. {ok, c'est noté}
  261. {très intéressant, mais tu n'avais pas une question à poser ?}
  262. {ok, mais tu n'avais pas une question ?}
  263. {c'est bien, mais tu n'avais pas une question à poser ?}
  264. {c'est cool, mais tu n'avais pas une question à poser ?}
  265. {tant mieux, mais tu n'avais pas une question à poser ?}
  266. {chouette alors}
  267. {quelle bonne nouvelle !}
  268. {waw, c'est super intéressant ce que tu nous racontes là}
  269. {c'est fou}
  270. {waw ! mais tu n'avais pas une question à poser ?}
  271. {mon boulot est de répondre aux questions, pas d'écouter tes certitudes}
  272. {et la question est ... ?}
  273. {et à part ça, t'avais pas une question à me poser ?}
  274. {rappelle-moi quelle était la question déjà ?}
  275. {c'est pas moi qui te dirai le contraire}
  276. {c'est une affirmation ?}
  277. {c'est une question ça ?}
  278. {mais où est la question ?}
  279. {où est la question dans tout ça ?}
  280. {super, raconte-moi ta vie...}
  281. {c'est comme tu le sens}
  282. {ça ressemble à une affirmation}
  283. {tu sembles bien sûr de toi}
  284. {tu es sûr ?}
  285. {ah bon ?}
  286. }
  287. # Réponses aux questions de type "combien de temps"
  288. set ::Oracle::replyTypes(howmuchtime) {
  289. {quelques secondes}
  290. {quelques secondes, tout au plus}
  291. {une minute}
  292. {quelques minutes}
  293. {3 minutes}
  294. {5 minutes}
  295. {10 minutes}
  296. {une dizaine de minutes}
  297. {20 minutes}
  298. {1 heure}
  299. {quelques heures}
  300. {5 heures}
  301. {10 heures}
  302. {une journée entière}
  303. {2 jours}
  304. {2 ou 3 jours}
  305. {quelques jours}
  306. {une semaine}
  307. {2 semaines}
  308. {2 ou 3 semaines}
  309. {quelques semaines}
  310. {un mois}
  311. {2 mois}
  312. {2 ou 3 mois}
  313. {quelques mois}
  314. {6 mois}
  315. {1 an}
  316. {2 ans}
  317. {5 ans}
  318. {10 ans}
  319. {50 ans}
  320. {un siècle}
  321. {un million d'années}
  322. {quelques millions d'années à 10mn près}
  323. {ça dépend de toi}
  324. }
  325. # Réponses aux questions de type "combien"
  326. set ::Oracle::replyTypes(howmany) {
  327. {aucun}
  328. {pas un seul}
  329. {un seul}
  330. {juste un}
  331. {environ 2 ou 3}
  332. {7 ou 8}
  333. {une bonne dizaine}
  334. {je dirais 10 au moins}
  335. {13 à mon avis}
  336. {pas plus de 15}
  337. {environ 20}
  338. {à peu près 25}
  339. {presque 30}
  340. {une quarantaine}
  341. {42}
  342. {pas loin de 50}
  343. {une bonne centaine à vue de nez}
  344. {plus de 1000 !}
  345. {des tonnes}
  346. {une quantité non négligeable}
  347. {beaucoup}
  348. {peu}
  349. {très peu}
  350. {une quantité négligeable}
  351. {un chouia}
  352. {énormément}
  353. {pas beaucoup}
  354. {un certain nombre}
  355. {quelques uns}
  356. {un bon paquet}
  357. }
  358. # Réponses aux questions de type "comment est"
  359. set ::Oracle::replyTypes(howis) {
  360. {très joli}
  361. {de la bonne taille}
  362. {adorable}
  363. {cuit à point}
  364. {vert à pois jaunes}
  365. {grand avec une moustache}
  366. {petit et trappu}
  367. {trop court}
  368. {trop long}
  369. {énorme}
  370. {minuscule}
  371. {tout bleu}
  372. {étrange}
  373. {mémorable}
  374. {magnifique}
  375. {superbe}
  376. {horrible}
  377. {imprononçable}
  378. {peu recommandable}
  379. {trop petit}
  380. {trop gros}
  381. {pas assez gros}
  382. {pas assez long}
  383. {pas assez petit}
  384. {velu}
  385. {poilu}
  386. {malodorant}
  387. {mignon}
  388. {exquis}
  389. {ridicule}
  390. {rigolo}
  391. {intéressant}
  392. {inintéressant}
  393. {effrayant}
  394. {rassurant}
  395. }
  396. # # Réponses aux questions de type "comment sont"
  397. set ::Oracle::replyTypes(howare) {
  398. {très jolis}
  399. {de la bonne taille}
  400. {adorables}
  401. {cuits à point}
  402. {verts à pois jaunes}
  403. {grands avec une moustache}
  404. {petits et trappus}
  405. {trop courts}
  406. {trop longs}
  407. {énormes}
  408. {minuscules}
  409. {tout bleus}
  410. {étranges}
  411. {mémorables}
  412. {magnifiques}
  413. {superbes}
  414. {horribles}
  415. {imprononçables}
  416. {peu recommandables}
  417. {trop petits}
  418. {trop gros}
  419. {pas assez gros}
  420. {pas assez longs}
  421. {pas assez petits}
  422. {velus}
  423. {poilus}
  424. {malodorants}
  425. {mignons}
  426. {exquis}
  427. {ridicules}
  428. {rigolos}
  429. {intéressants}
  430. {inintéressants}
  431. {effrayants}
  432. {rassurants}
  433. }
  434. # Réponses aux questions de type "comment va"
  435. set ::Oracle::replyTypes(howgoodis) {
  436. {très bien}
  437. {pas trop bien}
  438. {je ne sais pas}
  439. {aucune idée}
  440. {ne demande pas}
  441. {demande-lui}
  442. {bien}
  443. {mal}
  444. {couci-couça}
  445. {demande à $randnick}
  446. }
  447. # Réponses aux questions de type "comment vont"
  448. set ::Oracle::replyTypes(howgoodare) {
  449. {très bien}
  450. {pas trop bien}
  451. {je ne sais pas}
  452. {aucune idée}
  453. {ne demande pas}
  454. {demande-leur}
  455. {bien}
  456. {mal}
  457. {couci-couça}
  458. {demande à $randnick}
  459. }
  460. # Réponses aux questions de type "comment faire"
  461. set ::Oracle::replyTypes(howto) {
  462. {en y passant plus de temps}
  463. {en changeant de main de temps en temps}
  464. {en travaillant dur}
  465. {en demandant de l'aide à un ami}
  466. {en y mettant les doigts}
  467. {avec les doigts}
  468. {en te sortant les doigts du nez}
  469. {en arrêtant de croire qu'un bot détient la vérité}
  470. {en mangeant des quenelles}
  471. {en arrêtant d'être un boulet}
  472. {en y pensant très fort}
  473. {en y croyant très fort}
  474. {en chatouillant $randnick}
  475. {en demandant à $randnick}
  476. {en sautillant sur place}
  477. {en se roulant par terre}
  478. {en n'y allant pas par quatre chemins}
  479. {en prenant un air décidé}
  480. {en prenant beaucoup de précautions}
  481. {en prenant son temps}
  482. {tout seul}
  483. {aussi rapidement que possible}
  484. {lentement et consciencieusement}
  485. {en utilisant un trombone et un chewing-gum}
  486. {avec beaucoup de courage}
  487. {à mains nues}
  488. {en appelant des renforts}
  489. {librement, sans se poser de questions}
  490. {avec l'aide de $randnick}
  491. {avec beaucoup d'enthousiasme}
  492. {sans beaucoup de conviction}
  493. {en évitant les obstacles}
  494. {avec l'aide d'un super-héros}
  495. {en se tapant la tête contre un mur}
  496. {en s'organisant}
  497. {en arrêtant de faire n'importe quoi}
  498. {en se munissant d'une boîte à outils}
  499. {en utilisant assez d'explosif pour raser tout le quartier}
  500. {en utilisant de la colle extra-forte}
  501. {avec l'aide d'un truc en mousse}
  502. {en faisant de ton mieux}
  503. {en y allant doucement}
  504. {avec les outils adaptés}
  505. {en allumant un cierge}
  506. {en criant et en tapant du pied}
  507. }
  508. # Réponses aux questions de type "avec quoi"
  509. set ::Oracle::replyTypes(withwhat) {
  510. {un pot de cornichons}
  511. {une petite cuiller}
  512. {un caillou}
  513. {une péniche}
  514. {une crotte de bantha}
  515. {un tuyau percé}
  516. {de la crème pour les pieds}
  517. {du viagra}
  518. {du talc}
  519. {de la vaseline}
  520. {une fourchette}
  521. {un démonte-pneu}
  522. {une grue de chantier}
  523. {une pelle à neige}
  524. {des bretelles}
  525. {une roue de vélo}
  526. {du cirage noir}
  527. {un chausse-pied}
  528. {une batte de baseball}
  529. {un tournevis}
  530. {un couteau}
  531. {du fard à paupières}
  532. {de la sauce pimentée}
  533. {un moule à gauffres}
  534. {une tartine beurrée}
  535. {un balai à chiottes}
  536. {un air innocent}
  537. {une pelleteuse}
  538. {un parachute}
  539. {les doigts}
  540. {une pince à épiler}
  541. {un objet inconnu}
  542. {une chaussette}
  543. {de bonnes intentions}
  544. {de l'humour}
  545. {une boîte à outils}
  546. {assez d'explosif pour raser tout le quartier}
  547. {de la colle extra-forte}
  548. {un truc en mousse}
  549. {une déclaration d'amour}
  550. {une bonne dose d'humour}
  551. {du papier recyclé}
  552. {un pied de biche}
  553. }
  554. # Réponses aux questions de type "comment"
  555. set ::Oracle::replyTypes(howshould) {
  556. {en mettant tous tes doigts dans ton nez en même temps}
  557. {en prenant beaucoup de précautions}
  558. {en prenant ton temps}
  559. {en évitant les obstacles}
  560. {tout seul}
  561. {un ouvre-boîte}
  562. {un taille-crayon}
  563. {aussi rapidement que possible}
  564. {lentement et consciencieusement}
  565. {avec un ami}
  566. {avec quelqu'un que tu aimes bien}
  567. {ne le fais pas, c'est mieux}
  568. {fais-le simplement}
  569. {pas tout seul}
  570. {avec de l'aide}
  571. {en utilisant un trombone et un chewing-gum}
  572. {en y pensant très fort}
  573. {avec beaucoup de courage}
  574. {sans beaucoup de conviction}
  575. {à mains nues}
  576. {je ne sais pas comment faire ça}
  577. {en appelant des renforts}
  578. {avec l'aide de tes parents}
  579. {librement, sans te poser de questions}
  580. {avec l'aide de $randnick}
  581. {avec un solide sens de l'humour}
  582. {avec beaucoup d'enthousiasme}
  583. {en tapant tout ce qui bouge}
  584. {en prenant un marteau plus gros}
  585. {avec de la délicatesse}
  586. {vite et bien}
  587. {avec des gants}
  588. {avec du tact}
  589. {avec de la subtilité}
  590. }
  591. # Réponses aux questions de type "quand"
  592. set ::Oracle::replyTypes(when) {
  593. {ça s'est déjà produit dans le passé, tu n'avais qu'à être là}
  594. {tu l'as manqué, c'était il y a 1 heure}
  595. {maintenant ! ah trop tard}
  596. {pourquoi pas maintenant ?}
  597. {maintenant}
  598. {aujourd'hui}
  599. {dans 1 minute}
  600. {dans 3 minutes}
  601. {dans 5 minutes}
  602. {dans 5mn, si $randnick ne nous retarde pas...}
  603. {dans 10 minutes}
  604. {dans 15 minutes}
  605. {dans 20 minutes}
  606. {dans 30 minutes}
  607. {dans une heure}
  608. {dans moins de 2 heures}
  609. {dans 2 heures}
  610. {cette nuit}
  611. {demain}
  612. {demain matin à 6h}
  613. {demain après-midi}
  614. {dans 2 jours}
  615. {dans 3 jours}
  616. {dans 4 jours}
  617. {dans 5 jours}
  618. {dans 6 jours}
  619. {dans 1 semaine}
  620. {la semaine prochaine}
  621. {le mois prochain}
  622. {dans 2 mois}
  623. {dans 3 mois}
  624. {dans 6 mois}
  625. {dans 1 an}
  626. {dans le courant de l'année prochaine}
  627. {dans 2 ans}
  628. {dans 3 ans}
  629. {dans 5 ans}
  630. {dans 10 ans}
  631. {dans 20 ans}
  632. {dans 50 ans}
  633. {dans quelques années}
  634. {dans 1 siècle}
  635. {dans 1000 ans}
  636. {dans 1 million d'années}
  637. {dans quelques millions d'années à 10mn près}
  638. {en janvier}
  639. {en février}
  640. {en mars}
  641. {en avril}
  642. {en mai}
  643. {en juin}
  644. {en juillet}
  645. {en août}
  646. {en septembre}
  647. {en octobre}
  648. {en novembre}
  649. {en décembre}
  650. {cet été}
  651. {cet hiver}
  652. {au printemps}
  653. {en automne}
  654. {trois jours avant la 2ème pleine lune après ton prochain anniversaire}
  655. {le jour de ton anniversaire}
  656. {dès qu'il se mettra à pleuvoir}
  657. {dès qu'il se mettra à neiger}
  658. {quand les poules auront des dents}
  659. {à la saint Glinglin}
  660. {après le déluge}
  661. {à la prochaine pleine lune}
  662. {ça n'arrivera pas à moins que tu ne quittes dès maintenant ton écran pour agir}
  663. {jamais}
  664. {jamais}
  665. {jamais}
  666. {jamais}
  667. {jamais}
  668. }
  669. # Réponses aux questions de type "pourquoi"
  670. set ::Oracle::replyTypes(why) {
  671. {pourquoi pas ?}
  672. {parce que c'est comme ça et puis c'est tout}
  673. {parce que c'est comme ça}
  674. {pour te donner l'air intelligent}
  675. {pour te ridiculiser}
  676. {parce que c'est beaucoup plus marrant comme ça}
  677. {parce qu'on lui a demandé de le faire}
  678. {pour te faire parler}
  679. {parce que tu le vaux bien}
  680. {parce que t'es un boulet}
  681. {parce que t'es un marrant}
  682. {parce que t'es un winner}
  683. {parce que sinon, ça ne serait pas drôle}
  684. {parce que :)}
  685. {parce que $randnick l'a dit}
  686. {parce que $randnick l'a prédit}
  687. {parce que $randnick a insisté pour ça}
  688. {à l'origine, c'était pour faire plaisir à $randnick}
  689. {parce que Nostradamus l'a prédit}
  690. {parce que le monde est injuste}
  691. {parce que c'est ainsi que vont les choses}
  692. {pour te faire plaisir}
  693. {pour t'emmerder}
  694. {pour te faire taper "!oracle $question"}
  695. {parce que l'équilibre de l'univers en dépend}
  696. {parce que t'as pas de chance}
  697. {parce que le hasard en a décidé ainsi}
  698. {je t'en pose des questions ?}
  699. }
  700. # Réponses aux questions de type "qui"
  701. set ::Oracle::replyTypes(who) {
  702. {quelqu'un de bien}
  703. {quelqu'un qui pose moins de questions que toi}
  704. {un mutant avec des tentacules}
  705. {un homme déguisé en femme}
  706. {le plus gros boulet connu}
  707. {un illustre inconnu}
  708. {ta soeur}
  709. {un malade mental}
  710. {$randnick}
  711. {$randnick}
  712. {$randnick}
  713. {ton père}
  714. {ta mère}
  715. {un pote de ta soeur}
  716. {une amie de ta mère}
  717. {un voisin}
  718. {un ami qui te veut du bien}
  719. {ton meilleur ami}
  720. {Dédé le Cochon}
  721. {un fuyard recherché par la police}
  722. {un emmerdeur de première}
  723. {quelqu'un qui ne veut pas être reconnu}
  724. {un animal de compagnie}
  725. {un psychopathe}
  726. {personne d'autre que toi}
  727. {toi-même}
  728. {toi}
  729. {moi}
  730. {c'est pas moi}
  731. }
  732. # Réponses aux questions de type "où"
  733. set ::Oracle::replyTypes(where) {
  734. {dans la forêt}
  735. {dans la cuisine}
  736. {dans un lit}
  737. {dans ton lit}
  738. {sous le lit}
  739. {dehors}
  740. {à l'intérieur}
  741. {en Italie}
  742. {au Vénézuela}
  743. {en Suisse}
  744. {en Australie}
  745. {près de ton meilleur ami}
  746. {près de ton pire ennemi}
  747. {chez toi}
  748. {sur ton lieu de travail}
  749. {dans le placard}
  750. {dans la rue}
  751. {dans la cave}
  752. {dans une voiture}
  753. {sur le tapis}
  754. {sous le tapis}
  755. {accroché au mur}
  756. {dans un couloir}
  757. {devant ton ordinateur}
  758. {sur une chaise}
  759. {dans le réfrigérateur}
  760. {attaché à un monument}
  761. {dans la maison d'un ami}
  762. {dans la main de quelqu'un que tu aimes bien}
  763. {au fond de l'océan}
  764. {à DisneyLand}
  765. {au McDo}
  766. {dans les toilettes}
  767. {dans une baignoire}
  768. {dans l'herbe d'un pré}
  769. {derrière des portes fermées}
  770. {dans la 4ème dimension}
  771. {à côté de toi}
  772. {sur la lune}
  773. {quelque part dans la galaxie}
  774. {quelque part où tu ne peux pas le voir}
  775. {par là -->}
  776. {ici}
  777. {tu as regardé sur www.perdu.com ?}
  778. {sur ce chan}
  779. {chez $randnick}
  780. {dans le frigo de $randnick}
  781. {sur les genoux de $randnick}
  782. {sur une autre planète}
  783. {DTC}
  784. {DTC}
  785. {DTC}
  786. {DTC}
  787. }
  788. # Réponses neutres. Attention à ce que vous mettez dans cette catégorie, ça
  789. # doit être le plus neutre possible afin de convenir à tous les types de
  790. # questions.
  791. set ::Oracle::replyTypes(neutral) {
  792. {oh regarde là bas ! une diversion !}
  793. {ne parlons pas des choses qui fâchent}
  794. {mieux vaut changer de sujet}
  795. {la réponse est : 42}
  796. {il faudrait être vraiment dérangé pour répondre à ça}
  797. {c'est une question que tu devrais te poser à toi-même}
  798. {je ne sais pas}
  799. {si tu savais...}
  800. {tu as de ces questions...}
  801. {*Joker*}
  802. {je ne peux pas avoir réponse à tout}
  803. {demande à quelqu'un d'autre}
  804. {tu n'as pas besoin de le savoir}
  805. {TUUUT TUUUT TUUUT TUUUT}
  806. {il y a des questions qu'il vaut mieux ne pas poser}
  807. {je ne sais pas \00313*rougit*\003}
  808. {...}
  809. {je ne répondrai pas à ça}
  810. {il y a des choses qu'il vaut mieux ne pas savoir}
  811. {c'est quoi ces questions ? \037oO\037'}
  812. {on t'a payé pour m'emmerder ?}
  813. {va savoir...}
  814. {je pourrais te répondre mais après cela je serais obligé de te tuer}
  815. {comment suis-je sensé savoir ça ? je suis une fonction aléatoire dans un bot, tu sais ?}
  816. {tu es trop intelligent pour demander ça}
  817. {donne moi de l'argent et je verrai ce que je peux faire}
  818. {plus de données sont requises pour répondre précisément à cette question}
  819. {merci de reformuler votre question}
  820. {erreur de syntaxe}
  821. {Cette fonction sonne occupé. Merci de réessayer dans quelques minutes...}
  822. {désolé, je n'écoutais pas}
  823. {il est totalement impossible de répondre objectivement à cette question}
  824. {je ferais mieux de ne pas te répondre maintenant}
  825. {et toi tu en penses quoi ?}
  826. {oublie ça}
  827. {qui s'en soucie ?}
  828. {on s'en fout}
  829. {osef}
  830. {je m'en fous un peu en fait}
  831. {question stupide, au suivant}
  832. {crois-moi, tu ne veux pas vraiment le savoir}
  833. {tu n'aimerais pas connaître la réponse}
  834. {la réponse ne va pas te plaire}
  835. {demande donc à $randnick}
  836. {$randnick pourrait t'en parler...}
  837. {je suis vraiment obligé de répondre à toutes les questions idiotes ?}
  838. {tu connais déjà la réponse}
  839. }
  840. # Réponses de type oui/non
  841. set ::Oracle::replyTypes(yesno) {
  842. {oui}
  843. {oui}
  844. {oui}
  845. {oui}
  846. {oui}
  847. {oui}
  848. {oui}
  849. {oui}
  850. {non}
  851. {non}
  852. {non}
  853. {non}
  854. {non}
  855. {non}
  856. {non}
  857. {non}
  858. {pas forcément}
  859. {peut-être dans un futur proche}
  860. {peut-être}
  861. {je ne parierais pas là dessus}
  862. {oui, absolument}
  863. {pas nécessairement}
  864. {oh que oui !}
  865. {oui, peut-être}
  866. {ça se pourrait}
  867. {les rumeurs disent que oui}
  868. {évidemment pas, cesse de poser des questions stupides}
  869. {oui : 78 | non : 93 | votes blancs : 4 | abstention : 15}
  870. {ça va pas non ?}
  871. {bien sûr}
  872. {il y a des chances}
  873. {il y a peu de chances}
  874. {ne dis pas n'importe quoi}
  875. {sois-en sûr}
  876. {pas du tout}
  877. {t'as qu'à compter là dessus}
  878. {très certainement, oui}
  879. {absolument pas}
  880. {évidemment, quelle question !}
  881. {qui t'a raconté ça ?!}
  882. {ouais et y'a ptet des pingouins sur Mars aussi...}
  883. {oui mais non}
  884. {c'est possible en effet}
  885. {la probabilité est de 1/9702831101}
  886. {bien sûr, ça a même été prédit par l'Institut des Risques Majeurs}
  887. {ben oui, tu es bien le seul à en douter encore}
  888. {et pas qu'un peu !}
  889. {non, pas du tout... ah... on me dit que si dans mon oreillette...}
  890. {si je te dis que non, tu vas pas aller te suicider ou un autre truc dingue ?}
  891. {ah non pas du tout}
  892. {si ça te fait plaisir d'y croire, alors oui}
  893. {ouais}
  894. {seulement si tu y crois très fort}
  895. {mmh je dirais que oui}
  896. {désolé, rien n'est moins sûr}
  897. {La réponse m'apparaît un peu floue mais on dirait que c'est oui}
  898. {La réponse est non seulement si Saturne est alignée avec Pluton et Neptune}
  899. {nop :(}
  900. {yep :)}
  901. {il semblerait que non mais c'est peut-être un bug}
  902. {si mes sources sont fiables, oui}
  903. {c'est certain}
  904. {j'en doute}
  905. {tel que je le vois, ma réponse est oui}
  906. {ouais, et moi je suis le Pape}
  907. {c'est ridicule !}
  908. {tu aimerais, hein ?}
  909. {ouep ^^}
  910. {sûr !}
  911. {j'espère que tu plaisantes...}
  912. {même pas en rêve}
  913. {seulement dans ton imagination}
  914. {on dirait bien que oui}
  915. {je crois que oui}
  916. {grave !}
  917. {bah, c'est n'importe quoi}
  918. {c'est incroyable le nombre de rumeurs qui peuvent circuler sur ce chan...}
  919. {$randnick ne pourra pas dire le contraire}
  920. {ou pas}
  921. }
  922.  
  923. ############################################################################
  924. ### Fin de la configuration
  925. ############################################################################
  926.  
  927.  
  928.  
  929.  
  930. ##############################################################################
  931. ### initialisation
  932. ##############################################################################
  933. variable scriptname "Oracle"
  934. variable version "2.31.20170914"
  935. variable DEBUGMODE 0
  936. setudef flag oracle
  937. scan $flood_threshold "%d:%d" ::Oracle::antiflood_max_instances ::Oracle::antiflood_instance_length
  938. array set ::Oracle::instance {}
  939. array set ::Oracle::antiflood_msg {}
  940. array set ::Oracle::phonetics_table {}
  941. # Procédure de désinstallation (le script se désinstalle totalement avant
  942. # chaque rehash ou à chaque relecture au moyen de la commande "source" ou
  943. # autre)
  944. proc uninstall {args} {
  945. putlog "Désallocation des ressources de ${::Oracle::scriptname}..."
  946. foreach binding [lsearch -inline -all -regexp [binds *[set ns [::tcl::string::range [namespace current] 2 end]]*] " \{?(::)?$ns"] {
  947. unbind [lindex $binding 0] [lindex $binding 1] [lindex $binding 2] [lindex $binding 4]
  948. }
  949. foreach running_utimer [utimers] {
  950. if { [::tcl::string::match "*[namespace current]::*" [lindex $running_utimer 1]] } { killutimer [lindex $running_utimer 2] }
  951. }
  952. namespace delete ::Oracle
  953. }
  954. }
  955.  
  956. ##############################################################################
  957. ### procédure principale
  958. ##############################################################################
  959. proc ::Oracle::ask_oracle {nick host handle chan question} {
  960. if {
  961. !([channel get $chan oracle])
  962. || (($::Oracle::antiflood)
  963. && ([::Oracle::antiflood $chan]))
  964. } then {
  965. return
  966. } elseif { [set question [::tcl::string::trim $question]] eq "" } {
  967. puthelp "PRIVMSG $chan :!$nick"
  968. return
  969. } elseif { $question eq "?" } {
  970. puthelp "PRIVMSG $chan :!$nick ?"
  971. return
  972. } else {
  973. # Si la question posée... n'est pas une question.
  974. if { ![::tcl::string::match "*\\?*" $question] } {
  975. set detected_question_type "notaquestion"
  976. set answer [::Oracle::process_answer $nick $chan $question [lindex $::Oracle::replyTypes($detected_question_type) [set answer_index [rand [llength $::Oracle::replyTypes($detected_question_type)]]]]]
  977. } else {
  978. set nick_hash [md5 $nick]
  979. set phonetics [::HaploPhone::process [::tcl::string::map {"‹" "<" "›" ">" "“" "\"" "”" "\"" "…" "..."} $question]]
  980. set known_question 0
  981. # On définit le type de question par défaut si aucun type n'est reconnu.
  982. set detected_question_type "yesno"
  983. # On tente de reconnaitre le type de question.
  984. foreach currentType $::Oracle::enabledTypes {
  985. if { [regexp -nocase $::Oracle::regexpTypes($currentType) $question] } {
  986. set detected_question_type $currentType
  987. break
  988. }
  989. }
  990. # On définit que, par défaut, le type de réponse sera lié au type de
  991. # question détecté.
  992. set applied_question_type $detected_question_type
  993. # Si la question a déjà été posée, on retrouve la réponse qui a été donnée.
  994. if { [set array_entry [::Oracle::compare_RDR $nick_hash $detected_question_type $phonetics]] != -1 } {
  995. set known_question 1
  996. lassign [split $::Oracle::phonetics_table($array_entry) "¤"] applied_question_type answer_index
  997. # Aléatoirement, on obtient une réponse neutre quelle que soit la
  998. # question.
  999. } elseif { [expr ([clock clicks -milliseconds] % 100) + 1] <= $::Oracle::neutral_rate } {
  1000. set applied_question_type "neutral"
  1001. }
  1002. # On choisit une réponse au hasard.
  1003. if { ![::tcl::info::exists answer_index] } {
  1004. set answer_index [rand [llength $::Oracle::replyTypes($applied_question_type)]]
  1005. }
  1006. set answer [::Oracle::process_answer $nick $chan $question [lindex $::Oracle::replyTypes($applied_question_type) $answer_index]]
  1007. # Si cette question n'a jamais été posée auparavant, on la mémorise.
  1008. if { !$known_question } {
  1009. # Si le nombre de questions stockées en mémoire atteint la limite
  1010. # autorisée ($max_memory), on supprime la plus ancienne.
  1011. if { [array size ::Oracle::phonetics_table] >= $::Oracle::max_memory } {
  1012. unset ::Oracle::phonetics_table([lindex [lsort [array names ::Oracle::phonetics_table]] 0])
  1013. }
  1014. # On stocke la valeur phonétique de la question, ainsi que la réponse
  1015. # associée.
  1016. set ::Oracle::phonetics_table([unixtime]¤${nick_hash}¤${phonetics}¤$detected_question_type) "${applied_question_type}¤$answer_index"
  1017. }
  1018. }
  1019. if { $::Oracle::DEBUGMODE } { ::Oracle::output_message $chan quick "\00314\[Oracle - debug\]\003 [if {[::tcl::info::exists known_question]} {set dummy "known question : $known_question \00314|\003 "} {set dummy ""}][if {[::tcl::info::exists phonetics]} {set dummy "phonetics : $phonetics \00314|\003 "} {set dummy ""}]detected type : $detected_question_type \00314|\003 [if {[::tcl::info::exists applied_question_type]} {set dummy "applied type : $applied_question_type \00314|\003 "} {set dummy ""}]answer_index : $answer_index" }
  1020. ::Oracle::output_message $chan help "$nick > $answer"
  1021. # On ajoute manuellement aux logs puisque le logger interne ne le fait pas
  1022. # avec les commandes et les réponses de l'Eggdrop.
  1023. putloglev p $chan "<$nick> $::Oracle::oracle_cmd $question"
  1024. putloglev p $chan "<$::botnick> $nick > $answer"
  1025. }
  1026. }
  1027.  
  1028. ##############################################################################
  1029. ### Neutralisation des antislashes (sauf codes de contrôle \002 \003 \022
  1030. ### \037 \026 \017) et substitution des variables dans les réponses.
  1031. ##############################################################################
  1032. proc ::Oracle::process_answer {nick chan question answer} {
  1033. set randnick [::Oracle::randnick $nick $chan]
  1034. return [subst -nocommands [regsub -all {(?!\\002|\\003|\\022|\\037|\\026|\\017)(\\)} $answer {\\\\}]]
  1035. }
  1036.  
  1037. ##############################################################################
  1038. ### Recherche de correspondances ayant un rapport de relation différentielle
  1039. ### inférieur à la tolérance définie dans la table phonétique.
  1040. ##############################################################################
  1041. proc ::Oracle::compare_RDR {nick_hash detected_question_type phonetics} {
  1042. if { [::tcl::info::exists ::Oracle::phonetics_table] } {
  1043. foreach array_entry [array names ::Oracle::phonetics_table] {
  1044. lassign [split $array_entry "¤"] {} stored_nick_hash stored_phonetics stored_question_type
  1045. if {
  1046. ($nick_hash eq $stored_nick_hash)
  1047. && ($detected_question_type eq $stored_question_type)
  1048. && ([::RDR::RDR $stored_phonetics $phonetics] <= $::Oracle::RDR_tolerance)
  1049. } then {
  1050. return $array_entry
  1051. }
  1052. }
  1053. return -1
  1054. }
  1055. }
  1056.  
  1057. ##############################################################################
  1058. ### Retourne un nick aléatoire parmi les users présents sur le chan (sauf
  1059. ### l'Eggdrop, sauf les autres Eggdrops du botnet, sauf l'user qui a posé la
  1060. ### question).
  1061. ##############################################################################
  1062. proc ::Oracle::randnick {nick chan} {
  1063. set users_list [lreplace [set users [chanlist $chan -b|]] [set index [lsearch $users $nick]] $index]
  1064. set users_list [lreplace $users_list [set index [lsearch $users_list $::nick]] $index]
  1065. if {![llength $users_list]} {
  1066. return "quelqu'un"
  1067. }
  1068. return [lindex $users_list [rand [llength $users_list]]]
  1069. }
  1070.  
  1071. ##############################################################################
  1072. ### Accord au singulier ou au pluriel.
  1073. ##############################################################################
  1074. proc ::Oracle::plural {value singular plural} {
  1075. if {
  1076. ($value >= 2)
  1077. || ($value <= -2)
  1078. } then {
  1079. return $plural
  1080. } else {
  1081. return $singular
  1082. }
  1083. }
  1084.  
  1085. ###############################################################################
  1086. ### Affichage d'un message.
  1087. ###############################################################################
  1088. proc ::Oracle::output_message {chan queue data} {
  1089. # Filtrage des styles si nécessaire.
  1090. if { ($::Oracle::monochrome == 1)
  1091. || ([::tcl::string::match *c* [lindex [split [getchanmode $chan]] 0]])
  1092. } then {
  1093. put$queue "PRIVMSG $chan :[regsub -all "\017" [stripcodes abcgru $data] ""]"
  1094. } else {
  1095. put$queue "PRIVMSG $chan :$data"
  1096. }
  1097. return
  1098. }
  1099.  
  1100. ###############################################################################
  1101. ### Test de l'existence d'un utimer, renvoi de son ID.
  1102. ###############################################################################
  1103. proc ::Oracle::utimerexists {command} {
  1104. foreach utimer_ [utimers] {
  1105. if { ![::tcl::string::compare $command [lindex $utimer_ 1]] } then {
  1106. return [lindex $utimer_ 2]
  1107. }
  1108. }
  1109. return
  1110. }
  1111.  
  1112. ##############################################################################
  1113. ### Commande !oracle_db_size : affiche le nombre de réponses dans la base
  1114. ### de données.
  1115. ##############################################################################
  1116. proc ::Oracle::show_db_size {nick host handle chan arg} {
  1117. set total 0
  1118. foreach currentType $::Oracle::enabledTypes {
  1119. if { [::tcl::info::exists output] } {
  1120. append output " \00307|\003 "
  1121. }
  1122. append output "$currentType :\00314 [set num_answers [llength $::Oracle::replyTypes($currentType)]]\003"
  1123. incr total $num_answers
  1124. }
  1125. append output " \00307|\003 notaquestion :\00314 [set num_answers1 [llength $::Oracle::replyTypes(notaquestion)]]\003 \00307|\003 yesno :\00314 [set num_answers2 [llength $::Oracle::replyTypes(yesno)]]\003"
  1126. set total [expr $total + $num_answers1 + $num_answers2]
  1127. append output " \00304|\003 nombre total de réponses dans la base de données :\00314 $total\003"
  1128. ::Oracle::output_message $chan help "$output"
  1129. }
  1130.  
  1131. ###############################################################################
  1132. ### Contrôle du flood.
  1133. ###############################################################################
  1134. proc ::Oracle::antiflood {chan} {
  1135. set chan_hash [md5 $chan]
  1136. # L'antiflood est dans un statut neutre, on l'initialise.
  1137. if { ![::tcl::info::exists ::Oracle::instance($chan_hash)] } {
  1138. set ::Oracle::instance($chan_hash) 0
  1139. set ::Oracle::antiflood_msg($chan_hash) 0
  1140. }
  1141. if { $::Oracle::instance($chan_hash) >= $::Oracle::antiflood_max_instances } {
  1142. if { !$::Oracle::antiflood_msg($chan_hash) } {
  1143. set ::Oracle::antiflood_msg($chan_hash) 2
  1144. ::Oracle::output_message $chan quick "\00304:::\003 \00314Contrôle de flood activé pour la commande \002$::Oracle::oracle_cmd\002 : pas plus de $::Oracle::antiflood_max_instances [::Oracle::plural $::Oracle::antiflood_max_instances "requête" "requêtes"] en $::Oracle::antiflood_instance_length [::Oracle::plural $::Oracle::antiflood_instance_length "seconde" "secondes"].\003"
  1145. if { [set msgresettimer [::Oracle::utimerexists "::Oracle::antiflood_msg_reset $chan_hash"]] ne ""} {
  1146. killutimer $msgresettimer
  1147. }
  1148. utimer $::Oracle::antiflood_msg_interval [list ::Oracle::antiflood_msg_reset $chan_hash]
  1149. } elseif { $::Oracle::antiflood_msg($chan_hash) == 1 } {
  1150. set ::Oracle::antiflood_msg($chan_hash) 2
  1151. ::Oracle::output_message $chan help "\00304:::\003 \00314Le contrôle de flood est toujours actif, merci de patienter.\003"
  1152. if { [set msgresettimer [::Oracle::utimerexists "::Oracle::antiflood_msg_reset $chan_hash"]] ne ""} {
  1153. killutimer $msgresettimer
  1154. }
  1155. utimer $::Oracle::antiflood_msg_interval [list ::Oracle::antiflood_msg_reset $chan_hash]
  1156. }
  1157. return 1
  1158. } else {
  1159. incr ::Oracle::instance($chan_hash)
  1160. utimer $::Oracle::antiflood_instance_length [list ::Oracle::antiflood_close_instance $chan_hash]
  1161. return 0
  1162. }
  1163. }
  1164. proc ::Oracle::antiflood_close_instance {chan_hash} {
  1165. incr ::Oracle::instance($chan_hash) -1
  1166. if { $::Oracle::instance($chan_hash) == 0 } {
  1167. unset ::Oracle::instance($chan_hash)
  1168. unset ::Oracle::antiflood_msg($chan_hash)
  1169. } else {
  1170. set ::Oracle::antiflood_msg($chan_hash) 0
  1171. if { [set msgresettimer [::Oracle::utimerexists "::Oracle::antiflood_msg_reset [set chan_hash]"]] ne "" } {
  1172. killutimer $msgresettimer
  1173. }
  1174. }
  1175. return
  1176. }
  1177. proc ::Oracle::antiflood_msg_reset {chan_hash} {
  1178. set ::Oracle::antiflood_msg($chan_hash) 1
  1179. return
  1180. }
  1181.  
  1182. ##############################################################################
  1183. ### Binds
  1184. ##############################################################################
  1185. bind pub $::Oracle::oracleauth $::Oracle::oracle_cmd ::Oracle::ask_oracle
  1186. bind pub n !oracle_db_size ::Oracle::show_db_size
  1187. bind evnt - prerehash ::Oracle::uninstall
  1188.  
  1189.  
  1190. putlog "$::Oracle::scriptname v$::Oracle::version (©2009-2017 MenzAgitat) a été chargé."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement