This commit is contained in:
lbenedar
2026-04-02 18:37:30 +03:00
commit d5577f10d7
26 changed files with 1946 additions and 0 deletions

56
cmd/api/handlers.go Normal file
View File

@@ -0,0 +1,56 @@
package main
import (
"fmt"
"net/http"
"gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/models"
)
func (app *application) ShowText(w http.ResponseWriter, r *http.Request) {
msg := app.foundryApp.CreateWSMessageByPage("/join")
data, err := app.foundryApp.HandleWebsocketRequest(msg)
if err != nil {
app.slogger.Error("", "error", err)
w.Write([]byte(err.Error()))
return
}
// setupData, err := models.ParseSetupModel(data)
// if err != nil {
// app.slogger.Error("", "error", err)
// w.Write([]byte(err.Error()))
// return
// }
// fmt.Printf("JSON msg: %t\n", setupData.IsAdmin)
w.Write(data)
}
func (app *application) WhenNextSession(w http.ResponseWriter, r *http.Request) {
msg := app.foundryApp.CreateWSMessageByPage("/setup")
data, err := app.foundryApp.HandleWebsocketRequest(msg)
if err != nil {
app.slogger.Error("", "error", err)
w.Write([]byte(err.Error()))
return
}
setupData, err := models.ParseSetupModel(data)
if err != nil {
app.slogger.Error("", "error", err)
w.Write([]byte(err.Error()))
return
}
nextSession, err := setupData.GetWorlds().GetSessionTime("")
if err != nil {
app.slogger.Error("", "error", err)
w.Write([]byte(err.Error()))
return
}
fmt.Printf("JSON msg: %s\n", nextSession)
w.Write([]byte(nextSession.Local().String()))
}

132
cmd/api/main.go Normal file
View File

@@ -0,0 +1,132 @@
package main
import (
"flag"
"fmt"
"log"
"log/slog"
"net/http"
"os"
"time"
"gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry"
)
type service_mode string
const (
API_MODE = "api"
DISCORD_BOT_MODE = "discord"
TG_BOT_MODE = "tg"
)
type config struct {
mode service_mode
port string
foundryHost string
foundryPass string
}
type application struct {
cfg config
foundryApp *foundry.Foundry
slogger *slog.Logger
logger *log.Logger
}
// TODO: change default values
func (app *application) parseFlags() {
var mode string
flag.StringVar(&mode, "service_mode", "api", "Type of service mode(api|discord|tg)")
flag.StringVar(&app.cfg.port, "port", ":9090", "Service port")
flag.StringVar(&app.cfg.foundryHost, "foundry_host", "127.0.0.1", "Address to connect to Foundry")
flag.StringVar(&app.cfg.foundryPass, "foundry_pass", "", "Password to connect to Foundry")
flag.Parse()
app.cfg.mode = service_mode(mode)
}
func (app *application) ConnectToFoundry(foundryHost, foundryPass string) error {
var err error
if app.foundryApp == nil {
app.foundryApp, err = foundry.NewFoundry(foundryHost)
if err != nil {
return err
}
}
fmt.Printf("Foundry1: %v\n", app.foundryApp)
ok, err := app.foundryApp.CheckSessionToken(foundryHost)
if err != nil {
return err
}
fmt.Printf("Foundry2: %v\n", app.foundryApp)
if foundryPass != "" && !ok {
err := app.foundryApp.Authenticate(foundryPass)
if err != nil {
return err
}
}
fmt.Printf("Foundry3: %v\n", app.foundryApp)
return nil
}
func (app *application) StartListenFoundry() {
for {
err := app.ConnectToFoundry(app.cfg.foundryHost, app.cfg.foundryPass)
if err != nil {
app.logger.Println(err)
return
}
err = foundry.ConnectToWebSocket(app.foundryApp)
if err != nil {
app.logger.Println(err)
return
}
err = app.foundryApp.StartListen()
if err != nil && err != foundry.ListenIsDone {
app.logger.Println(err)
return
}
}
}
func main() {
app := application{foundryApp: nil}
app.parseFlags()
app.slogger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
app.logger = slog.NewLogLogger(app.slogger.Handler(), slog.LevelInfo)
go app.StartListenFoundry()
server := &http.Server{
Addr: app.cfg.port,
Handler: app.routes(),
ErrorLog: app.logger,
// TLSConfig: tlsConfig,
IdleTimeout: time.Minute,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
}
switch app.cfg.mode {
case API_MODE:
app.slogger.Info("Server is started", "port", app.cfg.port)
server.ListenAndServe()
case DISCORD_BOT_MODE:
app.slogger.Warn("TODO: implement this mode")
case TG_BOT_MODE:
app.slogger.Warn("TODO: implement this mode")
default:
app.slogger.Error("Wrong Mode. Should be one of: 'api', 'discord', 'tg'", "mode", app.cfg.mode)
}
}

16
cmd/api/router.go Normal file
View File

@@ -0,0 +1,16 @@
package main
import (
"net/http"
"github.com/julienschmidt/httprouter"
)
func (app *application) routes() http.Handler {
router := httprouter.New()
router.HandlerFunc(http.MethodGet, "/", app.ShowText)
router.HandlerFunc(http.MethodGet, "/v1/when", app.WhenNextSession)
return router
}