Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release v2.2.2 #7

Merged
merged 4 commits into from
Dec 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion PicSizeCheckBot/HelpHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public GroupBlacklistMentionFilter(IEnumerable<uint> groupIDs)
this.GroupIDs = groupIDs as HashSet<uint> ?? groupIDs?.ToHashSet();
}

public ValueTask<bool> PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default)
public ValueTask<bool> PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default)
{
if (this.GroupIDs == null)
return ValueTask.FromResult(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public GroupWhitelistMentionFilter(IEnumerable<uint> groupIDs)
this.GroupIDs = groupIDs as HashSet<uint> ?? groupIDs?.ToHashSet();
}

public ValueTask<bool> PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default)
public ValueTask<bool> PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default)
{
if (this.GroupIDs == null)
return ValueTask.FromResult(false);
Expand Down
2 changes: 1 addition & 1 deletion PicSizeCheckBot/Mentions/Filters/IMentionFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ namespace TehGM.WolfBots.PicSizeCheckBot.Mentions.Filters
{
public interface IMentionFilter
{
ValueTask<bool> PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default);
ValueTask<bool> PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace TehGM.WolfBots.PicSizeCheckBot.Mentions.Filters
[BsonDiscriminator("Mentions.Filters.IgnoreBots", Required = true)]
public class IgnoreBotsMentionFilter : IMentionFilter
{
public async ValueTask<bool> PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default)
public async ValueTask<bool> PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default)
{
if (message.SenderID == null)
return true;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<uint> ExceptGroupIDs { get; }

[BsonConstructor(nameof(this.ExceptGroupIDs))]
public RequireGroupPresenceMentionFilter(IEnumerable<uint> exceptGroupIDs)
{
this.ExceptGroupIDs = exceptGroupIDs as HashSet<uint> ?? exceptGroupIDs?.ToHashSet();
}

public async ValueTask<bool> 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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public UserBlacklistMentionFilter(IEnumerable<uint> userIDs)
this.UserIDs = userIDs as HashSet<uint> ?? userIDs?.ToHashSet();
}

public ValueTask<bool> PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default)
public ValueTask<bool> PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default)
{
if (this.UserIDs == null)
return ValueTask.FromResult(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public UserWhitelistMentionFilter(IEnumerable<uint> userIDs)
this.UserIDs = userIDs as HashSet<uint> ?? userIDs?.ToHashSet();
}

public ValueTask<bool> PassesAsync(ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default)
public ValueTask<bool> PassesAsync(uint userID, ChatMessage message, IWolfClient client, CancellationToken cancellationToken = default)
{
if (this.UserIDs == null)
return ValueTask.FromResult(false);
Expand Down
69 changes: 32 additions & 37 deletions PicSizeCheckBot/Mentions/MentionsHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<MentionConfig> allMentions = await _mentionConfigStore.GetAllAsync(cancellationToken).ConfigureAwait(false);
if (allMentions?.Any() == true)
foreach (MentionConfig mentionConfig in allMentions ?? Enumerable.Empty<MentionConfig>())
{
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<MentionPattern>())
{
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<MentionPattern>())
{
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<bool> AnyFilterBlocksAsync(ChatMessage message, IEnumerable<IMentionFilter> filters, CancellationToken cancellationToken)
private async ValueTask<bool> AnyFilterBlocksAsync(uint userID, ChatMessage message, IEnumerable<IMentionFilter> 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;
}
Expand Down Expand Up @@ -142,7 +137,7 @@ private async Task<string> 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)
Expand Down
6 changes: 3 additions & 3 deletions PicSizeCheckBot/PicSizeCheckBot.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<RootNamespace>TehGM.WolfBots.PicSizeCheckBot</RootNamespace>
<Version>2.2.1</Version>
<Version>2.2.2</Version>
<Authors>TehGM</Authors>
<Company>TehGM</Company>
<Product>WolfBot-Size</Product>
Expand Down Expand Up @@ -63,8 +63,8 @@
<PackageReference Include="Serilog.Sinks.Datadog.Logs" Version="0.5.4" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.6" />
<PackageReference Include="Wolfringo" Version="2.1.3" />
<PackageReference Include="Wolfringo.Hosting" Version="2.1.3" />
<PackageReference Include="Wolfringo" Version="2.1.4" />
<PackageReference Include="Wolfringo.Hosting" Version="2.1.4" />
</ItemGroup>

</Project>
Loading