SCORES AVEC TOP 10

SCORES AVEC TOP 10

Old snippet that stores some user stats. Because its old, we use it only for educational purposes. Maybe someone will find and/or will update it to the new irc standards.

Postat de Copyright Categorie Review user Vizualizari Data
BLKoldSUN Calop stats Cod netestat 522 2024-08-29 23:25:43

;#####CREATION, GESTION ET EXPLOITATION D'UN SYSTEME DE SCORES AVEC TOP 10#####

on $me:join:#: {
    if (!$hget(scores)) reset_scores $chan
    else hload scores. $+ $chan scores. $+ $chan $+ .txt
    .timertop3 0 300 sayTop3 $chan $chan
    .timertop10 0 1440 sayTop10 $chan $chan
}

;;;quand j'arrive sur un salon {
;;; si la table est inaccessible : j'effectue l'aliase qui permet d'initialiser les scores
;;; sinon : je charge cette table , propre au channel, qui est dans le fichier .txt du même nom
;;; j'engage le timer qui dira le top 3 toutes les 5 minutes
;;; j'engage le timer qui dira le top 10 toutes les 24 minutes
;;;}

on *:join:#: notice $nick Voici la liste de mes commandes, à taper après !scores : monscore, lescorede <pseudo>, top10, top3, liste.
on *:part:#: notice $nick J'espère que tu t'es bien amusé et te revoir bientôt sur $chan $+ !

;;;quand quelqu'un arrive sur le salon: je lui dis en notice la liste des commandes
;;;quand quelqu'un part du salon: je lui dit au revoir et l'encourage à revenir

on @:text:*!scores*:#: {
    if (!$2) notice $nick Je n'ai aps saisi ce que tu veux de moi.
    elseif ($2 == stop) .timertop* off
    elseif ($2 == plus) && ($3) plus $chan $3
    elseif ($2 == reset) reset_scores
    else notice $nick Je ne connais pas cette commande.
}

;;;quand un opérateur dit une phrase contenant !scores sur le salon {
;;; s'il ne précise pas la commande : je lui dis en notice qu'il me manque des informations
;;; sinon, si la commande est "stop" : je désactive tous les timers dont le nom contient "timertop"
;;; sinon, si la commande est "plus" et si il y a une précision : j'effectue l'aliase plus qui permet d'augmenter un score
;;; sinon, si la commande est "reset" : j'effectue l'aliase qui permet de réinitialiser les scores
;;; sinon : je dis à l'opérateur que je ne connais aps cette commande
;;;}

alias reset_scores {
    hfree scores. $+ $1
    hmake scores. $+ $1 100
    hadd scores. $+ $1 top1 0
    hadd scores. $+ $1 top2 0
    hadd scores. $+ $1 top3 0
    hadd scores. $+ $1 top4 0
    hadd scores. $+ $1 top5 0
    hadd scores. $+ $1 top6 0
    hadd scores. $+ $1 top7 0
    hadd scores. $+ $1 top8 0
    hadd scores. $+ $1 top9 0
    hadd scores. $+ $1 top10 0
    hadd scores. $+ $1 top1.nick <personne>
    hadd scores. $+ $1 top2.nick <personne>
    hadd scores. $+ $1 top3.nick <personne>
    hadd scores. $+ $1 top4.nick <personne>
    hadd scores. $+ $1 top5.nick <personne>
    hadd scores. $+ $1 top6.nick <personne>
    hadd scores. $+ $1 top7.nick <personne>
    hadd scores. $+ $1 top8.nick <personne>
    hadd scores. $+ $1 top9.nick <personne>
    hadd scores. $+ $1 top10.nick <personne>
    hsave -o scores. $+ $1 scores. $+ $1 $+ .txt
    msg $1 Les scores ont été remis à 0.
}

;;;quand on effectue l'aliase reset_scores {
;;; je détruits la table de scores du channel
;;; je crée la table de scores du channel
;;; j'ajoute dans la table l'item top1 qui contient le score 0
;;; ...
;;; j'ajoute dans la table l'item top10 qui contient le score 0
;;; j'ajoute dans la table l'item top1.nick qui contient le nom <personne>
;;; ...
;;; j'ajoute dans la table l'item top10.nick qui contient le nom <personne>
;;; je sauvegarde la table dans le fichier héponyme
;;; j'annonce au channel que les scores sont remis à 0
;;;}



alias top10 {
    :boucle
    inc %a
    if ($2 > $hget(scores. $+ $3,top $+ %a)) {
    if ($1 != $hget(scores. $+ $3,top $+ %a $+ .nick)) {
        hadd scores. $+ $3 top $+ $calc(%a+1) $hget(scores. $+ $3,top $+ %a)
        hadd scores. $+ $3 top $+ $calc(%a+1) $+ .nick $hget(scores. $+ $3,top $+ %a $+ .nick)
        notice $1 Bravo, tu es maintenant %a $+ $iif(%a == 1,er(e)) $+ $iif(%a > 1,ème) au classement des 10 meilleurs!
    }
    hadd scores. $+ $3 top $+ %a $2
    hadd scores. $+ $3 top $+ %a $+ .nick $1
    hsave -o scores. $+ $3 scores. $+ $3 $+ .txt
    goto fin
    }
    if (%a == 10) goto fin
    else goto boucle
    :fin
    unset %a
}

;##########PETITE INTERLUDE##########
;Ici, une petite explication s'impose.
;Afin de prendre le score d'une personne, la syntaxe est la suivante : $hget(scores. $+ <le channel>,top $+ <le classement>)
;Afin de prendre le nom d'une personne classée: voici : $hget(scores. $+ <le channel>,top $+ <le classement> $+ .nick)
;Ici, on utilise $3 car le channel est la troisieme info fournie, et %a car à chaque tour, le rang augmente.
;Quand quelqu'un "double" un autre dans el classement, celui-ci est placé dans le rang en dessous, ce qui explique le $calc(%a+1)
;Ensuite, on place le nouveau classé à sa place, ce qui est fait aussi quand le classé conserve tout de même sa place.
;##########FIN DE L'INTERLUDE##########



;;;quand quelqu'un effectue l'aliase top10 {
;;; début de la boucle "boucle"
;;; incrémentation de la variable %a
;;; si l'info $2 est plus grande que le score du premier au classement {
;;; si le nom à tester est le nom du top en cours {
;;;     je remplace le score de classement en dessous (précédemment occupé par le nouveau) par l'ancien classement testé
;;;     je remplace le nom du top en dessous de celui testé par celui du testé
;;;     j'annonce au nouveau qu'il a un nouveau classement
;;; }
;;; j'ajoute le score du gars à tester dans le classement à tester (symbolisé par %a)
;;; j'ajoute le gars du score ci-dessus dans le classement à tester
;;; je sauvegarde
;;; je vais à la fin de la boucle
;;; }
;;; si %a est égal à 10 : je vais à la fin
;;; sinon : je retourne en haut
;;; je détruis la variable %a
;;;}

on *:text:*!scores*:#: {
    if (!$2) notice $nick Que veux tu? Je ne vois pas ta requete.
    elseif ($2 == monscore) notice $nick Ton score est de $hget(scores. $+ $chan,score. $+ $nick) $+ $iif(!$hget(scores. $+ $chan,score. $+ $nick),0) point $+ $iif($hget(scores. $+ $chan,score. $+ $nick) > 1,s) $+ .
    elseif ($2 == lescorede) && ($3) notice $nick Le score de $3 est de $hget(scores. $+ $chan,score. $+ $3) $+ $iif(!$hget(scores. $+ $chan,score. $+ $3),0) point $+ $iif($hget(scores. $+ $chan,score. $+ $3) > 1,s) $+ .
    elseif ($2 == top10) top10 $nick $chan
    elseif ($2 == top3) top3 $nick $chan
    elseif ($2 == liste) notice $nick Voici la liste de mes commandes, à taper après !scores : monscore, lescorede <pseudo>, top10, top3, liste.
}

;##########PETITE INTERLUDE##########
;ici, vous me comprenez, pas d'explication nécessaire, c'est le même principe que pour les ops, en haut.
;##########FIN DE L'INTERLUDE##########

alias sayTop10 {
    msg $1 Voici le top 10 des $hget(scores. $+ $2,total) $+ $iif(!$hget(scores. $+ $2,total),0)) joueurs du salon $2 $+ .
    msg $1 1) $hget(scores. $+ $2,top1) ( $+ $hget(scores. $+ $2,top1.nick) $+ points).
    set %i 1
    :loop
    inc %i
    msg $1 %i $+ ) $hget(scores. $+ $2,top $+ %i) ( $+ $hget(scores. $+ $2,top $+ %i $+ .nick) $+ points) $calc(%i+1) $+ ) $hget(scores. $+ $2,top $+ $calc(%i+1)) ( $+ $hget(scores. $+ $2,top $+ $calc(%i+1) $+ .nick) $+ points) $calc(%i+2) $+ ) $hget(scores. $+ $2,top $+ $calc(%i+2)) ( $+ $hget(scores. $+ $2,top $+ $calc(%i+2) $+ .nick) $+ points).
    set %i $calc(%i+2)
    if (%i == 10) goto end
    else goto loop
    :end
    unset %i
}

;##########PETITE INTERLUDE##########
;Ici, même s'il n'est pas cécessaire d'utiliser une boucle, cela permet
;d'approfondir notre entrainement sur les boucles, deux fois vallent mieux qu'une
;##########FIN DE L'INTERLUDE##########

;;;quand quelqu'un effectue l'aliase sayTop10 {
;;; on annonce ce que l'on va dire...
;;; je dis le nom et le score du premier
;;; j'incrémente la variable %i, ce qui permet d'initialiser la boucle
;;; début de la boucle "loop"
;;; on incrémente %i, ce qui sera fait à chaque tour de boucle
;;; on donne les infos du classement n°%i, puis du n°%i+1, puis celles du n°%i+2
;;; on met la variable ou on s'en est arretes
;;; si %i est égale à 10 : on va à la fin "end"
;;; sinon : on retourne en haut
;;; la find e la boucle
;;; on défait la variable %i
;;;}

alias sayTop3 msg $1 1) $hget(scores. $+ $2,top1) ( $+ $hget(scores. $+ $2,top1.nick) $+ points) 2) $hget(scores. $+ $2,top2) ( $+ $hget(scores. $+ $2,top2.nick) $+ points) 3) $hget(scores. $+ $2,top3) ( $+ $hget(scores. $+ $2,top3.nick) $+ points).

;;;exactement comme plus haut, mais sans boucle et pour le top 3

alias plus {
    hinc scores. $+ $1 $2
    top10 $1 $hget(scores. $+ $2,$1) $2
    hsave -o scores. $+ $2 scores. $+ $2 $+ .txt
}

;;;quand quelqu'un effectue l'aliase plus {
;;; j'augmente le score de la personne donnée ($2

;#####EXEMPLE AVEC LE JEU DU NOMBRE#####

on *:text:!nombre:#: {
    if (%jeux) notice $nick Un jeu est déjà en cours.
    else {
    set %jeux ok
    set %nombre $rand(0,1000)
    msg $chan Le jeu du nombre est lancé: tapez !nb <le nombre> pour trouver le nombre entre 0 et 1000.
    }
}

on *:text:*!nb*: {
    if (!%jeux) notice $nick Le jeu n'a pas été lancé. Tapez !nombre.
    else {
    if ($2 < %nombre) notice $nick Le nombre secret est plus grand que $2 $+ .
    elseif ($2 > %nombre) notice $nick Le nombre secret est plus petit que $2 $+ .
    elseif ($2 == %nombre) {
        unset %jeux
        plus $nick $chan
        msg $chan Bravo, $nick $+ , tu as trouvé le nombre mystère quu était %nombre $+ !
    }
    }
}