# Мениджър на чата
**Рангове в чата, етикети в класацията, пълен архив на чата и релей за 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
}
```