Communauté sur les Eggdrops - Community about Eggdrops
plusieurs question en 1 - Printable Version

+- Communauté sur les Eggdrops - Community about Eggdrops (https://forum.eggdrop.fr)
+-- Forum: Eggdrop et TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=8)
+--- Forum: Scripts TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=4)
+--- Thread: plusieurs question en 1 (/showthread.php?tid=915)



plusieurs question en 1 - tedcampa - 21/03/2011

Bonjour comme mon titre l'indique j'ai plusieurs questions sur lesquelles je me casses un peu les dents. Vos lumières pourront à coup sur éclairer mon chemin dans les arcanes obscurs du codage TCL.

### 1er Question ###
Je suis entrain de coder un système de messagerie par eggdrop donc les commande sont :

- !memo list : pour lister les memo non lu
- !memo lire <id du memo> : pour lire le dit memo
- !memo envoi <destinataire> <le message> : pour envoyer un memo

j'arrive bien a extraire les 2 premiers mots avec les commandes

Code:
set action [lindex 0 0]
set destid [lindex 0 1]
mais je bloque sur le 3e arguments <le message>... j'arrive a obtenir le 1er mot ou le dernier mais pas tout le message. Pouvez vous m'aiguiller

###2e question ###
Comment limiter la possibilité d'envois de message uniquement aux personnes qui sont enregistrées dans mon nickserv (anope) ?

### 3e question ###
j'avoue que la je quitte un peu le domaine des eggdrop mais une idée serais la bienvenue

a terme je compte mettre en place un site internet en liaison avec le chat. et j'aimerais que mes utilisateurs n'aient pas a s'inscrire 2 fois
donc est il possible de faire communiquer les 2 mondes ?
je voudrais que lorsque l'utilisateur s'inscrit dans la base nickserv son inscription soit reportée sur le site et vice versa. pour info j'utilise mysql dans les 2 cas pour la gestion des enregistrements


En vous remerciant par avance d'avoir lu ce post de bout en bout
nota... ne me dites pas "le script machin.tcl de untel le fait deja..." perso je ne trouve pas que rajouter ; "load /dossier/des/scripts/machin.tcl" à la fin du eggdrop.conf, soit une bonne methode d'apprentissage


RE: plusieurs question en 1 - CrazyCat - 21/03/2011

Je vais essayer de répondre à tes 3 questions :)

Question 1:
Ton message s'obtient en faisant:

tcl
set message [join [lrange $args 2 end]]


Question 2:
Il faut que tu fasses une interrogation de nickserv (/msg NickServ info $nick) et que tu récupères une ligne permettant de valider que l'utilisateur est enregistré. Mais c'est assez problématique, je reviens à cette question après avoir répondu à la 3ème

Question 3:
En activant la synchronisation MySQL dans anope, tu auras dans une base MySQL tous les utilisateurs enregistrés sur le réseau IRC. Par contre, ça ne marche que dans un seul sens, anope ne se mettra pas à jour par rapport à ce qui est dans la base.
Pour permettre un enregistrement sur le réseau depuis le site web, il faut que tu crées un script PHP qui se connectera automatiquement au serveur IRC et procèdera à l'inscription.
J'ai développé un petit script dans ce genre, je vais un peu l'améliorer et je le posterai.

Retour sur la question 2:
Si tu as une synchronisation anope/mysql, tu peux ajouter dans ton tcl une interrogation de la base mysql pour savoir si l'utilisateur est connu. Si oui, c'est qu'il est enregistré.


RE: plusieurs question en 1 - MenzAgitat - 21/03/2011

En ce qui concerne la messagerie, tu peux aussi jeter un oeil à ça : Messages Delivery Service

Si ça ne répond pas exactement au cahier des charges que tu donnes, tu peux toujours t'en inspirer.


RE: plusieurs question en 1 - tedcampa - 22/03/2011

bon j'avance sur la messagerie mais j'ai un bug quelque part
je n'ai toujours pas de message d'enregistré dans ma base mysql
ou est le bug ?

tcl
# binds 
bind pub - "!memo" memo
 
# variable mysql
set my_user     "tedcampa"
set my_pass     "ZfFmTfTYmryESsB9"
set my_db       "tedcampa"
set my_host     "localhost"
 
# chargement du module mysql
load /usr/lib/tcltk/mysqltcl-3.05/libmysqltcl3.05.so
 
 
proc memo {nick uhost handle chan args} {
 
   ### Appel des variables globales ###
   global my_user my_pass my_db my_host
 
   ### on se prepare a la connection mysql ###
   set db_handle [mysqlconnect -host $my_host -user $my_user -password $my_pass -db $my_db ]
 
   ### Decoupage de l'arguments ###
 
   set action [lindex $args 0 0]
 
switch $action {
 
        liste {
                ### LISTING DES MEMO NON LU ###
 
                ### on recherche les memo non lu ###
                set sql "SELECT * FROM memo WHERE dest='$nick' AND etat='unread' ORDER BY date"
                set result [mysqlquery $db_handle $sql]
                set count [mysqlresult $result rows]
 
                if {$count != 0} {
                ### si il y a quelque chose a afficher on le met en forme ####
 
                        while {[set row [mysqlnext $result]] != ""} {
                                set no  [lindex $row 0]
                                set exp [lindex $row 5]
                                set dte [lindex $row 2]
                                putserv "PRIVMSG $nick :Memo id : $no de $exp le $dte"
                                putserv "PRIVMSG $nick :--------------------------------------------"
                        }
                        putserv "PRIVMSG $nick :Pour lire vos memo tapez !memo lire <id>"
 
                } else {
 
                ### sinon on informe qu'il n'y a pas de message a lire ###
                putserv "PRIVMSG $nick :Vous n'avez pas de memo non lu"
                }
        }
        lire {
                ### LECTURE DES MEMO ###
 
                ### on recupere l'id du memo a rechercher ###
                set destid [lindex $args 0 1]
 
                ### on recherche le memo identifie <id> ###
                set sql "SELECT * FROM memo WHERE dest='$nick' AND id='$destid'"
                set result  [mysqlquery $db_handle $sql]
                set count [mysqlresult  $result rows]
 
 
                if {$count != 0} {
 
                ### si il y a un resultat on l'affiche ###
                        while {[set row [mysqlnext $result]] != ""} {
                                set no  [lindex $row 0]
                                set dte [lindex $row 2]
                                set msg [lindex $row 3]
                                set exp [lindex $row 5]
 
                                putserv "PRIVMSG $nick :Memo id : $no de $exp le $dte"
                                putserv "PRIVMSG $nick :--------------------------------"
                                putserv "PRIVMSG $nick :$msg"
                                putserv "PRIVMSG $nick :--------------------------------"
                        }
 
                        ### on indique que le memo est lu ###
                        set sql "UPDATE memo SET etat='read' WHERE id='$destid'"
                        set result [mysqlquery $db_handle $sql]
 
                } else {
 
                ### sinon on affiche un message d'erreur ###
                putserv "PRIVMSG $nick :L'id que vous avez saisie ne renvois a aucun memo enregistre"
                putserv "PRIVMSG $nick :Verifiez vottre saisie"
                }
        }
        envoi {
                ### ENVOI D'UN MEMO  ###
                ### on recupere le destinataire, le message et la date ###
                set destid [lindex $args 0 1]
                set msg [join [lrange $args 2 end]]
                set date [strftime "%d-%m-%Y"]
 
                putlog "$nick envoi un message a $destid : $msg"
                ### on enregistre le message ###
                set sql "INSERT INTO memo (dest,date,message,etat,orig) VALUES ('$destid','$date','$msg','unread','$nick')"
 
                if {[mysqlquery $db_handle $sql]} {
                        ### Confirmation de l'envois ###
                        putserv "PRIVMSG $nick :Votre message a bien ete envoye a $destid"
                } else {
                        putserv "PRIVMSG $nick :Oups il y a un probleme sur l'envoi de votre memo. Reessayez SVP"
                }
        }
 
        default {
                ### ACTION INCONNUE ###
 
                putserv "PRIVMSG $nick :Je ne comprend pas votre demande. Merci de la presenter correctement :"
                putserv "PRIVMSG $nick :!memo liste                             : pour consulter la liste de vos memo non lu"
                putserv "PRIVMSG $nick :!memo lire <id>                         : pour lire le memo identifie"
                putserv "PRIVMSG $nick :!memo envoi <destinataire> <le message> : pour envoyer un message a quelqu'un"
                putserv "PRIVMSG $nick :pour plus de lisibilité il est deconseiller que le message dépasse les 160 caracteres (et ouai meme limitation qu'un SMS)"
        }
}
}


commande sur le chan :

Code:
[01:17:04]  <Teddy> !memo envoi teddy ceci est un test long
réponse du bot en pv

Code:
[01:17:06]  <Edgar> Votre message a bien ete envoye a teddy
contenu de la base mysql

[ id ][dest ][date ][message ][etat][ orig]
[ 22 ][teddy ][22-03-2011][ ][unread][ Teddy]

et aucune erreur en pl

Merci de votre aide


RE: plusieurs question en 1 - djkenny - 22/03/2011

salut,

tu devrais utiliser arg au lieu de args, args est prévu pour lister un nombre indéfini d argument mais eggdrop le fait déjà donc tu te retrouves avec une liste foireuse. Essais de remplacer tous les args par arg et d'utiliser de simple index pour les lindex

tcl
proc memo {nick uhost handle chan arg} {
...
               set destid [lindex $arg 1]
                set msg [lrange $arg 2 end]
...


edit: n'oublie pas de remplacer tous les lindex en retirant le 1er index "0"

tcl
set action [lindex $args 0 0]
devient
set action [lindex $arg 0]
etc...




RE: plusieurs question en 1 - CrazyCat - 22/03/2011

As-tu essayé de faire un putlog de $sql et d'envoyer la requête directement dans MySQL pour voir s'il n'y aurait pas une erreur ?


RE: plusieurs question en 1 - tedcampa - 22/03/2011

Merci a tous ma fonction messagerie est opérationnelle
effectivement le fait de remplacer args par arg et de virer le 1er 0 des "lindex" a fonctionné
->crazycat : la requête MySQL était bonne c'était bien la variable $msg qui n'était pas remplis

Encore un grand merci


RE: plusieurs question en 1 - djkenny - 22/03/2011

man proc:
Quote:If the last formal argument has the name args, then a call to the procedure may contain more actual arguments than the procedure has formals. In this case, all of the actual arguments starting at the one that would be assigned to args are combined into a list (as if the list command had been used); this combined value is assigned to the local variable args.

args est le seule argument spécial utilisé en tcl
en gros il crée une liste des différent arguments qu'il contient
quand arg contient {a b c d}
args contiendra {{a b c d}} donc une double liste

edit:

Code:
% proc test arg {return $arg}
% test "a b c d"
a b c d
% proc test args {return $args}
% test "a b c d"
{a b c d}