Aller au contenu
Afficher dans l'application

Une meilleure façon de naviguer. En savoir plus.

Asterobot

Une application plein écran sur votre écran d'accueil avec notifications push, badges et plus encore.

Pour installer cette application sur iOS et iPadOS
  1. Appuyez sur Icône de partage dans Safari
  2. Faites défiler le menu et appuyez sur Ajouter à l'écran d'accueil.
  3. Appuyez sur Ajouter dans le coin supérieur droit.
Pour installer cette application sur Android
  1. Appuyez sur le menu à trois points (⋮) dans le coin supérieur droit du navigateur.
  2. Appuyez sur Ajouter à l'écran d'accueil ou Installer l'application.
  3. Confirmez en appuyant sur Installer.

Smooth

Administrateurs

Tout ce qui a été publié par Smooth

  1. Move the listed inventory items into the open storage (bank). Kind request · Area Game.Exchange Moves items from your inventory into the storage while a storage (bank) is open. WHAT TO DO Fill objects_uid with the uids of the items to move (at most 800 per request: the official client splits a longer selection into several requests). Expect the storage and inventory update events in return. When you may send it Requires exchange_open inferred Related messages Nothing answers it - send it and move on the server reports the moved items through the storage and inventory update events, not with a reply Fields #FieldTypeMeaningYou set it 1objects_uidrepeated int32The items to move, by object uid. (object uid) The official client sends at most 800 uids per request and splits a longer selection.always
  2. Move into your inventory every storage item your inventory already holds a stack of. Kind request · Area Game.Exchange Moves items from the storage into your inventory, only items your inventory already holds while a storage (bank) is open. WHAT TO DO Send it with no content; any member the message declares is padding the official client leaves unset. Expect the storage and inventory update events in return. When you may send it Requires exchange_open inferred Related messages Nothing answers it - send it and move on the server reports the moved items through the storage and inventory update events, not with a reply No fields you may set.
  3. Move into the open storage every inventory item the storage already holds a stack of. Kind request · Area Game.Exchange Moves items from your inventory into the storage, only items the storage already holds while a storage (bank) is open. WHAT TO DO Send it with no content; any member the message declares is padding the official client leaves unset. Expect the storage and inventory update events in return. When you may send it Requires exchange_open inferred Related messages Nothing answers it - send it and move on the server reports the moved items through the storage and inventory update events, not with a reply No fields you may set.
  4. Move every item of the open storage (bank) into your inventory. Kind request · Area Game.Exchange Moves items from the storage into your inventory while a storage (bank) is open. WHAT TO DO Send it with no content; any member the message declares is padding the official client leaves unset. Expect the storage and inventory update events in return. When you may send it Requires exchange_open inferred Related messages Nothing answers it - send it and move on the server reports the moved items through the storage and inventory update events, not with a reply No fields you may set.
  5. Move every item of your inventory into the open storage (bank). Kind request · Area Game.Exchange Moves items from your inventory into the storage while a storage (bank) is open. WHAT TO DO Send it with no content; any member the message declares is padding the official client leaves unset. Expect the storage and inventory update events in return. When you may send it Requires exchange_open inferred Related messages Nothing answers it - send it and move on the server reports the moved items through the storage and inventory update events, not with a reply
  6. Smooth a posté un record dans Types
    A summoned monster: which monster it is, and its grade or level. Kind struct · Area Game.Action The monster branch of EntitySpawnInformation.spawn_information. READ IT LIKE THIS 1. EntitySpawnInformation.Monster.monster_gid is the monster's id in the game data (Monsters). 2. Exactly one of EntitySpawnInformation.Monster.grade and EntitySpawnInformation.Monster.level is set: a grade picks the monster's grade (1 = the first grade); a level is used for monsters that scale by level. 3. Ignore the other members. WHAT THE CLIENT DOES. It rebuilds the summon as a fighter with an AI branch: the monster id goes to MonsterFighter.monster_gid, the grade to MonsterFighter.creature_grade and the level to MonsterFighter.creature_level. Not sent on its own — a branch of EntitySpawnInformation.spawn_information, never sent on its own. proven Used by EntitySpawnInformation Fields #FieldTypeMeaningYou set it 5monster_gidint32The summoned monster's id in the game data (Monsters). Copied to MonsterFighter.monster_gid.never 1gradeint32The monster's grade, when it is summoned at a grade. Copied to MonsterFighter.creature_grade.never 4levelint32The monster's level, when it is summoned at a level instead of a grade. Copied to MonsterFighter.creature_level.never
  7. A summoned companion: its model, level and master. Kind struct · Area Game.Action The companion branch of EntitySpawnInformation.spawn_information. READ IT LIKE THIS 1. EntitySpawnInformation.Companion.model_id is the companion's model in the game data. 2. EntitySpawnInformation.Companion.level is its level. 3. EntitySpawnInformation.Companion.master_id is the fighter it belongs to. 4. Ignore the other members. WHAT THE CLIENT DOES. It rebuilds the summon as an entity fighter: the model goes to EntityFighterInformation.entity_model_id, the level to EntityFighterInformation.level and the master to EntityFighterInformation.master_id. Not sent on its own — a branch of EntitySpawnInformation.spawn_information, never sent on its own. proven Used by EntitySpawnInformation Fields #FieldTypeMeaningYou set it 2levelint32The companion's level. Copied to EntityFighterInformation.level.never 3master_idint64The id of the fighter the companion belongs to. Copied to EntityFighterInformation.master_id. Beta has two int64 ids here (summoner and owner); which of them this is cannot be told, so the name follows the destination.never 5model_idint32The companion's model id in the game data (Companions). Copied to EntityFighterInformation.entity_model_id.never
  8. A summoned character-like fighter: its name and level. Kind struct · Area Game.Action The character branch of EntitySpawnInformation.spawn_information: a summon that fights like a character (a double of the caster, for instance). READ IT LIKE THIS 1. EntitySpawnInformation.Character.name is the name to show for the fighter. 2. EntitySpawnInformation.Character.level is its level. WHAT THE CLIENT DOES. It rebuilds the summon as a named fighter: the name goes to NamedFighterInformation.name, the level to FightCharacterInformation.level. Not sent on its own — a branch of EntitySpawnInformation.spawn_information, never sent on its own. proven Used by EntitySpawnInformation Fields #FieldTypeMeaningYou set it 1levelint32The fighter's level. Copied to FightCharacterInformation.level.never 2namestringThe fighter's name, shown like a character's. Copied to NamedFighterInformation.name.never
  9. Smooth a posté un record dans Types
    What a summoned fighter is: a monster, a character or a companion. Kind struct · Area Game.Action The SummonContextInformation.spawn_information of a summon: what kind of fighter the server summoned. Exactly one branch of EntitySpawnInformation.spawn_information is set. READ IT LIKE THIS 1. EntitySpawnInformation.monster set: the summon is a monster - see EntitySpawnInformation.Monster for its id and grade. Look the monster up in the game data to know its spells. 2. EntitySpawnInformation.character set: the summon is a character-like fighter (a double, for instance) - see EntitySpawnInformation.Character for its name and level. 3. EntitySpawnInformation.companion set: the summon is a companion - see EntitySpawnInformation.Companion. WHAT THE CLIENT DOES. It rebuilds every summon as an ordinary fighter: a monster becomes an AI fighter with a MonsterFighter, a character a NamedFighterInformation with a FightCharacterInformation, a companion an EntityFighterInformation. Not sent on its own — it travels inside SummonContextInformation.spawn_information. proven Used by SummonContextInformation Fields #FieldTypeMeaningYou set it 1characterEntitySpawnInformation.CharacterSet when the summon is a character-like fighter - see EntitySpawnInformation.Character. Its name is copied into NamedFighterInformation.name.never 2companionEntitySpawnInformation.CompanionSet when the summon is a companion - see EntitySpawnInformation.Companion. Its members are copied into EntityFighterInformation.never 3monsterEntitySpawnInformation.MonsterSet when the summon is a monster - see EntitySpawnInformation.Monster. Its members are copied into MonsterFighter.never
  10. Smooth a posté un record dans Types
    What a dig during a treasure hunt did. Kind enum · Area Game.Treasure.Hunt Carried by TreasureHuntDigAnswerEvent.result. Every value is named after the message the official client shows for it. Not sent on its own — an enum carried by TreasureHuntDigAnswerEvent.result, never sent on its own. inferred Used by TreasureHuntDigAnswerEvent Values ValueNumberMeaning ERROR_UNDEFINED0The dig failed for an unspecified reason. The client shows the generic ui.popup.impossible_action. NEW_HINT1Right spot: the next step's hints are now known. ui.treasureHunt.stepSuccess. FINISHED2Right spot and the last one: the hunt is complete. ui.treasureHunt.huntSuccess. WRONG3Wrong spot; wrong_flag_count says how many of your flags are wrong. ui.treasureHunt.digWrongFlag(s) or ui.treasureHunt.digFail. LOST4The hunt is lost (no tries left). ui.treasureHunt.huntFail. ERROR_IMPOSSIBLE5You cannot dig here (wrong map). ui.fight.wrongMap. WRONG_AND_YOU_KNOW_IT6Wrong spot again, and no flag changed since the last try. ui.treasureHunt.noNewFlag.
  11. Smooth a posté un record dans Types
    How many fighters one fighter finished during the fight. Kind struct · Area Game.Fight One block of DetailedStatistics: what the official end-of-fight statistics screen shows for one fighter. Read the members you need; every value is already final (per-turn and per-AP values are averages, sent as floats). The client shows each member under its own localization key: - total: ui.fightResult.kill - enemies: ui.fightResult.enemyKilled - summons: ui.fightResult.summonKilled Not sent on its own — a record carried by DetailedStatistics, never sent on its own. inferred Used by DetailedStatistics Fields #FieldTypeMeaningYou set it 1summonsint32Summons finished. The official client shows it under ui.fightResult.summonKilled.never 2enemiesint32Enemies finished. The official client shows it under ui.fightResult.enemyKilled.never 3totalint32All fighters finished. The official client shows it under ui.fightResult.kill.never
  12. Smooth a posté un record dans Types
    The damage one fighter received during the fight, in total and by source. Kind struct · Area Game.Fight One block of DetailedStatistics: what the official end-of-fight statistics screen shows for one fighter. Read the members you need; every value is already final (per-turn and per-AP values are averages, sent as floats). The client shows each member under its own localization key: - total: ui.fightResult.damageTaken - poison: ui.fightResult.byPoison - push: ui.fightResult.byPush - object: ui.fightResult.byObject - summon: ui.fightResult.bySummon - shield: ui.fightResult.byShield - per_turn: ui.fightResult.byTurn - erosion: ui.fightResult.erosionTaken The ninth member (an enum, the table's +Types holder) is never shown. Ignore unnamed members. Not sent on its own — a record carried by DetailedStatistics, never sent on its own. inferred Used by DetailedStatistics Fields #FieldTypeMeaningYou set it 1objectint32Damage received from objects (traps, glyphs and the like). The official client shows it under ui.fightResult.byObject.never 2summonint32Damage received from summons. The official client shows it under ui.fightResult.bySummon.never 3shieldint32Damage received through shields. The official client shows it under ui.fightResult.byShield.never 4poisonint32Damage received from poisons. The official client shows it under ui.fightResult.byPoison.never 5erosionint32Erosion suffered (permanent life lost). The official client shows it under ui.fightResult.erosionTaken.never 6totalint32All damage received. The official client shows it under ui.fightResult.damageTaken.never 7per_turnfloatAverage damage received per turn. The official client shows it under ui.fightResult.byTurn.never 9pushint32Damage received from being pushed into obstacles. The official client shows it under ui.fightResult.byPush.never
  13. Smooth a posté un record dans Types
    The damage one fighter dealt during the fight, in total and by source. Kind struct · Area Game.Fight One block of DetailedStatistics: what the official end-of-fight statistics screen shows for one fighter. Read the members you need; every value is already final (per-turn and per-AP values are averages, sent as floats). The client shows each member under its own localization key: - total: ui.fightResult.damageDealt - direct: ui.fightResult.byDirect - poison: ui.fightResult.byPoison - push: ui.fightResult.byPush - object: ui.fightResult.byObject - summon: ui.fightResult.bySummon - shield: ui.fightResult.byShield - action_point: ui.fightResult.byActionPoint - per_turn: ui.fightResult.byTurn - erosion: ui.fightResult.erosionDealt Not sent on its own — a record carried by DetailedStatistics, never sent on its own. inferred Used by DetailedStatistics Fields #FieldTypeMeaningYou set it 1action_pointfloatDamage per action point spent. The official client shows it under ui.fightResult.byActionPoint.never 2directint32Damage dealt directly by spells and weapons. The official client shows it under ui.fightResult.byDirect.never 3summonint32Damage dealt by the fighter's summons. The official client shows it under ui.fightResult.bySummon.never 4shieldint32Damage dealt through shields. The official client shows it under ui.fightResult.byShield.never 5erosionint32Erosion inflicted (permanent life lost by the targets). The official client shows it under ui.fightResult.erosionDealt.never 6per_turnfloatAverage damage per turn. The official client shows it under ui.fightResult.byTurn.never 7poisonint32Damage dealt by poisons. The official client shows it under ui.fightResult.byPoison.never 8pushint32Damage dealt by pushing fighters into obstacles. The official client shows it under ui.fightResult.byPush.never 9objectint32Damage dealt by objects (traps, glyphs and the like). The official client shows it under ui.fightResult.byObject.never 10totalint32All damage dealt. The official client shows it under ui.fightResult.damageDealt.never
  14. Smooth a posté un record dans Events
    The list of things a character may not do right now (attack, exchange, move...). Kind event · Area Game.Character Replaces the restrictions of one character. WHAT TO DO 1. Read character_id. If it is your own character, these are YOUR restrictions; otherwise they belong to that character on your map. 2. Replace that character's restriction set with restrictions (Restriction values; an empty list lifts every restriction). Use it to know what you may do before sending a request (for example after death, when most actions are restricted). When you may send it Requires context_ready inferred Related messages Unsolicited - nothing you send causes this the server sends it whenever a character's restrictions change (death, fight, special maps) Fields #FieldTypeMeaningYou set it 1restrictionsrepeated RestrictionThe character's restrictions now in force; empty means none. Element type Restriction.never 2character_idint64The character the restrictions apply to (often your own). (character id) The client compares it with your own character id.never
  15. Smooth a posté un record dans Events
    Your account is already connected elsewhere; this session is refused. Kind event · Area Game.Connection The account already has a live session. The server will close this connection. WHAT TO DO Stop: do not retry immediately. Wait for the other session to end (or end it) and log in again. The message carries no data you need; its members are padding the client never reads. Not sent on its own — the server sends it during authentication when the account already has a session. inferred Related messages Unsolicited - nothing you send causes this the server sends it when it refuses a second session for the account No fields you may set.
  16. Smooth a posté un record dans Events
    The current Almanax day, as an id of the Almanax calendar game data. Kind event · Area Game.Basic Tells the client which day of the Almanax calendar it is. READ IT LIKE THIS 1. Look AlmanachCalendarDateEvent.date_id up in the Almanax calendar game data (AlmanaxCalendars): that entry is today's Almanax (its offering, bonus and NPC). 2. Ignore the other members. 3. SEND NOTHING BACK. When you may send it Requires character_loaded inferred Related messages Unsolicited - nothing you send causes this the server pushes the Almanax day at login; no client code asks for it Fields #FieldTypeMeaningYou set it 3date_idint32Today's entry in the Almanax calendar game data (AlmanaxCalendars). The client looks it up with AlmanaxCalendarsDataRoot.GetObjectById.never
  17. Smooth a posté un record dans Events
    Your whole acquaintance list (players you met). Kind event · Area Game.Contact The answer to AcquaintanceListRequest: the whole list, every time. READ IT LIKE THIS 1. Replace your list with AcquaintanceListEvent.acquaintance (one AcquaintanceInformation per account). 2. Each entry carries the account and, when a character of it is online, that character. 3. Ignore the other members. When you may send it Requires character_loaded inferred Related messages Arrives after AcquaintanceListRequest Fields #FieldTypeMeaningYou set it 2acquaintancerepeated AcquaintanceInformationEvery acquaintance - see AcquaintanceInformation.never
  18. Smooth a posté un record dans Types
    One acquaintance: the account, its state, and its online character. Kind struct · Area Game.Contact One entry of AcquaintanceListEvent.acquaintance. READ IT LIKE THIS 1. AcquaintanceInformation.account_id and AcquaintanceInformation.account_tag identify the account. 2. AcquaintanceInformation.state says whether one of its characters is online (values not named yet). 3. When it is online, AcquaintanceInformation.online gives that character - see AcquaintanceInformation.OnlineInformation. Not sent on its own — it travels inside AcquaintanceListEvent.acquaintance. proven Used by AcquaintanceListEvent Fields #FieldTypeMeaningYou set it 1onlineOnlineInformationThe online character, when there is one - see AcquaintanceInformation.OnlineInformation.never 2account_idint64The acquaintance's account id.never 3account_tagAccountTagThe account name and tag - see AccountTag.never 4statetype not documented yetWhether one of the account's characters is online; values not named yet.never
  19. Les mêmes questions reviennent sur le forum et sur Discord. Voici les réponses courtes, chacune accompagnée d’un lien vers une explication complète. Qu’est-ce qu’Asterobot ?Un programme que vous exécutez sur votre propre ordinateur ou serveur pour faire tourner des bots sur Dofus 3. Un bot peut soit se connecter et jouer de manière autonome (mode Full socket), soit rejoindre la partie que vous jouez (mode MITM). Le comportement d’un bot est défini par un package : un petit script JavaScript provenant de la marketplace ou que vous écrivez vous-même. Vous contrôlez l’ensemble depuis Asteroboard, dans votre navigateur. Sur quels systèmes fonctionne-t-il ?Windows, macOS et Linux, sur processeurs Intel/AMD et ARM : six versions sont disponibles, y compris pour les Mac équipés de puces Apple Silicon et les Raspberry Pi 4 et 5. Des images Docker sont également disponibles pour les serveurs. Avec quelle version de Dofus fonctionne-t-il ?Dofus 3. Chaque version d’Asterobot est testée avec une version précise de Dofus, indiquée comme Compatible dans Asteroboard. Aujourd'hui, cette version fonctionne avec Dofus 3.7.12.12. Dois-je avoir Dofus installé ?Uniquement pour le mode MITM, dans lequel vous jouez et un bot rejoint votre session. Un bot en mode Full socket n’a pas besoin du client Dofus. Dans les deux cas, Asterobot télécharge sa propre copie des fichiers du jeu. Dois-je savoir programmer ?Non. Le lancement d’un bot en mode MITM, l’installation d’un package depuis la marketplace et la modification de ses paramètres se font entièrement dans Asteroboard. Le package @asterobot:base permet de faire entrer un bot en mode Full socket dans le jeu sans que vous ayez à écrire du code. JavaScript est uniquement nécessaire si vous souhaitez des comportement très poussés. Asteroboard peut déjà faire beaucoup, et sans avoir besoin de faire de script Un assistant IA peut vous aider dans cette tâche. Mon compte risque-t-il d’être banni ?Oui. L’utilisation d’un bot enfreint les conditions d’utilisation d’Ankama, qui peut sanctionner les comptes concernés dans les deux modes. Personne ne peut garantir que votre compte restera à l’abri d’une sanction. Vous ne trouverez ici aucun conseil visant à contourner les systèmes de détection. Puis-je utiliser Asterobot sans lancer de bot ?Oui. La page Game vous permet de faire du datamining, de parcourir la carte du monde, d’examiner les cartes cellule par cellule, de rechercher des données du jeu dans cinq langues, d’effectuer des requêtes SQL, de lire les textes du jeu et d’écouter sa musique. Mes bots peuvent-ils fonctionner toute la journée ?Oui, tant qu’Asterobot reste en cours d’exécution. Asteroboard n’a pas besoin de rester ouvert. Grâce à un système de planification, les bots en mode Full socket se connectent pendant les plages horaires que vous définissez et se reconnectent automatiquement après une déconnexion survenue pendant l’une de ces plages. Que se passe-t-il lorsque je ferme le navigateur ?Rien ne s’arrête. Les bots restent connectés, les scripts continuent de s’exécuter et les téléchargements se poursuivent. En revanche, fermer le terminal d’Asterobot arrête tout. Arrêtez-le avec Ctrl+C ou en utilisant Shutdown server afin qu’il restaure correctement votre dossier Dofus. Asterobot se met-il à jour automatiquement ?Asteroboard se met à jour automatiquement. Asterobot vous indique lorsqu’une nouvelle version est disponible. Il vous suffit alors de remplacer un seul fichier. Vos bots, comptes, packages et paramètres sont conservés. Une IA peut-elle le contrôler ?Oui. Asterobot prend en charge le protocole MCP. Claude Code, Codex, Cursor ou tout autre client MCP peuvent effectuer les mêmes opérations qu’Asteroboard, avec les mêmes contrôles, et vous aider à écrire des scripts. Quelles langues sont disponibles ?Asteroboard est disponible en anglais, français, espagnol, portugais brésilien, et allemand. Les données du jeu sont aussi disponibles dans les cinq langues du jeu : français, anglais, allemand, espagnol et portugais. Pour en savoir plusFAQ : Généralités FAQ : Comptes et sécurité FAQ : Bots Télécharger Asterobot
  20. Smooth a posté a record dans Chat
    Décidez de la suite quand un membre de l'équipe, un message privé, le nom du personnage, un événement du module de chat ou n'importe quel message du jeu atteint l'un de vos bots : les événements que suivent les alarmes, les règles par défaut, écrire les vôtres sur la page Alarmes avec des conditions sur l'événement, chaque réaction, les notifications dans Asteroboard ou sur n'importe quel service web par une simple requête HTTP, et les dernières alarmes. Read this page in English Une alarme suit ce qui arrive à vos bots : un membre de l'équipe qui parle à l'un d'eux, l'avertit, le rend muet ou se tient sur sa carte, un joueur qui lui écrit en privé, le nom de son personnage dit dans un canal, les événements du module de chat, et tout message que le jeu lui envoie et que vous choisissez d'intercepter. Ses règles disent la suite : une notification dans Asteroboard ou sur n'importe quel service web, le chat en pause, une phrase dite, un paquet lancé, le script arrêté, un message du jeu envoyé, le bot déconnecté. Les règles sont une seule liste pour tout Asterobot, et chaque règle peut surveiller tous les bots ou certains. Les alarmes marchent que le module de chat soit allumé ou éteint : elles lisent le même chat que la Console. Ce que suivent les alarmes Événement Quand Modération Un membre de l'équipe parle dans un canal que lit le personnage, lui envoie un avertissement, le rend muet, ou se tient sur sa carte. Une même personne le déclenche au plus une fois par minute pour la même raison, et une fois par carte où elle se tient. Message privé Un joueur écrit en privé au personnage. Un message privé d'un de vos propres bots, ou d'un joueur que le personnage ignore, n'en est pas un. Nom cité Le nom du personnage est dans une ligne dite dans un canal, comme un mot entier, quels que soient ses majuscules et ses accents : « salut héro ! » cite Hero, « superheroes » non. Une ligne d'un de vos propres bots, ou d'un joueur que le personnage ignore, n'en est pas une. Trop de spam Le serveur dit « Trop de spam ! » : le garde du module de chat recule. Phrase refusée Un canal refuse une des lignes du bot. Épuisé Un objet qu'une annonce lie est épuisé. Annonce arrêtée Une annonce a atteint sa condition d'arrêt. Tous les déclencheurs L'action raise d'un déclencheur de chat. trigger:wtb est l'événement d'un seul déclencheur : voir Profils de chat. Tous les événements de script Le raise() d'un script. script:found est un seul événement de script : voir la référence asterobot:alarms. game: et le nom d'un message Le jeu envoie ce message au bot : voir Messages du jeu. Un membre de l'équipe est reconnu comme le fait le client du jeu : une ligne que le serveur marque comme celle d'un administrateur ou dite dans le canal de l'équipe, une fenêtre d'avertissement, un mutisme, et sur la carte, un personnage dont le rôle de compte n'est pas celui d'un joueur. Chaque événement dit quelque chose : qui et quoi, dans des champs. Les conditions d'une règle et les textes de ses réactions les lisent. Événement Champs Modération reason (line, warning, mute ou map), who, channel, text, les minutes d'un mutisme, role sur la carte Message privé sender, text Nom cité channel, sender, text Trop de spam minutes Phrase refusée channel, reason Épuisé ad, item Annonce arrêtée ad Celui d'un déclencheur trigger, channel, sender, text Celui d'un script name, text Celui d'un message du jeu ses champs, voir Messages du jeu Les règles par défaut Tant que vous ne les changez pas, deux règles s'appliquent : Règle Événements Réactions Staff Modération Mettre le chat en pause pour 30 minutes, puis Notifier toutes les destinations. Messages Message privé, Nom cité Notifier Asteroboard. La page Alarmes les montre avec Les règles par défaut : enregistrées au premier changement : la première fois que vous enregistrez, elles sont écrites dans un fichier qui est alors le vôtre. La page Alarmes Ouvrez Alarmes dans le menu d'Asteroboard. La page montre le formulaire des règles à gauche et leur JSON à droite, tous deux en direct, comme dans l'éditeur de profils de chat. Sauvegarder envoie les règles à Asterobot, qui les vérifie et nomme le champ en cause de ce qu'il refuse ; Annuler les changements remet les règles telles qu'enregistrées. Quitter la page avec des changements non enregistrés demande d'abord. Ajouter une règle en ajoute une à la fin. Les règles s'appliquent dans l'ordre ; les flèches en montent ou en descendent une. Champ Ce qu'il fait L'interrupteur Active ou désactive la règle sans la supprimer. Le nom Son nom, affiché avec chaque alarme qu'elle déclenche. Chaque règle a besoin d'un nom à elle. Événements Les événements qu'elle prend. Tapez-en un pour l'ajouter : game:CharacterLevelUpEvent, trigger:wtb, script:found. Bots Les bots qu'elle surveille. Tous les bots quand aucun n'est choisi. Condition Ce que doivent valoir les champs de l'événement : voir Condition. Tous les événements quand elle est vide. Au plus une fois toutes les La règle se déclenche au plus une fois pendant ce temps pour chaque bot. À chaque fois quand c'est vide. Réactions Ce qu'elle fait, dans l'ordre. Ajouter une réaction en choisit une. Quand plusieurs règles prennent le même événement, chacune se déclenche, côte à côte, et une réaction que deux règles demandent pour le même événement, avec les mêmes réglages, n'est faite qu'une fois. Une règle qui répète une réaction, un message, une attente et le même message, la fait à chaque fois. Attendre ne retient que la suite de sa propre règle. Une règle que vous désactivez ou supprimez pendant son Attendre ne fait plus rien ensuite, et la console du bot le dit. Condition Ajouter un champ ajoute une condition sur un des champs de l'événement. Toutes doivent être vraies pour que la règle se déclenche ; pour un « ou », écrivez deux règles. Condition Vraie quand le champ... vaut est égal à la valeur, les nombres comme des nombres : 10017 vaut 10017.0. vaut l'un de est égal à l'une des valeurs. contient contient le texte, sans tenir compte des majuscules ni des accents : bot est dans « Tu es un BÔT ? ». est au-dessus de, est en dessous de est un nombre au-dessus ou en dessous. est entre est un nombre au-dessus du premier et en dessous du second. Un champ que l'événement n'a pas rend la condition fausse. Par exemple, une règle qui prend Modération avec reason vaut mute ne se déclenche que sur un mutisme. Messages du jeu Une règle peut prendre n'importe quel message que le jeu envoie au bot : tapez game: et le nom du message dans Événements, comme game:CharacterLevelUpEvent. Chaque fois que le jeu envoie ce message au bot, la règle le prend, avec les champs du message. Noms : le nom d'un message et ceux de ses champs sont les noms lisibles de la référence du protocole de Dofus, avec des tirets bas : new_level. L'outil Réseau du bot montre les messages que le jeu envoie vraiment, avec de vraies valeurs. Un nom que le protocole n'a pas est refusé à l'enregistrement. Champs : un champ imbriqué s'écrit avec des points, l'élément d'une liste avec son indice : author.name, parameters.0. json est le message entier, en JSON. Coût : un message qu'aucune règle ne nomme ne coûte rien. Seuls les messages que vos règles nomment sont lus en champs. Sens : seulement ce que le jeu envoie au bot. Les requêtes du bot lui-même ne sont pas suivies. Par exemple, pour être prévenu quand un personnage atteint le niveau 200 : Événements game:CharacterLevelUpEvent, Condition new_level est au-dessus de 199, Réactions Notifier. Certains champs ont encore de courts noms brouillés, comme galg : Asterobot ne sait pas encore ce qu'ils contiennent, et leurs noms peuvent changer avec une mise à jour du jeu, alors ne bâtissez pas de règle dessus. Les réactions Réaction Ce qu'elle fait Notifier Envoie l'alarme à ses destinations : Toutes les destinations quand aucune n'est choisie. Asteroboard est intégrée, voir Notifications, et vous ajoutez les vôtres, voir Destinations. Mettre le chat en pause Retient les lignes des annonces et des scripts du bot pendant ce temps, comme Arrêter l'envoi, et abandonne celles en attente. La console dit Alarm: the chat is paused for 30 minutes. Dire Dit une ligne dans un canal, à travers le garde du bot. Écrire en privé Écrit une ligne en privé à un personnage : À un nom, ou vide pour le joueur dont le message privé ou la ligne a déclenché l'alarme. Lancer Lance un paquet sur le bot, sa plus récente version installée, à la place du script qu'il exécute : sur la modération, un paquet qui emmène le personnage dans un coin tranquille. Vide, Son propre script, relance le script du bot. Son planning le laisse tranquille jusqu'à sa prochaine plage. La console dit Alarm: playing et le paquet. Arrêter le script Arrête le script du bot, et son trajet s'il en fait un. Son planning le laisse tranquille jusqu'à sa prochaine plage. La console dit Alarm: stopping the script. Attendre Attend ce temps avant la réaction suivante de la règle : Arrêter le script, Attendre 10 minutes, Lancer son propre script fait une pause de 10 minutes. Envoyer un message du jeu Envoie un message au jeu, comme le fait le send() d'un script : le nom du message, et ses champs en JSON, dont les textes lisent les variables de l'alarme. Il passe à côté du garde du module de chat. Écrire dans la console Écrit une ligne dans la console du bot, en avertissement : Modération sur la carte : {who}. Activer un drapeau Lève un drapeau que les profils de chat du bot lisent dans leurs conditions, pendant ce temps, ou jusqu'à la fin de la session de jeu quand c'est vide : sur la modération, un drapeau quiet qui arrête les annonces écrites avec « pas le drapeau quiet ». Déconnecter Sort le bot du jeu, et le ramène après Revenir après, sauf si c'est vide. Un bot avec un planning ne revient que si sa plage n'est pas finie entre-temps. La console dit Alarm: disconnecting, puis Alarm: coming back at 21:30:00. Sur une session relayée, elle ne fait rien, puisque c'est la personne qui joue qui décide : not done on a relayed session: the person playing it decides. Une ligne à dire ou à écrire en privé est un modèle de message, et lit les variables de l'alarme en plus de celles du personnage : chaque champ de l'événement, {sender}, {text}, {who}, {channel}, {minutes}..., et {bot}, {character}, {rule}, {event}. Celles du personnage passent d'abord : dans une ligne, {name}, {server} et {time} sont le nom, le serveur et l'heure du personnage. Par exemple {Désolé|Salut} {sender}, je suis occupé pour l'instant. La ligne d'une alarme passe par le garde comme toute autre, mais une pause ne la retient pas. Une ligne de console et les textes d'un message du jeu ne lisent que les variables de l'alarme : chaque champ de l'événement, et {bot}, {character}, {server}, {rule}, {event}, et {time}, la date et l'heure de l'événement, comme 2026-10-28T14:05:09+01:00. Une variable que l'événement n'a pas y est vide, et les accolades qui ne nomment aucune variable restent telles quelles. Une réaction qui ne peut pas être faite écrit pourquoi dans la console du bot, Alarm Staff: play failed: no package "@me:hide" is installed, apparaît dans les Dernières alarmes, et la règle continue. Notifications Une réaction Notifier avec la destination Asteroboard affiche une notification dans chaque Asteroboard ouvert, quelle que soit la page : « Nom-du-bot : un membre de l'équipe », « Nom-du-bot : message privé de Nom-du-joueur », « Nom-du-bot : Nom-du-joueur cite le nom du personnage », « Nom-du-bot : trop de spam, le chat attend 5 minutes », et pour celui d'un déclencheur, d'un script ou d'un message du jeu, le nom de l'événement, avec ce qui a été dit. Celle d'un membre de l'équipe reste jusqu'à ce que vous la fermiez. Ouvrir mène à la page du bot. Destinations En plus d'Asteroboard, une réaction Notifier peut joindre n'importe quel service web : une application de discussion, un service de notifications sur votre téléphone, un serveur à vous. Chaque destination est une simple requête HTTP que vous écrivez. Ajouter une destination, sous les règles de la page Alarmes, en ajoute une. Champ Ce qu'il fait L'interrupteur L'active ou la désactive. Notifier la saute tant qu'elle est désactivée. Le nom Ce que choisit Notifier. Chaque destination a besoin d'un nom à elle, et Asteroboard est déjà pris. La méthode GET, POST, PUT, PATCH ou DELETE. L'URL L'URL complète, qui commence par https:// ou http://. En-têtes Des noms et des valeurs, comme un en-tête Authorization avec votre jeton. Ajouter un en-tête en ajoute un. Corps Ce qui est envoyé, s'il y a quelque chose. L'URL, les valeurs des en-têtes et le corps lisent les variables de l'alarme, comme une ligne de console : {bot}, {character}, {server}, {rule}, {event}, {time}, et chaque champ de l'événement, {sender}, {text}, {who}... Chaque valeur est échappée selon l'endroit où elle tombe, pour qu'un guillemet dans un message privé ne casse jamais votre requête : Dans l'URL : encodée pour l'URL. Vendeur A devient Vendeur%20A. Dans un corps JSON : échappée pour le JSON, à écrire entre guillemets : "text": "{text}". {json}, un message du jeu en JSON, va tel quel : "message": {json}, et en null pour un événement qui n'est pas un message du jeu. Dans un corps de formulaire, avec l'en-tête Content-Type: application/x-www-form-urlencoded : encodée pour l'URL. Dans un en-tête : sur une seule ligne. Le corps part avec votre en-tête Content-Type quand vous en donnez un. Sans lui, un corps qui est un objet ou un tableau JSON, ses variables mises à part, part en application/json, et tout le reste en text/plain. Tester Tester envoie la destination une fois, telle qu'elle est sur la page, enregistrée ou non, avec un événement d'exemple : le bot Asterobot, l'événement test, le texte « This is a test from Asterobot ». Il montre ce que le service a répondu : Le service l'a acceptée avec son statut, ou Le service ne l'a pas acceptée avec la raison, comme the service answered 401 Unauthorized et le début de sa réponse, ou no answer within 10 s. L'envoi Les requêtes de chaque destination partent une par une, dans l'ordre, et un service a 10 secondes pour répondre. Quand il ne répond pas, dit qu'il reçoit trop de requêtes (429) ou a un problème de son côté (5xx), la requête repart après 2, 10 et 30 secondes. Toute autre réponse est définitive, puisque c'est la requête elle-même qui ne va pas. Une requête qui échoue pour de bon écrit pourquoi dans la console du bot : Alarm Staff: My phone didn't take the request: the service answered 401 Unauthorized. Au plus 100 requêtes attendent pour une même destination. Au-delà, Notifier échoue pour cette destination, et le dit dans les Dernières alarmes. Une requête qui attend encore son tour après 10 minutes, pendant que le service est en panne, est abandonnée sans partir, pour que les alarmes que vous recevez à son retour soient récentes ; la console du bot le dit. Une URL ou un jeton reste dans alarms.json, sur votre ordinateur. Asterobot ne les écrit jamais dans une ligne de console. Exemples Chaque service documente la requête qu'il accepte : son URL, et les noms qu'il donne aux champs de son corps. La plupart prennent l'une de ces trois formes. Un webhook JSON, l'URL que l'application vous a donnée, son corps un objet JSON : Champ Valeur La méthode POST L'URL https://chat.example.com/hooks/1234/abcd Corps { "text": "{bot} : {event} {who}{sender} {text}" } Un service de notifications qui prend le message en texte brut, son titre dans un en-tête : Champ Valeur La méthode POST L'URL https://push.example.com/mon-sujet En-têtes Title : {bot} : {event} Corps {who}{sender} {text} Un service qui prend tout dans son URL, et un jeton dans un en-tête : Champ Valeur La méthode GET L'URL https://api.example.com/send?to=me&message={bot}%3A%20{text} En-têtes Authorization : Bearer votre-jeton Dernières alarmes Sous les règles et les destinations, Dernières alarmes liste les 100 dernières alarmes déclenchées, les plus récentes en premier, jusqu'au redémarrage d'Asterobot : quand, l'événement et son bot, son personnage et son serveur, ses champs, la règle, et chaque réaction, Fait ou avec la raison pour laquelle elle n'a pas pu l'être, au survol. Une règle avec Attendre apparaît une fois toutes ses réactions faites. Une réaction Notifier est Fait dès que ses requêtes sont parties : celle qui échoue ensuite écrit pourquoi dans la console du bot. Le fichier des alarmes Les règles sont le fichier alarms.json du dossier des données d'Asterobot (Fichiers et dossiers). Ce que vous enregistrez sur la page Alarmes s'applique tout de suite ; un changement que vous faites à la main dans le fichier s'applique au prochain démarrage d'Asterobot. { "version": 1, "destinations": [ { "name": "Mon téléphone", "method": "POST", "url": "https://push.example.com/mon-sujet", "headers": { "Title": "{bot} : {event}" }, "body": "{who}{sender} {text}" } ], "rules": [ { "name": "Staff", "events": ["staff"], "do": [ { "pauseChat": 1800 }, { "notify": [] } ] }, { "name": "Messages", "events": ["whisper", "mention"], "do": [ { "notify": ["Asteroboard"] } ] }, { "name": "Mutisme", "events": ["staff"], "match": { "reason": "mute" }, "do": [ { "stopScript": {} }, { "wait": 60 }, { "disconnect": { "reconnectAfter": 3600 } } ] }, { "name": "Niveau 200", "events": ["game:CharacterLevelUpEvent"], "match": { "new_level": { "above": 199 } }, "do": [ { "notify": ["Asteroboard"] }, { "log": "{character} a atteint le niveau {new_level}" } ] }, { "name": "Répondre aux MP", "events": ["whisper"], "bots": ["Farmer-1", "Farmer-2"], "every": 600, "do": [ { "whisper": { "text": "{Désolé|Salut} {sender}, je suis occupé pour l'instant" } } ] } ] } Champ Valeurs version 1 destinations[].name texte, propre à chaque destination, pas Asteroboard destinations[].enabled false la désactive ; active quand absent destinations[].method GET, POST, PUT, PATCH, DELETE destinations[].url l'URL complète, https:// ou http://, un modèle destinations[].headers des noms et des valeurs, les valeurs des modèles destinations[].body un modèle ; rien n'est envoyé quand absent rules[].name texte, propre à chaque règle rules[].enabled false la désactive ; active quand absent rules[].events staff, whisper, mention, spam, refused, soldOut, stopped, trigger, script, trigger:<nom>, script:<nom>, game:<Message> rules[].bots des noms de bots ; tous les bots quand absent rules[].match des noms de champs et ce que chacun doit valoir : une valeur ("mute"), une liste de valeurs (["PRIVATE", "GUILD"]), { "contains": "bot" }, { "above": 199 }, { "below": 10 }, ou les deux pour un intervalle rules[].every secondes ; la règle se déclenche au plus une fois pendant ce temps pour chaque bot rules[].do des réactions, chacune un objet à une seule clé : { "notify": ["Asteroboard", "Mon téléphone"] } (une liste vide pour toutes les destinations), { "pauseChat": 1800 } (secondes), { "say": { "channel": "GLOBAL", "text": "..." } }, { "whisper": { "to": "Nom", "text": "..." } }, { "play": "@me:hide" } ("" pour le script du bot), { "stopScript": {} }, { "wait": 60 } (secondes), { "send": { "type": "EmotePlayRequest", "payload": { "emote_id": 1 } } }, { "log": "..." }, { "flag": { "name": "quiet", "for": 600 } } (secondes, 0 pour la session de jeu), { "disconnect": { "reconnectAfter": 600 } } (secondes, 0 pour rester dehors) Un fichier inutilisable, comme un fichier modifié à la main avec une erreur, affiche Le fichier est inutilisable : les règles par défaut s'appliquent avec le champ en cause, et les règles par défaut s'appliquent jusqu'à ce que vous le corrigiez.
  21. Smooth a posté a record dans Chat
    Créez, copiez, importez, exportez, modifiez et supprimez les profils de chat d'après lesquels vos bots parlent, sur la page Profils de chat. Écrivez des annonces avec des choix au hasard, des liens d'objets et des variables, réglez quand chacune tourne et ce qui la termine, écrivez les réponses aux messages privés, ce que fait un bot sur les lignes des canaux, les commandes auxquelles il obéit et son statut, et lisez le format des profils. Read this page in English Un profil de chat dit ce qu'un bot dit tout seul : les annonces qu'il poste dans les canaux que vous choisissez, à intervalles aléatoires, tant que leurs conditions sont vraies ; les réponses aux messages privés qu'il reçoit ; ce qu'il fait sur les lignes des canaux ; les commandes auxquelles il obéit ; son statut. Un bot utilise plusieurs profils à la fois, choisis dans son onglet Chat (Le module de chat), et un même profil peut servir à autant de bots que vous voulez. Profil Ce que c'est Pouvez-vous le modifier ? Les vôtres, Les vôtres Les profils que vous avez créés, copiés ou importés. Chacun est un fichier du dossier des données d'Asterobot. Oui. Celui d'un paquet, Paquet Fourni par un paquet que vous avez installé, nommé d'après lui, comme @some-author:traders/wheat. Non. Copiez-le pour le modifier. La page Profils de chat Ouvrez Profils de chat dans le menu d'Asteroboard. La page liste les vôtres par nom, puis ceux de vos paquets. Colonne Ce qu'elle montre Nom Le nom du profil, celui que montre la liste Profils d'un bot. Annonces Combien d'annonces il contient. Source Les vôtres ou Paquet, avec la version du paquet. État Prêt, Inutilisable quand il a une erreur, ou combien d'avertissements il a. Survolez-le pour les lire. Le filtre au-dessus du tableau trouve un profil par son nom. Chaque ligne a un menu : Élément Ce qu'il fait Modifier Ouvre votre profil dans l'éditeur. Voir pour celui d'un paquet, qui s'ouvre en lecture seule. Copier Enregistre une copie sous un nom à vous, puis l'ouvre dans l'éditeur. Exporter Télécharge le profil en fichier .json. Supprimer Supprime l'un de vos profils, après confirmation. Celui d'un paquet ne peut pas être supprimé. La page reste à jour d'elle-même quand un profil est enregistré, importé ou supprimé, et quand un paquet est installé ou retiré. Créer un profil Cliquez sur Nouveau profil. Tapez un Nom, puis cliquez sur Créer. L'éditeur s'ouvre sur le nouveau profil, vide. Un nom est aussi le nom de fichier du profil : il ne peut pas être vide, commencer par @, ni contenir de / ou de caractère qu'un nom de fichier ne peut pas porter. La fenêtre affiche alors chatprofiles: a profile's name can't be empty, start with @, or hold / or a character a file name can't. Un nom déjà pris donne chatprofiles: a profile already has this name. Copier, partager et supprimer Copier, dans le menu d'une ligne ou dans l'éditeur, ouvre une fenêtre avec le nom de l'original suivi de copie. La copie est à vous : c'est ainsi qu'on modifie le profil d'un paquet. Exporter télécharge le profil exactement tel qu'il est enregistré. Pour utiliser un profil partagé par quelqu'un, cliquez sur Importer, choisissez le fichier sous Fichier du profil ou collez le JSON sous JSON du profil, puis cliquez sur Importer. Le profil rejoint les vôtres sous le nom qu'il porte ; quand vous en avez déjà un de ce nom, la fenêtre demande avant que Le remplacer n'écrase le vôtre. Un profil désigne les objets, les cartes et les zones par leurs identifiants du jeu, les mêmes pour tous ceux qui jouent la même version du jeu. Supprimer demande d'abord : « ... sera supprimé définitivement. Les bots qui l'utilisent le retirent de leurs profils. » L'éditeur L'éditeur montre le formulaire du profil à gauche et son JSON à droite, tous deux en direct : un champ changé dans le formulaire apparaît aussitôt dans le JSON, et le JSON que vous tapez remplit le formulaire dès qu'il se lit. Sauvegarder envoie le profil à Asterobot, qui le vérifie, et chaque bot qui l'utilise le suit aussitôt. Un profil qu'Asterobot ne peut pas accepter est refusé avec le champ en cause, par exemple chat: malformed profile: ads[0].messages: an ad needs a message. Ses avertissements s'affichent au-dessus du formulaire, sous À savoir. Le profil d'un paquet s'ouvre en lecture seule, avec Copier pour en faire un à vous. Quitter l'éditeur avec des changements non enregistrés demande d'abord. Général Nom et Description. Renommer un profil fait suivre le nouveau nom à chaque bot qui l'utilise. Variables Des valeurs que les messages lisent par leur nom : un message qui écrit {prix} dit la valeur de prix. Ajouter une variable, puis tapez son Nom et sa Valeur. Quand plusieurs profils d'un bot fixent la même variable, la valeur du premier profil l'emporte ; un script peut fixer les siennes, qui l'emportent sur celles de tous les profils. Celles du personnage, comme {name} ou {level}, ne peuvent pas être remplacées. Annonces Ajouter une annonce en ajoute une, dans Commerce, qui attend deux à quatre minutes entre deux envois, avec un message à écrire. Champ Ce qu'il fait Nom Facultatif : le nom que montre l'onglet Chat du bot. Sans nom, il montre Annonce 1, Annonce 2... Canaux Où part chaque envoi, nommés et colorés comme dans le jeu. Chaque envoi part dans tous les canaux : un canal encore dans son délai est attendu, les autres partent. Messages Un seul est dit à chaque fois. Chacun montre un aperçu en dessous. Voir Messages. Ordre Au hasard, jamais deux fois de suite le même message, ou Dans l'ordre. Attendre au moins, Attendre au plus L'attente aléatoire entre deux envois, de 1 seconde à 24 heures, en secondes, minutes ou heures. Seulement quand La condition de l'annonce : elle attend tant que la condition est fausse. Voir Conditions. Arrêt Ce qui termine l'annonce pour de bon. Voir Arrêt. À chaque envoi Une Émoticône ou une Attitude que le personnage joue en disant le message. Messages Un message est un modèle que le bot remplit à chaque fois qu'il le dit : Vous écrivez Le bot dit {Salut|Bonjour|Coucou} L'un des choix, au hasard. Les choix peuvent s'imbriquer et être vides : {!|}. {item:289} Un lien vers l'objet, comme les liens d'objets du jeu, depuis l'inventaire du personnage. Un objet dans les sacs est préféré à un objet équipé. {name}, {level}, {server}, {subarea}, {area}, {position}, {kamas}, {pods}, {time} Le nom, le niveau, le serveur, la sous-zone, la zone, la position en lien vers sa carte, que le jeu affiche [4,-19], les kamas, les pods en utilisés/max, et l'heure en HH:MM du personnage. {sender} Dans une réponse, un message de déclencheur ou la réponse d'état : qui a écrit le message ou la ligne. {prix}, ou tout autre nom Une variable. Un message n'est pas envoyé tant que l'une de ses variables n'a pas de valeur ou que le personnage n'a pas un objet qu'il lie : l'annonce attend, et l'onglet Chat dit pourquoi. Un message au-delà des 256 caractères ou des 16 liens d'objets du jeu ne l'est pas non plus. L'aperçu sous chaque message montre quelques remplissages, chaque lien d'objet écrit [son nom], dans la couleur du premier canal de l'annonce, et le plus long que le message peut faire face aux limites du jeu : « Jusqu'à 74/256 caractères, 1/16 liens d'objets ». Il est fait sans bot, donc les variables du personnage restent écrites {name}, et les objets sont nommés dans la langue où vous lisez le jeu. Conditions Seulement quand contient des tests, qui doivent tous être vrais, et des groupes : Tous ceux-ci, L'un de ceux-ci, et Pas celui-ci. Sans test, l'annonce tourne toujours. Test Vrai quand Heure L'heure de l'ordinateur est entre De et À, en passant minuit quand À vient avant, l'un des Jours cochés, tous les jours quand aucun ne l'est. En combat, En trajet Le personnage est en combat, ou en trajet, ou ne l'est pas : Oui ou Non. Carte, Sous-zone, Zone Le personnage est sur l'une d'elles. A un objet Le personnage a au moins tant de cet objet. Kamas, Niveau Les kamas ou le niveau du personnage sont Plus de et Moins de les nombres donnés. Un drapeau Un script, ou la réaction Activer un drapeau d'une alarme, a levé ce drapeau. Un test sur ce que le bot ne sait pas encore, comme ses kamas avant que le jeu ait envoyé l'inventaire, est faux. Arrêt L'Arrêt termine l'annonce pour de bon, au premier qui arrive : Après tant d'envois, un temps Après son premier envoi, ou Le jour dit, selon l'horloge de l'ordinateur. Les compteurs sont gardés en mémoire : ils repartent de zéro au redémarrage d'Asterobot ou quand les profils du bot changent. Réponses Les réponses aux messages privés que reçoit un bot (Réponses). Ajouter une règle en ajoute une, qui répond à tout message, avec une réponse à écrire. Champ Ce qu'il fait Répond quand La condition de la règle : les tests d'une annonce, et deux de plus sur le message. Sans test, la règle répond à tout message. Réponses Une est tirée au hasard. Ce sont des messages, et {sender} dit qui a écrit. L'aperçu montre {sender} en Joueur. Réponses par joueur Au plus tant de réponses des règles à un même joueur, Sur cette durée. Une par heure par défaut, ce qui répond au premier message d'une conversation. La première règle dont le test est vrai répond, donc une règle sans test va en dernier : les flèches montent ou descendent une règle. Quand un bot a plusieurs profils, leurs règles s'ajoutent dans l'ordre des profils, et le premier profil qui a Réponses par joueur le fixe. La condition d'une règle de réponse peut aussi tester le message : Test Vrai quand Expéditeur Le personnage qui a écrit est l'un des Noms, sans tenir compte des majuscules. Mots Le message a l'un des Mots-clés comme mot, Contient un texte, et correspond à la Regex : chacun que vous remplissez doit être vrai. Les mots-clés et Contient ne tiennent pas compte des majuscules ni des accents, donc ble trouve blé. La regex est prise telle quelle, en syntaxe de Go : (?i) à son début ignore les majuscules. Déclencheurs Ce que fait un bot sur une ligne dite dans un canal (Déclencheurs). Ajouter un déclencheur en ajoute un, sur une ligne en Commerce qu'aucun de vos bots n'a dite, avec un message privé à écrire. Champ Ce qu'il fait Nom Le nom du déclencheur dans l'onglet Chat et la console, et dans l'événement d'alarme et l'événement de script qu'il donne. Se déclenche quand La condition du déclencheur : les tests d'une annonce, l'Expéditeur et les Mots d'une réponse, et quatre de plus sur la ligne, ci-dessous. Sans test, il se déclenche sur toute ligne de tout canal. Actions Ce qu'il fait, dans l'ordre, chacune une fois la précédente faite. Les flèches montent ou descendent une action. Par joueur Un même joueur le déclenche au plus tant de fois, Sur cette durée. Une fois par heure par défaut. Chaque déclencheur dont le test est vrai se déclenche, donc une ligne peut en déclencher plusieurs. Quand un bot a plusieurs profils, leurs déclencheurs s'ajoutent. La condition d'un déclencheur peut aussi tester la ligne : Test Vrai quand Canal La ligne a été dite dans l'un de ces canaux. L'un de vos bots Oui : l'un de vos autres comptes de cet Asterobot l'a dite. Non : quelqu'un d'autre. Nomme le personnage La ligne a le nom du personnage du bot comme mot, sans tenir compte des majuscules ni des accents. Lie un objet La ligne lie cet objet. Action Ce qu'elle fait Écrire en privé à l'auteur Envoie en privé l'un de ses messages, tiré au hasard. {sender} dit qui a écrit la ligne. Dire dans un canal Dit un message dans le canal que vous choisissez. Lever un événement d'alarme Lève l'événement trigger:<nom> pour les alarmes : une règle qui le nomme décide de la suite, comme une notification. Prévenir le script Le script du bot l'entend (onChat). Ignorer l'auteur Ajoute l'auteur à la liste des ignorés du personnage, comme le menu du jeu : ses lignes sont masquées jusqu'à la fin de la session de jeu, et ne déclenchent plus rien. Si le jeu refuse, par exemple quand la liste est pleine, la console dit pourquoi. Jouer un smiley, Jouer une émote Joue celui ou celle que vous choisissez. Inviter dans le groupe Invite l'auteur dans le groupe du personnage. Mettre le chat en pause Le bot n'envoie rien pendant ce temps, comme avec Arrêter l'envoi. Un message privé ou un message attend le rythme, comme une réponse. En essai à blanc, les messages, l'ignore, l'invitation et le smiley ou l'émote sont seulement écrits dans la console. Commandes Les commandes auxquelles obéit un bot (Commandes). Activez Obéit aux commandes pour les régler ; sans cela, le profil ne prend aucune commande. Le premier profil du bot qui prend des commandes les fixe toutes. Champ Ce qu'il fait Préfixe Ce par quoi commence une commande, 3 caractères au plus. ! par défaut. Noms de confiance Des personnages du serveur du bot dont il suit les commandes. Tapez un nom et appuyez sur Entrée. Vos bots Vos autres comptes de cet Asterobot ont aussi sa confiance, quel que soit leur personnage. Activé par défaut. Commandes qui marchent Les commandes auxquelles le bot obéit. Toutes par défaut. Réponse d'état Ce que répond !status, un message. Vide, c'est {name}, level {level}, {subarea} {position}, {kamas} kamas, {pods} pods. Statut Le statut que prend le personnage tant que la partie Statut du bot est allumée (Statut). Activez Règle le statut et choisissez Disponible, Absent, Privé ou Solo, comme dans le menu de statut du jeu. Absent prend un Message d'absence, 256 caractères au plus, que lisent les joueurs qui écrivent en privé au personnage. Le premier profil du bot qui a un statut le fixe. Privé bloque les messages privés des inconnus, donc les réponses n'en reçoivent aucun : l'éditeur vous prévient. Rythme Le temps que met le bot à répondre, comme une personne : un temps au hasard pour lire le message, entre Lit au moins et Lit au plus secondes (2 à 6 par défaut, 120 au plus), puis le temps de taper la réponse à Caractères par seconde (6 par défaut, 50 au plus). Le premier profil du bot qui a un rythme le fixe, pour les réponses, les messages des déclencheurs et la réponse à !status. Le format Un profil est un fichier JSON. C'est le format qu'écrit l'éditeur, et celui qu'utilisent Exporter et Importer : { "version": 1, "name": "Vente de blé à Astrub", "description": "Annonces de blé dans Commerce, le soir, et réponses sur le prix.", "variables": { "prix": "12" }, "ads": [ { "name": "Annonce blé", "channels": ["SALES"], "messages": ["{Vends|WTS} {item:289} à {prix} k l'unité, MP", "{item:289} à vendre, {prix} k, MP {name}"], "order": "random", "every": { "min": 120, "max": 240 }, "when": { "all": [ { "time": { "from": "18:00", "to": "23:30" } }, { "map.subarea": { "in": [95] } }, { "bot.inFight": false } ] }, "stop": { "after": 50, "for": 7200, "until": "2026-11-01T20:00" }, "smiley": 1 } ], "replies": { "rules": [ { "when": { "text": { "keywords": ["prix", "combien", "price"] } }, "reply": ["{prix} k l'unité, {viens|rejoins-moi} à Astrub"] }, { "reply": ["{Salut|Bonjour} {sender}, occupé pour l'instant, je réponds plus tard"] } ], "perPlayer": { "max": 1, "every": 3600 } }, "triggers": [ { "name": "wtb", "when": { "channel": { "in": ["SALES"] }, "text": { "keywords": ["wtb", "achète"] }, "items": { "has": 289 } }, "do": [ { "whisper": ["Salut {sender}, je vends {item:289} à {prix} k"] }, { "raise": "wtb" } ], "perPlayer": { "max": 1, "every": 21600 } } ], "commands": { "prefix": "!", "trusted": { "names": ["Nom-Du-Maître"], "myBots": true }, "builtIn": ["stop", "start", "pause", "resume", "say", "status", "disconnect"], "statusReply": "niv {level}, {subarea} {position}, {kamas} k, {pods}" }, "status": { "set": "away", "text": "en farm, je reviens plus tard" }, "timing": { "read": { "min": 2, "max": 6 }, "typing": 6 } } Champ Valeurs Par défaut version 1 obligatoire name texte obligatoire description texte aucune variables nom → texte ; un nom ne peut pas contenir d'accolades, de | ni de : aucune ads[].name texte aucun ads[].channels les canaux comme les nomme le protocole du jeu : SALES est Commerce, SEEK Recrutement, GLOBAL Général, COMMUNITY Communauté, GUILD, ALLIANCE, PARTY, TEAM, ARENA obligatoire ads[].messages modèles au moins un ads[].order random, inOrder random ads[].every min, max : secondes, de 1 à 86400 obligatoire ads[].when des tests, et all, any, not : time (from, to, days en mon...sun), bot.inFight et bot.onTrip (true, false), map.id, map.subarea, map.area (is un identifiant, in une liste), inventory.has (item, atLeast), kamas et level (above, below), flag (un nom) toujours ads[].stop after (envois), for (secondes depuis le premier envoi), until (une date comme 2026-11-01T20:00, selon l'horloge de l'ordinateur) aucun ads[].smiley, ads[].emote l'identifiant d'une émoticône ou d'une attitude, pas les deux aucun replies.rules[].when les tests d'une annonce, et sender.name (is un nom, in une liste) et text (contains, keywords, regex) toujours replies.rules[].reply modèles, qui lisent {sender} au moins un replies.perPlayer max réponses, every secondes (de 1 à 86400) 1 toutes les 3600 triggers[].name texte obligatoire triggers[].when les tests d'une réponse, et channel (is un canal, in une liste), sender.myBot et text.mentionsMe (true, false), items (has l'id d'un objet) toujours triggers[].do des actions, chacune un objet d'une seule clé : whisper (des modèles, qui lisent {sender}), say (channel, text), raise (le nom de l'événement), script, ignore et invite (true), smiley et emote (un id), pauseChat (secondes, de 1 à 86400) au moins une triggers[].perPlayer max fois, every secondes (de 1 à 86400) 1 toutes les 3600 commands.prefix 3 caractères au plus, sans espace ! commands.trusted names (des personnages du serveur du bot), myBots (true, false) aucun nom, myBots true commands.builtIn stop, start, pause, resume, say, status, disconnect toutes commands.statusReply un modèle {name}, level {level}, {subarea} {position}, {kamas} kamas, {pods} pods status set : available, away, private, solo ; text, avec away seulement, 256 caractères au plus inchangé timing.read min, max : secondes, de 0 à 120 2 à 6 timing.typing caractères par seconde, de 1 à 50 6 Un champ que cette version ne lit pas est gardé tel quel et ignoré, donc un profil écrit pour une version plus récente se charge quand même. Erreurs et avertissements Une erreur empêche d'utiliser le profil, et son message nomme le champ : un mauvais type, un canal que le jeu ne connaît pas, un message vide, des accolades déséquilibrées dans un modèle, une attente hors limites, un test inconnu, un test sur le message dans la condition d'une annonce ou sur la ligne d'un canal dans celle d'une réponse, une regex qui ne compile pas, une commande, une action ou un statut qui n'en est pas un. Un profil avec une erreur est listé Inutilisable, et les bots le sautent. Un avertissement est seulement bon à savoir : ads[0].messages[1]: {acheteur} is set by no variable here: a script or another profile must set it ads[0].messages[0]: {sender} never has a value in an ad: the message isn't sent status.set: private keeps strangers' whispers out: the replies get none item 289: not in the game data, pour un identifiant que n'a pas la version du jeu la plus récente que vous avez installée. name: "Blé", but its file is "ble.json": bots use it as "ble", pour un fichier renommé à la main. Les fichiers des profils Vos profils sont des fichiers du dossier chatprofiles du dossier des données d'Asterobot, un <nom>.json chacun, exactement au format ci-dessus (Fichiers et dossiers). Un bot relit ses profils quand il se connecte et quand ses réglages de chat changent : un fichier que vous modifiez à la main joue à partir de là. Un paquet fournit ses profils en chatprofiles/<nom>.json à sa racine. Ils sont listés en @éditeur:paquet/<nom>, et chaque bot utilise la version du paquet la plus récente que vous avez installée.
  22. Smooth a posté a record dans Chat
    Laissez un bot parler dans le chat tout seul : poster des annonces, répondre aux messages privés qu'il reçoit, agir sur ce que disent les autres joueurs dans les canaux, obéir aux commandes de vos autres comptes et garder un statut. Activez le module de chat, choisissez ses profils de chat, essayez-les à blanc, réglez combien de lignes il envoie par minute, arrêtez l'envoi quand il le faut, et lisez ce qu'attend chaque annonce et ce qui a été dit. Read this page in English Le module de chat laisse un bot parler dans le chat du jeu tout seul. Il poste des annonces : des messages que le bot dit dans les canaux que vous choisissez, à intervalles aléatoires, tant que leurs conditions sont vraies. Il répond aux messages privés que reçoit le bot, après le temps qu'une personne mettrait à lire et à taper. Il agit sur ce que disent les autres joueurs dans les canaux, par exemple en écrivant en privé à un joueur qui cherche ce que le bot vend. Il obéit aux commandes que vos autres comptes envoient au bot en message privé, comme !status ou !stop. Et il peut garder le statut du personnage, comme Absent avec un message. Ce qu'il dit vient des profils de chat du bot. Chaque ligne que dit le bot passe par le garde du module, qui respecte les limites du serveur lui-même : le bot n'en dit jamais plus que ce que le jeu permet. Le module écoute aussi. Avec les alarmes par défaut, un membre de l'équipe qui parle au bot, l'avertit, le rend muet ou se tient sur sa carte met son chat en pause pour une demi-heure, et un message privé ou le nom du personnage dit dans un canal affiche une notification dans Asteroboard. L'onglet Chat Ouvrez la page d'un bot, puis son onglet Chat. Réglage Ce qu'il fait Module de chat Fait tourner le module : le bot poste ses annonces, répond et obéit tant que son personnage est en jeu. Éteint, il ne fait rien de tout cela. Le garde continue de toute façon à traiter ce que vous tapez dans la Console et ce que disent les scripts. Annonces La partie annonces du module. Éteinte, le module tourne mais ne poste aucune annonce. Réponses Les réponses aux messages privés. Éteintes, le bot ne répond rien. Voir Réponses. Déclencheurs Ce que fait le bot sur les lignes des canaux. Éteints, il n'y fait rien. Voir Déclencheurs. Commandes Les commandes que vos comptes envoient en message privé. Éteintes, une commande n'est qu'un message, auquel les réponses répondent. Voir Commandes. Statut Le statut que les profils donnent au personnage. Éteint, le bot laisse le statut tel quel. Voir Statut. Essai à blanc Écrit chaque ligne dans la console du bot au lieu de l'envoyer, par exemple Dry run: would say in Commerce: Vends du blé, MP !. Ce que vous tapez dans la Console est toujours envoyé. Profils Les profils de chat du bot, dans l'ordre. Voir Profils. Lignes par minute Le plus de lignes que le bot envoie en une minute, messages privés compris, de 1 à 30. Vide vaut 6. Tapez un nombre, puis cliquez sur Appliquer. Chaque interrupteur et chaque changement des profils est enregistré tout de suite, dans les réglages du bot, et le bot le suit aussitôt. Profils Ajouter un profil ajoute l'un de vos profils de chat, ou de ceux de vos paquets, en fin de liste. Les flèches montent ou descendent un profil, et la croix le retire du bot (le profil lui-même reste). Profils de chat ouvre la page Profils de chat. Chaque annonce de chaque profil tourne. Quand plusieurs profils fixent la même variable, la valeur du premier profil l'emporte, et c'est à cela que sert l'ordre : un profil avec les prix de la semaine au-dessus d'un profil avec les annonces qui les lisent. Un profil illisible affiche Illisible : survolez-le pour savoir pourquoi. Ses annonces ne tournent pas tant que vous ne l'avez pas corrigé. Un profil que vous supprimez quitte la liste de chaque bot, et un profil que vous renommez garde sa place sous son nouveau nom. Ce qu'un script change Un script peut allumer ou éteindre le module, ses parties et l'essai à blanc, et choisir les profils, pendant qu'il tourne (voir asterobot:chat). L'onglet dit alors ce qu'il règle, par exemple « Le script en cours règle : module allumé, Réponses désactivées, profils Vente de blé. ». Vos réglages enregistrés reviennent quand le script s'arrête. Un script peut aussi répondre lui-même aux messages privés, avant les réponses des profils. Sur une session relayée, seul l'interrupteur Module de chat que vous avez enregistré compte : un script ne peut pas y allumer ni éteindre le module. Envoi Chaque ligne que dit le bot passe par le garde, une à la fois : Une ligne en vol. Le garde envoie une ligne, puis attend que le serveur la renvoie, ou la refuse, avant la suivante. Après 5 secondes sans réponse, la ligne compte comme envoyée. Les délais. Quand le serveur répond qu'un canal est dans son délai (« Vous pourrez envoyer un nouveau message dans 37 secondes »), le garde attend exactement ce temps et renvoie la ligne une fois. La console dit Waiting 37 s for the cooldown in Commerce, then sending the line once more. Le plafond. Au plus Lignes par minute lignes partent en une minute. Trop de spam. Quand le serveur dit « Too much spam! », plus rien n'est envoyé pendant 5 minutes, puis 10, 20, 40 et 60 minutes au plus s'il le redit. Un mutisme. Quand un membre de l'équipe rend le personnage muet, plus rien n'est envoyé jusqu'à la fin du mutisme, plus une minute. Le jeu qui redonne la parole au personnage y met fin aussitôt. Vos lignes d'abord. Ce que vous tapez dans la Console passe avant toute autre ligne, et seul un délai le retient. Viennent ensuite les lignes des alarmes, les réponses aux commandes, les réponses et les messages des déclencheurs, et enfin les lignes des scripts et les annonces. La section Envoi montre où en est le garde : Envoi en cours, En pause jusqu'à une heure, Arrêté jusqu'à la reprise, Trop de spam : attente jusqu'à une heure, ou Muet jusqu'à une heure. Arrêter l'envoi retient les annonces, les réponses, les messages des déclencheurs, les réponses aux commandes et les lignes des scripts jusqu'à ce que vous cliquiez sur Reprendre ; les lignes en attente sont abandonnées. Ce que vous tapez dans la Console et les lignes que disent vos alarmes partent quand même. Une alarme qui met le chat en pause s'affiche en En pause jusqu'à la fin de sa pause. Annonces La section Annonces liste chaque annonce des profils du bot, avec son nom (ou Annonce 1, Annonce 2...), son profil, et où elle en est : État Ce qu'il veut dire Part dès que possible Son attente est finie : elle part au prochain passage, dans la seconde. Prochaine à une heure Elle attend entre deux envois. Attend : un test Un test de sa condition est faux, par exemple Attend : Sous-zone. Elle part dès que la condition est vraie, si son attente est finie. Attend : le personnage n'est pas encore en jeu Le bot est connecté mais son personnage n'est pas encore entré en jeu, par exemple pendant qu'il en choisit un. Attend : l'envoi est arrêté, Attend : trop de spam, Attend : le personnage est muet Le garde retient toutes les annonces. Une raison, comme {prix} has no value Son message ne peut pas être rempli : une variable sans valeur, un objet que le personnage n'a pas. Terminée : tous ses envois sont faits, Terminée : son temps est écoulé, Terminée : sa date est passée Son arrêt l'a terminée pour de bon. À côté, combien de fois elle est partie (Envoyée 3 fois) et quand pour la dernière fois. Quand vient le tour d'une annonce, elle remplit l'un de ses messages et l'envoie dans chacun de ses canaux à la fois : un canal encore dans son délai attend pendant que les autres partent. Elle attend ensuite un temps aléatoire entre ses deux attentes avant l'envoi suivant, et joue son émoticône ou son attitude, si elle en a une, sauf en essai à blanc. Les compteurs sont gardés en mémoire : ils repartent de zéro au redémarrage d'Asterobot ou quand les profils du bot changent. Quand le personnage n'a plus d'un objet que lie une annonce, après que l'annonce l'a dit au moins une fois, l'activité affiche Épuisé, et les alarmes l'entendent comme un évènement soldOut. L'annonce reprend quand l'objet est revenu. Réponses Quand un autre joueur envoie un message privé au bot, le bot répond avec la première règle de réponse de ses profils dont le test est vrai, par exemple « le message contient le mot prix ». Il attend d'abord comme le ferait une personne : un temps au hasard pour lire le message, puis le temps de taper la réponse, tous deux réglés par le rythme du profil. Un joueur reçoit au plus une réponse des règles par heure par défaut : le bot répond au premier message d'une conversation et se tait ensuite ; un profil peut changer cela. Un script peut répondre en premier, aussi souvent qu'il veut (voir asterobot:chat). Le bot ne répond jamais : à vos propres bots, pour que deux de vos bots ne se parlent jamais ; à un membre de l'équipe ; à une commande, que les commandes traitent à la place. Déclencheurs Quand un autre joueur dit quelque chose dans un canal, chaque déclencheur des profils du bot dont le test tient se déclenche, par exemple « une ligne en Commerce avec le mot wtb ». Il fait ses actions dans l'ordre : écrire en privé au joueur, dire quelque chose dans un canal, lever un événement pour les alarmes, prévenir le script, ignorer le joueur, jouer un smiley ou une émote, inviter le joueur dans le groupe, mettre le chat en pause. Un message privé ou un message attend comme une réponse, le temps de lire la ligne et de le taper. Un même joueur déclenche un déclencheur au plus une fois par heure par défaut ; un profil peut changer cela. Les lignes de vos propres bots déclenchent aussi, sauf si un déclencheur teste L'un de vos bots. Celles d'un membre de l'équipe et celles du personnage lui-même jamais. La console dit chaque déclencheur, par exemple Trigger wtb: Buyer in Trade: wtb wheat, et la section Activité aussi. Commandes Quand l'un des profils du bot obéit aux commandes, un message privé qui commence par !, venant de l'un de vos autres comptes ou d'un personnage auquel le profil fait confiance, est une commande. Le !stop d'un inconnu n'est qu'un message, auquel les réponses répondent : rien ne lui dit que le bot prend des commandes. Commande Ce que fait le bot !stop Arrête son script et son trajet. !start Lance son script, celui qu'il joue quand vous cliquez sur Lancer. !pause ou !pause 30 Arrête l'envoi, jusqu'à !resume ou pendant 30 minutes, comme Arrêter l'envoi. !resume Envoie de nouveau. !say bonjour Dit bonjour dans le canal Général, tel quel. Le raccourci d'un canal en choisit un autre : !say /b vends du blé part en Commerce. !status Répond avec son état, par exemple Hero, level 50, Cité d'Astrub [4,-19], 12000 kamas, 350/2000 pods. !disconnect ou !disconnect 30 Quitte le jeu, et revient au bout de 30 minutes quand vous les donnez. Pas sur une session relayée. !status est la seule commande qui répond. La console et la section Activité disent ce qu'a fait chaque commande, par exemple Command !stop from Master: the script is stopped. !stop, !start et !disconnect prennent la main sur le planning du bot, comme les mêmes boutons. Une fois le script arrêté par !stop, vos réglages enregistrés reviennent : le bot n'entend !start que si l'interrupteur Module de chat que vous avez enregistré est allumé et que l'un des profils enregistrés prend des commandes. Quand c'est le script qui allume le module ou choisit les profils, !start n'est pas entendu. Un profil choisit son préfixe, les personnages auxquels il fait confiance en plus de vos comptes, les commandes qui marchent et ce que répond !status (Commandes). Un nom de confiance ne compte que sur le serveur du bot. Une commande que le profil ne connaît pas va au script du bot, s'il répond aux commandes, et est ignorée sinon. Statut Quand l'un des profils du bot a un statut, le personnage le prend une fois en jeu, comme le réglerait le menu de statut du jeu : Disponible, Absent avec son message, Privé ou Solo. La console dit Status set to away by the chat profiles, et l'en-tête du bot l'affiche. Un statut que vous changez ailleurs l'emporte : le menu de statut de l'en-tête, votre client de jeu sur une session relayée, un script. Le bot le laisse jusqu'à ce que les profils donnent un autre statut, que la partie Statut soit éteinte puis rallumée, ou la prochaine connexion. Quand les profils ne donnent plus de statut, ou que la partie s'éteint, le personnage reprend le statut qu'il avait avant, sauf si quelqu'un l'a changé entre-temps. Absent, Privé et Solo refusent d'eux-mêmes les invitations de groupe, comme dans le jeu, et Privé bloque les messages privés des inconnus, que les réponses ne reçoivent alors jamais. Activité La section Activité garde les 200 dernières lignes, commandes, déclencheurs, fins d'annonce et mises en retrait, les plus récentes en premier, jusqu'au redémarrage d'Asterobot. Chacune montre son heure et ce qui s'est passé : Envoyée, Essai à blanc, Non envoyée, Annonce terminée, Épuisé, En retrait après « Too much spam! » ou un mutisme, Commande ou Déclencheur. Une ligne montre aussi qui l'a dite (Vous, Alarme, Commande, Réponse, Déclencheur, Script ou Annonce), où (dans un canal, ou à un personnage), la ligne, et pourquoi elle n'est pas partie. Une commande montre qui l'a envoyée et ce qu'a fait le bot ; un déclencheur, qui a dit la ligne et où, la ligne, et le nom du déclencheur. Le chat lui-même reste dans la Console : les lignes du bot y apparaissent quand le serveur les renvoie, et celles de l'essai à blanc comme lignes de console.
  23. Smooth a posté un record dans Chat
    Decide what follows when a member of staff, a whisper, the character's name, a chat module event or any game message reaches one of your bots: the events alarms follow, the default rules, writing your own on the Alarms page with conditions on the event, every reaction, the notifications in Asteroboard or on any web service through a plain HTTP request, and the last alarms. An alarm follows what happens to your bots: a member of staff speaking to one, warning it, muting it or standing on its map, a player whispering it, its character's name said in a channel, the chat module's events, and any message the game sends it that you choose to hook. Its rules say what follows: a notification in Asteroboard or on any web service, the chat paused, a line said, a package played, the script stopped, a game message sent, the bot disconnected. The rules are one list for the whole Asterobot, and each rule can watch every bot or some. Alarms work whether the chat module is on or off: they read the same chat the Console shows. What alarms follow Event When Staff A member of staff speaks in a channel the character reads, sends it a warning, mutes it, or stands on its map. The same person raises it at most once a minute for the same reason, and once per map they stand on. Whisper A player whispers the character. A whisper from one of your own bots, or from a player the character ignores, isn't one. Name said The character's name is in a line said in a channel, as a whole word, whatever its capitals and accents: "hi hero!" names Hero, "superheroes" doesn't. A line from one of your own bots, or from a player the character ignores, isn't one. Too much spam The server says "Too much spam!": the chat module's guard backs off. Line refused A channel refuses one of the bot's lines. Sold out An item an ad links ran out. Ad stopped An ad reached its stop condition. Every trigger A chat trigger's raise action. trigger:wtb is one trigger's event: see Chat profiles. Every script event A script's raise(). script:found is one script event: see the asterobot:alarms reference. game: and a message's name The game sends the bot that message: see Game messages. A member of staff is recognised as the game client does: a line the server marks as an administrator's or says in the staff channel, a warning window, a mute, and on the map, a character whose account role isn't a player's. Each event says something: who and what, as fields. A rule's conditions and its reactions' texts read them. Event Fields Staff reason (line, warning, mute or map), who, channel, text, minutes of a mute, role on the map Whisper sender, text Name said channel, sender, text Too much spam minutes Line refused channel, reason Sold out ad, item Ad stopped ad A trigger's trigger, channel, sender, text A script's name, text A game message's its fields, see Game messages The default rules Until you change them, two rules apply: Rule Events Reactions Staff Staff Pause the chat for 30 minutes, then Notify every destination. Messages Whisper, Name said Notify Asteroboard. The Alarms page shows them with The default rules: saved at the first change: the first time you save, they're written to a file you then own. The Alarms page Open Alarms in Asteroboard's menu. The page shows the rules' form on the left and their JSON on the right, both live, as in the chat profile editor. Save sends the rules to Asterobot, which checks them and names the field at fault of anything it refuses; Discard puts back the rules as saved. Leaving the page with unsaved changes asks first. Add a rule adds one at the end. The rules apply in order; the arrows move one up or down. Field What it does The switch Turns the rule on or off without deleting it. The name Its name, shown with each alarm it fires. Each rule needs a name of its own. Events The events it takes. Type one to add it: game:CharacterLevelUpEvent, trigger:wtb, script:found. Bots The bots it watches. Every bot when none is picked. Match What the event's fields must hold: see Match. Every event when empty. At most once every The rule fires at most once in this long for each bot. Every time when empty. Reactions What it does, in order. Add a reaction picks one. When several rules take the same event, each one fires, side by side, and a reaction two rules ask for the same event, with the same settings, is done once. One rule that repeats a reaction, a message, a wait and the same message again, does it each time. A Wait holds back only the rest of its own rule. A rule you switch off or delete during its Wait does nothing more after it, and the bot's console says so. Match Add a field adds a condition on one of the event's fields. Every one must hold for the rule to fire; for an "or", write two rules. Condition Holds when the field... is equals the value, numbers as numbers: 10017 is 10017.0. is one of equals one of the values. contains contains the text, capitals and accents ignored: bot is in "Are you a BÔT?". is above, is below is a number above or below it. is between is a number above the first and below the second. A field the event doesn't have fails the condition. For example, a rule taking Staff with reason is mute fires on a mute only. Game messages A rule can take any message the game sends the bot: type game: and the message's name in Events, such as game:CharacterLevelUpEvent. Each time the game sends the bot that message, the rule takes it, with the message's fields. Names: a message's name and its fields' are the readable ones of the Dofus protocol reference, with underscores: new_level. The bot's Network tool shows which messages the game really sends, with real values. A name the protocol doesn't have is refused when you save. Fields: a nested field is written with dots, a list's item with its index: author.name, parameters.0. json is the whole message, as JSON. Cost: a message no rule names costs nothing. Only the messages your rules name are read into fields. Direction: only what the game sends the bot. The bot's own requests aren't followed. For example, to be told when a character reaches level 200: Events game:CharacterLevelUpEvent, Match new_level is above 199, Reactions Notify. Some fields still have short scrambled names, such as galg: Asterobot doesn't know what they hold yet, and their names can change with a game update, so don't build a rule on them. Reactions Reaction What it does Notify Sends the alarm to its destinations: Every destination when none is picked. Asteroboard is built in, see Notifications, and you add your own, see Destinations. Pause the chat Holds the bot's ads' and scripts' lines back for this long, as Stop sending does, and drops those waiting. The console says Alarm: the chat is paused for 30 minutes. Say Says a line in a channel, through the bot's guard. Whisper Whispers a line to a character: To a name, or empty for the player whose whisper or line raised the alarm. Play Runs a package on the bot, its newest installed version, in place of the script it runs: on staff, a package that takes the character somewhere quiet. Empty, Its own script, plays the bot's own script again. Its schedule leaves it alone until its next range. The console says Alarm: playing and the package. Stop the script Stops the bot's script, and its trip if it's on one. Its schedule leaves it alone until its next range. The console says Alarm: stopping the script. Wait Waits this long before the rule's next reaction: Stop the script, Wait 10 minutes, Play its own script is a 10-minute break. Send a game message Sends a message to the game, as a script's send() does: the message's name, and its fields as JSON, whose texts read the alarm's variables. It goes around the chat module's guard. Write in the console Writes a line in the bot's console, as a warning: Staff on the map: {who}. Set a flag Turns on a flag the bot's chat profiles read in their conditions, for this long, or until the game session ends when empty: on staff, a quiet flag that stops the ads written with "not the flag quiet". Disconnect Takes the bot out of the game, and brings it back after Come back after, unless that's empty. A scheduled bot comes back only if its range hasn't ended meanwhile. The console says Alarm: disconnecting, then Alarm: coming back at 21:30:00. On a relayed session it does nothing, since the person playing decides: not done on a relayed session: the person playing it decides. A line to say or whisper is a message template, and reads the alarm's variables besides the character's own: each field of the event, {sender}, {text}, {who}, {channel}, {minutes}..., and {bot}, {character}, {rule}, {event}. The character's own come first: in a line, {name}, {server} and {time} are the character's name, server and time of day. For example {Sorry|Hi} {sender}, I'm busy right now. An alarm's line goes through the guard like any other, but a pause doesn't hold it back. A console line and a game message's texts read the alarm's variables only: each field of the event, and {bot}, {character}, {server}, {rule}, {event}, and {time}, the event's date and time, such as 2026-10-28T14:05:09+01:00. A variable the event doesn't have is empty there, and braces that name no variable stay as they are. A reaction that can't be done writes why in the bot's console, Alarm Staff: play failed: no package "@me:hide" is installed, shows in Last alarms, and the rule goes on. Notifications A Notify reaction with the Asteroboard destination shows a notification in every open Asteroboard, whichever page is open: "Bot-Name: a member of staff", "Bot-Name: Player-Name whispers", "Bot-Name: Player-Name says the character's name", "Bot-Name: too much spam, the chat waits 5 minutes", and for a trigger's, a script's or a game message's, the event's name, with what was said. A member of staff's stays until you close it. Open goes to the bot's page. Destinations Besides Asteroboard, a Notify can reach any web service: a chat app, a push service on your phone, a server of your own. Each destination is a plain HTTP request you write. Add a destination, under the rules on the Alarms page, adds one. Field What it does The switch Turns it on or off. A Notify skips it while it's off. The name What a Notify picks. Each destination needs a name of its own, and Asteroboard is taken. The method GET, POST, PUT, PATCH or DELETE. The URL The full URL, starting with https:// or http://. Headers Names and values, such as an Authorization header with your token. Add a header adds one. Body What's sent, if anything. The URL, the headers' values and the body read the alarm's variables, as a console line does: {bot}, {character}, {server}, {rule}, {event}, {time}, and each field of the event, {sender}, {text}, {who}... Each value is escaped for where it lands, so a quote in a whisper never breaks your request: In the URL: URL-encoded. Seller A becomes Seller%20A. In a JSON body: JSON-escaped, to write between quotes: "text": "{text}". {json}, a game message as JSON, goes in as it is: "message": {json}, and as null for an event that isn't a game message. In a form body, with the header Content-Type: application/x-www-form-urlencoded: URL-encoded. In a header: on one line. The body is sent with your Content-Type header when you give one. Without it, a body that is a JSON object or array, its variables aside, is sent as application/json, and anything else as text/plain. Test Test sends the destination once, as it stands on the page, saved or not, with a sample event: the bot Asterobot, the event test, the text "This is a test from Asterobot". It shows what the service answered: The service took it with its status, or The service didn't take it with why, such as the service answered 401 Unauthorized and the start of its reply, or no answer within 10 s. Sending Each destination's requests leave one at a time, in order, and a service gets 10 seconds to answer. When it doesn't answer, says it has too many requests (429) or has a problem of its own (5xx), the request is sent again after 2, 10 and 30 seconds. Any other answer is final, since the request itself is wrong. A request that fails for good writes why in the bot's console: Alarm Staff: My phone didn't take the request: the service answered 401 Unauthorized. At most 100 requests wait for one destination. Past that, the Notify fails for that destination, and says so in Last alarms. A request still waiting for its turn after 10 minutes, while the service is down, is dropped unsent, so that the alarms you get when it's back are fresh ones; the bot's console says so. A URL or a token stays in alarms.json, on your computer. Asterobot never writes them in a console line. Examples Each service documents the request it takes: its URL, and the names it gives the fields of its body. Most take one of these three shapes. A JSON webhook, the URL the app gave you, its body a JSON object: Field Value The method POST The URL https://chat.example.com/hooks/1234/abcd Body { "text": "{bot}: {event} {who}{sender} {text}" } A push service taking the message as plain text, its title in a header: Field Value The method POST The URL https://push.example.com/my-topic Headers Title: {bot}: {event} Body {who}{sender} {text} A service taking everything in its URL, and a token in a header: Field Value The method GET The URL https://api.example.com/send?to=me&message={bot}%3A%20{text} Headers Authorization: Bearer your-token Last alarms Under the rules and destinations, Last alarms lists the last 100 alarms fired, the latest first, until Asterobot restarts: when, the event and its bot, character and server, its fields, the rule, and each reaction, Done or with the reason it couldn't be, one hover away. A rule with a Wait shows once all its reactions are done. A Notify is Done once its requests are on their way: one that fails later writes why in the bot's console. The alarms file The rules are the file alarms.json in Asterobot's data folder (Files and folders). What you save on the Alarms page applies at once; a change you make to the file by hand applies the next time Asterobot starts. { "version": 1, "destinations": [ { "name": "My phone", "method": "POST", "url": "https://push.example.com/my-topic", "headers": { "Title": "{bot}: {event}" }, "body": "{who}{sender} {text}" } ], "rules": [ { "name": "Staff", "events": ["staff"], "do": [ { "pauseChat": 1800 }, { "notify": [] } ] }, { "name": "Messages", "events": ["whisper", "mention"], "do": [ { "notify": ["Asteroboard"] } ] }, { "name": "Muted", "events": ["staff"], "match": { "reason": "mute" }, "do": [ { "stopScript": {} }, { "wait": 60 }, { "disconnect": { "reconnectAfter": 3600 } } ] }, { "name": "Level 200", "events": ["game:CharacterLevelUpEvent"], "match": { "new_level": { "above": 199 } }, "do": [ { "notify": ["Asteroboard"] }, { "log": "{character} reached level {new_level}" } ] }, { "name": "Answer whispers", "events": ["whisper"], "bots": ["Farmer-1", "Farmer-2"], "every": 600, "do": [ { "whisper": { "text": "{Sorry|Hi} {sender}, I'm busy right now" } } ] } ] } Field Values version 1 destinations[].name text, each its own, not Asteroboard destinations[].enabled false turns it off; on when absent destinations[].method GET, POST, PUT, PATCH, DELETE destinations[].url the full URL, https:// or http://, a template destinations[].headers names and values, the values templates destinations[].body a template; nothing sent when absent rules[].name text, each its own rules[].enabled false turns it off; on when absent rules[].events staff, whisper, mention, spam, refused, soldOut, stopped, trigger, script, trigger:<name>, script:<name>, game:<Message> rules[].bots bot names; every bot when absent rules[].match field names and what each must hold: a value ("mute"), a list of values (["PRIVATE", "GUILD"]), { "contains": "bot" }, { "above": 199 }, { "below": 10 }, or both for a range rules[].every seconds; the rule fires at most once in that long for each bot rules[].do reactions, each an object of one key: { "notify": ["Asteroboard", "My phone"] } (an empty list for every destination), { "pauseChat": 1800 } (seconds), { "say": { "channel": "GLOBAL", "text": "..." } }, { "whisper": { "to": "Name", "text": "..." } }, { "play": "@me:hide" } ("" for the bot's own script), { "stopScript": {} }, { "wait": 60 } (seconds), { "send": { "type": "EmotePlayRequest", "payload": { "emote_id": 1 } } }, { "log": "..." }, { "flag": { "name": "quiet", "for": 600 } } (seconds, 0 for the game session), { "disconnect": { "reconnectAfter": 600 } } (seconds, 0 to stay out) A file that can't be used, such as one you edited by hand with a mistake, shows The file can't be used: the default rules apply with the field at fault, and the default rules apply until you fix it.
  24. Smooth a posté un record dans Chat
    Make, copy, import, export, edit and delete the chat profiles your bots talk from, on the Chat Profiles page. Write ads with random choices, item links and variables, set when each runs and what ends it, write the answers to private messages, what a bot does on the channels' lines, the commands it obeys and its status, and read the profile format. A chat profile says what a bot says on its own: ads it posts in the channels you pick, at random intervals, while their conditions hold; answers to the private messages it gets; what it does on the channels' lines; the commands it obeys; its status. A bot uses several profiles at once, picked on its Chat tab (The chat module), and one profile can serve as many bots as you like. Profile What it is Can you change it? Yours, Yours Profiles you made, copied or imported. Each is a file in Asterobot's data folder. Yes. A package's, Package Shipped by a package you installed, named after it, such as @some-author:traders/wheat. No. Copy it to change it. The Chat Profiles page Open Chat Profiles in Asteroboard's menu. The page lists yours by name, then those of your packages. Column What it shows Name The profile's name, the one a bot's Profiles list shows. Ads How many ads it holds. Source Yours or Package, with the package's version. Status Ready, Can't be used when it has an error, or how many warnings it has. Hover over it to read them. The filter above the table finds a profile by name. Each row has a menu: Item What it does Edit Opens your profile in the editor. View for a package's, which opens read-only. Copy Saves a copy under a name of your own, then opens it in the editor. Export Downloads the profile as a .json file. Delete Deletes one of your profiles, after asking. A package's can't be deleted. The page stays current on its own when a profile is saved, imported or deleted, and when a package is installed or removed. Make a profile Click New profile. Type a Name, then click Create. The editor opens on the new, empty profile. A name is also the profile's file name: it can't be empty, start with @, or contain a / or a character a file name can't hold. The dialog then shows chatprofiles: a profile's name can't be empty, start with @, or hold / or a character a file name can't. A name another profile has gives chatprofiles: a profile already has this name. Copy, share and delete Copy, in a row's menu or in the editor, opens a dialog with the name filled in as the original's followed by copy. The copy is yours: that's how you change a package's profile. Export downloads the profile exactly as it's stored. To use a profile someone shared, click Import, pick the file under Profile file or paste the JSON under Profile JSON, then click Import. The profile joins yours under the name it carries; when you already have one with that name, the dialog asks before Replace it overwrites yours. A profile names items, maps and areas by their game ids, which are the same for everyone playing the same game version. Delete asks first: "... will be deleted for good. Bots using it drop it from their profiles." The editor The editor shows the profile's form on the left and its JSON on the right, both live: a field changed in the form shows in the JSON at once, and JSON you type fills the form once it reads. Save sends the profile to Asterobot, which checks it, and every bot using it follows at once. A profile Asterobot can't accept is refused with the field at fault, such as chat: malformed profile: ads[0].messages: an ad needs a message. Its warnings show above the form, under Worth knowing. A package's profile opens read-only, with Copy to make one yours. Leaving the editor with unsaved changes asks first. General Name and Description. Renaming a profile moves every bot using it to the new name. Variables Values the messages read by name: a message writing {price} says the value of price. Add a variable, then type its Name and its Value. When several profiles of a bot set the same variable, the first profile's value wins; a script can set its own, which win over every profile's. The character's own, such as {name} or {level}, can't be replaced. Ads Add an ad adds one, in Trade, waiting two to four minutes between sends, with one message to write. Field What it does Name Optional: the name the bot's Chat tab shows. Without one, it shows Ad 1, Ad 2... Channels Where each send goes, named and coloured as in the game. Each send goes to every channel: a channel still in its cooldown is waited for, the others go. Messages One is said each time. Each shows a preview below it. See Messages. Order At random, never the same message twice in a row, or In order. Wait at least, Wait at most The random wait between two sends, from 1 second to 24 hours, in seconds, minutes or hours. Only when The ad's condition: it waits while the condition doesn't hold. See Conditions. Stop What ends the ad for good. See Stop. With each send An Emoticon or an Emote the character plays as it says the message. Messages A message is a template that the bot fills in each time it says it: You write The bot says {Hi|Hello|Hey} One of the choices, at random. Choices can be nested and empty: {!|}. {item:289} A link to the item, as the game's own item links, from the character's inventory. One in the bags is preferred to a worn one. {name}, {level}, {server}, {subarea}, {area}, {position}, {kamas}, {pods}, {time} The character's name, level, server, subarea, area, position as a link to its map, which the game shows as [4,-19], kamas, pods as used/max, and the time as HH:MM. {sender} In a reply, a trigger's message or the status reply: who wrote the message or the line. {price}, or any other name A variable. A message isn't sent while one of its variables has no value or the character doesn't have an item it links: the ad waits, and the Chat tab says why. Neither is a message past the game's 256 characters or 16 item links. The preview under each message shows a few fills, each item link as [its name], in the colour of the ad's first channel, and the longest the message can be against the game's limits: "Up to 74/256 characters, 1/16 item links". It's made without a bot, so the character's variables stay written as {name}, and items are named in the game language you read the game in. Conditions Only when holds tests, all of which must hold, and groups: All of these, Any of these, and Not this one. Without a test, the ad always runs. Test Holds when Time The computer's time is between From and To, past midnight when To comes first, on one of the Days ticked, every day when none is. In a fight, On a trip The character is in a fight, or on a trip, or isn't: Yes or No. Map, Subarea, Area The character is on one of these. Has an item The character has at least this many of the item. Kamas, Level The character's kamas or level is Above and Below the numbers given. A flag A script, or an alarm's Set a flag reaction, has set this flag. A test about something the bot doesn't know yet, such as its kamas before the game has sent the inventory, doesn't hold. Stop The Stop ends the ad for good, whichever comes first: After so many sends, a time After its first send, or On a date, on the computer's clock. The counts are kept in memory: they start over when Asterobot restarts or the bot's profiles change. Replies The answers to the private messages a bot gets (Replies). Add a rule adds one, answering any message with one reply to write. Field What it does Answers when The rule's condition: the tests an ad takes, and two more about the message. Without a test, the rule answers any message. Replies One is picked at random. They're messages, and {sender} says who wrote. The preview shows {sender} as Player. Answers per player At most this many answers from the rules to one player, In this time. One an hour by default, which answers the first message of a conversation. The first rule whose test holds answers, so a rule without a test goes last: the arrows move a rule up or down. When a bot has several profiles, their rules add up in profile order, and the first profile with Answers per player sets it. A reply rule's condition can also test the message: Test Holds when Sender The character who wrote is one of the Names, capitals ignored. Words The message has one of the Keywords as a word, Contains a text, and matches the Regex: each one you fill in must hold. Keywords and Contains ignore capitals and accents, so ble finds blé. The regex is as written, in Go's syntax: (?i) at its start ignores capitals. Triggers What a bot does on a line said in a channel (Triggers). Add a trigger adds one, on a line in Trade that none of your bots said, with a whisper to write. Field What it does Name What the trigger is called in the Chat tab and the console, and in the alarm event and the script event it gives. Fires when The trigger's condition: an ad's tests, a reply's Sender and Words, and four more about the line, below. Without a test, it fires on any line of any channel. Actions What it does, in order, each once the one before is done. The arrows move an action up or down. Per player One player fires it at most this many times, In this time. Once an hour by default. Every trigger whose test holds fires, so one line can fire several. When a bot has several profiles, their triggers add up. A trigger's condition can also test the line: Test Holds when Channel The line was said in one of these channels. One of your bots Yes: one of your other accounts in this Asterobot said it. No: anybody else did. Names the character The line has the name of the bot's character as a word, capitals and accents ignored. Links an item The line links this item. Action What it does Whisper the sender Whispers one of its messages, picked at random. {sender} says who wrote the line. Say in a channel Says a message in the channel you pick. Raise an alarm event Raises the event trigger:<name> for the alarms: a rule naming it decides what follows, such as a notification. Tell the script The bot's script hears it (onChat). Ignore the sender Adds the sender to the character's ignore list, as the game's menu does: their lines are hidden for the rest of the game session, and fire nothing more. If the game refuses, such as when the list is full, the console says why. Play a smiley, Play an emote Plays the one you pick. Invite to the party Invites the sender to the character's party. Pause the chat The bot sends nothing for this long, as with Stop sending. A whisper or a message waits the timing, as a reply does. In a dry run, the messages, the ignore, the invitation and the smiley or emote are only written to the console. Commands The commands a bot obeys (Commands). Turn on Obeys commands to set them; without it, the profile takes no command. The bot's first profile that takes commands sets them all. Field What it does Prefix What a command starts with, up to 3 characters. ! by default. Trusted names Characters on the bot's own server whose commands it obeys. Type a name and press Enter. Your bots Your other accounts in this Asterobot are trusted too, whatever their character. On by default. Commands that work The commands the bot obeys. All of them by default. Status reply What !status answers, a message. Empty, it's {name}, level {level}, {subarea} {position}, {kamas} kamas, {pods} pods. Status The status the character takes while the bot's Status part is on (Status). Turn on Sets the status and pick Available, Away, Private or Solo, as the game's status menu has them. Away takes an Away message, up to 256 characters, which players read when they write to the character in private. The bot's first profile with a status sets it. Private keeps strangers' private messages out, so the replies get none: the editor warns you. Timing How long the bot takes to answer, as a person would: a random time to read the message, between Reads at least and Reads at most seconds (2 to 6 by default, 120 at most), then the time to type the answer at Characters a second (6 by default, 50 at most). The bot's first profile with a timing sets it, for the replies, the triggers' messages and the answer to !status. The format A profile is a JSON file. This is the format the editor writes, and the one Export and Import use: { "version": 1, "name": "Sell wheat in Astrub", "description": "Wheat ads in Trade, in the evening, and price answers.", "variables": { "price": "12" }, "ads": [ { "name": "Wheat ad", "channels": ["SALES"], "messages": ["{Selling|WTS} {item:289} at {price} k each, /w me", "{item:289} for sale, {price} k, /w {name}"], "order": "random", "every": { "min": 120, "max": 240 }, "when": { "all": [ { "time": { "from": "18:00", "to": "23:30" } }, { "map.subarea": { "in": [95] } }, { "bot.inFight": false } ] }, "stop": { "after": 50, "for": 7200, "until": "2026-11-01T20:00" }, "smiley": 1 } ], "replies": { "rules": [ { "when": { "text": { "keywords": ["price", "prix", "combien"] } }, "reply": ["{price} k each, {come|meet me} in Astrub"] }, { "reply": ["{Hi|Hello} {sender}, busy for now, I'll answer later"] } ], "perPlayer": { "max": 1, "every": 3600 } }, "triggers": [ { "name": "wtb", "when": { "channel": { "in": ["SALES"] }, "text": { "keywords": ["wtb", "buy"] }, "items": { "has": 289 } }, "do": [ { "whisper": ["Hi {sender}, I sell {item:289} at {price} k"] }, { "raise": "wtb" } ], "perPlayer": { "max": 1, "every": 21600 } } ], "commands": { "prefix": "!", "trusted": { "names": ["Master-Name"], "myBots": true }, "builtIn": ["stop", "start", "pause", "resume", "say", "status", "disconnect"], "statusReply": "lvl {level}, {subarea} {position}, {kamas} k, {pods}" }, "status": { "set": "away", "text": "farming, back later" }, "timing": { "read": { "min": 2, "max": 6 }, "typing": 6 } } Field Values Default version 1 required name text required description text none variables name → text; a name can't hold braces, | or : none ads[].name text none ads[].channels channels as the game's protocol names them: SALES is Trade, SEEK Recruitment, GLOBAL General, COMMUNITY Community, GUILD, ALLIANCE, PARTY, TEAM, ARENA required ads[].messages templates at least one ads[].order random, inOrder random ads[].every min, max: seconds, 1 to 86400 required ads[].when tests, and all, any, not: time (from, to, days as mon...sun), bot.inFight and bot.onTrip (true, false), map.id, map.subarea, map.area (is an id, in a list), inventory.has (item, atLeast), kamas and level (above, below), flag (a name) always ads[].stop after (sends), for (seconds from the first send), until (a date such as 2026-11-01T20:00, on the computer's clock) none ads[].smiley, ads[].emote an emoticon's or an emote's id, not both none replies.rules[].when an ad's tests, and sender.name (is a name, in a list) and text (contains, keywords, regex) always replies.rules[].reply templates, which read {sender} at least one replies.perPlayer max answers, every seconds (1 to 86400) 1 every 3600 triggers[].name text required triggers[].when a reply's tests, and channel (is a channel, in a list), sender.myBot and text.mentionsMe (true, false), items (has an item's id) always triggers[].do actions, each an object of one key: whisper (templates, which read {sender}), say (channel, text), raise (the event's name), script, ignore and invite (true), smiley and emote (an id), pauseChat (seconds, 1 to 86400) at least one triggers[].perPlayer max times, every seconds (1 to 86400) 1 every 3600 commands.prefix up to 3 characters, no space ! commands.trusted names (characters on the bot's server), myBots (true, false) no names, myBots true commands.builtIn stop, start, pause, resume, say, status, disconnect all of them commands.statusReply a template {name}, level {level}, {subarea} {position}, {kamas} kamas, {pods} pods status set: available, away, private, solo; text, with away only, up to 256 characters not changed timing.read min, max: seconds, 0 to 120 2 to 6 timing.typing characters a second, 1 to 50 6 A field this version doesn't read is kept as it is and ignored, so a profile written for a later version still loads. Errors and warnings An error keeps the profile from being used, and its message names the field: a wrong type, a channel the game doesn't know, an empty message, unbalanced braces in a template, a wait out of range, a test it doesn't know, a test about the message in an ad's condition or about a channel's line in a reply's, a regex that doesn't compile, a command, an action or a status that isn't one. A profile with an error is listed with Can't be used, and bots skip it. A warning is only worth knowing: ads[0].messages[1]: {buyer} is set by no variable here: a script or another profile must set it ads[0].messages[0]: {sender} never has a value in an ad: the message isn't sent status.set: private keeps strangers' whispers out: the replies get none item 289: not in the game data, for an id the newest game version you installed doesn't have. name: "Wheat", but its file is "wheat.json": bots use it as "wheat", for a file you renamed by hand. Profile files Your profiles are files in the chatprofiles folder of Asterobot's data folder, one <name>.json each, in exactly the format above (Files and folders). A bot reads its profiles again when it connects and when its chat settings change, so a file you edit by hand plays from then on. A package ships its profiles as chatprofiles/<name>.json at its root. They're listed as @publisher:package/<name>, and every bot uses the newest version of the package you installed.
  25. Smooth a posté un record dans Chat
    Let a bot talk in the chat on its own: post ads, answer the private messages it gets, act on what other players say in the channels, obey commands from your other accounts and keep a status. Turn the chat module on, pick its chat profiles, try them with a dry run, set how many lines a minute it sends, stop sending when you need to, and read what each ad waits for and what was said. The chat module lets a bot talk in the game's chat on its own. It posts ads: messages the bot says in the channels you pick, at random intervals, while their conditions hold. It answers the private messages the bot gets, after the time a person would take to read and type. It acts on what other players say in the channels, such as whispering a player who looks for what the bot sells. It obeys the commands your other accounts whisper to the bot, such as !status or !stop. And it can keep the character's status, such as Away with a message. What it says comes from the bot's chat profiles. Every line the bot says goes through the module's guard, which keeps to the server's own limits, so the bot never says more than the game allows. The module listens too. With the default alarms, a member of staff speaking to the bot, warning it, muting it or standing on its map pauses its chat for half an hour, and a whisper or the character's name said in a channel shows a notification in Asteroboard. The Chat tab Open a bot's page, then its Chat tab. Setting What it does Chat module Runs the module: the bot posts its ads, answers and obeys while its character is in the game. Off, it does none of it. The guard keeps handling what you type in the Console and what scripts say either way. Ads The ads part of the module. Off, the module runs but posts no ad. Replies The answers to private messages. Off, the bot answers nothing. See Replies. Triggers What the bot does on the channels' lines. Off, it does nothing on them. See Triggers. Commands The commands your accounts whisper. Off, a command is just a message, which the replies answer. See Commands. Status The status the profiles give the character. Off, the bot leaves the status alone. See Status. Dry run Writes each line in the bot's console instead of sending it, such as Dry run: would say in Trade: Selling wheat, whisper me!. What you type in the Console is always sent. Profiles The bot's chat profiles, in order. See Profiles. Lines a minute The most lines the bot sends in a minute, whispers included, from 1 to 30. Empty is 6. Type a number, then click Apply. Each switch and each change of the profiles is saved at once, in the bot's settings, and the bot follows it right away. Profiles Add a profile adds one of your chat profiles, or one of your packages', at the end of the list. The arrows move a profile up or down, and the cross removes it from the bot (the profile itself stays). Chat profiles opens the Chat Profiles page. Every ad of every profile runs. When several profiles set the same variable, the first profile's value wins, which is what the order is for: a profile with this week's prices above a profile with the ads that read them. A profile that can't be read shows Can't be read: hover over it to see why. Its ads don't run until you fix it. A profile you delete leaves every bot's list, and one you rename keeps its place under its new name. What a script changes A script can switch the module, its parts and the dry run, and set the profiles, while it runs (see asterobot:chat). The tab then says what it sets, such as "The running script sets: module on, Replies off, profiles Sell wheat." Your saved settings come back when the script stops. A script can also answer private messages itself, before the profiles' replies. On a relayed session, only the Chat module switch you saved counts: a script can't turn the module on or off there. Sending Every line the bot says goes through the guard, one at a time: One line in flight. The guard sends a line, then waits for the server to say it back, or to refuse it, before the next one. After 5 seconds without an answer, the line counts as sent. Cooldowns. When the server answers that a channel is in its cooldown ("You will be able to post again in 37 seconds"), the guard waits exactly that long and sends the line once more. The console says Waiting 37 s for the cooldown in Trade, then sending the line once more. The cap. At most Lines a minute lines leave in any minute. Too much spam. When the server says "Too much spam!", nothing is sent for 5 minutes, then 10, 20, 40 and 60 minutes at most if it says it again. A mute. When a member of staff mutes the character, nothing is sent until the mute ends, and a minute more. The game saying the character may speak again ends it at once. Your lines first. What you type in the Console goes before every other line, and only a cooldown holds it back. Then come the alarms' lines, the commands' answers, the replies and the triggers' messages, and last the scripts' lines and the ads. The Sending section shows where the guard stands: Sending, Paused until a time, Stopped until you resume, Too much spam: waiting until a time, or Muted until a time. Stop sending holds back the ads, the replies, the triggers' messages, the commands' answers and the scripts' lines until you click Resume; the lines waiting are dropped. What you type in the Console and the lines your alarms say still go. An alarm that pauses the chat shows as Paused until the end of its pause. Ads The Ads section lists every ad of the bot's profiles, with its name (or Ad 1, Ad 2...), its profile, and where it stands: State What it means Sends as soon as it can Its wait is over: it goes at the next look, within a second. Next at a time It waits between two sends. Waiting for: a test One test of its condition doesn't hold, such as Waiting for: Subarea. It goes as soon as the condition holds, if its wait is over. Waiting: the character isn't in the game yet The bot is connected but its character hasn't entered the game, such as while it picks one. Waiting: sending is stopped, Waiting: too much spam, Waiting: the character is muted The guard holds every ad back. A reason, such as {price} has no value Its message can't be filled: a variable without a value, an item the character doesn't have. Ended: all its sends are done, Ended: its time is up, Ended: its date has passed Its stop ended it for good. Beside it, how many times it went (Sent 3 times) and when it last did. When an ad's turn comes, it fills one of its messages and sends it to each of its channels at once: a channel still in its cooldown waits while the others go. It then waits a random time between its two waits before the next send, and plays its emoticon or emote, if it has one, unless in a dry run. The counts are kept in memory: they start over when Asterobot restarts or the bot's profiles change. When the character runs out of an item an ad links, after the ad has said it at least once, the activity shows Sold out, and the alarms hear it as a soldOut event. The ad goes on once the item is back. Replies When another player sends the bot a private message, the bot answers with the first reply rule of its profiles whose test holds, such as "the message has the word price". It first waits as a person would: a random time to read the message, then the time to type the answer, both set by the profile's timing. A player gets at most one answer from the rules an hour by default, so the bot answers the first message of a conversation and stays quiet after; a profile can change that. A script can answer first, as often as it likes (see asterobot:chat). The bot never answers: your own bots, so two of your bots never talk to each other; a member of staff; a command, which the commands handle instead. Triggers When another player says something in a channel, every trigger of the bot's profiles whose test holds fires, such as "a line in Trade with the word wtb". It does its actions in order: whisper the player, say something in a channel, raise an event for the alarms, tell the script, ignore the player, play a smiley or an emote, invite the player to the party, pause the chat. A whisper or a message waits as a reply does, the time to read the line and type it. One player fires a trigger at most once an hour by default; a profile can change that. Your own bots' lines fire triggers too, unless a trigger tests One of your bots. A member of staff's lines and the character's own never do. The console says each trigger fired, such as Trigger wtb: Buyer in Trade: wtb wheat, and so does the Activity section. Commands When one of the bot's profiles takes commands, a private message that starts with !, from one of your other accounts or from a character the profile trusts, is a command. A stranger's !stop is just a message, which the replies answer: nothing tells them the bot takes commands. Command What the bot does !stop Stops its script and its trip. !start Starts its script, the one it plays when you click Play. !pause or !pause 30 Stops sending, until !resume or for 30 minutes, like Stop sending. !resume Sends again. !say hello Says hello in General, as typed. A channel's shortcut picks another channel: !say /b selling wheat goes to Trade. !status Answers with its status, such as Hero, level 50, Astrub City [4,-19], 12000 kamas, 350/2000 pods. !disconnect or !disconnect 30 Leaves the game, and comes back after 30 minutes when you give them. Not on a relayed session. !status is the only command that answers. The console and the Activity section say what each command did, such as Command !stop from Master: the script is stopped. !stop, !start and !disconnect put the bot's schedule on hold, as the same buttons do. Once !stop has stopped the script, your saved settings are back: the bot hears !start only if the Chat module switch you saved is on and one of the profiles you saved takes commands. When it's the script that switches the module on or picks the profiles, !start goes unheard. A profile chooses its prefix, the characters it trusts besides your own accounts, the commands that work and what !status answers (Commands). A trusted name counts only on the bot's own server. A command the profile doesn't know goes to the bot's script, if it answers commands, and is ignored otherwise. Status When one of the bot's profiles has a status, the character takes it once in the game, as the game's status menu would set it: Available, Away with its message, Private or Solo. The console says Status set to away by the chat profiles, and the bot's header shows it. A status you change elsewhere wins: the header's status menu, your game client on a relayed session, a script. The bot leaves it until the profiles give another status, the Status part is switched off and on, or the next login. When the profiles give no status any more, or the part goes off, the character takes back the status it had before, unless somebody changed it meanwhile. Away, Private and Solo refuse party invitations by themselves, as in the game, and Private keeps strangers' private messages out, which the replies then never get. Activity The Activity section keeps the last 200 lines, commands, triggers, ad ends and back-offs, the latest first, until Asterobot restarts. Each shows its time and what happened: Sent, Dry run, Not sent, Ad ended, Sold out, Backing off after "Too much spam!" or a mute, Command or Trigger. A line also shows who said it (You, Alarm, Command, Reply, Trigger, Script or Ad), where (in a channel, or to a character), the line, and why it wasn't sent. A command shows who sent it and what the bot did; a trigger, who said the line and where, the line, and the trigger's name. The chat itself stays in the Console: the bot's lines appear there as the server says them back, and the dry run's as console lines.

Compte

Navigation

Recherche

Recherche

Configurer les notifications push du navigateur

Chrome (Android)
  1. Appuyez sur l'icône de cadenas à côté de la barre d'adresse.
  2. Tap Autorisations → Notifications.
  3. Ajustez vos préférences.
Chrome (Desktop)
  1. Cliquez sur l'icône représentant un cadenas dans la barre d'adresse..
  2. Select Paramètres du site.
  3. Find Notifications et ajustez vos préférences.