Alternative à getchanmode car celui-ci ne voit que les modes du RFC1459
#1
Démonstration
Code :
getchanmodes #testchan
Tcl: +Ctrn
* MenzAgitat sets mode: +mQS
getchanmodes #testchan
Tcl:+mCtrn

Dans cet exemple, on voit que les modes Q et S sont complètement ignorés par getchanmode.
Voici donc une méthode alternative pour récupérer les modes d'un chan.

Variable à déclarer
tcl
array set getchanmodes_session {}



Ceci est à mettre à l'endroit où l'on veut récupérer les modes d'un chan
tcl
	variable getchanmodes_session([md5 $chan]) [::tcl::dict::create "variable1" $variable1 "variable2" $variable2]
	putserv "MODE $chan"
}


Ajoutez au dict toutes les variables que vous pourriez avoir besoin de récupérer après avoir reçu les modes du chan.
$variable1 et $variable2 ne sont là que pour l'exemple.

Vous devez terminer la procédure à cet endroit, comme l'indique le } que j'ai volontairement ajouté à la fin, puisqu'on attend de connaître les modes du chan avant de continuer.

Ajoutez ensuite cette procédure qui s'occupera de réceptionner la réponse du serveur
tcl
proc getchanmodes {sender raw data} {
	variable getchanmodes_session
	set chan [lindex $data 1]
	set chan_hash [md5 $chan]
	if { [::tcl::info::exists getchanmodes_session($chan_hash)] } {
		set variable1 [::tcl::dict::get $getchanmodes_session($chan_hash) "variable1"]
		set variable2 [::tcl::dict::get $getchanmodes_session($chan_hash) "variable2"]
		unset getchanmodes_session($chan_hash)
		set chanmodes [join [lrange [split $data] 2 end]]
		suite_des_operations $chan $chanmodes $variable1 $variable2
	}
}


Cette procédure récupère les modes qu'on a demandé et appelle la proc suite_des_operations qui contient la suite de votre code, en lui passant en paramètre $chanmodes (qui contient les modes que l'on souhaitait connaître), ainsi que les autres paramètres que vous aurez éventuellement choisi de transmettre d'une proc à une autre comme $arg1, $arg2, ...

Pour finir, vous devez ajouter ce bind
tcl
bind raw - 324 getchanmodes



Source : http://www.boulets.oqp.me/tcl/routines/t...-0017.html
  Répondre   Avertir
#2
Salut,

Code très sympatique ! Je pense l'inclure dans un namespace prochainement.
Mais une question me trotte, Pourquoi l'utilisation du md5 pour la conversion ?
  Répondre   Avertir
#3
 
La conversion ?
Le MD5 sert à obtenir un hash à partir du nom du chan, qui est ensuite utilisé comme identificateur de session.
 
  Répondre   Avertir
#4
C'est à dire ?
"Désoler pas trop compris le système", l'histoire du hash à partir du nom du chan..
  Répondre   Avertir
#5
 
Admettons que :
- le script est utilisé sur plusieurs chans en même temps
- plusieurs requêtes sont envoyées au serveur presque au même moment pour interroger les modes du chan

L'Eggdrop va envoyer plusieurs requêtes et recevoir plusieurs réponses après quelques instants.

Pour savoir quelle réponse du serveur correspond à quelle requête envoyée, l'Eggdrop crée une session associée à chaque requête.
La session reste ouverte tant que la réponse attendue n'a pas été reçue.
Chaque session est identifiée par le nom du chan duquel la requête provient.

Pour garder en mémoire ces sessions, je définis un array.
Comme les arrays n'aiment pas trop les caractères spéciaux dans les noms de clés et que le nom d'un chan peut contenir des caractères spéciaux, je crée un hash MD5 à partir du nom du chan (car je suis sûr que ce hash ne contiendra rien d'autre que des caractères alphanumériques), et je l'utilise comme identificateur de session.
 
  Répondre   Avertir
#6
D'accord, oui la c'est beaucoup plus clair !
J'ai compris ce que tu veut dire, et ce que cela sert.

Merci de cette explications, en effet c'est même mieux comment tu as fait.
Sa correspond vraiment à ce que je recherche.

Merci pour tout Menz Smile
  Répondre   Avertir


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)