Filter everyone/here pings if the proxy sender doesn't have permission
This commit is contained in:
		| @@ -88,6 +88,9 @@ namespace PluralKit.Bot | |||||||
|  |  | ||||||
|         public async Task HandleMessageAsync(IMessage message) |         public async Task HandleMessageAsync(IMessage message) | ||||||
|         { |         { | ||||||
|  |             // Bail early if this isn't in a guild channel | ||||||
|  |             if (!(message.Channel is IGuildChannel)) return; | ||||||
|  |              | ||||||
|             IEnumerable<ProxyDatabaseResult> results; |             IEnumerable<ProxyDatabaseResult> results; | ||||||
|             using (var conn = await _conn.Obtain()) |             using (var conn = await _conn.Obtain()) | ||||||
|             { |             { | ||||||
| @@ -109,10 +112,13 @@ namespace PluralKit.Bot | |||||||
|             if (match.InnerText.Trim().Length == 0 && message.Attachments.Count == 0) |             if (match.InnerText.Trim().Length == 0 && message.Attachments.Count == 0) | ||||||
|                 return; |                 return; | ||||||
|  |  | ||||||
|  |             // Sanitize @everyone, but only if the original user wouldn't have permission to | ||||||
|  |             var messageContents = SanitizeEveryoneMaybe(message, match.InnerText); | ||||||
|  |  | ||||||
|             // Fetch a webhook for this channel, and send the proxied message |             // Fetch a webhook for this channel, and send the proxied message | ||||||
|             var webhook = await _webhookCache.GetWebhook(message.Channel as ITextChannel); |             var webhook = await _webhookCache.GetWebhook(message.Channel as ITextChannel); | ||||||
|             var avatarUrl = match.Member.AvatarUrl ?? match.System.AvatarUrl; |             var avatarUrl = match.Member.AvatarUrl ?? match.System.AvatarUrl; | ||||||
|             var hookMessageId = await ExecuteWebhook(webhook, match.InnerText, match.ProxyName, avatarUrl, message.Attachments.FirstOrDefault()); |             var hookMessageId = await ExecuteWebhook(webhook, messageContents, match.ProxyName, avatarUrl, message.Attachments.FirstOrDefault()); | ||||||
|  |  | ||||||
|             // Store the message in the database, and log it in the log channel (if applicable) |             // Store the message in the database, and log it in the log channel (if applicable) | ||||||
|             await _messageStorage.Store(message.Author.Id, hookMessageId, message.Channel.Id, message.Id, match.Member); |             await _messageStorage.Store(message.Author.Id, hookMessageId, message.Channel.Id, message.Id, match.Member); | ||||||
| @@ -127,6 +133,13 @@ namespace PluralKit.Bot | |||||||
|             } catch (HttpException) {} // If it's already deleted, we just swallow the exception |             } catch (HttpException) {} // If it's already deleted, we just swallow the exception | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         private static string SanitizeEveryoneMaybe(IMessage message, string messageContents) | ||||||
|  |         { | ||||||
|  |             var senderPermissions = ((IGuildUser) message.Author).GetPermissions(message.Channel as IGuildChannel); | ||||||
|  |             if (!senderPermissions.MentionEveryone) return messageContents.SanitizeEveryone(); | ||||||
|  |             return messageContents; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         private async Task<bool> EnsureBotPermissions(ITextChannel channel) |         private async Task<bool> EnsureBotPermissions(ITextChannel channel) | ||||||
|         { |         { | ||||||
|             var guildUser = await channel.Guild.GetCurrentUserAsync(); |             var guildUser = await channel.Guild.GetCurrentUserAsync(); | ||||||
|   | |||||||
| @@ -83,6 +83,9 @@ namespace PluralKit.Bot | |||||||
|         public static string Sanitize(this string input) => |         public static string Sanitize(this string input) => | ||||||
|             Regex.Replace(Regex.Replace(input, "<@[!&]?(\\d{17,19})>", "<\\@$1>"), "@(everyone|here)", "@\u200B$1"); |             Regex.Replace(Regex.Replace(input, "<@[!&]?(\\d{17,19})>", "<\\@$1>"), "@(everyone|here)", "@\u200B$1"); | ||||||
|          |          | ||||||
|  |         public static string SanitizeEveryone(this string input) =>  | ||||||
|  |             Regex.Replace(input, "@(everyone|here)", "@\u200B$1"); | ||||||
|  |  | ||||||
|         public static async Task<ChannelPermissions> PermissionsIn(this IChannel channel) |         public static async Task<ChannelPermissions> PermissionsIn(this IChannel channel) | ||||||
|         { |         { | ||||||
|             switch (channel) |             switch (channel) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user