]> git.lizzy.rs Git - hydra-dragonfire.git/blob - callbacks.go
Create LICENSE
[hydra-dragonfire.git] / callbacks.go
1 package main
2
3 import (
4         "github.com/Shopify/go-lua"
5         "github.com/anon55555/mt"
6 )
7
8 type Callbacks struct {
9         wildcard   bool
10         subscribed map[string]struct{}
11 }
12
13 func getCallbacks(l *lua.State) *Callbacks {
14         return lua.CheckUserData(l, 1, "hydra.callbacks").(*Callbacks)
15 }
16
17 func (handler *Callbacks) create(client *Client) {
18         handler.subscribed = map[string]struct{}{}
19 }
20
21 func (handler *Callbacks) push(l *lua.State) {
22         l.PushUserData(handler)
23
24         if lua.NewMetaTable(l, "hydra.callbacks") {
25                 lua.NewLibrary(l, []lua.RegistryFunction{
26                         {Name: "wildcard", Function: l_callbacks_wildcard},
27                         {Name: "subscribe", Function: l_callbacks_subscribe},
28                         {Name: "unsubscribe", Function: l_callbacks_unsubscribe},
29                 })
30                 l.SetField(-2, "__index")
31         }
32         l.SetMetaTable(-2)
33 }
34
35 func (handler *Callbacks) canConnect() (bool, string) {
36         return true, ""
37 }
38
39 func (handler *Callbacks) connect() {
40 }
41
42 func (handler *Callbacks) handle(pkt *mt.Pkt, l *lua.State, idx int) {
43         if !handler.wildcard && pkt != nil {
44                 if _, exists := handler.subscribed[pktToString(pkt)]; !exists {
45                         return
46                 }
47         }
48
49         if !l.IsFunction(2) {
50                 return
51         }
52
53         l.PushValue(2)      // callback
54         l.RawGetInt(1, idx) // arg 1: client
55         pktToLua(l, pkt)    // arg 2: pkt
56         l.Call(2, 0)
57 }
58
59 func l_callbacks_wildcard(l *lua.State) int {
60         handler := getCallbacks(l)
61         handler.wildcard = l.ToBoolean(2)
62         return 0
63 }
64
65 func l_callbacks_subscribe(l *lua.State) int {
66         handler := getCallbacks(l)
67
68         n := l.Top()
69         for i := 2; i <= n; i++ {
70                 handler.subscribed[lua.CheckString(l, i)] = struct{}{}
71         }
72
73         return 0
74 }
75
76 func l_callbacks_unsubscribe(l *lua.State) int {
77         handler := getCallbacks(l)
78
79         n := l.Top()
80         for i := 2; i <= n; i++ {
81                 delete(handler.subscribed, lua.CheckString(l, i))
82         }
83
84         return 0
85 }