[Demande] bind pubm SQL
#1
Bonjour,

Alors j'ai un soucis sur la détection des phrases via bind pubm en SQL.

J'ai une table sur mon phpmyadmin "box", dedans ce trouve 4 colonnes.

1) mot
2) salon
3) type
4) protect

Alors J'aimerais que sa regarde si la personne dit sur le salon par exemple "connard", si c'est sur #test qui et dans la colonne salon qui vérifie que le type soit bien un badword et qu'il ne soit pas en protect on.

J'ai tester ainsi mais sans aucun résultat, et la je viens poster en espérant avoir quelques explications/aides de votre part si c'est possible.

Voici le morceau de code que j'ai pateme : https://tools.eggdrop.fr/pasteme/view/f6a8e572

NB : Je n'es aucune erreur en party-line, et aucune réaction non plus concernant l'eggdrop actuellement.
NB2 : Ont m'as aussi doner ce code hier pour voir s'il prenez bien en comptes les débugs de la colonne mot, et oui sa passe. Voici le code et la réponse :

tcl
proc stock {} {
    set bdnb "0"
    service:connect
    mysqlsel $::mysqlink "SELECT * FROM `box`"
    if {[mysqlresult $::mysqlink rows] ne 0} {
        while {[set row [mysqlnext $::mysqlink]] != ""} {
            incr bdnb 1
            set stock:$bdnb "[lindex $row 0]"
            putnow "PRIVMSG #Back-Eggdrop :$bdnb $stock:$bdnb"
        }
    }
    putnow "PRIVMSG #Back-Eggdrop :$bdnb"
}



Réponse :

Citation :[02:20:44] ‹@Talk-Me› connard
[02:20:44] ‹@Talk-Me› www
[02:20:44] ‹@Talk-Me› talk-me.net
[02:20:44] ‹@Talk-Me› enculer
[02:20:44] ‹@Talk-Me› 4
Vous interdisez les erreurs, vous empêchez ainsi la victoire.

Ma super kikoo-page loll
  Répondre
#2
Bon, revoyons ton code...
tcl
set arg [mirc:strip $arg]
   set arg [stripcodes bcruag $arg]
# ...
   set colonne(mot) [string tolower [lindex $arg 0]]


Donc tu pars du principe que seul le premier élément de la ligne de texte peut être un mot interdit
tcl
set query "SELECT mot, salon, type, protect FROM box WHERE mot='$colonne(mot)' AND protect='off'"


Et là tu vas chercher le mot exact indépendamment du canal et qui ne soit pas protégé ?

En fait je ne comprends pas du tout comment tu veux faire ton système.

A mon avis, le plus simple serait de te faire une table qui ne contienne que 2 champs: badword et canal. Lorsque ton script est lancé, il va lister pour chaque canal tous les mots qui y sont interdits.
A partir de là, deux options:
1. tu crées pour chaque mot de chaque canal un bind pubm avec comme masque: "#canal *mot*"
2. tu crées une liste pour chaque canal et chaque fois qu'une phrase est dite sur le canal, tu fais un lintersect de la liste et des mots de la phrase pour savoir si un (ou des) mots a été dit.

Faire une requête SQL à chaque ligne qui passe sur le tchat risque de saturer ton eggdrop et/ou ta base de données.
  Répondre
#3
Tu entend quoi par saturer ?

Sinon sans SQL oui je vois comment faire, je voulais le faire via SQL pour voir Wink

Oui je crois que je me suis un peux perdu, voir même beaucoup..
Vous interdisez les erreurs, vous empêchez ainsi la victoire.

Ma super kikoo-page loll
  Répondre
#4
La saturation, c'est simple: si ton serveur MySQL est fait pour recevoir 50 connexions simultanées et que ton eggdrop est sur des canaux très actifs, il risque de tenter d'ouvrir trop de connexions et tu vas te faire jeter par le serveur. L'autre cas, c'est que les connexions prennent trop de ressources dans ton eggdrop et le bloque.
Il vaut donc mieux se servir de la base de données comme source initiale à chaque chargement de ton script.

Et je n'ai jamais dit de le faire sans SQL. Mais en SQL, tu ne pourras pas comparer tous les mots de ta base avec tous les mots d'une ligne, tu seras donc obligé de passer par un traitement en TCL.
  Répondre
#5
Je ne comprend pas trop ce que tu veut dire désoler..

Pour la partie "saturation", j'ai bien compris. Mais le restant je n'arrive pas à comprendre
Vous interdisez les erreurs, vous empêchez ainsi la victoire.

Ma super kikoo-page loll
  Répondre
#6
Bon, je tente une dernière fois...

Toi pas pouvoir comparer ensemble de mots (phrase) avec liste dans base de données.
Toi devoir récupérer liste de la base de données (quand script se charge) et toi devoir comparer cette liste avec phrase en tcl.
Toi devoir relire ma première réponse.
  Répondre
#7
Tu n'es pas obligé d'être désagréable..
Au pire tu c'est quoi sa me fatigue t'es humeur sur moi depuis pas mal de temps. Supprime le poste si tu veut, je répond plus sa me saoul.

Désoler de vouloir demander de l'aide et de pas avoir ta logique dans les phrase pour tu puisse me comprendre. Pourtant beaucoup me comprenne..

A bon entendeur.
Vous interdisez les erreurs, vous empêchez ainsi la victoire.

Ma super kikoo-page loll
  Répondre
#8
Je pense que tu n'as pas du tout compris ma réponse, qui était certes fort ironique mais pas désagréable: je t'ai donné tous les éléments dans ma première réponse et tu ne fais pas l'effort de chercher à comprendre. Si l'explication ne te parait pas claire, relis-la plusieurs fois, force-toi un peu.
Ce n'est pas à moi (ou un autre) de ré-expliquer alors que je pense avoir écrit quelque chose de plutôt simple, lisible et en bon français. Ce n'est pas la première fois que tu ne fournis pas le minimum syndical de réflexion et que tu réponds "je ne comprends pas", et tu fais cette réponse si vite qu'il semble évident que tu as survolé la réponse sans la lire vraiment.

Je rappelle encore une fois que le but de ce forum est d'apporter de l'aide en donnant des pistes, en aucun cas en pré-mâchant tout le travail, afin que les personnes apprennent plutôt que de simplement recopier des morceaux de scripts qu'elles ne comprennent pas.

Maintenant, tu peux aller bouder dans ton coin, ce sera certainement très productif.
  Répondre
#9
Alors je vais te répondre clairement.

Ironique En me parlant comme un mongole ? Excuse moi mais ce type d'ironie ne devrais pas avoir lieu.

Et je pense avoir relus plusieurs fois pour ne pas comprendre ou tu voulais en venir, pour preuve je pose la même question sur un réseau irc, et j'ai très bien compris ce qui voulais m'expliquer..

Tu pense que j'ai survolé sans comprendre ? Mais sache qu'avant de posté j'ai quand même chercher un bout de temps, et je n'es pas survolé j'ai bien tout lu !

(31/03/2017, 08:54)CrazyCat a écrit : Je rappelle encore une fois que le but de ce forum est d'apporter de l'aide en donnant des pistes, en aucun cas en pré-mâchant tout le travail, afin que les personnes apprennent plutôt que de simplement recopier des morceaux de scripts qu'elles ne comprennent pas.

Par contre la c'est toi qui survole mon premier poste, dit moi ou j'ai cité : donnez moi un code ?

(30/03/2017, 12:03)aliasangelius a écrit : J'ai tester ainsi mais sans aucun résultat, et la je viens poster en espérant avoir quelques explications/aides de votre part si c'est possible.

Je demande bien une aide/explication là non ?

(31/03/2017, 08:54)CrazyCat a écrit : Maintenant, tu peux aller bouder dans ton coin, ce sera certainement très productif.

Aucun problème je vais réaliser ton souhait Smile
Je vais mettre plus de temps à comprendre/trouvé mais sa ne me gêne pas.
Vous interdisez les erreurs, vous empêchez ainsi la victoire.

Ma super kikoo-page loll
  Répondre
#10
Salut,

Tu peux utiliser les fonctions SQL LIKE ou CHARINDEX déjà ca évitera le(s) while j'ajoute le s entre () car dans ton code il y a qu'une boucle du coté du résultat SQL mais il en faudrait aussi une coté IRC et faut savoir que les boucles suivant la taille du traitement çà peut prendre du temps.
  Répondre
#11
Code :
bind pubm - * pub:mod
proc pub:mod { nick host hand chan arg } {
    set arg [stripcodes bcruag [mirc:strip $arg]]
    set host [getchanhost $nick $chan]
    set host "*!*[string range $host [string first @ $host] e]"
    set boxscan [string tolower [lrange $arg 0 end]]
    set chan [string tolower $chan]
    # Badword
    if {[sql:boxchan $chan]} {
        service:connect
        mysqlsel $::mysqlink "SELECT * FROM `box`"
        if {[mysqlresult $::mysqlink rows] ne 0} {
            while {[set row [mysqlnext $::mysqlink]] != ""} {
                set spam [lindex $row 0]
                set type [lindex $row 1]
                set protect [lindex $row 2]
                foreach words $spam {
                    if {[string match *$words* $boxscan]} {
                        if { $nick != $::botnick } {
                            putserv "PRIVMSG $::back(chan) :\[\2$type\2\] $chan $nick : $boxscan"
                            putserv "privmsg $::back(chan) :$spam <= Ok"
                        }
                    }
                }
            }
        }
        service:deconnect
    }
}

proc sql:boxchan {arg} {
    service:connect
    set res [mysqlsel $::mysqlink "select * from `chanbox` where salon = '$arg'"]
    service:deconnect
    return $res
}

Si quelqu'un a une idée @alias_angelius est aussi preneur, pour l'instant cette procédure fonctionne mais elle parait très lourde (de la latence est repérée)
  Répondre
#12
Salut,

Comme j'ai dit plus haut il faut éviter les boucles surtout coté SQL



Code :
SELECT * FROM box
WHERE mot LIKE 'mot1'
 OR  mot LIKE 'mot2'
 OR  mot LIKE 'mot3'
 AND protect='off'
 AND channel='#ton_salon'
  Répondre
#13
@Strategy :
Moi je suis tout ouïe de ton idée car ce que tu marques on le sait déjà, je le prouve avec le code donc la question est: comment coderais-tu cela
PS: la Table box est dynamique et contient plus de 50mots pour le moment donc il y a forcement une boucle quelques part
  Répondre
#14
(01/04/2017, 21:00)DiXiT a écrit : @Strategy :
Moi je suis tout ouïe de ton idée car ce que tu marques on le sait déjà, je le prouve avec le code donc la question est: comment coderais-tu cela
PS: la Table box est dynamique et contient plus de 50mots pour le moment donc il y a forcement une boucle quelques part

Avec la fonction LIKE tu as pas forcement de boucles ca dépend comment tu codes le truc coté TCL et ca c'est le problème de tout développeurs pour arriver a un truc stable maintenable et évolutif avant de ce lancer tête baissé dans un code il faut avant tout réfléchir a ce que l'on veut faire et comment le faire. Sans vouloir êtres péjoratif juste explicatif! Il y a plusieurs méthodes pour faire ce que vous voulez faire de mon point de vue vous partez a l'envers en cherchant a boucler la BDD alors que la boucle devrait au pire des cas être faite sur votre phrase moi ce que je ferai a votre place sans etre un expert en TCL c'est:

1: Je verifiai si le protect='off' de votre requete est valide ou pas j'ai pas compris ce passage si non valide j’arrête la procédure
2: Je contrôlerai bien avoir une chaîne de caractère en vérifiant que j'ai pas du nul
3: Si j'ai bien au moins un mot  je commencerai par déclarer ma variable $request en lui indiquant quelques chose comme "select mot from box"
4: Je ferai une boucle de ma phrase avec un incrément commençant a 0 (ce qui me semble le plus simple mais dans d'autres langage je ferai autrement au experts du TCL de vous donnez d'autres solutions)
5: Si l’incrément est de 0 j'ajoute WHERE sinon OR a ma variable $request puis la suite nick LIKE MON_MOT 
6: J'incrémente encore ma variable sortie de ma boucle en vérifiant le salon "AND channel = $channel"
7: j'execute la requete SQL
8: Si j'ai un résultat a ma requête sql c'est que le mot est détecté dans ma phrase dans ce cas tu kick ban ou que sais je

 Après j'ai un raisonnement de développeur web mais je pense que cette solution est plus adéquate.

Un petit PS: Même si dans de très très rare cas on a pas le choix tout le monde te le dira il faut toujours éviter une boucle dans une boucle c'est le meilleur moyen de faire ramer un code ou pire de faire crasher le système et en général quand tu te retrouve avec une boucle dans une boucle c'est que forcément il y a un défaut de conception derrière.
  Répondre
#15
Code :
SELECT * FROM box WHERE (mot LIKE 'mot1'  OR  mot LIKE 'mot2'  OR  mot LIKE 'mot3')  AND protect='off' AND channel='#ton_salon'
Je ne vois pas l'intérêt d'utiliser un like (très consommateur de ressources) pour chercher un mot exact, le "=" va aussi bien.

Ensuite, ainsi que je le disais dans ma première réponse: il suffit de charger une fois pour toutes la liste des mots contenus dans une liste tcl (une par canal visé) et de compter l'intersection entre cette liste et la liste de mots contenus dans les phrases dites sur le canal. Si l'intersection est supérieur à 0, il y a au moins un des mots présent, sinon il n'y en a pas.
  Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)