(À SUPPRIMER)

cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009 - 24 oct. 2007 à 16:45
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 - 7 janv. 2008 à 19:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44491-a-supprimer

cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
7 janv. 2008 à 19:21
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
cs_Drummond Messages postés 1 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 2 janvier 2008
2 janv. 2008 à 13:43
super
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
28 oct. 2007 à 10:06
Merfi wims pour ces eclaircissements. A present, je comprendrais mieux lors de la lecture de certaines sources ^^.
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
27 oct. 2007 à 18:02
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 :]
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
27 oct. 2007 à 17:17
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
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
27 oct. 2007 à 15:46
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 :)
cs_ISoKa Messages postés 435 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 17 octobre 2008
27 oct. 2007 à 15:39
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...
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
27 oct. 2007 à 14:24
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
}
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
27 oct. 2007 à 14:13
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.
cs_ISoKa Messages postés 435 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 17 octobre 2008
27 oct. 2007 à 13:21
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.
cs_ISoKa Messages postés 435 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 17 octobre 2008
27 oct. 2007 à 02:00
ha merde g raté tt l'effet à cause de cet oubli :/
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
27 oct. 2007 à 00:59
met un $+, ça marchera mieux (3e ligne)
cs_ISoKa Messages postés 435 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 17 octobre 2008
26 oct. 2007 à 21:17
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 :) )
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
26 oct. 2007 à 18: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
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
26 oct. 2007 à 18:17
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 :)
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
26 oct. 2007 à 15:24
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

^^
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
26 oct. 2007 à 15:22
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:

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


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
cs_ISoKa Messages postés 435 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 17 octobre 2008
26 oct. 2007 à 03:33
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.
cs_Maxou1012 Messages postés 13 Date d'inscription samedi 24 février 2007 Statut Membre Dernière intervention 6 février 2008
25 oct. 2007 à 22:27
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
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
25 oct. 2007 à 19:45
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 :)
cs_ISoKa Messages postés 435 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 17 octobre 2008
24 oct. 2007 à 23:02
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.
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
24 oct. 2007 à 16:45
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.