aboutsummaryrefslogtreecommitdiff
path: root/pkts.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkts.go')
-rw-r--r--pkts.go99
1 files changed, 99 insertions, 0 deletions
diff --git a/pkts.go b/pkts.go
new file mode 100644
index 0000000..e34f3b8
--- /dev/null
+++ b/pkts.go
@@ -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
+}