mirror of
https://github.com/akyaiy/GoSally-mvp.git
synced 2026-01-03 02:52:25 +00:00
- Modify .luarc.json to include global Lua scripts. - Update Makefile to include LDFLAGS for versioning. - Enhance node.go to implement version checking and update handling. - Refactor Lua global variables in _globals.lua and echo.lua to use new structures. - Remove deprecated http.lua and update config.yaml for TLS and update settings. - Introduce new update.go for version management and update checking. - Add tests for version comparison in update_test.go. - Improve error handling in various server methods.
112 lines
2.8 KiB
Go
112 lines
2.8 KiB
Go
package sv1
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log/slog"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
)
|
|
|
|
func (h *HandlerV1) _handleList() {
|
|
uuid16 := h.newUUID()
|
|
log := h.log.With(
|
|
slog.Group("request",
|
|
slog.String("version", h.GetVersion()),
|
|
slog.String("url", h.r.URL.String()),
|
|
slog.String("method", h.r.Method),
|
|
),
|
|
slog.Group("connection",
|
|
slog.String("connection-uuid", uuid16),
|
|
slog.String("remote", h.r.RemoteAddr),
|
|
),
|
|
)
|
|
log.Info("Received request")
|
|
type ComMeta struct {
|
|
Description string `json:"Description"`
|
|
Arguments map[string]string `json:"Arguments,omitempty"`
|
|
}
|
|
var (
|
|
files []os.DirEntry
|
|
err error
|
|
commands = make(map[string]ComMeta)
|
|
cmdsProcessed = make(map[string]bool)
|
|
)
|
|
|
|
if files, err = os.ReadDir(h.cfg.ComDir); err != nil {
|
|
log.Error("Failed to read commands directory",
|
|
slog.String("error", err.Error()))
|
|
h.writeJSONError(http.StatusInternalServerError, "failed to read commands directory: "+err.Error())
|
|
return
|
|
}
|
|
|
|
apiVer := chi.URLParam(h.r, "ver")
|
|
|
|
// Сначала ищем версионные
|
|
for _, file := range files {
|
|
if file.IsDir() || filepath.Ext(file.Name()) != ".lua" {
|
|
continue
|
|
}
|
|
cmdFull := file.Name()[:len(file.Name())-4]
|
|
cmdParts := strings.SplitN(cmdFull, "?", 2)
|
|
cmdName := cmdParts[0]
|
|
|
|
if !h.allowedCmd.MatchString(string([]rune(cmdName)[0])) {
|
|
continue
|
|
}
|
|
if !h.listAllowedCmd.MatchString(cmdName) {
|
|
continue
|
|
}
|
|
|
|
if len(cmdParts) == 2 && cmdParts[1] == apiVer {
|
|
description, _ := h.extractDescriptionStatic(filepath.Join(h.cfg.ComDir, file.Name()))
|
|
if description == "" {
|
|
description = "description missing"
|
|
}
|
|
commands[cmdName] = ComMeta{Description: description}
|
|
cmdsProcessed[cmdName] = true
|
|
}
|
|
}
|
|
|
|
// Потом фоллбеки
|
|
for _, file := range files {
|
|
if file.IsDir() || filepath.Ext(file.Name()) != ".lua" {
|
|
continue
|
|
}
|
|
cmdFull := file.Name()[:len(file.Name())-4]
|
|
cmdParts := strings.SplitN(cmdFull, "?", 2)
|
|
cmdName := cmdParts[0]
|
|
|
|
if !h.allowedCmd.MatchString(string([]rune(cmdName)[0])) {
|
|
continue
|
|
}
|
|
if !h.listAllowedCmd.MatchString(cmdName) {
|
|
continue
|
|
}
|
|
if cmdsProcessed[cmdName] {
|
|
continue
|
|
}
|
|
if len(cmdParts) == 1 {
|
|
description, _ := h.extractDescriptionStatic(filepath.Join(h.cfg.ComDir, file.Name()))
|
|
if description == "" {
|
|
description = "description missing"
|
|
}
|
|
commands[cmdName] = ComMeta{Description: description}
|
|
cmdsProcessed[cmdName] = true
|
|
}
|
|
}
|
|
|
|
log.Debug("Command list prepared")
|
|
|
|
log.Info("Session completed")
|
|
|
|
h.w.Header().Set("Content-Type", "application/json")
|
|
if err := json.NewEncoder(h.w).Encode(commands); err != nil {
|
|
h.log.Error("Failed to write JSON error response",
|
|
slog.String("error", err.Error()))
|
|
}
|
|
}
|