######## Gestion d'aliases (c) Lucas ######## # Ce script est distribué selon la licence qui peut être trouvée sur # http://www.eggdrop-fr.org/licence.html . Respectez-là ! # # Modes (à ajouter avec .chattr): # F : readonly : pas d'ajout / suppression # G : read/write : ajout/suppresion # H : admin : sauvegarde/rechargement/tri # Il faut CUMULER les flags (admin : F+G+H !) # # Historique # 09/02/2001 - v. 1.3 * Un tout petit bug de corrigé : un espace en trop. # 31/01/2001 - v. 1.2 * On peut déclencher plusieurs aliases avec une seule # ligne en les écrivant à la suite. Pareil pour les # destinataires. (merci lara pour l'idée) # ex : !egg !dcc Lucas EggFR # enverra : # Lucas, EggFR: # Lucas, EggFR: # * On peut envoyer les réponses en query (PRIVMSG) en # utilisant § à la place de ! (au dessus du ! sur le # clavier français) # # avant : memory lacks /-: # version (à ne pas changer sauf si vous voulez frimer ...:=) set v "1.3" # nombre d'alias par ligne pour !aliaslist et !aliasfind set aliasesperline 5 # nom du fichier contenant les aliases (ne pas le modifier directement !) set aliasesfile "aliases.db" # Liste des channels sur lequel le script doit être actif set aliaseschans { #chiwette #unreal4ever } ########################################################################### #################################### SCRIPT ############################### ########################################################################### ######### Fonctions qui modifient la DB # Charge la DB (écrase la db précédemment chargée !) proc aliases_load { } { global aliasesdb aliasesfile putlog "Aliases : Chargement de la DB" set fichier [open $aliasesfile r] gets $fichier aliasesdb close $fichier } # Sauvegarde la DB (écrase la db précédemment sauvegardée !) proc aliases_save { } { global aliasesdb aliasesfile putlog "Aliases : Sauvegarde de la DB" set fichier [open $aliasesfile w] puts $fichier $aliasesdb close $fichier } # Trie le contenu de la db, par nom proc aliases_sort { } { global aliasesdb putlog "Aliases : Triage de la DB" set aliasesdb [lsort -ascii -index 0 $aliasesdb] } # Ajoute une entrée à la DB proc aliases_add { nom auteur texte } { global aliasesdb putlog "Aliases : Ajout de $nom par $auteur : $texte" lappend aliasesdb [list $nom $auteur $texte] } # Supprime une entrée de la db proc aliases_del { index } { global aliasesdb putlog "Aliases : suppression de l'entrée $index" set aliasesdb [lreplace $aliasesdb $index $index] } ############## Fonctions qui ne modifient pas la DB # Affiche le contenu de la db (attention : peut flooder) proc aliases_disp { } { global aliasesdb return $aliasesdb } # Recherche une entrée dans la DB, retourne -1 si inconnue proc aliases_search { nom } { global aliasesdb for { set i 0 } { $i<[llength $aliasesdb] } { incr i } { if ![string compare [string tolower [lindex [lindex $aliasesdb $i] 0]] [string tolower $nom]] { return $i } } return -1 } # Recherche des entrées dans la DB selon un masque proc aliases_advsearch { masque } { global aliasesdb set result "" for { set i 0 } { $i<[llength $aliasesdb] } { incr i } { if [string match [string tolower $masque] [string tolower [lindex $aliasesdb $i]]] { lappend result [lindex $aliasesdb $i] } } return $result } # Retourne une entrée de la DB (uniquement le 3ème champ) proc aliases_get { index } { global aliasesdb return [lindex [lindex $aliasesdb $index] 2] } # Retoune une entrée de la DB (tous les champs) proc aliases_info { index } { global aliasesdb return [lindex $aliasesdb $index] } ###### Interface DCC bind dcc G +alias dcc:addalias proc dcc:addalias { handle idx arguments } { set nom [lindex $arguments 0] set auteur $handle set arguments [lrange $arguments 1 end] if ([aliases_search $nom]!=-1) { putdcc $idx "Un alias de ce nom existe déjà" } else { aliases_add $nom $auteur $arguments aliases_sort aliases_save } return 1 } bind dcc G -alias dcc:rmalias proc dcc:rmalias { handle idx arguments } { set index [aliases_search [lindex $arguments 0]] if ($index==-1) { putdcc $idx "Cet alias n'existe pas !" } else { aliases_del $index aliases_save } return 1 } bind dcc G chalias dcc:chalias proc dcc:chalias { handle idx arguments } { set index [aliases_search [lindex $arguments 0]] if ($index==-1) { putdcc $idx "Cet alias n'existe pas !" } else { set auteur "[lindex [aliases_info $index] 1];$handle" set nom [lindex $arguments 0] set arguments [lrange $arguments 1 end] aliases_del $index aliases_add $nom $auteur $arguments aliases_sort aliases_save } return 1 } bind dcc F alias dcc:alias proc dcc:alias { handle idx arguments } { set index [aliases_search [lindex $arguments 0]] if ($index==-1) { putdcc $idx "Cet alias n'existe pas !" } else { putdcc $idx "[aliases_get $index]" } return 1 } bind dcc F aliasinfo dcc:aliasinfo proc dcc:aliasinfo { handle idx arguments } { set index [aliases_search [lindex $arguments 0]] if ($index==-1) { putdcc $idx "Cet alias n'existe pas !" } else { set alias [aliases_info $index] putdcc $idx "Nom : [lindex $alias 0]" putdcc $idx "Auteur : [lindex $alias 1]" putdcc $idx "Texte : [lindex $alias 2]" } return 1 } bind dcc F aliaslist dcc:aliaslist proc dcc:aliaslist { handle idx arguments } { set liste [aliases_disp] putdcc $idx "Nom / Auteur / texte" foreach alias $liste { putdcc $idx "[lindex $alias 0] / [lindex $alias 1] / [lindex $alias 2]" } return 1 } bind dcc F aliasfind dcc:aliasfind proc dcc:aliasfind { handle idx arguments } { set liste [aliases_advsearch $arguments] putdcc $idx "Nom / Auteur / texte" foreach alias $liste { putdcc $idx "[lindex $alias 0] / [lindex $alias 1] / [lindex $alias 2]" } return 1 } bind dcc H aliassave dcc:aliassave proc dcc:aliassave { handle idx arguments } { aliases_save return 1 } bind dcc H aliasload dcc:aliasload proc dcc:aliasload { handle idx arguments } { aliases_load return 1 } bind dcc H aliassort dcc:aliassort proc dcc:aliassort { handle idx arguments } { aliases_sort return 1 } # Interface channel foreach aliaseschan $aliaseschans { bind pubm - "$aliaseschan !*" pubm:alias bind pubm - "$aliaseschan §*" pubm:alias } proc pubm:alias { nick uhost handle channel texte } { set texte [join [split $texte]] set texte [string trim $texte] foreach mot $texte { if [onchan $mot $channel] { lappend destnicks $mot } } if [info exists destnicks] { set destnicksformat "[join [lsort -dictionary $destnicks] ", "]:" set destnicksformat2 [join [lsort -dictionary $destnicks] ","] } else { set destnicksformat "" set destnicksformat2 "" } foreach mot $texte { if !([string compare [string index $mot 0] "!"]&&[string compare [string index $mot 0] "§"]) { set index [aliases_search [string range $mot 1 end]] if ($index!=-1) { if ![string compare [string index $mot 0] "!"] { if [string length $destnicksformat] { putserv "PRIVMSG $channel :$destnicksformat [join [aliases_get $index]]" } else { putserv "PRIVMSG $channel :[join [aliases_get $index]]" } } else { if [string length $destnicksformat2] { putserv "PRIVMSG $destnicksformat2 :[join [aliases_get $index]]" } } } } } return 1 } foreach aliaseschan $aliaseschans { bind pubm - "$aliaseschan !aliaslist*" pubm:aliaslist } proc pubm:aliaslist { nick uhost handle channel texte } { pubm:listeralias $nick [aliases_disp] return 1 } foreach aliaseschan $aliaseschans { bind pubm - "$aliaseschan !aliasfind*" pubm:aliasfind } proc pubm:aliasfind { nick uhost handle channel texte } { if [llength $texte]>1 { set result [aliases_advsearch [lindex $texte 1]] if [llength $result] { pubm:listeralias $nick $result } else { puthelp "NOTICE $nick :Aucun alias trouvé pour [lindex $texte 1]" } } else { puthelp "NOTICE $nick :!aliasfind " } return 1 } # Proc affichant les alias sur une ligne, en notice proc pubm:listeralias { nick liste } { global aliasesperline set longueur_liste [llength $liste] for { set i 0 set sortie "" set nbaliasline 0 } { $i<$longueur_liste } { incr i incr nbaliasline } { if $nbaliasline==$aliasesperline { putserv "NOTICE $nick :$sortie" set nbaliasline 0 set sortie "" } lappend sortie [lindex [lindex $liste $i] 0] } if [llength $sortie] { putserv "NOTICE $nick :$sortie" } } ########################################################################### ################################ INITIALISATION ########################### ########################################################################### # si le fichier n'existe pas, le créer if ![file exists $aliasesfile] { set fichier [open $aliasesfile w] close $fichier } if ![info exists antirehashreloadaliasesdb] { aliases_load set antirehashreloadaliasesdb 1 } putlog "Aliases v.$v par Lucas loaded"