From aae2667fed6beed9d60fd63066dadc771b7cd268 Mon Sep 17 00:00:00 2001 From: RogueException Date: Sat, 1 Apr 2017 21:47:04 -0300 Subject: [PATCH] Keep tags sorted when adding everyone/here mentions --- .../Entities/Messages/MessageHelper.cs | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index d872901fa..367a33be6 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -126,8 +126,9 @@ namespace Discord.Rest index = text.IndexOf("@everyone", index); if (index == -1) break; - if (!TagOverlaps(tags, index)) - tags.Add(new Tag(TagType.EveryoneMention, index, "@everyone".Length, 0, null)); + var tagIndex = FindIndex(tags, index); + if (tagIndex.HasValue) + tags.Insert(tagIndex.Value, new Tag(TagType.EveryoneMention, index, "@everyone".Length, 0, null)); index++; } @@ -137,22 +138,26 @@ namespace Discord.Rest index = text.IndexOf("@here", index); if (index == -1) break; - if (!TagOverlaps(tags, index)) - tags.Add(new Tag(TagType.HereMention, index, "@here".Length, 0, null)); + var tagIndex = FindIndex(tags, index); + if (tagIndex.HasValue) + tags.Insert(tagIndex.Value, new Tag(TagType.HereMention, index, "@here".Length, 0, null)); index++; } return tags.ToImmutable(); } - private static bool TagOverlaps(IReadOnlyList tags, int index) + private static int? FindIndex(IReadOnlyList tags, int index) { - for (int i = 0; i < tags.Count; i++) + int i = 0; + for (; i < tags.Count; i++) { var tag = tags[i]; - if (index >= tag.Index && index < tag.Index + tag.Length) - return true; + if (index < tag.Index) + break; //Position before this tag } - return false; + if (i > 0 && index < tags[i - 1].Index + tags[i - 1].Length) + return null; //Overlaps tag before this + return i; } public static ImmutableArray FilterTagsByKey(TagType type, ImmutableArray tags) {