Консоль не принимает команды у остановленного сервера
Поле ввода и кнопка «Отправить» были активны всегда, хотя команда уходит в stdin процесса: у остановленного сервера его просто нет, и панель отвечала ошибкой уже после отправки. Теперь консоль блокируется, а подсказка объясняет, почему. Заодно из вывода убираются управляющие последовательности терминала. SteamCMD раскрашивает свои сообщения, и в браузере это выглядело как «[0mWaiting for user info...[0mOK». Чистка стоит на общем пути записи в буфер: через него идёт и вывод сервера, и SteamCMD, и сообщения панели. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,20 @@
|
||||
package pzserver
|
||||
|
||||
import "sync"
|
||||
import (
|
||||
"regexp"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// ansiRe ловит управляющие последовательности терминала: SteamCMD и сам
|
||||
// сервер раскрашивают вывод, а в браузере эти коды превращаются в мусор
|
||||
// вида "[0mOK". Первый вариант — CSI (цвета, перемещение курсора), второй —
|
||||
// всё остальное, что начинается с ESC.
|
||||
var ansiRe = regexp.MustCompile("\x1b\\[[0-9;?]*[ -/]*[@-~]|\x1b.")
|
||||
|
||||
// stripANSI убирает управляющие последовательности из строки вывода.
|
||||
func stripANSI(text string) string {
|
||||
return ansiRe.ReplaceAllString(text, "")
|
||||
}
|
||||
|
||||
// LogLine — одна строка консоли сервера с монотонным номером, по которому
|
||||
// веб-клиент понимает, что он пропустил, и откуда догружать.
|
||||
@@ -33,6 +47,10 @@ func newLogBuffer(capacity int) *logBuffer {
|
||||
|
||||
// append кладёт строку в буфер и рассылает подписчикам.
|
||||
func (b *logBuffer) append(line LogLine) {
|
||||
// Чистим здесь, а не у каждого источника: через буфер проходят и вывод
|
||||
// сервера, и SteamCMD, и сообщения самой панели.
|
||||
line.Text = stripANSI(line.Text)
|
||||
|
||||
b.mu.Lock()
|
||||
line.Seq = b.nextSeq
|
||||
b.nextSeq++
|
||||
|
||||
Reference in New Issue
Block a user