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
25/02/2022, 10:44 (This post was last modified: 31/03/2022, 06:20 by ZarTek.)
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.
bindjoin - *[namespace current]::joinvoiceproc joinvoice {nick uhost hand chan}{
after 5000[list[namespace current]::delayedjoin$nick$chan]}proc delayedjoin {nick uhost}{
::addvoice::service:connectset res [mysqlsel $::mysqlink"SELECT count(*) FROM `voiceauto` WHERE pseudo='$nick' and salon='$chan'" -list]set nb [lindex$res0]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
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.
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
27/02/2022, 00:42 (This post was last modified: 27/02/2022, 00:58 by Amand.)
tcl
bind account - *[namespace current]::accountuserproc accountuser {nick user hand chan {account ""}}{putlog"$nick : $user / $hand *$chan* -> $account"}bindjoin - *[namespace current]::jointestproc 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.
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.
28/02/2022, 09:51 (This post was last modified: 28/02/2022, 09:51 by CrazyCat.)
(27/02/2022, 00:42)Amand Wrote:
tcl
bind account - *[namespace current]::accountuserproc accountuser {nick user hand chan {account ""}}{putlog"$nick : $user / $hand *$chan* -> $account"}bindjoin - *[namespace current]::jointestproc 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
28/02/2022, 11:15 (This post was last modified: 28/02/2022, 11:18 by Amand.)
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
bindjoin - *[namespace current]::joinvoiceproc joinvoice {nick host hand chan }{
::joinvoice::service:connectset res [mysqlsel $::mysqlink"SELECT count(*) FROM `voiceauto` WHERE pseudo='$nick' and salon='$chan'" -list]set nb [lindex$res0]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.
Une base de l'utilisation du bind account à qui peut servir:
tcl
bind account - *[namespace current]::accountuserproc accountuser {nick user hand chan {account ""}}{putlog"$nick : $user / $hand *$chan* -> $account"if{$account==""}{return}[namespace current]::joinvoice$nick$user$hand$chan}bindjoin - *[namespace current]::joinvoiceproc joinvoice {nick host hand chan }{if{![isidentified $nick] || [isvoice$nick$chan]}{return}
::joinvoice::service:connectset res [mysqlsel $::mysqlink"SELECT count(*) FROM `voiceauto` WHERE pseudo='$nick' and salon='$chan'" -list]set nb [lindex$res0]if{$nb>= 1}{putlog"$nick est identifié et dans la base de donnée."}
::joinvoice::service:deconnect
}