protected override async Task UpdateInternal(DiscordLink plugin, DLEventType trigger, object data) { if (!(data is DiscordMessage message)) { return; } ChatChannelLink channelLink = plugin.GetLinkForEcoChannel(message.Channel.Name) ?? plugin.GetLinkForEcoChannel(message.Channel.Id.ToString()); string channel = channelLink?.EcoChannel; if (string.IsNullOrWhiteSpace(channel)) { return; } if (channelLink.Direction == ChatSyncDirection.DiscordToEco || channelLink.Direction == ChatSyncDirection.Duplex) { await ForwardMessageToEcoChannel(plugin, message, channel); } }
private static string FormatDiscordMentions(string message, DiscordChannel channel) { return(DiscordMentionRegex.Replace(message, capture => { string match = capture.ToString().Substring(1).ToLower(); // Strip the mention character from the match string FormatMention(string name, string mention) { if (match == name) { return mention; } string beforeMatch = ""; int matchStartIndex = match.IndexOf(name); if (matchStartIndex > 0) // There are characters before @username { beforeMatch = match.Substring(0, matchStartIndex); } string afterMatch = ""; int matchStopIndex = matchStartIndex + name.Length - 1; int numCharactersAfter = match.Length - 1 - matchStopIndex; if (numCharactersAfter > 0) // There are characters after @username { afterMatch = match.Substring(matchStopIndex + 1, numCharactersAfter); } return beforeMatch + mention + afterMatch; // Add whatever characters came before or after the username when replacing the match in order to avoid changing the message context } ChatChannelLink link = DLConfig.Instance.GetChannelLinkFromDiscordChannel(channel.Guild.Name, channel.Name); bool allowRoleMentions = (link == null || link.AllowRoleMentions); bool allowMemberMentions = (link == null || link.AllowUserMentions); bool allowChannelMentions = (link == null || link.AllowChannelMentions); if (capture.ToString()[0] == '@') { if (allowRoleMentions) { foreach (var role in channel.Guild.Roles.Values) // Checking roles first in case a user has a name identiacal to that of a role { if (!role.IsMentionable) { continue; } string name = role.Name.ToLower(); if (match.Contains(name)) { return FormatMention(name, role.Mention); } } } if (allowMemberMentions) { foreach (var member in channel.Guild.Members.Values) { string name = member.DisplayName.ToLower(); if (match.Contains(name)) { return FormatMention(name, member.Mention); } } } } else if (capture.ToString()[0] == '#' && allowChannelMentions) { foreach (var listChannel in channel.Guild.Channels.Values) { string name = listChannel.Name.ToLower(); if (match.Contains(name)) { return FormatMention(name, listChannel.Mention); } } } return capture.ToString(); // No match found, just return the original string })); }