diff --git a/.gitignore b/.gitignore index cc7e5247..da8cdf29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,11 @@ # Dependencies /node_modules +/.yarn/cache +/.yarn/install-state.gz + +# IDE / tooling +/.idea +/.claude # Production /build diff --git a/docs/custom-bot/commands.md b/docs/custom-bot/commands.md new file mode 100644 index 00000000..fe4ad1a7 --- /dev/null +++ b/docs/custom-bot/commands.md @@ -0,0 +1,124 @@ +# Commands + +Turn your enabled modules' built-in commands on or off, and rename the context-menu (right-click) commands your members see - all from the SCNX Dashboard. + +## Overview {#overview} + +The **Commands** page lists every command provided by the modules you currently have enabled and lets you decide which of them are registered with Discord. Commands are grouped into three tabs by type: + +- **Slash** - the `/command` entries members type into the chat box. +- **User** - context-menu commands shown when you right-click a member (Apps submenu). +- **Message** - context-menu commands shown when you right-click a message (Apps submenu). + +For each command you can enable or disable it. For **User** and **Message** commands you can additionally set a custom label - the text Discord shows in the Apps menu. A live preview reproduces Discord's Apps flyout so you can see how the user and message menus will look before you save. + +Only commands from **enabled** modules appear here. Enable a module first if the command you are looking for is missing. + +:::info +This page manages the commands that ship with the bot's modules. It is different from the two neighboring pages: + +- [Permissions & Slash Commands](/docs/custom-bot/slash-commands) - Discord's own per-command permission controls (which roles, users and channels may run a command). Configured in your Discord server settings, not here. +- [Custom Commands](/docs/custom-bot/custom-commands) - building your own commands from scratch with the visual flow editor. + +Use the Commands page to switch built-in module commands on or off and to rename context-menu items; use the other two pages for permissions and for authoring your own commands. +::: + +## Slash, User and Message commands {#types} + +Discord supports three command types, and the page keeps them on separate tabs because each has its own rules and budget. + +| Type | Where members find it | Can be renamed here | Enabled by default | +| ----------- | -------------------------------------- | ------------------- | ------------------ | +| **Slash** | Typed as `/command` in the message box | No | Yes | +| **User** | Right-click a member → **Apps** | Yes (custom label) | No | +| **Message** | Right-click a message → **Apps** | Yes (custom label) | No | + +Each tab shows a budget counter (used / limit) so you can see at a glance how much of Discord's per-type allowance you have spent. + +## Enabling and disabling {#enable-disable} + +Use the toggle on each command row to enable or disable it. + +Defaults differ by type: + +- **Slash commands are enabled by default.** A slash command you have never touched is registered with Discord. Disable it here to remove it. +- **User and Message commands are disabled by default.** Context-menu commands are opt-in - they only appear in Discord once you enable them here. + +Every command belongs to a module and is grouped under that module's section. Disabling a whole module (on the module's own page) removes all of its commands from this page. + +## Renaming context-menu commands {#renaming} + +User and Message commands can be given a **custom label** - the text members see in Discord's Apps menu. Slash commands cannot be renamed here (their names follow Discord's own rules and are managed with the module). + +- Type your preferred label into the command's rename field. Leave it blank to fall back to the command's default name. +- Labels are limited to **32 characters** (a Discord limit). The page flags any label that is too long and blocks saving until you shorten it. +- The live Apps preview updates as you type, so you can confirm the wording before saving. + +## Limits {#limits} + +Discord enforces a fixed budget per command type. The page enforces the same limits and will not let you save a selection that exceeds them: + +| Type | Maximum enabled commands | +| ------- | ------------------------ | +| Slash | 100 | +| User | 15 | +| Message | 15 | + +Additional rules: + +- **Context-menu label length:** custom User/Message labels may be at most **32 characters**. +- **Name collisions:** two enabled commands of the **same type** whose resolved labels (custom label, or the default name if no custom label is set) are identical when compared case-insensitively will collide. The page flags the collision and blocks saving until you rename or disable one of them. `Report` and `report` count as the same name. + +If any of these rules is broken, the page shows the reason and disables saving until it is resolved. + +## Saving and syncing to Discord {#saving} + +Your command selection is stored like any other module configuration and is written through the normal config save path - use the **Save** action the same way you would on any configuration page. There is no separate submit step. + +After saving, the bot updates the commands registered with Discord to match your selection. + +:::info Command synchronization +As with all command changes, updates can take time to appear in Discord - newly enabled commands may take a while to show up, and removed ones a while to disappear. This is a Discord-side propagation delay, the same behavior described in the [Permissions & Slash Commands](/docs/custom-bot/slash-commands#command-synchronization) guide. Give it some time before assuming something is wrong. +::: + +## Troubleshooting {#troubleshooting} + +
+ A command I expected isn't listed + +
+ +
+ I can't save my changes + +
+ +
+ A right-click (User / Message) command doesn't appear in Discord + +
+ +
+ My renamed command still shows the old name + +
+ +## Related pages {#related} + +- [Permissions & Slash Commands](/docs/custom-bot/slash-commands) - control who can run commands with Discord's native permission system. +- [Custom Commands](/docs/custom-bot/custom-commands) - build your own commands with the visual flow editor. diff --git a/docs/custom-bot/login-as-bot.md b/docs/custom-bot/login-as-bot.md index 307b5213..7656b935 100644 --- a/docs/custom-bot/login-as-bot.md +++ b/docs/custom-bot/login-as-bot.md @@ -52,6 +52,69 @@ members, the following channel permissions are required: Use the [preview in the message editor](/docs/scnx/guilds/message-editor#preview) to see how your message will look before sending it. ::: +## Scheduling messages {#scheduling} + +Instead of sending a message right away, you can schedule it to be posted in a channel at a future time - and +optionally have it repeat on a fixed cadence until you cancel it. Scheduled messages are handled by your bot, so +you do not need to keep the dashboard open, and pending messages survive bot restarts. + +### Scheduling a message {#schedule-message} + +1. Open the [Bot Log-In page](https://scnx.app/glink?page=bot/login). +2. Select the channel you want the message to be posted in. +3. Compose your message using the [message editor](/docs/scnx/guilds/message-editor), just like a normal message. +4. Choose a send time in the future and, optionally, a recurrence. +5. Save the scheduled message. + +The send time is interpreted in your bot's configured timezone - the same timezone used everywhere else. The time +must be in the future. + +### Recurring messages {#recurring} + +A scheduled message can repeat on a **daily**, **weekly**, or **monthly** cadence: + +- **Daily** - every day at the same time. +- **Weekly** - every 7 days, on the same weekday and time. +- **Monthly** - on the same day of the month. + +Recurring messages run until you cancel them - there is no end date or maximum count. After each send, the bot +re-arms the next occurrence, and it also re-arms on startup, so a bot restart never breaks the series. + +For monthly messages, the send day is anchored to the day of the month of the first occurrence. In shorter months +that day is clamped to the last day of the month, then re-expands afterwards - for example, a message anchored to +the 31st fires on Jan 31, Feb 28, Mar 31, Apr 30, and so on. + +### Editing, cancelling, and listing {#manage-scheduled} + +- **List** - the dashboard shows your pending scheduled messages, each with its next send time and, for recurring + messages, its cadence. +- **Edit** - you can change the content, send time, or recurrence of a pending scheduled message. Turning a + recurring message back into a one-shot, or vice versa, is supported. +- **Cancel** - cancelling a scheduled message removes it. Cancelling a recurring message stops the whole series. + +### Missed and failed occurrences {#reliability} + +- **Skip missed runs** - if your bot is offline when an occurrence is due, that occurrence is skipped rather than + sent late. The series resumes at the next future slot. +- **Self-healing failures** - if an occurrence fails to send (for example because the channel was deleted or the + bot lost access), the series keeps trying on its normal cadence but stops itself after **5 consecutive failed + occurrences**. A single successful send resets that counter. + +### Pending message limits {#scheduling-limits} + +The number of **pending** scheduled messages you can have at once is capped per plan. A recurring series counts as +a single pending message, and sent, cancelled, or stopped messages do not count toward the limit. + +| Plan | Max pending scheduled messages | +| ------------------------- | ------------------------------ | +| STARTER | 2 | +| ACTIVE_GUILD | 10 | +| UNLIMITED / PRO | 25 | +| PROFESSIONAL / ENTERPRISE | 50 | + +When you are at your plan's limit, scheduling a new message is rejected and nothing is created - cancel or wait +for a pending message to be sent to free up a slot. + ## Editing a message {#edit-message} You can edit messages that were previously sent by your bot (including messages sent via Bot Log-In). diff --git a/docs/custom-bot/modules/administration/welcomer.md b/docs/custom-bot/modules/administration/welcomer.md index 39f31a5b..06ad3df6 100644 --- a/docs/custom-bot/modules/administration/welcomer.md +++ b/docs/custom-bot/modules/administration/welcomer.md @@ -159,16 +159,16 @@ In this configuration file allows you to [set up welcome- and boost roles](#setu features of this module. Open it in your [dashboard](https://scnx.app/glink?page=bot/configuration?file=welcomer%7Cconfigs%2Fconfig). -| Field | Description | -| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Give roles on join | These roles will be given to members who joined your server. This won't get applied retroactively, use the [massrole module](/docs/custom-bot/modules/tools/massrole) to do this. | -| Ignore bots? | If enabled (this is highly recommended), welcome and leave messages won't get sent if the user joining or leaving is a bot. | -| Give additional roles on boost | These roles will be given to members who boosted your server in addition to their boost-role assigned by Discord. The roles will get removed if the member removes all their boosts. | -| Immediately give roles | If enabled, join roles are assigned immediately when a user joins. If disabled, roles are assigned after the user completes Discord's onboarding (rules acceptance). | -| Treat join roles as base roles | When enabled, the bot guarantees every regular member holds all configured join roles via reactive re-adds and a daily sweep. See [Treat join roles as base roles](#base-roles) for the full list of exclusions and race-protection details. | -| Send DM on join | If enabled, the bot sends a direct message to new users when they join the server. | -| Join DM Message | _Only visible if "Send DM on join" is enabled._
The message sent via DM to new users when they join your server. | -| Delete welcome message | If enabled, sent welcome messages will get deleted automatically if the user leaves your server within seven days after join. | +| Field | Description | +| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Give roles on join | These roles will be given to members who joined your server. This won't get applied retroactively, use the [massrole module](/docs/custom-bot/modules/tools/massrole) to do this. | +| Ignore bots? | If enabled (this is highly recommended), welcome and leave messages won't get sent if the user joining or leaving is a bot. | +| Give additional roles on boost | These roles will be given to members who boosted your server in addition to their boost-role assigned by Discord. The roles will get removed if the member removes all their boosts. | +| Immediately give roles | If enabled, join roles are assigned immediately when a user joins. If disabled, roles are assigned after the user completes Discord's onboarding (rules acceptance). | +| Treat join roles as base roles (auto-restore) | When enabled, the bot guarantees every regular member holds all configured join roles via reactive re-adds and a daily sweep. See [Treat join roles as base roles](#base-roles) for the full list of exclusions and race-protection details. | +| Send DM on join | If enabled, the bot sends a direct message to new users when they join the server. | +| Join DM Message | _Only visible if "Send DM on join" is enabled._
The message sent via DM to new users when they join your server. | +| Delete welcome message | If enabled, sent welcome messages will get deleted automatically if the user leaves your server within seven days after join. | ### Random messages {#configuration-random-messages} diff --git a/docs/custom-bot/modules/ai.md b/docs/custom-bot/modules/ai.md index 6626dc2f..0cfa8ce1 100644 --- a/docs/custom-bot/modules/ai.md +++ b/docs/custom-bot/modules/ai.md @@ -70,10 +70,17 @@ slow-mode in this channel to avoid losing all your AI Coins in seconds. ### Configuration Options -- **Personality:** Depending on this setting, the AI-Chat-Bot will behave differently. - - **default:** The default personality - designed to help users and answer requests. Recommanded and the best option - for most servers. - - **rude starbucks employee:** This personality will role-play with your users as a starbucks rude employee. +- **Personality:** Depending on this setting, the AI-Chat-Bot will behave differently. The following built-in + personalities are available: + - **Helpful Chat-Bot (default):** The default personality - designed to help users and answer requests. Recommended + and the best option for most servers. + - **Funny friend:** A more casual, light-hearted personality. + - **Rude coffee shop employee:** This personality will role-play with your users as a rude coffee shop employee. + + The former "Troll" and "Conspiracy theorist / Liar" personalities have been removed to comply with the EU AI Act's + rules on manipulative and deceptive AI systems. Any server that had one of them selected falls back to the default + personality automatically. + - **Response Length:** Controls how long the AI's responses will be. - **Trigger Mode:** Determines which messages trigger an AI response. 'All messages' replicates the default behaviour. Other modes restrict responses to specific triggers. @@ -81,24 +88,71 @@ slow-mode in this channel to avoid losing all your AI Coins in seconds. this word or phrase (e.g. 'Hey Bot'). - **Resetting History:** After configuring, please type `=== RESET ===` in the ai channel to reset conversation history. -### Custom System Prompt & Strict Moderation +### Custom System Prompt & Automated Review If set, this text replaces the Personality setting as the AI's system prompt. Maximum 1000 characters - longer text is truncated automatically. A safety clause is always appended and cannot be removed. You are fully responsible for the AI's behaviour when using a custom prompt. -:::danger Automatic Prompt Scanning & Strict Moderation -All custom system prompts undergo strict automatic scanning before being saved. **If your prompt violates our safety -guidelines or Discord's Terms of Service, your AI module will be permanently deactivated immediately.** +To keep everyone safe and to meet our legal obligations, every custom system prompt is checked automatically before it +goes live. The rest of this section explains exactly what we check, what happens if a prompt is rejected, and how to +appeal. + +#### What we review -**Appealing a Deactivation:** -To appeal a module deactivation, [open a support ticket](https://scnx.app/user/support/new?topic=cmnewauac001v13dsssxa8rlh). -Our team will process your appeal within 2-3 business days. +- We only review the custom system prompt you set. We do this automatically each time your bot starts or restarts. +- We never review the conversations in your channel, and we never review what your members write. The review is only + about the instructions you give the bot. -For full details regarding this policy and our legal justification, please review +#### How the review works + +The review is fully automated. An AI reviewer checks the prompt against the acceptable-use categories in section 8 of our [Terms of Service](https://scootk.it/scnx-tos). + +#### What gets a prompt rejected + +A prompt is rejected if it does any of the following: + +- **Sexualization of minors:** sexual content involving anyone under 18. +- **Content likely illegal under German law:** content that is likely illegal under German law. +- **Targeted harassment or hate speech:** attacking people or groups based on who they are. +- **Collecting personal data:** instructing the bot to gather personal information about users. +- **Deceptive impersonation or scams:** pretending to be someone else or framing the bot to deceive or defraud. +- **Breaking Discord's rules:** instructing behaviour that violates Discord's + [Terms of Service](https://discord.com/terms). + +#### Strikes and what happens + +Each rejected prompt counts as one strike. Strikes are counted over a rolling 90-day window. + +- **First strike:** only that prompt is blocked. Everything else keeps working. Set a new prompt that passes review, and + after your bot's next restart the AI chat channel is re-enabled automatically. +- **Module lock:** a second strike within the 90-day window, or any rejection in a high-severity category + (sexualization of minors, or content likely illegal under German law), locks the whole AI chat module. + +A locked module cannot be unlocked by editing the prompt. It can only be reopened through an appeal or a decision by our +staff. + +:::note Only the affected channel is disabled +A custom prompt that fails review disables only the specific AI chat channel it belongs to - the rest of the module and +any other AI chat channels keep working. That channel recovers automatically once you set a prompt that passes review; +you do not need to open a support ticket for a first strike. +::: + +Strikes age out of the 90-day window automatically, but a module lock never expires on its own - it ends only through a successful appeal or a decision by our staff. + +#### Statement of reasons and how to appeal + +:::info Statement of reasons +Every rejection sends an email to the server owner. In line with the EU Digital Services Act (Article 17), that email +includes a statement of reasons and instructions for appealing. Your current standing - your strikes and whether the +module is locked - is also shown on the module's page in your dashboard. ::: +To appeal, [open a support ticket](https://scnx.app/user/support/new?topic=cmnewauac001v13dsssxa8rlh). A member of our +team reviews every appeal. For full details on this policy, please review our +[Terms of Service](https://scootk.it/scnx-tos). + ### Pricing & Common Errors This module charges the AI-Coins of your server. diff --git a/docs/custom-bot/modules/community/activity-streak.md b/docs/custom-bot/modules/community/activity-streak.md index 77037b8c..749873c9 100644 --- a/docs/custom-bot/modules/community/activity-streak.md +++ b/docs/custom-bot/modules/community/activity-streak.md @@ -63,9 +63,9 @@ In this configuration file, you can configure the module. Open it in your [dashb | Streak View Message | Customize the embed displayed when viewing a streak. | | Ignored Channels | Channels where messages do not count toward streaks. | | Ignored Roles | Roles whose members' messages do not count toward streaks. | -| Enable Restore | If enabled, users can restore a lost streak once per loss. | -| Restore Roles | Roles that are allowed to use the restore command. If empty, all users can restore. | -| Restore time limit (days) | How many days after losing a streak users can still restore it with `/streak restore`. Set to `0` for no time limit. Only applies when "Enable Restore" is turned on. | +| Enable streak restore? | If enabled, users can restore a lost streak once per loss. | +| Roles allowed to restore streaks | Roles that are allowed to use the restore command. If empty, all users can restore. | +| Restore time limit (days) | How many days after losing a streak users can still restore it with `/streak restore`. Set to `0` for no time limit. Only applies when "Enable streak restore?" is turned on. | ## Troubleshooting {#troubleshooting} diff --git a/docs/custom-bot/modules/community/economy-system.md b/docs/custom-bot/modules/community/economy-system.md index 512d7260..99f53242 100644 --- a/docs/custom-bot/modules/community/economy-system.md +++ b/docs/custom-bot/modules/community/economy-system.md @@ -108,33 +108,33 @@ In this configuration file, you can configure the functionality of this module. In this configuration file, you can customize the messages sent by this module. Open it in your [dashboard](https://scnx.app/glink?page=bot/configuration?file=economy-system%7Cconfigs%2Fstrings). -| Field | Description | -| -------------------- | ---------------------------------------------------------------------------- | -| not found message | Message shown when a shop item cannot be found. | -| not enough money | Message shown when a user does not have enough currency to buy an item. | -| shop message | The embed displayed in the shop channel showing all available items. | -| item string | The format used for each item in the shop message. | -| cooldown | Message shown when a user attempts to use a command while on cooldown. | -| workSuccess | Array of messages randomly shown when a user successfully works. | -| crimeSuccess | Array of messages randomly shown when a user successfully commits a crime. | -| crimeFail | Array of messages randomly shown when a user fails at committing a crime. | -| robSuccess | Message shown when a user successfully robs another user. | -| leaderboardEmbed | Customize the appearance of the leaderboard embed. | -| dailyReward | Message shown when a user collects their daily reward. | -| weeklyReward | Message shown when a user collects their weekly reward. | -| balanceReply | The embed displayed when a user checks their balance. | -| userNotFound | Message shown when the specified user cannot be found. | -| buyMsg | Message shown when a user purchases a shop item. | -| itemCreate | Message shown when a shop item is created. | -| itemDelete | Message shown when a shop item is deleted. | -| itemEdit | Message shown when a shop item is edited. | -| deposit message | Message shown when a user deposits currency to the bank. | -| withdraw message | Message shown when a user withdraws currency from the bank. | -| message drop message | Array of messages shown when a user receives a message drop. | -| rebuy message | Message shown when a user tries to buy an item they already own. | -| multiple matches | Message shown when multiple shop items match the search query. | -| no matches | Message shown when no shop item matches the search query. | -| item duplicate | Message shown when trying to create a shop item with an existing ID or name. | +| Field | Description | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| not found message | Message shown when a shop item cannot be found. | +| not enough money | Message shown when a user does not have enough currency to buy an item. | +| shop message | The embed displayed in the shop channel showing all available items. | +| item string | The format used for each item in the shop message. | +| cooldown | Message shown when a user attempts to use a command while on cooldown. | +| workSuccess | Array of messages randomly shown when a user successfully works. | +| crimeSuccess | Array of messages randomly shown when a user successfully commits a crime. | +| crimeFail | Array of messages randomly shown when a user fails at committing a crime. | +| robSuccess | Message shown when a user successfully robs another user. | +| leaderboardEmbed | Customize the appearance of the leaderboard embed. | +| dailyReward | Message shown when a user collects their daily reward. | +| weeklyReward | Message shown when a user collects their weekly reward. | +| balanceReply | The embed displayed when a user checks their balance. | +| userNotFound | Message shown when the specified user cannot be found. | +| buyMsg | Message shown when a user purchases a shop item. | +| itemCreate | Message shown when a shop item is created. | +| itemDelete | Message shown when a shop item is deleted. | +| itemEdit | Message shown when a shop item is edited. | +| deposit message | Message shown when a user deposits currency to the bank. | +| withdraw message | Message shown when a user withdraws currency from the bank. | +| message drop message | Array of custom messages sent when a user receives a message drop - one is picked at random for each drop. Supports full embed formatting and the `%earned%` placeholder (the amount earned, including the currency symbol). Leave empty to fall back to the built-in default message. | +| rebuy message | Message shown when a user tries to buy an item they already own. | +| multiple matches | Message shown when multiple shop items match the search query. | +| no matches | Message shown when no shop item matches the search query. | +| item duplicate | Message shown when trying to create a shop item with an existing ID or name. | ## Troubleshooting {#troubleshooting} diff --git a/docs/custom-bot/modules/community/message-quotes.md b/docs/custom-bot/modules/community/message-quotes.md new file mode 100644 index 00000000..05fc2c06 --- /dev/null +++ b/docs/custom-bot/modules/community/message-quotes.md @@ -0,0 +1,112 @@ +# Message Quotes + +Automatically repost a Discord message as a rich quote whenever someone pastes its message link. + + + +## Features {#features} + +- Detects Discord message links pasted into chat and reposts the linked message as a formatted quote. +- Optional **Quote Message** action in Discord's Apps (right-click) menu, so users can quote a message without pasting its link. +- Rendered quote can show the original author, nickname, avatar, channel, message content, a Discord timestamp, a link back to the original, and its first image. +- Fully customizable quote message - build it as an embed or a generated image with parameters for every field. +- Channel/category and role blacklists to keep quoting out of the places (and away from the people) you choose. +- Toggles for ignoring bot messages, allowing self-quotes, replying to the trigger message, and deleting the trigger message. +- Optional attachment quoting, re-uploading the linked message's files alongside the quote. +- The quoted message's first image is archived to your server's [file library](/docs/scnx/guilds/files), so quotes keep their image after Discord's CDN URLs expire. + +## Setup {#setup} + +1. [Enable the module](https://scnx.app/glink?page=bot/modules?query=message-quotes) on your server. +2. Make sure the bot has the permissions `View Channel`, `Send Messages`, `Read Message History` and `Embed Links` in the channels where quoting should work. To use **Delete trigger?**, it also needs `Manage Messages`. +3. Open the [Configuration](https://scnx.app/glink?page=bot/configuration?file=message-quotes%7Cconfigs/config) and adjust the blacklists, toggles and quote message to fit your server. + +## Usage {#usage} + +- Once [set up](#setup), a user simply pastes a link to another message (from the same server) into any non-blacklisted channel. The bot fetches the linked message and reposts it as a quote. +- The linked message is only quoted if both the user who pasted the link and the bot can actually see it (they need `View Channel` and `Read Message History` in the source channel). Links pointing to another server are ignored. +- Depending on your configuration, the quote is sent as a reply to the trigger message, and the trigger message may be deleted afterwards. +- A short per-user cooldown prevents a single user from spamming quotes in quick succession. +- Alternatively, users can right-click (or long-press) any message, open **Apps**, and choose **Quote Message** to post the quote without pasting a link. See [Commands](#commands). + +### Permanent image archival {#image-archival} + +When a quote is rendered, the linked message's first image is uploaded to your server's [file library](/docs/scnx/guilds/files) and the quote is built against that permanent URL. This stops quotes from breaking once Discord's short-lived CDN URLs expire. + +Archived images count against your server's [file-storage quota](/docs/scnx/guilds/files#understanding-storage-limits). To opt out, enable **Disable attachment archival** in the bot's General Configuration; with archival disabled, quote images revert to Discord's expiring URLs and old quotes will eventually break again. + +## Commands {#commands} + + + +| Command | Description | +| --------------- | -------------------------------------------------------------------------------------------------------------------------- | +| `Quote Message` | A message context-menu (Apps) action. Right-click or long-press a message and select it to repost that message as a quote. | + +The **Quote Message** action respects the same configuration as link-based quoting. If quoting is suppressed for the target (for example because **Ignore bot messages?** is on, or **Allow Self-quotes?** is off and you are quoting yourself), the bot replies privately (ephemerally) and posts nothing. + +## Configuration {#configuration} + +Configure the message quoting system. Open it in your [dashboard](https://scnx.app/glink?page=bot/configuration?file=message-quotes%7Cconfigs/config). + +| Field | Description | +| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Blacklist roles | Roles that are excluded from quoting. Members with a listed role cannot trigger a quote. | +| Blacklist channels | Channels that are excluded from quoting. Channels and categories are supported; a category excludes all its channels. | +| Attach files? | Should all attachments be quoted? The linked message's files are re-uploaded alongside the quote. Deactivation recommended if "Message" components v2 are used. | +| Ignore bot messages? | When enabled, messages sent by bots are not quoted. | +| Allow Self-quotes? | Whether users can quote their own messages. | +| Reply to messages? | Reply to the message that triggered the quote. Ignored when **Delete trigger?** is enabled. | +| Delete trigger? | When enabled, the message that triggered the quote is deleted after the quote is posted. Requires the `Manage Messages` permission. | +| Message | The message in which the quote is returned. Build it as an embed or a generated image; the available parameters (author, nickname, avatar, channel, timestamp, link, first image, content, and more) are listed in your dashboard. | + +## Troubleshooting {#troubleshooting} + +
+ Nothing happens when a message link is pasted +
    +
  • Make sure the module is enabled and the bot has View Channel, Send Messages, Read Message History and Embed Links in both the channel where the link is pasted and the channel the linked message lives in.
  • +
  • Make sure the channel (or its category) is not in Blacklist channels and the user does not have a role in Blacklist roles.
  • +
  • The linked message must be on the same server. Links to messages in other servers are ignored.
  • +
  • The user who pasted the link must be able to see the linked message themselves (View Channel and Read Message History in the source channel).
  • +
  • If you just quoted a message, wait a few seconds - a short per-user cooldown applies.
  • +
+
+ +
+ Bot messages are not being quoted +
    +
  • This is expected when Ignore bot messages? is enabled. Disable it to allow quoting bot messages.
  • +
+
+ +
+ The trigger message is not being deleted +
    +
  • Make sure Delete trigger? is enabled.
  • +
  • Ensure the bot has the Manage Messages permission in the channel where the link was pasted. Without it, the quote is still posted but the trigger message is left in place.
  • +
  • While Delete trigger? is enabled, Reply to messages? is ignored, since the message it would reply to is removed.
  • +
+
+ +
+ The "Quote Message" action says the message cannot be quoted +
    +
  • The target is likely suppressed by configuration - for example Ignore bot messages? is on and the target was sent by a bot, or Allow Self-quotes? is off and you are quoting your own message.
  • +
  • You also need permission to send messages in the current channel for the action to post the quote.
  • +
+
+ +
+ Old quotes lost their image +
    +
  • Discord's CDN URLs expire over time. Quote images are normally archived to your file library to prevent this.
  • +
  • If Disable attachment archival is enabled in the bot's General Configuration, quote images fall back to Discord's expiring URLs and will eventually break.
  • +
+
+ +## Stored data {#data-usage} + +This module does not persist any data in its own module database. Quotes are rendered and posted on the fly, and the short per-user cooldown is kept only in memory and reset when the bot restarts. + +The one exception is image archival: when a quoted message's first image is archived, that image is stored in your server's [file library](/docs/scnx/guilds/files) (and counts against your [file-storage quota](/docs/scnx/guilds/files#understanding-storage-limits)) rather than in this module's database. Manage or remove those files from the file library in your dashboard. diff --git a/docs/custom-bot/modules/integrations/tiktok-notifications.md b/docs/custom-bot/modules/integrations/tiktok-notifications.md index a63f68f4..2633a39f 100644 --- a/docs/custom-bot/modules/integrations/tiktok-notifications.md +++ b/docs/custom-bot/modules/integrations/tiktok-notifications.md @@ -1,18 +1,22 @@ # TikTok-Notifications -Send a message to a channel when a TikTok user publishes a new TikTok. +Send a message to a channel when a TikTok creator publishes a new TikTok. +:::info +TikTok notifications only work for creators who have connected (claimed) their TikTok account with SCNX. If a configured creator has not connected their account, notifications for them are paused and the creator is listed as an issue on your [dashboard](https://scnx.app/glink?page=bot/configuration?file=tiktok-notifications%7Cusers), together with a link the creator can use to connect their account. Unconnected creators are re-checked once per day, and notifications resume automatically once the account has been connected. +::: + ## Features {#features} -- Receive notifications in a Discord channel when a TikTok user publishes a new video. +- Receive notifications in a Discord channel when a TikTok creator publishes a new video. - Monitor multiple TikTok accounts simultaneously, each with its own notification channel and message format. -- Customize the notification message with details such as the username, video title, hashtags and URL. +- Customize the notification message with details such as the username, video title, description, hashtags, thumbnail and URL. ## Setup {#setup} -1. Open the [TikTokers configuration](https://scnx.app/glink?page=bot/configuration?file=tiktok-notifications%7Cusers). +1. Open the [TikTok Creators configuration](https://scnx.app/glink?page=bot/configuration?file=tiktok-notifications%7Cusers). 2. Click on "Add new element" and configure the TikTok username and notification channel as described in the [configuration section](#configuration). 3. Make sure the bot has "View channel", "Send messages" and "Embed links" permissions on the configured notification channel. 4. Reload your bot's configuration to apply the changes. @@ -23,15 +27,19 @@ After [setting up](#setup) and [configuring](#configuration) this module, no add Only TikToks published within the last 24 hours will trigger notifications, so older TikToks will not be sent retroactively. +Notifications are only sent for creators who have connected their TikTok account with SCNX. If a creator has not connected their account, the bot pauses notifications for them and reports the creator as an issue on your dashboard, including a link the creator can use to connect their account. Unconnected creators are re-checked once per day, and notifications resume automatically once the account has been connected. + ## Configuration {#configuration} This configuration file allows you to set up TikTok accounts to monitor for new videos. Open it in your [dashboard](https://scnx.app/glink?page=bot/configuration?file=tiktok-notifications%7Cusers). -| Field | Description | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Channel | The Discord channel in which the notification should be sent. | -| TikTok-Username | The @handle of the TikTok user you want to receive notifications from. | -| Message | The message sent to the configured channel when the user publishes a new TikTok. Supports embeds.
Please review available parameters in your dashboard. | +| Field | Description | +| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Channel | The Discord channel in which the notification should be sent. | +| TikTok-Username | The @handle of the TikTok creator you want to receive notifications from. | +| Required hashtag | Only send notifications for videos that include this hashtag. The comparison is case-insensitive and works with or without the `#` prefix. Leave empty to notify for every video. | +| Minimum clip length (seconds) | Skip videos shorter than this many seconds. Set to 0 to disable the filter. Videos without a known duration are never filtered out. | +| Message | The message sent to the configured channel when the creator publishes a new TikTok. Supports embeds. Available parameters include `%userName%` (TikTok username), `%title%` (video title), `%description%` (video description), `%hashtags%` (video hashtags), `%url%` (video URL) and `%thumbnailUrl%` (video thumbnail URL, may be empty).
Please review available parameters in your dashboard. | ## Troubleshooting {#troubleshooting} @@ -40,13 +48,23 @@ This configuration file allows you to set up TikTok accounts to monitor for new
  • Make sure the TikTok username is spelled correctly (with or without the @ prefix).
  • Verify that the TikTok account exists and is publicly accessible.
  • -
  • TikTok may restrict API access from time to time, which can temporarily prevent this module from working. This is outside of SCNX's control.
  • +
  • Make sure the creator has connected their TikTok account with SCNX. Notifications are paused for creators who have not connected their account. Check your dashboard for any reported issues and share the provided link with the creator.
  • Ensure the bot has "View channel", "Send messages" and "Embed links" permissions on the notification channel.
  • The module checks for new TikToks every twenty minutes. Please wait for the next check cycle.
  • If a TikTok account cannot be found, it will be skipped until the bot is restarted or the configuration is reloaded.
+
+A creator has not connected their TikTok account +
    +
  • Notifications only work for creators who have connected (claimed) their TikTok account with SCNX.
  • +
  • When a creator has not connected their account, notifications for them are paused and the creator is reported as an issue on your dashboard, together with a link the creator can use to connect their account.
  • +
  • Share that link with the creator so they can connect their TikTok account.
  • +
  • Unconnected creators are re-checked once per day. Notifications resume automatically once the account has been connected.
  • +
+
+ ## Stored data {#data-usage} The following data is being stored about every sent notification: diff --git a/docs/custom-bot/modules/integrations/youtube-notifications.md b/docs/custom-bot/modules/integrations/youtube-notifications.md index c70e268a..8401fdcc 100644 --- a/docs/custom-bot/modules/integrations/youtube-notifications.md +++ b/docs/custom-bot/modules/integrations/youtube-notifications.md @@ -23,7 +23,7 @@ Send a message to a channel when a YouTube channel publishes a new video or star ## Usage {#usage} -After [setting up](#setup) and [configuring](#configuration) this module, no additional actions are required. The bot will automatically check configured YouTube channels for new videos and livestreams every five minutes. +After [setting up](#setup) and [configuring](#configuration) this module, no additional actions are required. The bot will automatically check configured YouTube channels for new videos and livestreams every 60 seconds, so go-live and upload notifications usually arrive within about a minute. An overlap guard prevents a slow check from starting a second one on top of it, so notifications are never duplicated. - When a new **video** is uploaded, the configured notification message will be sent to the specified Discord channel. Only videos published within the last 24 hours will trigger notifications. - When a channel starts a **livestream**, the configured notification message will be sent. If the live role feature is enabled, the configured role will be added to the YouTuber's Discord account when they go live and removed when the stream ends. @@ -63,7 +63,7 @@ In this configuration file, you can set up YouTube channels to monitor for lives
  • Make sure the YouTube @-handle or channel ID is correct.
  • Ensure the bot has "View channel", "Send messages" and "Embed links" permissions on the notification channel.
  • -
  • The module checks for new videos every five minutes. Please wait for the next check cycle.
  • +
  • The module checks for new videos every 60 seconds. Please wait for the next check cycle.
  • If the "Ignore shorts?" option is enabled, YouTube Shorts will not trigger notifications.
  • If a YouTube channel cannot be found, it will be skipped until the bot is restarted or the configuration is reloaded.
@@ -74,7 +74,7 @@ In this configuration file, you can set up YouTube channels to monitor for lives
  • Make sure the YouTube @-handle is correct.
  • Ensure the bot has "View channel", "Send messages" and "Embed links" permissions on the notification channel.
  • -
  • The module checks for livestreams every five minutes. Please wait for the next check cycle.
  • +
  • The module checks for livestreams every 60 seconds. Please wait for the next check cycle.
diff --git a/docs/custom-bot/modules/moderation/moderation.md b/docs/custom-bot/modules/moderation/moderation.md index cd5fbff4..4e0b7896 100644 --- a/docs/custom-bot/modules/moderation/moderation.md +++ b/docs/custom-bot/modules/moderation/moderation.md @@ -7,41 +7,43 @@ Advanced security and moderation system with tons of features for keeping your s ## Features {#features} - Comprehensive moderation commands: [warn](#warn), [mute](#mute), [kick](#kick), [ban](#ban), [quarantine](#quarantine), [channel-mute](#channel-mute), and [clear](#clear). -- Support for temporary bans, mutes, and quarantines with automatic expiration. +- Warn, Mute, Kick, and Ban are also available as right-click [context-menu actions](#context-menu-actions) on users and messages, and they accept evidence. +- Support for temporary bans, mutes, and quarantines with automatic expiration, plus [editable durations](#edit-duration) that shorten or extend an active punishment after the fact. +- [Lift punishments in one click](#lift-punishment) straight from the log message or the actions view. - [Channel lock and unlock](#lock-unlock) commands to restrict messaging in a channel. - [Server-wide lockdown](#lockdown) system that locks all channels at once, with automatic triggers. Optionally send lockdown messages to specific channels only. - Smarter invite detection: Discord invite links are resolved before taking action, and invites to your own server are automatically allowed. -- [User reporting](#report) system that allows members to report other users with proof. +- [User reporting](#report) system that allows members to report other users and messages with proof images. - [Moderator notes](#notes) system to track information about users. - View all moderation [actions history](#actions) for any user. - [Revoke warnings](#commands) to remove previous warns. -- [Auto-moderation](#configuration-config) for invite links, scam links, and blacklisted words. +- [Auto-moderation](#configuration-config) for invite links, scam links, and blacklisted words, each with an optional delete-only action that removes the message without punishing the member. - Automated punishments based on warning count (e.g., auto-ban after X warns). -- [Anti-Spam](#anti-spam) system detecting message spam, duplicate messages, excessive pings, and mass pings. +- A fully configurable, [per-type anti-spam](#anti-spam) system - message rate, duplicate content, mentions, mass mentions, attachment/image spam, link spam, newline/character floods, sticker/emoji spam, channel spread, and text abuse - each with its own toggle, threshold, timeframe, and action. +- [New-member restrictions](#new-member-restrictions) that hold back attachments and links until a member has been on the server long enough. - [Anti-Join-Raid](#anti-join-raid) system detecting mass joins. - [Join Gate](#join-gate) to block suspicious accounts based on account age and profile picture. - [Anti-Grief](#anti-grief) system to quarantine moderators who abuse their permissions. - [Verification](#verification) system requiring new members to complete an image captcha, a word or math challenge, a one-click button, or a manual moderator review. +- [Custom moderation levels](#configuration-modlevels) you define yourself, each granting an explicit set of capabilities. +- [Customizable and public logs](#configuration-logmessages): edit the embed for every log message type, and optionally mirror actions to a separate public channel. +- [Native Discord moderation import](#native-import) that records bans, kicks, and timeouts done with Discord's own tools into the bot's database and log channel. +- Optional [custom case titles](#configuration-config), [editable reasons](#edit-reason), and [involved-user tagging](#involved-users) on cases. - Automatic warn expiration after a configurable period. - Customizable messages for every moderation action. -- Four moderator permission levels to control who can perform which actions. - Optional nickname changes on mute or quarantine. - All actions are logged to a configurable log channel. -- [Proof attachments](#evidence-archival) on moderation actions are archived to your server's [file library](/docs/scnx/guilds/files), so old case logs stay viewable after Discord's CDN URLs expire. +- [Multi-image evidence](#evidence-archival) on moderation actions is archived to your server's [file library](/docs/scnx/guilds/files), so old case logs stay viewable after Discord's CDN URLs expire. ## Setup {#setup} 1. [Enable the module](https://scnx.app/glink?page=bot/modules?query=moderation) on your server. 2. Open the [Configuration](https://scnx.app/glink?page=bot/configuration?file=moderation%7Cconfigs/config) and set the **Log-Channel** where moderation actions will be logged. -3. Configure your **moderator roles** at the appropriate levels: - - **Level 1**: Can warn. - - **Level 2**: Can warn, mute, unmute, lock, unlock, channel-mute, and remove channel-mute. - - **Level 3**: Can warn, mute, unmute, kick, and clear. - - **Level 4**: Can warn, mute, unmute, kick, clear, ban, and unban. +3. Set up your **moderation levels** in the [Moderation Levels configuration](#configuration-modlevels). Create one level per staff tier, list the roles that belong to it, and tick exactly the capabilities those roles should have (warn, mute, kick, ban, quarantine, and more). If you are upgrading from an older version, your existing Moderator-Level 1-4 roles are migrated into equivalent levels automatically on startup, so your team keeps working without any change. 4. All moderators also need to be able to execute the `/moderate` command. Configure this in your Discord server settings (Server Settings > Integrations). 5. If you want to use quarantine, set the **Quarantine-Role** in the configuration. This role should have restricted permissions, and the bot's role should be placed above it in the role hierarchy. -6. Make sure the bot has the following permissions: **Manage Roles**, **Kick Members**, **Ban Members**, **Moderate Members**, **Manage Channels**, **Manage Messages**, **View Channel**, **Send Messages**, and **Embed Links**. -7. Optionally configure the additional security systems ([Anti-Spam](#anti-spam), [Anti-Join-Raid](#anti-join-raid), [Join Gate](#join-gate), [Anti-Grief](#anti-grief), [Verification](#verification), and [Lockdown](#lockdown)) in their respective configuration files. +6. Make sure the bot has the following permissions: **Manage Roles**, **Kick Members**, **Ban Members**, **Moderate Members**, **Manage Channels**, **Manage Messages**, **View Channel**, **Send Messages**, and **Embed Links**. To record [native Discord moderation](#native-import), the bot additionally needs **View Audit Log**. +7. Optionally configure the additional systems ([Anti-Spam](#anti-spam), [New-member restrictions](#new-member-restrictions), [Anti-Join-Raid](#anti-join-raid), [Join Gate](#join-gate), [Anti-Grief](#anti-grief), [Verification](#verification), [Lockdown](#lockdown), and [Log Messages](#configuration-logmessages)) in their respective configuration files. ## Usage {#usage} @@ -49,25 +51,27 @@ Advanced security and moderation system with tons of features for keeping your s Moderators use the `/moderate` command with various subcommands to perform actions. Each action is logged in the configured log channel. Users receive a DM notification when a moderation action is taken against them (if their DMs are open). +Every action can optionally tag [involved users](#involved-users). When [custom case titles](#configuration-config) are enabled, a short **title** field is added to the warn, mute, ban, kick, quarantine, and channel-mute commands and becomes required. + #### Warn {#warn} -Warns a user. The warning is recorded and can trigger automatic actions if [automod thresholds](#configuration-config) are configured. Requires moderator level 1 or higher. +Warns a user. The warning is recorded and can trigger automatic actions if [automod thresholds](#configuration-config) are configured. Requires the **Warn members** capability. #### Mute {#mute} -Mutes a user using Discord's built-in timeout feature. A duration is required (maximum 28 days). If no duration is set by the moderator, the configured default mute duration is used. Requires moderator level 2 or higher. +Mutes a user using Discord's built-in timeout feature. A duration is required (maximum 28 days). If no duration is set by the moderator, the configured default mute duration is used. Requires the **Mute members** capability. #### Kick {#kick} -Kicks a user from the server. The user can rejoin using an invite link. Requires moderator level 3 or higher. +Kicks a user from the server. The user can rejoin using an invite link. Requires the **Kick members** capability. #### Ban {#ban} -Bans a user from the server. Optionally specify a duration for a temporary ban and the number of days of messages to delete. Works even if the user is not currently on the server. Requires moderator level 4 or higher. +Bans a user from the server. Optionally specify a duration for a temporary ban and the number of days of messages to delete. Works even if the user is not currently on the server. Requires the **Ban members** capability. #### Quarantine {#quarantine} -Quarantines a user by assigning them the quarantine role and optionally removing all their other roles (roles are saved and restored on unquarantine). Optionally specify a duration for automatic removal. Requires moderator level 4 or higher. +Quarantines a user by assigning them the quarantine role and optionally removing all their other roles (roles are saved and restored on unquarantine). Optionally specify a duration for automatic removal. Requires the **Quarantine members** capability. If **Strip new roles from quarantined users** is enabled (see [Configuration](#configuration-config)), the bot also removes any role that gets added to the user while they are quarantined - including reaction roles, self-roles @@ -76,27 +80,39 @@ integration-managed roles are left in place. #### Channel-mute {#channel-mute} -Mutes a user in the current channel only by modifying the channel's permission overwrites. This prevents the user from sending messages in that specific channel. Requires moderator level 2 or higher. +Mutes a user in the current channel only by modifying the channel's permission overwrites. This prevents the user from sending messages in that specific channel. Requires the **Channel-mute members** capability. #### Clear {#clear} -Deletes a specified number of recent messages from the current channel (default: 5). Requires moderator level 3 or higher. +Deletes a specified number of recent messages from the current channel (default: 5). Requires the **Clear messages** capability. #### Lock and Unlock {#lock-unlock} -Locks or unlocks the current channel, preventing or allowing the @everyone role from sending messages. A reason can be provided when locking. Requires moderator level 2 or higher. +Locks or unlocks the current channel, preventing or allowing the @everyone role from sending messages. A reason can be provided when locking. Requires the **Lock channels** capability. -### Lockdown {#lockdown} +### Context-menu actions {#context-menu-actions} -The lockdown system allows you to lock all channels in the server at once. This can be triggered manually by moderators or automatically when security systems (anti-join-raid, join-gate, or anti-spam) are triggered. The lockdown system must be enabled in the [Lockdown Configuration](#configuration-lockdown) first. +Warn, Mute, Kick, and Ban are also available as right-click actions. Right-click a user (or a message, then choose **Apps**) and pick **Warn**, **Mute**, **Kick**, or **Ban**. A modal opens for the reason and, when [custom case titles](#configuration-config) are enabled, the title. Every context-menu action includes an optional evidence field where you can upload up to ten proof images in one go. There are also **Report User** and **Report Message** actions for members, and a **Mod History** action that shows a user's past cases. -When a lockdown is activated, the bot saves the current permission state of all channels, then revokes send-message permissions for the @everyone role. When the lockdown is lifted, the original permissions are restored. An optional auto-lift timer can automatically end the lockdown after a specified number of minutes. +### Lift punishment {#lift-punishment} -You can optionally configure specific channels where lockdown and lift messages are sent instead of sending them in every affected channel. Permissions are still changed in all channels regardless of this setting. +When **Lift-punishment buttons** are enabled (see [Configuration](#configuration-config)), moderation log messages and the [actions view](#actions) show a **Lift punishment** button that reverses a mute, ban, quarantine, or warn in one click. You are prompted for a reason, and the action is undone. The button is permission-gated: only staff whose [moderation level](#configuration-modlevels) allows that action type can lift it. + +### Edit duration {#edit-duration} + +Use `/moderate edit-duration`, or the **Edit duration** button and modal in the [actions view](#actions) (shown when **Lift-punishment buttons** are enabled), to shorten or extend an active temporary mute, ban, or quarantine after it was applied. The affected user is notified of the change by DM (see the **Duration Changed Message** in [Messages](#configuration-strings)). + +### Edit reason {#edit-reason} + +An **Edit reason** button appears under each log message and in the [actions view](#actions) - it shares the **Lift-punishment buttons** toggle (see [Configuration](#configuration-config)). `/moderate edit-reason` does the same from the command line. The reason is rewritten in place, and the change is recorded as a case event for accountability. + +### Involved users {#involved-users} + +A case can reference more than one person - the member who reported it, a second account caught up in the same incident, or a witness. When **Allow linking involved users** is enabled, add them with the `involved` option on an action, the `/moderate involve` command, or the user picker in the [actions view](#actions). Involved users are reference-only: they are never punished or notified, and they surface through the `%involved%` [log placeholder](#configuration-logmessages), so you decide whether they show in your internal log, a public one, or both. ### Reporting {#report} -Any user can report another user using the `/report` command. The report includes the reason, an optional proof attachment, and an encrypted snapshot of the current messages in the channel. Reports are sent to the configured report channel (or the log channel if no report channel is set). Configured roles are pinged when a report is received. +Any user can report another user with `/report`, or right-click a user or message and use **Report User** / **Report Message**. A report includes the reason, optional proof images (up to ten in the context-menu flows), and an encrypted snapshot of the current messages in the channel. Reports are sent to the configured report channel (or the log channel if no report channel is set). Configured roles are pinged when a report is received. Members whose moderation level is marked **Immune to reports** cannot be reported. ### Notes {#notes} @@ -104,43 +120,63 @@ Moderators can create, view, edit, and delete notes about users. Notes are usefu ### Actions history {#actions} -Moderators can view all past moderation actions taken against a user, including warns, mutes, kicks, bans, and quarantines. +Moderators can view all past moderation actions taken against a user, including warns, mutes, kicks, bans, and quarantines. The view is where the per-case buttons live: [lift a punishment](#lift-punishment), [edit its duration](#edit-duration) or [reason](#edit-reason), [add proof](#evidence-archival), and [link involved users](#involved-users) - each shown when its feature is enabled. ### Evidence archival {#evidence-archival} -Whenever a moderator attaches a `proof` file to a moderation action (warn, mute, kick, ban, channel-mute, or report), the attachment is uploaded to your server's [file library](/docs/scnx/guilds/files) and the case log links to that permanent URL instead of Discord's expiring CDN URL. Old cases stay open as evidence, even months after the action. +Evidence is no longer limited to a single screenshot. You can attach up to ten proof images to a moderation action - both when you act (via the `proof` option or the context-menu upload field) and afterward, when **Allow adding more proof images** is enabled, via the **Add proof** button under each log message or the `/moderate add-proof` command. Images are archived to your server's [file library](/docs/scnx/guilds/files), the case log links to those permanent URLs instead of Discord's expiring CDN URLs, and the log message updates itself in place, showing everything together as a gallery. Reports carry evidence too. Stored proof files count against your server's [file-storage quota](/docs/scnx/guilds/files#understanding-storage-limits). To opt out, enable **Disable attachment archival** in the bot's General Configuration; with archival disabled, evidence links revert to Discord's URLs and will eventually expire. +### Lockdown {#lockdown} + +The lockdown system allows you to lock all channels in the server at once. This can be triggered manually by moderators or automatically when security systems (anti-join-raid, join-gate, or anti-spam) are triggered. The lockdown system must be enabled in the [Lockdown Configuration](#configuration-lockdown) first. + +When a lockdown is activated, the bot saves the current permission state of all channels, then revokes send-message permissions for the @everyone role. When the lockdown is lifted, the original permissions are restored. An optional auto-lift timer can automatically end the lockdown after a specified number of minutes. Members whose [moderation level](#configuration-modlevels) has **Speak during lockdown** or **Immune to lockdown** set are left able to talk. + +You can optionally configure specific channels where lockdown and lift messages are sent instead of sending them in every affected channel. Permissions are still changed in all channels regardless of this setting. + +### Native Discord moderation import {#native-import} + +With **Import native moderation actions** enabled (see [Configuration](#configuration-config)), bans, unbans, kicks, and timeouts carried out with Discord's own built-in tools are recorded into the bot's moderation database and log channel, so your history and infraction counts stay complete no matter how an action was taken. You can enable it per action type (bans/unbans, kicks, timeouts), and optionally DM the affected user. This applies to live actions only (while the bot is running) and requires the bot to have the **View Audit Log** permission. + ## Commands {#commands} -| Command | Description | -| ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | -| `/moderate warn user: [reason:] [proof:]` | Warns a user. | -| `/moderate mute user: duration: [reason:] [proof:]` | Mutes (times out) a user for the specified duration. | -| `/moderate unmute user: [reason:]` | Unmutes a user. | -| `/moderate kick user: [reason:] [proof:]` | Kicks a user from the server. | -| `/moderate ban user: [reason:] [proof:] [duration:] [days:]` | Bans a user. Optionally set a duration for a temporary ban and the number of days of messages to delete. | -| `/moderate unban id: [reason:]` | Unbans a user by their user ID. Supports autocomplete. | -| `/moderate quarantine user: [reason:] [duration:]` | Quarantines a user by assigning the quarantine role. | -| `/moderate unquarantine user: [reason:]` | Removes a user from quarantine and restores their previous roles. | -| `/moderate channel-mute user: [reason:] [proof:]` | Mutes a user in the current channel only. | -| `/moderate remove-channel-mute user: [reason:]` | Removes a channel mute from a user. | -| `/moderate clear [amount:]` | Deletes recent messages in the current channel (default: 5). | -| `/moderate lock [reason:]` | Locks the current channel. | -| `/moderate unlock` | Unlocks the current channel. | -| `/moderate lockdown enable: [reason:]` | Activates or lifts the server-wide lockdown (only available if lockdown system is enabled). | -| `/moderate notes view user:` | View all notes for a user. | -| `/moderate notes create user: notes:` | Create a new note for a user. | -| `/moderate notes edit user: note-id: notes:` | Edit an existing note. | -| `/moderate notes delete user: note-id:` | Delete a note. | -| `/moderate actions user:` | View all past moderation actions for a user. | -| `/moderate revoke-warn warn-id: [reason:]` | Revoke a warning by its ID. Supports autocomplete. | -| `/report user: reason: [proof:]` | Report a user to the moderation team. | - -Note: Whether `reason` and `proof` parameters are required depends on the "Force moderators to set a reason" and "Force moderators to upload proof" configuration options. +| Command | Description | +| ------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | +| `/moderate warn user: [reason:] [proof:] [involved:]` | Warns a user. | +| `/moderate mute user: duration: [reason:] [proof:] [involved:]` | Mutes (times out) a user for the specified duration. | +| `/moderate unmute user: [reason:]` | Unmutes a user. | +| `/moderate kick user: [reason:] [proof:] [involved:]` | Kicks a user from the server. | +| `/moderate ban user: [reason:] [proof:] [duration:] [days:] [involved:]` | Bans a user. Optionally set a duration for a temporary ban and the number of days of messages to delete. | +| `/moderate unban id: [reason:]` | Unbans a user by their user ID. Supports autocomplete. | +| `/moderate quarantine user: [reason:] [duration:] [involved:]` | Quarantines a user by assigning the quarantine role. | +| `/moderate unquarantine user: [reason:]` | Removes a user from quarantine and restores their previous roles. | +| `/moderate channel-mute user: [reason:] [proof:] [involved:]` | Mutes a user in the current channel only. | +| `/moderate remove-channel-mute user: [reason:]` | Removes a channel mute from a user. | +| `/moderate clear [amount:]` | Deletes recent messages in the current channel (default: 5). | +| `/moderate lock [reason:]` | Locks the current channel. | +| `/moderate unlock` | Unlocks the current channel. | +| `/moderate lockdown enable: [reason:]` | Activates or lifts the server-wide lockdown (only available if lockdown system is enabled). | +| `/moderate notes view user:` | View all notes for a user. | +| `/moderate notes create user: notes:` | Create a new note for a user. | +| `/moderate notes edit user: note-id: notes:` | Edit an existing note. | +| `/moderate notes delete user: note-id:` | Delete a note. | +| `/moderate actions user:` | View all past moderation actions for a user, with the per-case buttons. | +| `/moderate revoke-warn warn-id: [reason:]` | Revoke a warning by its ID. Supports autocomplete. | +| `/moderate edit-duration id: duration: [reason:]` | Shorten or extend an active temporary mute, ban, or quarantine. Supports autocomplete. | +| `/moderate edit-reason id: reason:` | Rewrite the reason of an existing case. Supports autocomplete. | +| `/moderate add-proof id: photo: [photo2:] [photo3:]` | Attach extra proof images to an existing case. Supports autocomplete. | +| `/moderate involve id: user: [remove:]` | Link (or, with `remove`, unlink) an involved user to a case. Supports autocomplete. | +| `/report user: reason: [proof:]` | Report a user to the moderation team. | + +Notes: + +- Whether `reason` and `proof` are required depends on the **Force moderators to set a reason** and **Force moderators to upload proof** configuration options. +- When **Require a custom case title** is enabled, an additional required `title:` option appears on warn, mute, ban, kick, quarantine, and channel-mute (and their right-click modals). When the feature is off, no title option is added at all. +- The `edit-duration`, `edit-reason`, `add-proof`, and `involve` subcommands act on an existing case by its ID and only work when their matching opt-in toggle is enabled. ## Configuration {#configuration} @@ -148,6 +184,8 @@ Note: Whether `reason` and `proof` parameters are required depends on the "Force In this configuration file, you set up the core moderation settings. Open it in your [dashboard](https://scnx.app/glink?page=bot/configuration?file=moderation%7Cconfigs/config). +Moderator permissions no longer live here - they are defined in the separate [Moderation Levels](#configuration-modlevels) configuration. The old Moderator-Level 1-4 role fields are migrated into equivalent levels automatically on startup and are hidden afterward. + | Field | Description | | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Log-Channel | Channel where moderation actions are logged. | @@ -156,46 +194,153 @@ In this configuration file, you set up the core moderation settings. Open it in | Remove all roles on quarantine | If enabled, all roles are removed from a user when they are quarantined. Roles are saved and restored on unquarantine. | | Strip new roles from quarantined users | If enabled, any role added to a quarantined user (via Discord's Channels & Roles tab, reaction roles, or another bot) is automatically removed again. Managed roles such as server boosts and integration roles are kept untouched. Off by default. | | Prevent manual quarantine role removal | If enabled, the bot re-applies the quarantine role when staff strip it manually instead of using `/moderate unquarantine`, and posts an alert in the log channel. With it off, the previous behavior is preserved: removing the role manually still implicitly unquarantines the user. Off by default. | -| Moderator-Level 1 | Roles that can perform: Warn. | -| Moderator-Level 2 | Roles that can perform: Warn, Mute, Unmute, Lock, Unlock, Channel-mute, Remove Channel-Mute. | -| Moderator-Level 3 | Roles that can perform: Warn, Mute, Unmute, Kick, Clear. | -| Moderator-Level 4 | Roles that can perform: Warn, Mute, Unmute, Kick, Clear, Ban, Unban. | | Roles to ping on reports | Roles that are pinged in the log/report channel when a user submits a report. | | Force moderators to set a reason | If enabled, moderators must provide a reason for their actions. | | Force moderators to upload proof | If enabled (and "Force reason" is also enabled), moderators must upload proof for their actions. | -| Action on invite | Action taken when a user posts a Discord invite link (none, warn, mute, kick, quarantine, or ban). | -| Action on Scam-Link | Action taken when a user posts a suspected scam link. | -| Level of Scam-Link-Detection | "confirmed" only filters verified scam domains; "suspicious" may include non-harmful domains. | +| Action on invite | Action taken when a user posts a Discord invite link. Options: none, delete only (remove the message without punishing), warn, mute, kick, quarantine, or ban. | +| Allowed invite guild IDs | Server IDs whose invite links are allowed and will not trigger moderation. Invites to your own server are always allowed automatically. | +| Action on Scam-Link | Action taken when a user posts a suspected scam link. Same options as invites, including delete only. | +| Level of Scam-Link-Detection | Which SCNX-maintained list to match against. "confirmed" only filters verified scam and phishing domains; "suspicious" additionally applies heuristics that may flag not-yet-confirmed domains. | | Whitelisted channels for invite-ban | Channels or categories where invite blocking is disabled. | | Whitelisted roles for invite-ban | Roles that are allowed to bypass invite blocking. | -| Allowed invite guild IDs | Server IDs whose invite links are allowed and will not trigger moderation. Invites to your own server are always allowed automatically. | | Blacklisted words | Words that are blocked in messages. | -| Action on blacklisted Word | Action taken when a user posts a blacklisted word. | -| Automod | Define automatic actions (mute, kick, ban, quarantine) based on warning count. Format: key = number of warns, value = action (optionally with duration, e.g., "ban:7d"). | +| Action on blacklisted Word | Action taken when a user posts a blacklisted word. Same options as invites, including delete only. | | Default Mute-Duration | Default mute duration when none is specified. Also used for automod actions. Maximum 28 days. | -| Should warns be deleted automatically? | If enabled, warns are automatically removed after the configured expiration period. | -| Time after which warns will be automatically removed | Duration after which warns expire (e.g., "3 months", "1y", "2w"). | | Change nicknames on Mute- / Quarantine | If enabled, users will be renamed when muted or quarantined. The mute / quarantine prefix is applied through the [central nickname manager](/docs/custom-bot/modules/community/nicknames#central-nickname-manager), so it is added once (re-muting never produces `[Muted] [Muted] X`) and unmuting / unquarantining preserves any role prefix or active streak suffix. | | New nickname on mute | Nickname template when a user is muted. Supports `%nickname%` (original nickname). | | Nickname during quarantine | Nickname template when a user is quarantined. Supports `%nickname%` (original nickname). | +| Automod | Define automatic actions (mute, kick, ban, quarantine) based on warning count. Format: key = number of warns, value = action (optionally with duration, e.g., "ban:7d"). | +| Should warns be deleted automatically? | If enabled, warns are automatically removed after the configured expiration period. | +| Time after which warns will be automatically removed | Duration after which warns expire (e.g., "3 months", "1y", "2w"). | +| Import native moderation actions | If enabled, bans, unbans, kicks, and timeouts done with Discord's native tools are recorded into the moderation database and log channel. Requires the bot to have **View Audit Log**, otherwise it stays inactive. | +| Import native bans and unbans | Record bans and unbans performed with Discord's native tools. | +| Import native kicks | Record kicks performed with Discord's native tools. | +| Import native timeouts | Record timeouts and timeout removals performed with Discord's native tools. | +| DM users on imported actions | Attempt to DM affected users about an imported action (usually impossible after kicks/bans). | +| Lift-punishment buttons | Show one-click [Lift punishment](#lift-punishment) buttons on moderation log messages and in the actions view. Clicking asks for an optional reason. | +| Allow adding more proof images | Let moderators attach extra proof images to an existing case with the **Add proof** button or `/moderate add-proof`; the log message updates in place. | +| Allow linking involved users | Let moderators link extra [involved users](#involved-users) to a case; they are shown via the `%involved%` template placeholder. | +| Require a custom case title | Add a required short title field to each moderation action (e.g. "Insulting several users"). The title becomes the log embed's heading via `%title%`, and the case number moves to the footer. | + +### Moderation Levels {#configuration-modlevels} + +In this configuration file, you define your custom moderation levels. Open it in your [dashboard](https://scnx.app/glink?page=bot/configuration?file=moderation%7Cconfigs/modLevels). + +Each level is an entry that lists the roles it applies to and the capabilities those roles are granted. Create as many named levels as you like - for example a Trial Mod level with only warn and mute, and a dedicated anti-raid level with nothing but lockdown control. A member gets the combined capabilities of every level whose roles they hold. If you are upgrading, your old Moderator-Level 1-4 setup is migrated into equivalent levels automatically and keeps working exactly as before. + +| Field | Description | +| --------------------- | ------------------------------------------------------------------------------------------------------ | +| Level name | A name for this moderation level, shown only in the dashboard for your own reference. | +| Roles | Members holding any of these roles are granted this level's capabilities. | +| Warn members | Allows warning members and managing warning notes. | +| Mute members | Allows muting and unmuting members. | +| Lock channels | Allows locking and unlocking channels. | +| Channel-mute members | Allows channel-muting members and removing channel mutes. | +| Kick members | Allows kicking members from the server. | +| Clear messages | Allows bulk-clearing messages from channels. | +| Quarantine members | Allows quarantining and unquarantining members. | +| Ban members | Allows banning and unbanning members. | +| Bypass automod | Members of this level are exempt from anti-spam and message-protection filters. | +| Immune to reports | Members of this level cannot be reported by other users. | +| Speak during lockdown | Members of this level keep the ability to send messages when a lock-all is issued. | +| Immune to lockdown | Members of this level are fully exempt from server lockdowns, including channel permission overwrites. | ### Anti-Spam {#anti-spam} In this configuration file, you set up the anti-spam system. Open it in your [dashboard](https://scnx.app/glink?page=bot/configuration?file=moderation%7Cconfigs/antiSpam). -| Field | Description | -| ------------------------------------------------- | --------------------------------------------------------------------------------- | -| Enabled? | Enable or disable the anti-spam system. | -| Timeframe (in seconds) | Time window in which messages are tracked for spam detection. | -| Maximal count of messages in timeframe | Number of messages allowed in the timeframe before triggering anti-spam. | -| Maximal count of duplicated messages in timeframe | Number of identical messages allowed in the timeframe. | -| Maximal count of pings in timeframe | Number of pings (including replies) allowed in the timeframe. | -| Maximal count of mass-pings in timeframe | Number of mass pings (@everyone, @here, role pings) allowed in the timeframe. | -| Action | Action to take when spam is detected (mute, warn, kick, quarantine, or ban). | -| Send Chat-Message | If enabled, the bot sends a message in the channel when anti-spam is triggered. | -| Message | The message sent when anti-spam is triggered. Supports `%userid%` and `%reason%`. | -| Whitelisted Channels | Channels where anti-spam is disabled. | -| Whitelisted roles | Roles that are exempt from anti-spam detection. | +Anti-spam is split into individual detectors that you enable, tune, and act on separately. There is a set of shared settings and a default action, and then each detector can override the timeframe, action, and auto-delete behavior, and use its own notification message. + +#### Shared settings + +| Field | Description | +| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Enabled? | Enable or disable the whole anti-spam system. | +| Timeframe (in seconds) | Default time window in which messages are tracked for spam detection. Each detector can override this. | +| Action | Default action taken when a detector trips (warn, mute, kick, quarantine, or ban). Detectors set to "inherit" use this. | +| Automatically delete detected spam messages | Global default: also delete the messages that triggered a detection. Auto-delete cleans up the entire offending burst across every channel it landed in. Each detector can override this. | +| Send Chat-Message | If enabled, the bot posts a notification in the channel when a detector trips. | +| Message | The notification message. Supports `%userid%`, `%reason%`, `%type%` (detector label), `%count%`, `%threshold%`, `%timeframe%`, and `%action%`. | +| Whitelisted Channels | Channels where anti-spam is disabled. | +| Whitelisted roles | Roles that are exempt from anti-spam detection. | + +#### Per-detector fields + +Every detector shares the same set of options, on top of its own threshold field(s): + +| Field | Description | +| ---------------------------------- | ---------------------------------------------------------------------------------------------------- | +| Enable ... detection | Turn this specific detector on or off. | +| Timeframe override (in seconds) | Detection window for this detector; leave empty to use the global timeframe. | +| Action | Action for this detector; "Inherit default action" uses the global action, "No action" only deletes. | +| Action duration (only mute/ban) | Duration for a mute or ban (e.g. 1h, 7d); leave empty for the default duration. | +| Automatically delete spam messages | Override the global auto-delete default for this detector (inherit / on / off). | +| Notification override | A chat notification just for this detector; leave empty to fall back to the global **Message**. | + +The detectors and their threshold fields are: + +| Detector | Threshold field(s) | +| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Message Rate | **Maximal count of messages in timeframe** | +| Duplicate Content | **Maximal count of duplicated messages in timeframe** | +| User Mentions | **Maximal count of pings in timeframe** (also counts replies) | +| Mass Mentions | **Maximal count of mass-pings in timeframe** (@everyone, @here, role pings) | +| Attachment / Image Spam | **Max messages with attachments in timeframe** | +| Link Spam | **Max messages with links in timeframe** | +| Newline / Character Flood | **Max newlines per message** and **Max characters per message** (a single message crossing either limit trips it) | +| Sticker / Emoji Spam | **Max sticker/emoji messages in timeframe** and **Custom emojis that count as spammy** | +| Channel Spread | **Max distinct channels in timeframe** (the same user posting across many channels) | +| Text Abuse | **Offending messages before action**, plus per-check toggles: **Detect caps spam** (with minimum letters and uppercase percentage), **Detect repeated characters** (max run length), **Detect zalgo / unicode abuse** (combining-character percentage), and **Detect spoiler spam** (max blocks per message). | + +### New-member restrictions {#new-member-restrictions} + +These settings live in the [Anti-Spam configuration](https://scnx.app/glink?page=bot/configuration?file=moderation%7Cconfigs/antiSpam) under the New-Member Restrictions category. They require a minimum time on the server before new members may post attachments and/or links - a simple wall against throwaway accounts that join and immediately paste a scam link. Messages that break the rule are deleted with an optional notice, and repeat offenders can be escalated to a moderation action. + +| Field | Description | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| Enable new-member restrictions | Turn the new-member restrictions on or off. | +| Attachment restriction age | Members younger than this (e.g. 1d) cannot post attachments; leave empty to allow attachments. | +| Link restriction age | Members younger than this (e.g. 12h) cannot post links; leave empty to allow links. | +| Notify on violation | Send a short, auto-removed notice in the channel when a restricted message is deleted. | +| Notice message | The notice text. Supports `%userid%`, `%type%` (attachments or links), `%required%`, `%count%`, and `%threshold%`. | +| Violations before action | Number of violations within the timeframe that escalate to a moderation action; 0 never escalates. | +| Violation timeframe (in seconds) | Window over which violations are counted toward the threshold. | +| Action | Action for repeat violations; "inherit" uses the global anti-spam action. | +| Action duration (only mute/ban) | Duration for a mute or ban; leave empty for the default duration. | + +### Log Messages {#configuration-logmessages} + +In this configuration file, you customize the case-log messages posted to your moderation log channel and, optionally, a public log channel. Open it in your [dashboard](https://scnx.app/glink?page=bot/configuration?file=moderation%7Cconfigs/logMessages). + +Each action type has its own editable embed template, opened with the full embed editor: **Mute**, **Unmute**, **Quarantine**, **Unquarantine**, **Kick**, **Ban**, **Warn**, **Channel-mute**, **Channel-unmute**, **Unwarn**, and **Unban log message**. The embed color is always set automatically (yellow for temporary, green for reversals, red for base actions) and overrides any color in the template; the expiry, proof, and channel fields are appended automatically when they apply. + +Templates support these placeholders: + +| Placeholder | Meaning | +| ----------------------------------------------------- | --------------------------------------------------------------------------------------- | +| `%title%` | Custom case title, or the localized "Case #N" when none is set. | +| `%case%` | The case (action) ID number. | +| `%victim%` / `%victimId%` / `%victimAvatar%` | Name, user ID, and avatar of the affected member. | +| `%moderator%` / `%moderatorId%` / `%moderatorAvatar%` | Name, user ID, and avatar of the acting moderator. | +| `%action%` | Action label (tmp- prefixed for temporary actions). | +| `%reason%` | Reason for the action. | +| `%date%` | Formatted timestamp of when the action was taken. | +| `%expires%` / `%expiresAt%` | Formatted expiry, or a live countdown timestamp; empty when the action does not expire. | +| `%duration%` | Human-readable length of a temporary action, or empty. | +| `%channelName%` / `%channelMention%` | Name / mention of the related channel, or empty. | +| `%involved%` | Mentions of the extra users linked to this case, or empty when none. | + +#### Public logs + +Optionally mirror actions to a second, public channel with a separate, differently-worded message per action type - keep the detailed internal log private while sharing a friendlier notice with your community. + +| Field | Description | +| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Public log channel | Channel where public moderation logs are sent; leave empty to disable public logging. | +| Enable public logging | Master switch for the public log; when off, no public logs are sent regardless of per-type settings. | +| Include proof in public logs | When on, proof attachments are also shown in the public log (off by default so evidence is not exposed publicly). | +| Public log: mutes / unmutes / bans / unbans / kicks / quarantines | Per-action toggles for whether that action type is also logged publicly. | +| Public ... log message | The editable embed template used in the public channel for each enabled action type. Uses the same placeholders as above; automatic fields are never added to public messages. | ### Anti-Join-Raid {#anti-join-raid} @@ -246,14 +391,14 @@ In this configuration file, you set up the verification system for new members. #### Verification types -| Type | Description | -| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Image Captcha (default) | Users click a "Verify Me" button in the verification channel. An ephemeral message with a distorted captcha image is shown. They click "Enter Solution" to open a dialog where they type the answer. | -| Image Captcha (DM, legacy) | The original DM-based captcha flow. The bot sends a captcha image via DM and the user replies there. The verification channel doubles as a fallback for users with DMs disabled. | -| Word | Users click "Verify Me" and a dialog opens with a word they must retype. Difficulty controls word length and obscurity. | -| Math | Users click "Verify Me" and a dialog opens with an arithmetic problem to solve. Difficulty controls operand size and the operators used. | -| Manual | Users click "Verify Me" and their request is submitted for staff review. A moderator approves or denies them in the verification log channel. | -| Button | Users click "Verify Me" and are instantly verified. No challenge, no retries, no cooldowns - useful when you only want a one-click opt-in. | +| Type | Description | +| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Image Captcha (default) | Users click a "Verify Me" button in the verification channel. An ephemeral message with a distorted captcha image is shown. They click "Enter Solution" to open a dialog where they type the answer. | +| Image Captcha (DM, legacy) | The original DM-based captcha flow. The bot sends a captcha image via DM and the user replies there. The verification channel doubles as a fallback for users with DMs disabled. | +| Word | Users click "Verify Me" and a dialog opens with a word they must retype. Difficulty controls word length and obscurity. | +| Math | Users click "Verify Me" and a dialog opens with an arithmetic problem to solve. Difficulty controls operand size and the operators used. | +| Manual | When a member joins, they receive a DM explaining what happens next, and your staff instantly get an approval request with **Approve** / **Deny** buttons in the verification log channel - no waiting for the member to click anything first. | +| Button | Users click "Verify Me" and are instantly verified. No challenge, no retries, no cooldowns - useful when you only want a one-click opt-in. | #### Configuration @@ -262,7 +407,7 @@ In this configuration file, you set up the verification system for new members. | Enabled? | Enable or disable the verification system. | | Role for users with pending verification | Role assigned to users before they complete verification. | | Role for users that passed verification | Role assigned to users after successful verification. | -| Verification-Log | Channel where verification actions are logged. | +| Verification Log Channel | Channel where verification actions are logged and where manual approval requests appear. | | Type of verification | How new members verify. One of **Image Captcha** (in-channel image), **Image Captcha (DM)** (legacy, sent via DM), **Word** (retype a shown word), **Math** (solve an arithmetic problem), **Manual** (a moderator approves each member), or **Button** (one click, no challenge). | | Challenge difficulty | Difficulty of the verification challenge: easy, medium, or hard. Applies to Image Captcha, Image Captcha (DM), Word, and Math. Ignored for Manual and Button. | | Action on failure of verification | Action taken when a user exhausts all verification attempts: kick, quarantine, ban, or mute (timeout). | @@ -270,6 +415,7 @@ In this configuration file, you set up the verification system for new members. | Maximum verification attempts | How many attempts a user gets before the failure action is applied. Applies to Image Captcha, Image Captcha (DM), Word, and Math. Default: 3. | | Cooldown between retries | How long a user must wait between verification attempts (e.g., 5m, 10m). Default: 5m. | | Punishment duration | Duration for mute or quarantine punishment (e.g., 1h, 1d). Only applies when action on fail is mute or quarantine. Default: 1h. | +| Cooldown message | Message shown while a user is in the retry cooldown. | | Captcha-Message | Message shown with the captcha image. | | Manual-Verification-Message | Message sent to users awaiting manual verification. | | Captcha failed-Message | Message shown when a user fails verification. | @@ -282,7 +428,7 @@ When using Image Captcha, Image Captcha (DM), Word, or Math verification, users Manual verification has no retry counter (moderators re-review the request instead), and Button verification has nothing to fail. -The retry counter persists across bot restarts. If a user leaves and rejoins the server, their previous attempt count is preserved. +The retry counter persists across bot restarts. If a user leaves and rejoins the server, their previous attempt count is preserved. A pending manual request is cancelled when a member leaves, and the matching approve/deny log message is disarmed, so a rejoining member is not locked out by a stale request. ### Lockdown {#configuration-lockdown} @@ -305,38 +451,40 @@ In this configuration file, you set up the server-wide lockdown system. Open it In this configuration file, you can customize all messages sent by the module. Open it in your [dashboard](https://scnx.app/glink?page=bot/configuration?file=moderation%7Cconfigs/strings). -| Field | Description | -| ---------------------------- | --------------------------------------------------------------------------------------- | -| No permissions message | Message shown when a moderator lacks the required level. Supports `%required_level%`. | -| User not found message | Message shown when a provided user ID is invalid. | -| Missing reason message | Message shown when a reason is required but not provided. | -| Moderator protection message | Message shown when a moderator tries to act on another moderator. | -| Submitted report message | Confirmation sent to users after submitting a report. Supports `%user%` and `%mURL%`. | -| Mute message | DM sent to muted users. Supports `%user%` and `%reason%`. | -| Channel mute message | DM sent to channel-muted users. Supports `%user%`, `%reason%`, and `%channel%`. | -| Remove channel mute message | DM sent when a channel mute is removed. Supports `%user%`, `%reason%`, and `%channel%`. | -| Temporary mute message | DM sent to temporarily muted users. Supports `%user%`, `%reason%`, and `%date%`. | -| Quarantine message | DM sent to quarantined users. Supports `%user%` and `%reason%`. | -| Temporary quarantine message | DM sent to temporarily quarantined users. Supports `%user%`, `%reason%`, and `%date%`. | -| Unquarantine message | DM sent when quarantine is removed. Supports `%user%` and `%reason%`. | -| Unmute message | DM sent to unmuted users. Supports `%user%` and `%reason%`. | -| Kick message | DM sent to kicked users. Supports `%user%` and `%reason%`. | -| Ban message | DM sent to banned users. Supports `%user%` and `%reason%`. | -| Temporary ban message | DM sent to temporarily banned users. Supports `%user%`, `%reason%`, and `%date%`. | -| Warn message | DM sent to warned users. Supports `%user%` and `%reason%`. | -| Lock channel message | Message sent in a channel when it is locked. Supports `%user%` and `%reason%`. | -| Unlock channel message | Message sent in a channel when it is unlocked. Supports `%user%`. | +| Field | Description | +| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Permissions | Message shown when a moderator lacks the required capability. Supports `%required_level%`. | +| User Not Found | Message shown when a provided user ID is invalid. | +| Missing Reason | Message shown when a reason is required but not provided. | +| Target Is a Moderator | Message shown when a moderator tries to act on another moderator. | +| Report Submitted | Confirmation sent to users after submitting a report. Supports `%user%` and `%mURL%`. | +| Mute Message | DM sent to muted users. Supports `%user%` and `%reason%`. | +| Channel Mute Message | DM sent to channel-muted users. Supports `%user%`, `%reason%`, and `%channel%`. | +| Channel Unmute Message | DM sent when a channel mute is removed. Supports `%user%`, `%reason%`, and `%channel%`. | +| Temporary Mute Message | DM sent to temporarily muted users. Supports `%user%`, `%reason%`, and `%date%`. | +| Quarantine Message | DM sent to quarantined users. Supports `%user%` and `%reason%`. | +| Temporary Quarantine Message | DM sent to temporarily quarantined users. Supports `%user%`, `%reason%`, and `%date%`. | +| Unquarantine Message | DM sent when quarantine is removed. Supports `%user%` and `%reason%`. | +| Unmute Message | DM sent to unmuted users. Supports `%user%` and `%reason%`. | +| Kick Message | DM sent to kicked users. Supports `%user%` and `%reason%`. | +| Ban Message | DM sent to banned users. Supports `%user%` and `%reason%`. | +| Temporary Ban Message | DM sent to temporarily banned users. Supports `%user%`, `%reason%`, and `%date%`. | +| Warn Message | DM sent to warned users. Supports `%user%` and `%reason%`. | +| Duration Changed Message | DM sent when a moderator [edits how long](#edit-duration) a temporary punishment lasts. Supports `%user%`, `%reason%`, and `%date%` (the new expiry). | +| Channel Lock Message | Message sent in a channel when it is locked. Supports `%user%` and `%reason%`. | +| Channel Unlock Message | Message sent in a channel when it is unlocked. Supports `%user%`. | ## Troubleshooting {#troubleshooting} -- **The bot says the moderator does not have permissions**: Make sure the moderator's role is assigned to the correct moderator level in the configuration. Level 1 can only warn; higher-level actions require higher levels. +- **The bot says the moderator does not have permissions**: Make sure the moderator's role is assigned to a [moderation level](#configuration-modlevels) that grants the action's capability. A level that only has "Warn members" cannot mute, kick, or ban. - **The quarantine command does not work**: Ensure the quarantine role is configured and that the bot's role is above the quarantine role in the role hierarchy. The bot needs "Manage Roles" permission. - **Bans/kicks fail**: The bot needs "Ban Members" and "Kick Members" permissions. The bot's highest role must also be above the target user's highest role. -- **Anti-spam is not detecting spam**: Verify that anti-spam is enabled and that the channel is not in the whitelisted channels list. Also check that the user does not have a whitelisted role. +- **Anti-spam is not detecting spam**: Verify that anti-spam is enabled overall, that the specific detector you expect (for example Link Spam or Text Abuse) is turned on, and that the channel is not whitelisted. Also check that the user's role is not whitelisted or granted "Bypass automod". - **Invite/scam link detection is not working**: Ensure the "Action on invite" or "Action on Scam-Link" is set to something other than "none". Check that the channel is not whitelisted. - **Verification DMs fail**: Some users have DMs disabled. If you set up a "Restart Verification-Channel", users can retry their verification after enabling DMs. - **Lockdown command is not available**: The lockdown system must be enabled in the [Lockdown Configuration](#configuration-lockdown) before the `/moderate lockdown` command appears. -- **Anti-grief quarantined a moderator**: This is the intended behavior when a moderator exceeds the configured limits. Review and adjust the limits if needed. Note that anti-grief currently only tracks actions performed through the moderation module, not native Discord actions. +- **Native Discord actions are not being logged**: Enable "Import native moderation actions" (and the per-type toggles), and make sure the bot has the "View Audit Log" permission. Only live actions are recorded. +- **Anti-grief quarantined a moderator**: This is the intended behavior when a moderator exceeds the configured limits. Review and adjust the limits if needed. Note that anti-grief only counts actions performed through the moderation module; abuse committed with Discord's own tools does not trip it, even though those actions can be recorded via [native moderation import](#native-import). ## Stored data {#data-usage} @@ -344,7 +492,10 @@ The following data is being stored for moderation actions: - The user ID of the victim and the moderator - The type of action (warn, mute, kick, ban, quarantine, etc.) -- The reason for the action +- The reason and, when enabled, the custom case title +- Any linked involved-user IDs (reference-only) +- Proof image references archived to the file library +- Case events such as reason edits and duration changes - Additional data (such as saved roles for quarantine) - The expiration date (for temporary actions) - Metadata about the entry (date when created and last updated) diff --git a/docs/custom-bot/modules/support/applications.md b/docs/custom-bot/modules/support/applications.md index 9086b1de..5a24e588 100644 --- a/docs/custom-bot/modules/support/applications.md +++ b/docs/custom-bot/modules/support/applications.md @@ -29,8 +29,9 @@ Let users apply for staff positions, partnerships, and more - with customizable - Users can apply using `/apply` and selecting a category, or by using the drop-down menu in the info channel (if configured). - The bot sends the first question to the user via DM. The user responds with a message, and the bot sends the next question. This continues until all questions are answered. - Users can cancel their application at any time by sending `!cancel` during the DM process. +- An application session is only cleaned up after 30 minutes of inactivity. The timer resets with every answer, so long applications no longer time out mid-flow - only genuinely abandoned sessions are cleaned up. When a session does time out, the bot DMs the user to let them know the application timed out and that they can start over with `/apply`. - Once all questions are answered, the application is submitted. The applicant receives a confirmation message with a link to their submitted answers, and a notification is sent to the configured notification channel. -- In the notification channel, staff members can view the application and click "Approve" or "Deny" buttons. They can optionally provide a reason. +- In the notification channel, staff members can view the application and click "Approve" or "Deny" buttons. They can optionally provide a reason. Once an application is processed, that application's own Approve and Deny buttons are disabled. - The applicant is notified via DM about the approval or denial, including the reason if one was provided. - If roles are configured for the category, approved applicants automatically receive those roles. - Users cannot submit a new application while they have a pending one. If a cooldown is configured, users must also wait the specified duration between submissions. diff --git a/docs/custom-bot/modules/support/tickets.md b/docs/custom-bot/modules/support/tickets.md index c08b41d7..01e0be36 100644 --- a/docs/custom-bot/modules/support/tickets.md +++ b/docs/custom-bot/modules/support/tickets.md @@ -15,6 +15,7 @@ only ( (Only visible if "Send user DM when ticket gets closed" is enabled.
This message will be sent to the user when their ticket gets closed. You can include a link to the ticket transcript. | -| Ticket-Created Message | This message will be sent into new tickets when they get created. A button to close the ticket will be added below this message. | -| Ticket create button | This will be the content of the button below the ticket creation message and will open a new ticket when clicked. | -| Ticket close button | This will be the content of the button below the ticket created message and will close the ticket when clicked. | +| Field | Description | +| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Name of the ticket category. This will be displayed to users and staff members. | +| Ticket create category | New ticket channels will be created in this category on your Discord when a user opens a new ticket. | +| Ticket create channel | The ticket creation message will be sent into this channel. Users will be able to open a ticket in this category by clicking on a button below the message sent into this channel. | +| Ticket roles | These roles will be pinged when a new ticket gets opened in this category and these roles will be given access to ticket channels. | +| Copy category permissions | If enabled, the permission overwrites from the "Ticket create category" are copied to the new ticket channel when a ticket is opened (`@everyone` stays denied). Off by default. Later changes to the category are not applied automatically. | +| Log channel | The transcript of closed channels will be sent into this channel. | +| Ticket create message | This message will be sent in the "Ticket create channel" and users will be able to open a ticket in this category by clicking on a button below this message. | +| Send user DM when ticket gets closed | If enabled, users will be sent a DM when their ticket gets closed. | +| User DM | Only visible if "Send user DM when ticket gets closed" is enabled.
This message will be sent to the user when their ticket gets closed. You can include a link to the ticket transcript. | +| Ticket-Created Message | This message will be sent into new tickets when they get created. A button to close the ticket will be added below this message. | +| Ticket create button | This will be the content of the button below the ticket creation message and will open a new ticket when clicked. | +| Ticket close button | This will be the content of the button below the ticket created message and will close the ticket when clicked. | ## Troubleshooting {#troubleshooting} diff --git a/docs/custom-bot/modules/tools/name-list-cleaner.md b/docs/custom-bot/modules/tools/name-list-cleaner.md index 8ec67696..9aedfd19 100644 --- a/docs/custom-bot/modules/tools/name-list-cleaner.md +++ b/docs/custom-bot/modules/tools/name-list-cleaner.md @@ -40,13 +40,13 @@ The bot cannot change the nickname of the server owner. This is a Discord limita In this configuration file, you can configure the module. Open it in your [dashboard](https://scnx.app/glink?page=bot/configuration?file=name-list-cleaner%7Cconfigs/config). -| Field | Description | -| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Keep Nickname | Legacy option. Previously, disabling this fully reset the nickname to the username when a disallowed character was found. Under the new central nickname system the cleaner always sanitizes the base name in place, so this toggle no longer changes the resulting nickname. Decorations from other modules (role prefix, streak suffix, AFK marker, ...) are preserved on top either way. | -| Symbol Whitelist | A list of characters that are allowed (whitelist mode) or blocked (blacklist mode) at the start of names. If empty, all non-alphanumeric characters are removed. | -| Is Blacklist | If enabled, the character list is treated as a blacklist (listed characters are blocked). If disabled, the list is treated as a whitelist (only listed characters and alphanumeric characters are allowed). | -| User Whitelist | Users that are exempt from name cleaning. Their nicknames will not be modified. | -| Also check usernames | If enabled, usernames are also checked for special characters in addition to nicknames. | +| Field | Description | +| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Keep Nickname | Legacy option. Previously, disabling this fully reset the nickname to the username when a disallowed character was found. Under the new central nickname system the cleaner always sanitizes the base name in place, so this toggle no longer changes the resulting nickname. Decorations from other modules (role prefix, streak suffix, AFK marker, ...) are preserved on top either way. | +| Character Whitelist/Blacklist | A list of characters that are allowed (whitelist mode) or blocked (blacklist mode) at the start of names. If empty, all non-alphanumeric characters are removed. | +| Use blacklist instead of whitelist | If enabled, the character list is treated as a blacklist (listed characters are blocked). If disabled, the list is treated as a whitelist (only listed characters and alphanumeric characters are allowed). | +| User Whitelist | Users that are exempt from name cleaning. Their nicknames will not be modified. | +| Also check usernames | If enabled, usernames are also checked for special characters in addition to nicknames. | ## Troubleshooting {#troubleshooting} diff --git a/docs/scnx-api/reference/message-schema-v4.md b/docs/scnx-api/reference/message-schema-v4.md index 1f91fed8..a49cf158 100644 --- a/docs/scnx-api/reference/message-schema-v4.md +++ b/docs/scnx-api/reference/message-schema-v4.md @@ -367,6 +367,46 @@ Triggers a custom command when clicked. **Guild-specific** - not recommended for | `type` | string | `"customCommandButton"` | | `id` | string | The custom command's button click ID. | +#### Flow Button {#flow-button} + +Starts a flow (a custom command built in the flow editor) when clicked. **Guild-specific** - not recommended for shared +content. + +```json +{ + "type": 2, + "style": 1, + "label": "Open a ticket", + "scnx_action": { + "type": "flowButton", + "flowId": "cf2cf39f-8e65-441c-9abd-6764357abb67", + "state": "open" + } +} +``` + +| `scnx_action` field | Type | Description | +| ------------------- | ------ | --------------------------------------------------------------------------------------------------------- | +| `type` | string | `"flowButton"` | +| `flowId` | string | ID of the flow to start when clicked. | +| `state` | string | Optional. A short state string handed to the flow (readable from the button's trigger). Max 80 characters. | + +:::note Reserved +`flowWaitButton` (`{ "type": "flowWaitButton", "flowId": "..." }`) - a button that resolves a mid-flow wait - is +reserved and ships with the flow executor milestone. Do not emit it yet. +::: + +#### How Flow Custom IDs Are Generated {#flow-custom-id} + +At send time SCNX derives each flow component's Discord `custom_id` from its `scnx_action`: + +| Action | Generated `custom_id` | +| ----------------------------------- | ------------------------------ | +| `flowButton` without `state` | `ccv3:` | +| `flowButton` with `state` `s` | `ccv3::` | +| a raw custom id with no flow target | `` verbatim | +| `flowWaitButton` (reserved) | `ccv3w::` | + #### Button Fields {#button-fields} | Field | Type | Required | Description | @@ -447,15 +487,45 @@ Each option triggers a custom command. **Guild-specific** - not recommended for } ``` +#### Flow Dropdown {#flow-dropdown} + +Starts a flow when an option is chosen. **Guild-specific** - not recommended for shared content. + +```json +{ + "type": 3, + "placeholder": "Choose an action", + "scnx_action": { + "type": "flowElement", + "flowId": "cf2cf39f-8e65-441c-9abd-6764357abb67" + }, + "options": [ + { + "label": "Open a ticket", + "value": "open" + }, + { + "label": "Close a ticket", + "value": "close" + } + ] +} +``` + +| `scnx_action` field | Type | Description | +| ------------------- | ------ | ------------------------------------------------- | +| `type` | string | `"flowElement"` | +| `flowId` | string | ID of the flow to start when an option is chosen. | + #### String Select Fields {#string-select-fields} -| Field | Type | Required | Description | -| ------------- | ------- | -------- | ----------------------------------------------------------------------------------- | -| `placeholder` | string | No | Text shown when nothing is selected. Max 150 characters. | -| `min_values` | integer | No | Minimum selections required (Self-Role only). Default: `0`. | -| `max_values` | integer | No | Maximum selections allowed (Self-Role only). Default: number of options, max: `25`. | -| `scnx_action` | object | Yes | `{ "type": "roleElement" }` or `{ "type": "customCommandElement" }`. | -| `options` | array | Yes | 1–25 options. | +| Field | Type | Required | Description | +| ------------- | ------- | -------- | --------------------------------------------------------------------------------------- | +| `placeholder` | string | No | Text shown when nothing is selected. Max 150 characters. | +| `min_values` | integer | No | Minimum selections required (Self-Role only). Default: `0`. | +| `max_values` | integer | No | Maximum selections allowed (Self-Role only). Default: number of options, max: `25`. | +| `scnx_action` | object | Yes | `{ "type": "roleElement" }`, `{ "type": "customCommandElement" }`, or `{ "type": "flowElement" }`. | +| `options` | array | Yes | 1–25 options. | #### Option Fields {#option-fields} @@ -481,8 +551,10 @@ will not work: | Disabled Button | Yes | | Self-Role Button | No - role IDs are server-specific | | Custom Command Button | No - command IDs are server-specific | +| Flow Button | No - flow IDs are server-specific | | Self-Role Dropdown | No - role IDs are server-specific | | Custom Command Dropdown | No - command IDs are server-specific | +| Flow Dropdown | No - flow IDs are server-specific | Stick to **text, images, containers, and link buttons** for content you plan to share. diff --git a/i18n/de/docusaurus-plugin-content-docs/current.json b/i18n/de/docusaurus-plugin-content-docs/current.json index 7567bdad..f5670b17 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current.json +++ b/i18n/de/docusaurus-plugin-content-docs/current.json @@ -191,6 +191,10 @@ "message": "Eigene Befehle", "description": "The label for the doc item 'Custom Commands' in sidebar 'customBotSidebar', linking to the doc custom-bot/custom-commands" }, + "sidebar.customBotSidebar.doc.Commands": { + "message": "Befehle", + "description": "The label for the doc item 'Commands' in sidebar 'customBotSidebar', linking to the doc custom-bot/commands" + }, "sidebar.customBotSidebar.doc.Send messages / embeds, Self-Roles & more": { "message": "Versende Nachrichten / Embeds, Self-Rollen & mehr", "description": "The label for the doc item 'Send messages / embeds, Self-Roles & more' in sidebar 'customBotSidebar', linking to the doc custom-bot/login-as-bot" diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/commands.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/commands.md new file mode 100644 index 00000000..cab8f549 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/commands.md @@ -0,0 +1,124 @@ +# Befehle + +Schalte die integrierten Befehle deiner aktivierten Module ein oder aus und benenne die Kontextmenü-Befehle (Rechtsklick) um, die deine Mitglieder sehen - alles direkt aus dem SCNX-Dashboard. + +## Übersicht {#overview} + +Die Seite **Befehle** listet jeden Befehl auf, den die aktuell aktivierten Module bereitstellen, und lässt dich entscheiden, welche davon bei Discord registriert werden. Befehle sind nach Typ in drei Reitern gruppiert: + +- **Slash** - die `/befehl`-Einträge, die Mitglieder in das Chatfeld eingeben. +- **Nutzer** - Kontextmenü-Befehle, die angezeigt werden, wenn du mit der rechten Maustaste auf ein Mitglied klickst (Apps-Untermenü). +- **Nachricht** - Kontextmenü-Befehle, die angezeigt werden, wenn du mit der rechten Maustaste auf eine Nachricht klickst (Apps-Untermenü). + +Für jeden Befehl kannst du ihn aktivieren oder deaktivieren. Bei **Nutzer**- und **Nachricht**-Befehlen kannst du zusätzlich eine eigene Bezeichnung festlegen - den Text, den Discord im Apps-Menü anzeigt. Eine Live-Vorschau bildet das Apps-Flyout von Discord nach, damit du siehst, wie die Nutzer- und Nachrichten-Menüs aussehen werden, bevor du speicherst. + +Hier erscheinen nur Befehle aus **aktivierten** Modulen. Aktiviere zuerst ein Modul, falls der gesuchte Befehl fehlt. + +:::info +Diese Seite verwaltet die Befehle, die mit den Modulen des Bots ausgeliefert werden. Sie unterscheidet sich von den beiden benachbarten Seiten: + +- [Slashcommands & Berechtigungen](/de/docs/custom-bot/slash-commands) - die eigenen Berechtigungssteuerungen von Discord pro Befehl (welche Rollen, Nutzer und Kanäle einen Befehl ausführen dürfen). Diese werden in deinen Discord-Servereinstellungen konfiguriert, nicht hier. +- [Eigene Befehle](/de/docs/custom-bot/custom-commands) - erstelle deine eigenen Befehle von Grund auf mit dem visuellen Flow-Editor. + +Nutze die Seite Befehle, um integrierte Modulbefehle ein- oder auszuschalten und Kontextmenü-Einträge umzubenennen; nutze die beiden anderen Seiten für Berechtigungen und zum Erstellen eigener Befehle. +::: + +## Slash-, Nutzer- und Nachricht-Befehle {#types} + +Discord unterstützt drei Befehlstypen, und die Seite hält sie in getrennten Reitern, weil jeder eigene Regeln und ein eigenes Budget hat. + +| Typ | Wo Mitglieder ihn finden | Kann hier umbenannt werden | Standardmäßig aktiviert | +| ------------- | -------------------------------------------- | -------------------------- | ----------------------- | +| **Slash** | Als `/befehl` in das Nachrichtenfeld getippt | Nein | Ja | +| **Nutzer** | Rechtsklick auf ein Mitglied → **Apps** | Ja (eigene Bezeichnung) | Nein | +| **Nachricht** | Rechtsklick auf eine Nachricht → **Apps** | Ja (eigene Bezeichnung) | Nein | + +Jeder Reiter zeigt einen Budget-Zähler (verwendet / Limit), damit du auf einen Blick siehst, wie viel des Discord-Kontingents pro Typ du bereits verbraucht hast. + +## Aktivieren und Deaktivieren {#enable-disable} + +Nutze den Schalter in jeder Befehlszeile, um ihn zu aktivieren oder zu deaktivieren. + +Die Standardwerte unterscheiden sich je nach Typ: + +- **Slash-Befehle sind standardmäßig aktiviert.** Ein Slash-Befehl, den du nie angerührt hast, ist bei Discord registriert. Deaktiviere ihn hier, um ihn zu entfernen. +- **Nutzer- und Nachricht-Befehle sind standardmäßig deaktiviert.** Kontextmenü-Befehle sind optional - sie erscheinen erst in Discord, wenn du sie hier aktivierst. + +Jeder Befehl gehört zu einem Modul und ist unter dem Abschnitt dieses Moduls gruppiert. Wenn du ein ganzes Modul (auf der eigenen Seite des Moduls) deaktivierst, werden alle seine Befehle von dieser Seite entfernt. + +## Kontextmenü-Befehle umbenennen {#renaming} + +Nutzer- und Nachricht-Befehlen kann eine **eigene Bezeichnung** gegeben werden - der Text, den Mitglieder im Apps-Menü von Discord sehen. Slash-Befehle können hier nicht umbenannt werden (ihre Namen folgen den eigenen Regeln von Discord und werden mit dem Modul verwaltet). + +- Tippe deine bevorzugte Bezeichnung in das Umbenennungsfeld des Befehls. Lass es leer, um auf den Standardnamen des Befehls zurückzufallen. +- Bezeichnungen sind auf **32 Zeichen** begrenzt (ein Discord-Limit). Die Seite markiert jede zu lange Bezeichnung und blockiert das Speichern, bis du sie kürzt. +- Die Live-Apps-Vorschau aktualisiert sich beim Tippen, sodass du die Formulierung vor dem Speichern bestätigen kannst. + +## Limits {#limits} + +Discord erzwingt ein festes Budget pro Befehlstyp. Die Seite erzwingt dieselben Limits und lässt dich keine Auswahl speichern, die sie überschreitet: + +| Typ | Maximal aktivierte Befehle | +| --------- | -------------------------- | +| Slash | 100 | +| Nutzer | 15 | +| Nachricht | 15 | + +Zusätzliche Regeln: + +- **Länge der Kontextmenü-Bezeichnung:** eigene Nutzer-/Nachricht-Bezeichnungen dürfen höchstens **32 Zeichen** lang sein. +- **Namenskollisionen:** zwei aktivierte Befehle **desselben Typs**, deren aufgelöste Bezeichnungen (eigene Bezeichnung oder der Standardname, falls keine eigene Bezeichnung gesetzt ist) beim Vergleich ohne Beachtung der Groß-/Kleinschreibung identisch sind, kollidieren. Die Seite markiert die Kollision und blockiert das Speichern, bis du einen davon umbenennst oder deaktivierst. `Report` und `report` zählen als derselbe Name. + +Wird eine dieser Regeln verletzt, zeigt die Seite den Grund an und deaktiviert das Speichern, bis er behoben ist. + +## Speichern und mit Discord synchronisieren {#saving} + +Deine Befehlsauswahl wird wie jede andere Modulkonfiguration gespeichert und über den normalen Konfigurations-Speicherpfad geschrieben - nutze die Aktion **Speichern** genauso, wie du es auf jeder Konfigurationsseite tun würdest. Es gibt keinen separaten Absende-Schritt. + +Nach dem Speichern aktualisiert der Bot die bei Discord registrierten Befehle so, dass sie deiner Auswahl entsprechen. + +:::info Befehlssynchronisierung +Wie bei allen Befehlsänderungen kann es einige Zeit dauern, bis Aktualisierungen in Discord erscheinen - neu aktivierte Befehle können eine Weile brauchen, um aufzutauchen, und entfernte eine Weile, um zu verschwinden. Dies ist eine Verzögerung bei der Verbreitung auf Discord-Seite, dasselbe Verhalten, das in der Anleitung [Slashcommands & Berechtigungen](/de/docs/custom-bot/slash-commands#command-synchronization) beschrieben wird. Gib ihm etwas Zeit, bevor du annimmst, dass etwas nicht stimmt. +::: + +## Fehlerbehebung {#troubleshooting} + +
+ Ein Befehl, den ich erwartet habe, wird nicht aufgelistet +
    +
  • Die Seite listet nur Befehle aus aktivierten Modulen auf. Aktiviere zuerst das zugehörige Modul.
  • +
  • Stelle sicher, dass dein Bot online ist und seinen Befehlskatalog synchronisiert hat.
  • +
+
+ +
+ Ich kann meine Änderungen nicht speichern +
    +
  • Überprüfe die Warnung oben in der Liste - sie nennt, was zu beheben ist.
  • +
  • Du hast möglicherweise ein Budget pro Typ überschritten (Slash 100, Nutzer 15, Nachricht 15). Deaktiviere einige Befehle dieses Typs.
  • +
  • Zwei aktivierte Befehle desselben Typs teilen sich möglicherweise einen Namen (ohne Beachtung der Groß-/Kleinschreibung). Benenne einen davon um oder deaktiviere ihn.
  • +
  • Eine eigene Kontextmenü-Bezeichnung ist möglicherweise länger als 32 Zeichen. Kürze sie.
  • +
+
+ +
+ Ein Rechtsklick-Befehl (Nutzer / Nachricht) erscheint nicht in Discord +
    +
  • Kontextmenü-Befehle sind standardmäßig deaktiviert - aktiviere sie zuerst auf dieser Seite.
  • +
  • Befehlsänderungen können einige Zeit brauchen, um sich zu Discord zu verbreiten. Warte eine Weile und versuche es erneut.
  • +
  • Bestätige, dass du deine Änderungen gespeichert hast.
  • +
+
+ +
+ Mein umbenannter Befehl zeigt weiterhin den alten Namen +
    +
  • Speichere deine Änderungen und gib Discord dann Zeit, die neue Bezeichnung zu synchronisieren.
  • +
  • Überprüfe, dass die Bezeichnung nicht mit einem anderen aktivierten Befehl desselben Typs kollidiert.
  • +
+
+ +## Verwandte Seiten {#related} + +- [Slashcommands & Berechtigungen](/de/docs/custom-bot/slash-commands) - steuere mit dem nativen Berechtigungssystem von Discord, wer Befehle ausführen darf. +- [Eigene Befehle](/de/docs/custom-bot/custom-commands) - erstelle deine eigenen Befehle mit dem visuellen Flow-Editor. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/login-as-bot.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/login-as-bot.md index 50b67fa9..ca4af9a9 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/login-as-bot.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/login-as-bot.md @@ -1,6 +1,6 @@ # Versende Nachrichten / Embeds, Self-Rollen und mehr -Sende Nachrichten, Embeds und Forenposts über deinen Bot – direkt aus dem SCNX-Dashboard. Du kannst diese Funktion auch nutzen, um Selbst-Rollen-Nachrichten mit Knöpfen zu erstellen. +Sende Nachrichten, Embeds und Forenposts über deinen Bot - direkt aus dem SCNX-Dashboard. Du kannst diese Funktion auch nutzen, um Selbst-Rollen-Nachrichten mit Knöpfen zu erstellen. @@ -40,6 +40,74 @@ Falls dein Bot offline ist oder kritische Probleme aufweist, kannst du Als Bot a Nutze die Vorschau im Nachrichten-Editor, um zu sehen, wie deine Nachricht vor dem Absenden aussehen wird. ::: +## Nachrichten planen {#scheduling} + +Anstatt eine Nachricht sofort zu senden, kannst du sie so planen, dass sie zu einem späteren Zeitpunkt in einem Kanal +gepostet wird - und sie optional in einem festen Rhythmus wiederholen lassen, bis du sie abbrichst. Geplante Nachrichten +werden von deinem Bot verwaltet, du musst also das Dashboard nicht geöffnet halten, und ausstehende Nachrichten +überstehen Bot-Neustarts. + +### Eine Nachricht planen {#schedule-message} + +1. Öffne die Seite [Als Bot anmelden](https://scnx.app/glink?page=bot/login). +2. Wähle den Kanal aus, in den die Nachricht gepostet werden soll. +3. Verfasse deine Nachricht mit dem [Nachrichten-Editor](/de/docs/scnx/guilds/message-editor), genau wie bei einer normalen Nachricht. +4. Wähle eine Sendezeit in der Zukunft und optional eine Wiederholung. +5. Speichere die geplante Nachricht. + +Die Sendezeit wird in der konfigurierten Zeitzone deines Bots interpretiert - derselben Zeitzone, die auch überall +sonst verwendet wird. Die Uhrzeit muss in der Zukunft liegen. + +### Wiederkehrende Nachrichten {#recurring} + +Eine geplante Nachricht kann sich in einem **täglichen**, **wöchentlichen** oder **monatlichen** Rhythmus wiederholen: + +- **Täglich** - jeden Tag zur selben Uhrzeit. +- **Wöchentlich** - alle 7 Tage, am selben Wochentag und zur selben Uhrzeit. +- **Monatlich** - am selben Tag des Monats. + +Wiederkehrende Nachrichten laufen, bis du sie abbrichst - es gibt kein Enddatum und keine maximale Anzahl. Nach +jedem Senden bereitet der Bot das nächste Auftreten vor, und er bereitet es auch beim Start erneut vor, sodass ein +Bot-Neustart die Serie nie unterbricht. + +Bei monatlichen Nachrichten ist der Sendetag am Tag des Monats des ersten Auftretens verankert. In kürzeren Monaten +wird dieser Tag auf den letzten Tag des Monats begrenzt und danach wieder ausgeweitet - eine Nachricht, die zum +Beispiel auf den 31. verankert ist, wird am 31. Jan., 28. Feb., 31. März, 30. Apr. usw. ausgelöst. + +### Bearbeiten, Abbrechen und Auflisten {#manage-scheduled} + +- **Auflisten** - das Dashboard zeigt deine ausstehenden geplanten Nachrichten an, jeweils mit ihrer nächsten + Sendezeit und, bei wiederkehrenden Nachrichten, ihrem Rhythmus. +- **Bearbeiten** - du kannst den Inhalt, die Sendezeit oder die Wiederholung einer ausstehenden geplanten Nachricht + ändern. Eine wiederkehrende Nachricht wieder in eine Einmal-Nachricht umzuwandeln oder umgekehrt wird unterstützt. +- **Abbrechen** - beim Abbrechen wird die geplante Nachricht entfernt. Das Abbrechen einer wiederkehrenden Nachricht + stoppt die gesamte Serie. + +### Verpasste und fehlgeschlagene Auftreten {#reliability} + +- **Verpasste Ausführungen überspringen** - falls dein Bot offline ist, wenn ein Auftreten fällig wäre, wird dieses + Auftreten übersprungen statt verspätet gesendet. Die Serie wird beim nächsten zukünftigen Zeitpunkt fortgesetzt. +- **Selbstheilende Fehlschläge** - falls ein Auftreten nicht gesendet werden kann (zum Beispiel, weil der Kanal + gelöscht wurde oder der Bot den Zugriff verloren hat), versucht die Serie es weiterhin im normalen Rhythmus, stoppt + sich aber nach **5 aufeinanderfolgenden fehlgeschlagenen Auftreten** selbst. Ein einziges erfolgreiches Senden setzt + diesen Zähler zurück. + +### Limits für ausstehende Nachrichten {#scheduling-limits} + +Die Anzahl der **ausstehenden** geplanten Nachrichten, die du gleichzeitig haben kannst, ist pro Tarif begrenzt. Eine +wiederkehrende Serie zählt als eine einzige ausstehende Nachricht, und gesendete, abgebrochene oder gestoppte +Nachrichten zählen nicht zum Limit. + +| Tarif | Max. ausstehende geplante Nachrichten | +| ------------------------- | ------------------------------------- | +| STARTER | 2 | +| ACTIVE_GUILD | 10 | +| UNLIMITED / PRO | 25 | +| PROFESSIONAL / ENTERPRISE | 50 | + +Wenn du das Limit deines Tarifs erreicht hast, wird das Planen einer neuen Nachricht abgelehnt und nichts erstellt - +brich eine ausstehende Nachricht ab oder warte, bis sie gesendet wurde, um einen Platz freizugeben. + ## Eine Nachricht bearbeiten {#edit-message} Du kannst Nachrichten bearbeiten, die zuvor von deinem Bot gesendet wurden (einschließlich Nachrichten, die über den Als Bot anmelden gesendet wurden). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/administration/welcomer.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/administration/welcomer.md index 51b282cd..10042b2e 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/administration/welcomer.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/administration/welcomer.md @@ -146,13 +146,13 @@ Jeder Kanal hat die folgenden Konfigurationsoptionen: Diese Konfigurationsdatei erlaubt es dir, [Willkommen- und Boost-Rollen einzurichten](#setup-join-roles) und andere grundlegende Funktionen dieses Moduls zu konfigurieren. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=welcomer%7Cconfigs%2Fconfig). -| Feld | Beschreibung | -| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Nutzern Rollen beim Beitreten geben | Diese Rollen werden Mitgliedern gegeben, die deinem Server beitreten. Das wird nicht rückwirkend angewandt, nutze dafür das [Massrole-Modul](/docs/custom-bot/modules/tools/massrole). | -| Bots ignorieren? | Wenn aktiviert (und das ist sehr empfehlenswert), werden keine Willkommens- und Verlassensnachrichten verschickt, wenn das Mitglied ein Bot ist. | -| Zusätzliche Rollen beim Boost geben | Diese Rollen werden einem Mitglied zusätzlich zu der von Discord vergebenen Boost-Rolle gegeben, wenn es deinen Server boostet. Die Rollen werden entfernt, wenn das Mitglied all seine Boosts entfernt. | -| Beitritts-Rollen als Basis-Rollen behandeln | Wenn aktiviert, stellt der Bot sicher, dass jedes reguläre Mitglied alle konfigurierten Beitritts-Rollen besitzt - durch reaktive erneute Vergabe und einen täglichen Abgleich. Details und Ausnahmen unter [Beitritts-Rollen als Basis-Rollen behandeln](#base-roles). | -| Willkommensnachricht löschen | Wenn aktiviert werden Willkommensnachrichten automatisch gelöscht, wenn das Mitglied deinen Server innerhalb von sieben Tagen wieder verlässt. | +| Feld | Beschreibung | +| ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Nutzern Rollen beim Beitreten geben | Diese Rollen werden Mitgliedern gegeben, die deinem Server beitreten. Das wird nicht rückwirkend angewandt, nutze dafür das [Massrole-Modul](/docs/custom-bot/modules/tools/massrole). | +| Bots ignorieren? | Wenn aktiviert (und das ist sehr empfehlenswert), werden keine Willkommens- und Verlassensnachrichten verschickt, wenn das Mitglied ein Bot ist. | +| Zusätzliche Rollen beim Boost geben | Diese Rollen werden einem Mitglied zusätzlich zu der von Discord vergebenen Boost-Rolle gegeben, wenn es deinen Server boostet. Die Rollen werden entfernt, wenn das Mitglied all seine Boosts entfernt. | +| Behandle Beitrittsrollen als Basisrollen (automatische Wiederherstellung) | Wenn aktiviert, stellt der Bot sicher, dass jedes reguläre Mitglied alle konfigurierten Beitritts-Rollen besitzt - durch reaktive erneute Vergabe und einen täglichen Abgleich. Details und Ausnahmen unter [Beitritts-Rollen als Basis-Rollen behandeln](#base-roles). | +| Willkommensnachricht löschen | Wenn aktiviert werden Willkommensnachrichten automatisch gelöscht, wenn das Mitglied deinen Server innerhalb von sieben Tagen wieder verlässt. | ### Zufällige Nachrichten {#configuration-random-messages} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/ai.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/ai.md index 700c9a26..7848add9 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/ai.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/ai.md @@ -70,10 +70,17 @@ Slow-Mode in diesem Kanal zu aktivieren, um zu vermeiden, dass du all deine AI C ### Konfigurationsoptionen -- **Persönlichkeit (Personality):** Abhängig von dieser Einstellung wird sich der AI-Chat-Bot unterschiedlich verhalten. - - **default:** Die Standardpersönlichkeit - entwickelt, um Benutzern zu helfen und Anfragen zu beantworten. Empfohlen und die beste Option - für die meisten Server. - - **rude starbucks employee:** Diese Persönlichkeit wird mit deinen Benutzern Rollenspiele als unhöflicher Starbucks-Mitarbeiter durchführen. +- **Persönlichkeit (Personality):** Abhängig von dieser Einstellung wird sich der AI-Chat-Bot unterschiedlich verhalten. Die + folgenden integrierten Persönlichkeiten sind verfügbar: + - **Hilfreicher Chat-Bot (Standard):** Die Standardpersönlichkeit - entwickelt, um Benutzern zu helfen und Anfragen zu beantworten. Empfohlen + und die beste Option für die meisten Server. + - **Witziger Freund:** Eine lockerere, unbeschwertere Persönlichkeit. + - **Unfreundlicher Kaffee Mitarbeiter:** Diese Persönlichkeit wird mit deinen Benutzern Rollenspiele als unhöflicher Kaffeehaus-Mitarbeiter durchführen. + + Die früheren Persönlichkeiten "Troll" und "Verschwörungstheoretiker / Lügner" wurden entfernt, um den Regeln des EU AI Act + zu manipulativen und täuschenden KI-Systemen zu entsprechen. Jeder Server, der eine davon ausgewählt hatte, fällt automatisch + auf die Standardpersönlichkeit zurück. + - **Antwortlänge (Response Length):** Steuert, wie lang die Antworten der KI sein werden. - **Auslösemodus (Trigger Mode):** Bestimmt, welche Nachrichten eine KI-Antwort auslösen. 'Alle Nachrichten' (All messages) repliziert das Standardverhalten. Andere Modi beschränken Antworten auf spezifische Auslöser. @@ -81,24 +88,75 @@ Slow-Mode in diesem Kanal zu aktivieren, um zu vermeiden, dass du all deine AI C diesem Wort oder dieser Phrase beginnt (z. B. 'Hey Bot'). - **Verlauf zurücksetzen (Resetting History):** Bitte tippe nach der Konfiguration `=== RESET ===` in den KI-Kanal, um den Konversationsverlauf zurückzusetzen. -### Benutzerdefinierter System-Prompt & Strenge Moderation +### Benutzerdefinierter System-Prompt & Automatische Überprüfung Wenn festgelegt, ersetzt dieser Text die Persönlichkeitseinstellung als System-Prompt der KI. Maximal 1000 Zeichen - längerer Text wird automatisch abgeschnitten. Eine Sicherheitsklausel wird immer angehängt und kann nicht entfernt werden. Du bist voll verantwortlich für das Verhalten der KI, wenn du einen benutzerdefinierten Prompt verwendest. -:::danger Automatisches Prompt-Scannen & Strenge Moderation -Alle benutzerdefinierten System-Prompts durchlaufen ein strenges automatisches Scannen, bevor sie gespeichert werden. **Wenn dein Prompt gegen unsere Sicherheitsrichtlinien -oder die Nutzungsbedingungen von Discord verstößt, wird dein KI-Modul sofort dauerhaft deaktiviert.** +Zum Schutz aller und zur Erfüllung unserer rechtlichen Pflichten wird jeder benutzerdefinierte System-Prompt automatisch +überprüft, bevor er aktiv wird. Der Rest dieses Abschnitts erklärt genau, was wir prüfen, was bei einer Ablehnung +passiert und wie du Einspruch einlegen kannst. + +#### Was wir überprüfen + +- Wir überprüfen ausschließlich den benutzerdefinierten System-Prompt, den du festlegst. Das geschieht automatisch bei + jedem Start oder Neustart deines Bots. +- Wir überprüfen niemals die Unterhaltungen in deinem Kanal und niemals das, was deine Mitglieder schreiben. Die + Überprüfung betrifft nur die Anweisungen, die du dem Bot gibst. + +#### Wie die Überprüfung funktioniert + +Die Überprüfung ist vollständig automatisch. Ein KI-Prüfer gleicht den Prompt mit den Kategorien für die zulässige +Nutzung in Abschnitt 8 unserer [Nutzungsbedingungen](https://scootk.it/scnx-tos) ab. + +#### Was zur Ablehnung eines Prompts führt + +Ein Prompt wird abgelehnt, wenn er eines der folgenden Dinge tut: + +- **Sexualisierung von Minderjährigen:** sexuelle Inhalte mit Personen unter 18 Jahren. +- **Wahrscheinlich nach deutschem Recht rechtswidrige Inhalte:** Inhalte, die wahrscheinlich nach deutschem Recht rechtswidrig sind. +- **Gezielte Belästigung oder Hassrede:** Angriffe auf Personen oder Gruppen aufgrund ihrer Identität. +- **Sammeln personenbezogener Daten:** den Bot anweisen, persönliche Informationen über Nutzer zu sammeln. +- **Täuschende Identitätsvortäuschung oder Betrug:** sich als jemand anderes ausgeben oder den Bot zur Täuschung oder zum + Betrug einsetzen. +- **Verstoß gegen Discords Regeln:** Verhalten anweisen, das gegen Discords + [Nutzungsbedingungen](https://discord.com/terms) verstößt. -**Einspruch gegen eine Deaktivierung:** -Um gegen eine Moduldeaktivierung Einspruch einzulegen, eröffne ein [Support-Ticket](https://scnx.app/de/user/support/new?topic=cmnewauac001v13dsssxa8rlh). -Unser Team wird deinen Einspruch innerhalb von 2-3 Werktagen bearbeiten. +#### Verwarnungen und was passiert -Für vollständige Details zu dieser Richtlinie und unserer rechtlichen Begründung, überprüfe bitte -unsere [Nutzungsbedingungen](https://scootk.it/scnx-tos). +Jeder abgelehnte Prompt zählt als eine Verwarnung. Verwarnungen werden über ein fortlaufendes 90-Tage-Fenster gezählt. + +- **Erste Verwarnung:** nur dieser Prompt wird blockiert. Alles andere funktioniert weiter. Lege einen neuen Prompt fest, + der die Überprüfung besteht, und nach dem nächsten Neustart deines Bots wird der KI-Chat-Kanal automatisch wieder + aktiviert. +- **Sperrung des Moduls:** eine zweite Verwarnung innerhalb des 90-Tage-Fensters oder eine Ablehnung in einer Kategorie + mit hohem Schweregrad (Sexualisierung von Minderjährigen oder wahrscheinlich nach deutschem Recht rechtswidrige Inhalte) sperrt das gesamte + KI-Chat-Modul. + +Ein gesperrtes Modul kann nicht durch Bearbeiten des Prompts entsperrt werden. Es kann nur durch einen Einspruch oder +eine Entscheidung unseres Teams wieder freigegeben werden. + +:::note Nur der betroffene Kanal wird deaktiviert +Ein benutzerdefinierter Prompt, der die Überprüfung nicht besteht, deaktiviert nur den spezifischen KI-Chat-Kanal, zu dem +er gehört - der Rest des Moduls und alle anderen KI-Chat-Kanäle funktionieren weiter. Dieser Kanal erholt sich automatisch, +sobald du einen Prompt festlegst, der die Überprüfung besteht; für eine erste Verwarnung musst du kein Support-Ticket eröffnen. +::: + +Verwarnungen fallen automatisch aus dem 90-Tage-Fenster heraus, eine Modulsperre läuft jedoch nie von selbst ab - sie endet nur durch einen erfolgreichen Einspruch oder eine Entscheidung unseres Teams. + +#### Begründung und Einspruch + +:::info Begründung +Jede Ablehnung sendet eine E-Mail an den Server-Inhaber. Gemäß dem EU Digital Services Act (Artikel 17) enthält diese +E-Mail eine Begründung und eine Anleitung zum Einlegen eines Einspruchs. Dein aktueller Stand - deine Verwarnungen und ob +das Modul gesperrt ist - wird außerdem auf der Seite des Moduls in deinem Dashboard angezeigt. ::: +Um Einspruch einzulegen, eröffne ein [Support-Ticket](https://scnx.app/de/user/support/new?topic=cmnewauac001v13dsssxa8rlh). +Ein Mitglied unseres Teams prüft jeden Einspruch. Für vollständige Details zu dieser Richtlinie überprüfe bitte unsere +[Nutzungsbedingungen](https://scootk.it/scnx-tos). + ### Preise & Häufige Fehler Dieses Modul belastet die AI Coins deines Servers. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/activity-streak.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/activity-streak.md index 65349f17..80ab77a6 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/activity-streak.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/activity-streak.md @@ -65,7 +65,7 @@ In dieser Konfigurationsdatei kannst du das Modul einrichten. Öffne sie in dein | Ignorierte Rollen | Rollen, deren Mitglieder-Nachrichten nicht für Streaks zählen. | | Streak-Wiederherstellung aktivieren? | Falls aktiviert, können Nutzer einen verlorenen Streak einmal pro Verlust wiederherstellen. | | Rollen, die Streaks wiederherstellen dürfen | Rollen, die berechtigt sind, den Befehl „restore" zu nutzen. Falls das Feld leer bleibt, können alle Nutzer Streaks wiederherstellen. | -| Wiederherstellungs-Zeitlimit (Tage) | Wie viele Tage nach dem Verlust eines Streaks Nutzer diesen noch mit `/streak restore` wiederherstellen können. Auf `0` setzen für kein Zeitlimit. Nur wirksam, wenn „Streak-Wiederherstellung aktivieren?" eingeschaltet ist. | +| Wiederherstellungsfrist (Tage) | Wie viele Tage nach dem Verlust eines Streaks Nutzer diesen noch mit `/streak restore` wiederherstellen können. Auf `0` setzen für kein Zeitlimit. Nur wirksam, wenn „Streak-Wiederherstellung aktivieren?" eingeschaltet ist. | ## Fehlerbehebung {#troubleshooting} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/economy-system.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/economy-system.md index d1786fc2..f418bd2a 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/economy-system.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/economy-system.md @@ -108,33 +108,33 @@ In dieser Konfigurationsdatei kannst du das Modul einrichten. Öffne sie in dein In dieser Konfigurationsdatei kannst du die Nachrichten anpassen, die von diesem Modul gesendet werden. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=economy-system%7Cconfigs%2Fstrings). -| Feld | Beschreibung | -| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Nicht gefunden Nachricht | Die Nachricht, die angezeigt wird, wenn ein Shop-Artikel nicht gefunden werden kann. | -| Nicht genug Geld | Die Nachricht, die angezeigt wird, wenn ein Nutzer nicht über genügend Guthaben verfügt, um einen Gegenstand zu kaufen. | -| Shop-Nachricht | Das Embed, das im Shop-Kanal angezeigt wird und alle verfügbaren Artikel auflistet. | -| Item Text | Das Format, das für die Darstellung der einzelnen Artikel in der Shop-Nachricht verwendet wird. | -| Cooldown | Die Nachricht, die angezeigt wird, wenn ein Nutzer versucht, einen Befehl zu verwenden, während die Abklingzeit noch aktiv ist. | -| Arbeit-Erfolgsnachrichten | Eine Liste von Nachrichten, die zufällig angezeigt werden, wenn ein Nutzer erfolgreich die Arbeit abgeschlossen hat. | -| Verbrechen-Erfolgsnachrichten | Eine Liste von Nachrichten, die zufällig angezeigt werden, wenn ein Nutzer erfolgreich ein Verbrechen begangen hat. | -| Verbrechen-Fehlschlagnachrichten | Eine Liste von Nachrichten, die zufällig angezeigt werden, wenn ein Nutzer beim Begehen eines Verbrechens scheitert. | -| Raub-Erfolgsnachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich einen anderen Nutzer ausraubt. | -| Ranglisten-Embed | Passe das Erscheinungsbild des Leaderboard-Embeds an. | -| Tägliche-Belohnung-Nachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich seine tägliche Belohnung abgeholt hat. | -| Wöchentliche-Belohnung-Nachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich seine wöchentliche Belohnung abgeholt hat. | -| Kontostand-Antwort | Das Embed, das angezeigt wird, wenn ein Nutzer sein aktuelles Guthaben abfragt. | -| Nutzer nicht gefunden | Die Nachricht, die angezeigt wird, wenn der angegebene Nutzer nicht gefunden werden konnte. | -| Kaufnachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich einen Artikel im Shop gekauft hat. | -| Item-erstellt-Nachricht | Die Nachricht, die angezeigt wird, wenn ein neuer Shop-Artikel erfolgreich erstellt wurde. | -| Item-gelöscht-Nachricht | Die Nachricht, die angezeigt wird, wenn ein Shop-Artikel erfolgreich gelöscht wurde. | -| Item-bearbeitet-Nachricht | Die Nachricht, die angezeigt wird, wenn ein Shop-Artikel erfolgreich bearbeitet wurde. | -| Einzahlungsnachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich Währung auf sein Bankkonto einzahlt. | -| Abhebungsnachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich Geld von seinem Bankkonto abhebt. | -| Nachrichten-Drop-Nachricht | Eine Liste von Nachrichten, die zufällig angezeigt werden, wenn ein Nutzer einen zufälligen Message Drop im Chat findet. | -| Erneutkaufen Nachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer versucht, einen Artikel zu kaufen, den er bereits in seinem Inventar besitzt. | -| mehrere Treffer | Die Nachricht, die angezeigt wird, wenn eine Suchanfrage im Shop mehrere Treffer erzielt hat und der Nutzer eine genauere Auswahl treffen muss. | -| keine Treffer | Die Nachricht, die angezeigt wird, wenn kein Artikel im Shop mit dem eingegebenen Suchbegriff übereinstimmt. | -| Item Duplikat | Die Nachricht, die angezeigt wird, wenn versucht wird, einen Shop-Artikel mit einer ID oder einem Namen zu erstellen, die bereits im System existieren. | +| Feld | Beschreibung | +| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Nicht gefunden Nachricht | Die Nachricht, die angezeigt wird, wenn ein Shop-Artikel nicht gefunden werden kann. | +| Nicht genug Geld | Die Nachricht, die angezeigt wird, wenn ein Nutzer nicht über genügend Guthaben verfügt, um einen Gegenstand zu kaufen. | +| Shop-Nachricht | Das Embed, das im Shop-Kanal angezeigt wird und alle verfügbaren Artikel auflistet. | +| Item Text | Das Format, das für die Darstellung der einzelnen Artikel in der Shop-Nachricht verwendet wird. | +| Cooldown | Die Nachricht, die angezeigt wird, wenn ein Nutzer versucht, einen Befehl zu verwenden, während die Abklingzeit noch aktiv ist. | +| Arbeit-Erfolgsnachrichten | Eine Liste von Nachrichten, die zufällig angezeigt werden, wenn ein Nutzer erfolgreich die Arbeit abgeschlossen hat. | +| Verbrechen-Erfolgsnachrichten | Eine Liste von Nachrichten, die zufällig angezeigt werden, wenn ein Nutzer erfolgreich ein Verbrechen begangen hat. | +| Verbrechen-Fehlschlagnachrichten | Eine Liste von Nachrichten, die zufällig angezeigt werden, wenn ein Nutzer beim Begehen eines Verbrechens scheitert. | +| Raub-Erfolgsnachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich einen anderen Nutzer ausraubt. | +| Ranglisten-Embed | Passe das Erscheinungsbild des Leaderboard-Embeds an. | +| Tägliche-Belohnung-Nachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich seine tägliche Belohnung abgeholt hat. | +| Wöchentliche-Belohnung-Nachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich seine wöchentliche Belohnung abgeholt hat. | +| Kontostand-Antwort | Das Embed, das angezeigt wird, wenn ein Nutzer sein aktuelles Guthaben abfragt. | +| Nutzer nicht gefunden | Die Nachricht, die angezeigt wird, wenn der angegebene Nutzer nicht gefunden werden konnte. | +| Kaufnachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich einen Artikel im Shop gekauft hat. | +| Item-erstellt-Nachricht | Die Nachricht, die angezeigt wird, wenn ein neuer Shop-Artikel erfolgreich erstellt wurde. | +| Item-gelöscht-Nachricht | Die Nachricht, die angezeigt wird, wenn ein Shop-Artikel erfolgreich gelöscht wurde. | +| Item-bearbeitet-Nachricht | Die Nachricht, die angezeigt wird, wenn ein Shop-Artikel erfolgreich bearbeitet wurde. | +| Einzahlungsnachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich Währung auf sein Bankkonto einzahlt. | +| Abhebungsnachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer erfolgreich Geld von seinem Bankkonto abhebt. | +| Nachrichten-Drop-Nachricht | Ein Array benutzerdefinierter Nachrichten, die gesendet werden, wenn ein Nutzer einen Nachrichten-Drop erhält - für jeden Drop wird zufällig eine ausgewählt. Unterstützt vollständige Embed-Formatierung und den Platzhalter `%earned%` (der verdiente Betrag inklusive Währungssymbol). Leer lassen, um auf die integrierte Standardnachricht zurückzugreifen. | +| Erneutkaufen Nachricht | Die Nachricht, die angezeigt wird, wenn ein Nutzer versucht, einen Artikel zu kaufen, den er bereits in seinem Inventar besitzt. | +| mehrere Treffer | Die Nachricht, die angezeigt wird, wenn eine Suchanfrage im Shop mehrere Treffer erzielt hat und der Nutzer eine genauere Auswahl treffen muss. | +| keine Treffer | Die Nachricht, die angezeigt wird, wenn kein Artikel im Shop mit dem eingegebenen Suchbegriff übereinstimmt. | +| Item Duplikat | Die Nachricht, die angezeigt wird, wenn versucht wird, einen Shop-Artikel mit einer ID oder einem Namen zu erstellen, die bereits im System existieren. | ## Fehlerbehebung {#troubleshooting} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/message-quotes.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/message-quotes.md new file mode 100644 index 00000000..c4098b86 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/community/message-quotes.md @@ -0,0 +1,112 @@ +# Nachrichten-Zitate + +Poste eine Discord-Nachricht automatisch als formatiertes Zitat, sobald jemand ihren Nachrichtenlink einfügt. + + + +## Funktionen {#features} + +- Erkennt Discord-Nachrichtenlinks, die in den Chat eingefügt werden, und postet die verlinkte Nachricht als formatiertes Zitat erneut. +- Optionale Aktion **Quote Message** im Apps-Menü von Discord (Rechtsklick), sodass Nutzer eine Nachricht zitieren können, ohne ihren Link einzufügen. +- Das gerenderte Zitat kann den ursprünglichen Autor, den Spitznamen, den Avatar, den Kanal, den Nachrichteninhalt, einen Discord-Zeitstempel, einen Link zurück zum Original und dessen erstes Bild anzeigen. +- Vollständig anpassbare Zitat-Nachricht - erstelle sie als Embed oder als generiertes Bild mit Parametern für jedes Feld. +- Kanal-/Kategorie- und Rollen-Blacklists, um das Zitieren aus bestimmten Orten (und von bestimmten Personen) fernzuhalten. +- Schalter, um Botnachrichten zu ignorieren, Selbst-Zitate zu erlauben, auf die Auslösernachricht zu antworten und die Auslösernachricht zu löschen. +- Optionales Zitieren von Anhängen, bei dem die Dateien der verlinkten Nachricht zusammen mit dem Zitat erneut hochgeladen werden. +- Das erste Bild der zitierten Nachricht wird in die [Dateibibliothek](/docs/scnx/guilds/files) deines Servers archiviert, sodass Zitate ihr Bild behalten, auch nachdem Discords CDN-URLs abgelaufen sind. + +## Einrichtung {#setup} + +1. [Aktiviere das Modul](https://scnx.app/de/glink?page=bot/modules?query=message-quotes) auf deinem Server. +2. Stelle sicher, dass der Bot in den Kanälen, in denen das Zitieren funktionieren soll, die Berechtigungen `Kanal anzeigen`, `Nachrichten senden`, `Nachrichtenverlauf lesen` und `Links einbetten` besitzt. Um **Auslöser löschen?** zu nutzen, benötigt er außerdem `Nachrichten verwalten`. +3. Öffne die [Konfiguration](https://scnx.app/de/glink?page=bot/configuration?file=message-quotes%7Cconfigs/config) und passe die Blacklists, Schalter und die Zitat-Nachricht an deinen Server an. + +## Nutzung {#usage} + +- Sobald das Modul [eingerichtet](#setup) ist, fügt ein Nutzer einfach einen Link zu einer anderen Nachricht (vom selben Server) in einen beliebigen, nicht auf der Blacklist stehenden Kanal ein. Der Bot ruft die verlinkte Nachricht ab und postet sie als Zitat erneut. +- Die verlinkte Nachricht wird nur zitiert, wenn sowohl der Nutzer, der den Link eingefügt hat, als auch der Bot sie tatsächlich sehen können (beide benötigen `Kanal anzeigen` und `Nachrichtenverlauf lesen` im Ausgangskanal). Links, die auf einen anderen Server verweisen, werden ignoriert. +- Abhängig von deiner Konfiguration wird das Zitat als Antwort auf die Auslösernachricht gesendet, und die Auslösernachricht kann anschließend gelöscht werden. +- Eine kurze Abklingzeit pro Nutzer verhindert, dass ein einzelner Nutzer in schneller Folge Zitate spammt. +- Alternativ können Nutzer mit Rechtsklick (oder langem Drücken) auf eine beliebige Nachricht das **Apps**-Menü öffnen und **Quote Message** auswählen, um das Zitat zu posten, ohne einen Link einzufügen. Siehe [Befehle](#commands). + +### Dauerhafte Bildarchivierung {#image-archival} + +Wenn ein Zitat gerendert wird, wird das erste Bild der verlinkten Nachricht in die [Dateibibliothek](/docs/scnx/guilds/files) deines Servers hochgeladen, und das Zitat wird mit dieser dauerhaften URL erstellt. So brechen Zitate nicht mehr, sobald Discords kurzlebige CDN-URLs ablaufen. + +Archivierte Bilder zählen auf das [Datei-Speicherkontingent](/docs/scnx/guilds/files#understanding-storage-limits) deines Servers. Um dies zu deaktivieren, aktiviere **Anhang-Archivierung deaktivieren** in der allgemeinen Konfiguration des Bots; bei deaktivierter Archivierung greifen Zitat-Bilder wieder auf Discords ablaufende URLs zurück, und alte Zitate werden mit der Zeit erneut defekt sein. + +## Befehle {#commands} + + + +| Befehl | Beschreibung | +| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Quote Message` | Eine Kontextmenü-Aktion für Nachrichten (Apps). Klicke mit der rechten Maustaste auf eine Nachricht oder drücke lange darauf und wähle sie aus, um diese Nachricht als Zitat erneut zu posten. | + +Die **Quote Message**-Aktion berücksichtigt dieselbe Konfiguration wie das linkbasierte Zitieren. Wenn das Zitieren für das Ziel unterdrückt wird (zum Beispiel weil **Botnachrichten ignorieren?** aktiviert ist oder **Selbst-Zitate erlauben?** deaktiviert ist und du deine eigene Nachricht zitierst), antwortet der Bot privat (ephemeral) und postet nichts. + +## Konfiguration {#configuration} + +Konfiguriere das Nachrichten-Zitierungssystem. Öffne es in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=message-quotes%7Cconfigs/config). + +| Feld | Beschreibung | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Rollen, die kein XP sammeln | Rollen, die vom Zitieren ausgeschlossen sind. Mitglieder mit einer aufgeführten Rolle können kein Zitat auslösen. | +| Channel ohne XP | Kanäle, die vom Zitieren ausgeschlossen sind. Kanäle und Kategorien werden unterstützt; eine Kategorie schließt alle ihre Kanäle aus. | +| Dateien anhängen | Sollen alle Anhänge zitiert werden? Die Dateien der verlinkten Nachricht werden zusammen mit dem Zitat erneut hochgeladen. Deaktivierung empfohlen, wenn "Nachricht"-Komponenten v2 verwendet werden. | +| Botnachrichten ignorieren? | Wenn aktiviert, werden von Bots gesendete Nachrichten nicht zitiert. | +| Selbst-Zitate erlauben? | Ob Nutzer ihre eigenen Nachrichten zitieren können. | +| Auf Nachricht antworten | Antwortet auf die Nachricht, die das Zitat ausgelöst hat. Wird ignoriert, wenn **Auslöser löschen?** aktiviert ist. | +| Auslöser löschen? | Wenn aktiviert, wird die Nachricht, die das Zitat ausgelöst hat, nach dem Posten des Zitats gelöscht. Erfordert die Berechtigung `Nachrichten verwalten`. | +| Nachricht | Die Nachricht, in der das Zitat zurückgegeben wird. Erstelle sie als Embed oder als generiertes Bild; die verfügbaren Parameter (Autor, Spitzname, Avatar, Kanal, Zeitstempel, Link, erstes Bild, Inhalt und mehr) sind in deinem Dashboard aufgeführt. | + +## Fehlerbehebung {#troubleshooting} + +
+ Es passiert nichts, wenn ein Nachrichtenlink eingefügt wird +
    +
  • Stelle sicher, dass das Modul aktiviert ist und der Bot Kanal anzeigen, Nachrichten senden, Nachrichtenverlauf lesen und Links einbetten sowohl im Kanal, in dem der Link eingefügt wird, als auch im Kanal, in dem die verlinkte Nachricht liegt, besitzt.
  • +
  • Stelle sicher, dass der Kanal (oder seine Kategorie) nicht in Channel ohne XP steht und der Nutzer keine Rolle aus Rollen, die kein XP sammeln hat.
  • +
  • Die verlinkte Nachricht muss sich auf demselben Server befinden. Links zu Nachrichten auf anderen Servern werden ignoriert.
  • +
  • Der Nutzer, der den Link eingefügt hat, muss die verlinkte Nachricht selbst sehen können (Kanal anzeigen und Nachrichtenverlauf lesen im Ausgangskanal).
  • +
  • Wenn du gerade eine Nachricht zitiert hast, warte ein paar Sekunden - es gilt eine kurze Abklingzeit pro Nutzer.
  • +
+
+ +
+ Botnachrichten werden nicht zitiert +
    +
  • Das ist zu erwarten, wenn Botnachrichten ignorieren? aktiviert ist. Deaktiviere es, um das Zitieren von Botnachrichten zu erlauben.
  • +
+
+ +
+ Die Auslösernachricht wird nicht gelöscht +
    +
  • Stelle sicher, dass Auslöser löschen? aktiviert ist.
  • +
  • Stelle sicher, dass der Bot die Berechtigung Nachrichten verwalten im Kanal hat, in dem der Link eingefügt wurde. Ohne sie wird das Zitat trotzdem gepostet, aber die Auslösernachricht bleibt bestehen.
  • +
  • Solange Auslöser löschen? aktiviert ist, wird Auf Nachricht antworten ignoriert, da die Nachricht, auf die geantwortet würde, entfernt wird.
  • +
+
+ +
+ Die "Quote Message"-Aktion meldet, dass die Nachricht nicht zitiert werden kann +
    +
  • Das Ziel wird wahrscheinlich durch die Konfiguration unterdrückt - zum Beispiel ist Botnachrichten ignorieren? aktiviert und das Ziel wurde von einem Bot gesendet, oder Selbst-Zitate erlauben? ist deaktiviert und du zitierst deine eigene Nachricht.
  • +
  • Außerdem benötigst du die Berechtigung, im aktuellen Kanal Nachrichten zu senden, damit die Aktion das Zitat posten kann.
  • +
+
+ +
+ Alte Zitate haben ihr Bild verloren +
    +
  • Discords CDN-URLs laufen mit der Zeit ab. Zitat-Bilder werden normalerweise in deine Dateibibliothek archiviert, um dies zu verhindern.
  • +
  • Wenn Anhang-Archivierung deaktivieren in der allgemeinen Konfiguration des Bots aktiviert ist, greifen Zitat-Bilder auf Discords ablaufende URLs zurück und werden mit der Zeit defekt.
  • +
+
+ +## Gespeicherte Daten {#data-usage} + +Dieses Modul speichert keine Daten in seiner eigenen Modul-Datenbank. Zitate werden direkt gerendert und gepostet, und die kurze Abklingzeit pro Nutzer wird nur im Arbeitsspeicher gehalten und beim Neustart des Bots zurückgesetzt. + +Die einzige Ausnahme ist die Bildarchivierung: Wenn das erste Bild einer zitierten Nachricht archiviert wird, wird dieses Bild in der [Dateibibliothek](/docs/scnx/guilds/files) deines Servers gespeichert (und zählt auf dein [Datei-Speicherkontingent](/docs/scnx/guilds/files#understanding-storage-limits)) und nicht in der Datenbank dieses Moduls. Verwalte oder entferne diese Dateien in der Dateibibliothek in deinem Dashboard. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/integrations/tiktok-notifications.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/integrations/tiktok-notifications.md new file mode 100644 index 00000000..e4fdf5a0 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/integrations/tiktok-notifications.md @@ -0,0 +1,76 @@ +# TikTok-Benachrichtigungen + +Sende eine Nachricht in einen Kanal, wenn ein TikTok-Creator ein neues TikTok veröffentlicht. + + + +:::info +TikTok-Benachrichtigungen funktionieren nur für Creators, die ihr TikTok-Konto mit SCNX verbunden (beansprucht) haben. Wenn ein konfigurierter Creator sein Konto nicht verbunden hat, werden Benachrichtigungen für ihn pausiert und der Creator wird als Problem in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=tiktok-notifications%7Cusers) aufgeführt, zusammen mit einem Link, über den der Creator sein Konto verbinden kann. Nicht verbundene Creators werden einmal pro Tag erneut überprüft, und Benachrichtigungen werden automatisch fortgesetzt, sobald das Konto verbunden wurde. +::: + +## Funktionen {#features} + +- Erhalte Benachrichtigungen in einem Discord-Kanal, wenn ein TikTok-Creator ein neues Video veröffentlicht. +- Überwache mehrere TikTok-Konten gleichzeitig, jeweils mit eigenem Benachrichtigungskanal und Nachrichtenformat. +- Passe die Benachrichtigungsnachricht mit Details wie Nutzername, Videotitel, Beschreibung, Hashtags, Thumbnail und URL an. + +## Einrichtung {#setup} + +1. Öffne die [Konfiguration der TikTok-Creators](https://scnx.app/de/glink?page=bot/configuration?file=tiktok-notifications%7Cusers). +2. Klicke auf "Neues Element hinzufügen" und konfiguriere den TikTok-Nutzernamen und den Benachrichtigungskanal wie im [Konfigurationsabschnitt](#configuration) beschrieben. +3. Stelle sicher, dass der Bot im konfigurierten Benachrichtigungskanal die Berechtigungen "Kanal ansehen", "Nachrichten senden" und "Links einbetten" hat. +4. Lade die Konfiguration deines Bots neu, um die Änderungen zu übernehmen. + +## Nutzung {#usage} + +Nach der [Einrichtung](#setup) und [Konfiguration](#configuration) dieses Moduls sind keine weiteren Aktionen erforderlich. Der Bot prüft automatisch alle zwanzig Minuten auf neue TikToks von konfigurierten Konten. Wenn ein neues TikTok gefunden wird, wird die konfigurierte Benachrichtigungsnachricht in den angegebenen Discord-Kanal gesendet. + +Nur TikToks, die innerhalb der letzten 24 Stunden veröffentlicht wurden, lösen Benachrichtigungen aus, ältere TikToks werden also nicht nachträglich gesendet. + +Benachrichtigungen werden nur für Creators gesendet, die ihr TikTok-Konto mit SCNX verbunden haben. Wenn ein Creator sein Konto nicht verbunden hat, pausiert der Bot die Benachrichtigungen für ihn und meldet den Creator als Problem in deinem Dashboard, einschließlich eines Links, über den der Creator sein Konto verbinden kann. Nicht verbundene Creators werden einmal pro Tag erneut überprüft, und Benachrichtigungen werden automatisch fortgesetzt, sobald das Konto verbunden wurde. + +## Konfiguration {#configuration} + +Mit dieser Konfigurationsdatei kannst du TikTok-Konten einrichten, die auf neue Videos überwacht werden sollen. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=tiktok-notifications%7Cusers). + +| Feld | Beschreibung | +| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Kanal | Der Discord-Kanal, in dem die Benachrichtigung gesendet werden soll. | +| TikTok-Nutzername | Der @Handle des TikTok-Creators, von dem du Benachrichtigungen erhalten möchtest. | +| Erforderlicher Hashtag | Sende nur Benachrichtigungen für Videos, die diesen Hashtag enthalten. Der Vergleich ist nicht case-sensitive und funktioniert mit oder ohne das `#`-Präfix. Leer lassen, um für jedes Video zu benachrichtigen. | +| Minimale Cliplänge (Sekunden) | Überspringe Videos, die kürzer als diese Anzahl an Sekunden sind. Auf 0 setzen, um den Filter zu deaktivieren. Videos ohne bekannte Dauer werden nie herausgefiltert. | +| Nachricht | Die Nachricht, die in den konfigurierten Kanal gesendet wird, wenn der Creator ein neues TikTok veröffentlicht. Unterstützt Embeds. Verfügbare Parameter sind unter anderem `%userName%` (TikTok-Nutzername), `%title%` (Videotitel), `%description%` (Videobeschreibung), `%hashtags%` (Video-Hashtags), `%url%` (Video-URL) und `%thumbnailUrl%` (Video-Thumbnail-URL, kann leer sein).
Bitte überprüfe die verfügbaren Parameter in deinem Dashboard. | + +## Fehlerbehebung {#troubleshooting} + +
+Benachrichtigungen werden nicht gesendet +
    +
  • Stelle sicher, dass der TikTok-Nutzername korrekt geschrieben ist (mit oder ohne das @-Präfix).
  • +
  • Überprüfe, ob das TikTok-Konto existiert und öffentlich zugänglich ist.
  • +
  • Stelle sicher, dass der Creator sein TikTok-Konto mit SCNX verbunden hat. Für Creators, die ihr Konto nicht verbunden haben, werden Benachrichtigungen pausiert. Überprüfe dein Dashboard auf gemeldete Probleme und teile den bereitgestellten Link mit dem Creator.
  • +
  • Stelle sicher, dass der Bot im Benachrichtigungskanal die Berechtigungen "Kanal ansehen", "Nachrichten senden" und "Links einbetten" hat.
  • +
  • Das Modul prüft alle zwanzig Minuten auf neue TikToks. Bitte warte den nächsten Prüfzyklus ab.
  • +
  • Wenn ein TikTok-Konto nicht gefunden werden kann, wird es übersprungen, bis der Bot neu gestartet oder die Konfiguration neu geladen wird.
  • +
+
+ +
+Ein Creator hat sein TikTok-Konto nicht verbunden +
    +
  • Benachrichtigungen funktionieren nur für Creators, die ihr TikTok-Konto mit SCNX verbunden (beansprucht) haben.
  • +
  • Wenn ein Creator sein Konto nicht verbunden hat, werden Benachrichtigungen für ihn pausiert und der Creator wird als Problem in deinem Dashboard gemeldet, zusammen mit einem Link, über den der Creator sein Konto verbinden kann.
  • +
  • Teile diesen Link mit dem Creator, damit er sein TikTok-Konto verbinden kann.
  • +
  • Nicht verbundene Creators werden einmal pro Tag erneut überprüft. Benachrichtigungen werden automatisch fortgesetzt, sobald das Konto verbunden wurde.
  • +
+
+ +## Gespeicherte Daten {#data-usage} + +Über jede gesendete Benachrichtigung werden die folgenden Daten gespeichert: + +- Die TikTok-URL +- Die Discord-Nachrichten-ID der Benachrichtigung +- Die Discord-Kanal-ID, in der die Benachrichtigung gesendet wurde + +Um alle von diesem Modul gespeicherten Daten zu entfernen, [lösche die Modul-Datenbank](/docs/custom-bot/additional-features#reset-module-database). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/moderation/moderation.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/moderation/moderation.md new file mode 100644 index 00000000..4b7f125e --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/moderation/moderation.md @@ -0,0 +1,517 @@ +# Moderation & Sicherheit + +Fortschrittliches Sicherheits- und Moderationssystem mit unzähligen Funktionen, um deinen Server sicher zu halten. + + + +## Funktionen {#features} + +- Umfassende Moderationsbefehle: [Verwarnen](#warn), [Stummschalten](#mute), [Kicken](#kick), [Bannen](#ban), [Quarantäne](#quarantine), [Kanal-Stummschaltung](#channel-mute) und [Aufräumen](#clear). +- Verwarnen, Stummschalten, Kicken und Bannen sind auch als Rechtsklick-[Kontextmenü-Aktionen](#context-menu-actions) auf Nutzer und Nachrichten verfügbar und nehmen Beweise entgegen. +- Unterstützung für temporäre Bans, Mutes und Quarantänen mit automatischem Ablauf, plus [bearbeitbaren Dauern](#edit-duration), die eine aktive Bestrafung nachträglich verkürzen oder verlängern. +- [Bestrafungen mit einem Klick aufheben](#lift-punishment) - direkt aus der Log-Nachricht oder der Aktionsansicht. +- [Kanal sperren und entsperren](#lock-unlock), um das Schreiben in einem Kanal einzuschränken. +- [Serverweites Lockdown](#lockdown)-System, das alle Kanäle auf einmal sperrt, mit automatischen Auslösern. Optional werden Lockdown-Nachrichten nur an bestimmte Kanäle gesendet. +- Intelligentere Invite-Erkennung: Discord-Einladungslinks werden vor einer Aktion aufgelöst, und Einladungen zu deinem eigenen Server werden automatisch erlaubt. +- [Melde-System für Nutzer](#report), mit dem Mitglieder andere Nutzer und Nachrichten samt Beweisbildern melden können. +- [Moderator-Notizen](#notes)-System, um Informationen über Nutzer festzuhalten. +- Sieh dir den gesamten Moderations-[Aktionsverlauf](#actions) für jeden Nutzer an. +- [Verwarnungen zurücknehmen](#commands), um frühere Warns zu entfernen. +- [Auto-Moderation](#configuration-config) für Einladungslinks, Scam-Links und gesperrte Wörter, jeweils mit einer optionalen Nur-Löschen-Aktion, die die Nachricht entfernt, ohne das Mitglied zu bestrafen. +- Automatische Bestrafungen basierend auf der Anzahl der Verwarnungen (z. B. Auto-Ban nach X Warns). +- Ein vollständig konfigurierbares [Anti-Spam-System pro Typ](#anti-spam) - Nachrichtenrate, doppelte Inhalte, Erwähnungen, Massenerwähnungen, Anhang-/Bild-Spam, Link-Spam, Zeilen-/Zeichen-Fluten, Sticker-/Emoji-Spam, Kanal-Streuung und Text-Missbrauch - jeweils mit eigenem Schalter, Grenzwert, Zeitfenster und eigener Aktion. +- [Einschränkungen für neue Mitglieder](#new-member-restrictions), die Anhänge und Links zurückhalten, bis ein Mitglied lange genug auf dem Server ist. +- [Anti-Join-Raid](#anti-join-raid)-System, das Massenbeitritte erkennt. +- [Join Gate](#join-gate), um verdächtige Accounts anhand von Accountalter und Profilbild zu blockieren. +- [Anti-Grief](#anti-grief)-System, um Moderatoren, die ihre Berechtigungen missbrauchen, in Quarantäne zu setzen. +- [Verifikations](#verification)-System, das von neuen Mitgliedern verlangt, ein Bild-Captcha, eine Wort- oder Mathe-Herausforderung, einen Ein-Klick-Button oder eine manuelle Moderator-Prüfung abzuschließen. +- [Benutzerdefinierte Moderationslevel](#configuration-modlevels), die du selbst definierst und die jeweils eine explizite Menge an Berechtigungen gewähren. +- [Anpassbare und öffentliche Logs](#configuration-logmessages): bearbeite das Embed für jeden Log-Nachrichtentyp und spiegle Aktionen optional in einen separaten öffentlichen Kanal. +- [Import nativer Discord-Moderation](#native-import), der Bans, Kicks und Timeouts, die mit Discords eigenen Tools durchgeführt wurden, in die Datenbank und den Log-Kanal des Bots aufnimmt. +- Optionale [benutzerdefinierte Fall-Titel](#configuration-config), [bearbeitbare Gründe](#edit-reason) und [Markierung beteiligter Nutzer](#involved-users) an Fällen. +- Automatischer Ablauf von Verwarnungen nach einem konfigurierbaren Zeitraum. +- Anpassbare Nachrichten für jede Moderationsaktion. +- Optionale Nicknamen-Änderungen bei Mute oder Quarantäne. +- Alle Aktionen werden in einem konfigurierbaren Log-Kanal protokolliert. +- [Beweise mit mehreren Bildern](#evidence-archival) an Moderationsaktionen werden in der [Datei-Bibliothek](/docs/scnx/guilds/files) deines Servers archiviert, sodass alte Fall-Logs sichtbar bleiben, nachdem Discords CDN-URLs abgelaufen sind. + +## Einrichtung {#setup} + +1. [Aktiviere das Modul](https://scnx.app/de/glink?page=bot/modules?query=moderation) auf deinem Server. +2. Öffne die [Konfiguration](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/config) und lege den **Log-Kanal** fest, in dem Moderationsaktionen protokolliert werden. +3. Richte deine **Moderationslevel** in der [Moderationslevel-Konfiguration](#configuration-modlevels) ein. Erstelle ein Level pro Team-Stufe, liste die Rollen auf, die dazugehören, und hake genau die Berechtigungen ab, die diese Rollen haben sollen (Verwarnen, Stummschalten, Kicken, Bannen, Quarantäne und mehr). Wenn du von einer älteren Version aktualisierst, werden deine bestehenden Moderator-Level-1-4-Rollen beim Start automatisch in gleichwertige Level migriert, sodass dein Team ohne jede Änderung weiterarbeiten kann. +4. Alle Moderatoren müssen außerdem den `/moderate`-Befehl ausführen können. Konfiguriere dies in deinen Discord-Servereinstellungen (Servereinstellungen > Integrationen). +5. Wenn du Quarantäne nutzen möchtest, lege die **Quarantäne-Rolle** in der Konfiguration fest. Diese Rolle sollte eingeschränkte Berechtigungen haben, und die Rolle des Bots sollte in der Rollenhierarchie über ihr platziert sein. +6. Stelle sicher, dass der Bot die folgenden Berechtigungen hat: **Rollen verwalten**, **Mitglieder kicken**, **Mitglieder bannen**, **Mitglieder timeouten**, **Kanäle verwalten**, **Nachrichten verwalten**, **Kanal ansehen**, **Nachrichten senden** und **Links einbetten**. Um [native Discord-Moderation](#native-import) aufzuzeichnen, benötigt der Bot zusätzlich **Audit-Log ansehen**. +7. Konfiguriere optional die zusätzlichen Systeme ([Anti-Spam](#anti-spam), [Einschränkungen für neue Mitglieder](#new-member-restrictions), [Anti-Join-Raid](#anti-join-raid), [Join Gate](#join-gate), [Anti-Grief](#anti-grief), [Verifikation](#verification), [Lockdown](#lockdown) und [Log-Nachrichten](#configuration-logmessages)) in ihren jeweiligen Konfigurationsdateien. + +## Verwendung {#usage} + +### Moderationsbefehle {#moderation-commands} + +Moderatoren verwenden den `/moderate`-Befehl mit verschiedenen Unterbefehlen, um Aktionen durchzuführen. Jede Aktion wird im konfigurierten Log-Kanal protokolliert. Nutzer erhalten eine DM-Benachrichtigung, wenn eine Moderationsaktion gegen sie ausgeführt wird (sofern ihre DMs geöffnet sind). + +Jede Aktion kann optional [beteiligte Nutzer](#involved-users) markieren. Wenn [benutzerdefinierte Fall-Titel](#configuration-config) aktiviert sind, wird den Befehlen Verwarnen, Stummschalten, Bannen, Kicken, Quarantäne und Kanal-Stummschaltung ein kurzes **Titel**-Feld hinzugefügt, das dann erforderlich wird. + +#### Verwarnen {#warn} + +Verwarnt einen Nutzer. Die Verwarnung wird aufgezeichnet und kann automatische Aktionen auslösen, wenn [Automod-Grenzwerte](#configuration-config) konfiguriert sind. Erfordert die Berechtigung **Mitglieder verwarnen**. + +#### Stummschalten {#mute} + +Schaltet einen Nutzer mithilfe von Discords integrierter Timeout-Funktion stumm. Eine Dauer ist erforderlich (maximal 28 Tage). Wenn der Moderator keine Dauer festlegt, wird die konfigurierte Standard-Mute-Dauer verwendet. Erfordert die Berechtigung **Mitglieder stummschalten**. + +#### Kicken {#kick} + +Kickt einen Nutzer vom Server. Der Nutzer kann mit einem Einladungslink wieder beitreten. Erfordert die Berechtigung **Mitglieder kicken**. + +#### Bannen {#ban} + +Bannt einen Nutzer vom Server. Optional kannst du eine Dauer für einen temporären Ban und die Anzahl der Tage an zu löschenden Nachrichten angeben. Funktioniert auch, wenn der Nutzer sich aktuell nicht auf dem Server befindet. Erfordert die Berechtigung **Mitglieder bannen**. + +#### Quarantäne {#quarantine} + +Setzt einen Nutzer in Quarantäne, indem ihm die Quarantäne-Rolle zugewiesen und optional alle seine anderen Rollen entfernt werden (Rollen werden gespeichert und beim Aufheben der Quarantäne wiederhergestellt). Optional kannst du eine Dauer für die automatische Entfernung angeben. Erfordert die Berechtigung **Mitglieder in Quarantäne setzen**. + +Wenn **Neue Rollen von quarantänisierten Benutzern entfernen** aktiviert ist (siehe [Konfiguration](#configuration-config)), entfernt der Bot auch +jede Rolle, die dem Nutzer hinzugefügt wird, während er in Quarantäne ist - einschließlich Reaktionsrollen, Selbstrollen, +die über Discords Tab "Kanäle & Rollen" gewählt werden, und Rollen, die von anderen Bots vergeben werden. Verwaltete Rollen wie Server-Boosts und +integrationsverwaltete Rollen bleiben unberührt. + +#### Kanal-Stummschaltung {#channel-mute} + +Schaltet einen Nutzer nur im aktuellen Kanal stumm, indem die Berechtigungsüberschreibungen des Kanals angepasst werden. Dies verhindert, dass der Nutzer in diesem bestimmten Kanal Nachrichten senden kann. Erfordert die Berechtigung **Mitglieder kanalweit stummschalten**. + +#### Aufräumen {#clear} + +Löscht eine angegebene Anzahl aktueller Nachrichten aus dem aktuellen Kanal (Standard: 5). Erfordert die Berechtigung **Nachrichten löschen**. + +#### Sperren und Entsperren {#lock-unlock} + +Sperrt oder entsperrt den aktuellen Kanal und verhindert oder erlaubt der @everyone-Rolle das Senden von Nachrichten. Beim Sperren kann ein Grund angegeben werden. Erfordert die Berechtigung **Kanäle sperren**. + +### Kontextmenü-Aktionen {#context-menu-actions} + +Verwarnen, Stummschalten, Kicken und Bannen sind auch als Rechtsklick-Aktionen verfügbar. Klicke mit der rechten Maustaste auf einen Nutzer (oder eine Nachricht und wähle dann **Apps**) und wähle **Verwarnen**, **Stummschalten**, **Kicken** oder **Bannen**. Ein Dialog öffnet sich für den Grund und, wenn [benutzerdefinierte Fall-Titel](#configuration-config) aktiviert sind, den Titel. Jede Kontextmenü-Aktion enthält ein optionales Beweis-Feld, in das du in einem Zug bis zu zehn Beweisbilder hochladen kannst. Es gibt außerdem die Aktionen **Nutzer melden** und **Nachricht melden** für Mitglieder sowie eine **Mod-Verlauf**-Aktion, die die vergangenen Fälle eines Nutzers zeigt. + +### Bestrafung aufheben {#lift-punishment} + +Wenn **Aufheben-Buttons** aktiviert sind (siehe [Konfiguration](#configuration-config)), zeigen Moderations-Log-Nachrichten und die [Aktionsansicht](#actions) einen **Bestrafung aufheben**-Button, der einen Mute, Ban, eine Quarantäne oder Verwarnung mit einem Klick rückgängig macht. Du wirst nach einem Grund gefragt, und die Aktion wird rückgängig gemacht. Der Button ist berechtigungsgeschützt: Nur Teammitglieder, deren [Moderationslevel](#configuration-modlevels) diesen Aktionstyp erlaubt, können ihn aufheben. + +### Dauer bearbeiten {#edit-duration} + +Verwende `/moderate edit-duration` oder den **Dauer bearbeiten**-Button und -Dialog in der [Aktionsansicht](#actions) (angezeigt, wenn **Aufheben-Buttons** aktiviert sind), um einen aktiven temporären Mute, Ban oder eine Quarantäne nach der Anwendung zu verkürzen oder zu verlängern. Der betroffene Nutzer wird per DM über die Änderung informiert (siehe die **Nachricht bei Dauer-Änderung** unter [Nachrichten](#configuration-strings)). + +### Grund bearbeiten {#edit-reason} + +Ein **Grund bearbeiten**-Button erscheint unter jeder Log-Nachricht und in der [Aktionsansicht](#actions) - er teilt sich den Schalter **Aufheben-Buttons** (siehe [Konfiguration](#configuration-config)). `/moderate edit-reason` macht dasselbe über die Kommandozeile. Der Grund wird an Ort und Stelle neu geschrieben, und die Änderung wird zur Nachvollziehbarkeit als Fall-Ereignis aufgezeichnet. + +### Beteiligte Nutzer {#involved-users} + +Ein Fall kann sich auf mehr als eine Person beziehen - das Mitglied, das ihn gemeldet hat, ein zweiter Account, der in denselben Vorfall verwickelt ist, oder ein Zeuge. Wenn **Verknüpfen beteiligter Nutzer erlauben** aktiviert ist, fügst du sie mit der `involved`-Option an einer Aktion, dem `/moderate involve`-Befehl oder der Nutzerauswahl in der [Aktionsansicht](#actions) hinzu. Beteiligte Nutzer dienen nur als Referenz: Sie werden nie bestraft oder benachrichtigt und erscheinen über den [Log-Platzhalter](#configuration-logmessages) `%involved%`, sodass du entscheidest, ob sie in deinem internen Log, einem öffentlichen oder in beiden angezeigt werden. + +### Melden {#report} + +Jeder Nutzer kann einen anderen Nutzer mit `/report` melden oder mit der rechten Maustaste auf einen Nutzer oder eine Nachricht klicken und **Nutzer melden** / **Nachricht melden** verwenden. Eine Meldung enthält den Grund, optionale Beweisbilder (bis zu zehn in den Kontextmenü-Abläufen) und einen verschlüsselten Schnappschuss der aktuellen Nachrichten im Kanal. Meldungen werden an den konfigurierten Report-Kanal (oder den Log-Kanal, wenn kein Report-Kanal festgelegt ist) gesendet. Konfigurierte Rollen werden gepingt, wenn eine Meldung eingeht. Mitglieder, deren Moderationslevel als **Immun gegen Meldungen** markiert ist, können nicht gemeldet werden. + +### Notizen {#notes} + +Moderatoren können Notizen über Nutzer erstellen, ansehen, bearbeiten und löschen. Notizen sind nützlich, um Informationen über Nutzer über Moderationsaktionen hinweg festzuhalten. Alle Moderatoren mit Zugriff auf den `/moderate`-Befehl können Notizen verwalten. + +### Aktionsverlauf {#actions} + +Moderatoren können alle vergangenen Moderationsaktionen gegen einen Nutzer ansehen, einschließlich Warns, Mutes, Kicks, Bans und Quarantänen. In dieser Ansicht befinden sich die Buttons pro Fall: [eine Bestrafung aufheben](#lift-punishment), [ihre Dauer](#edit-duration) oder ihren [Grund bearbeiten](#edit-reason), [Beweise hinzufügen](#evidence-archival) und [beteiligte Nutzer verknüpfen](#involved-users) - jeweils angezeigt, wenn die zugehörige Funktion aktiviert ist. + +### Beweis-Archivierung {#evidence-archival} + +Beweise sind nicht länger auf einen einzelnen Screenshot beschränkt. Du kannst an eine Moderationsaktion bis zu zehn Beweisbilder anhängen - sowohl beim Ausführen (über die `proof`-Option oder das Upload-Feld im Kontextmenü) als auch nachträglich, wenn **Hinzufügen weiterer Beweis-Bilder erlauben** aktiviert ist, über den **Beweis hinzufügen**-Button unter jeder Log-Nachricht oder den `/moderate add-proof`-Befehl. Bilder werden in der [Datei-Bibliothek](/docs/scnx/guilds/files) deines Servers archiviert, das Fall-Log verlinkt auf diese dauerhaften URLs anstatt auf Discords ablaufende CDN-URLs, und die Log-Nachricht aktualisiert sich an Ort und Stelle und zeigt alles zusammen als Galerie. Auch Meldungen tragen Beweise. + +Gespeicherte Beweisdateien werden auf das [Dateispeicher-Kontingent](/docs/scnx/guilds/files#understanding-storage-limits) deines Servers angerechnet. Um dich abzumelden, aktiviere **Disable attachment archival** in der Allgemeinen Konfiguration des Bots; mit deaktivierter Archivierung greifen Beweis-Links wieder auf Discords URLs zurück und laufen irgendwann ab. + +### Lockdown {#lockdown} + +Das Lockdown-System ermöglicht es dir, alle Kanäle auf dem Server auf einmal zu sperren. Dies kann manuell durch Moderatoren oder automatisch ausgelöst werden, wenn Sicherheitssysteme (Anti-Join-Raid, Join Gate oder Anti-Spam) auslösen. Das Lockdown-System muss zuerst in der [Lockdown-Konfiguration](#configuration-lockdown) aktiviert werden. + +Wenn ein Lockdown aktiviert wird, speichert der Bot den aktuellen Berechtigungszustand aller Kanäle und entzieht dann der @everyone-Rolle die Berechtigung zum Senden von Nachrichten. Wenn der Lockdown aufgehoben wird, werden die ursprünglichen Berechtigungen wiederhergestellt. Ein optionaler Auto-Aufhebungs-Timer kann den Lockdown nach einer angegebenen Anzahl von Minuten automatisch beenden. Mitglieder, deren [Moderationslevel](#configuration-modlevels) **Während Lockdown schreiben** oder **Immun gegen Lockdown** gesetzt hat, können weiterhin schreiben. + +Du kannst optional bestimmte Kanäle konfigurieren, in die Lockdown- und Aufhebungs-Nachrichten gesendet werden, anstatt sie in jeden betroffenen Kanal zu senden. Die Berechtigungen werden unabhängig von dieser Einstellung dennoch in allen Kanälen geändert. + +### Import nativer Discord-Moderation {#native-import} + +Mit aktiviertem **Native Moderationsaktionen importieren** (siehe [Konfiguration](#configuration-config)) werden Bans, Unbans, Kicks und Timeouts, die mit Discords eigenen integrierten Tools durchgeführt wurden, in die Moderationsdatenbank und den Log-Kanal des Bots aufgenommen, sodass dein Verlauf und deine Verstoßzähler vollständig bleiben, egal wie eine Aktion ausgeführt wurde. Du kannst es pro Aktionstyp aktivieren (Bans/Unbans, Kicks, Timeouts) und optional dem betroffenen Nutzer eine DM senden. Dies gilt nur für Live-Aktionen (während der Bot läuft) und erfordert, dass der Bot die Berechtigung **Audit-Log ansehen** hat. + +## Befehle {#commands} + + + +| Command | Beschreibung | +| ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | +| `/moderate warn user: [reason:] [proof:] [involved:]` | Verwarnt einen Nutzer. | +| `/moderate mute user: duration: [reason:] [proof:] [involved:]` | Schaltet einen Nutzer für die angegebene Dauer stumm (Timeout). | +| `/moderate unmute user: [reason:]` | Hebt die Stummschaltung eines Nutzers auf. | +| `/moderate kick user: [reason:] [proof:] [involved:]` | Kickt einen Nutzer vom Server. | +| `/moderate ban user: [reason:] [proof:] [duration:] [days:] [involved:]` | Bannt einen Nutzer. Optional kannst du eine Dauer für einen temporären Ban und die Anzahl der Tage an zu löschenden Nachrichten festlegen. | +| `/moderate unban id: [reason:]` | Entbannt einen Nutzer anhand seiner Nutzer-ID. Unterstützt Autovervollständigung. | +| `/moderate quarantine user: [reason:] [duration:] [involved:]` | Setzt einen Nutzer in Quarantäne, indem die Quarantäne-Rolle zugewiesen wird. | +| `/moderate unquarantine user: [reason:]` | Nimmt einen Nutzer aus der Quarantäne und stellt seine vorherigen Rollen wieder her. | +| `/moderate channel-mute user: [reason:] [proof:] [involved:]` | Schaltet einen Nutzer nur im aktuellen Kanal stumm. | +| `/moderate remove-channel-mute user: [reason:]` | Entfernt eine Kanal-Stummschaltung von einem Nutzer. | +| `/moderate clear [amount:]` | Löscht aktuelle Nachrichten im aktuellen Kanal (Standard: 5). | +| `/moderate lock [reason:]` | Sperrt den aktuellen Kanal. | +| `/moderate unlock` | Entsperrt den aktuellen Kanal. | +| `/moderate lockdown enable: [reason:]` | Aktiviert oder hebt den serverweiten Lockdown auf (nur verfügbar, wenn das Lockdown-System aktiviert ist). | +| `/moderate notes view user:` | Zeigt alle Notizen zu einem Nutzer an. | +| `/moderate notes create user: notes:` | Erstellt eine neue Notiz für einen Nutzer. | +| `/moderate notes edit user: note-id: notes:` | Bearbeitet eine bestehende Notiz. | +| `/moderate notes delete user: note-id:` | Löscht eine Notiz. | +| `/moderate actions user:` | Zeigt alle vergangenen Moderationsaktionen für einen Nutzer an, mit den Buttons pro Fall. | +| `/moderate revoke-warn warn-id: [reason:]` | Nimmt eine Verwarnung anhand ihrer ID zurück. Unterstützt Autovervollständigung. | +| `/moderate edit-duration id: duration: [reason:]` | Verkürzt oder verlängert einen aktiven temporären Mute, Ban oder eine Quarantäne. Unterstützt Autovervollständigung. | +| `/moderate edit-reason id: reason:` | Schreibt den Grund eines bestehenden Falls neu. Unterstützt Autovervollständigung. | +| `/moderate add-proof id: photo: [photo2:] [photo3:]` | Hängt zusätzliche Beweisbilder an einen bestehenden Fall an. Unterstützt Autovervollständigung. | +| `/moderate involve id: user: [remove:]` | Verknüpft (oder entfernt mit `remove` die Verknüpfung) einen beteiligten Nutzer mit einem Fall. Unterstützt Autovervollständigung. | +| `/report user: reason: [proof:]` | Meldet einen Nutzer an das Moderationsteam. | + +Hinweise: + +- Ob `reason` und `proof` erforderlich sind, hängt von den Konfigurationsoptionen **Begründung erzwingen** und **Beweis-Bild erzwingen** ab. +- Wenn **Benutzerdefinierten Fall-Titel verlangen** aktiviert ist, erscheint eine zusätzliche erforderliche Option `title:` bei Verwarnen, Stummschalten, Bannen, Kicken, Quarantäne und Kanal-Stummschaltung (sowie in deren Rechtsklick-Dialogen). Wenn die Funktion aus ist, wird überhaupt keine Titel-Option hinzugefügt. +- Die Unterbefehle `edit-duration`, `edit-reason`, `add-proof` und `involve` wirken auf einen bestehenden Fall über dessen ID und funktionieren nur, wenn ihr jeweiliger Opt-in-Schalter aktiviert ist. + +## Konfiguration {#configuration} + +### Konfiguration {#configuration-config} + +In dieser Konfigurationsdatei richtest du die zentralen Moderationseinstellungen ein. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/config). + +Moderator-Berechtigungen befinden sich nicht mehr hier - sie werden in der separaten Konfiguration [Moderationslevel](#configuration-modlevels) definiert. Die alten Moderator-Level-1-4-Rollenfelder werden beim Start automatisch in gleichwertige Level migriert und danach ausgeblendet. + +| Feld | Beschreibung | +| ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Log-Kanal | Kanal, in dem Moderationsaktionen protokolliert werden. | +| Quarantäne-Rolle | Rolle, die quarantänisierten Nutzern zugewiesen wird. Alle anderen Rollen werden entfernt (und zur Wiederherstellung gespeichert). | +| Report-Kanal | Kanal, in den Nutzermeldungen gesendet werden. Fällt auf den Log-Kanal zurück, wenn nicht festgelegt. | +| Bei Quarantäne alle Rollen entfernen | Wenn aktiviert, werden einem Nutzer bei der Quarantäne alle Rollen entfernt. Rollen werden gespeichert und beim Aufheben der Quarantäne wiederhergestellt. | +| Neue Rollen von quarantänisierten Benutzern entfernen | Wenn aktiviert, wird jede Rolle, die einem quarantänisierten Nutzer hinzugefügt wird (über Discords Tab "Kanäle & Rollen", Reaktionsrollen oder einen anderen Bot), automatisch wieder entfernt. Verwaltete Rollen wie Server-Boosts und Integrationsrollen bleiben unberührt. Standardmäßig aus. | +| Verhindern Sie das manuelle Entfernen der Quarantäne-Rolle | Wenn aktiviert, weist der Bot die Quarantäne-Rolle erneut zu, wenn ein Teammitglied sie manuell entfernt, anstatt `/moderate unquarantine` zu verwenden, und postet einen Hinweis im Log-Kanal. Wenn aus, bleibt das bisherige Verhalten erhalten: Das manuelle Entfernen der Rolle hebt die Quarantäne des Nutzers weiterhin implizit auf. Standardmäßig aus. | +| Rollenpings bei Report | Rollen, die im Log-/Report-Kanal gepingt werden, wenn ein Nutzer eine Meldung einreicht. | +| Begründung erzwingen | Wenn aktiviert, müssen Moderatoren einen Grund für ihre Aktionen angeben. | +| Beweis-Bild erzwingen | Wenn aktiviert (und "Begründung erzwingen" ebenfalls aktiviert ist), müssen Moderatoren einen Beweis für ihre Aktionen hochladen. | +| Aktion bei Invite | Aktion, die ausgeführt wird, wenn ein Nutzer einen Discord-Einladungslink postet. Optionen: keine, nur löschen (die Nachricht ohne Bestrafung entfernen), verwarnen, stummschalten, kicken, in Quarantäne setzen oder bannen. | +| Erlaubte Einladungs-Server-IDs | Server-IDs, deren Einladungslinks erlaubt sind und keine Moderation auslösen. Einladungen zu deinem eigenen Server sind immer automatisch erlaubt. | +| Aktion bei Scam-Link | Aktion, die ausgeführt wird, wenn ein Nutzer einen mutmaßlichen Scam-Link postet. Gleiche Optionen wie bei Einladungen, einschließlich Nur-Löschen. | +| Level der Scam-Link-Erkennung | Gegen welche von SCNX gepflegte Liste abgeglichen wird. "confirmed" filtert nur bestätigte Scam- und Phishing-Domains; "suspicious" wendet zusätzlich Heuristiken an, die noch nicht bestätigte Domains kennzeichnen können. | +| Erlaubte Kanäle für Invitesperre | Kanäle oder Kategorien, in denen die Invite-Sperre deaktiviert ist. | +| Erlaubte Rollen für Invitesperre | Rollen, die die Invite-Sperre umgehen dürfen. | +| Gesperrte Wörter | Wörter, die in Nachrichten blockiert werden. | +| Aktion bei gesperrtem Wort | Aktion, die ausgeführt wird, wenn ein Nutzer ein gesperrtes Wort postet. Gleiche Optionen wie bei Einladungen, einschließlich Nur-Löschen. | +| Standardmäßige Mute-Länge | Standard-Mute-Dauer, wenn keine angegeben ist. Wird auch für Automod-Aktionen verwendet. Maximal 28 Tage. | +| Nicknamen bei Mute- / Quarantäne ändern | Wenn aktiviert, werden Nutzer bei Mute oder Quarantäne umbenannt. Das Mute-/Quarantäne-Präfix wird über den [zentralen Nicknamen-Manager](/docs/custom-bot/modules/community/nicknames#central-nickname-manager) angewendet, sodass es nur einmal hinzugefügt wird (erneutes Muten erzeugt nie `[Muted] [Muted] X`) und das Aufheben von Mute/Quarantäne jedes Rollen-Präfix oder aktive Streak-Suffix erhält. | +| Neuer Nickname bei Mute | Nicknamen-Vorlage, wenn ein Nutzer stummgeschaltet wird. Unterstützt `%nickname%` (ursprünglicher Nickname). | +| Nickname während der Quarantäne | Nicknamen-Vorlage, wenn ein Nutzer in Quarantäne gesetzt wird. Unterstützt `%nickname%` (ursprünglicher Nickname). | +| Automod | Definiere automatische Aktionen (Mute, Kick, Ban, Quarantäne) basierend auf der Anzahl der Verwarnungen. Format: Schlüssel = Anzahl der Warns, Wert = Aktion (optional mit Dauer, z. B. "ban:7d"). | +| Sollen Warns automatisch gelöscht werden? | Wenn aktiviert, werden Warns nach dem konfigurierten Ablaufzeitraum automatisch entfernt. | +| Zeit, nach der Warns automatisch ablaufen | Dauer, nach der Warns ablaufen (z. B. "3 months", "1y", "2w"). | +| Native Moderationsaktionen importieren | Wenn aktiviert, werden Bans, Unbans, Kicks und Timeouts, die mit Discords nativen Tools durchgeführt wurden, in die Moderationsdatenbank und den Log-Kanal aufgenommen. Erfordert, dass der Bot **Audit-Log ansehen** hat, sonst bleibt es inaktiv. | +| Native Bans und Unbans importieren | Zeichnet Bans und Unbans auf, die mit Discords nativen Tools durchgeführt wurden. | +| Native Kicks importieren | Zeichnet Kicks auf, die mit Discords nativen Tools durchgeführt wurden. | +| Native Timeouts importieren | Zeichnet Timeouts und Timeout-Aufhebungen auf, die mit Discords nativen Tools durchgeführt wurden. | +| Nutzer bei importierten Aktionen per DM benachrichtigen | Versucht, betroffene Nutzer per DM über eine importierte Aktion zu informieren (nach Kicks/Bans meist unmöglich). | +| Aufheben-Buttons | Zeigt Ein-Klick-[Bestrafung aufheben](#lift-punishment)-Buttons an Moderations-Log-Nachrichten und in der Aktionsansicht. Ein Klick fragt nach einem optionalen Grund. | +| Hinzufügen weiterer Beweis-Bilder erlauben | Ermöglicht Moderatoren, mit dem **Beweis hinzufügen**-Button oder `/moderate add-proof` zusätzliche Beweisbilder an einen bestehenden Fall anzuhängen; die Log-Nachricht aktualisiert sich an Ort und Stelle. | +| Verknüpfen beteiligter Nutzer erlauben | Ermöglicht Moderatoren, zusätzliche [beteiligte Nutzer](#involved-users) mit einem Fall zu verknüpfen; sie werden über den Vorlagen-Platzhalter `%involved%` angezeigt. | +| Benutzerdefinierten Fall-Titel verlangen | Fügt jeder Moderationsaktion ein erforderliches kurzes Titel-Feld hinzu (z. B. "Mehrere Nutzer beleidigt"). Der Titel wird über `%title%` zur Überschrift des Log-Embeds, und die Fallnummer wandert in die Fußzeile. | + +### Moderationslevel {#configuration-modlevels} + +In dieser Konfigurationsdatei definierst du deine benutzerdefinierten Moderationslevel. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/modLevels). + +Jedes Level ist ein Eintrag, der die Rollen auflistet, für die es gilt, und die Berechtigungen, die diese Rollen erhalten. Erstelle so viele benannte Level, wie du möchtest - zum Beispiel ein Trial-Mod-Level mit nur Verwarnen und Stummschalten und ein dediziertes Anti-Raid-Level mit nichts als Lockdown-Kontrolle. Ein Mitglied erhält die kombinierten Berechtigungen jedes Levels, dessen Rollen es besitzt. Wenn du aktualisierst, wird dein altes Moderator-Level-1-4-Setup automatisch in gleichwertige Level migriert und funktioniert genau wie zuvor. + +| Feld | Beschreibung | +| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| Level-Name | Ein Name für dieses Moderationslevel, der nur im Dashboard zu deiner eigenen Referenz angezeigt wird. | +| Rollen | Mitglieder, die eine dieser Rollen besitzen, erhalten die Berechtigungen dieses Levels. | +| Mitglieder verwarnen | Erlaubt das Verwarnen von Mitgliedern und das Verwalten von Verwarnungsnotizen. | +| Mitglieder stummschalten | Erlaubt das Stummschalten und Aufheben der Stummschaltung von Mitgliedern. | +| Kanäle sperren | Erlaubt das Sperren und Entsperren von Kanälen. | +| Mitglieder kanalweit stummschalten | Erlaubt das kanalweite Stummschalten von Mitgliedern und das Entfernen von Kanal-Stummschaltungen. | +| Mitglieder kicken | Erlaubt das Kicken von Mitgliedern vom Server. | +| Nachrichten löschen | Erlaubt das Massenlöschen von Nachrichten aus Kanälen. | +| Mitglieder in Quarantäne setzen | Erlaubt das Setzen in und Aufheben aus der Quarantäne von Mitgliedern. | +| Mitglieder bannen | Erlaubt das Bannen und Entbannen von Mitgliedern. | +| Automod umgehen | Mitglieder dieses Levels sind von Anti-Spam- und Nachrichtenschutz-Filtern ausgenommen. | +| Immun gegen Meldungen | Mitglieder dieses Levels können nicht von anderen Nutzern gemeldet werden. | +| Während Lockdown schreiben | Mitglieder dieses Levels behalten die Möglichkeit, Nachrichten zu senden, wenn ein Lock-All ausgelöst wird. | +| Immun gegen Lockdown | Mitglieder dieses Levels sind vollständig von Server-Lockdowns ausgenommen, einschließlich Kanal-Berechtigungsüberschreibungen. | + +### Anti-Spam {#anti-spam} + +In dieser Konfigurationsdatei richtest du das Anti-Spam-System ein. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/antiSpam). + +Anti-Spam ist in einzelne Detektoren aufgeteilt, die du separat aktivierst, einstellst und mit Aktionen versiehst. Es gibt eine Reihe geteilter Einstellungen und eine Standardaktion, und dann kann jeder Detektor das Zeitfenster, die Aktion und das Auto-Lösch-Verhalten überschreiben und seine eigene Benachrichtigungsnachricht verwenden. + +#### Geteilte Einstellungen + +| Feld | Beschreibung | +| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Aktiviert | Aktiviert oder deaktiviert das gesamte Anti-Spam-System. | +| Zeitfenster (in Sekunden) | Standard-Zeitfenster, in dem Nachrichten zur Spam-Erkennung verfolgt werden. Jeder Detektor kann dies überschreiben. | +| Aktion | Standardaktion, die ausgeführt wird, wenn ein Detektor auslöst (verwarnen, stummschalten, kicken, in Quarantäne setzen oder bannen). Detektoren mit "übernehmen" verwenden diese. | +| Erkannte Spam-Nachrichten automatisch löschen | Globaler Standard: Löscht auch die Nachrichten, die eine Erkennung ausgelöst haben. Auto-Löschen räumt den gesamten beanstandeten Schwall über jeden Kanal hinweg auf, in dem er gelandet ist. Jeder Detektor kann dies überschreiben. | +| Chatnachricht senden | Wenn aktiviert, postet der Bot eine Benachrichtigung im Kanal, wenn ein Detektor auslöst. | +| Nachricht | Die Benachrichtigungsnachricht. Unterstützt `%userid%`, `%reason%`, `%type%` (Detektor-Bezeichnung), `%count%`, `%threshold%`, `%timeframe%` und `%action%`. | +| Ignorierte Kanäle | Kanäle, in denen Anti-Spam deaktiviert ist. | +| Ignorierte Rollen | Rollen, die von der Anti-Spam-Erkennung ausgenommen sind. | + +#### Felder pro Detektor + +Jeder Detektor teilt sich denselben Satz an Optionen, zusätzlich zu seinen eigenen Grenzwert-Feldern: + +| Feld | Beschreibung | +| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| ...-Erkennung aktivieren | Schaltet diesen bestimmten Detektor ein oder aus. | +| Zeitfenster-Überschreibung (in Sekunden) | Erkennungsfenster für diesen Detektor; leer lassen, um das globale Zeitfenster zu verwenden. | +| Aktion | Aktion für diesen Detektor; "Standardaktion übernehmen" verwendet die globale Aktion, "Keine Aktion" löscht nur. | +| Aktionsdauer (nur Mute/Ban) | Dauer für einen Mute oder Ban (z. B. 1h, 7d); leer lassen für die Standarddauer. | +| Spam-Nachrichten automatisch löschen | Überschreibt die globale Auto-Lösch-Voreinstellung für diesen Detektor (übernehmen / an / aus). | +| Benachrichtigungs-Überschreibung | Eine Chat-Benachrichtigung nur für diesen Detektor; leer lassen, um auf die globale **Nachricht** zurückzufallen. | + +Die Detektoren und ihre Grenzwert-Felder sind: + +| Detektor | Grenzwert-Feld(er) | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Nachrichtenrate | **Maximale Nachrichten im Zeitfenster** | +| Doppelte Inhalte | **Maximale gleiche Nachrichten im Zeitfenster** | +| Nutzer-Erwähnungen | **Maximale Pings im Zeitfenster** (zählt auch Antworten) | +| Massenerwähnungen | **Maximale Massenpings im Zeitfenster** (@everyone, @here, Rollen-Pings) | +| Anhang-/Bild-Spam | **Max. Nachrichten mit Anhängen im Zeitfenster** | +| Link-Spam | **Max. Nachrichten mit Links im Zeitfenster** | +| Zeilen-/Zeichen-Flut | **Max. Zeilenumbrüche pro Nachricht** und **Max. Zeichen pro Nachricht** (eine einzelne Nachricht, die eines der Limits überschreitet, löst aus) | +| Sticker-/Emoji-Spam | **Max. Sticker-/Emoji-Nachrichten im Zeitfenster** und **Benutzerdefinierte Emojis, die als Spam zählen** | +| Kanal-Streuung | **Max. verschiedene Kanäle im Zeitfenster** (derselbe Nutzer postet über viele Kanäle hinweg) | +| Text-Missbrauch | **Beanstandete Nachrichten vor Aktion**, plus Schalter pro Prüfung: **Caps-Spam erkennen** (mit Mindestanzahl Buchstaben und Großbuchstaben-Prozentsatz), **Wiederholte Zeichen erkennen** (max. Folgenlänge), **Zalgo / Unicode-Missbrauch erkennen** (Prozentsatz kombinierender Zeichen) und **Spoiler-Spam erkennen** (max. Blöcke pro Nachricht). | + +### Einschränkungen für neue Mitglieder {#new-member-restrictions} + +Diese Einstellungen befinden sich in der [Anti-Spam-Konfiguration](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/antiSpam) unter der Kategorie Neue-Mitglieder-Einschränkungen. Sie verlangen eine Mindestzeit auf dem Server, bevor neue Mitglieder Anhänge und/oder Links posten dürfen - eine einfache Wand gegen Wegwerf-Accounts, die beitreten und sofort einen Scam-Link einfügen. Nachrichten, die gegen die Regel verstoßen, werden mit einem optionalen Hinweis gelöscht, und Wiederholungstäter können zu einer Moderationsaktion eskaliert werden. + +| Feld | Beschreibung | +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | +| Neue-Mitglieder-Einschränkungen aktivieren | Schaltet die Neue-Mitglieder-Einschränkungen ein oder aus. | +| Anhang-Einschränkungsalter | Mitglieder, die jünger als dies sind (z. B. 1d), können keine Anhänge posten; leer lassen, um Anhänge zu erlauben. | +| Link-Einschränkungsalter | Mitglieder, die jünger als dies sind (z. B. 12h), können keine Links posten; leer lassen, um Links zu erlauben. | +| Bei Verstoß benachrichtigen | Sendet einen kurzen, automatisch entfernten Hinweis im Kanal, wenn eine eingeschränkte Nachricht gelöscht wird. | +| Hinweistext | Der Hinweistext. Unterstützt `%userid%`, `%type%` (Anhänge oder Links), `%required%`, `%count%` und `%threshold%`. | +| Verstöße vor Aktion | Anzahl der Verstöße innerhalb des Zeitfensters, die zu einer Moderationsaktion eskalieren; 0 eskaliert nie. | +| Verstoß-Zeitfenster (in Sekunden) | Zeitraum, über den Verstöße auf den Grenzwert gezählt werden. | +| Aktion | Aktion für Wiederholungsverstöße; "übernehmen" verwendet die globale Anti-Spam-Aktion. | +| Aktionsdauer (nur Mute/Ban) | Dauer für einen Mute oder Ban; leer lassen für die Standarddauer. | + +### Log-Nachrichten {#configuration-logmessages} + +In dieser Konfigurationsdatei passt du die Fall-Log-Nachrichten an, die in deinen Moderations-Log-Kanal und optional in einen öffentlichen Log-Kanal gepostet werden. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/logMessages). + +Jeder Aktionstyp hat seine eigene bearbeitbare Embed-Vorlage, die mit dem vollständigen Embed-Editor geöffnet wird: **Stummschaltung**, **Stummschaltung aufheben**, **Quarantäne**, **Quarantäne aufheben**, **Kick**, **Bann**, **Verwarnung**, **Kanal-Stummschaltung**, **Kanal-Stummschaltung aufheben**, **Verwarnung entfernen** und **Entbannungs-Log-Nachricht**. Die Embed-Farbe wird immer automatisch gesetzt (gelb für temporär, grün für Aufhebungen, rot für Basis-Aktionen) und überschreibt jede Farbe in der Vorlage; die Felder für Ablauf, Beweis und Kanal werden automatisch angehängt, wenn sie zutreffen. + +Vorlagen unterstützen diese Platzhalter: + +| Platzhalter | Bedeutung | +| ----------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| `%title%` | Benutzerdefinierter Fall-Titel oder das lokalisierte "Fall #N", wenn keiner gesetzt ist. | +| `%case%` | Die Fall-(Aktions-)ID-Nummer. | +| `%victim%` / `%victimId%` / `%victimAvatar%` | Name, Nutzer-ID und Avatar des betroffenen Mitglieds. | +| `%moderator%` / `%moderatorId%` / `%moderatorAvatar%` | Name, Nutzer-ID und Avatar des handelnden Moderators. | +| `%action%` | Aktions-Bezeichnung (mit tmp-Präfix bei temporären Aktionen). | +| `%reason%` | Grund für die Aktion. | +| `%date%` | Formatierter Zeitstempel, wann die Aktion ausgeführt wurde. | +| `%expires%` / `%expiresAt%` | Formatierter Ablauf oder ein Live-Countdown-Zeitstempel; leer, wenn die Aktion nicht abläuft. | +| `%duration%` | Menschenlesbare Länge einer temporären Aktion oder leer. | +| `%channelName%` / `%channelMention%` | Name / Erwähnung des zugehörigen Kanals oder leer. | +| `%involved%` | Erwähnungen der zusätzlich mit diesem Fall verknüpften Nutzer oder leer, wenn keine. | + +#### Öffentliche Logs + +Spiegle Aktionen optional in einen zweiten, öffentlichen Kanal mit einer separaten, anders formulierten Nachricht pro Aktionstyp - halte das detaillierte interne Log privat, während du eine freundlichere Mitteilung mit deiner Community teilst. + +| Feld | Beschreibung | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Kanal für öffentliche Log-Nachrichten | Kanal, in den öffentliche Moderations-Logs gesendet werden; leer lassen, um öffentliches Logging zu deaktivieren. | +| Öffentliche Log-Nachrichten aktivieren | Hauptschalter für das öffentliche Log; wenn aus, werden unabhängig von den Einstellungen pro Typ keine öffentlichen Logs gesendet. | +| Beweise in öffentlichen Log-Nachrichten anzeigen | Wenn an, werden Beweis-Anhänge auch im öffentlichen Log gezeigt (standardmäßig aus, damit Beweise nicht öffentlich sichtbar werden). | +| Öffentliche Log-Nachricht: Stummschaltungen / Stummschaltung-Aufhebungen / Banns / Entbannungen / Kicks / Quarantänen | Schalter pro Aktion, ob dieser Aktionstyp auch öffentlich protokolliert wird. | +| ...: Öffentliche Log-Nachricht | Die bearbeitbare Embed-Vorlage, die im öffentlichen Kanal für jeden aktivierten Aktionstyp verwendet wird. Nutzt dieselben Platzhalter wie oben; automatische Felder werden öffentlichen Nachrichten nie hinzugefügt. | + +### Anti-Join-Raid {#anti-join-raid} + +In dieser Konfigurationsdatei richtest du das Anti-Join-Raid-System ein. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/antiJoinRaid). + +| Feld | Beschreibung | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------ | +| Aktiviert | Aktiviert oder deaktiviert das Anti-Join-Raid-System. | +| Zeitfenster (in Minuten) | Zeitfenster, in dem Beitritte verfolgt werden. | +| Maximale Beitrittsanzahl | Anzahl der im Zeitfenster erlaubten Beitritte, bevor das System auslöst. | +| Aktion | Aktion gegen Nutzer, die das System auslösen (stummschalten, kicken, in Quarantäne setzen, bannen oder Rolle vergeben). | +| Rolle | Rolle, die Nutzern zugewiesen wird, wenn die Aktion "give-role" ist. | +| Andere Rollen entfernen | Wenn aktiviert (und die Aktion "give-role" ist), werden dem Nutzer nach einer kurzen Verzögerung andere Rollen entfernt. | + +### Join Gate {#join-gate} + +In dieser Konfigurationsdatei richtest du das Join Gate ein. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/joinGate). + +| Feld | Beschreibung | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| Aktiviert? | Aktiviert oder deaktiviert das Join Gate. | +| Alle Nutzer filtern | Wenn aktiviert, werden Aktionen gegen alle neuen Nutzer unabhängig von den Kriterien ausgeführt. | +| Aktion | Aktion, wenn ein Nutzer das Join Gate nicht besteht (stummschalten, kicken, in Quarantäne setzen, bannen oder Rolle vergeben). | +| Rolle | Rolle, die Nutzern zugewiesen wird, wenn die Aktion "give-role" ist. | +| Andere Rollen entfernen | Wenn aktiviert (und die Aktion "give-role" ist), werden dem Nutzer andere Rollen entfernt. | +| Minimales Accountalter | Mindest-Accountalter in Tagen, das erforderlich ist, um das Join Gate zu bestehen. | +| Benötige Profilbild | Wenn aktiviert, müssen Nutzer ein Profilbild gesetzt haben, um das Join Gate zu bestehen. | +| Ignoriere Bots | Wenn aktiviert, dürfen Bots das Join Gate ohne Einschränkungen passieren. | + +### Anti-Grief {#anti-grief} + +In dieser Konfigurationsdatei richtest du das Anti-Grief-System ein, um Moderator-Missbrauch zu verhindern. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/antiGrief). + +Diese Funktion setzt automatisch Moderatoren in Quarantäne, die die konfigurierten Limits für Moderationsaktionen innerhalb eines Zeitfensters überschreiten. Damit dies korrekt funktioniert, platziere die Rolle deines Bots über allen anderen Rollen und stelle sicher, dass die Quarantäne-Rolle direkt darunter liegt. + +| Feld | Beschreibung | +| --------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| Aktiviert | Aktiviert oder deaktiviert das Anti-Grief-System. | +| Zeitfenster (in Stunden) | Zeitfenster, in dem Moderationsaktionen gezählt werden. | +| Maximale Anzahl von Verwarnungen in dem Zeitfenster | Maximale Verwarnungen, die ein Moderator ausführen kann, bevor er in Quarantäne gesetzt wird. | +| Maximale Anzahl von Mutes in dem Zeitfenster | Maximale Mutes, die ein Moderator ausführen kann, bevor er in Quarantäne gesetzt wird. | +| Maximale Anzahl von Kicks in dem Zeitfenster | Maximale Kicks, die ein Moderator ausführen kann, bevor er in Quarantäne gesetzt wird. | +| Maximale Anzahl von Bans in dem Zeitfenster | Maximale Bans, die ein Moderator ausführen kann, bevor er in Quarantäne gesetzt wird. | + +### Verifikation {#verification} + +In dieser Konfigurationsdatei richtest du das Verifikationssystem für neue Mitglieder ein. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/verification). + +#### Verifikationsarten + +| Art | Beschreibung | +| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Bild-Captcha (Standard) | Nutzer klicken einen "Verify Me"-Button im Verifizierungs-Kanal. Eine ephemere Nachricht mit einem verzerrten Captcha-Bild wird angezeigt. Sie klicken auf "Enter Solution", um einen Dialog zu öffnen, in den sie die Antwort eingeben. | +| Bild-Captcha (DM, Legacy) | Der ursprüngliche DM-basierte Captcha-Ablauf. Der Bot sendet ein Captcha-Bild per DM und der Nutzer antwortet dort. Der Verifizierungs-Kanal dient als Fallback für Nutzer mit deaktivierten DMs. | +| Wort | Nutzer klicken "Verify Me" und ein Dialog öffnet sich mit einem Wort, das sie erneut eingeben müssen. Die Schwierigkeit steuert Wortlänge und Ungebräuchlichkeit. | +| Mathe | Nutzer klicken "Verify Me" und ein Dialog öffnet sich mit einer Rechenaufgabe. Die Schwierigkeit steuert die Größe der Operanden und die verwendeten Operatoren. | +| Manuell | Wenn ein Mitglied beitritt, erhält es eine DM, die erklärt, was als Nächstes passiert, und dein Team erhält sofort eine Freigabe-Anfrage mit **Freigeben** / **Ablehnen**-Buttons im Verifizierungs-Log-Kanal - ohne darauf zu warten, dass das Mitglied zuerst etwas klickt. | +| Button | Nutzer klicken "Verify Me" und werden sofort verifiziert. Keine Herausforderung, keine Wiederholungen, keine Cooldowns - nützlich, wenn du nur ein Ein-Klick-Opt-in möchtest. | + +#### Konfiguration + +| Feld | Beschreibung | +| --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Aktiviert? | Aktiviert oder deaktiviert das Verifikationssystem. | +| Rolle für Nutzer, die sich noch verifizieren müssen | Rolle, die Nutzern vor Abschluss der Verifikation zugewiesen wird. | +| Rolle für Nutzer mit bestandener Verifikation | Rolle, die Nutzern nach erfolgreicher Verifikation zugewiesen wird. | +| Verifizierungs-Log-Kanal | Kanal, in dem Verifikationsaktionen protokolliert werden und manuelle Freigabe-Anfragen erscheinen. | +| Art der Verifikation | Wie neue Mitglieder sich verifizieren. Eine von **Bild-Captcha** (Bild im Kanal), **Bild-Captcha (DM)** (Legacy, per DM gesendet), **Wort** (ein gezeigtes Wort erneut eingeben), **Mathe** (eine Rechenaufgabe lösen), **Manuell** (ein Moderator gibt jedes Mitglied frei) oder **Button** (ein Klick, keine Herausforderung). | +| Schwierigkeitsgrad der Herausforderung | Schwierigkeit der Verifikations-Herausforderung: einfach, mittel oder schwer. Gilt für Bild-Captcha, Bild-Captcha (DM), Wort und Mathe. Wird bei Manuell und Button ignoriert. | +| Aktion bei Fehlschlagen der Verifikation | Aktion, wenn ein Nutzer alle Verifikationsversuche aufgebraucht hat: kicken, in Quarantäne setzen, bannen oder stummschalten (Timeout). | +| Verifizierungs-Kanal | Kanal, in dem der "Verify Me"-Button angezeigt wird. Für die Legacy-DM-Art dient er als Fallback für Nutzer mit deaktivierten DMs. | +| Maximale Verifizierungsversuche | Wie viele Versuche ein Nutzer bekommt, bevor die Fehlschlags-Aktion angewendet wird. Gilt für Bild-Captcha, Bild-Captcha (DM), Wort und Mathe. Standard: 3. | +| Cooldown zwischen den Versuchen | Wie lange ein Nutzer zwischen Verifikationsversuchen warten muss (z. B. 5m, 10m). Standard: 5m. | +| Strafdauer bearbeiten | Dauer der Mute- oder Quarantäne-Bestrafung (z. B. 1h, 1d). Gilt nur, wenn die Aktion bei Fehlschlagen Mute oder Quarantäne ist. Standard: 1h. | +| Cooldown Nachricht | Nachricht, die angezeigt wird, während ein Nutzer im Wiederholungs-Cooldown ist. | +| Captcha-Nachricht | Nachricht, die mit dem Captcha-Bild angezeigt wird. | +| Manuelle-Verifikation-Nachricht | Nachricht, die an Nutzer gesendet wird, die auf manuelle Verifikation warten. | +| Captcha fehlgeschlagen-Nachricht | Nachricht, die angezeigt wird, wenn ein Nutzer die Verifikation nicht besteht. | +| Captcha abgeschlossen-Nachricht | Nachricht, die angezeigt wird, wenn ein Nutzer die Verifikation erfolgreich abschließt. | +| Verifkations-Kanal-Info-Nachricht | Einführungsnachricht, die im Verifizierungs-Kanal angezeigt wird. | + +#### Wiederholungssystem + +Bei Bild-Captcha, Bild-Captcha (DM), Wort- oder Mathe-Verifikation erhalten Nutzer mehrere Versuche, sich zu verifizieren. Nach jedem fehlgeschlagenen Versuch müssen sie den konfigurierten Cooldown abwarten, bevor sie es erneut versuchen. Sobald alle Versuche aufgebraucht sind, wird die konfigurierte Fehlschlags-Aktion (kicken, bannen, stummschalten oder in Quarantäne setzen) angewendet. + +Manuelle Verifikation hat keinen Wiederholungszähler (Moderatoren prüfen die Anfrage stattdessen erneut), und bei der Button-Verifikation gibt es nichts, was fehlschlagen kann. + +Der Wiederholungszähler bleibt über Bot-Neustarts hinweg erhalten. Wenn ein Nutzer den Server verlässt und erneut beitritt, bleibt seine bisherige Versuchsanzahl erhalten. Eine ausstehende manuelle Anfrage wird abgebrochen, wenn ein Mitglied den Server verlässt, und die zugehörige Freigabe-/Ablehnungs-Log-Nachricht wird entschärft, sodass ein wieder beitretendes Mitglied nicht durch eine veraltete Anfrage ausgesperrt wird. + +### Lockdown {#configuration-lockdown} + +In dieser Konfigurationsdatei richtest du das serverweite Lockdown-System ein. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/lockdown). + +| Feld | Beschreibung | +| ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Lockdown-System aktivieren? | Aktiviert den `/moderate lockdown`-Befehl und automatische Lockdown-Auslöser. | +| Lockdown-Log-Kanal | Kanal für detaillierte Lockdown-Log-Einträge. Fällt auf den Moderations-Log-Kanal zurück, wenn nicht festgelegt. | +| Nachricht in betroffenen Kanälen senden? | Wenn aktiviert, wird bei Aktivierung oder Aufhebung des Lockdowns eine Nachricht in betroffenen Kanälen gesendet. | +| Kanäle für Lockdown-Nachrichten | Bestimmte Textkanäle, in die Lockdown- und Aufhebungs-Nachrichten gesendet werden. Leer lassen, um Nachrichten in alle betroffenen Kanäle zu senden. Die Berechtigungen werden unabhängig von dieser Einstellung dennoch in allen Kanälen geändert. | +| Lockdown-Aktivierungsnachricht | Nachricht, die bei Aktivierung des Lockdowns in betroffenen Kanälen gesendet wird. Unterstützt `%reason%` und `%user%`. | +| Lockdown-Aufhebungsnachricht | Nachricht, die bei Aufhebung des Lockdowns in betroffenen Kanälen gesendet wird. Unterstützt `%user%`. | +| Lockdown automatisch aufheben nach (Minuten, 0 = nur manuell) | Hebt den Lockdown nach der angegebenen Anzahl von Minuten automatisch auf. Auf 0 setzen für Nur-Manuell. | +| Automatischer Lockdown bei Join-Raid? | Aktiviert automatisch einen Lockdown, wenn das Anti-Join-Raid-System auslöst. | +| Automatischer Lockdown bei Join-Gate-Verletzungen? | Aktiviert automatisch einen Lockdown, wenn das Join-Gate-System auslöst. | +| Automatischer Lockdown bei Spam-Erkennung? | Aktiviert automatisch einen Lockdown, wenn das Anti-Spam-System auslöst. | + +### Nachrichten {#configuration-strings} + +In dieser Konfigurationsdatei kannst du alle vom Modul gesendeten Nachrichten anpassen. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=moderation%7Cconfigs/strings). + +| Feld | Beschreibung | +| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Keine Berechtigung | Nachricht, die angezeigt wird, wenn einem Moderator die erforderliche Berechtigung fehlt. Unterstützt `%required_level%`. | +| Nutzer nicht gefunden | Nachricht, die angezeigt wird, wenn eine angegebene Nutzer-ID ungültig ist. | +| Fehlender Grund | Nachricht, die angezeigt wird, wenn ein Grund erforderlich, aber nicht angegeben ist. | +| Ziel ist ein Moderator | Nachricht, die angezeigt wird, wenn ein Moderator versucht, gegen einen anderen Moderator vorzugehen. | +| Meldung eingereicht | Bestätigung, die an Nutzer nach dem Einreichen einer Meldung gesendet wird. Unterstützt `%user%` und `%mURL%`. | +| Mute-Nachricht | DM an stummgeschaltete Nutzer. Unterstützt `%user%` und `%reason%`. | +| Kanal-Mute-Nachricht | DM an kanalweit stummgeschaltete Nutzer. Unterstützt `%user%`, `%reason%` und `%channel%`. | +| Kanal-Entmute-Nachricht | DM, wenn eine Kanal-Stummschaltung entfernt wird. Unterstützt `%user%`, `%reason%` und `%channel%`. | +| Temporäre-Mute-Nachricht | DM an temporär stummgeschaltete Nutzer. Unterstützt `%user%`, `%reason%` und `%date%`. | +| Quarantäne-Nachricht | DM an quarantänisierte Nutzer. Unterstützt `%user%` und `%reason%`. | +| Temporäre-Quarantäne-Nachricht | DM an temporär quarantänisierte Nutzer. Unterstützt `%user%`, `%reason%` und `%date%`. | +| Entquarantäne-Nachricht | DM, wenn die Quarantäne aufgehoben wird. Unterstützt `%user%` und `%reason%`. | +| Entmute-Nachricht | DM an Nutzer, deren Stummschaltung aufgehoben wird. Unterstützt `%user%` und `%reason%`. | +| Kick-Nachricht | DM an gekickte Nutzer. Unterstützt `%user%` und `%reason%`. | +| Ban-Nachricht | DM an gebannte Nutzer. Unterstützt `%user%` und `%reason%`. | +| Temporäre-Ban-Nachricht | DM an temporär gebannte Nutzer. Unterstützt `%user%`, `%reason%` und `%date%`. | +| Verwarnungs-Nachricht | DM an verwarnte Nutzer. Unterstützt `%user%` und `%reason%`. | +| Nachricht bei Dauer-Änderung | DM, wenn ein Moderator [bearbeitet, wie lange](#edit-duration) eine temporäre Bestrafung dauert. Unterstützt `%user%`, `%reason%` und `%date%` (den neuen Ablauf). | +| Kanal-Sperr-Nachricht | Nachricht, die in einem Kanal gesendet wird, wenn er gesperrt wird. Unterstützt `%user%` und `%reason%`. | +| Kanal-Entsperr-Nachricht | Nachricht, die in einem Kanal gesendet wird, wenn er entsperrt wird. Unterstützt `%user%`. | + +## Fehlerbehebung {#troubleshooting} + +- **Der Bot sagt, der Moderator hat keine Berechtigungen**: Stelle sicher, dass die Rolle des Moderators einem [Moderationslevel](#configuration-modlevels) zugewiesen ist, das die Berechtigung der Aktion gewährt. Ein Level, das nur "Mitglieder verwarnen" hat, kann nicht stummschalten, kicken oder bannen. +- **Der Quarantäne-Befehl funktioniert nicht**: Stelle sicher, dass die Quarantäne-Rolle konfiguriert ist und die Rolle des Bots in der Rollenhierarchie über der Quarantäne-Rolle steht. Der Bot benötigt die Berechtigung "Rollen verwalten". +- **Bans/Kicks schlagen fehl**: Der Bot benötigt die Berechtigungen "Mitglieder bannen" und "Mitglieder kicken". Die höchste Rolle des Bots muss außerdem über der höchsten Rolle des Zielnutzers stehen. +- **Anti-Spam erkennt keinen Spam**: Überprüfe, dass Anti-Spam insgesamt aktiviert ist, dass der spezifische Detektor, den du erwartest (zum Beispiel Link-Spam oder Text-Missbrauch), eingeschaltet ist und dass der Kanal nicht auf der Whitelist steht. Prüfe außerdem, dass die Rolle des Nutzers nicht auf der Whitelist steht oder "Automod umgehen" gewährt bekommt. +- **Invite-/Scam-Link-Erkennung funktioniert nicht**: Stelle sicher, dass "Aktion bei Invite" oder "Aktion bei Scam-Link" auf etwas anderes als "keine" gesetzt ist. Prüfe, dass der Kanal nicht auf der Whitelist steht. +- **Verifikations-DMs schlagen fehl**: Manche Nutzer haben DMs deaktiviert. Wenn du einen "Restart Verification-Channel" einrichtest, können Nutzer ihre Verifikation nach dem Aktivieren von DMs erneut versuchen. +- **Der Lockdown-Befehl ist nicht verfügbar**: Das Lockdown-System muss in der [Lockdown-Konfiguration](#configuration-lockdown) aktiviert werden, bevor der `/moderate lockdown`-Befehl erscheint. +- **Native Discord-Aktionen werden nicht protokolliert**: Aktiviere "Native Moderationsaktionen importieren" (und die Schalter pro Typ) und stelle sicher, dass der Bot die Berechtigung "Audit-Log ansehen" hat. Es werden nur Live-Aktionen aufgezeichnet. +- **Anti-Grief hat einen Moderator in Quarantäne gesetzt**: Dies ist das beabsichtigte Verhalten, wenn ein Moderator die konfigurierten Limits überschreitet. Überprüfe und passe die Limits bei Bedarf an. Beachte, dass Anti-Grief nur Aktionen zählt, die über das Moderations-Modul ausgeführt werden; Missbrauch mit Discords eigenen Tools löst es nicht aus, auch wenn diese Aktionen über den [Import nativer Moderation](#native-import) aufgezeichnet werden können. + +## Gespeicherte Daten {#data-usage} + +Die folgenden Daten werden für Moderationsaktionen gespeichert: + +- Die Nutzer-ID des Opfers und des Moderators +- Die Art der Aktion (Warn, Mute, Kick, Ban, Quarantäne usw.) +- Der Grund und, wenn aktiviert, der benutzerdefinierte Fall-Titel +- Alle verknüpften beteiligten Nutzer-IDs (nur als Referenz) +- Referenzen auf Beweisbilder, die in der Datei-Bibliothek archiviert sind +- Fall-Ereignisse wie Grund-Bearbeitungen und Dauer-Änderungen +- Zusätzliche Daten (wie gespeicherte Rollen für die Quarantäne) +- Das Ablaufdatum (für temporäre Aktionen) +- Metadaten über den Eintrag (Datum der Erstellung und letzten Aktualisierung) + +Die folgenden Daten werden für Nutzer-Notizen gespeichert: + +- Die Nutzer-ID +- Alle Notizen (einschließlich Notizinhalt, Autor-ID und Zeitstempeln) +- Metadaten über den Eintrag (Datum der Erstellung und letzten Aktualisierung) + +Die folgenden Daten werden für den Lockdown-Zustand gespeichert: + +- Ob der Lockdown aktiv ist +- Der Grund und wer ihn ausgelöst hat +- Ob er automatisch war +- Eine Sicherung der Kanal-Berechtigungen zur Wiederherstellung +- Metadaten über den Eintrag (Datum der Erstellung und letzten Aktualisierung) + +Um alle von diesem Modul gespeicherten Daten zu entfernen, [lösche die Modul-Datenbank](/docs/custom-bot/additional-features#reset-module-database). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/support/applications.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/support/applications.md new file mode 100644 index 00000000..3b430c89 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/support/applications.md @@ -0,0 +1,108 @@ +# Bewerbungen + +Lass deine Mitglieder sich für Teampositionen, Partnerschaften und mehr bewerben - mit anpassbaren Fragen und einem Annahme- oder Ablehnungs-Workflow. + + + +## Funktionen {#features} + +- Erstelle mehrere Bewerbungs-Kategorien, jede mit eigenen Fragen, eigenem Benachrichtigungs-Kanal und eigenen Rollen. +- Nutzer starten den Bewerbungsprozess über den Befehl `/apply` oder über ein Drop-Down-Menü in einem konfigurierten Informationskanal. +- Fragen werden dem Bewerber per PN gesendet und die Antworten nacheinander gesammelt. +- Teammitglieder können Bewerbungen direkt im Benachrichtigungs-Kanal per Knopf annehmen oder ablehnen. +- Angenommene Nutzer können automatisch die konfigurierten Rollen erhalten. +- Optional kannst du bestimmte Rollen verlangen, um sich zu bewerben oder um Bewerbungen zu bearbeiten. +- Einstellbare Abklingzeit zwischen Bewerbungen, um Spam zu verhindern. +- Optional kann ein verkürzter Bewerbungsinhalt direkt in der Discord-Benachrichtigungsnachricht angezeigt werden. +- Anpassbare Nachrichten für jede Phase des Prozesses (Fragen, Absende-Bestätigung, Annahme, Ablehnung). + +## Einrichtung {#setup} + +1. [Aktiviere das Modul](https://scnx.app/de/glink?page=bot/modules?query=applications) auf deinem Server. +2. Öffne die [Bewerbungen-Kategorien-Konfiguration](https://scnx.app/de/glink?page=bot/configuration?file=applications%7Ccategories) und erstelle mindestens eine Bewerbungs-Kategorie. Lege den Kategorie-Namen, den Benachrichtigungs-Kanal, die Fragen und alle bei Annahme zu vergebenden Rollen fest. +3. Öffne die [Konfiguration](https://scnx.app/de/glink?page=bot/configuration?file=applications%7Cconfig), um Nachrichten und Abklingzeit-Einstellungen anzupassen und optional einen Informationskanal mit Drop-Down-Menü für einen einfachen Zugang einzurichten. +4. Wenn du die Informationskanal-Funktion nutzen willst, setze den "Bewerbungsinfokanal" auf einen Textkanal. Der Bot sendet dann eine Nachricht mit einem Drop-Down-Menü, über das Nutzer eine Kategorie auswählen und sich bewerben können. +5. Stelle sicher, dass der Bot in den Benachrichtigungs-Kanälen die Berechtigungen **Kanal anzeigen** und **Nachrichten senden** hat. Für die Rollenvergabe bei Annahme benötigt der Bot **Rollen verwalten**, wobei seine höchste Rolle über den zu vergebenden Rollen stehen muss. + +## Nutzung {#usage} + +- Nutzer können sich mit `/apply` und der Auswahl einer Kategorie bewerben oder über das Drop-Down-Menü im Informationskanal (falls konfiguriert). +- Der Bot sendet dem Nutzer die erste Frage per PN. Der Nutzer antwortet mit einer Nachricht und der Bot sendet die nächste Frage. Das geht so weiter, bis alle Fragen beantwortet sind. +- Nutzer können ihre Bewerbung jederzeit abbrechen, indem sie während des PN-Prozesses `!cancel` senden. +- Eine Bewerbungs-Sitzung wird erst nach 30 Minuten Inaktivität beendet. Der Timer wird mit jeder Antwort zurückgesetzt, sodass lange Bewerbungen nicht mehr mitten im Prozess ablaufen - nur wirklich abgebrochene Sitzungen werden bereinigt. Wenn eine Sitzung abläuft, schickt der Bot dem Nutzer eine PN, um ihn zu informieren, dass die Bewerbung abgelaufen ist und dass er mit `/apply` von vorne beginnen kann. +- Sobald alle Fragen beantwortet sind, wird die Bewerbung eingereicht. Der Bewerber erhält eine Bestätigungsnachricht mit einem Link zu seinen eingereichten Antworten und eine Benachrichtigung wird in den konfigurierten Benachrichtigungs-Kanal gesendet. +- Im Benachrichtigungs-Kanal können Teammitglieder die Bewerbung ansehen und die Knöpfe "Annehmen" oder "Ablehnen" drücken. Sie können optional einen Grund angeben. Sobald eine Bewerbung bearbeitet wurde, werden deren eigene Annehmen- und Ablehnen-Knöpfe deaktiviert. +- Der Bewerber wird per PN über die Annahme oder Ablehnung informiert, inklusive Grund, falls einer angegeben wurde. +- Wenn für die Kategorie Rollen konfiguriert sind, erhalten angenommene Bewerber diese Rollen automatisch. +- Nutzer können keine neue Bewerbung einreichen, solange sie eine offene Bewerbung haben. Wenn eine Abklingzeit konfiguriert ist, müssen Nutzer zusätzlich die angegebene Dauer zwischen den Einreichungen warten. + +## Befehle {#commands} + + + +| Befehl | Beschreibung | +| ---------------------------- | --------------------------------------------------------------------------------------------------------- | +| `/apply category:` | Starte eine Bewerbung in der angegebenen Kategorie. Das Kategorie-Feld unterstützt Autovervollständigung. | + +## Konfiguration {#configuration} + +### Bewerbungen-Kategorien {#configuration-categories} + +In dieser Konfigurationsdatei richtest du Bewerbungs-Kategorien mit ihren Fragen und Einstellungen ein. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=applications%7Ccategories). + +| Feld | Beschreibung | +| ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| Bewerbungs-Kategorie-Name | Der Name der Bewerbungs-Kategorie, der Nutzern angezeigt wird. Sollte eindeutig sein und nach eingegangenen Bewerbungen nicht mehr geändert werden. | +| Benachrichtigungs-Kanal | Kanal, in den eingereichte Bewerbungen zur Prüfung durch das Team gesendet werden. Hier kann das Team Bewerbungen annehmen oder ablehnen. | +| Fragen | Die Fragen, die Nutzern der Reihe nach gestellt werden. Nutzer beantworten jede Frage per PN mit bis zu 4000 Zeichen (2000 für Nicht-Nitro-Nutzer). | +| Rollen | Rollen, die Nutzern gegeben werden, deren Bewerbung angenommen wurde. | +| Rolle verlangen, um Bewerbungen zu bearbeiten? | Wenn aktiviert, können nur Nutzer mit bestimmten Rollen Bewerbungen in dieser Kategorie annehmen oder ablehnen. | +| Rollen, die Bewerbungen bearbeiten können | Nur Nutzer mit einer dieser Rollen können Bewerbungen annehmen oder ablehnen (gilt nur, wenn die obige Option aktiviert ist). | +| Rolle zum Bewerben verlangen? | Wenn aktiviert, benötigen Nutzer eine der konfigurierten Rollen, um sich in dieser Kategorie zu bewerben. | +| Zum Bewerben notwendige Rollen | Nur Nutzer mit einer dieser Rollen können sich in dieser Kategorie bewerben (gilt nur, wenn die obige Option aktiviert ist). | +| "Notwendige Rolle fehlt" Nachricht | Nachricht, die Nutzern angezeigt wird, die sich bewerben wollen, aber nicht die notwendigen Rollen haben. | +| Emoji | Emoji für diese Kategorie, das im Drop-Down-Menü der Informationsnachricht verwendet wird, falls aktiviert. | +| Kategoriebeschreibung | Beschreibung für diese Kategorie, die im Drop-Down-Menü der Informationsnachricht verwendet wird, falls aktiviert. | + +### Konfiguration {#configuration-config} + +In dieser Konfigurationsdatei kannst du Nachrichten und Einstellungen anpassen. Öffne sie in deinem [Dashboard](https://scnx.app/de/glink?page=bot/configuration?file=applications%7Cconfig). + +| Feld | Beschreibung | +| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Frage-Nachricht | Die Nachricht, die Nutzern mit der zu beantwortenden Frage gesendet wird. Unterstützt `%question%`, `%applicationName%`, `%currentQuestionNumber%` und `%amountOfTotalQuestions%`. | +| Abgesendet-Nachricht | Die Bestätigungsnachricht, die Nutzern gesendet wird, nachdem sie ihre Bewerbung eingereicht haben. Unterstützt `%applicationName%` und `%applicationContentURL%`. | +| Benachrichtigung-Nachricht | Die Nachricht, die in den Benachrichtigungs-Kanal gesendet wird, wenn eine Bewerbung eingeht. Unterstützt `%applicationName%`, `%userTag%`, `%userID%` und `%applicationContentURL%`. Sowohl das klassische Embed-Format als auch der [V4-Nachrichten-Editor](/docs/scnx/guilds/message-editor#v4) werden unterstützt. | +| Team- Ablehnung / Annahme Grund zwingen | Wenn aktiviert, müssen Teammitglieder beim Annehmen oder Ablehnen einer Bewerbung einen Grund angeben. | +| Verkürzten Bewerbungsinhalt in Discord anzeigen? | Wenn aktiviert, wird der Benachrichtigungsnachricht eine Vorschau des Bewerbungsinhalts angehängt. Bei der klassischen Embed-basierten Benachrichtigung wird sie als zusätzliches Embed hinzugefügt; bei einer [V4-Benachrichtigung](/docs/scnx/guilds/message-editor#v4) wird sie als Container mit einem Text-Display pro Frage angehängt (bis zu 10 Fragen). Lange Antworten werden in beiden Fällen gekürzt. | +| Angenommen-Nachricht | Nachricht, die an den Nutzer gesendet wird, wenn seine Bewerbung angenommen wird. Unterstützt `%applicationName%` und `%reason%`. | +| Abgelehnt-Nachricht | Nachricht, die an den Nutzer gesendet wird, wenn seine Bewerbung abgelehnt wird. Unterstützt `%applicationName%` und `%reason%`. | +| Cooldown zwischen Bewerbungen aktivieren? | Wenn aktiviert, müssen Nutzer eine bestimmte Dauer zwischen dem Einreichen von Bewerbungen warten. | +| Cooldown Länge | Die Zeit, die Nutzer zwischen Bewerbungen warten müssen (z. B. "14d" für 14 Tage). | +| Cooldown Nachricht | Nachricht, die Nutzern angezeigt wird, die sich bewerben wollen, während sie noch in der Abklingzeit sind. Unterstützt `%timeRelative%` und `%timeAbsolute%`. | +| Bewerbungsinfokanal | Kanal, in den eine Nachricht mit einem Drop-Down-Menü gesendet wird, über das Nutzer sich durch Auswahl einer Kategorie bewerben können. | +| Informationsnachricht | Die Nachricht, die im Informationskanal über dem Kategorie-Drop-Down-Menü gesendet wird. | + +## Fehlerbehebung {#troubleshooting} + +- **Nutzer können sich nicht bewerben**: Stelle sicher, dass der Nutzer PNs aktiviert hat, da der Bewerbungsprozess in PNs stattfindet. Prüfe außerdem, dass der Nutzer keine offene Bewerbung hat und sich nicht in der Abklingzeit befindet. +- **Der Bot sagt, der Nutzer hat eine offene Bewerbung**: Eine vorherige Bewerbung befindet sich möglicherweise noch im Status "eingereicht". Bearbeite sie (annehmen oder ablehnen), bevor der Nutzer eine neue einreichen kann. +- **Annahme-/Ablehnungs-Knöpfe funktionieren nicht**: Wenn "Rolle verlangen, um Bewerbungen zu bearbeiten" aktiviert ist, stelle sicher, dass das Teammitglied eine der konfigurierten Rollen hat. Andernfalls kann jeder Nutzer mit Zugriff auf den Benachrichtigungs-Kanal Bewerbungen bearbeiten. +- **Rollen werden bei Annahme nicht vergeben**: Stelle sicher, dass der Bot die Berechtigung "Rollen verwalten" hat und dass die höchste Rolle des Bots über den zu vergebenden Rollen steht. +- **Die Nachricht im Informationskanal wird nicht angezeigt**: Stelle sicher, dass du den "Bewerbungsinfokanal" in der Konfiguration gesetzt hast und dass der Bot in diesem Kanal die Berechtigung hat, Nachrichten und Embeds zu senden. Lade die Bot-Konfiguration nach Änderungen neu. + +## Gespeicherte Daten {#data-usage} + +Die folgenden Daten werden über jede Bewerbung gespeichert: + +- Die Nutzer-ID des Bewerbers +- Der Status der Bewerbung (eingereicht, angenommen, abgelehnt) +- Der Name der Kategorie +- Die Nutzer-ID des Teammitglieds, das die Bewerbung bearbeitet hat +- Die Nachrichten-ID und Kanal-ID der Einreichung +- Die Antworten auf alle Fragen +- Metadaten über den Eintrag (Datum der Erstellung und letzten Aktualisierung) + +Zusätzlich werden Referenzen der Informationsnachricht (Kanal-ID und Nachrichten-ID) gespeichert, um die Drop-Down-Menü-Nachrichten zu verwalten. + +Um alle von diesem Modul gespeicherten Daten zu entfernen, [lösche die Modul-Datenbank](/docs/custom-bot/additional-features#reset-module-database). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/support/tickets.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/support/tickets.md index 75e5e654..5a122981 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/support/tickets.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/modules/support/tickets.md @@ -14,6 +14,7 @@ Siehe dir unseren [SCNX Modmail Bot](https://modmail.net) an - ab Nur sichbar wenn "Nach Schließen PN an Nutzer senden" aktiviert ist.
Diese Nachricht wird der Nutzer per Privatnachricht erhalten, nachdem sein Ticket geschlossen wurde. Du kannst einen Link zum Ticket-Protkoll hinzufügen. | -| Ticket-Erstellt Nachricht | Diese Nachricht wird in ein Ticket gesendet, nachdem es erstellt wurde. Ein Knopf zum Schließen des Tickets wird hinzugefügt. | -| Ticketerstellungs-Knopf | Dies wird der Inhalt des Knopfes unter der Ticketerstellungs-Nachricht sein. | -| Ticketschließungs-Knopf | Dies wird der Inhalt des Knopfes unter der Ticketschließungs-Nachricht sein, der das Ticket schließt. | +| Feld | Beschreibung | +| -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Name der Ticket Kategorie. Dies wird deinen Nutzer und deine Team-Mitglieder angezeigt. | +| Ticketerstellungs-Kategorie | Neue Ticket-Kanäle werden in der hier ausgewählten Kategorie auf deinem Discord-Server erstellt. | +| Ticketerstellungs-Kanal | Die Ticket-Erstellungsnachricht wird in diesen Kanal gesendet. Nutzer können ein Ticket erstellen, indem sie auf den Knopf unter der Nachricht klicken. | +| Ticketrollen | Diese Rollen werden erwähnt, wenn ein neues Ticket geöffnet wurde und diesen Rollen wird Zugriff auf erstellte Ticket-Kanäle gegeben. | +| Berechtigungen für Kategorien kopieren | Wenn aktiviert, werden beim Öffnen eines Tickets die Berechtigungsüberschreibungen der "Ticketerstellungs-Kategorie" auf den neuen Ticket-Kanal kopiert (`@everyone` bleibt weiterhin ausgeschlossen). Standardmäßig deaktiviert. Spätere Änderungen an der Kategorie werden nicht automatisch übernommen. | +| Log-Kanal | Das Protokoll wird in diesen Kanal gesendet, nachdem ein Ticket geschlossen wurde. | +| Ticketerstellungs-Nachricht | Diese Nachricht wird in den "Ticketerstellungs-Kanal" gesendet und Nutzer können mit einem Knopf unter der Nachricht ein neues Ticket öffnen. | +| Nach Schließen PN an Nutzer senden | Falls aktiviert, werden die Nutzer eine PN nach Schließung des Tickets erhalten. | +| Nutzer PN | Nur sichbar wenn "Nach Schließen PN an Nutzer senden" aktiviert ist.
Diese Nachricht wird der Nutzer per Privatnachricht erhalten, nachdem sein Ticket geschlossen wurde. Du kannst einen Link zum Ticket-Protkoll hinzufügen. | +| Ticket-Erstellt Nachricht | Diese Nachricht wird in ein Ticket gesendet, nachdem es erstellt wurde. Ein Knopf zum Schließen des Tickets wird hinzugefügt. | +| Ticketerstellungs-Knopf | Dies wird der Inhalt des Knopfes unter der Ticketerstellungs-Nachricht sein. | +| Ticketschließungs-Knopf | Dies wird der Inhalt des Knopfes unter der Ticketschließungs-Nachricht sein, der das Ticket schließt. | ## Fehlerbehebung {#troubleshooting} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/slash-commands.md b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/slash-commands.md index e77c9d9e..c873aec1 100644 --- a/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/slash-commands.md +++ b/i18n/de/docusaurus-plugin-content-docs/current/custom-bot/slash-commands.md @@ -66,7 +66,7 @@ explizit überschrieben werden, indem Rollen oder einzelne Nutzer hinzugefügt w So stellt Discord sicher, dass sensible Befehle nur von autorisierten Mitgliedern verwendet werden, sofern der Zugriff nicht bewusst erweitert wird. -## Synchronisation von Befehlen +## Synchronisation von Befehlen {#command-synchronization} Discord bietet die Möglichkeit, Berechtigungseinstellungen für mehrere Befehle gemeinsam zu verwalten. diff --git a/package-lock.json b/package-lock.json index c3fedb71..bb1a4014 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,12 @@ "dependencies": { "@babel/runtime": "^7.25.0", "@docsearch/docusaurus-adapter": "^4.6.0", - "@docusaurus/core": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/plugin-pwa": "3.10.0", - "@docusaurus/plugin-sitemap": "3.10.0", - "@docusaurus/preset-classic": "3.10.0", - "@docusaurus/theme-common": "3.10.0", + "@docusaurus/core": "^3.10.2", + "@docusaurus/plugin-content-docs": "^3.10.2", + "@docusaurus/plugin-pwa": "^3.10.2", + "@docusaurus/plugin-sitemap": "^3.10.2", + "@docusaurus/preset-classic": "^3.10.2", + "@docusaurus/theme-common": "^3.10.2", "@fortawesome/fontawesome-svg-core": "7.1.0", "@fortawesome/free-brands-svg-icons": "7.1.0", "@fortawesome/pro-duotone-svg-icons": "7.1.0", @@ -37,12 +37,27 @@ "remark-math": "6.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.10.0" + "@docusaurus/module-type-aliases": "^3.10.2" }, "engines": { "node": ">=16.14" } }, + "node_modules/@11ty/gray-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@11ty/gray-matter/-/gray-matter-1.0.0.tgz", + "integrity": "sha512-7mJJl+wf1AByoT0PknQiQfOPnVNT4fevGrUBVWO4HXsnYn1aQPyRyrELYrNUFleUBM++KzMKN6QaxHPk0t/6/g==", + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.0", + "kind-of": "^6.0.3", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=11" + } + }, "node_modules/@algolia/abtesting": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.6.0.tgz", @@ -540,9 +555,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1440,12 +1455,12 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", - "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.29.7.tgz", + "integrity": "sha512-J0wGhKan+rIiE2OhfhRptySLrJ6SjQYM6b6N1FMlhyhCcw1Mig8vQjWchyB+bgHGDvaWo6Diu6CLRMra2uMtmg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -3394,9 +3409,9 @@ } }, "node_modules/@docusaurus/babel": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.0.tgz", - "integrity": "sha512-mqCJhCZNZUDg0zgDEaPTM4DnRsisa24HdqTy/qn/MQlbwhTb4WVaZg6ZyX6yIVKqTz8fS1hBMgM+98z+BeJJDg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.2.tgz", + "integrity": "sha512-aJ1hpGyvfkte3dDAfNbWM4biW4yWZBVz7TIGLZP+v+tWOBgxX3e0N5ZIXHIvmfNNXTI77pcHUx3KmtOk05Ze3Q==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -3408,8 +3423,8 @@ "@babel/preset-typescript": "^7.25.9", "@babel/runtime": "^7.25.9", "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -3419,9 +3434,9 @@ } }, "node_modules/@docusaurus/babel/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -3432,9 +3447,9 @@ } }, "node_modules/@docusaurus/babel/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -3454,21 +3469,21 @@ } }, "node_modules/@docusaurus/babel/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -3486,12 +3501,12 @@ } }, "node_modules/@docusaurus/babel/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -3499,17 +3514,17 @@ } }, "node_modules/@docusaurus/bundler": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.0.tgz", - "integrity": "sha512-iONUGZGgp+lAkw/cJZH6irONcF4p8+278IsdRlq8lYhxGjkoNUs0w7F4gVXBYSNChq5KG5/JleTSsdJySShxow==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.2.tgz", + "integrity": "sha512-i0ZNcy0f0WhaOlYVgzLsWhIoEXO9kS3HRoKPtgE6vQtZUq7arKZaYdNBudr3mqCmd+TyOkwtwfHgs1ENj07r5g==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.10.0", - "@docusaurus/cssnano-preset": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", + "@docusaurus/babel": "3.10.2", + "@docusaurus/cssnano-preset": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", "babel-loader": "^9.2.1", "clean-css": "^5.3.3", "copy-webpack-plugin": "^11.0.0", @@ -3527,7 +3542,7 @@ "tslib": "^2.6.0", "url-loader": "^4.1.1", "webpack": "^5.95.0", - "webpackbar": "^6.0.1" + "webpackbar": "^7.0.0" }, "engines": { "node": ">=20.0" @@ -3542,9 +3557,9 @@ } }, "node_modules/@docusaurus/bundler/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -3555,9 +3570,9 @@ } }, "node_modules/@docusaurus/bundler/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -3577,21 +3592,21 @@ } }, "node_modules/@docusaurus/bundler/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -3609,31 +3624,58 @@ } }, "node_modules/@docusaurus/bundler/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { "node": ">=20.0" } }, - "node_modules/@docusaurus/core": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.0.tgz", - "integrity": "sha512-mgLdQsO8xppnQZc3LPi+Mf+PkPeyxJeIx11AXAq/14fsaMefInQiMEZUUmrc7J+956G/f7MwE7tn8KZgi3iRcA==", + "node_modules/@docusaurus/bundler/node_modules/webpackbar": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", + "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", "license": "MIT", "dependencies": { - "@docusaurus/babel": "3.10.0", - "@docusaurus/bundler": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "ansis": "^3.2.0", + "consola": "^3.2.3", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@rspack/core": "*", + "webpack": "3 || 4 || 5" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.2.tgz", + "integrity": "sha512-EYByj6nk+aD9KeVxV6Hmo2/nAAT79P21Y82ycTBOBtrmqilloIbIEhgL2/8Xpt2Jz/pgNqHAwyusOGwmbKeJmA==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.10.2", + "@docusaurus/bundler": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -3641,7 +3683,7 @@ "combine-promises": "^1.1.0", "commander": "^5.1.0", "core-js": "^3.31.1", - "detect-port": "^1.5.1", + "detect-port": "^2.1.0", "escape-html": "^1.0.3", "eta": "^2.2.0", "eval": "^0.1.8", @@ -3689,9 +3731,9 @@ } }, "node_modules/@docusaurus/core/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -3702,9 +3744,9 @@ } }, "node_modules/@docusaurus/core/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -3738,21 +3780,21 @@ } }, "node_modules/@docusaurus/core/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -3770,12 +3812,12 @@ } }, "node_modules/@docusaurus/core/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -3783,14 +3825,14 @@ } }, "node_modules/@docusaurus/core/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -3801,6 +3843,31 @@ "node": ">=20.0" } }, + "node_modules/@docusaurus/core/node_modules/address": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/address/-/address-2.0.3.tgz", + "integrity": "sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==", + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/@docusaurus/core/node_modules/detect-port": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-2.1.0.tgz", + "integrity": "sha512-epZuWb/6Q62L+nDHJc/hQAqf8pylsqgk3BpZXVBx1CDnr3nkrVNn73Uu1rXcFzkNcc+hkP3whuOg7JZYaQB65Q==", + "license": "MIT", + "dependencies": { + "address": "^2.0.1" + }, + "bin": { + "detect": "dist/commonjs/bin/detect-port.js", + "detect-port": "dist/commonjs/bin/detect-port.js" + }, + "engines": { + "node": ">= 16.0.0" + } + }, "node_modules/@docusaurus/core/node_modules/webpack-merge": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", @@ -3816,9 +3883,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.0.tgz", - "integrity": "sha512-qzSshTO1DB3TYW+dPUal5KHM7XPc5YQfzF3Kdb2NDACJUyGbNcFtw3tGkCJlYwhNCRKbZcmwraKUS1i5dcHdGg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.2.tgz", + "integrity": "sha512-4gCnHRbJLTloiwfvFAa92tgb2gI4KYhvjfQVYnEaiMO/EgvWfCo1LwytHXen+1oZAN0VAlS0JAPxp3MsvKDa3A==", "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", @@ -3843,14 +3910,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.0.tgz", - "integrity": "sha512-mQQV97080AH4PYNs087l202NMDqRopZA4mg5W76ZZyTFrmWhJ3mHg+8A+drJVENxw5/Q+wHMHLgsx+9z1nEs0A==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.2.tgz", + "integrity": "sha512-9Fd4V/SFjfrVQ0JH5EN0+iPWyFunvTeQE3gfyFeetqPaXMP0OylIjOw16dCuXG4NZJrYdBqwzjh18/h3gRi47w==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -3882,9 +3949,9 @@ } }, "node_modules/@docusaurus/mdx-loader/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -3895,9 +3962,9 @@ } }, "node_modules/@docusaurus/mdx-loader/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -3917,21 +3984,21 @@ } }, "node_modules/@docusaurus/mdx-loader/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -3949,12 +4016,12 @@ } }, "node_modules/@docusaurus/mdx-loader/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -3962,14 +4029,14 @@ } }, "node_modules/@docusaurus/mdx-loader/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -3981,12 +4048,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.0.tgz", - "integrity": "sha512-/1O0Zg8w3DFrYX/I6Fbss7OJrtZw1QoyjDhegiFNHVi9A9Y0gQ3jUAytVxF6ywpAWpLyLxch8nN8H/V3XfzdJQ==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.2.tgz", + "integrity": "sha512-h/I5e4jaAhDHW4vaLENi1i2hnOEnXY1t9R+nnRTbgUl7ymVRzN/HF7dDfj8rKYGj8gfIge+Ef+iYRAMtbGvsrQ==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -4000,9 +4067,9 @@ } }, "node_modules/@docusaurus/module-type-aliases/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4022,19 +4089,19 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.0.tgz", - "integrity": "sha512-RuTz68DhB7CL96QO5UsFbciD7GPYq6QV+YMfF9V0+N4ZgLhJIBgpVAr8GobrKF6NRe5cyWWETU5z5T834piG9g==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.2.tgz", + "integrity": "sha512-0cbEnNKf0InmLkhj/+nVRmqEnWEoOE8Mh+2x1qOXI0qYpCnphq4RXknVJ8BvybKRXqYVvbmdMfiJSup+k4tm5w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "cheerio": "1.0.0-rc.12", "combine-promises": "^1.1.0", "feed": "^4.2.2", @@ -4057,9 +4124,9 @@ } }, "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -4070,9 +4137,9 @@ } }, "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4092,21 +4159,21 @@ } }, "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -4124,12 +4191,12 @@ } }, "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4137,14 +4204,14 @@ } }, "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4156,20 +4223,20 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.0.tgz", - "integrity": "sha512-9BjHhf15ct8Z7TThTC0xRndKDVvMKmVsAGAN7W9FpNRzfMdScOGcXtLmcCWtJGvAezjOJIm6CxOYCy3Io5+RnQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/module-type-aliases": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.2.tgz", + "integrity": "sha512-Sqwl4FPoZBDrlY8I2VU2H8O0M91CHp9T8ToMSkTZmjvHCif+1laqfXi6sTk8IfyVS/trN5yNjcWd1bFsGB6W5Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -4189,9 +4256,9 @@ } }, "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -4202,9 +4269,9 @@ } }, "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4224,21 +4291,21 @@ } }, "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -4256,12 +4323,12 @@ } }, "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4269,14 +4336,14 @@ } }, "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4288,16 +4355,16 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.0.tgz", - "integrity": "sha512-5amX8kEJI+nIGtuLVjYk59Y5utEJ3CHETFOPEE4cooIRLA4xM4iBsA6zFgu4ljcopeYwvBzFEWf5g2I6Yb9SkA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.2.tgz", + "integrity": "sha512-h5R12sZ/vV9EPiVjvIl9YFCOwkpwXes7dQMYt3EvP6Pphu4amHxxTqWxf08Fl5DR8h+oZMbWpFTNw5vKEYfvzQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -4311,9 +4378,9 @@ } }, "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -4324,9 +4391,9 @@ } }, "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4346,21 +4413,21 @@ } }, "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -4378,12 +4445,12 @@ } }, "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4391,14 +4458,14 @@ } }, "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4410,15 +4477,15 @@ } }, "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.0.tgz", - "integrity": "sha512-6q1vtt5FJcg5osgkHeM1euErECNqEZ5Z1j69yiNx2luEBIso+nxCkS9nqj8w+MK5X7rvKEToGhFfOFWncs51pQ==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.2.tgz", + "integrity": "sha512-UkdvQby5OQUKWrw3lLnSTJXQ6VETaUVTuPQX9AABtmFm5h+ifEBx1OQ+LN726Q4byuwBf2ElHkf4qU4hTxdvRg==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4426,9 +4493,9 @@ } }, "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -4439,9 +4506,9 @@ } }, "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4461,21 +4528,21 @@ } }, "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -4493,12 +4560,12 @@ } }, "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4506,14 +4573,14 @@ } }, "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4525,14 +4592,14 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.0.tgz", - "integrity": "sha512-XcljKN+G+nmmK69uQA1d9BlYU3ZftG3T3zpK8/7Hf/wrOlV7TA4Ampdrdwkg0jElKdKAoSnPhCO0/U3bQGsVQQ==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.2.tgz", + "integrity": "sha512-8vbZNOSCpnsT57EY6CgN7sgRVmx3KTYwO8Uvo2pbxOyb8tbqAwtT9SslqaQ41HbA1v1hpn5RP7u5s2KvRwAFpQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", "fs-extra": "^11.1.1", "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" @@ -4546,9 +4613,9 @@ } }, "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -4559,9 +4626,9 @@ } }, "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4581,21 +4648,21 @@ } }, "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -4613,12 +4680,12 @@ } }, "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4626,14 +4693,14 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.0.tgz", - "integrity": "sha512-hTEoodatpBZnUat5nFExbuTGA1lhWGy7vZGuTew5Q3QDtGKFpSJLYmZJhdTjvCFwv1+qQ67hgAVlKdJOB8TXow==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.2.tgz", + "integrity": "sha512-kMHMBK9j4VAtgd5owwrRLRIi0EjkrpXlX7ePj1+y68XfVZV9I1T4S+koPDm+Hfw2TtnyHvh0uNrDvjz+DjQGVA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4645,9 +4712,9 @@ } }, "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -4658,9 +4725,9 @@ } }, "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4680,21 +4747,21 @@ } }, "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -4712,12 +4779,12 @@ } }, "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4725,14 +4792,14 @@ } }, "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4744,15 +4811,14 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.0.tgz", - "integrity": "sha512-iB/Zzjv/eelJRbdULZqzWCbgMgJ7ht4ONVjXtN3+BI/muil6S87gQ1OJyPwlXD+ELdKkitC7bWv5eJdYOZLhrQ==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.2.tgz", + "integrity": "sha512-Vt90nNFhtAChRe9+it1hcHFgFvETdSnOkL5Bma+p6E/yU2tAYrvvyk+gv+LJGM2ZUkyKuKXLRsZ2Lb0bO7+Vog==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "@types/gtag.js": "^0.0.20", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4764,9 +4830,9 @@ } }, "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -4777,9 +4843,9 @@ } }, "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4799,21 +4865,21 @@ } }, "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -4831,12 +4897,12 @@ } }, "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4844,14 +4910,14 @@ } }, "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4863,14 +4929,14 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.0.tgz", - "integrity": "sha512-FEjZxqKgLHa+Wez/EgKxRwvArNCWIScfyEQD95rot7jkxp6nonjI5XIbGfO/iYhM5Qinwe8aIEQHP2KZtpqVuA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.2.tgz", + "integrity": "sha512-MLCffCldysi/R0nzJQP7ZWd0xAoGNnSTiVOo6TTR6mKVGFhE+/XArGe67ZcaZv1uytgQXoXs92VJrgVDrz80rQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4882,9 +4948,9 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -4895,9 +4961,9 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4917,21 +4983,21 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -4949,12 +5015,12 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -4962,14 +5028,14 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4981,21 +5047,21 @@ } }, "node_modules/@docusaurus/plugin-pwa": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-pwa/-/plugin-pwa-3.10.0.tgz", - "integrity": "sha512-kJr50iyQcE7qRBbYJol9IKREHny4nvodvJkz88lQl7LvOIE6SIgDMl2gG+nhkHqQvuO15i+WnPNlnPVSRLZUdg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-pwa/-/plugin-pwa-3.10.2.tgz", + "integrity": "sha512-pJUaEZnIIzJdIvDCVENLS4ER5DnT+VJYXU6TYCsshUUg9FHAYrkAWbsldsv4u769FtHRUjO7TWjWsS0B8+RO9g==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", "@babel/preset-env": "^7.25.9", - "@docusaurus/bundler": "3.10.0", - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/theme-translations": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/bundler": "3.10.2", + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/theme-translations": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "babel-loader": "^9.2.1", "clsx": "^2.0.0", "core-js": "^3.31.1", @@ -5015,9 +5081,9 @@ } }, "node_modules/@docusaurus/plugin-pwa/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -5028,9 +5094,9 @@ } }, "node_modules/@docusaurus/plugin-pwa/node_modules/@docusaurus/theme-translations": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.0.tgz", - "integrity": "sha512-L9IbFLwTc5+XdgH45iQYufLn0SVZd6BUNelDbKIFlH+E4hhjuj/XHWAFMX/w2K59rfy8wak9McOaei7BSUfRPA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.2.tgz", + "integrity": "sha512-iv20wrxnyXkY89LM3TzRlzGlt5fIGO5UnaR6UL1ZVfB9RRFjxQFQ6awDrwAc6Km8Y5gD8pInuwYPF+6/TiCxXA==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", @@ -5041,9 +5107,9 @@ } }, "node_modules/@docusaurus/plugin-pwa/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -5063,21 +5129,21 @@ } }, "node_modules/@docusaurus/plugin-pwa/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -5095,12 +5161,12 @@ } }, "node_modules/@docusaurus/plugin-pwa/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -5108,14 +5174,14 @@ } }, "node_modules/@docusaurus/plugin-pwa/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -5127,17 +5193,17 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.0.tgz", - "integrity": "sha512-DVTSLjB97hIjmayGnGcBfognCeI7ZuUKgEnU7Oz81JYqXtVg94mVTthDjq3QHTylYNeCUbkaW8VF0FDLcc8pPw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.2.tgz", + "integrity": "sha512-PODkwg5XetLML3hU/3xpCKJUZ9cqExLaBnD/Fzzwj2VHogLeqnDisLIujae87zuze7T4mCm2A6KEqZkyiz07EQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -5151,9 +5217,9 @@ } }, "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -5164,9 +5230,9 @@ } }, "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -5186,21 +5252,21 @@ } }, "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -5218,12 +5284,12 @@ } }, "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -5231,14 +5297,14 @@ } }, "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -5250,15 +5316,15 @@ } }, "node_modules/@docusaurus/plugin-svgr": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.0.tgz", - "integrity": "sha512-lNljBESaETZqVBMPqkrGchr+UPT1eZzEPLmJhz8I76BxbjqgsUnRvrq6lQJ9sYjgmgX52KB7kkgczqd2yzoswQ==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.2.tgz", + "integrity": "sha512-JgfT3jWM0TJ8Uw0cEcqxHpybngQY1vlBYpuuNO+gEh5iPh5Ar+vxq/u9CFrYsWeXy48BN7Db76Pzp2edNXUQ8A==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "@svgr/core": "8.1.0", "@svgr/webpack": "^8.1.0", "tslib": "^2.6.0", @@ -5273,9 +5339,9 @@ } }, "node_modules/@docusaurus/plugin-svgr/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -5286,9 +5352,9 @@ } }, "node_modules/@docusaurus/plugin-svgr/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -5308,21 +5374,21 @@ } }, "node_modules/@docusaurus/plugin-svgr/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -5340,12 +5406,12 @@ } }, "node_modules/@docusaurus/plugin-svgr/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -5353,14 +5419,14 @@ } }, "node_modules/@docusaurus/plugin-svgr/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -5372,26 +5438,26 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.0.tgz", - "integrity": "sha512-kw/Ye02Hc6xP1OdTswy8yxQEHg0fdPpyWAQRxr5b2x3h7LlG2Zgbb5BDFROnXDDMpUxB7YejlocJIE5HIEfpNA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/plugin-content-blog": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/plugin-content-pages": "3.10.0", - "@docusaurus/plugin-css-cascade-layers": "3.10.0", - "@docusaurus/plugin-debug": "3.10.0", - "@docusaurus/plugin-google-analytics": "3.10.0", - "@docusaurus/plugin-google-gtag": "3.10.0", - "@docusaurus/plugin-google-tag-manager": "3.10.0", - "@docusaurus/plugin-sitemap": "3.10.0", - "@docusaurus/plugin-svgr": "3.10.0", - "@docusaurus/theme-classic": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/theme-search-algolia": "3.10.0", - "@docusaurus/types": "3.10.0" + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.2.tgz", + "integrity": "sha512-a4B3VczmDl99zK0EufDQYomdJ186WDingjmDXxhN2PNPS9Ty/Y2M5CLFX1KQMRKqRTLiRDKfutzG5IY1FC/ceg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/plugin-content-blog": "3.10.2", + "@docusaurus/plugin-content-docs": "3.10.2", + "@docusaurus/plugin-content-pages": "3.10.2", + "@docusaurus/plugin-css-cascade-layers": "3.10.2", + "@docusaurus/plugin-debug": "3.10.2", + "@docusaurus/plugin-google-analytics": "3.10.2", + "@docusaurus/plugin-google-gtag": "3.10.2", + "@docusaurus/plugin-google-tag-manager": "3.10.2", + "@docusaurus/plugin-sitemap": "3.10.2", + "@docusaurus/plugin-svgr": "3.10.2", + "@docusaurus/theme-classic": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/theme-search-algolia": "3.10.2", + "@docusaurus/types": "3.10.2" }, "engines": { "node": ">=20.0" @@ -5402,9 +5468,9 @@ } }, "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -5424,24 +5490,24 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.0.tgz", - "integrity": "sha512-9msCAsRdN+UG+RwPwCFb0uKy4tGoPh5YfBozXeGUtIeAgsMdn6f3G/oY861luZ3t8S2ET8S9Y/1GnpJAGWytww==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/module-type-aliases": "3.10.0", - "@docusaurus/plugin-content-blog": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/plugin-content-pages": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/theme-translations": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.2.tgz", + "integrity": "sha512-JqTSLQmqmA9uKWZsD5iwBGJ4JyKB4/yTw6PsSXVPRJG/6GAm/u+add9Iip+hvwP12/AnPNztrdxsI14NJW4KeA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/plugin-content-blog": "3.10.2", + "@docusaurus/plugin-content-docs": "3.10.2", + "@docusaurus/plugin-content-pages": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/theme-translations": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", @@ -5465,9 +5531,9 @@ } }, "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -5478,9 +5544,9 @@ } }, "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/theme-translations": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.0.tgz", - "integrity": "sha512-L9IbFLwTc5+XdgH45iQYufLn0SVZd6BUNelDbKIFlH+E4hhjuj/XHWAFMX/w2K59rfy8wak9McOaei7BSUfRPA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.2.tgz", + "integrity": "sha512-iv20wrxnyXkY89LM3TzRlzGlt5fIGO5UnaR6UL1ZVfB9RRFjxQFQ6awDrwAc6Km8Y5gD8pInuwYPF+6/TiCxXA==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", @@ -5491,9 +5557,9 @@ } }, "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -5513,21 +5579,21 @@ } }, "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -5545,12 +5611,12 @@ } }, "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -5558,14 +5624,14 @@ } }, "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -5577,15 +5643,15 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.0.tgz", - "integrity": "sha512-Dkp1YXKn16ByCJAdIjbDIOpVb4Z66MsVD694/ilX1vAAHaVEMrVsf/NPd9VgreyFx08rJ9GqV1MtzsbTcU73Kg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.2.tgz", + "integrity": "sha512-R9b/vMpK1yye6hNZTA6x/ivRv+at6GhxnXcxkpzCGzO1R1RwiquqiFg2wMFh6aqlJTpWRFKpFD2TzCDQcyOU0A==", "license": "MIT", "dependencies": { - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/module-type-aliases": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -5605,9 +5671,9 @@ } }, "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -5618,9 +5684,9 @@ } }, "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -5640,21 +5706,21 @@ } }, "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -5672,12 +5738,12 @@ } }, "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -5685,20 +5751,20 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.0.tgz", - "integrity": "sha512-f5FPKI08e3JRG63vR/o4qeuUVHUHzFzM0nnF+AkB67soAZgNsKJRf2qmUZvlQkGwlV+QFkKe4D0ANMh1jToU3g==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.2.tgz", + "integrity": "sha512-1msxllyhi/5m77JukXtp5UFnUAriwZIC1oJ7MTnpQpCwLTbclJi5BK5n28CTZuSXpQN2ewbbnqRgAhMM6c6ihg==", "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "^1.19.2", "@docsearch/react": "^3.9.0 || ^4.3.2", - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/theme-translations": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/plugin-content-docs": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/theme-translations": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", "algoliasearch": "^5.37.0", "algoliasearch-helper": "^3.26.0", "clsx": "^2.0.0", @@ -5717,9 +5783,9 @@ } }, "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -5730,9 +5796,9 @@ } }, "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/theme-translations": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.0.tgz", - "integrity": "sha512-L9IbFLwTc5+XdgH45iQYufLn0SVZd6BUNelDbKIFlH+E4hhjuj/XHWAFMX/w2K59rfy8wak9McOaei7BSUfRPA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.2.tgz", + "integrity": "sha512-iv20wrxnyXkY89LM3TzRlzGlt5fIGO5UnaR6UL1ZVfB9RRFjxQFQ6awDrwAc6Km8Y5gD8pInuwYPF+6/TiCxXA==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", @@ -5743,9 +5809,9 @@ } }, "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -5765,21 +5831,21 @@ } }, "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", - "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", @@ -5797,12 +5863,12 @@ } }, "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.2", "tslib": "^2.6.0" }, "engines": { @@ -5810,14 +5876,14 @@ } }, "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -7312,12 +7378,6 @@ "@types/send": "*" } }, - "node_modules/@types/gtag.js": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz", - "integrity": "sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==", - "license": "MIT" - }, "node_modules/@types/hast": { "version": "3.0.3", "license": "MIT", @@ -8000,6 +8060,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, "node_modules/anymatch": { "version": "3.1.3", "license": "ISC", diff --git a/package.json b/package.json index 1d95b6e9..ef8db01a 100644 --- a/package.json +++ b/package.json @@ -19,12 +19,12 @@ "dependencies": { "@babel/runtime": "^7.25.0", "@docsearch/docusaurus-adapter": "^4.6.0", - "@docusaurus/core": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/plugin-pwa": "3.10.0", - "@docusaurus/plugin-sitemap": "3.10.0", - "@docusaurus/preset-classic": "3.10.0", - "@docusaurus/theme-common": "3.10.0", + "@docusaurus/core": "^3.10.2", + "@docusaurus/plugin-content-docs": "^3.10.2", + "@docusaurus/plugin-pwa": "^3.10.2", + "@docusaurus/plugin-sitemap": "^3.10.2", + "@docusaurus/preset-classic": "^3.10.2", + "@docusaurus/theme-common": "^3.10.2", "@fortawesome/fontawesome-svg-core": "7.1.0", "@fortawesome/free-brands-svg-icons": "7.1.0", "@fortawesome/pro-duotone-svg-icons": "7.1.0", @@ -46,7 +46,7 @@ "remark-math": "6.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.10.0" + "@docusaurus/module-type-aliases": "^3.10.2" }, "browserslist": { "production": [ diff --git a/sidebars.js b/sidebars.js index 93d3ba83..a85fdcc8 100644 --- a/sidebars.js +++ b/sidebars.js @@ -150,6 +150,11 @@ const sidebars = { label: 'Send messages / embeds, Self-Roles & more', id: 'custom-bot/login-as-bot' }, + { + type: 'doc', + label: 'Commands', + id: 'custom-bot/commands' + }, { type: 'doc', label: 'Slash commands & Permissions',