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


[Résolu] Mettre un utimer sur isidentified
#1
Bonjour à tous,

Je suis entrain de faire une proc qui utilise isidentified :

tcl

Code:
bind join - * [namespace current]::joinvoice
proc joinvoice { nick host hand chan } {

::addvoice::service:connect
set res [mysqlsel $::mysqlink "SELECT count(*) FROM `voiceauto` WHERE pseudo='$nick' and salon='$chan'" -list]
set nb [lindex $res 0]
putlog "isidentified => $nick = [isidentified $nick]"
if {($nb >= 1) && ([isidentified $nick] == 1)} {
putlog "$nick est dans la bdd et identifié."

}
::addvoice::service:deconnect

}
La procédure fonctionne bien, mais j'ai besoin de mettre un utimer dans ma condition où je vérifie si l'utilisateur est identifié car il m'arrive de rejoindre le salon avant l'authentification à nickserv.

Vous pensez que je dois créer une autre proc où je stock la condition qui vérifie si il est présent dans la bdd et isidentified et je mets un utimer de 5 qui va déclencher cette proc, ou il y a une meilleure façon de faire plus simple.
  Reply
#2
Tu peux aussi essayer d'utiliser after :

tcl
bind join - * [namespace current]::joinvoice
proc joinvoice {nick uhost hand chan} {
   after 5000 [list [namespace current]::delayedjoin $nick $chan]
}
 
proc delayedjoin {nick uhost} {
   ::addvoice::service:connect
   set res [mysqlsel $::mysqlink "SELECT count(*) FROM `voiceauto` WHERE pseudo='$nick' and salon='$chan'" -list]
   set nb [lindex $res 0]
   putlog "isidentified => $nick = [isidentified $nick]"
   if {($nb >= 1) && ([isidentified $nick] == 1)} {
      putlog "$nick est dans la bdd et identifié."
   }
   ::addvoice::service:deconnect
}


Sinon peut-être qu'en explorant le CAP account-notify (ou un autre, je ne les connais pas tous) tu pourrais faire l'inverse: récupérer les infos lorsqu'une personne s'authentifie et appliquer ton voice si besoin est
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#3
La fonction after n'a pas l'air de fonctionner chez moi et je n'ai pas d'erreur par contre je ne trouve aucun exemple pour l'utilisation du bind account qui a l'air d'être une fonction intéressante.
  Reply
#4
Probable bug sur ce bind: https://github.com/eggheads/eggdrop/issues/1265

EDITION : il y a une erreur dans la documentation, il manque l'argument chan à la définition de la procédure:
procname <nick> <user> <hand> <chan> <account>

Par contre, avec mes tests, le bind ne se déclenche que sur le logout, pas sur l'identification.

NOTA : il faut avoir le CAP account-notify : cap req account-notify
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#5

tcl
bind account - * [namespace current]::accountuser
proc accountuser {nick user hand chan {account ""}} {
putlog "$nick : $user / $hand *$chan* -> $account"
}
 
bind join - * [namespace current]::jointest
proc jointest { nick host hand chan } {
 
[namespace current]::accountuser $nick $host $hand $chan
 
}


Le bind account a l'air de fonctionner , par contre quand on fait appel à la procédure accountuser dans le bind join il manque le $account en paramètre.

On peut déclencher ce bind account seulement lors du bind join ?

Edit:

Je pense avoir une mauvaise réflexion dans l'algorithme.

Je veux qu'au join de l'utilisateur , le bot verifie si il a un compte ( donc identifié ) si le nick est présent dans la base de donnée et identifié , il effectue une action.

Si je passe par le bind join pour appeler le bind account , je devrais faire la condition dans le bind account et ce n'est pas ce que je veux parce qu'il entrera dans la condition sur chaque account.
  Reply
#6
salut, 
pourquoi ne pas modifier les levels salon par defaut,
si  $nick = 1 alors chanserv le voice
si $nick = 0,  il n'est pas voicé

ça evite il me semble d'ajouter une  fonction qui existe deja. ( peut-etre meme  voir si  on  est admin du reseau a modifier directement le  fichier, ce qui permettrait que celà fonctionne  pour tous les salons, mais il faut aussi penser que certains ne voudront peut etre pas que le voice soit automatique. De plus,  le "+"  permet d'outrepasser le certains modes comme le  +m ( salon moderé) ce qui peux etre genant si on dois l'utiliser.sachant que si l'on devoice l'user, place le  +m, il comprendra vite qu'il suffira de ce/cycle pour  reparler/spam/mettre le  bazard . 
ce n'est qu'une idée, en rien une critique quand à  utiliser un bot pour  voicer.
  Reply
#7
(27/02/2022, 00:42)Amand Wrote:
tcl
bind account - * [namespace current]::accountuser
proc accountuser {nick user hand chan {account ""}} {
putlog "$nick : $user / $hand *$chan* -> $account"
}
 
bind join - * [namespace current]::jointest
proc jointest { nick host hand chan } {
 
[namespace current]::accountuser $nick $host $hand $chan
 
}


Le bind account a l'air de fonctionner , par contre quand on fait appel à la procédure accountuser dans le bind join il manque le $account en paramètre.

On peut déclencher ce bind account seulement lors du bind join ?

Edit:

Je pense avoir une mauvaise réflexion dans l'algorithme.

Je veux qu'au join de l'utilisateur , le bot verifie si il a un compte ( donc identifié ) si le nick est présent dans la base de donnée et identifié , il effectue une action.

Si je passe par le bind join pour appeler le bind account , je devrais faire la condition dans le bind account et ce n'est pas ce que je veux parce qu'il entrera dans la condition sur chaque account.

J'ai un peu du mal à comprendre, je vais essayer de reposer le problème:
Lorsqu'un utilisateur entre dans un canal, s'il est identifié auprès des services et présent dans une base de données, tu fais une action particulière (comme donner un voice).
S'il n'est pas identifié, rien ne se passe jusqu'à ce qu'il s'identifie (à condition qu'il soit dans ta base).

Vu comme ça, je pense qu'il te faut 2 binds:
- sur le join, tu utilises juste isidentified (ta procédure initiale)
- sur le account, deux cas:
-> il vient de s'authentifier, tu vérifies que l'utilisateur n'a pas déjà les droits que tu veux lui mettre
-> il vient de faire un logout, tu retires les droits
Je ne pense pas qu'il y ait de problème particulier avec ce fonctionnement et il n'y a du coup aucun intérêt à mettre un timer quelconque
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#8
Quote:Lorsqu'un utilisateur entre dans un canal, s'il est identifié auprès des services et présent dans une base de données, tu fais une action particulière (comme donner un voice).
S'il n'est pas identifié, rien ne se passe jusqu'à ce qu'il s'identifie (à condition qu'il soit dans ta base).

C'est exactement ça.

Dans mon bind join je fais :


tcl
bind join - * [namespace current]::joinvoice
proc joinvoice { nick host hand chan } {
 
::joinvoice::service:connect
set res [mysqlsel $::mysqlink "SELECT count(*) FROM `voiceauto` WHERE pseudo='$nick' and salon='$chan'" -list]
set nb [lindex $res 0]
putlog "isidentified => $nick = [isidentified $nick]"
if {($nb >= 1) && ([isidentified $nick] == 1)} {
    putlog  "$nick est dans la base de donnée de $chan est il est identifié."
}
::joinvoice::service:deconnect
 
}


Par contre dans le bind account pour traiter les deux cas:

Quote:- sur le account, deux cas:
-> il vient de s'authentifier, tu vérifies que l'utilisateur n'a pas déjà les droits que tu veux lui mettre
-> il vient de faire un logout, tu retires les droits

Je suis un peu perdu, je peux mettre une condition avec la fonction isvoice pour vérifier si le pseudo est voice, mais pour savoir si il est dans la base de donnée, je refais la même condition que dans le join ?

Je pense pas que ce soit utile d'utiliser le logout , je veux effectuer un voice quand l'user join un salon ou quand il s'identifie , quand il se déconnecte ça doit automatiquement le logout.
  Reply
#9
Tu peux faire une chose très simple avec le bind account:

tcl
bind ACCOUNT - * [namespace current]::accvoice
proc accvoice {nick user hand chan {account ""}} {
   if {$account==""} { return }
   [namespace current]::joinvoice $nick $user $hand $chan
}

zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#10
Merci CrazyCat.

Une base de l'utilisation du bind account à qui peut servir:


tcl
bind account - * [namespace current]::accountuser
proc accountuser {nick user hand chan {account ""}} {
putlog "$nick : $user / $hand *$chan* -> $account"
if {$account==""} { return }
[namespace current]::joinvoice $nick $user $hand $chan
}
 
bind join - * [namespace current]::joinvoice
proc joinvoice { nick host hand chan } {
 
if {![isidentified $nick] || [isvoice $nick $chan]} { return }
 
::joinvoice::service:connect
set res [mysqlsel $::mysqlink "SELECT count(*) FROM `voiceauto` WHERE pseudo='$nick' and salon='$chan'" -list]
set nb [lindex $res 0]
if {$nb >= 1} {
    putlog "$nick est identifié et dans la base de donnée."
}
::joinvoice::service:deconnect
 
}

  Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  msgcat, utimer et namespace, trio perdant ? CrazyCat 2 188 12/04/2022, 23:40
Last Post: ZarTek
  Tcl pour mettre des gens a certain poste KeeViiNou 4 4,820 28/12/2012, 10:33
Last Post: KeeViiNou
  Utimer mein 5 2,689 28/05/2010, 23:57
Last Post: mein
  Mettre les logs sur le net loulou7593 20 11,103 15/03/2010, 14:35
Last Post: CC30
  comment mettre une raison au kick avec lindex Babytigrou16 2 4,721 26/11/2007, 18:43
Last Post: Babytigrou16

Forum Jump:


Users browsing this thread: 1 Guest(s)