diff --git a/core/action/action.go b/core/action/action.go index 206ecb8..0f5c6dc 100644 --- a/core/action/action.go +++ b/core/action/action.go @@ -4,6 +4,7 @@ import ( lib "git.sr.ht/~cco/go-scopes" "git.sr.ht/~cco/go-scopes/core/message" "git.sr.ht/~cco/go-scopes/logging" + "golang.org/x/exp/slices" ) type BaseSpec = baseSpec @@ -22,15 +23,20 @@ func (spec *baseSpec) Receivers() []lib.Addressable { } func (spec *baseSpec) AddReceiver(rcv lib.Addressable) lib.ActionSpec { - for _, r := range spec.receivers { - if r == rcv { - return spec - } + if slices.Index(spec.receivers, rcv) == -1 { + spec.receivers = append(spec.receivers, rcv) } - spec.receivers = append(spec.receivers, rcv) return spec } +func (spec *baseSpec) RemoveReceiver(rcv lib.Addressable) { + rcvs := spec.receivers + idx := slices.Index(rcvs, rcv) + if idx != -1 { + spec.receivers = slices.Delete(rcvs, idx, idx+1) + } +} + func Base(hdlr lib.ActionHandler, rcvs ...string) *baseSpec { spec := baseSpec{handler: hdlr} for _, rcv := range rcvs { diff --git a/go.mod b/go.mod index 7090910..4de9aae 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,8 @@ go 1.20 require ( github.com/gin-gonic/gin v1.9.1 github.com/rs/zerolog v1.29.1 + golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 + golang.org/x/net v0.10.0 ) require ( @@ -28,7 +30,6 @@ require ( github.com/ugorji/go/codec v1.2.11 // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/crypto v0.9.0 // indirect - golang.org/x/net v0.10.0 // indirect golang.org/x/sys v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect google.golang.org/protobuf v1.30.0 // indirect diff --git a/go.sum b/go.sum index af61ded..4ac73cb 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,8 @@ github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -73,6 +73,8 @@ golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 h1:Di6/M8l0O2lCLc6VVRWhgCiApHV8MnQurBnFSHsQtNY= +golang.org/x/exp v0.0.0-20230725093048-515e97ebf090/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -83,7 +85,6 @@ golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= diff --git a/matrix/matrix.go b/matrix/matrix.go index 817f666..17ae15c 100644 --- a/matrix/matrix.go +++ b/matrix/matrix.go @@ -48,7 +48,7 @@ func disconnect(src, tgt lib.Context) { //, pattern string) { for _, act := range cfg.Actions() { //if act.Pattern().String() == pattern { for _, spec := range act.Specs() { - //spec.RemoveReceiver(tgt) + spec.RemoveReceiver(tgt) } //} } diff --git a/scopes.go b/scopes.go index 315fb66..62113e2 100644 --- a/scopes.go +++ b/scopes.go @@ -84,6 +84,7 @@ type ActionSpec interface { Handler() ActionHandler Receivers() []Addressable AddReceiver(Addressable) ActionSpec + RemoveReceiver(Addressable) } // procedures and handlers