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.

Error messages

(0 notes)

The error texts you can meet while writing and running scripts are grouped here by where they appear. Search for a part of the text you see. In the texts, a word in angle brackets such as <module> stands for something that changes: <module> is the path of a file inside Asterobot, such as library/my-first-script/1.0.0/index.js, <type> a message's name, <field> a field's name.

Where you see it What it looks like Section
At the top of the bot's page The behavior stopped with an error, with the full text, Copy and Dismiss The script stopped
A toast after Play, Run, a load or a version switch Couldn't start the behavior, Couldn't run the package, Couldn't load the selection or Couldn't switch version, without a reason When a package doesn't load
Package settings, on the bot's Settings tab, and the Add a bot dialog Couldn't read this package's settings, with the reason When a package doesn't load, and Declarations
Inside the script A rejected promise, or an error thrown by a call, that your code can catch Errors a script can catch
The bot's Console tab A warning or error line, while the script keeps running Console lines
Toasts on Package settings Couldn't apply the settings, Couldn't start the action, or an action's name followed by failed Saving settings and running actions
Under the package's manifest, after saving it The reason, or Couldn't save the manifest Saving the manifest

The script stopped

The behavior stopped with an error appears at the top of the bot's page when a script that had loaded stops because of an error, while starting or later. In Bot Manager, the bot's Behavior column says Failed. The game connection stays open. Fix the cause, then start the script again with Play, or with Run in the editor.

The beginning of the text says where the script was:

The text starts with The error happened
evaluate behavior module "<module>": In the top-level code of the modules, as the script started
read declarations of "<module>": While Asterobot read the parameters and actions exports. See Declarations.
initialize behavior module "<module>": In the entry function, before it finished
Game traffic handler failed: In a handler registered with on() or onTraffic()
evaluate protocol handler selector: In a selector function passed to on()
evaluate protocol wait selector: In a selector function passed to wait()
parameters.onChange handler <number>: In a handler registered with onChange()
unhandled Promise rejection: Anywhere: a promise rejected and nothing caught it
drain JavaScript Promise jobs: In code that resumed after an await

What follows is the error itself:

  • Promise rejected: and the reason, when a promise the start was waiting for rejected.
  • An error thrown by your code: its type and message, such as TypeError: and the message. For an error thrown synchronously, at follows, with the function's name and, in parentheses, the file, the line and the column.
  • A message from one of Asterobot's functions, as listed in Errors a script can catch.

For example, a script that sends token instead of ticketKey while starting gets:

initialize behavior module "library/my-first-script/1.0.0/index.js": Promise rejected: IdentificationRequest.token: unknown protobuf field

These texts can appear after one of the beginnings above, or on their own:

Text Cause Fix
behavior module "<module>" has no unambiguous default export index.js has no default export Add export default async function behavior(launch)
behavior module "<module>" default export is not callable The default export isn't a function Export a function
behavior module "<module>" default export must be async and return a Promise The default export returned something other than a promise Make it an async function
dynamic import() is not supported by this Asterobot runtime The script called import() as a function Use an import statement at the top of the file
JavaScript execution deadline exceeded Code ran for more than 250 ms without an await Split the work into parts separated by an await, such as await sleep(0). See Limits.
behavior event-loop queue overflow More than 64 events piled up while the script was busy Keep handlers short, and move slow work out of them
unhandled Promise rejection: <reason> A promise rejected with nothing to catch it: an await outside try/catch in an async handler or interceptor, or a promise started without await Wrap the await in try/catch, or add .catch()
Game session closed: <reason> The game connection closed while the script was running Connect the bot again, then play the script
behavior requested Game disconnect The script called disconnect() Nothing, if that was intended

A script stopped with Stop shows no alert.

When a package doesn't load

When a script can't even be loaded, it never runs, and nothing reaches the Problems alert. The toast is all you get, without the reason: Couldn't start the behavior after Play, Couldn't run the package after Run, Couldn't load the selection after a load from the bot's menu, Couldn't switch version after changing the version.

To see the reason, open the bot's Settings tab. Asterobot loads a package the same way to read its settings, so for the bot's package, Package settings shows Couldn't read this package's settings with the text. The package's settings in the Add a bot dialog show it too. For a syntax error, the editor's error badge usually points at the line as well.

When the reason comes from the package's code, the text there starts with <package>@<version>: read declarations:.

Syntax and imports

Text Cause Fix
parse module "<module>": <details> That file has a syntax error Fix the syntax. Check the editor's error badge.
resolve "<specifier>" imported by "<module>": package "<package>" has no locked dependency for "<specifier>" An import names a package that isn't among the package's dependencies, or is misspelled Fix the name, or add the dependency. See Dependencies.
resolve "<specifier>" imported by "<module>": module "<module>" imported by "<module>" is not installed A relative import names a file the package doesn't have Fix the path. Relative imports need the whole file name, extension included, such as ./helper.js.
resolve "<specifier>" imported by "<module>": relative import "<specifier>" escapes package root "<root>" A ../ goes above the package's own folder Import only files of the package, or of a dependency by its name
resolve "<specifier>" imported by "<module>": built-in module "<specifier>" is not registered The asterobot: module doesn't exist, which is the case for every asterobot:extension/ module today Import one of the nine built-in modules. See Extension modules.
resolve "<specifier>" imported by "<module>": package "<package>": no installed version of "<name>" satisfies "<version>" An import such as "name@^2.0.0" asks for a version the script's packages don't include Lock a matching version in the dependencies
resolve "<specifier>" imported by "<module>": package "<package>": specifier "<specifier>" has an invalid version "<version>": <details> The part after @ in the import isn't latest, a version or a version range Fix the version
resolve "<specifier>" imported by "<module>": absolute module specifier "<specifier>" is forbidden An import starts with / Use a relative path or a package name
resolve "<specifier>" imported by "<module>": module specifier "<specifier>" contains a backslash An import path uses \ Use /
reachable module count exceeds limit 256 The script loads more than 256 modules See Limits
reachable module source exceeds limit of 4194304 bytes The script's modules weigh more than 4 MiB together See Limits
module graph depth <depth> exceeds limit 64 at "<module>" Imports chain more than 64 modules deep See Limits

Packages and dependencies

These texts start with resolve package <name>@<version>:, naming the package being loaded. A problem in one of its dependencies adds dependency "<name>" locked to version "<version>": before the reason, once per level.

Text Cause Fix
read package <name>@<version> sources: <details> Asterobot couldn't read that package's files, for example because that version isn't installed Install the package or the dependency at that version
package <name>@<version> is not installed: parse asterobot.json: <details> The package's asterobot.json isn't valid JSON Fix the file. See The manifest.
package "<name>@<version>": package "<name>" requires asterobot <range>, running <version> The package's compatibleVersion doesn't include the Asterobot version you run Update Asterobot, or change compatibleVersion. See Compatibility.
package "<name>@<version>": package "<name>" has an invalid compatibleVersion constraint "<range>": <details> compatibleVersion isn't a valid version range Fix it, such as >=1.5.0 <2.0.0
package "<name>@<version>": package source integrity mismatch The files of a package installed from the marketplace no longer match the checksum recorded at install Install that version again
package "<name>@<version>": empty package permission permissions in asterobot.json has an empty entry Remove it
package "<name>@<version>": duplicate package permission "<permission>" permissions lists the same permission twice Remove the duplicate
package "<name>@<version>": entry module "index.js" is missing The package has no index.js at its root Add it. See Package layout.
package "<name>@<version>": package contains no modules The package has no .js or .mjs file Add index.js
package "<name>@<version>" dependency "<specifier>" targets package named "<name>" version "<version>" A dependency whose name ends with @ and a version is locked to another version Make the version in the name and the locked version the same
package <name>@<version> has an invalid name: <details> The package's name breaks the naming rules See Names and versions

Messages about downloading or installing packages from the marketplace are covered in Package errors.

Errors a script can catch

The functions of the built-in modules report problems in two ways. Most return a promise that rejects, which await turns into an error a try/catch can catch. A few throw at once, as noted below.

String(error) gives the texts of this section as they are written here, with two exceptions: an error of type TypeError gives TypeError: followed by the text, and the errors thrown by record(), findPath() and packages.info(), and the errors move() rejects with, give GoError: followed by the text.

An error your code doesn't catch stops the script, with one of the texts in The script stopped.

Messages and timers

Text Returned by Cause Fix
protocol type must be a non-empty semantic message name send(), request() The message name is missing, empty or not a string Pass the name as a string
semantic protobuf message is not mapped: <type> send(), request() Asterobot has no message with that name Check the name in the Dofus protocol reference
protocol options must be an object send(), request(), wait() The options aren't an object, such as a bare number Pass { timeout: 5000 }
unknown protocol option "<name>" send(), request(), wait() The options have a key other than timeout and to Fix the key
timeout/milliseconds must be a finite positive Number send(), request(), wait(), sleep() A timeout that isn't a number above 0, or a sleep() duration that's negative or not a number Pass a number of milliseconds
timeout/milliseconds is too large send(), request(), wait(), sleep() A duration too big to be one Pass a smaller number
send option "to" must be "server" or "client" send() to isn't a string Use "server" or "client"
unknown send target "<value>": expected "server" or "client" send() to is another string Use "server" or "client"
protocol selector cannot be empty wait(); thrown by on(), intercept() The selector is "" Pass a name, "*" or a function
protocol selector must be a semantic type, '*', or predicate wait(); thrown by on(), intercept() The selector is neither a string nor a function Pass a name, "*" or a function
protocol.on handler must be callable, protocol.onTraffic handler must be callable, protocol.intercept handler must be callable Thrown as a TypeError The handler isn't a function Pass a function
maximum behavior handlers reached Thrown as a TypeError by on(), onTraffic(), intercept(), onChange() 256 handlers of that kind are registered Remove handlers you no longer need with off() or offChange()
protocol wait timed out wait() Nothing matched before the timeout Check the selector, or wait longer
context deadline exceeded request() No response came back before the timeout. Most Dofus requests never get one. Use send() and then wait() for the event the game sends
mitm relay refuses to identify: this Game session was already authenticated by the real DOFUS client request() The script sent IdentificationRequest on a MITM bot Identify only when launch.reason === "initial"
behavior resource limit exceeded: maximum pending operations reached send(), request(), table(), find(), search(), query(), move() 32 operations are pending Await operations before starting more
behavior resource limit exceeded: maximum waits reached wait() 128 waits are open Give every wait() a timeout
behavior resource limit exceeded: maximum timers reached sleep() 128 sleeps are pending Await sleeps instead of starting many at once

On a MITM bot, send() of an IdentificationRequest to the server doesn't reject: see Console lines.

Payload errors

send() and request() reject with these texts when a payload doesn't fit its message. An interceptor's { payload } gives the same texts on the bot's console, after build replacement payload for <type>:.

Each text starts with the path of the field: the message's name, then the field names separated by dots, with [<index>] for an item of a list and ["<key>"] for a value of a map.

Text Cause Fix
<type>: expected an object The payload is missing, null or undefined Pass {} for a message without fields
<path>: expected an object, got <type> The payload, or a nested message, isn't an object Pass an object
<path>.<field>: unknown protobuf field The message has no such field Check the field names in the Dofus protocol reference
IdentificationRequest.token: unknown protobuf field The script copies an old example that sends token and lang Send ticketKey and languageCode, as in Identify and run
<path>: fields "<name>" and "<name>" address the same protobuf field The same field is given under both spellings, such as ticketKey and ticket_key Keep one
<path>: oneof <group> selects both "<field>" and "<field>" Two alternatives of the same group are set Set only one
<path>.<field>: explicit undefined is not a protobuf value A field is set to undefined Leave the field out
<path>.<field>: null is only valid for a message field A field that isn't a nested message is set to null Leave the field out
<path>: expected an array A list field got something other than an array Pass an array
<path>: invalid array length The value passed for a list has an unusable length Pass a real array
<path>: expected a plain object map A map field got something other than an object Pass an object
<path>: invalid boolean map key "<key>", and the same with int32, uint32, int64 or uint64 A map key can't be read as the map's key type Use keys such as "true" or "12"
<path>: expected boolean A boolean field got another type Pass true or false
<path>: expected string A string field got another type Pass a string
<path>: expected Uint8Array or ArrayBuffer A bytes field got another type Pass a Uint8Array
<path>: expected integral Number A 32-bit integer field got a fraction or something that isn't a number Pass a whole number
<path>: Number is outside int32 range The number doesn't fit a signed 32-bit integer Pass a smaller number
<path>: expected integral Number in uint32 range An unsigned 32-bit field got a fraction, a negative number or something too big Pass a whole number from 0 to 4294967295
<path>: expected signed 64-bit BigInt or decimal string A 64-bit integer field got a number too big to be exact, a fraction, a string that isn't digits, or another type Pass a BigInt, such as 123456789012n
<path>: expected unsigned 64-bit BigInt or decimal string The same, for an unsigned field, or a negative value Pass a positive BigInt
<path>: expected Number A floating point field got something that isn't a number Pass a number
<path>: unknown enum symbol "<name>" The enum has no value with that name Check the value names in the Dofus protocol reference
<path>: expected enum symbol or number An enum field got neither a name nor a whole number Pass the value's name as a string

Game data

Text Returned by Cause Fix
gamedata.text key must be a string or integer Thrown as a TypeError by text() The key is a fraction, a number outside the 32-bit range, a BigInt, undefined or an object Check the value before passing it
gamedata.record table must be a non-empty string Thrown as a TypeError by record() The table name is missing or empty Pass the table's name
gamedata.record id must be an integer Thrown as a TypeError by record() The id isn't a whole number, is too big, or is a BigInt or a string Pass a regular whole number
datacenter: no such table: "<table>" Thrown by record(); table(), find(), search() This game version has no table with that name Check the table's name in the Game page's game data
gamedata.table name must be a non-empty string table() The name is missing or empty Pass the table's name
gamedata.find table must be a non-empty string find() The name is missing or empty Pass the table's name
gamedata.find filter must be a non-empty object find() The filter is missing, empty, an array or not an object Pass { column: value }
datacenter: no such column: table "<table>" has no column "<column>" find() A filter column doesn't exist in that table Fix the column's name
gamedata.search query must be a non-empty string search() The query is missing or empty Pass a name
gamedata.search options.table must be a string search() options.table isn't a string Pass the table's name as a string
datacenter: no text for this language: "<language>" search() The game data has no names in the script's language Extract the game data again, or check session.language
gamedata.query sql must be a non-empty string query() The SQL is missing or empty Pass the SQL as a string
gamedata.query params must be an array query() params isn't an array Pass an array, such as [31]
datacenter: empty query query() The SQL holds only spaces Pass a statement
datacenter: query is <size> bytes, over the 65536 byte limit query() The SQL text is too long Shorten the query
datacenter: followed by the database's message query() The SQL is wrong, names a table or column that doesn't exist, or writes, in which case the message mentions attempt to write a readonly database Fix the query. Try it in the SQL tab.

Pathfinding

Text Returned by Cause Fix
pathfinding.findPath mapId must be an integer Number, BigInt or decimal string Thrown as a TypeError by findPath() The map id is a fraction, a number above Number.MAX_SAFE_INTEGER, a string that isn't digits, or another type Pass currentMap().mapId, or the id as a BigInt
pathfinding.findPath from must be an integer cell id, and the same with to Thrown as a TypeError by findPath() The cell isn't a whole number, or is a BigInt or a string Pass a cell id from 0 to 559
pathfinding.findPath options must be an object Thrown as a TypeError by findPath() The options are neither an object, null nor undefined Pass an object, or nothing
pathfinding.findPath options has no property "<name>" Thrown as a TypeError by findPath() The options have a key other than occupied, cautious and disableDiagonals Fix the key
pathfinding.findPath options.occupied must be an array of cell ids Thrown as a TypeError by findPath() occupied isn't an array Pass an array of cell ids
pathfinding.findPath options.occupied[<index>] must be an integer cell id Thrown as a TypeError by findPath() That item isn't a whole number Pass cell ids only
pathfinding.findPath options.cautious must be a boolean, and the same with disableDiagonals Thrown as a TypeError by findPath() The option isn't a boolean Pass true or false
pathfinding.findPath: map <mapId>, cell <from> to cell <to>: pathfinding: not a map cell, cell ids go from 0 to 559: <cell> Thrown as a TypeError by findPath() from or to is outside 0 to 559. For a cell of occupied, the text ends with occupied cell <cell>. Pass cell ids from 0 to 559
failed to load map <mapId> for pathfinding: datacenter: no such record: maps/<mapId> Thrown by findPath() The bot's game version has no map with that id Check the map id
failed to open the datacenter: followed by the reason Thrown by findPath() Asterobot can't read the game data of the bot's game version Extract the game data
pathfinding.cellToPoint cell must be an integer cell id, pathfinding.distance a must be an integer cell id and the same with b, pathfinding.direction from must be an integer cell id and the same with to Thrown as a TypeError by cellToPoint(), distance(), direction() The cell isn't a whole number, or is a BigInt or a string Pass a cell id from 0 to 559
pathfinding: not a map cell, cell ids go from 0 to 559, after pathfinding.cellToPoint cell:, pathfinding.distance cells: or pathfinding.direction cells: Thrown as a TypeError by cellToPoint(), distance(), direction() A cell is outside 0 to 559 Pass cell ids from 0 to 559
pathfinding.pointToCell x and y must be integers Thrown as a TypeError by pointToCell() x or y isn't a whole number Pass whole numbers

Movement

Text Returned by Cause Fix
movement.move cell must be an integer cell id move(), as a TypeError The cell isn't a whole number, or is a BigInt or a string Pass a cell id from 0 to 559
movement.move cell: pathfinding: not a map cell, cell ids go from 0 to 559 move(), as a TypeError The cell is outside 0 to 559 Pass a cell id from 0 to 559
movement.move options must be an object move(), as a TypeError The options are neither an object, null nor undefined Pass an object, or nothing
movement.move options has no property "<name>" move(), as a TypeError The options have a key other than cautious and timeout Fix the key
movement.move options.cautious must be a boolean move(), as a TypeError cautious isn't a boolean Pass true or false
movement.move options.timeout: timeout/milliseconds must be a finite positive Number move(), as a TypeError timeout isn't a number above 0 Pass a number of milliseconds
move: the bot isn't connected to a game server move() The bot has no game connection Connect the bot first
move: the character is already walking; await the move in progress first move() Another walk of the bot is under way, from a script or from Asteroboard Await each move() before starting the next
move: the character is still walking move() The character hasn't finished a walk it didn't ask for, such as one the player started on a MITM bot Wait for that walk to end
move: the character's map and cell aren't known yet move() Asterobot hasn't seen the character's map yet, or where the map places the character Wait until the character is on a loaded map
move: the game has no path from cell <cell> to cell <cell> move() The Dofus client itself would find no route Pick another cell
move: the server didn't grant the walk in time move() No MapMovementEvent granted the walk within the timeout, which is also how a refused walk ends Check the cell, or give the server longer with timeout
move: another walk of the character started before this one ended move() Another walk of the character started first, or the walk was cancelled Nothing to fix in the call
move: the server didn't acknowledge the end of the walk in time move() No MapMovementConfirmResponse came within the walk's time plus the timeout Give the server longer with timeout
move: the game session closed during the walk move() The game connection closed before the walk ended Connect the bot again

asterobot:movement describes each case.

Packages and settings

Text Returned by Cause Fix
packages.info requires a module or package name Thrown as a TypeError by packages.info() The name is missing, empty or not a string Pass a package name
package "<name>" is not installed Thrown by packages.info() No package of the running script has that name, asterobot:parameters included Check the name. See asterobot:runtime.
package "<name>" is ambiguous across <count> locked versions Thrown by packages.info() The dependencies lock several versions of that package Nothing to fix in the call: the name can't pick one
parameters.onChange handler must be callable Thrown as a TypeError by onChange() The handler isn't a function Pass a function
'Set' on a dynamic object returned false Thrown as a TypeError by assigning to a property of values values is read-only Don't assign to values
Could not delete property "<name>" of a dynamic object Thrown as a TypeError by deleting a property of values values is read-only Don't delete from values

While the script stops

A call made while the script is stopping rejects, or throws, with the reason the script is stopping, and the promises still pending when it stops reject with that reason too. After Stop, the reason is behavior runtime closed. There's nothing to fix: the script is ending.

Console lines

These lines appear on the bot's Console tab. The script keeps running.

Line Level Cause Fix
Refused to forward a message that would re-authenticate a relayed session Warning On a MITM bot, the script sent IdentificationRequest to the server. Asterobot didn't forward it, and send() resolved anyway. Identify only when launch.reason === "initial", as in Identify and run
interceptor failed: <error> Error An interceptor threw, or ran for more than 250 ms Fix the handler, and keep it quick
interceptor selector failed: <error> Error An interceptor's selector function threw Fix the selector
build replacement payload for <type>: <error> Error An interceptor returned a { payload } that doesn't fit the message. <error> is one of the payload errors. Fix the payload
re-encode <type>: <error> Error Asterobot couldn't rebuild the message with the new fields Return { payload } with the same message's fields
cannot replace the payload of <wire name>: this build has no name for it, so there is nothing to build a replacement from - use { raw } instead Error An interceptor returned { payload } for a message without a readable name Return { raw }, or leave that message alone

A line is written for each message on which an interceptor fails. When several interceptors fail on the same message, only the first failure is written, and the tenth if there are that many, ending with (10 times). An async interceptor whose promise rejects doesn't write a line here: it stops the script with unhandled Promise rejection: <error>.

Saving settings and running actions

These appear as toasts on Package settings, on the bot's Settings tab.

Toast Text under it Cause Fix
Couldn't apply the settings <name>: <reason> A value doesn't fit its declaration. The reasons are listed in Declarations. Nothing from the form is saved. Correct the value, then Apply again
Couldn't apply the settings package "<package>" declares no parameter "<name>" The form holds a setting the package doesn't declare any more Click Refresh, then apply again
Couldn't apply the settings package "<package>" is not part of this bot's behavior The bot's package changed since the form was loaded Click Refresh
Couldn't start the action <argument>: <reason> An argument doesn't fit its declaration Correct the value in the dialog
Couldn't start the action the running behavior declares no action "<action>" on package "<package>" The running script doesn't declare that action, for example because you added it in the editor without starting the script again Start the script again
Couldn't start the action no behavior is running on this bot The script isn't running Play the script first
Couldn't start the action behavior event-loop queue overflow The script has 32 operations pending Try again in a moment
The action's name followed by failed The error the action's run threw, or its promise's rejection reason The action failed. The script keeps running. Fix run

When the declarations themselves can't be read, Package settings shows Couldn't read this package's settings instead of the form: Declarations lists those texts.

Saving the manifest

When you save a package's asterobot.json from Asteroboard and Asterobot refuses it, the reason shows under the manifest, or Couldn't save the manifest when there's none. Dependencies explains how to declare them.

The first four texts below come after invalid package manifest:. The last three are checked first, for dependencies that have no URL, and come on their own.

Text Cause Fix
empty dependency specifier A dependency has no name Name the dependency
dependency "<specifier>": version embedded in its own specifier: not a valid exact version: <details> The version written after @ in the dependency's name isn't one exact version Write an exact version, such as name@1.2.0
dependency "<specifier>": version "<version>" conflicts with the version already in its own specifier The dependency's name holds one version and its version field another Make them the same, or remove one
dependency "<specifier>": invalid version "<version>": <details> The version isn't latest, a version or a version range Fix the version
dependency "<specifier>" locks version "<version>" in its specifier but declares "<version>" The version in the name and the declared version differ Make them the same
dependency "<specifier>" needs an exact version A dependency without a URL has no exact version Give an exact version
dependency "<specifier>" needs <name>@<version> installed, or a URL to fetch it from A dependency without a URL isn't installed at that version Install it, or give its asterobot.net URL

Commentaires des utilisateurs

Aucun avis à afficher.

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.