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 : 7 768

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

Cliquez pour voir la capture en taille normale
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 !
 

Historique

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.

Commentaires et avis

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 dans le forum

OH?mIRC me parle..ki me parle? [ par YoSkATeR ] tien aufait il parai kon peu faire parler notre chere mIRC et oui ouide plus g deja vu mon pc me parler kan g utilisé "sub7"mais seulement g pas testé BOT qui parle, comment faire ? [ par TheOnlyMaX ] lu all,Je suis completement nouveau sur irc, et j'aimerais faire un BOT qui parle tout seul toutes les 30 secondes. Il irait chercher les phrases dans Idle bots [ par exeral ] Je sais pas si vous avez remarquermais c la mode des idles bots(sur quakenet en tout cas )donc je voulais savoir si on peut me dire où en trouver ou c Bots permanents [ par djrandu ] Bonjour.J'aimerais installer un bot permanent dans mon channel.Un bot qui soir capable de rester connecter lorsque mon ordi est éteind ou que je ne so Bot floodeur [ par Lyune ] Bonjour,Mon probl&#232;me : des bots join mon channel, jamais ac le m&#234;me host, souvent ils viennent de chez wanadoo avec des lieux diff&#233;rent recherche addon pour faire parler un bot cservice [ par dj_balboa ] bonjourvoila je recherche une addon pour mon bot cservice pour le faire parler mais je ne trouve pas pourriez vous m'aidez ou me dire ou puis je trouv Ban sur speudonyme precis [ par foufou33 ] Bonjour a tous,Voila comme vous pouvez le voir sur le serveur orange ya beaucoup de bots espions et cela deviens genant ! pour cela j'aimerai bannir c msg ne s'affichant pas au bon endroit [ par Mauricelepoisson ] Salut !J'ai bidouillé un petit bot d'anim sensé dire un message humoristique à chaque "quit" d'user mais je ne pige pas pourquoi ce message ne s'affic Dcc Chat pour bot mIRC [ par XavSniper ] Bonjour tout le monde.J'essai de faire un système de DCC Chat pour bot mIRC, mais comme vous vous en seriez douté, celà ne marche pas, ce qui explique Possibilité de faire des bot partager ? [ par SawKiller ] Bonjour a tous,Voila ma question est :Est-il possible de réaliser un "bot" de protection et autres options partagerpour plusieurs utilisateur sur des


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,577 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.