M main.go => main.go +7 -0
@@ 158,9 158,16 @@ func getMsgResponse(client *mautrix.Client, evt *event.Event) *event.MessageEven
 func getMSCs(body string) (mscs []uint) {
 	bodyNoReplies := event.TrimReplyFallbackText(body)
 	matches := MSC_REGEX.FindAllStringSubmatch(bodyNoReplies, -1)
+	mscSet := make(map[int]struct{})
 	for _, match := range matches {
 		// error can never happen because of %d in regex
 		msc, _ := strconv.Atoi(match[1])
+		_, exists := mscSet[msc]
+		if exists {
+			// don't add the same MSC twice
+			continue
+		}
+		mscSet[msc] = struct{}{}
 		mscs = append(mscs, uint(msc))
 	}
 	return mscs
 
M msc_test.go => msc_test.go +9 -0
@@ 23,3 23,12 @@ func TestCapitalization(t *testing.T) {
 		t.Fail()
 	}
 }
+
+func TestNoRepeats(t *testing.T) {
+	mscs := getMSCs("That msc seems to be the last prerequisite for MSC2677: https://github.com/uhoreg/matrix-doc/blob/aggregations-reactions/proposals/2677-reactions.md#msc2677-annotations-and-reactions")
+	if len(mscs) != 1 {
+		t.Fail()
+	} else if mscs[0] != 2677 {
+		t.Fail()
+	}
+}