|
Pages: [1]
|
 |
|
Auteur
|
Sujet: Aide scripting (Lu 3026 fois)
|
Simon``
Citoyen(ne)
 
EpiKarma : +5/-2
Hors ligne
Messages: 57
=D
|
Bonjour les scripteurs :] Bon en fait comme je galère à me faire un tit code, je me demandais si il y avait moyen de demander de l'aide ici, car j'ai essayé de demander sur #scripts, mais j'ai beaucoup de mal à expliquer ce que je veux faire :s Donc voila, je demande l'erreur que j'ai fait sur ce code: dialog kick { title "Acharn Kick" size -1 1 250 200 box "Acharn Kick",1, 5 5 240 190 list 2, 10 25 30 172 list 3, 42 25 200 172 } on *:dialog:kick:init:3:{ nicklost } alias nicklost { var %i = 1 while $nick($iif($chan($active),$active,$chan(1)),%i) { did -a kick 3 $nick($iif($chan($active),$active,$chan(1)),%i) inc %i } } Donc voici le screen de ce que je voudrais que ca donne... => ICI <=Voila j'espère qu'avec ca, j'ai réussi à expliquer ^^ Et si ce topic ne sert à rien, vous pouvez supprimer  PS: z'êtes pas obligés de lire derrière c_c
|
|
|
|
|
Journalisée
|
|
|
|
Kitai
Citoyen(ne)
 
EpiKarma : +16/-1
En ligne
Messages: 126
Ga is Ga
|
Ga, Bien, la principale erreur est le "3" dans le "on ... init". Lorsqu'un dialog se lance, il ne fait référence à aucun contrôle en particulier, donc $did == 0 (il me semble...) Bref, il faudrait faire : on *:dialog:kick:init:*:{ Ensuite au lieu de reprendre le membre de la while comme tu fais, utilise $ifmatch ou $v1 (si $version >=6.16) Pis voilà, ça doit être à peu près tout je pense...
|
|
|
|
|
Journalisée
|
Les gens qui disent "Ma maison a moi, c'est le monde", je m'demande de quel pays y s'servent pour les chiottes. ©NUNUS
|
|
|
|
CoolWave
|
Salut Simon``, Hormis le soucis d'ID dans la déclaration de l'évènement, il y a un problème dans la condition in-line $iif() mIRC possède un "comparateur" qui permet de vérifier si une fenêtre est un salon ou non: ischan
$iif($active ischan,$active,$chan(1)) Autre petite chose, tu peux utiliser $dname pour retourner le nom du dialog associé à un évènement On Dialog, ou dans un alias appelé à partir d'un tel évènement. Cela évite de devoir saisir le nom exact à chaque fois et si tu modifies le nom de ton dialog tu n'auras pas besoin de le remplacer partout, $dname s'adaptera. A part cela tout semble correct, l'utilisation du $v1/$ifmatch dans le ligne /did conseillée par Kitai te fera également gagner du temps (mIRC mémorise les valeurs des membres des conditions dans $v1 et $v2, évitant ainsi de devoir les recalculer (ou dans $ifmatch, qui dans les anciennes versions renvoyait le 1er terme de la condition s'il y en a qu'un seul, ou le 2ème s'il y en a deux)). Sinon, une alternative à ta boucle pourrait être l'utilisation de la commande /filter:
Celle-ci permet d'envoyer toute la nicklist du salon dans l'ID 3 de ton dialog (10 à 30 fois plus rapide que la /while que tu utilises) -w signifie que l'on filtre à partir d'une fenêtre (le salon ici), -l pour que ça prenne en compte la nicklist et non le texte sur le salon, -o signifie que l'on envoie les données à un dialog & son ID et -c efface le contenu de l'ID du dialog avant de le remplir (dans un On Dialog Init c'est pas utile en soit)
alias nicklost filter -wloc $iif($active ischan,$active,$chan(1)) $dname 3 *
L'inconvénient de la commande ci-dessus est que les modes @%+ restent devant le pseudo. Pour une gestion de kick ce n'est pas spécialement intéressant. L'alternative de cette commande serait alors d'utiliser un 2ème alias. La commande /filter envoie cette fois toutes les lignes de la nicklist à l'alias nicklost_load qui les charge dans le dialog kick après leur avoir retiré les prefix (2 fois plus rapide qu'une /while ici) :
alias nicklost filter -wckl $iif($active ischan,$active,$chan(1)) nicklost_load alias nicklost_load did -a kick 3 $remove($1,@,%,+)
Voila pour quelques idées, l'utilisation de la commande /filter est juste un gain de temps d'exécution & de taille du code, mais la /while de base peut faire l'affaire toutefois (préférence pour /filter si tu mets à jour ton dialog sur des grands salons) Bonne journée 
|
|
|
|
|
Journalisée
|
|
|
|
Simon``
Citoyen(ne)
 
EpiKarma : +5/-2
Hors ligne
Messages: 57
=D
|
OWi ca marche  ( quel con j'ai été -_- ) Sinon, j'ai fait tout ce que vous m'avez conseillé, j'ai changé tout, même si j'ai pas trop trop encore compris (merci pour le tuto CoolWave  ) Bon, maintenant, j'ai un problême de commandes, je donne le code... on *:dialog:kick:sclick:4:{ !rk $did(3).seltext $did(2).seltext }
on *:input:*:{ if ($1 == !Multikick) { var %i = 1 | while (%i <= $chan(0)) { if ($2 ison $chan(%i)) && ($me isop $chan(%i)) { kick $chan(%i) $2 4Multi4Kick } inc %i } } if ($1 == !rk) && ($3 != $null) { .timerrk [ $+ [ $2 ] ] 1 120 unset %rk-c [ $+ [ $2 ] ] | set %rk-n [ $+ [ $2 ] ] $2 | set %rkn [ $+ [ $2 ] ] $3 set %rk-c [ $+ [ $2 ] ] $chan | kick %rk-c [ $+ [ $2 ] ] %rk-n [ $+ [ $2 ] ] Plus que $calc(%rkn - 1) Kicks | dec %rkn } } on *:join:#:{ if ($chan == %rk-c [ $+ [ $nick ] ] ) { if ($nick == %rk-n [ $+ [ $nick ] ]) { kick %rk-c [ $+ [ $nick ] ] %rk-n [ $+ [ $nick ] ] Plus que $calc(%rkn [ $+ [ $nick ] ] - 1) kicks | dec %rkn [ $+ [ $nick ] ] } if (%rkn [ $+ [ $nick ] ] == 0) { unset %rk-n [ $+ [ $nick ] ] | unset %rk-n [ $+ [ $nick ] ] | unset %rk-c [ $+ [ $nick ] ] } } } Donc voila, je sais pas quoi mettre pour que quand je click sur mon bouton, ca fasse la commande !rk $nick "nombre de kicks"... J'espère que j'ai réussi à expliquer ^^ Deja je suis sur et certain que l'erreur est ici : (au niveau de !rk ...) on *:dialog:kick:sclick:4:{ !rk $did(3).seltext $did(2).seltext } Merci encore. [Edit] J'ai eu la solution de l'erreur, il suffisait d'ajouter editbox -n avant le !rk  Sinon, le problême maintenant, c'est ça: .oOo. Erreur : Plus : Pseudo introuvable Et j'ai presque aucunes idée d'où ca peut venir... Je dirais ici :on *:join:#:{ if ($chan == %rk-c [ $+ [ $nick ] ] ) { if ($nick == %rk-n [ $+ [ $nick ] ]) { kick %rk-c [ $+ [ $nick ] ] %rk-n [ $+ [ $nick ] ] Plus que $calc(%rkn [ $+ [ $nick ] ] - 1) kicks | dec %rkn [ $+ [ $nick ] ] } Voila...
|
|
|
|
« Dernière édition: 12 Mars 2006, 22:18:21 par Simon`` »
|
Journalisée
|
|
|
|
|
CoolWave
|
Salut Simon```, Ton problème avec le "pseudo introuvable" vient du fait que tu as créé une variable %rkn [ $+ [ $2 ] ] et pour avoir sa valeur tu utilisais %rk-n [ $+ [ $2 ] ] (le '-' en trop/moins). Par la suite tu utilisais également %rkn sans lui ajouter le $2 (pour le nombre de kicks dans les /dec) Je te propose une idée de code, introduisant l'identifieur $comchan pour les boucles sur les salons communs, une alternative à l'utilisation de /timer pour effacer une variable via la commande /set -uN, l'utilsation de ELSEIF, des prefix d'évènements, une manière de limiter le nombre de variables créées, entre autre.. (chez moi les balises Code/Quote ne sont pas super lisibles :/)
[table][tr][td] on *:dialog:kick:sclick:3:{
; - le $iif() permet de vérifier si la fenêtre active est bien un salon. ; - Mettre des $$ à la place des $ a une utilité particulière : si l'identifieur ( ici les deux $did() et $iif() ) ne retourne pas ; de valeur, alors l'évènement est arrêté : la ligne n'est pas exécutée, et tout le code qui peut la suivre non plus. ; Donc ici si tu cliques sur l'ID 4 alors que l'un des $did (ou les 2) n'a pas de valeur, ou bien que la fenêtre active n'est pas ; un salon, alors /editbox ne sera pas exécuté. editbox -n $$iif($active ischan,$active) !rk $$did(3).seltext $$did(2).seltext
}
on *:input:*:{
; 1ère CONDITION if ($1 == !Multikick) {
; Il existe un $identifieur permettant de retourner les salons communs avec une personne : ; $comchan(<pseudo>,N), qui retourne le Nème salon commun et évite ainsi d'utiliser $chan(N) + ison
var %i 1
; Tant qu'il existe un %ième chan commun, alors la boucle se poursuit while ($comchan($2,%i)) {
; Comment on l'a vu dans un poste au dessus, mIRC stocke dans $v1 et $v2 les termes de la dernière condition. ; Ici $v1 retourne le nom du salon retourné par $comchan() dans la ligne /while au dessus, ; et après la nouvelle condition $v2 stocke le 2ème terme de la condition ISOP, qui est le nom du salon. if ($me isop $v1) { kick $v2 $2 4Multi4Kick }
inc %i } }
; 2ème CONDITION :
; - Quand tu ajoutes une condition, au lieu de mettre IF (SI) tu peux mettre ELSEIF (SINON SI) dans le cas où ; cette condition n'a pas à être exécutée si l'une des précédentes l'a déjà été. (Si $1 = !multikick, alors il est impossible que $1 ; soit également = à !rk). Cela évite à mIRC de lire chaque condition inutilement. Dès que l'une d'elles est exécutée ; alors les suivantes commençant par ELSEIF ne seront pas lues. (gain de rapidité) ; - Etant donné que tu exécutes un /kick il faut vérifier que tu aies bien le statût nécessaire. elseif ($1 == !rk) && ($me isop $chan) {
; - Ci dessous le code est différent du tien. Au lieu d'utiliser 3 variables, on en utilise une seule, de la forme : ; %rk-<salon>-<pseudo>, et on y stocke comme valeur le nombre de kick soumis. ; - Utiliser /set avec comme flag -uN permet de créer une variable temporaire de N secondes, qui s'efface tout seule donc. ; - Au lieu de mettre ($3 != $null) dans la condition au dessus, on peut utiliser $$3 ici (qui arrête le script si $3 n'existe pas)
; - Utiliser $+(mot1,mot2,mot3) revient à faire mot1 $+ mot2 $+ mot3. C'est plus rapide à taper, et plus simple à déchiffrer. ; Attention : quand on utilise $+() avec des variables, il est important de bien mettre le % à part : $+(%,mot1,mot2) ; Le nom de variable est donc optenu, ici, en faisant $+(%,rk-,<salon>,-,<pseudo>) (ex: %rk-#Scripts-Simon``) ; Sa valeur en revanche necessite l'utilisation de $eval(<variable>,2) : $eval($+(%,rk-,<salon>,-,<pseudo>),2) ; L'identifieur $eval peut-être écrit également avec un simple $ : $($+(%,rk-,<salon>,-,<pseudo>),2), comme on le fera.
; ici c'est donc le NOM de la variable qui est utilisé (sans $/$eval ) set -u120 $+(%,rk-,$chan,-,$2) $$3
; on diminue la valeur de la variable (dans /set, /dec, /inc et /unset, l'évaluation n'est pas necessaire en général, ; il faut donner le NOM de la variable, et pas sa VALEUR) dec $+(%,rk-,$chan,-,$2)
; On kick la personne du salon, avec comme raison le nombre de kicks restants ; (nom de variable avec $+() pour accolé tous les mots, associé à $(,2) pour récupérer la valeur) kick $chan $nick Plus que $($+(%,rk-,$chan,-,$2),2) Kicks
} }
; - Mettre @ devant l'évènement impose que tu sois OP sur le salon pour que le code soit lu. ; - Le ! impose quant à lui que le code soit lu seulement si c'est une autre personne que toi qui entre sur le salon. ; - 2 choix possibles de manière de coder, niveau "lisibilité":
; Le 1er, avec des $+() et $($+(),2) partout
on @!*:join:#:{
; Si la variable %rk-$chan-$nick a une VALEUR, alors on exécute le code (c'est que les 120 secondes ne se sont ; pas écoulées ou que la valeur n'est pas encore arrivée à 0 donc) if ($($+(%,rk-,$chan,-,$nick),2)) {
; On diminue la valeur de la variable (en donnant à /dec son NOM) dec $+(%,rk-,$chan,-,$nick)
; on kicke la personne, en affichant la VALEUR de la variable kick $chan $nick Plus que $($+(%,rk-,$chan,-,$nick),2) Kicks
; Si la VALEUR n'existe pas (égale à 0 donc), on efface la variable sans attendre que /set le face lui même au ; bout des 120 secondes. (on utilise donc son NOM, dans /unset) if (!$($+(%,rk-,$chan,-,$nick),2)) unset $+(%,rk-,$chan,-,$nick)
} }
; Le 2ème, où on va stocker le nom de la variable dans %x, pour que ça soit plus "lisible" à la relecture. on @!*:join:#:{
; On stocke dans %x le NOM de la variable : %rk-$chan-$nick (ex: %rk-#Scripts-Simon``) var %x $+(%,rk-,$chan,-,$nick)
; On vérifie si la VALEUR existe (pas la valeur de %x, mais la valeur de la variable dont le nom est dans %x, ; en l'occurence le nombre de kicks contenu dans la variable %rk-* if ($(%x,2)) {
; On diminue %x. Ici c'est particulier, on fait un $eval() tout court (qui correspond à un $eval(,1)) ; Ca informe mIRC qu'il faut prendre la VALEUR de la variable %x, mais sans l'évaluer, ; ça renvoit donc le NOM de la variable %rk-*, sans en donner pour autant sa VALEUR (le nombre de kick) ; Si on oublie le $(), alors c'est %x qui est diminué, et non pas %rk- (ce qui sert à rien ici car c'est pas notre but) dec $(%x)
; On kicke la personne du salon, en affichant cette fois la VALEUR de la variable dont le NOM est dans %x (eheh !) ; (la VALEUR de %rk-* donc) kick $chan $nick Plus que $(%x,2) Kicks
; Si la valeur de la variable %rk- n'existe pas, on efface la variable. Le $() force mIRC à effacer %rk-*. ; Si on ne met pas $() alors c'est %x qui est effacé. if (!$(%x,2)) unset $(%x) }
}
[/td][/tr][/table]
En espérant que tu y vois plus clair, et que ça te sois utile  (et que je n'ai pas laissé quelques bugs s'installer ^^) N'hésite pas à passer sur #Scripts si tu te poses de nouvelles questions, s'il y a des personnes de libre et aptent à te donner un coup de pouce elles le feront certainement avec plaisir, et de manière commentée également.
|
|
|
|
« Dernière édition: 13 Mars 2006, 15:51:01 par CoolWave »
|
Journalisée
|
|
|
|
Simon``
Citoyen(ne)
 
EpiKarma : +5/-2
Hors ligne
Messages: 57
=D
|
Owi ca marche presque xD un grand merci à toi  j'en aprrends beaucoup là  Petit problême, c'est que ça kick celui qui fait la commande, et non celui qui la subit  Et je met le résultat de mon code, au cas ou j'ai pas mit ce qu'il fallait... dialog kick { title "Multi Kick" size -1 1 260 225 box "Multi Kick",1, 2 5 255 190 list 2, 8 25 40 172 list 3, 52 25 200 172 button "Kicker" 4, 25 200 70 20 button "Annuler" 5, 150 200 70 20, ok } on *:dialog:kick:init:*:{ nicklost numlost } alias nicklost filter -wloc $iif($active ischan,$active,$chan(1)) $dname 3 * alias nicklost filter -wckl $iif($active ischan,$active,$chan(1)) nicklost_load alias nicklost_load did -a kick 3 $remove($1,@,%,+) alias numlost { var %i = 1 while (%i <= $lines(scripts/kick.txt)) { did -a kick 2 $read(scripts/kick.txt,%i) inc %i } }
on *:dialog:kick:sclick:4:{ editbox -n $$iif($active ischan,$active) !rk $$did(3).seltext $$did(2).seltext } on *:input:*:{ if ($1 == !Multikick) { var %i 1 while ($comchan($2,%i)) { if ($me isop $v1) { kick $v2 $2 4Multi4Kick } inc %i } } elseif ($1 == !rk) && ($me isop $chan) { set -u120 $+(%,rk-,$chan,-,$2) $$3 dec $+(%,rk-,$chan,-,$2) kick $chan $nick Plus que $($+(%,rk-,$chan,-,$2),2) Kicks } } on @%!*:join:#:{ if ($($+(%,rk-,$chan,-,$nick),2)) { dec $+(%,rk-,$chan,-,$nick) kick $chan $nick Plus que $($+(%,rk-,$chan,-,$nick),2) Kicks if (!$($+(%,rk-,$chan,-,$nick),2)) unset $+(%,rk-,$chan,-,$nick) } } on @%!*:join:#:{ var %rk-#Kick $+(%,rk-,$chan,-,$nick) if ($(%rk-#Kick,2)) { dec $(%rk-#Kick) kick $chan $nick Plus que $(%rk-#Kick,2) Kicks if (!$(%rk-#Kick,2)) unset $(%rk-#Kick) } } Par contre, si je veux kicker les pseudo +,% ou @, ca me met: Pour un voice : !rk +pseudo nombre de kicks Pour un halfop : !rk %pseudo nombre de kicks Pour un op : !rk @pseudo nombre de kicks J'ai essayé un peu vers on *:dialog:kick:sclick:4:{ editbox -n $$iif($active ischan,$active) !rk $$did(3).seltext $$did(2).seltext } Mais j'ai pas trouvé où c'était  Sinon, le code de kick, c'est pas moi qui l'ai fait, je suis pas assez expérimenté pour ça  j'essaie simplement d'en faire un dialog...
|
|
|
|
|
Journalisée
|
|
|
|
Kitai
Citoyen(ne)
 
EpiKarma : +16/-1
En ligne
Messages: 126
Ga is Ga
|
Dans un événement, $nick se réfère en général au déclencheur de cet événement, plus souvent à celui qui agit qu'à celui qui subit. Dans ton cas, il y a un on input dans lequel tu (CoolWave ^^) a utilisé $nick pour désigner la personne à kicker. C'est sûrement un réflexe qui est ici une erreur, car, en effet, la commande a ce format "!rk pseudo raison", et donc pseudo correspondra au membre $2 dans le on input. Il faut donc remplacer la ligne : kick $chan $nick Plus que $($+(%,rk-,$chan,-,$2),2) Kicks par : kick $chan $2 Plus que $($+(%,rk-,$chan,-,$2),2) Kicks
Et aussi, regarde bien ton code : tu as deux aliases nommés nicklost. Par défaut, mIRC prend le premier entré dans le fichier remote, et n'exécute que celui-ci. Si CoolWave t'en a donné deux, c'est à titre de comparaison, pour te montrer que le deuxième était plus efficace, car en appelant l'alias nicklost_load, il permet de supprimer les caractères "+","%" et "@" devant les pseudonymes. Tu dois donc supprimer le premier alias nicklost pour permettre au deuxième d'être éxécuté, et d'appeler nicklost_load qui se chargera gentiment de transférer les pseudos sans les signes de grades dans la list ^^
|
|
|
|
« Dernière édition: 13 Mars 2006, 21:14:43 par Kitai »
|
Journalisée
|
Les gens qui disent "Ma maison a moi, c'est le monde", je m'demande de quel pays y s'servent pour les chiottes. ©NUNUS
|
|
|
Simon``
Citoyen(ne)
 
EpiKarma : +5/-2
Hors ligne
Messages: 57
=D
|
C'est bon, tout vas comme il faut ^^ Merci pour la remarque des alias d'ailleurs c_c Merci pour tout en fait =D Continuez d'aider comme vous le faites, c'est du super boulot ^^
|
|
|
|
|
Journalisée
|
|
|
|
Simon``
Citoyen(ne)
 
EpiKarma : +5/-2
Hors ligne
Messages: 57
=D
|
Bon, j'en appelle encore à vous pour régler un problême que j'ai du mal à régler. Je met le zip avec la remote et les fichiers requis sur mon ftp : => ICI <=Le fichier s'appelle "Away.rar" Donc voila, essayez de supprimer le "pseudo retour", ca va bugger 
|
|
|
|
|
Journalisée
|
|
|
|
|
CoolWave
|
Salut Simon``, Code:
if ($did == 12) && ($did(14,0).sel != 0) { var %i = 1 while $did(14,%i).sel { did -d away 19 $did(14,%i).sel } inc %i savebuf -o away 14 nickre.txt }
Fort probable que tu aies déjà trouvé la solution. Si ce n'est pas le cas relis bien ta commande /while pour la gestion de la liste d' ID 14. Tu utilises le mauvais ID dans ta commande de supression de lignes : did -d away 19 $did(14,%i).selLa raison pour laquelle ça gèle mIRC ? Les lignes ne sont donc pas retirées de la liste, ce qui fait que $did(14,1).sel retourne toujours une valeur dans ta /while, et donc ça boucle indéfiniment. Au passage, pour quelle raison utiliser une variable %i dans toutes tes /while, alors que mettre la valeur 1 dans tes $did(N,%i).sel suffirait ? En plus de cela tu as des inc %i en dehors de la /while, qui ne servent à rien (si c'est simplement pour s'en servir de "debug" sans retirer les lignes et en modifiant la commande /did, oublie ce que je viens de dire ^^) Bref, petite erreur bête hein ! Si éventuellement tu es intéressé par un moyen d'optimiser ton code pour éviter autant de /while (genre en utiliser qu'une seule au lieu de 6) n'hésite pas à demander. Bon scripting 
|
|
|
|
|
Journalisée
|
|
|
|
|
|
Pages: [1]
|
|
|
 |