# Menedżer czatu
**Pozycje na liście czatu, tagi na tablicy wyników, pełny zapis czatu i przekaźnik Discord — wszystko w jednej wtyczce.**
Przyznaj właścicielom, administratorom i użytkownikom VIP kolorowy prefiks na czacie oraz pasujący znacznik na tablicy wyników TAB,
przekazywać wszystko na kanał Discorda i prowadzić przeszukiwalny dziennik wszystkich wiadomości. Gracze otrzymują
menu, w którym mogą dostosować wygląd strony. Każdy najmniejszy element można skonfigurować — nie musisz w ogóle ingerować w kod.
---
## Jak to wygląda
### Na czacie
Napisałeś następujące zdanie:
```json
"owner": {
"ChatPrefix": "{DARKRED}[OWNER]",
"ChatNameColor": "{LIGHTRED}",
"ChatMessageColor": "{WHITE}",
"ScoreboardTag": "[OW]"
}
```
Gracze widzą to — przedrostek, nazwę i treść wiadomości, z których każda ma swój własny kolor:
```
[OWNER] illusion: hey everyone
[ADMIN] SomeGuy: rotating B
(T) [VIP] Player: two left in site
*DEAD* [VIP] Player: he's behind you
```
Cały układ należy do Ciebie: możesz zmienić kolejność elementów, zmienić separator, dodać kolor drużyny, który będzie się zmieniał w zależności od tego, kto…
mówi. Chcesz, żeby *każdy* gracz miał swój styl, a nie tylko pracownicy? Wystarczy jedno ustawienie.
### Na tablicy wyników
```
[OW] illusion 22 4
[AD] SomeGuy 17 9
[VIP] Player 8 12
```
### Na Discordzie
Nazwy zawierają bezpośrednie linki do profilu na Steamie. Poziomy mają własne odznaki. Komunikat jest wyświetlany osobno
cytowany wiersz, żeby się nie zgubił:
> 💬 👑 **iluzja** 🔴 `18:42:07`
> > Hej, obracające się B
>
> 🛡️ ⭐ **SomeGuy** 🔵 💀 `18:42:19`
> > na stronie pozostały dwa
### W waszych logach
Plik z datą z każdego dnia oraz ten sam wpis w konsoli serwera:
```
[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
```
---
## Funkcje
**Rangi i tagi**
- Kolorowy prefiks na czacie, kolor nazwy i kolor wiadomości w zależności od rangi
- Dopasowanie etykiety na tablicy wyników — wystarczy ustawić pozycję raz, a obie się zsynchronizują
- Przypisuj rangi na podstawie **flagi/grupy administratora**, **identyfikatora SteamID** lub **nazwy gracza** (z użyciem znaków wieloznacznych)
- Priorytety decydują o tym, kto wygrywa, gdy gracz spełnia warunki kilku rang
- `{TEAMCOLOR}` tekst w kolorze czerwonym dla T i niebieskim dla CT, zgodnie z tym, co mówi mówca
**Rejestracja rozmów na czacie**
- Codzienny, cyklicznie aktualizowany plik dziennika zawierający znacznik czasu, pozycję w rankingu, nazwę, identyfikator SteamID, adres IP, drużynę i wiadomość
- Ten sam wiersz w konsoli serwera, w Twoim własnym układzie
- Każde pole i etykietę można dostosować; adresy IP można wyłączyć
**Przekaźnik Discord**
- Mirrors umożliwia czatowanie na dowolnym kanale za pośrednictwem webhooka
- Aktywne linki do profili na Steamie, odznaki rangi oraz emoji drużyn i „alive”
- Adresy IP domyślnie ukryte, posty publikowane partiami z zachowaniem limitów częstotliwości serwisu Discord
- Gracze nie mogą wysyłać pingów `@everyone`ani zmieniać formatowania Twojego kanału — obie te funkcje są zablokowane
**Dla Twoich graczy**
- `!cm` otwiera menu, w którym gracz może wyłączyć swój prefiks, kolory lub tag na tablicy wyników
- Ich wybór jest zapamiętywany między ponownymi połączeniami, zmianami map i ponownymi uruchomieniami
- Gracze mogą ukrywać **wyłącznie** własne style — nikt nie może wybierać prefiksów ani ingerować w style innych graczy
**Dla Państwa pracowników**
- `!clearchat` / czyści`!cc` czat, wyświetlając konfigurowalny komunikat „wyczyszczono przez X”
- Przeładowanie konfiguracji na żywo — bez konieczności ponownego uruchamiania
- Wyświetla ostrzeżenie w konsoli, jeśli inna wtyczka próbuje przejąć kontrolę nad tym samym wierszem czatu lub tagiem tablicy wyników
---
## Polecenia
| Polecenie | Działa również jako | Kto może z tego korzystać |
| --- | --- | --- |
| `css_cm` | `!cm` `/cm` | `@css/reservation` domyślnie — albo wszyscy, jak wolisz |
| `css_clearchat` | `!clearchat` `/clearchat` | `@css/ban` domyślnie |
| `css_cc` | `!cc` `/cc` | tak samo jak powyżej |
| `css_chat_reload` | `!chat_reload` | `@css/root` |
| `css_chat_debug` | `!chat_debug` | `@css/root` — sprawdzenie, czy metka nie utknęła |
Każde uprawnienie można skonfigurować. **Jeśli pozostawisz jakieś pole puste, polecenie to będzie dostępne dla wszystkich.**
---
## Wymagania
- Serwer CS2 z [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/releases)
- [MenuManagerCS2](https://github.com/NickFox007/MenuManagerCS2) — **opcjonalne**, przeznaczone wyłącznie dla `!cm`
menu. Wszystko inne działa bez niego.
## Instalacja
1. Skopiuj pliki do `addons/counterstrikesharp/plugins/ChatManager/`
2. Uruchom ponownie serwer lub wykonaj polecenie `css_plugins load ChatManager`
3. Edytuj `addons/counterstrikesharp/configs/plugins/ChatManager/ChatManager.json`
4. Uruchom `css_chat_reload`— nie trzeba ponownie uruchamiać
To wszystko. Konfiguracja tworzy się automatycznie przy pierwszym załadowaniu z rozsądnymi wartościami domyślnymi, a wtyczka wyświetla
dokładne ścieżki dostępu do konsoli, dzięki czemu zawsze będziesz wiedzieć, gdzie co się znajduje.
---
## Konfiguracja
Wszystko znajduje się w **jednym pliku JSON**. Pozycje w rankingu są definiowane jednorazowo, a następnie odwołuje się do nich po nazwie:
```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" }
}
```
Gracz, który spełnia kryteria kilku rang, otrzymuje najwyższą z nich`Priority`. Wszystko, co wskazuje na rangę, która
Jeśli coś nie istnieje, jest to pomijane wraz z wyraźnym ostrzeżeniem — literówka nigdy nie spowoduje awarii serwera.
### Kolory
Umieść je w dowolnym miejscu, gdzie dozwolony jest dany kolor. Żetony w tym samym rzędzie mają ten sam kolor.
| Token | Kolor |
| --- | --- |
| `{DEFAULT}` `{WHITE}` | Biały — standardowy kolor czatu |
| `{DARKRED}` | Ciemnoczerwony |
| `{GREEN}` | Zielony |
| `{OLIVE}` | Oliwka |
| `{LIME}` | Limonka |
| `{RED}` | Czerwony |
| `{GREY}` `{GRAY}` | Szary |
| `{YELLOW}` | Żółty |
| `{SILVER}` `{BLUEGREY}` | Srebrny / niebiesko-szary |
| `{BLUE}` `{LIGHTBLUE}` | Jasnoniebieski |
| `{DARKBLUE}` | Ciemnoniebieski |
| `{PURPLE}` `{MAGENTA}` | Fioletowy |
| `{LIGHTRED}` | Jasnoczerwony |
| `{GOLD}` `{ORANGE}` | Pomarańczowo-złoty |
| **`{TEAMCOLOR}`** | **Czerwony dla T, niebieski dla CT — wskazuje mówcę** |
Uwaga: `{BLUE}`to ten jasnoniebieski, `{DARKBLUE}`to ten ciemny, a nie ma osobnego
pomarańczowy — to właśnie`{GOLD}` to.
### Układ
`ChatFormat` określa całą linię. Wartość domyślna to:
```
{DEAD}{PREFIX} {NAME}{DEFAULT}: {MESSAGE}
```
`{PREFIX}``{NAME}``{MESSAGE}``{TEAM}``{DEAD}` — ułóż je tak, jak chcesz. Czat zespołowy ma swoje
własny format. Plik dziennika, konsola i Discord również mają swoje własne formaty, zawierające znaczniki czasu,
SteamID, adres IP, drużyna, ranga i inne informacje.
📖 **[Pełny przewodnik po konfiguracji →](CONFIGURATION.md)** — objaśnienia wszystkich ustawień oraz Discord
żetony, menu personalizacji, ostrzeżenia o konfliktach i rozwiązywanie problemów.
---
## Warto wiedzieć
Powiedziane wprost, bo warto wiedzieć przed zakupem:
- **Zmienia wygląd czatu poprzez zastąpienie wiadomości.** Tak właśnie działają wszystkie wtyczki tego typu, a ta
ma jeden efekt uboczny: gracz, którego ktoś wyciszył na tablicy wyników, nadal jest dla niego widoczny, ponieważ
Wiersz wygenerowany przez wtyczkę nie uwzględnia tej listy wyciszeń. Jeśli serwer wymaga, aby wyciszenia klientów były zachowywane, uruchom
włącz wtyczkę z wyłączonymi tagami czatu i zamiast tego korzystaj z tagów tablicy wyników oraz rejestrowania danych.
- **Jeśli masz już uruchomioną wtyczkę blokującą dźwięk**, o tym, która z nich zadziała, decyduje kolejność ładowania. Sprawdź to — zajmie to tylko chwilę,
a rozwiązanie polega na zmianie jednego ustawienia w dowolną stronę.
- **Jeśli inna wtyczka również zapisuje tagi w tabeli wyników** (pozycja w rankingu, poziom Faceit…), obie będą ze sobą kolidować. Ta
Wtyczka wykrywa to i wyświetla odpowiedni komunikat w konsoli, zamiast pozostawiać użytkownika w niepewności.
- **Zablokowane wiadomości mogą nadal być rejestrowane.** Jeśli inna wtyczka zablokuje wiadomość po tym, jak ta
nawet jeśli to widziałeś, nadal może to trafić do twojego dziennika i na Discord.
## Wydajność
Zaprojektowano z myślą o pełnym serwerze. Linie czatu są wstępnie kompilowane podczas ładowania konfiguracji, a nie odtwarzane na nowo dla każdej wiadomości.
Zapisy do dziennika i na Discordzie są przekazywane do zadań działających w tle, więc wątek gry nigdy nie czeka na dysku ani
na Discordzie. Jeśli Discord przestanie działać lub dysk nie nadąża, wiadomości są pomijane i zaliczane —
Serwer nigdy się nie zawiesza. Czyszczenie czatu odbywa się w kilku klatkach, więc 64 graczy nie powoduje utraty jednego taktu.
---
## Pełny przykład konfiguracji
Kompletna, działająca konfiguracja ze wszystkimi wypełnionymi polami:
```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
}
```