Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


Rendre un eggdrop insensible aux codes de contrôle
#1
Ce petit bout de code permet de passer outre les codes de contrôle (couleurs, gras, ...) dans les lignes qu'il reçoit, ce qui est fort intéressant pour les commandes de type PUB et MSG.


tcl
unbind raw - PRIVMSG *raw:irc:msg
unbind raw - PRIVMSG *raw:PRIVMSG
bind raw - PRIVMSG striprivmsg
proc striprivmsg {f k a} {
  set a [stripcodes * $a]
  *raw:irc:msg $f $k $a
  *raw:PRIVMSG $f $k $a
}


Note 1 : ceci affecte entièrement l'eggdrop, donc les scripts fait pour éviter l'abus de couleurs ne fonctionneront plus
Note 2 : si vous avez un eggdrop (très) ancien, vous pouvez remplacer set a [stripcodes * $a] par set a [stripcodes abcgru $a]

Cette astuce vient de egghelp.org, je vous invite à lire http://forum.egghelp.org/viewtopic.php?t=19880 et http://forum.egghelp.org/viewtopic.php?t=12944
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
  Reply
#2
(08/09/2021, 09:40)CrazyCat Wrote: Ce petit bout de code permet de passer outre les codes de contrôle (couleurs, gras, ...) dans les lignes qu'il reçoit, ce qui est fort intéressant pour les commandes de type PUB et MSG.


tcl
unbind raw - PRIVMSG *raw:irc:msg
unbind raw - PRIVMSG *raw:PRIVMSG
bind raw - PRIVMSG striprivmsg
proc striprivmsg {f k a} {
  set a [stripcodes * $a]
  *raw:irc:msg $f $k $a
  *raw:PRIVMSG $f $k $a
}


Note 1 : ceci affecte entièrement l'eggdrop, donc les scripts fait pour éviter l'abus de couleurs ne fonctionneront plus
Note 2 : si vous avez un eggdrop (très) ancien, vous pouvez remplacer set a [stripcodes * $a] par set a [stripcodes abcgru $a]

Cette astuce vient de egghelp.org, je vous invite à lire http://forum.egghelp.org/viewtopic.php?t=19880 et http://forum.egghelp.org/viewtopic.php?t=12944

Très bien vu,
Cela fais un certains temps que je réfléchis sur un problème récurant :
Les couleurs pour les binds: PUB/MSG/PUBM/MSGM
Je suis confronter très régulièrement a devoir 'catch' du textes colorer et il y a toujours les même problèmes savoir comment réaliser le déclenchement proprement  et de manière sûr.

Quand tu arrive a faire des choses comme des PUBM "*" et [stripcodes * $text] pour après vérifié que ta un [binds] existant sans couleurs  ... ca deviens vite le bordel, pour cité qu'un exemple, dont to code fait pareil mais peut-être de manière plus radicale.

Personnellement, je pense qu'il faut proposer quelque chose a eggheads pour pouvoir utiliser les PUB/MSG/PUBM/MSGM sans couleurs directement. soi des binds qui remove auto ( stripcodes ), soit un argument a ceux existant. Ou une autre approche qui permet le déclenchement sans format de style facilement. L'avantage est que ca l'influencera pas l'intégralité de l'eggdrop.
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply
#3
Petit changement depuis la version 1.9.3 : il s'agit maintenant du bind RAWT (raw avec tag), la procédure est désormais:

tcl
unbind rawt - PRIVMSG *rawt:irc:msg
unbind rawt - PRIVMSG *rawt:PRIVMSG
bind rawt - PRIVMSG striprivmsg
proc striprivmsg {from key text tag} {
  set text [stripcodes * $text]
  *rawt:irc:msg $from $key $text $tag
  *rawt:PRIVMSG $from $key $text $tag
}

irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
  Reply
#4
Pour info, ceci est désormais corrigé (dans la version devel, pas encore dans la nature) et les anciens binds fonctionnent (les rawt non ;))
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
  Reply
#5
Hello tous.
Personnellement j'utilise une autre approche, qui consiste à :
faire un dict {commande proc ...}
faire un bind pubm - * [namespace current]::stripProc; #qui strip tous les codes dans la commande mais les conserve pour les arguments
(ça utilise donc le dict créé pour faire le lien commande/proc à lancer, logique).

Ça fonctionne assez bien, c'est limité au namespace, et ça me permet de faire des news avec mise en forme, par exemple.
  Reply
#6
Un exemple de code fonctionnel aiderait probablement à la compréhension de ton approche.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
  Reply
#7
Oui.
Voilà ce que j'utilise (les proc sont dans un tcl à part chez moi).
Et désolé si ça n'est pas très très propre...
En tout cas, ça me filtre bien au niveau de la commande, et conserve la mise en forme du reste, si elle change par rapport au début de ligne évidemment.
Dans l'exemple, j'ai pris mes news toutes bêtes, parce que ça illustre bien l'idée => on conserve bien les codes mis dans le texte donné.

tcl
proc varexists name {
  return [info exists [namespace current]::$name]
}
proc getvar {name} {
  if {![varexists $name]} {
    return 0
  }
  namespace upvar [namespace current] $name tmp
  return $tmp
}
proc stripAllCodes str {
  return [stripcodes * $str]
}
proc argsList argument {
  set argument [string map {\{ "" \} "" \" \\\"} $argument] # " ici pour la coloration syntaxique
  if {![string is list $argument]} {
    set argument [split [lindex $argument 0]]
  }
  return $argument
}
proc filterPubBindz {nick user handle chan args} {
  return [core_filterPubBindz "pubbindz" $nick $user $handle $chan $args]
}
proc core_filterPubBindz {bindzNames nick uhost handle chan args} {
  set orig [argsList $args]
  set args [argsList [stripAllCodes $args]]
  set cmd [lindex $args 0]
  set bindz [getvar $bindzNames]
  if {! [::tcl::dict::exists $bindz $cmd]} {
    return 1
  }
  set i [lsearch $orig $cmd]
  if {$i==-1} {
    set i 0
  }
  set orig [lreplace $orig 0 $i]
  set procz [::tcl::dict::get $bindz $cmd]
  if {$procz != ""} {
    return [$procz $nick $uhost $handle $chan $orig]
  }
  return 1
}
variable pubbindz [::tcl::dict::create !helpnews help !news read !delnews del !addnews send !modnews mod]
bind pubm - * [namespace current]::filterPubBindz

  Reply
#8
(28/10/2022, 13:20)MeNearly Wrote: Et désolé si ça n'est pas très très propre...
Mes petits conseils/remarques (contructif) :

tcl
proc varexists name {
  return [info exists [namespace current]::$name]
}
proc getvar {name} {
  if {![varexists $name]} {
    return 0
  }
  namespace upvar [namespace current] $name tmp
  return $tmp
}

Pour faire plus propre, peut-être nommer en commençant par Var et puis l'action (le  verbe) Exists, Get.
Tu mets des accolades pour getvar à {name} et pas à  varexists. respecte un seul "style de code"
Je ne suis pas sûr de la raison de l'emploi du namespace dans ces deux fonctions, je me permet de transcrire comme je pense le mieux:


tcl
proc VarExists name { 
  variable [set name]; 
  return [info exists $name] 
}
proc VarGet name {
  if {![VarExists $name]} { return 0; }
  variable [set name];
  return [set $name]
}



tcl
proc argsList argument {
  set argument [string map {\{ "" \} "" \" \\\"} $argument] # " ici pour la coloration syntaxique
  if {![string is list $argument]} {
    set argument [split [lindex $argument 0]]
  }
  return $argument
}

J'ai un peu de mal avec ton string map ainsi que son commentaire. je ne comprends pas la relation avec la coloration


tcl
set argument [string map {\{ "" \} "" \" \\\"} $argument

pour moi devrais être :

tcl
set argument [string map { "\{" ""  "\}" "" "\\" "\\\" } $argument

si le but est d'enlever les {,} et doubler les \ ?

tcl
  if {![string is list $argument]} {
    set argument [split [lindex $argument 0]]
  }

Quand je lit ceci:
Si $argument n'ai pas une liste alors on le prend l'élément zéro de la Liste et on le split (en liste?)

Quelque chose ne va pas. à savoir que "lindex" par définition agit sur une liste (d'où le "L" de "lindex")



tcl
proc core_filterPubBindz {bindzNames nick uhost handle chan args} {
  set orig [argsList $args]
  set args [argsList [stripAllCodes $args]]
  set cmd [lindex $args 0]
  set bindz [getvar $bindzNames]
  if {! [::tcl::dict::exists $bindz $cmd]} {
    return 1
  }
  set i [lsearch $orig $cmd]
  if {$i==-1} {
    set i 0
  }
  set orig [lreplace $orig 0 $i]
  set procz [::tcl::dict::get $bindz $cmd]
  if {$procz != ""} {
    return [$procz $nick $uhost $handle $chan $orig]
  }
  return 1
}

Je ne comprends pas tout, tu pourrais un peu commenter le code ?


tcl
variable pubbindz [::tcl::dict::create !helpnews help !news read !delnews del !addnews send !modnews mod]

Cette variable est appeler quand ? C'est relation avec tes dict ?
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply
#9
Hello,
Alors très rapidement.
Pour ça que tu proposes,

Code:
set argument [string map { "\{" ""  "\}" "" "\\" "\\\" } $argument
Non ça ne peut pas fonctionner, le but étant de remplacer les " par des \" (ton "\\\" est une chaîne de caractère non terminée...)
et le commentaire ajoutait un " pour que le nombre en soit pair sur la ligne (pour la coloration syntaxique, donc !).

Ensuite, en effet c'est un peu bête de mettre un coup name et l'autre {name} (d'autant que je n'aime pas ^^).
Pour ce qui est de mettre des majuscules, pourquoi pas, par contre varExists est construit sur le même modèle que tous les fileExists du monde...
Je lirai les autres modifications liées aux variables plus tard.

Enfin, oui, le dict est utilisé dans la proc core_filterPubBindz, elle fait le lien entre le nom de la commande et le nom de la proc.

Voilà pour le moment.
Mais en tout état de cause, ça fonctionne tranquille chez moi, je donnais juste un aperçu de comment je fais pour me débarrasser des codes dans les commandes, tout en les conservant pour les arguments...

À plus tard.
  Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Convertir des codes de style mIRC en HTML MenzAgitat 0 3,633 11/10/2013, 00:31
Last Post: MenzAgitat

Forum Jump:


Users browsing this thread: 1 Guest(s)