]> git.lizzy.rs Git - hydra-dragonfire.git/blob - hydra.go
ee8cdb650cf33b560882dad6f094a84283e3c3ed
[hydra-dragonfire.git] / hydra.go
1 package main
2
3 import (
4         _ "embed"
5         "github.com/dragonfireclient/hydra-dragonfire/tolua"
6         "github.com/yuin/gopher-lua"
7         "os"
8         "os/signal"
9         "syscall"
10         "time"
11 )
12
13 var lastTime = time.Now()
14 var canceled = false
15
16 //go:embed builtin/vector.lua
17 var vectorLibrary string
18
19 var hydraFuncs = map[string]lua.LGFunction{
20         "client":     l_client,
21         "dtime":      l_dtime,
22         "canceled":   l_canceled,
23         "poll":       l_poll,
24         "disconnect": l_disconnect,
25 }
26
27 func signalChannel() chan os.Signal {
28         sig := make(chan os.Signal, 1)
29         signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
30         return sig
31 }
32
33 func l_dtime(l *lua.LState) int {
34         l.Push(lua.LNumber(time.Since(lastTime).Seconds()))
35         return 1
36 }
37
38 func l_canceled(l *lua.LState) int {
39         l.Push(lua.LBool(canceled))
40         return 1
41 }
42
43 func l_poll(l *lua.LState) int {
44         client, pkt, timeout := doPoll(l, getClients(l))
45         if client == nil {
46                 l.Push(lua.LNil)
47         } else {
48                 l.Push(client.userdata)
49         }
50         l.Push(tolua.Pkt(l, pkt))
51         l.Push(lua.LBool(timeout))
52         return 3
53 }
54
55 func l_disconnect(l *lua.LState) int {
56         for _, client := range getClients(l) {
57                 client.disconnect()
58         }
59
60         return 0
61 }
62
63 func main() {
64         if len(os.Args) < 2 {
65                 panic("missing filename")
66         }
67
68         go func() {
69                 <-signalChannel()
70                 canceled = true
71         }()
72
73         l := lua.NewState(lua.Options{IncludeGoStackTrace: true})
74         defer l.Close()
75
76         arg := l.NewTable()
77         for i, a := range os.Args {
78                 l.RawSetInt(arg, i-1, lua.LString(a))
79         }
80         l.SetGlobal("arg", arg)
81
82         hydra := l.SetFuncs(l.NewTable(), hydraFuncs)
83         l.SetField(hydra, "BS", lua.LNumber(10.0))
84         l.SetGlobal("hydra", hydra)
85
86         l.SetField(l.NewTypeMetatable("hydra.auth"), "__index", l.SetFuncs(l.NewTable(), authFuncs))
87         l.SetField(l.NewTypeMetatable("hydra.client"), "__index", l.NewFunction(l_client_index))
88
89         if err := l.DoString(vectorLibrary); err != nil {
90                 panic(err)
91         }
92
93         if err := l.DoFile(os.Args[1]); err != nil {
94                 panic(err)
95         }
96 }