Files
pzmanager/internal/pzconfig/mods.go
T
mrleo1nidandClaude Opus 5 d0ff64c272 Веб-панель управления сервером Project Zomboid
Менеджер запускает сервер PZ как дочерний процесс и держит его stdin/stdout:
отсюда живая консоль без RCON, стриминг логов через SSE и корректная
остановка по цепочке quit -> SIGTERM -> SIGKILL для всей группы процессов.
Сам менеджер работает под systemd.

Что входит:
- управление жизненным циклом сервера, автозапуск и автоподъём после падения;
- метрики процесса из /proc и состояние хоста, список игроков онлайн;
- редакторы servertest.ini и SandboxVars.lua, сохраняющие исходное
  форматирование файлов;
- моды: списки Workshop ID и Mod ID с порядком загрузки, названия из Steam;
- бэкапы мира по расписанию и вручную, с ротацией и восстановлением;
- установка и обновление сервера через SteamCMD;
- вход по логину и паролю, первичная настройка по одноразовому коду.

Веб-интерфейс без сборщика, вшит в бинарник через embed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 22:41:11 +03:00

53 lines
1.5 KiB
Go

package pzconfig
import "strings"
// Ключи servertest.ini, в которых живут моды.
const (
KeyMods = "Mods"
KeyWorkshopItems = "WorkshopItems"
KeyMap = "Map"
)
// SplitList разбирает список PZ вида "a;b;c" в срез без пустых элементов.
func SplitList(value string) []string {
if strings.TrimSpace(value) == "" {
return []string{}
}
parts := strings.Split(value, ";")
out := make([]string, 0, len(parts))
for _, p := range parts {
if p = strings.TrimSpace(p); p != "" {
out = append(out, p)
}
}
return out
}
// JoinList собирает список обратно в формат PZ, убирая дубликаты и сохраняя
// порядок: он важен, моды грузятся именно в нём.
func JoinList(items []string) string {
seen := make(map[string]bool, len(items))
out := make([]string, 0, len(items))
for _, item := range items {
item = strings.TrimSpace(item)
if item == "" || seen[item] {
continue
}
seen[item] = true
out = append(out, item)
}
return strings.Join(out, ";")
}
// Mods возвращает текущие списки модов сервера.
func (i *INI) Mods() (modIDs, workshopIDs []string) {
return SplitList(i.Get(KeyMods)), SplitList(i.Get(KeyWorkshopItems))
}
// SetMods записывает списки модов обратно в конфиг.
func (i *INI) SetMods(modIDs, workshopIDs []string) {
i.Set(KeyMods, JoinList(modIDs))
i.Set(KeyWorkshopItems, JoinList(workshopIDs))
}