[Résolu] Aide sur un bout de code
#1
Bonsoir,

Voila un pote ma demandé de lui codé quelques commande pour son serveur,
voila le code en question (pas complet)
tcl
set vhostmodo2 {
 *@domain.tld
}
 
set vhostmodo1 {
 *@domain.tld
}
 
bind pub - !modo aidemodo
bind pub - !kr kick
 
proc kick { nick host hand channel arg } {
 global vhostmodo1 kick
 foreach vhost $vhostmodo1 {
   if [string match -nocase $vhost $host] {
     putserv "cs kick $channel $arg $arg-1"
     }
  }
}


Donc j'ai tenter de cette manière mais ne fonctionne pas et aucun message d'erreur en PL avec le bot.
Voila je voudrais qu'en tapant !kr pseudo bla bla bla bla
Ca kick l'utilisateur pour la raison bla bla bla bla
Mais je ne vois absolument pas comment mi prendre...

Merci pour votre aide future

Edit : j'ai édité le code car j'ai enfin réussie à faire comprendre à mon pote qu'un eggdrop IRCop c'est pas bon pour la sécurité.

Bien à vous.

Bye.
Répondre Avertir
#2
Salut,

Nouvel réponse volontaire.

J'ai tenter aussi de faire de cette manière
tcl
bind pub - !kr kickraison
proc kickraison { nick host hand channel arg text } {
  global vhostmodo1 kickraison
  foreach vhost $vhostmodo1 {
    if [string match -nocase $vhost $host] {
      putserv "cs kick $channel $arg $text"
      putserv "PRIVMSG $::log :\0034$arg \00312à été kick de \0034$channel \00312par \0034$nick \00312Raison :\0037 $text"
      }
   }
}


Mais ne fonctionne pas mais la j'ai un message d'erreur en pl
Code :
[14:30:39] <Aragorn> [14:30:39] Tcl error [kickraison]: wrong # args: should be "kickraison nick host hand channel arg text"
J'avoue que je ne vois pas du tout comment faire

Merci d'avance.

Bye.
Répondre Avertir
#3
Je pense que parfois, lire le wiki est utile.
Citation :PUB
Utilisé pour une commande donnée sur un canal. Le premier mot devient la commande, ceux qui suivent deviennent les arguments text.
Syntaxe: bind pub <flags> <command> <proc>
Procédure: procname <nick> <user@host> <handle> <channel> <text>

Donc, ta procédure reçoit obligatoirement 5 arguments, pas un de plus ou de moins.
tcl
proc kickraison { nick host hand channel text } {


En définissant ta procédure ainsi, tu obtiens dans $text le nick à kicker suivi du message de kick. Il faut donc couper $text.

tcl
set args [split $text] # on mets chaque élément de $text dans la liste $args
set victim [lindex $args 0] # le premier élément de $args est la victime
set reason [join [lrange $args 1 end]] # la suite est la raison du kick


Répondre
#4
Bonjour,

Donc si j'ai bien compris je reprend ma procédure en enlevant 'arg' pour le remplacer par 'text'
Concernant les set je les rajoute hors de la procédure et je fait appel à eux de la même façon que pour le salon de log ?
C'est bien ça ?

Bien à toi.

Bye.
Répondre Avertir
#5
Il me semble qu'il te manque les bases du tcl...
Dans la déclaration de ta procédure, tu appelles le dernier élément "args", "text", "roger_rabbit", ça n'a pas la moindre importance, tout ce qui importe c'est que ta procédure ait 5 arguments dans sa déclaration, pas un de plus ou de moins vu que le bind en envoie 5.

Et NON. Les sets sont forcément dans la procédure, vu qu'il s'agit de la découpe du dernier argument de la procédure. En toute logique, ils devraient être soit après la ligne "global", soit après la ligne "if ..."
Répondre
#6
Merci pour ces précisions je me penche dessus après le boulot et dans tout les cas je fait un retour

Bien à toi.

Bye.
Répondre Avertir
#7
Bonsoir,
Alors j'ai tenter de façon voici la première (je met juste la procédure)
tcl
proc kickraison { nick host hand channel text } {
  global vhostmodo1 kickraison
  set args [split $text] # on mets chaque élément de $text dans la liste $args
  set victim [lindex $args 0] # le premier élément de $args est la victime
  set reason [join [lrange $args 1 end]] # la suite est la raison du kick
  foreach vhost $vhostmodo1 {
    if [string match -nocase $vhost $host] {
      putserv "cs kick $channel $victim $reason"
      putserv "PRIVMSG $::log :\0034$victim \00312à été kick de \0034$channel \00312par \0034$nick \00312pour flood."
      }
   }
}


Ne fonctionne pas et j'ai se message d'erreur en pl
Code :
[00:59:10] <Aragorn> [00:59:10] Tcl error [kickraison]: can't read "args": no such variable
et de cette façon
tcl
proc kickraison { nick host hand channel text } {
  global vhostmodo1 kickraison
  foreach vhost $vhostmodo1 {
    if [string match -nocase $vhost $host] {
    set args [split $text] # on mets chaque élément de $text dans la liste $args
    set victim [lindex $args 0] # le premier élément de $args est la victime
    set reason [join [lrange $args 1 end]] # la suite est la raison du kick
      putserv "cs kick $channel $victim $reason"
      putserv "PRIVMSG $::log :\0034$victim \00312à été kick de \0034$channel \00312par \0034$nick \00312pour flood."
      }
   }
}


Ne fonctionne pas non plus et aucun message en pl
Ai-je mal inséré le code?

Bien à toi.

Bye.
Répondre Avertir
#8
Essaye en retirant les commentaires... LE TCL essaye d'interpréter $args dans celui de la première ligne, or il n'est pas encore défini.
Répondre
#9
Merci CrazyCat cela fonctionne parfaitement bien :D

Donc si j'ai bien compris les 3 ligne 'set' que j'ai rajouter servent a 'découper' le dernière argument de ma procédure, c'est bien ça ?

Bien à toi.

Bye.
Répondre Avertir
#10
Le premier set sert à découper $text en une liste de mots
Le second sert à mettre le premier élément de cette liste dans la variable $victim
Le troisième mets tous les éléments suivants sous forme d'une seule chaîne dans la variable $reason.
Répondre
#11
Merci pour ces explication Et merci pour ton aide :)

Bien à toi.

Bye.
Répondre Avertir
#12
tcl
set victim [lindex $args 0]



0 ? Sa retourne pas le canal ça ?

J'aurais plutôt mis

tcl
set victim [lindex $args 1]


Répondre Avertir
#13
Non.
Le script est fait pour agir en commande publique, donc c'est le chan où elle est lancée qui est pris comme canal d'action.
Le premier argument est donc le nick de la victime.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté