begin process at 2008 05 17 08:20:04
1 173 922 membres
53 nouveaux aujourd'hui
13 973 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BOT PARLANT


Information sur la source

Catégorie :Bots Classé sous : bots, parler, parle, parlant, bot Niveau : Débutant Date de création : 24/10/2007 Date de mise à jour : 07/01/2008 18:31:18 Vu : 4 666

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

Description

Ce bot enregistre ce que les personnes disent, et le re-dit de façon aleatoire (enfin si ça a un sens bien sur).
Exemple : Si une personne dit "Bonjour !" il va enregister le bonjour et le re-dire si quelqu'un d'autre dit bonjour.
Il peut donc s'addapter à toute les langues, mots ...

Source

  • on *:TEXT:*:#: {
  • var %repeat = 0
  • while(%repeat != 1000) {
  • inc %repeat
  • if ( $r(1,2) == 1 ) { set %msg $read(text.txt) }
  • elseif ( $r(1,5) == 1 ) { set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
  • else { set %msg $read(text.txt) $read(text.txt) }
  • if $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) {
  • timermsg 1 $r(2,5) msg $chan %msg
  • break
  • }
  • }
  • .fopen -on texte text.txt
  • .fwrite -n text $1 $2
  • .fwrite -n text $1 $2 $3 $4
  • .fwrite -n text $3 $4
  • .fwrite -n text $5 $6
  • if ( $r(1,100) == 5 ) { .fwrite -n text $nick }
  • .fclose text
  • unset %repeat
  • }
on *:TEXT:*:#: {
  var %repeat = 0
  while(%repeat != 1000) {
    inc %repeat
    if ( $r(1,2) == 1 ) { set %msg $read(text.txt) }
    elseif ( $r(1,5) == 1 ) { set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
    else { set %msg $read(text.txt) $read(text.txt) }
    if $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) {
      timermsg 1 $r(2,5) msg $chan %msg
      break
    }
  }
  .fopen -on texte text.txt
  .fwrite -n text $1 $2
  .fwrite -n text $1 $2 $3 $4
  .fwrite -n text $3 $4
  .fwrite -n text $5 $6
  if ( $r(1,100) == 5 ) { .fwrite -n text $nick }
  .fclose text
  unset %repeat
}

Conclusion

Pour tout bug, problème ... Merci de me le dire !
Ce bot parle bizarement mais il parle ! C'est déja bien !
25 octobre 2007 22:28:32 :
Remplacement du "timer msg" en "timermsg msg"
07 janvier 2008 18:18:44 :
Modification des writes en filehanding. Code maintenant en débutant. (ce qu'il mérite >.<)
07 janvier 2008 18:31:18 :
Modification des $rand en $r. Ajout d'une boucle While. Changement du Set %variable en Var %variable. Ajout d'une regex.
  • signaler à un administrateur
    Commentaire de TropNul le 24/10/2007 16:45:11

    lol, je suis sur que bon nombre de personnes tomberont dans le panneau et parleront a ce bot pendant un moment avant de se rendre compte du truc.

    a l'etat ou est le code, il y subsiste une faille importante. a savoir que sur un salon avec plusieurs personnes, il y aura de fortes chances qu'il soit deconnecter en 'excess flood'. donc, a revoir le systeme de 'timer msg ...' (peut-etre dans une queue de messagerie).

    a part ca, bon courage pour l'amelioration.

  • signaler à un administrateur
    Commentaire de ISoKa le 24/10/2007 23:02:39

    Bonjour,

    faire 3 write sur chaque on text ca va ramer sa mémée sur des gros chans. essai ptete de voir pour gerer ca autrement au moins file handling ou mieu htables.
    ensuite, pourquoi se limiter au 6iem mot pour le test ?

    ca pourrait etre bien optimiser je pense.

  • signaler à un administrateur
    Commentaire de wims le 25/10/2007 19:45:19

    Faire 3 write sur un on text ça va faire ramer mémée ? sur un de mes vieux pc 266mhz ouais, mais pas sur les pc d'aujourd'hui...

    Sur un fichier de plus de 700 lignes, je met 0 ms (15 max) a écrire trois fois dans le fichier,et le pc sur lequel je fais ça est vraiment bof :)

  • signaler à un administrateur
    Commentaire de Maxou1012 le 25/10/2007 22:27:05

    TropNul : Pour le timer j'ai mit un "timermsg msg ...", comme ça un timer à la fois !

    ISoKa : tu parle un if %msg isin $1- ? Comme ça tout le texte est prit ! Sinon pour les htable je vois pas comment faire pour savoir si un mot est dnas une table ...

    wims : Merci de défendre mon super ordi :D

  • signaler à un administrateur
    Commentaire de ISoKa le 26/10/2007 03:33:14

    je démord pas que franchement le write en 3 fois c grave pas joli et optimal :) moi je voi sur des remotes que je fai quand j'ai trop de write en meme temps je le sent passer. pour ce qui est des htables bin suffit au lieu de write de faire hadd et ensuite pour la recherche un $find ou $hmatch et ca se fai gentiment.

  • signaler à un administrateur
    Commentaire de TropNul le 26/10/2007 15:22:10

    as-tu fais des tests dans un salon 'reel' pour le timer nomme ?
    je pense que cela n'aura pour effet que de reinitialiser le timermsg a chaque fois dans le cas ou le prochain temps du timermsg est superieur au temps du timermsg precedent. du coup, les timer se 'mangeront' a chaque fois que ce cas se presentera.
    je ne peux affirmer ce que je dis car je n'ai pas les moyens de tester (pas de mirc installe sur le pc ou je suis) mais je maintiens toujours cette opinion.

    simple exemple:

    ;[code]
    alias timermangelautre {
      timerUn 1 10 echo -at salut toi
      timerUn 1 5 echo -at je ne salue pas :p
    }
    ;[/code]

    pour l'alias ci-dessus, je m'attendrais a ne voir s'afficher que 'je ne te salue pas :p'.

    au cas ou j'aurais tort, veuillez ignorer ce post. (honte a moi) mais ce n'est qu'un doute. donc, maintenant,  a toi de tester. mets pleins d'echo pour voir et savoir si vraiment tous les timers lances son executes et qu'il n'y en aient pas qui sont reinitialises par les prochains.

    cordialement

  • signaler à un administrateur
    Commentaire de TropNul le 26/10/2007 15:24:53

    ERRATA:

    [1]
    ...dans le cas ou le prochain temps du timermsg est superieur au temps du timermsg precedent...

    a remplacer par:

    ...dans le cas ou le prochain temps du timermsg est inferieur au temps du timermsg precedent...

    [2]
    timerUn 1 5 echo -at je ne salue pas :p

    a remplacer par:

    timerUn 1 5 echo -at je ne te salue pas :p

    ^^

  • signaler à un administrateur
    Commentaire de wims le 26/10/2007 18:17:32

    Il est vrai que faire des /writes signifie "ouvrir écrire et fermer le fichier" mais comme on dit, c'est de l'insolence de faire du file handling pour 3 write :)

  • signaler à un administrateur
    Commentaire de TropNul le 26/10/2007 18:26:26

    Tant que j'y suis, je continue.

    [REMARQUE1]
    Il faudrait aussi que tu prevois un systeme de remise a zero ou de stockage efficace du fichier text.txt. En effet, sa taille ne cessera de s'agrandir avec le present code.
    [/REMARQUE1]

    [REMARQUE2]
    Ce qu'isoka a fait ressortir n'est pas denue de sens. D'apres mes tests personnels d'il y a quelques temps, a partir de 7000 lignes dans un fichier txt et quand on n'utilise pas les moyens misent a diposition par mirc pour ce genre de cas, tu risques d'avoir des petits intervalles de 'freeze' de mirc. Mais c'est assez insignifiant si tu ne fais que trois write. Donc, dans le cas ou tu changerais la facon d'acceder a ce fichier ou alors si tu changes ton algorithme de recherche, et surtout, s'il t'arrives a inclure ne serait-ce qu'une seule boucle while, utilises le file handling ou des hash tables. Ce sera nettement mieux et aussi beau a voir :p.
    [/REMARQUE2]

    [REMARQUE3]
    L'identifieur $rand peut etre remplace par $r.
    [/REMARQUE3]

    [REMARQUE4]
    La condition

    if ( $1 isin %msg || $2 isin %msg || $3 isin %msg || $4 isin %msg || $5 isin %msg || $6 isin %msg ) { timermsg 1 $rand(2,5) msg $chan %msg }

    peut etre optimise par

    if $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) { timermsg 1 $r(2,5) msg $chan %msg }

    alors, oui, j'ai change son fonctionnement pour faire en sorte de verifier tous les mots dits par $nick. je pense que c'est mieux. mais evidemment, tu peux remplacer $1- par $1-6.
    [/REMARQUE4]

    [REMARQUE5]
    La methode dont tu as use pour le goto me laisse perplexe. Une boucle while serait plus 'propre' a mon avis.
    Voila ce que je propose:

    On *:Text:*:#:{
      Var %repeat = 0
      While (%repeat <= 1000) {
        If ($r(1,2) == 1) { Set %msg $read(text.txt) }
        ElseIf ($r(1,5) == 1) { Set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
        Else { Set %msg $read(text.txt) $read(text.txt) }
        If $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) { Timermsg 1 $r(2,5) Msg $chan %msg }
        Inc %repeat
      }
      If $6 { Write text.txt $5 $6 }
      ElseIf $4 {
        Write text.txt $3 $4
        Write text.txt $1 $2 $3 $4
      }
      ElseIf $2 { Write text.txt $1 $2 }
      If ($r(1,100) == 5) { Write text.txt $nick }
      UnSet %repeat
    }
    [/REMARQUE5]

    Si j'ai d'autres remarques/propositions, je le ferais :)

    Cordialement

  • signaler à un administrateur
    Commentaire de ISoKa le 26/10/2007 21:17:36

    surtout que
    # write text.txt $1 $2
    # else write text.txt $1 $2 $3 $4
    # write text.txt $3 $4
    # write text.txt $5 $6

    devient
    var %t $1-2
    else var %t $+(%t,$crlf,$1-4)
    var %t (%t,$crlf,$3-4,$crlf,$5-6)
    write text.txt %t

    ce que je prefere grandement perso (oui oui je suis un chieur et j'aime ca :) )

  • signaler à un administrateur
    Commentaire de wims le 27/10/2007 00:59:05

    met un $+, ça marchera mieux (3e ligne)

  • signaler à un administrateur
    Commentaire de ISoKa le 27/10/2007 02:00:08

    ha merde g raté tt l'effet à cause de cet oubli :/

  • signaler à un administrateur
    Commentaire de ISoKa le 27/10/2007 13:21:12

    Tropnul en lisant le code que tu as fai je voi :
      While (%repeat <= 1000) {
        If ($r(1,2) == 1) { Set %msg $read(text.txt) }
        ElseIf ($r(1,5) == 1) { Set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
        Else { Set %msg $read(text.txt) $read(text.txt) }
        If $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) { Timermsg 1 $r(2,5) Msg $chan %msg }
        Inc %repeat
      }

    pense peut etre à break si ton regex match pck si jamais y a bcp d'occurences dans le txt tu vas excess flood je pense. le code original avec ses if et elseif break de facon virtuelle.

  • signaler à un administrateur
    Commentaire de TropNul le 27/10/2007 14:13:23

    J'ai remplace

    set %repeat 0
    :repeat
    inc %repeat 1
    if ( $rand(1,2) == 1 ) { set %msg $read(text.txt) }
    elseif ( $rand(1,5) == 1 ) { set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
    else { set %msg $read(text.txt) $read(text.txt) }
    if ( $1 isin %msg || $2 isin %msg || $3 isin %msg || $4 isin %msg || $5 isin %msg || $6 isin %msg ) { timermsg 1 $rand(2,5) msg $chan %msg }
    elseif ( %repeat != 1000 ) { goto repeat }

    par

    While (%repeat <= 1000) {
      If ($r(1,2) == 1) { Set %msg $read(text.txt) }
      ElseIf ($r(1,5) == 1) { Set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
      Else { Set %msg $read(text.txt) $read(text.txt) }
      If $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) { Timermsg 1 $r(2,5) Msg $chan %msg }
      Inc %repeat
    }

    Dans l'original, il rebouclera tant que %repeat n'est pas egal a 1000 avec un increment unitaire. C'est exactement ce que j'ai fait dans ma version. Donc je ne vois pas ou le code original fait le 'break' virtuellement. Si c'est le 'elseif' de la condition 'elseif ( %repeat != 1000 ) { goto repeat }' alors c'est ce qui m'a rendu perplexe (cf. mes precedents posts) car, il aurait du mettre un 'if'. Mais, quand bien meme il y a un 'elseif', le code rebouclera toujours jusqu'a ce que %repeat equivaut a 1000.

  • signaler à un administrateur
    Commentaire de TropNul le 27/10/2007 14:24:14

    Mea Culpa.

    Tu avais raison isoka ;). Son code ne le fait pas 'virtuellement' mais bien concretement. Ah, le pouvoir du elseif ...

    Soit, mon code devient donc:

    On *:Text:*:#:{
      Var %repeat = 0
      While (%repeat <= 1000) {
        If ($r(1,2) == 1) { Set %msg $read(text.txt) }
        ElseIf ($r(1,5) == 1) { Set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
        Else { Set %msg $read(text.txt) $read(text.txt) }
        If $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) {
          Timermsg 1 $r(2,5) Msg $chan %msg
          ;thx isoka ^^
          Break
        }
        Inc %repeat
      }
      If $6 { Write text.txt $5 $6 }
      ElseIf $4 {
        Write text.txt $3 $4
        Write text.txt $1 $2 $3 $4
      }
      ElseIf $2 { Write text.txt $1 $2 }
      If ($r(1,100) == 5) { Write text.txt $nick }
      UnSet %repeat
    }

  • signaler à un administrateur
    Commentaire de ISoKa le 27/10/2007 15:39:25

    je disai virtuel pck c'est pas écri "break" par contre pour le bot, si on ve detect un mot de sa phrase présent dans le txt il serait peut etre interessant de ne detecter que les mots d'une longueur superieure ou egale à 3 ou 4 caracteres pour éviter le match sur le, la, du, de etc...

  • signaler à un administrateur
    Commentaire de wims le 27/10/2007 15:46:43

    On *:Text:*:#:{
      Var %a 1 ,%r $+($!read(text.txt),$chr(32))
      While (%repeat <= 1000) {
      var %m $str($(%r,2),$iif(!$r(0,1),1,$iif(!$r(0,4),3,2)))
      var %p $+(/(,$replace(%m,$chr(32),$chr(124)),)/i)
      If $regex($1-,%p) { Timermsg 1 $r(2,5) Msg $chan %m | Break }
      Inc %repeat
      }
      var %w $+($iif($6,$5-6,$iif($4,$+($3-4,$crlf,$1-4),$iif($2,$1-2))))
      Write text.txt %w
      If (!$r(0,99)) Write text.txt $nick
    }


    C'est peut-être pas la meilleur optimisation car c'est surement plus long, et c'est un peu moche, mais ça montre des techniques a utiliser lorsque certaine action se ressemble un peu trop et qu'on ne sais pas comment amélioré ça :)

  • signaler à un administrateur
    Commentaire de TropNul le 27/10/2007 17:17:12

    Ah sacre wims !

    +1 pour les techniques :)
    Mais, comme tu me connais, je privilegierais la rapidite.
    Par contre, je voudrais un peu d'explication sur cette syntaxe stp:

    $!read(text.txt)

    Je n'ai toujours pas capte le principe de mettre un '!' entre le $ et la commande. Quelles sont les applications les plus courantes de cette syntaxe ?

    Merci

    PS: Je dois m'excuser aupres de vous tous. Oui, je ne mets aucun accent aigue/grave/circonflexe ou autre cedille pour la simple et bonne raison que j'ai un foutu clavier qwerty et un pc qui refuse tout quand je veux modifier la langue. :(. Bref, maintenant vous savez lol. voila

  • signaler à un administrateur
    Commentaire de wims le 27/10/2007 18:02:42

    Le ! permet de retourné la forme non évalué d'un identifier/variable, du style :

    //echo -a $!me $!!me
    Combiné avec $() ( $eval() quoi ) :
    //echo -a $($!!me,3)
    ;$me est la forme évalué 0 fois
    ;la valeur de $me est la formé évalué 1 fois ...
    ;$!me c'est -1
    ;donc là, $!!me c'est -2, on évalue 3 fois , -2 + 3 = 1 on retrouve bien la valeur de $me évalué une fois.

    En gros dans le code, je stock la valeur non évalué de $read(text.txt) dans une variable parce que on va utiliser plusieur fois ce $read et la valeur doit etre actualisé a chaque fois qu'on l'utilise, si on mettais que $read(text.txt), la valeur serait tjs la même.J'utilise ensuite $(,2) pour actualisé a chaque coup :]

  • signaler à un administrateur
    Commentaire de TropNul le 28/10/2007 10:06:00

    Merfi wims pour ces eclaircissements. A present, je comprendrais mieux lors de la lecture de certaines sources ^^.

  • signaler à un administrateur
    Commentaire de Drummond le 02/01/2008 13:43:06 7/10

    super

  • signaler à un administrateur
    Commentaire de wims le 07/01/2008 19:21:05

    Je vois que tu n'écoutes pas trop les conseil qu'on te donne, et en plus tu as mis ton code a jour avec une erreur, au niveau du /while il manque un espace pour la condition

Ajouter un commentaire

Discussions en rapport avec ce code source

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS