From 815190be147e575f12211c468f8121e5c60e6337 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 16 Apr 2020 19:27:35 +0300 Subject: Update stuff and move pushrules to mautrix-go --- matrix/pushrules/condition.go | 162 ------------------------------------------ 1 file changed, 162 deletions(-) delete mode 100644 matrix/pushrules/condition.go (limited to 'matrix/pushrules/condition.go') diff --git a/matrix/pushrules/condition.go b/matrix/pushrules/condition.go deleted file mode 100644 index cc62da1..0000000 --- a/matrix/pushrules/condition.go +++ /dev/null @@ -1,162 +0,0 @@ -// gomuks - A terminal Matrix client written in Go. -// Copyright (C) 2019 Tulir Asokan -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -package pushrules - -import ( - "regexp" - "strconv" - "strings" - "unicode" - - "maunium.net/go/gomuks/matrix/rooms" - "maunium.net/go/mautrix" - - "maunium.net/go/gomuks/lib/glob" -) - -// Room is an interface with the functions that are needed for processing room-specific push conditions -type Room interface { - GetMember(mxid string) *rooms.Member - GetMembers() map[string]*rooms.Member - GetSessionOwner() string -} - -// PushCondKind is the type of a push condition. -type PushCondKind string - -// The allowed push condition kinds as specified in section 11.12.1.4.3 of r0.3.0 of the Client-Server API. -const ( - KindEventMatch PushCondKind = "event_match" - KindContainsDisplayName PushCondKind = "contains_display_name" - KindRoomMemberCount PushCondKind = "room_member_count" -) - -// PushCondition wraps a condition that is required for a specific PushRule to be used. -type PushCondition struct { - // The type of the condition. - Kind PushCondKind `json:"kind"` - // The dot-separated field of the event to match. Only applicable if kind is EventMatch. - Key string `json:"key,omitempty"` - // The glob-style pattern to match the field against. Only applicable if kind is EventMatch. - Pattern string `json:"pattern,omitempty"` - // The condition that needs to be fulfilled for RoomMemberCount-type conditions. - // A decimal integer optionally prefixed by ==, <, >, >= or <=. Prefix "==" is assumed if no prefix found. - MemberCountCondition string `json:"is,omitempty"` -} - -// MemberCountFilterRegex is the regular expression to parse the MemberCountCondition of PushConditions. -var MemberCountFilterRegex = regexp.MustCompile("^(==|[<>]=?)?([0-9]+)$") - -// Match checks if this condition is fulfilled for the given event in the given room. -func (cond *PushCondition) Match(room Room, event *mautrix.Event) bool { - switch cond.Kind { - case KindEventMatch: - return cond.matchValue(room, event) - case KindContainsDisplayName: - return cond.matchDisplayName(room, event) - case KindRoomMemberCount: - return cond.matchMemberCount(room, event) - default: - return false - } -} - -func (cond *PushCondition) matchValue(room Room, event *mautrix.Event) bool { - index := strings.IndexRune(cond.Key, '.') - key := cond.Key - subkey := "" - if index > 0 { - subkey = key[index+1:] - key = key[0:index] - } - - pattern, err := glob.Compile(cond.Pattern) - if err != nil { - return false - } - - switch key { - case "type": - return pattern.MatchString(event.Type.String()) - case "sender": - return pattern.MatchString(event.Sender) - case "room_id": - return pattern.MatchString(event.RoomID) - case "state_key": - if event.StateKey == nil { - return cond.Pattern == "" - } - return pattern.MatchString(*event.StateKey) - case "content": - val, _ := event.Content.Raw[subkey].(string) - return pattern.MatchString(val) - default: - return false - } -} - -func (cond *PushCondition) matchDisplayName(room Room, event *mautrix.Event) bool { - ownerID := room.GetSessionOwner() - if ownerID == event.Sender { - return false - } - member := room.GetMember(ownerID) - if member == nil { - return false - } - - msg := event.Content.Body - isAcceptable := func(r uint8) bool { - return unicode.IsSpace(rune(r)) || unicode.IsPunct(rune(r)) - } - length := len(member.Displayname) - for index := strings.Index(msg, member.Displayname); index != -1; index = strings.Index(msg, member.Displayname) { - if (index <= 0 || isAcceptable(msg[index-1])) && (index + length >= len(msg) || isAcceptable(msg[index+length])) { - return true - } - msg = msg[index+len(member.Displayname):] - } - return false -} - -func (cond *PushCondition) matchMemberCount(room Room, event *mautrix.Event) bool { - group := MemberCountFilterRegex.FindStringSubmatch(cond.MemberCountCondition) - if len(group) != 3 { - return false - } - - operator := group[1] - wantedMemberCount, _ := strconv.Atoi(group[2]) - - memberCount := len(room.GetMembers()) - - switch operator { - case "==", "": - return memberCount == wantedMemberCount - case ">": - return memberCount > wantedMemberCount - case ">=": - return memberCount >= wantedMemberCount - case "<": - return memberCount < wantedMemberCount - case "<=": - return memberCount <= wantedMemberCount - default: - // Should be impossible due to regex. - return false - } -} -- cgit v1.2.3