# Manager de chat
**Poziții în chat, etichete în clasament, un istoric complet al conversațiilor și o funcție de retransmisie Discord — totul într-un singur plugin.**
Oferiți proprietarilor, administratorilor și utilizatorilor VIP un prefix colorat în chat și o etichetă corespunzătoare în clasamentul TAB,
redau totul într-un canal Discord și păstrează un jurnal în care se pot efectua căutări pentru fiecare mesaj. Jucătorii primesc un
meniul pentru a-și personaliza aspectul. Fiecare detaliu este configurabil — nu trebuie să te atingi deloc de cod.
---
## Cum arată
### În chat
Tu scrii următoarele:
```json
"owner": {
"ChatPrefix": "{DARKRED}[OWNER]",
"ChatNameColor": "{LIGHTRED}",
"ChatMessageColor": "{WHITE}",
"ScoreboardTag": "[OW]"
}
```
Jucătorii văd următoarele elemente — prefixul, numele și textul mesajului, fiecare având propria culoare:
```
[OWNER] illusion: hey everyone
[ADMIN] SomeGuy: rotating B
(T) [VIP] Player: two left in site
*DEAD* [VIP] Player: he's behind you
```
Aranjarea generală îți aparține: poți să o reordonezi, să schimbi separatorul, să adaugi o culoare a echipei care să se potrivească cu cea a oricui
vorbește. Vrei ca *toți* jucătorii să aibă un stil propriu, nu doar membrii staff-ului? O singură setare rezolvă asta.
### Pe tabela de marcaj
```
[OW] illusion 22 4
[AD] SomeGuy 17 9
[VIP] Player 8 12
```
### Pe Discord
Numele conțin linkuri directe către profilul de pe Steam. Rangurile au propria insignă. Mesajul apare separat
linia citată, ca să nu se piardă niciodată:
> 💬 👑 **iluzie** 🔴 `18:42:07`
> > Hei, rotirea lui B
>
> 🛡️ ⭐ **SomeGuy** 🔵 💀 `18:42:19`
> > au mai rămas două pe site
### În jurnalele tale
Un fișier cu data zilei, plus aceeași linie în consola serverului:
```
[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
```
---
## Caracteristici
**Clasamente și etichete**
- Prefix colorat pentru chat, culoarea numelui și culoarea mesajelor în funcție de rang
- Sincronizarea etichetei de pe tabela de scor — setați o singură dată clasamentul, iar ambele se sincronizează automat
- Atribuie ranguri în funcție de **steagul/grupul de administrator**, **SteamID** sau **numele jucătorului** (cu caractere generice)
- Prioritățile stabilesc cine câștigă atunci când un jucător îndeplinește mai multe condiții de clasificare
- `{TEAMCOLOR}` textul este colorat în roșu pentru T și în albastru pentru CT, în funcție de vorbitor
**Înregistrarea conversațiilor**
- Fișier jurnal cu rotație zilnică, conținând data și ora, rangul, numele, SteamID-ul, adresa IP, echipa și mesajul
- Aceeași linie în consola serverului, în formatul tău propriu
- Fiecare câmp și etichetă pot fi configurate; adresele IP pot fi dezactivate
**Relay Discord**
- Mirrors transmite mesaje în orice canal prin intermediul unui webhook
- Linkuri către profiluri Steam pe care se poate face clic, insigne de rang și emoji-uri reprezentând echipa sau faptul că jucătorul este online
- Adresele IP sunt ascunse în mod implicit, postările în serie respectă limitele de frecvență impuse de Discord
- Jucătorii nu pot trimite pinguri `@everyone`sau modifica formatul canalului tău — ambele funcții sunt blocate
**Pentru jucătorii dumneavoastră**
- `!cm` deschide un meniu în care jucătorul își poate dezactiva propriul prefix, culorile sau eticheta de pe tabloul de scor
- Alegerea lor este memorată între reconectări, hărți și reporniri
- Jucătorii își pot ascunde **doar** propriile stiluri — nimeni nu poate alege un prefix sau nu poate modifica stilurile altora
**Pentru personalul dumneavoastră**
- `!clearchat` / șterge`!cc` istoricul chatului cu un mesaj configurabil de tipul „șters de X”
- Reîncărcarea configurației în timp real — fără repornire
- Te avertizează în consolă dacă un alt plugin se află în conflict cu aceeași linie de chat sau cu aceeași etichetă din tabelul de scoruri
---
## Comenzi
| Comandă | Funcționează și ca | Cine îl poate folosi |
| --- | --- | --- |
| `css_cm` | `!cm` `/cm` | `@css/reservation` în mod implicit — sau toată lumea, după cum dorești |
| `css_clearchat` | `!clearchat` `/clearchat` | `@css/ban` în mod implicit |
| `css_cc` | `!cc` `/cc` | la fel ca mai sus |
| `css_chat_reload` | `!chat_reload` | `@css/root` |
| `css_chat_debug` | `!chat_debug` | `@css/root` — verificarea eventualelor blocări ale etichetei |
Fiecare permisiune poate fi configurată. **Dacă lăsați una necompletată, comanda respectivă va fi accesibilă tuturor.**
---
## Cerințe
- Server CS2 cu [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/releases)
- [MenuManagerCS2](https://github.com/NickFox007/MenuManagerCS2) — **opțional**, doar pentru `!cm`
meniu. Restul funcționează fără acesta.
## Instalare
1. Copiați fișierele în `addons/counterstrikesharp/plugins/ChatManager/`
2. Reporniți serverul sau executați `css_plugins load ChatManager`
3. Editare `addons/counterstrikesharp/configs/plugins/ChatManager/ChatManager.json`
4. Executare `css_chat_reload`— nu este necesară repornirea
Asta e tot. Configurația se generează automat la prima încărcare cu valori implicite adecvate, iar pluginul afișează
căile exacte către consola ta, astfel încât să știi întotdeauna unde se află lucrurile.
---
## Configurare
Totul se află într-**un** **singur fișier JSON**. Clasamentele sunt definite o singură dată și sunt menționate după nume:
```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" }
}
```
Un jucător care se încadrează în mai multe categorii primește cea mai înaltă dintre acestea`Priority`. Orice mențiune care indică o categorie care
dacă nu există, este omisă cu un avertisment clar — o greșeală de tastare nu va duce niciodată la căderea serverului.
### Culori
Plasați-le oriunde este permisă o culoare. Jetoanele aflate pe același rând au aceeași culoare.
| Token | Culoare |
| --- | --- |
| `{DEFAULT}` `{WHITE}` | Alb — culoarea standard a chatului |
| `{DARKRED}` | Roșu închis |
| `{GREEN}` | Verde |
| `{OLIVE}` | Măslin |
| `{LIME}` | Lămâie verde |
| `{RED}` | Roșu |
| `{GREY}` `{GRAY}` | Gri |
| `{YELLOW}` | Galben |
| `{SILVER}` `{BLUEGREY}` | Argintiu / albastru-gri |
| `{BLUE}` `{LIGHTBLUE}` | Albastru deschis |
| `{DARKBLUE}` | Albastru închis |
| `{PURPLE}` `{MAGENTA}` | Violet |
| `{LIGHTRED}` | Roșu deschis |
| `{GOLD}` `{ORANGE}` | Portocaliu-auriu |
| **`{TEAMCOLOR}`** | **Roșu pentru T, albastru pentru CT — indică vorbitorul** |
Atenție: `{BLUE}`este cel albastru *deschis*, `{DARKBLUE}`este cel închis, iar nu există unul separat
portocaliu — `{GOLD}`asta e.
### Aspect
`ChatFormat` determină întreaga linie. Valoarea implicită este:
```
{DEAD}{PREFIX} {NAME}{DEFAULT}: {MESSAGE}
```
`{PREFIX}``{NAME}``{MESSAGE}``{TEAM}``{DEAD}` — aranjați-le cum doriți. Chatul de echipă are propriile sale
propriul format. Fișierul jurnal, consola și Discord au, de asemenea, fiecare propriul format, cu marcatori pentru oră,
SteamID, adresa IP, echipa, rangul și multe altele.
📖 **[Ghid complet de configurare →](CONFIGURATION.md)** — explicații pentru fiecare setare, plus Discord
jetoane, meniul de personalizare, avertismente privind conflictele și rezolvarea problemelor.
---
## Bine de știut
Spus pe șleau, pentru că ar trebui să știi înainte de a cumpăra:
- **Acesta redesenază fereastra de chat prin înlocuirea mesajului.** Așa funcționează orice plugin de acest gen, iar acesta
are un efect secundar: un jucător pe care cineva l-a dezactivat în clasament îi este în continuare vizibil, deoarece un
Linia afișată de plugin nu ține cont de lista de mutare. Dacă serverul tău are nevoie ca mutările impuse de clienți să rămână active, execută
dezactivați etichetele de chat din plugin și folosiți în schimb etichetele din tabelul de scoruri și înregistrarea datelor.
- **Dacă ai deja un plugin de blocare a sunetului sau de mutare activat**, ordinea de încărcare decide care dintre ele are prioritate. Testează-l — nu durează decât un minut,
iar soluția constă într-o singură setare, indiferent de opțiunea aleasă.
- **Dacă un alt plugin scrie, de asemenea, etichete pe tabloul de scor** (clasament, nivel Faceit…), cele două se vor suprapune.
Pluginul detectează acest lucru și îți afișează un mesaj în consolă, în loc să te lase să ghicești.
- **Mesajele blocate pot fi totuși înregistrate.** Dacă un alt plugin blochează un mesaj după ce acesta a fost
chiar dacă ai văzut-o, mesajul poate ajunge totuși în jurnalul tău și pe Discord.
## Performanță
Conceput pentru un server complet. Liniile de chat sunt precompilate la încărcarea configurației, nu sunt recompilate pentru fiecare mesaj.
Înregistrările în jurnal și pe Discord sunt transmise către sarcini de fundal, astfel încât firul de execuție al jocului nu așteaptă niciodată pe disc sau
pe Discord. Dacă Discord nu mai funcționează sau discul rămâne în urmă, mesajele sunt pierdute și luate în calcul —
Serverul nu se blochează niciodată. Ștergerea istoricului de chat se desfășoară pe mai multe cadre, astfel încât cei 64 de jucători nu îți consumă niciun tick.
---
## Exemplu complet de configurare
O configurație completă și funcțională, cu toate câmpurile completate:
```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
}
```