]> git.lizzy.rs Git - hydra-dragonfire.git/blob - hydra.go
Implement sending of packets
[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/luax/init.lua
17 var builtinLuaX string
18
19 //go:embed builtin/vector.lua
20 var builtinVector string
21
22 //go:embed builtin/escapes.lua
23 var builtinEscapes string
24
25 //go:embed builtin/client.lua
26 var builtinClient string
27
28 var builtinFiles = []string{
29         builtinLuaX,
30         builtinVector,
31         builtinEscapes,
32         builtinClient,
33 }
34
35 var hydraFuncs = map[string]lua.LGFunction{
36         "client":     l_client,
37         "dtime":      l_dtime,
38         "canceled":   l_canceled,
39         "poll":       l_poll,
40         "disconnect": l_disconnect,
41 }
42
43 func signalChannel() chan os.Signal {
44         sig := make(chan os.Signal, 1)
45         signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
46         return sig
47 }
48
49 func l_dtime(l *lua.LState) int {
50         l.Push(lua.LNumber(time.Since(lastTime).Seconds()))
51         return 1
52 }
53
54 func l_canceled(l *lua.LState) int {
55         l.Push(lua.LBool(canceled))
56         return 1
57 }
58
59 func l_poll(l *lua.LState) int {
60         client, pkt, timeout := doPoll(l, getClients(l))
61         if client == nil {
62                 l.Push(lua.LNil)
63         } else {
64                 l.Push(client.userdata)
65         }
66         l.Push(tolua.Pkt(l, pkt))
67         l.Push(lua.LBool(timeout))
68         return 3
69 }
70
71 func l_disconnect(l *lua.LState) int {
72         for _, client := range getClients(l) {
73                 client.disconnect()
74         }
75
76         return 0
77 }
78
79 func main() {
80         if len(os.Args) < 2 {
81                 panic("missing filename")
82         }
83
84         go func() {
85                 <-signalChannel()
86                 canceled = true
87         }()
88
89         l := lua.NewState(lua.Options{IncludeGoStackTrace: true})
90         defer l.Close()
91
92         arg := l.NewTable()
93         for i, a := range os.Args {
94                 l.RawSetInt(arg, i-1, lua.LString(a))
95         }
96         l.SetGlobal("arg", arg)
97
98         hydra := l.SetFuncs(l.NewTable(), hydraFuncs)
99         l.SetField(hydra, "BS", lua.LNumber(10.0))
100         l.SetGlobal("hydra", hydra)
101
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))
104
105         for _, str := range builtinFiles {
106                 if err := l.DoString(str); err != nil {
107                         panic(err)
108                 }
109         }
110
111         if err := l.DoFile(os.Args[1]); err != nil {
112                 panic(err)
113         }
114 }