diff --git a/PicSizeCheckBot/HelpHandler.cs b/PicSizeCheckBot/HelpHandler.cs index 9442a33..2d919f3 100644 --- a/PicSizeCheckBot/HelpHandler.cs +++ b/PicSizeCheckBot/HelpHandler.cs @@ -22,7 +22,7 @@ I can also store your notes and ID queues. Questions, suggestions or bugs reports: https://github.com/TehGM/WolfBot-Size/issues Sponsor my work: https://github.com/sponsors/TehGM -Using Wolfringo library v2.1.3 +Using Wolfringo library v2.1.4 Bot version: v{GetVersion()} Copyright © 2020 TehGM", // due to AGPL licensing, this line cannot be changed or removed, unless by the original author cancellationToken); diff --git a/PicSizeCheckBot/Mentions/Filters/GroupBlacklistMentionFilter.cs b/PicSizeCheckBot/Mentions/Filters/GroupBlacklistMentionFilter.cs index 44b27ea..4911097 100644 --- a/PicSizeCheckBot/Mentions/Filters/GroupBlacklistMentionFilter.cs +++ b/PicSizeCheckBot/Mentions/Filters/GroupBlacklistMentionFilter.cs @@ -19,7 +19,7 @@ public GroupBlacklistMentionFilter(IEnumerable groupIDs) this.GroupIDs = groupIDs as HashSet ?? groupIDs?.ToHashSet(); } - public ValueTask PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) + public ValueTask PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) { if (this.GroupIDs == null) return ValueTask.FromResult(true); diff --git a/PicSizeCheckBot/Mentions/Filters/GroupWhitelistMentionFilter.cs b/PicSizeCheckBot/Mentions/Filters/GroupWhitelistMentionFilter.cs index 85b46f0..f0c82b8 100644 --- a/PicSizeCheckBot/Mentions/Filters/GroupWhitelistMentionFilter.cs +++ b/PicSizeCheckBot/Mentions/Filters/GroupWhitelistMentionFilter.cs @@ -19,7 +19,7 @@ public GroupWhitelistMentionFilter(IEnumerable groupIDs) this.GroupIDs = groupIDs as HashSet ?? groupIDs?.ToHashSet(); } - public ValueTask PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) + public ValueTask PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) { if (this.GroupIDs == null) return ValueTask.FromResult(false); diff --git a/PicSizeCheckBot/Mentions/Filters/IMentionFilter.cs b/PicSizeCheckBot/Mentions/Filters/IMentionFilter.cs index d519c2f..fe162aa 100644 --- a/PicSizeCheckBot/Mentions/Filters/IMentionFilter.cs +++ b/PicSizeCheckBot/Mentions/Filters/IMentionFilter.cs @@ -7,6 +7,6 @@ namespace TehGM.WolfBots.PicSizeCheckBot.Mentions.Filters { public interface IMentionFilter { - ValueTask PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default); + ValueTask PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default); } } diff --git a/PicSizeCheckBot/Mentions/Filters/IgnoreBotsMentionFilter.cs b/PicSizeCheckBot/Mentions/Filters/IgnoreBotsMentionFilter.cs index e84824c..1772db5 100644 --- a/PicSizeCheckBot/Mentions/Filters/IgnoreBotsMentionFilter.cs +++ b/PicSizeCheckBot/Mentions/Filters/IgnoreBotsMentionFilter.cs @@ -9,7 +9,7 @@ namespace TehGM.WolfBots.PicSizeCheckBot.Mentions.Filters [BsonDiscriminator("Mentions.Filters.IgnoreBots", Required = true)] public class IgnoreBotsMentionFilter : IMentionFilter { - public async ValueTask PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) + public async ValueTask PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) { if (message.SenderID == null) return true; diff --git a/PicSizeCheckBot/Mentions/Filters/RequireGroupPresenceMentionFilter.cs b/PicSizeCheckBot/Mentions/Filters/RequireGroupPresenceMentionFilter.cs new file mode 100644 index 0000000..18a13d4 --- /dev/null +++ b/PicSizeCheckBot/Mentions/Filters/RequireGroupPresenceMentionFilter.cs @@ -0,0 +1,37 @@ +using MongoDB.Bson.Serialization.Attributes; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using TehGM.Wolfringo.Messages; +using TehGM.Wolfringo; + +namespace TehGM.WolfBots.PicSizeCheckBot.Mentions.Filters +{ + [BsonDiscriminator("Mentions.Filters.RequireGroupPresence", Required = true)] + public class RequireGroupPresenceMentionFilter : IMentionFilter + { + public HashSet ExceptGroupIDs { get; } + + [BsonConstructor(nameof(this.ExceptGroupIDs))] + public RequireGroupPresenceMentionFilter(IEnumerable exceptGroupIDs) + { + this.ExceptGroupIDs = exceptGroupIDs as HashSet ?? exceptGroupIDs?.ToHashSet(); + } + + public async ValueTask PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) + { + if (this.ExceptGroupIDs?.Contains(message.RecipientID) == true) + return true; + + WolfGroup group = await client.GetGroupAsync(message.RecipientID, cancellationToken).ConfigureAwait(false); + if (group == null) + return false; + + if (!group.Members.TryGetValue(userID, out WolfGroupMember member)) + return false; + + return member.Capabilities != WolfGroupCapabilities.Banned && member.Capabilities != WolfGroupCapabilities.NotMember; + } + } +} diff --git a/PicSizeCheckBot/Mentions/Filters/UserBlacklistMentionFilter.cs b/PicSizeCheckBot/Mentions/Filters/UserBlacklistMentionFilter.cs index 60c3cf4..c0ae73c 100644 --- a/PicSizeCheckBot/Mentions/Filters/UserBlacklistMentionFilter.cs +++ b/PicSizeCheckBot/Mentions/Filters/UserBlacklistMentionFilter.cs @@ -19,7 +19,7 @@ public UserBlacklistMentionFilter(IEnumerable userIDs) this.UserIDs = userIDs as HashSet ?? userIDs?.ToHashSet(); } - public ValueTask PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) + public ValueTask PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) { if (this.UserIDs == null) return ValueTask.FromResult(true); diff --git a/PicSizeCheckBot/Mentions/Filters/UserWhitelistMentionFilter.cs b/PicSizeCheckBot/Mentions/Filters/UserWhitelistMentionFilter.cs index b426308..b0effa9 100644 --- a/PicSizeCheckBot/Mentions/Filters/UserWhitelistMentionFilter.cs +++ b/PicSizeCheckBot/Mentions/Filters/UserWhitelistMentionFilter.cs @@ -19,7 +19,7 @@ public UserWhitelistMentionFilter(IEnumerable userIDs) this.UserIDs = userIDs as HashSet ?? userIDs?.ToHashSet(); } - public ValueTask PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) + public ValueTask PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default) { if (this.UserIDs == null) return ValueTask.FromResult(false); diff --git a/PicSizeCheckBot/Mentions/MentionsHandler.cs b/PicSizeCheckBot/Mentions/MentionsHandler.cs index 2c95c3c..5e5be38 100644 --- a/PicSizeCheckBot/Mentions/MentionsHandler.cs +++ b/PicSizeCheckBot/Mentions/MentionsHandler.cs @@ -44,72 +44,67 @@ public MentionsHandler(IWolfClient client, IMentionConfigStore mentionConfigStor private async void OnChatMessage(ChatMessage message) { - using IDisposable logScope = message.BeginLogScope(_log); - // run only in prod, test group or owner PM - if (!_environment.IsProduction() && - !((message.IsGroupMessage && message.RecipientID == _botOptions.CurrentValue.TestGroupID) || - (message.IsPrivateMessage && message.SenderID == _botOptions.CurrentValue.OwnerID))) + if (!this._environment.IsProduction() && + !((message.IsGroupMessage && message.RecipientID == this._botOptions.CurrentValue.TestGroupID) || + (message.IsPrivateMessage && message.SenderID == this._botOptions.CurrentValue.OwnerID))) + return; + + if (!message.IsText || !message.IsGroupMessage) return; if (this._client.CurrentUserID != null && message.SenderID.Value == this._client.CurrentUserID.Value) return; - try - { - // only work in group text messages - if (!message.IsText || !message.IsGroupMessage) - return; + using IDisposable logScope = message.BeginLogScope(this._log); + uint senderID = message.SenderID.Value; + uint groupID = message.RecipientID; - // quit early if group or user is ignored - if (_mentionsOptions.CurrentValue.IgnoredGroups?.Contains(message.RecipientID) == true) - return; - if (_mentionsOptions.CurrentValue.IgnoredUsers?.Contains(message.SenderID.Value) == true) - return; + // quit early if group or user is ignored + if (this._mentionsOptions.CurrentValue.IgnoredGroups?.Contains(message.RecipientID) == true) + return; + if (this._mentionsOptions.CurrentValue.IgnoredUsers?.Contains(message.SenderID.Value) == true) + return; + try + { CancellationToken cancellationToken = _cts?.Token ?? default; IEnumerable allMentions = await _mentionConfigStore.GetAllAsync(cancellationToken).ConfigureAwait(false); - if (allMentions?.Any() == true) + foreach (MentionConfig mentionConfig in allMentions ?? Enumerable.Empty()) { - uint senderID = message.SenderID.Value; - uint groupID = message.RecipientID; + if (mentionConfig.ID == senderID) + continue; - foreach (MentionConfig mentionConfig in allMentions) + if (await this.AnyFilterBlocksAsync(mentionConfig.ID, message, mentionConfig.GlobalFilters, cancellationToken).ConfigureAwait(false)) + continue; + + foreach (MentionPattern pattern in mentionConfig.Patterns ?? Enumerable.Empty()) { - if (mentionConfig.ID == senderID) + if (await this.AnyFilterBlocksAsync(mentionConfig.ID, message, pattern.Filters, cancellationToken).ConfigureAwait(false)) continue; - if (await this.AnyFilterBlocksAsync(message, mentionConfig.GlobalFilters, cancellationToken).ConfigureAwait(false)) + if (!pattern.IsMatch(message.Text)) continue; - foreach (MentionPattern pattern in mentionConfig.Patterns ?? Enumerable.Empty()) - { - if (await this.AnyFilterBlocksAsync(message, pattern.Filters, cancellationToken).ConfigureAwait(false)) - continue; - - if (!pattern.IsMatch(message.Text)) - continue; - - string text = await this.BuildMentionMessage(message, mentionConfig, cancellationToken).ConfigureAwait(false); - await this._client.SendPrivateTextMessageAsync(mentionConfig.ID, text, cancellationToken).ConfigureAwait(false); - break; - } + string text = await this.BuildMentionMessage(message, mentionConfig, cancellationToken).ConfigureAwait(false); + await this._client.SendPrivateTextMessageAsync(mentionConfig.ID, text, cancellationToken).ConfigureAwait(false); + break; } } } catch (TaskCanceledException) { } catch (MessageSendingException ex) when (ex.SentMessage is ChatMessage && ex.Response is WolfResponse response && response.ErrorCode == WolfErrorCode.LoginIncorrectOrCannotSendMessage) { } - catch (Exception ex) when (ex.LogAsError(_log, "Error occured when processing message")) { } + catch (Exception ex) when (ex.LogAsError(this._log, "Error occured when processing message")) { } } - private async ValueTask AnyFilterBlocksAsync(ChatMessage message, IEnumerable filters, CancellationToken cancellationToken) + private async ValueTask AnyFilterBlocksAsync(uint userID, ChatMessage message, IEnumerable filters, CancellationToken cancellationToken) { if (filters == null) return false; foreach (IMentionFilter filter in filters) { - bool pass = await filter.PassesAsync(message, this._client, cancellationToken).ConfigureAwait(false); + bool pass = await filter.PassesAsync(userID, message, this._client, cancellationToken).ConfigureAwait(false); if (!pass) return true; } @@ -142,7 +137,7 @@ private async Task BuildMentionMessage(ChatMessage message, MentionConfi // Implementing IHostedService ensures this class is created on start Task IHostedService.StartAsync(CancellationToken cancellationToken) { - _cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + this._cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); return Task.CompletedTask; } Task IHostedService.StopAsync(CancellationToken cancellationToken) diff --git a/PicSizeCheckBot/PicSizeCheckBot.csproj b/PicSizeCheckBot/PicSizeCheckBot.csproj index 7ae4d05..ab21996 100644 --- a/PicSizeCheckBot/PicSizeCheckBot.csproj +++ b/PicSizeCheckBot/PicSizeCheckBot.csproj @@ -4,7 +4,7 @@ Exe net9.0 TehGM.WolfBots.PicSizeCheckBot - 2.2.1 + 2.2.2 TehGM TehGM WolfBot-Size @@ -63,8 +63,8 @@ - - + +