5 "github.com/Shopify/go-lua"
6 "github.com/anon55555/mt"
10 type clientState uint8
13 csNew clientState = iota
18 type Handler interface {
19 create(client *Client)
21 canConnect() (bool, string)
23 handle(pkt *mt.Pkt, l *lua.State, idx int)
29 handlers map[string]Handler
34 func getClient(l *lua.State) *Client {
35 return lua.CheckUserData(l, 1, "hydra.client").(*Client)
38 func l_client(l *lua.State) int {
40 address: lua.CheckString(l, 1),
42 handlers: map[string]Handler{},
45 l.PushUserData(client)
47 if lua.NewMetaTable(l, "hydra.client") {
48 lua.NewLibrary(l, []lua.RegistryFunction{
49 {Name: "address", Function: l_client_address},
50 {Name: "state", Function: l_client_state},
51 {Name: "handler", Function: l_client_handler},
52 {Name: "connect", Function: l_client_connect},
53 {Name: "disconnect", Function: l_client_disconnect},
55 l.SetField(-2, "__index")
62 func l_client_address(l *lua.State) int {
63 client := getClient(l)
64 l.PushString(client.address)
68 func l_client_state(l *lua.State) int {
69 client := getClient(l)
74 l.PushString("connected")
76 l.PushString("disconnected")
81 func l_client_handler(l *lua.State) int {
82 client := getClient(l)
83 name := lua.CheckString(l, 2)
85 handler, exists := client.handlers[name]
89 handler = &Callbacks{}
98 client.handlers[name] = handler
99 handler.create(client)
106 func l_client_connect(l *lua.State) int {
107 client := getClient(l)
109 if client.state != csNew {
111 l.PushString("invalid state")
115 for _, handler := range client.handlers {
116 ok, err := handler.canConnect()
125 addr, err := net.ResolveUDPAddr("udp", client.address)
128 l.PushString(err.Error())
132 conn, err := net.DialUDP("udp", nil, addr)
135 l.PushString(err.Error())
139 client.state = csConnected
140 client.conn = mt.Connect(conn)
141 client.queue = make(chan *mt.Pkt, 1024)
143 for _, handler := range client.handlers {
149 pkt, err := client.conn.Recv()
153 } else if errors.Is(err, net.ErrClosed) {
164 func l_client_disconnect(l *lua.State) int {
165 client := getClient(l)
167 if client.state == csConnected {