moonbot.memory — Mémoire des scripts¶
Mémoire des scripts MoonBot (moonbot.memory) : données persistantes partagées par tous vos comptes et Controllers, sans action Mon IA.
14 fonctions dans ce namespace.
Index¶
Une mémoire partagée par tous vos comptes, sans coût Mon IAmoonbot.memory:getmoonbot.memory:setmoonbot.memory:deletemoonbot.memory:getEntrymoonbot.memory:listmoonbot.memory:keysmoonbot.memory:incrementmoonbot.memory:setIfAbsentmoonbot.memory:usageLimitesExemple — compteur commun à tous les comptesExemple — réserver un enclos publicExemple — parcourir une famille de clés
Référence¶
Une mémoire partagée par tous vos comptes, sans coût Mon IA¶
-- Script principal : n'importe où ; Controller : dans tick()
local total = moonbot.memory:get("elevage:oeufs") or 0
moonbot.memory est une mémoire clé → valeur durable, partagée par tous vos comptes et vos Controllers, quel que soit leur worker : une valeur écrite par un compte est lue par les autres et survit à l'arrêt des scripts comme aux redémarrages. Mêmes noms dans les scripts principaux et les Controllers ; dans un Controller, appelez-la seulement dans tick, comme tout appel au serveur. Lire ou écrire ne consomme aucune action Mon IA. Le dashboard l'affiche et la modifie dans Controllers › Mémoire des scripts.
moonbot.memory:get¶
returns valeur | nil
Valeur de la clé, nil si elle n'existe pas ou a expiré. Une table revient en table Lua (tableau ou table à clés chaînes).
moonbot.memory:set¶
returns true
Écrit ou remplace la valeur : nil, booléen, nombre, chaîne ou table (tableau sans trou, ou table à clés chaînes ; ni fonction, ni cycle, ni table mixte, 16 niveaux au plus). value = nil supprime la clé. ttl_seconds, de 1 s à 1 an, la fait expirer ; sans TTL, elle reste jusqu'à sa suppression.
moonbot.memory:delete¶
returns boolean
Supprime la clé ; true si elle existait.
moonbot.memory:getEntry¶
returns {key, value, version, updated_at, updated_by, expires_at} | nil
La valeur et ses métadonnées : version (augmente à chaque écriture), updated_at et expires_at en secondes Unix (expires_at = nil sans TTL), updated_by = « account:
moonbot.memory:list¶
returns entrée[] (+ next_after)
Entrées (forme de getEntry) dont la clé commence par prefix, triées par clé : 100 par défaut, 500 au plus, moins si les valeurs sont grosses. S'il en reste, le tableau porte next_after : passez-le en after pour la page suivante (nil en fin de liste).
moonbot.memory:keys¶
returns string[] (+ next_after)
Comme list, mais seulement les clés (et next_after s'il en reste) : plus léger pour compter ou parcourir.
moonbot.memory:increment¶
returns number
Ajoute delta de façon atomique et rend la nouvelle valeur : deux comptes qui incrémentent au même moment ne perdent aucun ajout. Une clé absente vaut 0 ; une valeur non numérique lève une erreur.
moonbot.memory:setIfAbsent¶
returns boolean
Crée la clé seulement si elle n'existe pas : true si cet appel l'a créée, false si elle était déjà là. Sert de verrou ou de réservation entre comptes ; donnez-lui un TTL pour qu'un verrou oublié (bot coupé en route) se libère seul.
moonbot.memory:usage¶
returns {keys, bytes, max_keys, max_bytes, max_value_bytes}
Place occupée par vos clés et limites de votre compte MoonBot.
Limites¶
-- clé : 1 à 200 octets UTF-8, sans caractère de contrôle
-- valeur : JSON de 64 Kio au plus
-- 10 000 clés et 16 Mio (clés + valeurs) par utilisateur
-- TTL : de 1 s à 1 an
-- débit : 50 écritures/s (rafale 500), 500 lectures/s (rafale 5 000)
Limites par utilisateur MoonBot, tous comptes confondus. Le débit est compté par utilisateur et par processus (chaque worker, le serveur). Une écriture refusée (clé trop longue, valeur trop grande, mémoire pleine, débit dépassé) lève une erreur qui donne son motif : attrapez-la avec pcall pour réessayer plus tard.
Exemple — compteur commun à tous les comptes¶
-- Chaque compte ajoute sa récolte au total commun.
local total = moonbot.memory:increment("elevage:oeufs", 4)
global:printMessage("Oeufs récoltés par tous les comptes : " .. total)
increment est atomique : avec get puis set, deux comptes qui ajoutent au même moment écraseraient l'ajout de l'autre.
Exemple — réserver un enclos public¶
local cle = "enclos:" .. map.currentMapId()
if moonbot.memory:setIfAbsent(cle, global.accountTag(), 600) then
-- enclos réservé 10 min par ce compte
-- ... nourrir, récolter ...
moonbot.memory:delete(cle) -- libéré dès la fin
else
global:printMessage("Enclos déjà pris par " .. tostring(moonbot.memory:get(cle)))
end
Un seul compte obtient true : les autres voient la réservation et passent leur tour. Le TTL de 600 s libère l'enclos même si le bot est coupé avant le delete.
Exemple — parcourir une famille de clés¶
local after = nil
repeat
local page = moonbot.memory:list("elevage:", 100, after)
for _, entry in ipairs(page) do
global:printMessage(entry.key .. " = " .. tostring(entry.value))
end
after = page.next_after -- nil : fin de la liste
until not after
list rend au plus limit entrées triées par clé, moins si les valeurs sont grosses : seul next_after dit s'il reste des entrées, jamais le nombre reçu.