]> git.lizzy.rs Git - hydra-dragonfire.git/blob - hydra.go
Use dragonfire fork of mt
[hydra-dragonfire.git] / hydra.go
1 package main
2
3 import (
4         _ "embed"
5         "github.com/yuin/gopher-lua"
6         "os"
7         "os/signal"
8         "syscall"
9         "time"
10 )
11
12 var lastTime = time.Now()
13 var signalChannel chan os.Signal
14
15 var serializeVer uint8 = 29
16 var protoVer uint16 = 40
17
18 //go:embed builtin/luax/init.lua
19 var builtinLuaX string
20
21 //go:embed builtin/vector.lua
22 var builtinVector string
23
24 //go:embed builtin/escapes.lua
25 var builtinEscapes string
26
27 //go:embed builtin/client.lua
28 var builtinClient string
29
30 //go:embed builtin/base64.lua
31 var builtinBase64 string
32
33 var builtinFiles = []string{
34         builtinLuaX,
35         builtinVector,
36         builtinEscapes,
37         builtinClient,
38         builtinBase64,
39 }
40
41 var hydraFuncs = map[string]lua.LGFunction{
42         "client": l_client,
43         "map":    l_map,
44         "dtime":  l_dtime,
45         "poll":   l_poll,
46         "close":  l_close,
47 }
48
49 func l_dtime(l *lua.LState) int {
50         l.Push(lua.LNumber(time.Since(lastTime).Seconds()))
51         lastTime = time.Now()
52         return 1
53 }
54
55 func l_poll(l *lua.LState) int {
56         return doPoll(l, getClients(l))
57 }
58
59 func l_close(l *lua.LState) int {
60         for _, client := range getClients(l) {
61                 client.closeConn()
62         }
63
64         return 0
65 }
66
67 func main() {
68         if len(os.Args) < 2 {
69                 panic("missing filename")
70         }
71
72         signalChannel = make(chan os.Signal, 1)
73         signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
74
75         l := lua.NewState()
76         defer l.Close()
77
78         arg := l.NewTable()
79         for i, a := range os.Args {
80                 l.RawSetInt(arg, i-1, lua.LString(a))
81         }
82         l.SetGlobal("arg", arg)
83
84         hydra := l.SetFuncs(l.NewTable(), hydraFuncs)
85         l.SetField(hydra, "BS", lua.LNumber(10.0))
86         l.SetField(hydra, "serialize_ver", lua.LNumber(serializeVer))
87         l.SetField(hydra, "proto_ver", lua.LNumber(protoVer))
88         l.SetGlobal("hydra", hydra)
89
90         l.SetField(l.NewTypeMetatable("hydra.client"), "__index", l.NewFunction(l_client_index))
91         l.SetField(l.NewTypeMetatable("hydra.map"), "__index", l.SetFuncs(l.NewTable(), mapFuncs))
92
93         l.SetField(l.NewTypeMetatable("hydra.comp.auth"), "__index", l.SetFuncs(l.NewTable(), compAuthFuncs))
94         l.SetField(l.NewTypeMetatable("hydra.comp.map"), "__index", l.SetFuncs(l.NewTable(), compMapFuncs))
95         l.SetField(l.NewTypeMetatable("hydra.comp.pkts"), "__index", l.SetFuncs(l.NewTable(), compPktsFuncs))
96
97         for _, str := range builtinFiles {
98                 if err := l.DoString(str); err != nil {
99                         panic(err)
100                 }
101         }
102
103         if err := l.DoFile(os.Args[1]); err != nil {
104                 panic(err)
105         }
106 }