Système de quotes complet ajoutant les commandes publiques suivantes :
!addquote !quote !quoteinfo !delquote !randquote !lastquote !findquote
section configuration avec de nombreux paramètres réglables, support multi-channel, contrôle anti-flood, backup quotidien de la base de quotes...
Ce script est conçu pour les serveurs de type Epona : un bot de BotServ doit être présent sur le canal IRC pour afficher le résultat des commandes. De plus, vous devez avoir un niveau d'accès suffisant sur le chan IRC pour pouvoir faire parler le bot.
Source / Exemple :
/*
###################################################
#
# Public Quotes System ( pour mIRC )
#
# v 2.9 (14/01/2007) ©2006-2007 MenzAgitat
#
#
###################################################
#
# remerciements à Galdinx pour le beta testing intensif,
# les idées et la correction d'un bug réticent.
#
###################################################
#
# Vous pouvez contacter l'auteur sur :
# irc.teepi.net port:6667 #boulets
#
#-------------------------------------------------------
#
# Ce script ajoute les commandes suivantes :
#
# !addquote <citation> : ajouter une citation
# !quote <n° de citation> : afficher une citation
# !quoteinfo <n° de citation> : afficher des informations sur une citation
# !delquote <n° de citation> : effacer une citation
# !randquote : afficher une citation aléatoire
# !lastquote : afficher la dernière citation enregistrée
# !findquote <argument(s) de recherche> : rechercher une citation
# remarque : mettez des " " autour de vos arguments de recherche pour
# rechercher l'expression exacte.
#
#-------------------------------------------------------
#
# Un fichier nommé quotes.txt est créé dans le dossier d'installation
# de mIRC dès que la 1ère citation est enregistrée : il s'agit de la base de
# données de citations.
#
#-------------------------------------------------------
#
# Ce script est conçu pour les serveurs de type Epona : un bot de BotServ
# doit être présent sur le canal IRC pour afficher le résultat des
# commandes. De plus, vous devez avoir un niveau d'accès suffisant
# sur le chan IRC pour pouvoir faire parler le bot.
#
#-------------------------------------------------------
#
# Evolutions prévues :
#
# - aucune pour l'instant :)
#
#-------------------------------------------------------
#
# Installation :
#
# - copiez le fichier quotesystem.mrc dans le dossier dans lequel mIRC
# est installé
#
# - éditez la section de configuration ci-dessous
#
# - dans mIRC, tapez : /load -rs quotesystem.mrc
#
# - tapez enfin la commande : /quotessetup
# afin d'appliquer la configuration.
#
# Désinstallation :
#
# - dans mIRC, tapez : /unload -rs quotesystem.mrc
#
#
alias quotessetup {
; -------------------------------------------------------
; Configuration
; -------------------------------------------------------
; canaux sur lesquels les quotes sont activées.
; exemple : %quotes_channels = #chan1, #chan2, #chan3
; ou : %quotes_channels = *
%quotes_channels = #boulets
; nombre maximum de quotes récentes à afficher pour !findquote
; (attention au flood si vous définissez une valeur trop élevée)
%maxfindquote = 2
; contrôle anti-flood
; exemple : %setcmdflood.quote = 6:30
; ( 6 commandes maximum en 30 secondes, les suivantes seront ignorées )
%setcmdflood.addquote = 3:40
%setcmdflood.quote = 6:30
%setcmdflood.quoteinfo = 5:30
%setcmdflood.delquote = 2:40
%setcmdflood.randquote = 6:30
%setcmdflood.lastquote = 2:30
%setcmdflood.findquote = 3:30
; nombre de secondes pendant lesquelles une commande
; est ignorée si l'anti-flood est activé.
%quotecmdfloodignore = 120
; contrôle anti-flood global (toutes commandes confondues)
; remarque : pour le nombre de commandes, spécifiez une valeur
; supérieure à la plus grande valeur définie pour le contrôle
; de flood individuel.
%setcmdflood.globalquotes = 7:30
; nombre de secondes pendant lesquelles toutes les commandes
; du système de quotes sont ignorées si l'anti-flood global est activé.
%globalquotecmdfloodignore = 120
; heure du backup quotidien de la base de quotes.
; exemple : %quotesbackuptime = 0:00
%quotesbackuptime = 0:00
; nombre de backups à conserver.
; exemple pour conserver les backups des 3 derniers jours :
; %quotesbackupnumber = 3
%quotesbackupnumber = 3
; -------------------------------------------------------
; Fin de la section configuration
;
; ne touchez à rien dans ce qui suit sauf si vous savez précisément ce que
; vous faites.
; -------------------------------------------------------
; -------------------------------------------------------
%quotesscriptversion = 2.9 (14/01/2007)
.timerbackupquotes -o %quotesbackuptime 1 0 backupquotes
}
on 1:LOAD:{ echo -a Public Quotes System v $+ %quotesscriptversion installé avec succès. }
on 1:CONNECT:{ quotessetup }
; -------------------------------------------------------
; Commandes privées
; -------------------------------------------------------
; -------------------------------------------------------
on 1:input:%quotes_channels:{
; -------------------------------------------------------
; ! A d d q u o t e
; -------------------------------------------------------
if ($strip($1) == !addquote) {
say $1-
if (!$2) { .msg botserv say $chan La syntaxe correcte est !addquote <citation> | halt }
if ($len($2-) < 10 ) { .msg botserv say $chan Vous ne pouvez pas enregistrer des citations de moins de 10 caractères. | halt }
quotessetup
var %current_quote_number = $calc($lines(quotes.txt) +1)
write quotes.txt %current_quote_number $date $time $chan $nick $eval($2-)
.msg botserv say $chan Quote n° $+ %current_quote_number ajoutée.
halt
}
; -------------------------------------------------------
; ! Q u o t e i n f o
; -------------------------------------------------------
elseif (($strip($1) == !quoteinfo) || ($1 == !auteur)) {
say $1-
if (($1 == !auteur) || ($2 !isnum) || ($chr(46) isin $2)) { .msg botserv say $chan La syntaxe correcte est !quoteinfo <n° de la citation> | halt }
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | halt }
quotessetup
var %autquote_number = $2
if (%autquote_number < 1) { .msg botserv say $chan La quote n° $+ %autquote_number n'existe pas dans cette dimension. Il est actuellement impossible d'établir la connexion, veuillez réessayer plus tard... | halt }
elseif (%autquote_number > $lines(quotes.txt)) { .msg botserv say $chan La quote n° $+ %autquote_number n'existe pas encore. ( $+ $lines(quotes.txt) quotes dans la base à ce jour) | halt }
var %autread_quote = $read(quotes.txt, n, %autquote_number)
tokenize 32 %autread_quote
; echo -s debug > 1 $1 2 $2 3 $3 4 $4 5 $5 6 $6 7 $7 8 $8 9 $9
if ( $1 == -deleted- ) {
if ( $2 == inconnu ) { .msg botserv say $chan La quote n° $+ %autquote_number n'existe plus, elle a été supprimée. }
elseif ( $2 != inconnu ) {
var %autquote_author = $2 | var %autquote_date = $3 | var %autquote_time = $4 | var %autquote_chan = $5
.msg botserv say $chan La quote n° $+ %autquote_number n'existe plus, elle a été supprimée le %autquote_date à %autquote_time par %autquote_author $+ .
}
}
elseif ( $1 != -deleted- ) {
var %autquote_date = $2 | var %autquote_time = $3 | var %autquote_chan = $4 | var %autquote_author = $5
if ( %autquote_date == 00/00/0000 ) { .msg botserv say $chan La quote n° $+ %autquote_number a été enregistrée sur %autquote_chan entre le 15/11/2005 et le 06/02/2006 par %autquote_author $+ . }
else { .msg botserv say $chan La quote n° $+ %autquote_number a été enregistrée sur %autquote_chan le %autquote_date à %autquote_time par %autquote_author $+ . }
}
halt
}
; -------------------------------------------------------
; ! Q u o t e
; -------------------------------------------------------
elseif ($strip($1) == !quote) {
say $1-
if (($2 !isnum) || ($chr(46) isin $2)) { .msg botserv say $chan La syntaxe correcte est !quote <n° de la citation> | halt }
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | halt }
quotessetup
var %quote_number = $2
if (%quote_number < 1) { .msg botserv say $chan La quote n° $+ %quote_number n'existe pas dans cette dimension. Il est actuellement impossible d'établir la connexion, veuillez réessayer plus tard... | halt }
elseif (%quote_number > $lines(quotes.txt)) { .msg botserv say $chan La quote n° $+ %quote_number n'existe pas encore. ( $+ $lines(quotes.txt) quotes dans la base à ce jour) | halt }
var %read_quote = $read(quotes.txt, n, %quote_number)
; echo -s debug > read_quote : %read_quote
tokenize 32 %read_quote
if ( $1 == -deleted- ) {
if ( $2 == inconnu ) { .msg botserv say $chan La quote n° $+ %quote_number n'existe plus, elle a été supprimée. | halt }
elseif ( $2 != inconnu ) {
var %quote_author = $2 | var %quote_date = $3 | var %quote_time = $4
.msg botserv say $chan La quote n° $+ %quote_number n'existe plus, elle a été supprimée le %quote_date à %quote_time par %quote_author $+ . | halt
}
}
; echo -s debug > 1 $1 2 $2 3 $3 4 $4 5 $5 6 $6 7 $7 8 $8 9 $9
var %pure_quote = $6-
.msg botserv say $chan $+($([),,%quote_number,,$(])) %pure_quote
halt
}
; -------------------------------------------------------
; ! D e l q u o t e
; -------------------------------------------------------
elseif ($strip($1) == !delquote) {
say $1-
if (($2 !isnum) || ($chr(46) isin $2)) { .msg botserv say $chan La syntaxe correcte est !delquote <n° de la citation> (vous devez en être l'auteur) | halt }
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | halt }
quotessetup
var %delquote_number = $2
if (%delquote_number < 1) { .msg botserv say $chan La quote n° $+ %delquote_number n'existe pas dans cette dimension. Il est actuellement impossible d'établir la connexion, veuillez réessayer plus tard... | halt }
elseif (%delquote_number > $lines(quotes.txt)) { .msg botserv say $chan La quote n° $+ %delquote_number n'existe pas encore. ( $+ $lines(quotes.txt) quotes dans la base à ce jour) | halt }
var %delread_quote = $read(quotes.txt, n, %delquote_number)
tokenize 32 %delread_quote
; echo -s debug > 1 $1 2 $2 3 $3 4 $4 5 $5 6 $6 7 $7 8 $8 9 $9
if ( $1 == -deleted- ) {
if (( $2 == inconnu ) && (%delquote_number <= $lines(quotes.txt))) { .msg botserv say $chan La quote n° $+ %delquote_number n'existe plus, elle a déjà été supprimée. | halt }
elseif (( $2 != inconnu ) && (%delquote_number <= $lines(quotes.txt))) {
var %delquote_author = $2 | var %delquote_date = $3 | var %delquote_time = $4
.msg botserv say $chan La quote n° $+ %delquote_number n'existe plus, elle a déjà été supprimée le %delquote_date à %delquote_time par %delquote_author $+ . | halt
}
}
var %delquote_author = $5
if ($nick != %delquote_author) { .msg botserv say $chan Vous n'êtes pas autorisé à effacer cette quote. Son auteur est %delquote_author $+ . | halt }
set %last_deleted_quote %delread_quote
write -l $+ %delquote_number quotes.txt -deleted- $nick $date $time $chan -------- $address($nick,5) a effacé : %delread_quote
.msg botserv say $chan Quote n° $+ %delquote_number effacée.
halt
}
; -------------------------------------------------------
; ! R a n d q u o t e
; -------------------------------------------------------
elseif ($strip($1) == !randquote) {
say $1-
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | halt }
quotessetup
var %randquotecounter = 0
:randquote_again
inc %randquotecounter
if ( %randquotecounter > 100 ) { .msg botserv say $chan Aucune quote valide n'a été trouvée dans la base après 100 tentatives aléatoires. La requête a été annulée afin d'éviter une boucle infinie du script. | halt }
var %read_quote = $read(quotes.txt, n)
tokenize 32 %read_quote
if (( !%read_quote ) || ( $1 == -deleted- )) { goto randquote_again }
var %quote_number = $1 | var %pure_quote = $6-
.msg botserv say $chan $+($([),,%quote_number,,$(])) %pure_quote
halt
}
; -------------------------------------------------------
; ! L a s t q u o t e
; -------------------------------------------------------
elseif ($strip($1) == !lastquote) {
say $1-
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | halt }
quotessetup
var %current_quote_number = $lines(quotes.txt)
var %lastquotesearch = %current_quote_number
var %read_lastquote = $read(quotes.txt, n, $lines(quotes.txt))
tokenize 32 %read_lastquote
while ( $1 == -deleted- ) {
var %lastquote_author = $2 | var %lastquote_date = $3 | var %lastquote_time = $4
if ( %lastquotesearch = %current_quote_number ) { .msg botserv say $chan 14La dernière quote en date (n° $+ %current_quote_number $+ ) n'existe plus, elle a été supprimée le %lastquote_date à %lastquote_time par %lastquote_author $+ . Recherche de la dernière quote valide... }
dec %lastquotesearch
if ( %lastquotesearch < 1 ) { .msg botserv say $chan Aucune quote valide n'a été trouvée dans la base. | halt }
var %read_lastquote = $read(quotes.txt, n, %lastquotesearch)
tokenize 32 %read_lastquote
}
var %quote_number = $1 | var %pure_quote = $6-
.msg botserv say $chan $+($([),,%quote_number,,$(])) %pure_quote
halt
}
; -------------------------------------------------------
; ! F i n d q u o t e
; -------------------------------------------------------
elseif ($strip($1) == !findquote) {
say $1-
if (!$2) { .msg botserv say $chan La syntaxe correcte est !findquote <critères de recherche> | halt }
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | halt }
if ($len($2-) < 3) { .msg botserv say $chan Votre recherche doit comporter au moins 3 caractères. | halt }
quotessetup
write -c addquote_filter_results.log
write -c addquote_filter_results2.log
var %mfq = $calc(%maxfindquote + 1)
var %findquote_search = $2-
if (($left(%findquote_search,1) == $chr(34)) && ($right(%findquote_search,1) == $chr(34))) {
var %findquote_search = $remove(%findquote_search,$("))
var %findquote_exact_match = 1
}
var %FQsearchloop = 1
while (%FQsearchloop <= 10) {
if (!$gettok(%findquote_search,%FQsearchloop,32)) { var %FQnumtok = $calc(%FQsearchloop - 1) | goto outwhile }
inc %FQsearchloop
}
:outwhile
; echo -a 110Findquote_search = %findquote_search - FQnumtok = %FQnumtok
tokenize 32 %findquote_search
filter -cff quotes.txt addquote_filter_results.log * $+ $1 $+ *
var %FQsearchloop = 1
var %FQsearchtrig = 1
while (%FQsearchloop <= %FQnumtok) {
tokenize 32 %findquote_search
var %FQcurrenttoken = $gettok(%findquote_search,%FQsearchloop,32)
if (%FQsearchtrig == 1) { var %filter_result = addquote_filter_results2.log | var %filter_result2 = addquote_filter_results.log | var %FQsearchtrig = 2 | goto jumpinwhile }
elseif (%FQsearchtrig == 2) { var %filter_result = addquote_filter_results.log | var %filter_result2 = addquote_filter_results2.log | var %FQsearchtrig = 1 }
:jumpinwhile
; echo -a 210FQcurrenttoken = %FQcurrenttoken - FQsearchtrig = %FQsearchtrig - filter_result = %filter_result - filter_result2 = %filter_result2
filter -cff %filter_result2 %filter_result * $+ %FQcurrenttoken $+ *
inc %FQsearchloop
}
var %nbr_findquote_results = $lines(%filter_result)
; echo -a 310nbr_findquote_results = %nbr_findquote_results - filter_result = %filter_result - filter_result2 = %filter_result2
var %FQloop = 0
write -c %filter_result2
while ( %FQLoop < %nbr_findquote_results) {
inc %FQloop
var %read_quote = $read(%filter_result, n, %FQloop)
tokenize 32 %read_quote
if ( $1 != -deleted- ) { write -l $+ %FQloop %filter_result2 $1 $6- }
; echo -a 3bis10 1 = $1 - 2 = $2 - 3 = $3- - filter_result =4 %filter_result
}
; 2ème passe après élimination de la colonne auteur et des infos de quotes effacées
var %FQsearchloop = 1
if %findquote_exact_match { var %FQnumtok = 1 }
while (%FQsearchloop <= %FQnumtok) {
tokenize 32 %findquote_search
var %FQcurrenttoken = $gettok(%findquote_search,%FQsearchloop,32)
if %findquote_exact_match { var %FQcurrenttoken = %findquote_search }
filter -cff %filter_result2 %filter_result * $+ %FQcurrenttoken $+ *
if (%FQsearchtrig == 1) { var %filter_result = addquote_filter_results2.log | var %filter_result2 = addquote_filter_results.log | var %FQsearchtrig = 2 | goto jumpinwhile2 }
elseif (%FQsearchtrig == 2) { var %filter_result = addquote_filter_results.log | var %filter_result2 = addquote_filter_results2.log | var %FQsearchtrig = 1 }
:jumpinwhile2
; echo -a 410FQcurrenttoken = %FQcurrenttoken - FQsearchtrig = %FQsearchtrig - filter_result = %filter_result - filter_result2 = %filter_result2
inc %FQsearchloop
}
var %nbr_findquote_results = $lines(%filter_result2)
; echo -a 510nbr_findquote_results = %nbr_findquote_results - FQcurrenttoken = %FQcurrenttoken - FQsearchtrig = %FQsearchtrig - filter_result = %filter_result - filter_result2 = %filter_result2
unset %quote_summarize
if (%nbr_findquote_results == 0) { .msg botserv say $chan Aucune occurence n'a été trouvée. | halt }
elseif (%nbr_findquote_results > 1) { var %quote_summarize = $+ %nbr_findquote_results résultats ont été trouvés : }
elseif (%nbr_findquote_results = 1) {
.msg botserv say $chan $+ %nbr_findquote_results résultat a été trouvé :
var %read_quote = $read(%filter_result2, n, 1)
tokenize 32 %read_quote
var %quote_number = $1 | var %pure_quote = $2-
.msg botserv say $chan $+($([),,%quote_number,,$(])) %pure_quote
halt
}
var %FQsumm = 0
while (%FQsumm < %nbr_findquote_results) {
inc %FQsumm
var %read_quote = $read(%filter_result2, n, %FQsumm)
tokenize 32 %read_quote
var %quote_number = $1
var %quote_summarize = $+(%quote_summarize,%quote_number,14,$chr($asc(|)),)
if (($len(%quote_summarize) >= 450) && (%FQsumm < %nbr_findquote_results)) {
.msg botserv say $chan %quote_summarize
unset %quote_summarize
}
}
.msg botserv say $chan %quote_summarize
.msg botserv say $chan Quotes récentes :
var %FQloop = %nbr_findquote_results | var %FQloop2 = 0
inc %FQloop
:findquoteloop
dec %FQloop
inc %FQloop2
var %read_quote = $read(%filter_result2, n, %FQloop)
tokenize 32 %read_quote
var %quote_number = $1 | var %pure_quote = $2-
if ((%FQloop2 < %mfq ) && (%FQloop2 <= %nbr_findquote_results)) { .msg botserv say $chan $+($([),,%quote_number,,$(])) %pure_quote | goto findquoteloop }
halt
}
:do_not_process
}
; -------------------------------------------------------
; -------------------------------------------------------
; Commandes publiques
; -------------------------------------------------------
; -------------------------------------------------------
; -------------------------------------------------------
; ! A d d q u o t e
; -------------------------------------------------------
on 1:text:*:%quotes_channels:{
if ($strip($1) == !addquote) {
quotessetup
set %setcmdflood.nbr $gettok(%setcmdflood.globalquotes,1,58)
set %setcmdflood.time $gettok(%setcmdflood.globalquotes,2,58)
floodcontrol globalquotes $chan
set %setcmdflood.nbr $gettok(%setcmdflood.addquote,1,58)
set %setcmdflood.time $gettok(%setcmdflood.addquote,2,58)
floodcontrol addquote $chan
if (!$2) { .msg botserv say $chan La syntaxe correcte est !addquote <citation> | goto do_not_process }
if ($len($2-) < 10 ) { .msg botserv say $chan Vous ne pouvez pas enregistrer des citations de moins de 10 caractères. | goto do_not_process }
var %current_quote_number = $calc($lines(quotes.txt) +1)
write quotes.txt %current_quote_number $date $time $chan $nick $eval($2-)
.msg botserv say $chan Quote n° $+ %current_quote_number ajoutée.
}
; -------------------------------------------------------
; ! Q u o t e i n f o
; -------------------------------------------------------
elseif ($strip($1) == !quoteinfo) {
quotessetup
set %setcmdflood.nbr $gettok(%setcmdflood.globalquotes,1,58)
set %setcmdflood.time $gettok(%setcmdflood.globalquotes,2,58)
floodcontrol globalquotes $chan
set %setcmdflood.nbr $gettok(%setcmdflood.quoteinfo,1,58)
set %setcmdflood.time $gettok(%setcmdflood.quoteinfo,2,58)
floodcontrol quoteinfo $chan
if (($2 !isnum) || ($chr(46) isin $2)) { .msg botserv say $chan La syntaxe correcte est !quoteinfo <n° de la citation> | goto do_not_process }
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | goto do_not_process }
var %autquote_number = $2
if (%autquote_number < 1) { .msg botserv say $chan La quote n° $+ %autquote_number n'existe pas dans cette dimension. Il est actuellement impossible d'établir la connexion, veuillez réessayer plus tard... | goto do_not_process }
elseif (%autquote_number > $lines(quotes.txt)) { .msg botserv say $chan La quote n° $+ %autquote_number n'existe pas encore. ( $+ $lines(quotes.txt) quotes dans la base à ce jour) | goto do_not_process }
var %autread_quote = $read(quotes.txt, n, %autquote_number)
tokenize 32 %autread_quote
; echo -s debug > 1 $1 2 $2 3 $3 4 $4 5 $5 6 $6 7 $7 8 $8 9 $9
if ( $1 == -deleted- ) {
if ( $2 == inconnu ) { .msg botserv say $chan La quote n° $+ %autquote_number n'existe plus, elle a été supprimée. }
elseif ( $2 != inconnu ) {
var %autquote_author = $2 | var %autquote_date = $3 | var %autquote_time = $4 | var %autquote_chan = $5
.msg botserv say $chan La quote n° $+ %autquote_number n'existe plus, elle a été supprimée le %autquote_date à %autquote_time par %autquote_author $+ .
}
}
elseif ( $1 != -deleted- ) {
var %autquote_date = $2 | var %autquote_time = $3 | var %autquote_chan = $4 | var %autquote_author = $5
if ( %autquote_date == 00/00/0000 ) { .msg botserv say $chan La quote n° $+ %autquote_number a été enregistrée sur %autquote_chan entre le 15/11/2005 et le 06/02/2006 par %autquote_author $+ . }
else { .msg botserv say $chan La quote n° $+ %autquote_number a été enregistrée sur %autquote_chan le %autquote_date à %autquote_time par %autquote_author $+ . }
}
}
elseif ($strip($1) == !auteur) {
.msg botserv say $chan La syntaxe correcte est !quoteinfo <n° de la citation>
}
; -------------------------------------------------------
; ! Q u o t e
; -------------------------------------------------------
elseif ($strip($1) == !quote) {
quotessetup
set %setcmdflood.nbr $gettok(%setcmdflood.globalquotes,1,58)
set %setcmdflood.time $gettok(%setcmdflood.globalquotes,2,58)
floodcontrol globalquotes $chan
set %setcmdflood.nbr $gettok(%setcmdflood.quote,1,58)
set %setcmdflood.time $gettok(%setcmdflood.quote,2,58)
floodcontrol quote $chan
if (($2 !isnum) || ($chr(46) isin $2)) { .msg botserv say $chan La syntaxe correcte est !quote <n° de la citation> | goto do_not_process }
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | goto do_not_process }
var %quote_number = $2
if (%quote_number < 1) { .msg botserv say $chan La quote n° $+ %quote_number n'existe pas dans cette dimension. Il est actuellement impossible d'établir la connexion, veuillez réessayer plus tard... | goto do_not_process }
elseif (%quote_number > $lines(quotes.txt)) { .msg botserv say $chan La quote n° $+ %quote_number n'existe pas encore. ( $+ $lines(quotes.txt) quotes dans la base à ce jour) | goto do_not_process }
var %read_quote = $read(quotes.txt, n, %quote_number)
; echo -s debug > read_quote : %read_quote
tokenize 32 %read_quote
if ( $1 == -deleted- ) {
if ( $2 == inconnu ) { .msg botserv say $chan La quote n° $+ %quote_number n'existe plus, elle a été supprimée. | goto do_not_process }
elseif ( $2 != inconnu ) {
var %quote_author = $2 | var %quote_date = $3 | var %quote_time = $4
.msg botserv say $chan La quote n° $+ %quote_number n'existe plus, elle a été supprimée le %quote_date à %quote_time par %quote_author $+ . | goto do_not_process
}
}
var %pure_quote = $6-
.msg botserv say $chan $+($([),,%quote_number,,$(])) %pure_quote
}
; -------------------------------------------------------
; ! D e l q u o t e
; -------------------------------------------------------
elseif ($strip($1) == !delquote) {
quotessetup
set %setcmdflood.nbr $gettok(%setcmdflood.globalquotes,1,58)
set %setcmdflood.time $gettok(%setcmdflood.globalquotes,2,58)
floodcontrol globalquotes $chan
set %setcmdflood.nbr $gettok(%setcmdflood.delquote,1,58)
set %setcmdflood.time $gettok(%setcmdflood.delquote,2,58)
floodcontrol delquote $chan
if (($2 !isnum) || ($chr(46) isin $2)) { .msg botserv say $chan La syntaxe correcte est !delquote <n° de la citation> (vous devez en être l'auteur) | goto do_not_process }
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | goto do_not_process }
quotessetup
var %delquote_number = $2
if (%delquote_number < 1) { .msg botserv say $chan La quote n° $+ %delquote_number n'existe pas dans cette dimension. Il est actuellement impossible d'établir la connexion, veuillez réessayer plus tard... | goto do_not_process }
elseif (%delquote_number > $lines(quotes.txt)) { .msg botserv say $chan La quote n° $+ %delquote_number n'existe pas encore. ( $+ $lines(quotes.txt) quotes dans la base à ce jour) | goto do_not_process }
var %delread_quote = $read(quotes.txt, n, %delquote_number)
tokenize 32 %delread_quote
; echo -s debug > 1 $1 2 $2 3 $3 4 $4 5 $5 6 $6 7 $7 8 $8 9 $9
if ( $1 == -deleted- ) {
if (( $2 == inconnu ) && (%delquote_number <= $lines(quotes.txt))) { .msg botserv say $chan La quote n° $+ %delquote_number n'existe plus, elle a déjà été supprimée. | goto do_not_process }
elseif (( $2 != inconnu ) && (%delquote_number <= $lines(quotes.txt))) {
var %delquote_author = $2 | var %delquote_date = $3 | var %delquote_time = $4
.msg botserv say $chan La quote n° $+ %delquote_number n'existe plus, elle a déjà été supprimée le %delquote_date à %delquote_time par %delquote_author $+ .
goto do_not_process
}
}
var %delquote_author = $5
if ($nick != %delquote_author) { .msg botserv say $chan Vous n'êtes pas autorisé à effacer cette quote. Son auteur est %delquote_author $+ . | goto do_not_process }
set %last_deleted_quote %delread_quote
write -l $+ %delquote_number quotes.txt -deleted- $nick $date $time $chan -------- $address($nick,5) a effacé : %delread_quote
.msg botserv say $chan Quote n° $+ %delquote_number effacée.
}
; -------------------------------------------------------
; ! R a n d q u o t e
; -------------------------------------------------------
elseif ($strip($1) == !randquote) {
quotessetup
set %setcmdflood.nbr $gettok(%setcmdflood.globalquotes,1,58)
set %setcmdflood.time $gettok(%setcmdflood.globalquotes,2,58)
floodcontrol globalquotes $chan
set %setcmdflood.nbr $gettok(%setcmdflood.randquote,1,58)
set %setcmdflood.time $gettok(%setcmdflood.randquote,2,58)
floodcontrol randquote $chan
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | goto do_not_process }
var %randquotecounter = 0
:randquote_again
inc %randquotecounter
if ( %randquotecounter > 100 ) { .msg botserv say $chan Aucune quote valide n'a été trouvée dans la base après 100 tentatives aléatoires. La requête a été annulée afin d'éviter une boucle infinie du script. | goto do_not_process }
var %read_quote = $read(quotes.txt, n)
tokenize 32 %read_quote
if (( !%read_quote ) || ( $1 == -deleted- )) { goto randquote_again }
var %quote_number = $1 | var %pure_quote = $6-
.msg botserv say $chan $+($([),,%quote_number,,$(])) %pure_quote
}
; -------------------------------------------------------
; ! L a s t q u o t e
; -------------------------------------------------------
elseif ($strip($1) == !lastquote) {
quotessetup
set %setcmdflood.nbr $gettok(%setcmdflood.globalquotes,1,58)
set %setcmdflood.time $gettok(%setcmdflood.globalquotes,2,58)
floodcontrol globalquotes $chan
set %setcmdflood.nbr $gettok(%setcmdflood.lastquote,1,58)
set %setcmdflood.time $gettok(%setcmdflood.lastquote,2,58)
floodcontrol lastquote $chan
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | goto do_not_process }
var %current_quote_number = $lines(quotes.txt)
var %lastquotesearch = %current_quote_number
var %read_lastquote = $read(quotes.txt, n, $lines(quotes.txt))
tokenize 32 %read_lastquote
while ( $1 == -deleted- ) {
var %lastquote_author = $2 | var %lastquote_date = $3 | var %lastquote_time = $4
if ( %lastquotesearch = %current_quote_number ) { .msg botserv say $chan 14La dernière quote en date (n° $+ %current_quote_number $+ ) n'existe plus, elle a été supprimée le %lastquote_date à %lastquote_time par %lastquote_author $+ . Recherche de la dernière quote valide... }
dec %lastquotesearch
if ( %lastquotesearch < 1 ) { .msg botserv say $chan Aucune quote valide n'a été trouvée dans la base. | goto do_not_process }
var %read_lastquote = $read(quotes.txt, n, %lastquotesearch)
tokenize 32 %read_lastquote
}
var %quote_number = $1 | var %pure_quote = $6-
.msg botserv say $chan $+($([),,%quote_number,,$(])) %pure_quote
}
; -------------------------------------------------------
; ! F i n d q u o t e
; -------------------------------------------------------
elseif ($strip($1) == !findquote) {
quotessetup
set %setcmdflood.nbr $gettok(%setcmdflood.globalquotes,1,58)
set %setcmdflood.time $gettok(%setcmdflood.globalquotes,2,58)
floodcontrol globalquotes $chan
set %setcmdflood.nbr $gettok(%setcmdflood.findquote,1,58)
set %setcmdflood.time $gettok(%setcmdflood.findquote,2,58)
floodcontrol findquote $chan
if (!$2) { .msg botserv say $chan La syntaxe correcte est !findquote <critères de recherche> | goto do_not_process }
if ( !$exists(quotes.txt) ) { .msg botserv say $chan Il n'y a aucune quote dans la base pour l'instant. | goto do_not_process }
if ($len($2-) < 3) { .msg botserv say $chan Votre recherche doit comporter au moins 3 caractères. | goto do_not_process }
quotessetup
write -c addquote_filter_results.log
write -c addquote_filter_results2.log
var %mfq = $calc(%maxfindquote + 1)
var %findquote_search = $2-
if (($left(%findquote_search,1) == $chr(34)) && ($right(%findquote_search,1) == $chr(34))) {
var %findquote_search = $remove(%findquote_search,$("))
var %findquote_exact_match = 1
}
var %FQsearchloop = 1
while (%FQsearchloop <= 10) {
if (!$gettok(%findquote_search,%FQsearchloop,32)) { var %FQnumtok = $calc(%FQsearchloop - 1) | goto outwhile }
inc %FQsearchloop
}
:outwhile
; echo -a 110Findquote_search = %findquote_search - FQnumtok = %FQnumtok
tokenize 32 %findquote_search
filter -cff quotes.txt addquote_filter_results.log * $+ $1 $+ *
var %FQsearchloop = 1
var %FQsearchtrig = 1
while (%FQsearchloop <= %FQnumtok) {
tokenize 32 %findquote_search
var %FQcurrenttoken = $gettok(%findquote_search,%FQsearchloop,32)
if (%FQsearchtrig == 1) { var %filter_result = addquote_filter_results2.log | var %filter_result2 = addquote_filter_results.log | var %FQsearchtrig = 2 | goto jumpinwhile }
elseif (%FQsearchtrig == 2) { var %filter_result = addquote_filter_results.log | var %filter_result2 = addquote_filter_results2.log | var %FQsearchtrig = 1 }
:jumpinwhile
; echo -a 210FQcurrenttoken = %FQcurrenttoken - FQsearchtrig = %FQsearchtrig - filter_result = %filter_result - filter_result2 = %filter_result2
filter -cff %filter_result2 %filter_result * $+ %FQcurrenttoken $+ *
inc %FQsearchloop
}
var %nbr_findquote_results = $lines(%filter_result)
; echo -a 310nbr_findquote_results = %nbr_findquote_results - filter_result = %filter_result - filter_result2 = %filter_result2
var %FQloop = 0
write -c %filter_result2
while ( %FQLoop < %nbr_findquote_results) {
inc %FQloop
var %read_quote = $read(%filter_result, n, %FQloop)
tokenize 32 %read_quote
if ( $1 != -deleted- ) { write -l $+ %FQloop %filter_result2 $1 $6- }
; echo -a 3bis10 1 = $1 - 2 = $2 - 3 = $3- - filter_result =4 %filter_result
}
; 2ème passe après élimination de la colonne auteur et des infos de quotes effacées
var %FQsearchloop = 1
if %findquote_exact_match { var %FQnumtok = 1 }
while (%FQsearchloop <= %FQnumtok) {
tokenize 32 %findquote_search
var %FQcurrenttoken = $gettok(%findquote_search,%FQsearchloop,32)
if %findquote_exact_match { var %FQcurrenttoken = %findquote_search }
filter -cff %filter_result2 %filter_result * $+ %FQcurrenttoken $+ *
if (%FQsearchtrig == 1) { var %filter_result = addquote_filter_results2.log | var %filter_result2 = addquote_filter_results.log | var %FQsearchtrig = 2 | goto jumpinwhile2 }
elseif (%FQsearchtrig == 2) { var %filter_result = addquote_filter_results.log | var %filter_result2 = addquote_filter_results2.log | var %FQsearchtrig = 1 }
:jumpinwhile2
; echo -a 410FQcurrenttoken = %FQcurrenttoken - FQsearchtrig = %FQsearchtrig - filter_result = %filter_result - filter_result2 = %filter_result2
inc %FQsearchloop
}
var %nbr_findquote_results = $lines(%filter_result2)
; echo -a 510nbr_findquote_results = %nbr_findquote_results - FQcurrenttoken = %FQcurrenttoken - FQsearchtrig = %FQsearchtrig - filter_result = %filter_result - filter_result2 = %filter_result2
unset %quote_summarize
if (%nbr_findquote_results == 0) { .msg botserv say $chan Aucune occurence n'a été trouvée. | goto do_not_process }
elseif (%nbr_findquote_results > 1) { var %quote_summarize = $+ %nbr_findquote_results résultats ont été trouvés : }
elseif (%nbr_findquote_results == 1) {
.msg botserv say $chan $+ %nbr_findquote_results résultat a été trouvé :
var %read_quote = $read(%filter_result2, n, 1)
tokenize 32 %read_quote
var %quote_number = $1 | var %pure_quote = $2-
.msg botserv say $chan $+($([),,%quote_number,,$(])) %pure_quote
goto do_not_process
}
var %FQsumm = 0
while (%FQsumm < %nbr_findquote_results) {
inc %FQsumm
var %read_quote = $read(%filter_result2, n, %FQsumm)
tokenize 32 %read_quote
var %quote_number = $1
var %quote_summarize = $+(%quote_summarize,%quote_number,14,$chr($asc(|)),)
if (($len(%quote_summarize) >= 450) && (%FQsumm < %nbr_findquote_results)) {
.msg botserv say $chan %quote_summarize
unset %quote_summarize
}
}
.msg botserv say $chan %quote_summarize
.msg botserv say $chan Quotes récentes :
var %FQloop = %nbr_findquote_results | var %FQloop2 = 0
inc %FQloop
:findquoteloop
dec %FQloop
inc %FQloop2
var %read_quote = $read(%filter_result2, n, %FQloop)
tokenize 32 %read_quote
var %quote_number = $1 | var %pure_quote = $2-
if ((%FQloop2 < %mfq ) && (%FQloop2 <= %nbr_findquote_results)) { .msg botserv say $chan $+($([),,%quote_number,,$(])) %pure_quote | goto findquoteloop }
goto do_not_process
}
:do_not_process
clearquotesvars
}
; -------------------------------------------------------
; Anti-flood
; -------------------------------------------------------
alias -l floodcontrol {
if ( $calc($eval($+(%,cmdflood.,$1,.,$2,.on))) == 1 ) { clearquotesvars | halt }
if ( $calc($hget($+(cmdflood.,$1,.,$2),0).item ) == 0 ) { set -u $+ $calc($eval(% $+ setcmdflood.time) + 10 ) $+(%,cmdflood.,$1,.,$2,.counter) 1 }
else { inc -u $+ $calc($eval(% $+ setcmdflood.time) + 10 ) $+(%,cmdflood.,$1,.,$2,.counter) }
hadd -mz $+(cmdflood.,$1,.,$2) $calc($eval($+(%,cmdflood.,$1,.,$2,.counter))) %setcmdflood.time
; echo -a items de la hash table (de 1 à 10) : $hget(cmdflood. $+ $1 $+ . $+ $2,1) . $hget(cmdflood. $+ $1 $+ . $+ $2,2) . $hget(cmdflood. $+ $1 $+ . $+ $2,3) . $hget(cmdflood. $+ $1 $+ . $+ $2,4) . $hget(cmdflood. $+ $1 $+ . $+ $2,5) . $hget(cmdflood. $+ $1 $+ . $+ $2,6) . $hget(cmdflood. $+ $1 $+ . $+ $2,7) . $hget(cmdflood. $+ $1 $+ . $+ $2,8) . $hget(cmdflood. $+ $1 $+ . $+ $2,9) . $hget(cmdflood. $+ $1 $+ . $+ $2,10) .
; echo -a cmdflood. $+ $1 $+ . $+ $2 $+ .counter : $calc($eval(% $+ cmdflood. $+ $1 $+ . $+ $2 $+ .counter)) - nombre d'items dans la hash table : $hget(cmdflood. $+ $1 $+ . $+ $2,0).item
; compression de la table
set $+(%,cmdflood.,$1,.,$2,.compress) 0
while ( $calc($eval($+(%,cmdflood.,$1,.,$2,.compress))) < $calc($eval($+(%,cmdflood.,$1,.,$2,.counter))) ) {
inc $+(%,cmdflood.,$1,.,$2,.compress)
if ( !$hget($+(cmdflood.,$1,.,$2),$calc($eval($+(%,cmdflood.,$1,.,$2,.compress))))) {
; echo -a position $calc($eval(% $+ cmdflood. $+ $1 $+ . $+ $2 $+ .compress)) vide
set $+(%,cmdflood.,$1,.,$2,.compress2) $calc($eval($+(%,cmdflood.,$1,.,$2,.compress)))
while ( $calc($eval($+(%,cmdflood.,$1,.,$2,.compress2))) <= $calc($eval($+(%,cmdflood.,$1,.,$2,.counter))) ) {
if ( $hget($+(cmdflood.,$1,.,$2),$calc($eval($+(%,cmdflood.,$1,.,$2,.compress2))))) {
hadd -mz $+(cmdflood.,$1,.,$2) $calc($eval($+(%,cmdflood.,$1,.,$2,.compress))) $hget($+(cmdflood.,$1,.,$2),$calc($eval($+(%,cmdflood.,$1,.,$2,.compress2))))
; echo -a je copie l'item n° $calc($eval(% $+ cmdflood. $+ $1 $+ . $+ $2 $+ .compress2)) en position $calc($eval(% $+ cmdflood. $+ $1 $+ . $+ $2 $+ .compress)) ( valeur : $hget(cmdflood. $+ $1 $+ . $+ $2,$calc($eval(% $+ cmdflood. $+ $1 $+ . $+ $2 $+ .compress2))) )
inc $+(%,cmdflood.,$1,.,$2,.compress)
; echo -a j'efface l'item n° $calc($eval(% $+ cmdflood. $+ $1 $+ . $+ $2 $+ .compress2)) ( valeur : $hget(cmdflood. $+ $1 $+ . $+ $2,$calc($eval(% $+ cmdflood. $+ $1 $+ . $+ $2 $+ .compress2))) )
hdel $+(cmdflood.,$1,.,$2) $calc($eval($+(%,cmdflood.,$1,.,$2,.compress2)))
; echo -a ce qui donne : $hget(cmdflood. $+ $1 $+ . $+ $2,1) . $hget(cmdflood. $+ $1 $+ . $+ $2,2) . $hget(cmdflood. $+ $1 $+ . $+ $2,3) . $hget(cmdflood. $+ $1 $+ . $+ $2,4) . $hget(cmdflood. $+ $1 $+ . $+ $2,5) . $hget(cmdflood. $+ $1 $+ . $+ $2,6) . $hget(cmdflood. $+ $1 $+ . $+ $2,7) . $hget(cmdflood. $+ $1 $+ . $+ $2,8) . $hget(cmdflood. $+ $1 $+ . $+ $2,9) . $hget(cmdflood. $+ $1 $+ . $+ $2,10) .
}
inc $+(%,cmdflood.,$1,.,$2,.compress2)
}
}
}
set -u $+ $calc($eval(% $+ setcmdflood.time) +10 ) $+(%,cmdflood.,$1,.,$2,.counter) $calc($eval($hget($+(cmdflood.,$1,.,$2),0).item))
; echo -a cmdflood. $+ $1 $+ . $+ $2 $+ .counter : $calc($eval(% $+ cmdflood. $+ $1 $+ . $+ $2 $+ .counter)) - nombre d'items dans la hash table : $hget(cmdflood. $+ $1 $+ . $+ $2,0).item
unset $+(%,cmdflood.,$1,.,$2,.compress) | unset $+(%,cmdflood.,$1,.,$2,.compress2)
if ( $calc($eval($+(%,cmdflood.,$1,.,$2,.counter))) >= $calc(%setcmdflood.nbr + 1)) {
if ( $1 == globalquotes ) {
.msg botserv say $chan 14Contrôle de flood activé sur toutes les commandes du système de quotes. Veuillez patienter %globalquotecmdfloodignore secondes avant de pouvoir à nouveau les utiliser.
set -u $+ %globalquotecmdfloodignore $+(%,cmdflood.,$1,.,$2,.on) 1
}
else {
.msg botserv say $chan 14Contrôle de flood activé sur la commande $+(!,$1,.) Veuillez patienter %quotecmdfloodignore secondes avant de pouvoir à nouveau l'utiliser.
set -u $+ %quotecmdfloodignore $+(%,cmdflood.,$1,.,$2,.on) 1
}
clearquotesvars
halt
}
clearquotesvars
return
}
; -------------------------------------------------------
; Backup automatique de la base de quotes
; -------------------------------------------------------
alias -l backupquotes {
.timerbackupquotes off
if ( %quotesbackuprunning ) { return }
set -u120 %quotesbackuprunning 1
if ( !$exists(quotes.txt) ) { goto skipbackup }
if ( !%quotesbackupstatus ) { set %quotesbackupstatus 0 }
if ( %quotesbackupstatus < %quotesbackupnumber ) { inc %quotesbackupstatus }
else { set %quotesbackupstatus 1 }
if ( $exists($var($eval(% $+ quotesbackup $+ $calc($eval(% $+ quotesbackupstatus))),1).value) ) {
.remove -b $var($eval(% $+ quotesbackup $+ $calc($eval(% $+ quotesbackupstatus))),1).value
}
set % $+ quotesbackup $+ $calc($eval(% $+ quotesbackupstatus)) quotes.backup. $+ $gettok($date,1,47) $+ $gettok($date,2,47) $+ $gettok($date,3,47) $+ .txt
.copy -o quotes.txt $var($eval(% $+ quotesbackup $+ $calc($eval(% $+ quotesbackupstatus))),1).value
echo -s ??? Backup de la base de quotes effectué à $time ( $var($eval(% $+ quotesbackup $+ $calc($eval(% $+ quotesbackupstatus))),1).value )
:skipbackup
.timerbackupquotesreset -o 0:02 1 0 quotessetup
}
; -------------------------------------------------------
; Effacement des variables
; -------------------------------------------------------
on 1:UNLOAD:{
unset %maxfindquote | unset %quotes_channels | unset %last_deleted_quote
unset %setcmdflood.addquote | unset %setcmdflood.quote
unset %setcmdflood.quoteinfo | unset %setcmdflood.delquote
unset %setcmdflood.randquote | unset %setcmdflood.lastquote
unset %setcmdflood.findquote | unset %quotecmdfloodignore
unset %quotesbackup* | unset %quotesscriptversion
echo -a Public Quotes System v $+ %quotesscriptversion désinstallé avec succès.
}
alias -l clearquotesvars {
unset %setcmdflood.nbr | unset %setcmdflood.time
; unset %last_deleted_quote
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.