diff options
Diffstat (limited to 'pkts.go')
-rw-r--r-- | pkts.go | 99 |
1 files changed, 99 insertions, 0 deletions
@@ -0,0 +1,99 @@ +package main + +import ( + "github.com/anon55555/mt" + "github.com/dragonfireclient/hydra-dragonfire/convert" + "github.com/yuin/gopher-lua" + "sync" +) + +type Pkts struct { + client *Client + mu sync.Mutex + wildcard bool + subscribed map[string]struct{} + userdata *lua.LUserData +} + +var pktsFuncs = map[string]lua.LGFunction{ + "subscribe": l_pkts_subscribe, + "unsubscribe": l_pkts_unsubscribe, + "wildcard": l_pkts_wildcard, +} + +type EventPkt struct { + pktType string + pktData *mt.Pkt +} + +func (evt EventPkt) handle(l *lua.LState, val lua.LValue) { + l.SetField(val, "type", lua.LString("pkt")) + l.SetField(val, "pkt_type", lua.LString(evt.pktType)) + l.SetField(val, "pkt_data", convert.PushPkt(l, evt.pktData)) +} + +func getPkts(l *lua.LState) *Pkts { + return l.CheckUserData(1).Value.(*Pkts) +} + +func (pkts *Pkts) create(client *Client, l *lua.LState) { + pkts.client = client + pkts.wildcard = false + pkts.subscribed = map[string]struct{}{} + pkts.userdata = l.NewUserData() + pkts.userdata.Value = pkts + l.SetMetatable(pkts.userdata, l.GetTypeMetatable("hydra.pkts")) +} + +func (pkts *Pkts) push() lua.LValue { + return pkts.userdata +} + +func (pkts *Pkts) connect() { +} + +func (pkts *Pkts) process(pkt *mt.Pkt) { + pktType := string(convert.PushPktType(pkt)) + + pkts.mu.Lock() + _, subscribed := pkts.subscribed[pktType] + pkts.mu.Unlock() + + if subscribed || pkts.wildcard { + pkts.client.queue <- EventPkt{pktType: pktType, pktData: pkt} + } +} + +func l_pkts_subscribe(l *lua.LState) int { + pkts := getPkts(l) + n := l.GetTop() + + pkts.mu.Lock() + defer pkts.mu.Unlock() + + for i := 2; i <= n; i++ { + pkts.subscribed[l.CheckString(i)] = struct{}{} + } + + return 0 +} + +func l_pkts_unsubscribe(l *lua.LState) int { + pkts := getPkts(l) + n := l.GetTop() + + pkts.mu.Lock() + defer pkts.mu.Unlock() + + for i := 2; i <= n; i++ { + delete(pkts.subscribed, l.CheckString(i)) + } + + return 0 +} + +func l_pkts_wildcard(l *lua.LState) int { + pkts := getPkts(l) + pkts.wildcard = l.ToBool(2) + return 0 +} |