> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bloombot.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Warnings, cases, and staff records

> Warn a member, read their moderation record, correct a case, and keep private notes only your staff can see.

Every moderation action Bloom takes is filed as a numbered case against the member, with the moderator who took it, the reason, and the time. Warnings, the record behind them, and your staff's private notes all live in that same history.

## How cases work

Case numbers count up from 1 inside each server, so case #14 in your server has nothing to do with case #14 anywhere else. A case records the action, the member, the moderator, the reason, when it happened, and for timed actions how long it lasts and when it runs out.

These actions open a case:

| Case type                               | Opened by                                                  |
| --------------------------------------- | ---------------------------------------------------------- |
| Warning                                 | `warn`                                                     |
| Timeout, Untimeout                      | `timeout`, `untimeout`                                     |
| Kick                                    | `kick`                                                     |
| Ban, Temp Ban, Unban                    | `ban`, `hackban`, `hardban`, `softban`, `tempban`, `unban` |
| Mute, Image Mute, Reaction Mute, Unmute | Bloom's mute commands                                      |
| Jail, Unjail                            | `jail`, `unjail`                                           |

<Info>
  A warning is a record. Bloom does not kick, mute, or ban anyone for reaching a number of warnings, so escalation is a judgement call your staff makes by reading the history.
</Info>

If you have a moderation log channel set up, each case is also posted there as it happens. See [Event logging](/configuration/logging) for how to configure it.

## Warning a member

<ParamField path="warn <user> <reason> [-s]" type="Manage Messages">
  Records a warning against a member and tells them why.

  * **A reason is required.** Without one Bloom replies with the usage line instead of warning anyone.
  * **You need:** Manage Messages, and a higher role than the member.
  * The member gets a direct message with your reason unless you add `-s`, which must be the **last word** in the command.
  * `!warn @Someone Spamming in general` replies `Successfully warned Someone.`
</ParamField>

You cannot warn yourself, Bloom, or the server owner. You can warn someone who has already left the server by using their ID, which files the case without a direct message.

<Info>
  Members can turn off moderation direct messages from Bloom. When they have, the warning still lands in their record and the action still counts, they simply are not notified.
</Info>

## Reading someone's record

<ParamField path="history <user>" type="Moderate Members">
  Shows every case filed against a member in this server, newest first. Aliases: `modlogs`, `infractions`, `punishments`.

  * **Bloom needs:** Embed Links.
  * The top line counts the record by type, for example `Warning: 3 | Timeout: 1`.
  * Each entry shows its case number, the moderator, how long ago it was, the reason, and any duration or expiry.
  * Entries that have been lifted or have run out are marked `Inactive`.
  * `!history @Someone` on a clean account replies `No moderation history.`
</ParamField>

<Info>
  The embed shows at most **25 cases**. The counts in the top line cover the whole record, so a member with more than 25 cases still shows an accurate total.
</Info>

## Correcting a case

<ParamField path="reason <case_number> <new_reason>" type="Moderate Members">
  Replaces the reason on a case that is already filed. Use it when a moderator typed the wrong reason or left one too vague to act on later.

  * Takes the **case number** shown in `history`, not a member.
  * `!reason 42 Repeated harassment after a warning` reacts with a check and shows you the old and new reason side by side.
  * `!history` shows the new reason from then on.
</ParamField>

## Removing cases

<ParamField path="history remove <case_number>" type="Moderate Members">
  Deletes a single case from the record. Bloom reacts with a check when it is gone.
</ParamField>

<ParamField path="history removeall <user>" type="Moderate Members">
  Deletes a member's entire moderation record in this server at once.
</ParamField>

<Danger>
  Removing a case deletes it permanently. There is no undo, and the member's history is the only place that record exists. Correct a bad reason with `!reason` instead of deleting and refiling the case.
</Danger>

<Warning>
  Case numbers are handed out by counting from the highest number in use. If you delete the most recent case, the next action takes that same number, so two different actions can end up sharing a number in your logs.
</Warning>

## Private staff notes

Notes sit alongside the case history and are never shown to the member. Use them for context that is not an action, such as a pattern you want the next moderator to know about.

<ParamField path="modnote add <user> <note>" type="Manage Messages">
  Saves a note against a member and replies with the note's number. Alias: `mn`.

  * **Bloom needs:** Embed Links.
  * `!modnote add @Someone Warned verbally about tone in voice` replies `Added note 3 for Someone`.
</ParamField>

<ParamField path="modnote list <user>" type="Manage Messages">
  Lists every note on a member, each with its number, who added it, and when.
</ParamField>

<ParamField path="modnote remove <user> <note_number>" type="Manage Messages">
  Deletes one note. Takes the note's own number, which is separate from case numbers.
</ParamField>

<Warning>
  Notes are visible to anyone who can run `modnote list`, which is everyone with Manage Messages. Write them as though the member may eventually read them.
</Warning>

## Moderator activity

<ParamField path="modstats [moderator]" type="Moderate Members">
  Shows how many actions a moderator has taken in this server, broken down by type with a percentage of their total. Alias: `modactions`.

  * **Bloom needs:** Embed Links.
  * With no name it shows your own record.
  * The ten most used action types are listed individually, and anything past that is grouped as `Other`.
  * `!modstats @Moderator` on an inactive account replies that they have not performed any moderation actions.
</ParamField>

<Info>
  The count follows the case record, so removing cases with `history remove` lowers the moderator's totals too.
</Info>

## Locking a nickname

<ParamField path="forcenickname <user> [nickname]" type="Manage Nicknames">
  Pins a member to one nickname. If they or anyone else changes it, Bloom sets it straight back. Aliases: `fn`, `forcenick`, `fnick`, `locknick`.

  * **You need:** Manage Nicknames, and a higher role than the member.
  * **Bloom needs:** Manage Nicknames, and a higher role than the member.
  * Nicknames are limited to **32 characters**.
  * `!forcenickname @Someone Rulebreaker 7` sets the nickname and holds it there.
</ParamField>

<ParamField path="forcenickname <user> reset" type="Manage Nicknames">
  Releases the lock and clears the nickname back to the member's normal name. Running the command with no nickname at all does the same thing.
</ParamField>

<Info>
  While a nickname is locked, Bloom stops recording that member's name changes in their name history, since every change is reverted.
</Info>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Warn replies with its usage instead of warning anyone">
    A reason is required. `!warn @Someone` on its own is not enough, `!warn @Someone Spamming` is.
  </Accordion>

  <Accordion title="You cannot warn this user as they have an equal or higher role than you">
    Your highest role has to sit above theirs. Equal is not enough. Someone with a higher role has to issue the warning, or your role has to move up.
  </Accordion>

  <Accordion title="The silent flag was included in the reason">
    `-s` only counts as a flag when it is the very last word. Written anywhere else it is treated as part of the reason.
  </Accordion>

  <Accordion title="History is empty for someone I know was punished">
    Cases are per server, so a record from another server never appears here. Otherwise the case was removed with `history remove` or `history removeall`, which cannot be undone.
  </Accordion>

  <Accordion title="Case not found when updating a reason">
    `reason` takes the case number from `history`, not the member's ID. Run `!history @Someone` first and use the number shown next to the entry.
  </Accordion>

  <Accordion title="The forced nickname is not being applied">
    Bloom needs Manage Nicknames and a role above the member's highest role. Neither Discord nor Bloom can change the nickname of the server owner.
  </Accordion>
</AccordionGroup>

## Related pages

<CardGroup cols={2}>
  <Card title="Bans, kicks, and timeouts" icon="gavel" href="/moderation/punishments">
    The actions that open most of the cases you will read here.
  </Card>

  <Card title="Event logging" icon="rectangle-list" href="/configuration/logging">
    Send every case to a staff channel as it happens.
  </Card>

  <Card title="Permissions and hierarchy" icon="user-lock" href="/getting-started/permissions">
    Why role position decides who can warn whom.
  </Card>

  <Card title="Fake permissions" icon="user-shield" href="/security/fake-permissions">
    Let a trusted helper use `warn` without giving them Manage Messages.
  </Card>
</CardGroup>
