5 "github.com/dragonfireclient/hydra-dragonfire/convert"
6 "github.com/yuin/gopher-lua"
13 var lastTime = time.Now()
16 var serializeVer uint8 = 28
17 var protoVer uint16 = 39
19 //go:embed builtin/luax/init.lua
20 var builtinLuaX string
22 //go:embed builtin/vector.lua
23 var builtinVector string
25 //go:embed builtin/escapes.lua
26 var builtinEscapes string
28 //go:embed builtin/client.lua
29 var builtinClient string
31 var builtinFiles = []string{
38 var hydraFuncs = map[string]lua.LGFunction{
41 "canceled": l_canceled,
46 func signalChannel() chan os.Signal {
47 sig := make(chan os.Signal, 1)
48 signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
52 func l_dtime(l *lua.LState) int {
53 l.Push(lua.LNumber(time.Since(lastTime).Seconds()))
57 func l_canceled(l *lua.LState) int {
58 l.Push(lua.LBool(canceled))
62 func l_poll(l *lua.LState) int {
63 client, pkt, timeout := doPoll(l, getClients(l))
64 l.Push(convert.PushPkt(l, pkt))
68 l.Push(client.userdata)
70 l.Push(lua.LBool(timeout))
74 func l_close(l *lua.LState) int {
75 for _, client := range getClients(l) {
84 panic("missing filename")
92 l := lua.NewState(lua.Options{IncludeGoStackTrace: true})
96 for i, a := range os.Args {
97 l.RawSetInt(arg, i-1, lua.LString(a))
99 l.SetGlobal("arg", arg)
101 hydra := l.SetFuncs(l.NewTable(), hydraFuncs)
102 l.SetField(hydra, "BS", lua.LNumber(10.0))
103 l.SetField(hydra, "serialize_ver", lua.LNumber(serializeVer))
104 l.SetField(hydra, "proto_ver", lua.LNumber(protoVer))
105 l.SetGlobal("hydra", hydra)
107 l.SetField(l.NewTypeMetatable("hydra.auth"), "__index", l.SetFuncs(l.NewTable(), authFuncs))
108 l.SetField(l.NewTypeMetatable("hydra.client"), "__index", l.NewFunction(l_client_index))
110 for _, str := range builtinFiles {
111 if err := l.DoString(str); err != nil {
116 if err := l.DoFile(os.Args[1]); err != nil {