4 "github.com/Shopify/go-lua"
5 "github.com/anon55555/mt"
8 type Callbacks struct {
10 subscribed map[string]struct{}
13 func getCallbacks(l *lua.State) *Callbacks {
14 return lua.CheckUserData(l, 1, "hydra.callbacks").(*Callbacks)
17 func (handler *Callbacks) create(client *Client) {
18 handler.subscribed = map[string]struct{}{}
21 func (handler *Callbacks) push(l *lua.State) {
22 l.PushUserData(handler)
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},
30 l.SetField(-2, "__index")
35 func (handler *Callbacks) canConnect() (bool, string) {
39 func (handler *Callbacks) connect() {
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 {
53 l.PushValue(2) // callback
54 l.RawGetInt(1, idx) // arg 1: client
55 pktToLua(l, pkt) // arg 2: pkt
59 func l_callbacks_wildcard(l *lua.State) int {
60 handler := getCallbacks(l)
61 handler.wildcard = l.ToBoolean(2)
65 func l_callbacks_subscribe(l *lua.State) int {
66 handler := getCallbacks(l)
69 for i := 2; i <= n; i++ {
70 handler.subscribed[lua.CheckString(l, i)] = struct{}{}
76 func l_callbacks_unsubscribe(l *lua.State) int {
77 handler := getCallbacks(l)
80 for i := 2; i <= n; i++ {
81 delete(handler.subscribed, lua.CheckString(l, i))