Aller au contenu

chat — Messages

API chat MoonBot Lua : envoyer des messages et lire les messages privés reçus sur Unity.

Fonctions d'envoi et, sur Unity, de lecture des messages privés.

Index


Référence

chat.send

chat.send(channel: string, message: string)

returns boolean

Canaux : * (general), # (equipe), % (guilde), : (commerce), ? (recrutement), $ ou group/groupe/party (groupe), ^ (rencontres), ! (alignement), @ (admin). Comme le client officiel : les | sont retires du texte, un message vide n'est pas envoye et le canal Groupe n'envoie rien hors groupe. Retourne false dans ces cas (rien d'envoye), true quand le message part.


chat.party / chat.group

chat.party(message: string) / chat.group(message: string)

returns boolean

Parle sur le canal Groupe ($, commande /p du jeu). Retourne false sans rien envoyer si le personnage n'est dans aucun groupe (map.isInParty() == false) : le client officiel n'envoie jamais ce message hors groupe. Les messages du groupe s'affichent dans la console : [Groupe] Nom: texte. Dans le tableau de bord : onglet Chat, canal Groupe, ou le champ « Message au groupe » sous les membres du groupe dans le MapViewer.


chat.sendPM

chat.sendPM(target: string, message: string)

returns boolean

Message prive. false si le message est vide.


Raccourcis

chat.general(msg) / team(msg) / guild(msg) / trade(msg) / recruit(msg) / party(msg) / group(msg) / alignment(msg)

returns boolean

Raccourcis pour chaque canal ; false si le message est vide (party/group : aussi hors groupe). chat.alliance(msg) existe encore mais Retro n'a pas de canal Alliance : utiliser chat.alignment(msg) (!).


Exemple — parler au groupe

if map.isInParty() then
  chat.party("On part au donjon dans 1 minute")
else
  print("Pas de groupe : message non envoye")
end

Previent le groupe s'il existe. Sans le test, chat.party() retournerait simplement false hors groupe, sans rien envoyer.


Messages privés reçus — Unity

Ces fonctions sont disponibles sur MoonBot Unity, notamment sur le worker v211. Elles lisent le tampon des MP reçus par le personnage courant. Elles ne sont pas implémentées sous ces noms dans les moteurs Touch et Rétro actuels.

Utilisez la syntaxe avec un point : chat.getPrivateMessages(). La forme chat:getPrivateMessages() n'est pas prise en charge par cette fonction.

chat.getPrivateMessages

local messages = chat.getPrivateMessages()         -- MP encore conservés
local nouveaux = chat.getPrivateMessages(sinceSeq) -- seulement seq > sinceSeq

Retour : une table Lua indexée à partir de 1, vide {} si aucun message ne correspond. L'appel est immédiat : il n'attend pas de nouveau MP et ne supprime aucun message.

Le tampon conserve au maximum 100 MP, classés du plus récent au plus ancien. Seuls les MP reçus avec un contenu non vide y sont ajoutés ; les messages des canaux publics et les copies des MP envoyés ne sont pas inclus. Ce tampon n'est pas un historique permanent : si plus de 100 messages arrivent entre deux lectures, les plus anciens ne sont plus disponibles.

Le paramètre facultatif sinceSeq est un entier, égal à 0 par défaut. Seuls les messages dont seq est strictement supérieur sont retournés. La lecture ne mémorise pas votre curseur : le script doit le conserver et le mettre à jour.

Chaque message contient :

Champ Type Signification
seq entier Numéro croissant du MP dans ce tampon ; sert de curseur.
sender chaîne Nom de l'expéditeur.
senderId entier Identifiant du personnage expéditeur ; 0 si indisponible.
content chaîne Texte du message.
fromAdmin booléen Indicateur admin/modérateur fourni par le serveur de jeu.
at entier Date de réception par MoonBot, en millisecondes depuis l'époque Unix.

Lecture simple :

for _, mp in ipairs(chat.getPrivateMessages()) do
    global:printMessage(mp.sender .. " : " .. mp.content)
end

Lecture répétée sans retraiter les mêmes messages, dans l'ordre chronologique :

local dernierSeq = 0

-- À appeler depuis votre logique de script lorsqu'une lecture est nécessaire.
function lireNouveauxMP()
    local messages = chat.getPrivateMessages(dernierSeq)
    for i = #messages, 1, -1 do
        local mp = messages[i]
        global:printMessage(mp.sender .. " : " .. mp.content)
        dernierSeq = math.max(dernierSeq, mp.seq)
    end
end

Pour ignorer les MP déjà présents au démarrage du suivi, initialisez plutôt dernierSeq avec chat.privateMessageSeq(). Ce curseur appartient au tampon du personnage courant ; ne le partagez pas entre personnages.

Fonctions associées

Fonction Comportement
chat.privateMessages(sinceSeq) Alias exact de chat.getPrivateMessages(sinceSeq). Le paramètre est facultatif.
chat.lastPrivateMessage() Retourne le MP le plus récent conservé, ou nil si le tampon est vide.
chat.privateMessageSeq() Retourne le dernier numéro attribué, ou 0 si aucun MP n'a été enregistré dans le tampon.
chat.clearPrivateMessages() Vide le tampon et retourne true, sans remettre le compteur seq à zéro.
chat.waitForPrivateMessage(timeoutMs) Attend un MP reçu après le début de l'appel et retourne le plus ancien de ces nouveaux MP encore conservés, ou nil au timeout.

chat.waitForPrivateMessage() attend 30 secondes par défaut. Le délai est exprimé en millisecondes et borné entre 1 et 3 600 000. Cette attente suspend la suite du script, respecte son annulation et ne consomme pas les messages. Un MP déjà présent avant l'appel ne suffit pas à terminer l'attente.

local mp = chat.waitForPrivateMessage(5000)
if mp then
    global:printMessage(mp.sender .. " : " .. mp.content)
end