]> git.lizzy.rs Git - hydra-dragonfire.git/blobdiff - hydra.go
Merge pull request #4 from Minetest-j45/master
[hydra-dragonfire.git] / hydra.go
index 009731c2b001f192b167350ace86f2241ba62c33..2d5d9e3f9b073c3de5364f0b1d029190c0bbd2d4 100644 (file)
--- a/hydra.go
+++ b/hydra.go
@@ -2,16 +2,19 @@ package main
 
 import (
        _ "embed"
-       "github.com/dragonfireclient/hydra-dragonfire/convert"
        "github.com/yuin/gopher-lua"
        "os"
        "os/signal"
+       "runtime/pprof"
        "syscall"
        "time"
 )
 
 var lastTime = time.Now()
-var canceled = false
+var signalChannel chan os.Signal
+
+var serializeVer uint8 = 29
+var protoVer uint16 = 40
 
 //go:embed builtin/luax/init.lua
 var builtinLuaX string
@@ -25,52 +28,38 @@ var builtinEscapes string
 //go:embed builtin/client.lua
 var builtinClient string
 
+//go:embed builtin/base64.lua
+var builtinBase64 string
+
 var builtinFiles = []string{
        builtinLuaX,
        builtinVector,
        builtinEscapes,
        builtinClient,
+       builtinBase64,
 }
 
 var hydraFuncs = map[string]lua.LGFunction{
-       "client":     l_client,
-       "dtime":      l_dtime,
-       "canceled":   l_canceled,
-       "poll":       l_poll,
-       "disconnect": l_disconnect,
-}
-
-func signalChannel() chan os.Signal {
-       sig := make(chan os.Signal, 1)
-       signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
-       return sig
+       "client": l_client,
+       "map":    l_map,
+       "dtime":  l_dtime,
+       "poll":   l_poll,
+       "close":  l_close,
 }
 
 func l_dtime(l *lua.LState) int {
        l.Push(lua.LNumber(time.Since(lastTime).Seconds()))
-       return 1
-}
-
-func l_canceled(l *lua.LState) int {
-       l.Push(lua.LBool(canceled))
+       lastTime = time.Now()
        return 1
 }
 
 func l_poll(l *lua.LState) int {
-       client, pkt, timeout := doPoll(l, getClients(l))
-       if client == nil {
-               l.Push(lua.LNil)
-       } else {
-               l.Push(client.userdata)
-       }
-       l.Push(convert.PushPkt(l, pkt))
-       l.Push(lua.LBool(timeout))
-       return 3
+       return doPoll(l, getClients(l))
 }
 
-func l_disconnect(l *lua.LState) int {
+func l_close(l *lua.LState) int {
        for _, client := range getClients(l) {
-               client.disconnect()
+               client.closeConn()
        }
 
        return 0
@@ -81,12 +70,19 @@ func main() {
                panic("missing filename")
        }
 
+       signalChannel = make(chan os.Signal, 1)
+       signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
+
        go func() {
-               <-signalChannel()
-               canceled = true
+               ch := make(chan os.Signal, 1)
+               signal.Notify(ch, syscall.SIGUSR1)
+               for {
+                       <-ch
+                       pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
+               }
        }()
 
-       l := lua.NewState(lua.Options{IncludeGoStackTrace: true})
+       l := lua.NewState()
        defer l.Close()
 
        arg := l.NewTable()
@@ -97,10 +93,16 @@ func main() {
 
        hydra := l.SetFuncs(l.NewTable(), hydraFuncs)
        l.SetField(hydra, "BS", lua.LNumber(10.0))
+       l.SetField(hydra, "serialize_ver", lua.LNumber(serializeVer))
+       l.SetField(hydra, "proto_ver", lua.LNumber(protoVer))
        l.SetGlobal("hydra", hydra)
 
-       l.SetField(l.NewTypeMetatable("hydra.auth"), "__index", l.SetFuncs(l.NewTable(), authFuncs))
        l.SetField(l.NewTypeMetatable("hydra.client"), "__index", l.NewFunction(l_client_index))
+       l.SetField(l.NewTypeMetatable("hydra.map"), "__index", l.SetFuncs(l.NewTable(), mapFuncs))
+
+       l.SetField(l.NewTypeMetatable("hydra.comp.auth"), "__index", l.SetFuncs(l.NewTable(), compAuthFuncs))
+       l.SetField(l.NewTypeMetatable("hydra.comp.map"), "__index", l.SetFuncs(l.NewTable(), compMapFuncs))
+       l.SetField(l.NewTypeMetatable("hydra.comp.pkts"), "__index", l.SetFuncs(l.NewTable(), compPktsFuncs))
 
        for _, str := range builtinFiles {
                if err := l.DoString(str); err != nil {