Use MemberData to determine a subscriber's role list (#165)

Closes #163 

Discord's API sucks a lot. You ask it for a member, but it won't give
you a member. This is why this PR updates the
`GetEventNotificationMentions` method used to determine what roles and
users should get pinged for a scheduled event. Previously, the bot asked
Discord to provide the member for each subscriber to determine whether
or not they have the event notification role (to avoid pinging people
personally when the role would already ping them). With this pull
request, the bot uses MemberData, it's own member storage, for that
purpose (if you're wondering why, refer to the first two sentences)
This commit is contained in:
Octol1ttle 2023-10-17 17:07:01 +05:00 committed by GitHub
parent a326adb680
commit 687883bbf8
Signed by: GitHub
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 7 deletions

View file

@ -286,7 +286,7 @@ public sealed class ScheduledEventUpdateService : BackgroundService
}; };
var contentResult = await _utility.GetEventNotificationMentions( var contentResult = await _utility.GetEventNotificationMentions(
scheduledEvent, data.Settings, ct); scheduledEvent, data, ct);
if (!contentResult.IsDefined(out var content)) if (!contentResult.IsDefined(out var content))
{ {
return Result.FromError(contentResult); return Result.FromError(contentResult);
@ -412,7 +412,7 @@ public sealed class ScheduledEventUpdateService : BackgroundService
IGuildScheduledEvent scheduledEvent, GuildData data, CancellationToken ct) IGuildScheduledEvent scheduledEvent, GuildData data, CancellationToken ct)
{ {
var contentResult = await _utility.GetEventNotificationMentions( var contentResult = await _utility.GetEventNotificationMentions(
scheduledEvent, data.Settings, ct); scheduledEvent, data, ct);
if (!contentResult.IsDefined(out var content)) if (!contentResult.IsDefined(out var content))
{ {
return Result.FromError(contentResult); return Result.FromError(contentResult);

View file

@ -160,16 +160,16 @@ public sealed class UtilityService : IHostedService
/// <param name="scheduledEvent"> /// <param name="scheduledEvent">
/// The scheduled event whose subscribers will be mentioned. /// The scheduled event whose subscribers will be mentioned.
/// </param> /// </param>
/// <param name="settings">The settings of the guild containing the scheduled event</param> /// <param name="data">The data of the guild containing the scheduled event.</param>
/// <param name="ct">The cancellation token for this operation.</param> /// <param name="ct">The cancellation token for this operation.</param>
/// <returns>A result containing the string which may or may not have succeeded.</returns> /// <returns>A result containing the string which may or may not have succeeded.</returns>
public async Task<Result<string>> GetEventNotificationMentions( public async Task<Result<string>> GetEventNotificationMentions(
IGuildScheduledEvent scheduledEvent, JsonNode settings, CancellationToken ct = default) IGuildScheduledEvent scheduledEvent, GuildData data, CancellationToken ct = default)
{ {
var builder = new StringBuilder(); var builder = new StringBuilder();
var role = GuildSettings.EventNotificationRole.Get(settings); var role = GuildSettings.EventNotificationRole.Get(data.Settings);
var subscribersResult = await _eventApi.GetGuildScheduledEventUsersAsync( var subscribersResult = await _eventApi.GetGuildScheduledEventUsersAsync(
scheduledEvent.GuildID, scheduledEvent.ID, withMember: true, ct: ct); scheduledEvent.GuildID, scheduledEvent.ID, ct: ct);
if (!subscribersResult.IsDefined(out var subscribers)) if (!subscribersResult.IsDefined(out var subscribers))
{ {
return Result<string>.FromError(subscribersResult); return Result<string>.FromError(subscribersResult);
@ -181,7 +181,7 @@ public sealed class UtilityService : IHostedService
} }
builder = subscribers.Where( builder = subscribers.Where(
subscriber => subscriber.GuildMember.IsDefined(out var member) && !member.Roles.Contains(role)) subscriber => !data.GetOrCreateMemberData(subscriber.User.ID).Roles.Contains(role.Value))
.Aggregate(builder, (current, subscriber) => current.Append($"{Mention.User(subscriber.User)} ")); .Aggregate(builder, (current, subscriber) => current.Append($"{Mention.User(subscriber.User)} "));
return builder.ToString(); return builder.ToString();
} }