5 "github.com/dragonfireclient/hydra-dragonfire/convert"
6 "github.com/yuin/gopher-lua"
13 var lastTime = time.Now()
16 //go:embed builtin/luax/init.lua
17 var builtinLuaX string
19 //go:embed builtin/vector.lua
20 var builtinVector string
22 //go:embed builtin/escapes.lua
23 var builtinEscapes string
25 //go:embed builtin/client.lua
26 var builtinClient string
28 var builtinFiles = []string{
35 var hydraFuncs = map[string]lua.LGFunction{
38 "canceled": l_canceled,
40 "disconnect": l_disconnect,
43 func signalChannel() chan os.Signal {
44 sig := make(chan os.Signal, 1)
45 signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
49 func l_dtime(l *lua.LState) int {
50 l.Push(lua.LNumber(time.Since(lastTime).Seconds()))
54 func l_canceled(l *lua.LState) int {
55 l.Push(lua.LBool(canceled))
59 func l_poll(l *lua.LState) int {
60 client, pkt, timeout := doPoll(l, getClients(l))
64 l.Push(client.userdata)
66 l.Push(convert.PushPkt(l, pkt))
67 l.Push(lua.LBool(timeout))
71 func l_disconnect(l *lua.LState) int {
72 for _, client := range getClients(l) {
81 panic("missing filename")
89 l := lua.NewState(lua.Options{IncludeGoStackTrace: true})
93 for i, a := range os.Args {
94 l.RawSetInt(arg, i-1, lua.LString(a))
96 l.SetGlobal("arg", arg)
98 hydra := l.SetFuncs(l.NewTable(), hydraFuncs)
99 l.SetField(hydra, "BS", lua.LNumber(10.0))
100 l.SetGlobal("hydra", hydra)
102 l.SetField(l.NewTypeMetatable("hydra.auth"), "__index", l.SetFuncs(l.NewTable(), authFuncs))
103 l.SetField(l.NewTypeMetatable("hydra.client"), "__index", l.NewFunction(l_client_index))
105 for _, str := range builtinFiles {
106 if err := l.DoString(str); err != nil {
111 if err := l.DoFile(os.Args[1]); err != nil {