Il est bon de savoir que mirc maintient, au fur et à mesure de vos navigations parmi les canaux de l'irc, une liste de userhosts des personnes que vous rencontrez.

La fonction permettant d'avoir le masque de userhost d'une personne sous irc est $address(Nick,N).

Le paramètre N permet d'obtenir un masque plus ou moins global: par exemple:

$address($me,0) retourne *!patrice@localhost

$address($me,1) retourne *!*patrice@localhost

$address($me,2) retourne *!*@localhost

Cette fonction ne donne pas toujours le résultat que l'on escompte: il lui arrive de ne rien retourner du tout, et voici pourquoi.

La réponse réside dans la question: comment mirc trouve-t-il l'adresse d'un nick? En effet, quand vous joignez un canal, il faut savoir que le serveur renvoie à votre mirc la liste des occupants, et rien de plus.

Pour votre culture, voici ce que le serveur peut m'envoyer lorsque je joins le canal #teuf:
:Averell!patrice@localhost JOIN :#teuf
:respublica.mine.nu 353 Averell = #teuf :@Donald +Picsou Riri Fifi Loulou Mickey Dingo Averell
:respublica.mine.nu 366 Averell #teuf :End of /NAMES list.
La première ligne est une notification du serveur comme quoi j'ai bien joint le canal. Notez tout de suite que non seulement mon nick, mais aussi mon userhost complet est renvoyé à mirc.

Le seconde ligne est un raw du serveur: il me donne la liste complète des occupants du canal, ainsi que leur état (op ou voices).

La troisième ligne m'indique que la liste des occupants est envoyée et qu'il n'y en a plus d'autres.

La seule personne sur laquelle je peux avoir des informations de userhost est donc moi seul. Si je demande l'adresse d'un utilisateur du canal à ce moment-là, la fonction $address() me retournera la chaîne nulle!

Maintenant, si l'un des occupants commet une action (un événement relatif à l'action d'une personne, voir chapitre précédent) alors son userhost complet va être transmis à mon mirc.

Par exemple, il suffit qu'il parle sur le canal (action de type TEXT) ce qui se traduit par la ligne:
:Donald!Donald@localhost PRIVMSG #teuf :coin coin
Notez que, à travers votre mirc, vous ne verrez que:
<Donald> coin coin
Si d'aventure j'essaye d'avoir l'adresse de Donald, j'aurai la surprise de voir que mirc la connaît, maintenant. Tout cela parce qu'il a dit "coin coin" sur la canal!

Maintenant il y a moyen d'obtenir artificiellement l'adresse d'une personne et de la faire stocker dans la mémoire de mirc: il suffit d'effectuer sur la personne l'une de ces instructions suivantes:

  • /userhost <nick>
  • /who <nick>
  • /whois <nick>


  • Voire même, de faire un /who #canal pour obtenir d'un seul coup les adresses de tous les occupants du canal.

    Attention: lorsque vous quittez le canal, mirc oublie les adresses des occupants de ce canal, sauf pour les quelques uns avec qui vous avez une conversation privée. Cela évite à mirc de stocker de plus en plus d'informations dont la majeure partie serait inutile.

    Maintenant, petite aparté. Aux lumières de ce que vous avez pu lire plus haut, essayez de comprendre pourquoi quand j'ai écrit cette ligne dans mon remote:
    on 1:join:#:if ($nick == $me ) { echo 1 $chan Il y a $nick($chan,0) occupant(s) dans $chan }
    
    mirc me fournissait systématiquement un nombre erroné (1 exactement) d'occupants?

    La réponse est simple: l'événement on join est traité avant que le serveur envoie à mirc la liste des occupants. Il faut le traiter une fois que mirc connaît effectivement cette liste; l'une des méthodes consiste à intercepter l'événement de serveur 366. C'est la plus propre à mon avis:
    raw 366:*: echo 1 $2 Il y a $nick($2,0) occupant(s) dans $2 
    
    Sachant que le paramètre $2 correspond au nom du canal.

    N.B. Le contraire de la fonction $address existe: il s'agit des fonctions $ial() et $ialchan() . Elles sont capables de fournir les nicks des personnes possèdant une adresse qui matche celle que vous désirez. La dernière fonction est très souvent utilisée pour la détection de clones dans un canal.

    Précédent: Un exemple   Suivant: Définir des aliases   Début de page   Sommaire