# Менеджер чата
**Рейтинги в чате, теги в таблице лидеров, полный журнал чата и ретрансляция из Discord — всё в одном плагине.**
Предоставьте владельцам, администраторам и VIP-пользователям цветной префикс в чате и соответствующий тег в таблице лидеров TAB,
отражать всё в канале Discord и вести журнал всех сообщений с возможностью поиска. Игроки получают
меню, чтобы настроить внешний вид по своему усмотрению. Настраивается абсолютно всё — вам не придётся прикасаться к коду.
---
## Как это выглядит
### В чате
Вы пишете следующее:
```json
"owner": {
"ChatPrefix": "{DARKRED}[OWNER]",
"ChatNameColor": "{LIGHTRED}",
"ChatMessageColor": "{WHITE}",
"ScoreboardTag": "[OW]"
}
```
Игроки видят следующее — префикс, имя и текст сообщения, каждый из которых выделен своим цветом:
```
[OWNER] illusion: hey everyone
[ADMIN] SomeGuy: rotating B
(T) [VIP] Player: two left in site
*DEAD* [VIP] Player: he's behind you
```
Вы можете полностью настроить макет: изменить порядок элементов, заменить разделитель, добавить цвет команды, который будет меняться в зависимости от того, кто
говорит. Хотите, чтобы стиль был применен ко *всем* игрокам, а не только к персоналу? Для этого достаточно одного параметра.
### На табло
```
[OW] illusion 22 4
[AD] SomeGuy 17 9
[VIP] Player 8 12
```
### В Discord
Имена ведут напрямую на профиль в Steam. Ранги отмечаются отдельным значком. Сообщение отображается отдельно
цитируемая строка, чтобы она никуда не пропала:
> 💬 👑 **иллюзия** 🔴 `18:42:07`
> > Эй, вращающаяся буква B
>
> 🛡️ ⭐ **SomeGuy** 🔵 💀 `18:42:19`
> > на сайте осталось два
### В ваших журналах
Файл с датой за каждый день, а также соответствующая строка в консоли сервера:
```
[2026-09-03 18:42:07] [ALL] [owner] illusion (76561198012345678 | 1.2.3.4) [CT/ALIVE]: hey everyone
[2026-09-03 18:42:19] [TEAM] [vip] SomeGuy (76561198087654321 | 5.6.7.8) [T/DEAD]: two left in site
```
---
## Особенности
**Ранги и теги**
- Цветной префикс в чате, цвет имени и цвет сообщений в зависимости от ранга
- Соответствующий тег на табло — установите рейтинг один раз, оба будут следовать за ним
- Назначать звания по **флагу/группе администратора**, **SteamID** или **имени игрока** (с использованием подстановочных знаков)
- Приоритеты определяют, кто побеждает, если игрок соответствует нескольким рангам
- `{TEAMCOLOR}` цвет текста: красный для T и синий для CT, в зависимости от того, кто говорит
**Ведение журнала чата**
- Ежедневный ротационный файл журнала с отметкой времени, рейтингом, именем, SteamID, IP-адресом, командой и сообщением
- Та же строка в консоли вашего сервера, в вашем собственном макете
- Каждое поле и каждая метка настраиваются; IP-адреса можно отключить
**Ретранслятор Discord**
- Mirrors отправляет сообщения в любой канал через веб-хук
- Активные ссылки на профили в Steam, значки ранга и смайлики команд/«в игре»
- IP-адреса по умолчанию скрыты, пакетная публикация сообщений с соблюдением ограничений Discord на частоту отправки
- Игроки не могут отправлять пинги `@everyone`или форматировать ваш канал — обе эти функции заблокированы
**Для ваших игроков**
- `!cm` открывает меню, в котором игрок может отключить свой префикс, цвета или тег на табло результатов
- Их выбор сохраняется между повторными подключениями, сменой карт и перезапусками
- Игроки могут скрывать **только** свои собственные стили — никто не может выбирать префикс или вмешиваться в настройки других игроков
**Для ваших сотрудников**
- `!clearchat` / очищает`!cc` чат с настраиваемым сообщением «Очищено пользователем X»
- Перезагрузка конфигурации в режиме реального времени — без перезапуска
- Выдает предупреждение в консоли, если другой плагин пытается использовать ту же строку чата или тег табло результатов
---
## Команды
| Команда | Также работает как | Кто может им пользоваться |
| --- | --- | --- |
| `css_cm` | `!cm` `/cm` | `@css/reservation` по умолчанию — или всем, на ваш выбор |
| `css_clearchat` | `!clearchat` `/clearchat` | `@css/ban` по умолчанию |
| `css_cc` | `!cc` `/cc` | то же, что и выше |
| `css_chat_reload` | `!chat_reload` | `@css/root` |
| `css_chat_debug` | `!chat_debug` | `@css/root` — диагностика на случай, если метка когда-либо застрянет |
Каждое разрешение можно настроить. **Если оставить поле пустым, эта команда будет доступна всем.**
---
## Требования
- Сервер CS2 с [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/releases)
- [MenuManagerCS2](https://github.com/NickFox007/MenuManagerCS2) — **необязательно**, только для `!cm`
меню. Всё остальное работает и без него.
## Установка
1. Скопируйте файлы в `addons/counterstrikesharp/plugins/ChatManager/`
2. Перезапустите сервер или выполните команду `css_plugins load ChatManager`
3. Редактировать `addons/counterstrikesharp/configs/plugins/ChatManager/ChatManager.json`
4. Запустить `css_chat_reload`— перезапуск не требуется
Вот и всё. Конфигурация формируется автоматически при первой загрузке с разумными значениями по умолчанию, а плагин выводит
точные пути к вашей консоли, чтобы вы всегда знали, где что находится.
---
## Настройка
Всё хранится в **одном файле JSON**. Ранги определяются один раз, а затем вызываются по имени:
```json
"Tags": {
"owner": { "Priority": 100, "ChatPrefix": "{DARKRED}[OWNER]", "ScoreboardTag": "[OW]" },
"vip": { "Priority": 40, "ChatPrefix": "{GOLD}[VIP]", "ScoreboardTag": "[VIP]" }
},
"Assignments": {
"Permissions": { "@css/root": "owner", "#css/vip": "vip" },
"SteamIds": { "76561198012345678": "owner" },
"Names": { "*[BG]*": "vip" }
}
```
Игрок, соответствующий нескольким рангам, получает самый высокий из них`Priority`. Все, что указывает на ранг, который
несуществующий элемент пропускается с явным предупреждением — опечатка никогда не приведет к сбою вашего сервера.
### Цвета
Размещайте их в любом месте, где разрешен данный цвет. Фишки в одном ряду имеют одинаковый цвет.
| Токен | Цвет |
| --- | --- |
| `{DEFAULT}` `{WHITE}` | Белый — стандартный цвет текста в чате |
| `{DARKRED}` | Тёмно-красный |
| `{GREEN}` | Зелёный |
| `{OLIVE}` | Оливковый |
| `{LIME}` | Лайм |
| `{RED}` | Красный |
| `{GREY}` `{GRAY}` | Серый |
| `{YELLOW}` | Жёлтый |
| `{SILVER}` `{BLUEGREY}` | Серебристый / сине-серый |
| `{BLUE}` `{LIGHTBLUE}` | Светло-голубой |
| `{DARKBLUE}` | Тёмно-синий |
| `{PURPLE}` `{MAGENTA}` | Фиолетовый |
| `{LIGHTRED}` | Светло-красный |
| `{GOLD}` `{ORANGE}` | Оранжево-золотой |
| **`{TEAMCOLOR}`** | **Красный — для T, синий — для CT — следует за говорящим** |
Обратите внимание: `{BLUE}`— *светло*-голубой, `{DARKBLUE}`— тёмный, а отдельного
оранжевый — `{GOLD}`вот оно.
### Макет
`ChatFormat` определяет всю строку. По умолчанию установлено:
```
{DEAD}{PREFIX} {NAME}{DEFAULT}: {MESSAGE}
```
`{PREFIX}``{NAME}``{MESSAGE}``{TEAM}``{DEAD}` — расставляйте их как вам удобно. В групповом чате есть свои
собственный формат. Файл журнала, консоль и Discord также имеют свои собственные форматы с токенами для обозначения времени,
SteamID, IP-адрес, команда, рейтинг и многое другое.
📖 **[Полное руководство по настройке →](CONFIGURATION.md)** — подробное описание всех параметров, а также канал в Discord
токены, меню настройки, предупреждения о конфликтах и устранение неполадок.
---
## Полезно знать
Скажем прямо: ведь вы должны знать об этом перед покупкой:
- **Он изменяет внешний вид чата, заменяя сообщения.** Именно так работает каждый плагин такого рода, и он
имеет один побочный эффект: игрок, которого кто-то заглушил в таблице результатов, по-прежнему остается видимым для него, поскольку
Строка, выведенная плагином, не учитывает этот список заглушенных. Если вашему серверу необходимо, чтобы заглушения клиентов сохранялись, запустите
Включите плагин с отключенными тегами чата и вместо этого используйте теги табло и ведение журнала.
- **Если у вас уже запущен плагин**, **блокирующий звук**, порядок загрузки определяет, какой из них будет работать. Проверьте — это займет всего минуту,
и для устранения этой проблемы достаточно изменить один параметр в ту или иную сторону.
- **Если другой плагин также записывает теги в таблицу результатов** (рейтинг, уровень Faceit…), между ними возникнет конфликт.
Плагин обнаруживает это и выводит соответствующее сообщение в консоль, не оставляя вас в неведении.
- **Заблокированные сообщения все равно могут регистрироваться в журнале.** Если другой плагин заблокирует сообщение после того, как этот плагин
даже если вы это видели, оно всё равно может попасть в ваш журнал и в Discord.
## Производительность
Предназначено для полноценного сервера. Строки чата предварительно компилируются при загрузке конфигурации, а не перекомпилируются для каждого сообщения.
Записи в журнал и Discord передаются фоновым задачам, поэтому игровой поток никогда не ожидает выполнения операций с диском или
в Discord. Если Discord перестает работать или диск отстает, сообщения пропускаются и учитываются —
Сервер никогда не зависает. Очистка чата распределяется по нескольким кадрам, поэтому 64 игрока не отнимают у вас ни одного тика.
---
## Полный пример конфигурации
Полная рабочая конфигурация со всеми заполненными полями:
```json
{
"Enabled": true,
"ChatTagsEnabled": true,
"ScoreboardTagsEnabled": true,
"DefaultTag": "player",
"NameMatchEnabled": true,
"PermissionMatchMode": "inherit",
"IgnoredChatPrefixes": [ "!", "/", ".", "@" ],
"MaxMessageLength": 256,
"ChatFormat": "{DEAD}{PREFIX} {NAME}{DEFAULT}: {MESSAGE}",
"TeamChatFormat": "{DEAD}{TEAM}{PREFIX} {NAME}{DEFAULT}: {MESSAGE}",
"DeadTag": "{GREY}*DEAD*{DEFAULT} ",
"TeamTagT": "{GREY}(T){DEFAULT} ",
"TeamTagCT": "{GREY}(CT){DEFAULT} ",
"TeamTagSpectator": "{GREY}(SPEC){DEFAULT} ",
"TeamColorT": "{RED}",
"TeamColorCT": "{BLUE}",
"TeamColorSpectator": "{GREY}",
"RestrictDeadTeamChat": false,
"ScoreboardRefreshInterval": 10.0,
"ReapplyTagsOnRoundStart": true,
"ClearClanTagWhenUntagged": false,
"ForceScoreboardRefresh": true,
"EmptyScoreboardTag": " ",
"ChatLog": {
"Enabled": true,
"LogToFile": true,
"LogToConsole": true,
"LogCommands": false,
"LogUntaggedPlayers": true,
"IncludeIp": true,
"UseUtcTime": false,
"Directory": "addons/counterstrikesharp/logs/ChatManager",
"FileNameFormat": "chat_{DATE}.log",
"DateFormat": "yyyy-MM-dd",
"TimestampFormat": "yyyy-MM-dd HH:mm:ss",
"FileFormat": "[{TIME}] [{CHANNEL}] [{TAG}] {NAME} ({STEAMID} | {IP}) [{TEAM}/{STATE}]: {MESSAGE}",
"ConsoleFormat": "[ChatManager] [{TIME}] [{CHANNEL}] [{TAG}] {NAME} ({STEAMID} | {IP}): {MESSAGE}",
"ChannelAllLabel": "ALL",
"ChannelTeamLabel": "TEAM",
"AliveLabel": "ALIVE",
"DeadLabel": "DEAD",
"SpectatorLabel": "SPEC",
"TerroristLabel": "T",
"CounterTerroristLabel": "CT",
"UntaggedLabel": "-",
"UnknownValueLabel": "unknown",
"HiddenIpLabel": "hidden",
"MaxQueuedLines": 4096
},
"Discord": {
"Enabled": true,
"WebhookUrl": "https://discord.com/api/webhooks/000000000/xxxxxxxxxxxxxxxx",
"Username": "ChatManager",
"AvatarUrl": "",
"MessageFormat": "{CHANNELEMOJI} {TAGEMOJI} **{PROFILE}** {TEAMEMOJI}{STATEEMOJI} `{TIME}`\n> {MESSAGE}",
"ChannelAllEmoji": "💬",
"ChannelTeamEmoji": "🛡️",
"TeamTEmoji": "🔴",
"TeamCTEmoji": "🔵",
"SpectatorEmoji": "👁️",
"AliveEmoji": "",
"DeadEmoji": "💀",
"SteamProfileUrl": "https://steamcommunity.com/profiles/{STEAMID}",
"IncludeIp": false,
"LogCommands": false,
"LogUntaggedPlayers": true,
"TimestampFormat": "HH:mm:ss",
"UseUtcTime": false,
"BatchIntervalSeconds": 3.0,
"MaxQueuedMessages": 500,
"SuppressEmbeds": true,
"EscapeMarkdown": true
},
"Personalization": {
"Enabled": true,
"Permission": "@css/reservation",
"StorageFile": "addons/counterstrikesharp/data/ChatManager/preferences.json",
"SaveIntervalSeconds": 30.0,
"DefaultShowPrefix": true,
"DefaultShowNameColor": true,
"DefaultShowMessageColor": true,
"DefaultShowScoreboardTag": true,
"MenuTitle": "Chat settings",
"OptionPrefix": "Chat prefix: {STATE}",
"OptionNameColor": "Coloured name: {STATE}",
"OptionMessageColor": "Coloured message: {STATE}",
"OptionScoreboardTag": "Scoreboard tag: {STATE}",
"OptionReset": "Turn everything back on",
"StateOn": "ON",
"StateOff": "OFF",
"NoPermissionMessage": "{RED}You do not have access to the chat settings menu.",
"MenuUnavailableMessage": "{RED}The menu system is unavailable - MenuManager is not installed.",
"DisabledMessage": "{RED}Chat personalisation is disabled on this server."
},
"ClearChat": {
"Enabled": true,
"Permission": "@css/ban",
"Lines": 60,
"LinesPerFrame": 10,
"AnnounceMessage": "{GREEN}[ChatManager]{DEFAULT} Chat was cleared by {LIGHTRED}{NAME}{DEFAULT}.",
"ConsoleName": "Console",
"NoPermissionMessage": "{RED}You do not have access to this command.",
"DiscordMessage": ":broom: Chat was cleared by **{NAME}**"
},
"ConflictDetection": {
"Enabled": true,
"WarnOnKnownPlugins": true,
"WarnOnClanTagDrift": true,
"ClanTagDriftThreshold": 5,
"KnownPrefixPlugins": [
"tags", "prefix", "chatcolor", "chatcolour", "simpleadmin", "k4-system", "k4system",
"ranks", "faceit", "clantag", "scoreboard"
]
},
"Tags": {
"owner": {
"Priority": 100,
"ChatPrefix": "{DARKRED}[OWNER]",
"ChatNameColor": "{LIGHTRED}",
"ChatMessageColor": "{WHITE}",
"ScoreboardTag": "[OW]",
"DiscordEmoji": "👑",
"ChatPrefixEnabled": true,
"ScoreboardTagEnabled": true
},
"admin": {
"Priority": 80,
"ChatPrefix": "{RED}[ADMIN]",
"ChatNameColor": "{LIGHTRED}",
"ChatMessageColor": "{WHITE}",
"ScoreboardTag": "[AD]",
"DiscordEmoji": "🛠️",
"ChatPrefixEnabled": true,
"ScoreboardTagEnabled": true
},
"moderator": {
"Priority": 60,
"ChatPrefix": "{BLUE}[MOD]",
"ChatNameColor": "{LIGHTBLUE}",
"ChatMessageColor": "{WHITE}",
"ScoreboardTag": "[MD]",
"DiscordEmoji": "🔧",
"ChatPrefixEnabled": true,
"ScoreboardTagEnabled": true
},
"vip": {
"Priority": 40,
"ChatPrefix": "{GOLD}[VIP]",
"ChatNameColor": "{YELLOW}",
"ChatMessageColor": "{WHITE}",
"ScoreboardTag": "[VIP]",
"DiscordEmoji": "⭐",
"ChatPrefixEnabled": true,
"ScoreboardTagEnabled": true
},
"player": {
"Priority": 0,
"ChatPrefix": "{GREY}[PLAYER]",
"ChatNameColor": "{WHITE}",
"ChatMessageColor": "{GREY}",
"ScoreboardTag": "",
"ChatPrefixEnabled": true,
"ScoreboardTagEnabled": true
}
},
"Assignments": {
"Permissions": {
"@css/root": "owner",
"@css/ban": "admin",
"@css/kick": "moderator",
"@css/reservation": "vip",
"#css/vip": "vip"
},
"SteamIds": {
"76561198012345678": "owner",
"76561198087654321": "vip"
},
"Names": {
"ExactNickname": "vip",
"MyClan|*": "moderator",
"*[BG]*": "vip"
}
},
"ConfigVersion": 7
}
```