4 "github.com/dragonfireclient/hydra-dragonfire/convert"
5 "github.com/dragonfireclient/mt"
6 "github.com/yuin/gopher-lua"
10 type CompPkts struct {
14 subscribed map[string]struct{}
15 userdata *lua.LUserData
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,
24 type EventPkt struct {
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))
35 func getCompPkts(l *lua.LState) *CompPkts {
36 return l.CheckUserData(1).Value.(*CompPkts)
39 func (comp *CompPkts) create(client *Client, l *lua.LState) {
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"))
48 func (comp *CompPkts) push() lua.LValue {
52 func (comp *CompPkts) connect() {
55 func (comp *CompPkts) process(pkt *mt.Pkt) {
56 pktType := string(convert.PushPktType(pkt))
59 _, subscribed := comp.subscribed[pktType]
62 if subscribed || comp.wildcard {
63 comp.client.queue <- EventPkt{pktType: pktType, pktData: pkt}
67 func l_comp_pkts_subscribe(l *lua.LState) int {
68 comp := getCompPkts(l)
72 defer comp.mu.Unlock()
74 for i := 2; i <= n; i++ {
75 comp.subscribed[l.CheckString(i)] = struct{}{}
81 func l_comp_pkts_unsubscribe(l *lua.LState) int {
82 comp := getCompPkts(l)
86 defer comp.mu.Unlock()
88 for i := 2; i <= n; i++ {
89 delete(comp.subscribed, l.CheckString(i))
95 func l_comp_pkts_wildcard(l *lua.LState) int {
96 comp := getCompPkts(l)
97 comp.wildcard = l.ToBool(2)