diff --git a/go.mod b/go.mod index 485d8b3..2d586cb 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.30.0 gopkg.in/yaml.v3 v3.0.1 maunium.net/go/mauflag v1.0.0 - maunium.net/go/mautrix v0.21.2-0.20241017173032-367828429297 + maunium.net/go/mautrix v0.21.2-0.20241018110725-6c07832ed7b5 mvdan.cc/xurls/v2 v2.5.0 ) diff --git a/go.sum b/go.sum index b2b3704..273eee8 100644 --- a/go.sum +++ b/go.sum @@ -73,7 +73,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.21.2-0.20241017173032-367828429297 h1:8CybV+x9HPh4p41nIqJMKHI0bUF0g0bEozq49ytNVlc= -maunium.net/go/mautrix v0.21.2-0.20241017173032-367828429297/go.mod h1:sjCZR1R/3NET/WjkcXPL6WpAHlWKku9HjRsdOkbM8Qw= +maunium.net/go/mautrix v0.21.2-0.20241018110725-6c07832ed7b5 h1:tbBKkNxpRabCFcekRMDTaV+z+ZZUAG5zNpOMI4zk/sQ= +maunium.net/go/mautrix v0.21.2-0.20241018110725-6c07832ed7b5/go.mod h1:sjCZR1R/3NET/WjkcXPL6WpAHlWKku9HjRsdOkbM8Qw= mvdan.cc/xurls/v2 v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8= mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE= diff --git a/pkg/hicli/pushrules.go b/pkg/hicli/pushrules.go index ddf7a79..a395264 100644 --- a/pkg/hicli/pushrules.go +++ b/pkg/hicli/pushrules.go @@ -8,6 +8,7 @@ package hicli import ( "context" + "encoding/json" "github.com/rs/zerolog" "maunium.net/go/mautrix" @@ -23,6 +24,7 @@ type pushRoom struct { roomID id.RoomID h *HiClient ll *mautrix.LazyLoadSummary + pl *event.PowerLevelsEventContent } func (p *pushRoom) GetOwnDisplayname() string { @@ -58,7 +60,31 @@ func (p *pushRoom) GetEvent(id id.EventID) *event.Event { return evt.AsRawMautrix() } -var _ pushrules.EventfulRoom = (*pushRoom)(nil) +func (p *pushRoom) GetPowerLevels() *event.PowerLevelsEventContent { + if p.pl != nil { + return p.pl + } + evt, err := p.h.DB.CurrentState.Get(p.ctx, p.roomID, event.StatePowerLevels, "") + if err != nil { + zerolog.Ctx(p.ctx).Err(err). + Stringer("room_id", p.roomID). + Msg("Failed to get power levels in push rule evaluator") + return nil + } + err = json.Unmarshal(evt.Content, &p.pl) + if err != nil { + zerolog.Ctx(p.ctx).Err(err). + Stringer("room_id", p.roomID). + Msg("Failed to unmarshal power levels in push rule evaluator") + return nil + } + return p.pl +} + +var ( + _ pushrules.EventfulRoom = (*pushRoom)(nil) + _ pushrules.PowerLevelfulRoom = (*pushRoom)(nil) +) func (h *HiClient) evaluatePushRules(ctx context.Context, llSummary *mautrix.LazyLoadSummary, baseType database.UnreadType, evt *event.Event) database.UnreadType { should := h.PushRules.Load().GetMatchingRule(&pushRoom{