Package:MySQLTcl

From Base de connaissances eggdrops & TCL
Revision as of 09:46, 14 December 2012 by CrazyCat (talk | contribs) (Liste externe)

Jump to: navigation, search

Dans ce tutoriel vous allez apprendre a utiliser le paquage mySQLTCL.

Pré-requis

  • La présence de la librairie MysqlTcl sur votre machine (si elle n'est pas installée, allez sur http://www.xdobry.de/mysqltcl/)
  • Connaissance du language SQL

Pourquoi utiliser les bases de données sql ?

On pourrait bien évidement se poser la question de pourquoi utiliser les bases de données sql alors qu'on a beaucoup de fonction à notre disposition sur notre eggdrop. On peut par exemple utiliser les fichiers et donc se compliquer beaucoup moins la vie.

La réponse est simple. Personnelement, j'utilise les bases de données mySQL car je trouve le système facile, une fois qu'on a compris, l'utilisation reste hyper simple.

Après, vous avez la possibilité en utilisant des bases de données sql de pouvoir générer des statistiques plus facilement depuis votre site internet (je sais bien qu'il existe plusieurs façon pour générer des statistiques de ce genre, mais je pense que l'utilisation des bases de donnée sql est la meilleure solution), aussi, vous pouvez vous en servir pour faire un panel réservé aux personnes ayant accé a votre robot.

Bref, je ne sais encore quel délire vous pourrez réalisé avec l'utilisation de ces bases.

Comment utiliser les bases de données sql ?

Maintenant que vous avez une première aproche de l'utilité de l'utilisation de ces bases, nous allons voir comment les utilisez.

Je vais donc m'appuyer sur l'exemple ci-dessous pour tout vous expliquez.

##############
# CONFIGURATION #
##############

# -> Login 
set sql(login) "root"
# -> Mot de passe 
set sql(pass) "pass" 
# -> Nom de la base de donnée
set sql(db) "root"
# -> L'host a l'aquelle ce connecté
set sql(host) "localhost"
# -> Localisation de fichier mysql.sock
set sql(sock) "/tmp/mysql.sock"

###########
# PAQUETAGE #
###########

catch {package require mysqltcl}

#######
# CODE  #
#######

#########
# CONNECT #
#########
proc service:connect {} {
	set ::mysqlink [mysqlconnect -host $::sql(host) -user $::sql(login) -password $::sql(pass) -sock $::sql(sock)]
	mysqluse $::mysqlink $::sql(db)
}

###########
# DECONNECT #
###########

proc service:deconnect {} {
	mysqlclose $::mysqlink; unset -nocomplain ::mysqlink	
}

Bon ben dans un premier temps, ont définit la configuration du script, soit les informations qui vont nous permettres de ce connecté a la base.
Ensuite, la ligne ci dessous "dit a l'interpreteur que l'on veut utilité le paquage mysqltcl", c'est a dire pouvoir utilisé les commandes utilisables par ce paquage.

catch {package require mysqltcl}

A noter que "catch" permet de parer les éventuelles érreur, soi de ne pas faire planter votre eggdrop au cas ou la librairie ne soit pas installer cher votre hébergeur.

Pour finir, on a les fonctions "connect" et "deconnect". Je ne voie pas ce que je peut expliquer, les commandes sont simple, cela fonctionne comme je l'ai mit dans la source, donc a vous de faire un effort de comprehension (en gros, je vais pas m'amuser a expliquer les deux lignes importante, car les mots-clefs veulent tout dire).

Jusqu'a présent, c'est bien, ont a la possibilité de ce connecté a une base de donnée. Nous allons voir maintenant comment vérifier des conditions, et ma fois s'amuser, car c'est un jeux d'enfant.

Copier dans un premier temps ce code par le biais de phpmyadmin :

-- 
-- Structure de la table `access`
-- 

CREATE TABLE `access` (
  `id` int(4) NOT NULL auto_increment,
  `pseudo` text NOT NULL,
  `pass` text NOT NULL,
  `grade` text NOT NULL,
  `suspend` text NOT NULL,
  `statut` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

-- 
-- Contenu de la table `access`
-- 

INSERT INTO `access` (`id`, `pseudo`, `pass`, `grade`, `suspend`, `statut`) VALUES 
(1, 'DaV34', 'machin', '4', 'Off', 'On');

Bien, en gros, la, ont crée une table avec 6 colones qui sont les suivantes : id pseudo pass grade suspend statut.
Ici, je reprend un systeme d'authentification.
Il faut savoir que la colone grade sera un chiffre (afin de faciliter la gestion, en effet, ont peut imaginer que les helpeurs auront un access 1, les géo un access niveau 2 ...) et les commandes suspend et statut pourront contenir ou "On" ou Off" (en effet, pour savoir si quelqu'un est auth, si son access est suspendue ...

Treve d'explication, voila maintenant un code qui vous explique comment proceder pour votre systeme d'authentification :

##############
# CONFIGURATION #
##############

# -> Login 
set sql(login) "root"
# -> Mot de passe 
set sql(pass) "pass" 
# -> Nom de la base de donnée
set sql(db) "root"
# -> L'host a l'aquelle ce connecté
set sql(host) "localhost"
# -> Localisation de fichier mysql.sock
set sql(sock) "/tmp/mysql.sock"

###########
# PAQUETAGE #
###########

catch {package require mysqltcl}

#######
# CODE  #
#######

#########
# CONNECT #
#########
proc service:connect {} {
	set ::mysqlink [mysqlconnect -host $::sql(host) -user $::sql(login) -password $::sql(pass) -sock $::sql(sock)]
	mysqluse $::mysqlink $::sql(db)
}

###########
# DECONNECT #
###########

proc service:deconnect {} {
	mysqlclose $::mysqlink; unset -nocomplain ::mysqlink	
}

########
# ISAUTH #
########

proc isauth {arg} {
   service:connect
   set res [mysqlsel $::mysqlink "select statut from access where pseudo = '$arg' and statut = 'On'"]
   service:deconnect
   return $res
}

##########
# ISSUSPEND #
##########

proc issuspend {arg} {
   service:connect
   set res [mysqlsel $::mysqlink "select statut from access where pseudo = '$arg' and suspend = 'On'"]
   service:deconnect
   return $res
}

############
# ISVALIDUSER #
############

proc isvaliduser {arg} {
   service:connect
   set res [mysqlsel $::mysqlink "select pseudo from access where pseudo = '$arg'"]
   service:deconnect
   return $res
}

################
# ISVALIDPASSWORD #
################

proc isvalidpassword {mot1 mot2} {
   service:connect
   set res [mysqlsel $::mysqlink "select pseudo, pass from access where pseudo = '$mot1' and pass = '$mot2'"]
   service:deconnect
   return $res
}

########
# AUTH #
########

proc auth {arg} {
   service:connect
   mysqlsel $::mysqlink "UPDATE `access` SET `statut` = 'On' WHERE pseudo = '$arg'"
   service:deconnect
}

#######
# AUTH  #
#######

bind msg - auth msg:auth
proc msg:auth {nick host hand arg} {
   set mot1 [lindex $arg 0]
   set mot2 [lindex $arg 1]
   if { $mot1 == "" || $mot2 == "" } { puthelp "NOTICE $nick :Commande auth : /msg $::botnick auth <pseudo> <pass>"; return 0 }
   if { ![isvaliduser $mot1] } { puthelp "NOTICE $nick :$mot1 user inconnue !"; return 0 }
   if { [isvalidpassword $mot1 $mot2] } {
      if { [issuspend $mot1] } { puthelp "NOTICE $nick :Accés suspendu"; return 0 }
      if { [isauth $mot1] } { puthelp "NOTICE $nick :Vous êtes déjà  identifié !"; return 0 }
      puthelp "NOTICE $nick :Félicitation, vous êtes identifier"
      auth $mot1
   } else {
      puthelp "NOTICE $nick :Erreur, mot de passe incorrect."; return 0
   }
}

Voila un code qui vous permet d'utiliser la commande /auth sur votre eggdrop.


Ce tutoriel s'arrête la pour l'instant, je pense que je le completerai par la suite.
Le systeme d'auth est loin d'être finie, je vous laisse le soin de crée des conditions, crée une commande pour ajouter un access ...

Si vous connaissez le language sql et que vous avez a peut prêt le code et les quelques explications, il ne devrait pas y avoir de probleme.


Quelques indications :
return [mysqlsel $::mysqlink "select pseudo, pass from access where pseudo = '$mot1' and pass = '$mot2'"]</source> J'ai utiliser la commande return car ce qui est entre crochet vous renvoie 1 si la condition est valide et 0 si elle est pas valide.
En tcl, plustot que de faire :

if { [machin] == 1 } { ... }

ou

if { [machin] == 0 } { ... }

ont fait :

if { [machin] } { ... } # Pour [machin] == 1
# et 
if { ![machin] } { ... } # Pour [machin] == 0



Voici un code qui vous permettra d'afficher l'ensemble de vos access :

#########
# SQLTEST #
#########

# Il vous faudra taper .afficher en dcc chat pour que cette commande fonctionne
bind dcc - afficher dcc:afficher
proc dcc:afficher {hand idx arg} {
	service:connect
	mysqlsel $::mysqlink "SELECT * FROM `access` ORDER BY id"
	if {[mysqlresult $::mysqlink rows] ne 0} {
		while {[set row [mysqlnext $::mysqlink]] != ""} {
                  putlog "id : [lindex $row 0]"
                  putlog "pseudo : [lindex $row 1]"
                  putlog "pass : [lindex $row 2]"
                  putlog "grade : [lindex $row 3]"
                  putlog "suspend : [lindex $row 4]"
                  putlog "statut : [lindex $row 5]"
	        }
        }
    service:deconnect
}

Liste des fonctions MySQL

Voir Commandes MySqlTcl Le Package:MySQLTcl permet d'effectuer la plupart des opérations courante sur MySQL.

Attention.png Les commandes données ici sont génériques, mais depuis la version 3 du package il est recommandé d'utiliser le namespace ::mysql.


Voici la liste des commandes disponibles:

Liens utiles