Besoin d'aide en rapport avec /write

Résolu
cs_YkS Messages postés 25 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 6 avril 2008 - 3 mai 2007 à 20:11
cs_YkS Messages postés 25 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 6 avril 2008 - 4 mai 2007 à 18:46
Bonjour à tous,
Je viens demander de l'aide sur le forum en rapport à la commande /write.
En effet j'ai codé un bot mIRC que j'étoffe au fur et à mesure depuis maintenant plus de deux ans, et j'ai récemment voulu créer dans le cadre d'un autre script, un petit script de slap, je m'explique:

Ce script est censé lorsqu'une personne tape une commande, mettre son nick dans un fichier .txt, lorsque plusieurs personnes ont tapé cette commande, que les nicks se sont donc inscrit dans le .txt les uns en dessous des autres, et qu'une de ces personnes tapes: !go, slaper toutes les personnes de ce .txt à l'exception de la personne ayant tapé !go (ça n'est pas d'une importance capitale, mais c'est une des conditions que je me suis imposé afin de rendre le script plus intéréssant à coder)

Pour cela j'ai donc codé ce petit bout de script:

  if ($1 = = !go) {
    write -ds $+ $nick dispos-v2\slaps.txt
    slapdispos $chan
    write dispos-v2\slaps.txt $nick
  }

alias slapdispos {
  if ($1) {
    var %i 1
    set %nbperf $lines(dispos-v2\slaps.txt)    if ((%nbperf 0) || (%nbperf $null)) {
      msg $chan Il n'y a personne à slaper, car aucune disponibilité n'a été rentrée.
      halt
    }
    while (%i <= %nbperf) {
      describe $chan demande à $read(dispos-v2\slaps.txt,%i) de se magner et de ramener son cul sur vt fastement !
      inc %i
    }
  }
}

Ce !go, pour réaliser la contrainte que je me suis imposé, efface donc temporairement le pseudo de la personne dans le .txt, slap les pseudos restants sur le .txt, puis réinscrit le nick de la personne dans le .txt de façon à ce que cette personne soit slappée si jamais quelqu'un d'autre décidait de taper la commande...

Mais voilà le problème: Lorsque la personne tape !go son pseudo est éffacée et réécrit, mais à la dernière ligne du .txt, et non pas à la ligne où il était à l'origine, donc si c'est le dernier pseudo, ça va, mais sinon, c'est pas bon... Et j'aurais besoin que le /write réécrive le nick à la même place qu'il était initialement, car ce script fonctionne en binomme avec un 2ème .txt et du coup ça bug...

Pour résumer: Comment faire pour éffacer une ligne d'un .txt, puis pouvoir la réécrire exactement à la même place juste après ?
Contrainte: Eviter si possible les solutions ne rentrant plus dans le cadre du /write et du .txt

Merci d'avance !

8 réponses

RCA ArKanis Messages postés 1287 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 21 février 2009
4 mai 2007 à 11:39
Ca serait plus simple pour toi de faire ton alias slapdispos comme ça :
alias slapdispos {
  if (!$1) return
  var %i = 1, %nbperf = $lines(dispos-v2\slaps.txt)
  if (!%nbperf) {
    msg $chan Il n'y a personne à slaper, car aucune disponibilité n'a été rentrée.
    return
  }
  while (%i <= %nbperf) {
    if ($read(dispos-v2\slaps.txt,%i) != $2) describe $1 demande à $v1 de se magner et de ramener son cul sur vt fastement !
    inc %i
  }
}

et ton if :
  if ($1 == !go) slapdispos $chan $nick
3
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
4 mai 2007 à 13:31
Pour réécrire a la bonne ligne, tu doit stocké cette ligne donc /noop $read(fichier.txt,w,$+(*,$nick,*)) | var %line = $readn

apres un apel de $read, $readn retourne la ligne correpondante s'il y en a une
et pour réécrire a la bonne ligne c'est /write -lN ou N est la ligne
3
RCA ArKanis Messages postés 1287 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 21 février 2009
4 mai 2007 à 14:24
dans : if ($mot1 != $mot 2) ...
si le if est vérifié, alors $v1 vaudra $mot1 et $v2 $mot2
c'est comme $ifmatch, si tu connais, sauf que là tu choisis quel partie utiliser

dans ton cas, ça me permet de ne pas réutiliser $read(dispos-v2\slaps.txt,%i) (qui est assez long)

L'aide de mIRC donne ça :
$v1 & $v2
Returns the first and second parameters of an if-then-else comparison. So, in the case of this comparison:
if (text isin sometext) { ... }
$v1 will return "text" and $v2 will return "sometext".

Ma méthode consiste à envoyer le describe si le nick ne correspond pas à celui qui a tapé la commande, ça évite de le supprimer de la liste pour le remettre ensuite
C'est juste le if ($read(dispos-v2\slaps.txt,%i) != $2) qui permet ça
3
cs_YkS Messages postés 25 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 6 avril 2008
4 mai 2007 à 14:14
Bah écoutez merci beaucoup, c'est nikel, j'ai simplifié mon code grâce à l'alias d'ArKanis et ça marche impec, j'aimerais seulement que tu me décrives la partie du script qui permet de ne pas slapper la personne qui dit !go parceque j'ai regardé un peu $v1 je connais pas du tout (je suis débutant hein :s) et j'avou que je n'en ai pas trop compris l'utilité.

Quant à wims merci beaucoup, ça va me servir pour une autre partie de mon script qui n'est pas simplifiable par la méthode d'ArKanis, donc encore une fois un grand merci.

Je viens pas souvent sur le forum, mais en tout cas à chaque fois je suis super bien reçu, et il est rare que je ne trouve pas réponse à mon problème. Merci :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
4 mai 2007 à 14:51
$v1 ou $v2 fonctionne sur nimporte quel comparaison, quel sois vérifié ou non :)
0
cs_YkS Messages postés 25 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 6 avril 2008
4 mai 2007 à 16:37
Ah ok j'pense avoir compris, j'avais effectivement cherché dans l'mIRC help, et j'avais compris le fonctionnement, mais j'en voyais pas du tout l'utilité, surtout pour ce que je voulais faire, j'avais pas compris que tu l'avais utilisé par un simple souci de simplification du code, c'est là où on reconnait les programmeurs aguéris des débutants ^^

Par contre j'dois avouer que la fin de ton alias me chiffone, enfin même si j'ai compris comment t'as fait, j'aurais pas eu les reflexes de faire comme t'as fait, sans doute par manque d'experience je sais pas.. J'ai pas bien compris l'utilité des $1 et $2... Perso j'aurais fait (en gardant le reste du code comme tu l'as fait):

if ($read(dispos-v2\slaps.txt,%i) != $nick) describe $chan demande à $v1 de se magner et de ramener son cul sur vt fastement !
inc %i
}
}

et mon if :
if ($1 == !go) slapdispos $chan $nick

Ca devrait fonctionner aussi nan ? Ou esque je devrais faire comme toi à l'identique ? Désolé pour toutes ces questions, mais j'aime bien essayer d'comprendre tout le code plutôt que de recopier bêtement, ça m'évitera de venir reposer les mêmes questions à l'avenir.
0
RCA ArKanis Messages postés 1287 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 21 février 2009
4 mai 2007 à 17:24
ben $1 est ton premier argument et $2 ton 2e
quand tu appelles l'alias slapdispos, tu mets derrière $chan et $nick (slapdispos $chan $nick)
$chan et $nick ne représentant qu'un mot chacun, $1 serait donc $chan et $2 $nick

Je sais pas si avec ta méthode il conserve $nick et $chan de l'évènement à l'alias mais je pense que oui
Après, y'a pas de "meilleure", à toi de prendre ce que tu préfères
Avec ma méthode, si jamais tu veux le faire manuellement, pour expérimenter par exemple, il te suffit simplement de taper /slapdispos #TonSalon UnNick

Pas de problème, c'est pour la bonne cause :)
0
cs_YkS Messages postés 25 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 6 avril 2008
4 mai 2007 à 18:46
Ouais ouais j'ai testé ça fonctionne bien avec ma méthode.
Et j'avais bien compris pour les $1 et $2 c'est juste que perso j'aurais pas pensé à mettre ça, pour moi $nick et $chan sont plus instinctifs pour faire ça.

J'ai voulu éditer mon post pour dire que ça fonctionnait correctement mais apparemment on peut pas sur ce forum..
0
Rejoignez-nous