4 "github.com/anon55555/mt"
5 "github.com/dragonfireclient/hydra-dragonfire/convert"
6 "github.com/yuin/gopher-lua"
14 subscribed map[string]struct{}
15 userdata *lua.LUserData
18 var pktsFuncs = map[string]lua.LGFunction{
19 "subscribe": l_pkts_subscribe,
20 "unsubscribe": l_pkts_unsubscribe,
21 "wildcard": l_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 getPkts(l *lua.LState) *Pkts {
36 return l.CheckUserData(1).Value.(*Pkts)
39 func (pkts *Pkts) create(client *Client, l *lua.LState) {
42 pkts.subscribed = map[string]struct{}{}
43 pkts.userdata = l.NewUserData()
44 pkts.userdata.Value = pkts
45 l.SetMetatable(pkts.userdata, l.GetTypeMetatable("hydra.pkts"))
48 func (pkts *Pkts) push() lua.LValue {
52 func (pkts *Pkts) connect() {
55 func (pkts *Pkts) process(pkt *mt.Pkt) {
56 pktType := string(convert.PushPktType(pkt))
59 _, subscribed := pkts.subscribed[pktType]
62 if subscribed || pkts.wildcard {
63 pkts.client.queue <- EventPkt{pktType: pktType, pktData: pkt}
67 func l_pkts_subscribe(l *lua.LState) int {
72 defer pkts.mu.Unlock()
74 for i := 2; i <= n; i++ {
75 pkts.subscribed[l.CheckString(i)] = struct{}{}
81 func l_pkts_unsubscribe(l *lua.LState) int {
86 defer pkts.mu.Unlock()
88 for i := 2; i <= n; i++ {
89 delete(pkts.subscribed, l.CheckString(i))
95 func l_pkts_wildcard(l *lua.LState) int {
97 pkts.wildcard = l.ToBool(2)