]> git.lizzy.rs Git - hydra-dragonfire.git/blob - comp_pkts.go
Merge pull request #4 from Minetest-j45/master
[hydra-dragonfire.git] / comp_pkts.go
1 package main
2
3 import (
4         "github.com/dragonfireclient/hydra-dragonfire/convert"
5         "github.com/dragonfireclient/mt"
6         "github.com/yuin/gopher-lua"
7         "sync"
8 )
9
10 type CompPkts struct {
11         client     *Client
12         mu         sync.Mutex
13         wildcard   bool
14         subscribed map[string]struct{}
15         userdata   *lua.LUserData
16 }
17
18 var compPktsFuncs = map[string]lua.LGFunction{
19         "subscribe":   l_comp_pkts_subscribe,
20         "unsubscribe": l_comp_pkts_unsubscribe,
21         "wildcard":    l_comp_pkts_wildcard,
22 }
23
24 type EventPkt struct {
25         pktType string
26         pktData *mt.Pkt
27 }
28
29 func (evt EventPkt) handle(l *lua.LState, val lua.LValue) {
30         l.SetField(val, "type", lua.LString("pkt"))
31         l.SetField(val, "pkt_type", lua.LString(evt.pktType))
32         l.SetField(val, "pkt_data", convert.PushPkt(l, evt.pktData))
33 }
34
35 func getCompPkts(l *lua.LState) *CompPkts {
36         return l.CheckUserData(1).Value.(*CompPkts)
37 }
38
39 func (comp *CompPkts) create(client *Client, l *lua.LState) {
40         comp.client = client
41         comp.wildcard = false
42         comp.subscribed = map[string]struct{}{}
43         comp.userdata = l.NewUserData()
44         comp.userdata.Value = comp
45         l.SetMetatable(comp.userdata, l.GetTypeMetatable("hydra.comp.pkts"))
46 }
47
48 func (comp *CompPkts) push() lua.LValue {
49         return comp.userdata
50 }
51
52 func (comp *CompPkts) connect() {
53 }
54
55 func (comp *CompPkts) process(pkt *mt.Pkt) {
56         pktType := string(convert.PushPktType(pkt))
57
58         comp.mu.Lock()
59         _, subscribed := comp.subscribed[pktType]
60         comp.mu.Unlock()
61
62         if subscribed || comp.wildcard {
63                 comp.client.queue <- EventPkt{pktType: pktType, pktData: pkt}
64         }
65 }
66
67 func l_comp_pkts_subscribe(l *lua.LState) int {
68         comp := getCompPkts(l)
69         n := l.GetTop()
70
71         comp.mu.Lock()
72         defer comp.mu.Unlock()
73
74         for i := 2; i <= n; i++ {
75                 comp.subscribed[l.CheckString(i)] = struct{}{}
76         }
77
78         return 0
79 }
80
81 func l_comp_pkts_unsubscribe(l *lua.LState) int {
82         comp := getCompPkts(l)
83         n := l.GetTop()
84
85         comp.mu.Lock()
86         defer comp.mu.Unlock()
87
88         for i := 2; i <= n; i++ {
89                 delete(comp.subscribed, l.CheckString(i))
90         }
91
92         return 0
93 }
94
95 func l_comp_pkts_wildcard(l *lua.LState) int {
96         comp := getCompPkts(l)
97         comp.wildcard = l.ToBool(2)
98         return 0
99 }