Skip to content

Commit 339e9cb

Browse files
committedJan 26, 2023
Implemented FetchDirection.After for audit logs.
1 parent 3a9f49f commit 339e9cb

File tree

4 files changed

+82
-34
lines changed

4 files changed

+82
-34
lines changed
 

‎src/Disqord.Rest.Api/Methods/RestApiClientExtensions.AuditLog.cs

+30-8
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,52 @@
22
using System.Threading;
33
using System.Threading.Tasks;
44
using Disqord.Models;
5+
using Qommon;
56

67
namespace Disqord.Rest.Api;
78

89
public static partial class RestApiClientExtensions
910
{
1011
public static Task<AuditLogJsonModel> FetchAuditLogsAsync(this IRestApiClient client,
11-
Snowflake guildId, int limit = Discord.Limits.Rest.FetchAuditLogsPageSize, Snowflake? userId = null, AuditLogActionType? type = null, Snowflake? startFromId = null,
12+
Snowflake guildId, int limit = Discord.Limits.Rest.FetchAuditLogsPageSize, Snowflake? userId = null, AuditLogActionType? type = null,
13+
FetchDirection direction = FetchDirection.Before, Snowflake? startFromId = null,
1214
IRestRequestOptions? options = null, CancellationToken cancellationToken = default)
1315
{
14-
var parameters = new Dictionary<string, object>
16+
var queryParameters = new Dictionary<string, object>
1517
{
1618
["limit"] = limit
1719
};
1820

1921
if (userId != null)
20-
parameters["user_id"] = userId.Value;
22+
queryParameters["user_id"] = userId.Value;
2123

2224
if (type != null)
23-
parameters["action_type"] = (int) type.Value;
25+
queryParameters["action_type"] = (int) type.Value;
2426

25-
if (startFromId != null)
26-
parameters["before"] = startFromId.Value;
27+
switch (direction)
28+
{
29+
case FetchDirection.Before:
30+
{
31+
if (startFromId != null)
32+
queryParameters["before"] = startFromId.Value;
33+
34+
break;
35+
}
36+
case FetchDirection.After:
37+
{
38+
if (startFromId != null)
39+
queryParameters["after"] = startFromId.Value;
40+
41+
break;
42+
}
43+
default:
44+
{
45+
Throw.ArgumentOutOfRangeException(nameof(direction));
46+
break;
47+
}
48+
}
2749

28-
var route = Format(Route.AuditLog.GetAuditLogs, parameters, guildId);
50+
var route = Format(Route.AuditLog.GetAuditLogs, queryParameters, guildId);
2951
return client.ExecuteAsync<AuditLogJsonModel>(route, null, options, cancellationToken);
3052
}
31-
}
53+
}

‎src/Disqord.Rest/Extensions/Entity/RestEntityExtensions.Guild.cs

+12-8
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,39 @@ namespace Disqord.Rest;
1111
public static partial class RestEntityExtensions
1212
{
1313
public static IPagedEnumerable<IAuditLog> EnumerateAuditLogs(this IGuild guild,
14-
int limit, Snowflake? actorId = null, Snowflake? startFromId = null,
14+
int limit, Snowflake? actorId = null,
15+
FetchDirection direction = FetchDirection.Before, Snowflake? startFromId = null,
1516
IRestRequestOptions? options = null)
1617
{
17-
return guild.EnumerateAuditLogs<IAuditLog>(limit, actorId, startFromId, options);
18+
return guild.EnumerateAuditLogs<IAuditLog>(limit, actorId, direction, startFromId, options);
1819
}
1920

2021
public static IPagedEnumerable<TAuditLog> EnumerateAuditLogs<TAuditLog>(this IGuild guild,
21-
int limit, Snowflake? actorId = null, Snowflake? startFromId = null,
22+
int limit, Snowflake? actorId = null,
23+
FetchDirection direction = FetchDirection.Before, Snowflake? startFromId = null,
2224
IRestRequestOptions? options = null)
2325
where TAuditLog : class, IAuditLog
2426
{
2527
var client = guild.GetRestClient();
26-
return client.EnumerateAuditLogs<TAuditLog>(guild.Id, limit, actorId, startFromId, options);
28+
return client.EnumerateAuditLogs<TAuditLog>(guild.Id, limit, actorId, direction, startFromId, options);
2729
}
2830

2931
public static Task<IReadOnlyList<IAuditLog>> FetchAuditLogsAsync(this IGuild guild,
30-
int limit = Discord.Limits.Rest.FetchAuditLogsPageSize, Snowflake? actorId = null, Snowflake? startFromId = null,
32+
int limit = Discord.Limits.Rest.FetchAuditLogsPageSize, Snowflake? actorId = null,
33+
FetchDirection direction = FetchDirection.Before, Snowflake? startFromId = null,
3134
IRestRequestOptions? options = null, CancellationToken cancellationToken = default)
3235
{
33-
return guild.FetchAuditLogsAsync<IAuditLog>(limit, actorId, startFromId, options, cancellationToken);
36+
return guild.FetchAuditLogsAsync<IAuditLog>(limit, actorId, direction, startFromId, options, cancellationToken);
3437
}
3538

3639
public static Task<IReadOnlyList<TAuditLog>> FetchAuditLogsAsync<TAuditLog>(this IGuild guild,
37-
int limit = Discord.Limits.Rest.FetchAuditLogsPageSize, Snowflake? actorId = null, Snowflake? startFromId = null,
40+
int limit = Discord.Limits.Rest.FetchAuditLogsPageSize, Snowflake? actorId = null,
41+
FetchDirection direction = FetchDirection.Before, Snowflake? startFromId = null,
3842
IRestRequestOptions? options = null, CancellationToken cancellationToken = default)
3943
where TAuditLog : class, IAuditLog
4044
{
4145
var client = guild.GetRestClient();
42-
return client.FetchAuditLogsAsync<TAuditLog>(guild.Id, limit, actorId, startFromId, options, cancellationToken);
46+
return client.FetchAuditLogsAsync<TAuditLog>(guild.Id, limit, actorId, direction, startFromId, options, cancellationToken);
4347
}
4448

4549
public static Task LeaveAsync(this IGuild guild,

‎src/Disqord.Rest/Extensions/RestClientExtensions.AuditLog.cs

+26-15
Original file line numberDiff line numberDiff line change
@@ -14,47 +14,58 @@ public static partial class RestClientExtensions
1414
{
1515
// TODO: AuditLogActionType overload?
1616
public static IPagedEnumerable<IAuditLog> EnumerateAuditLogs(this IRestClient client,
17-
Snowflake guildId, int limit, Snowflake? actorId = null, Snowflake? startFromId = null,
17+
Snowflake guildId, int limit, Snowflake? actorId = null,
18+
FetchDirection direction = FetchDirection.Before, Snowflake? startFromId = null,
1819
IRestRequestOptions? options = null)
19-
=> client.EnumerateAuditLogs<IAuditLog>(guildId, limit, actorId, startFromId, options);
20+
{
21+
return client.EnumerateAuditLogs<IAuditLog>(guildId, limit, actorId, direction, startFromId, options);
22+
}
2023

2124
public static IPagedEnumerable<TAuditLog> EnumerateAuditLogs<TAuditLog>(this IRestClient client,
22-
Snowflake guildId, int limit, Snowflake? actorId = null, Snowflake? startFromId = null,
25+
Snowflake guildId, int limit, Snowflake? actorId = null,
26+
FetchDirection direction = FetchDirection.Before, Snowflake? startFromId = null,
2327
IRestRequestOptions? options = null)
2428
where TAuditLog : class, IAuditLog
25-
=> PagedEnumerable.Create(static (state, cancellationToken) =>
29+
{
30+
return PagedEnumerable.Create(static (state, cancellationToken) =>
2631
{
27-
var (client, guildId, limit, actorId, startFromId, options) = state;
28-
return new FetchAuditLogsPagedEnumerator<TAuditLog>(client, guildId, limit, actorId, startFromId, options, cancellationToken);
29-
}, (client, guildId, limit, actorId, startFromId, options));
32+
var (client, guildId, limit, actorId, direction, startFromId, options) = state;
33+
return new FetchAuditLogsPagedEnumerator<TAuditLog>(client, guildId, limit, actorId, direction, startFromId, options, cancellationToken);
34+
}, (client, guildId, limit, actorId, direction, startFromId, options));
35+
}
3036

3137
public static Task<IReadOnlyList<IAuditLog>> FetchAuditLogsAsync(this IRestClient client,
32-
Snowflake guildId, int limit = Discord.Limits.Rest.FetchAuditLogsPageSize, Snowflake? actorId = null, Snowflake? startFromId = null,
38+
Snowflake guildId, int limit = Discord.Limits.Rest.FetchAuditLogsPageSize, Snowflake? actorId = null,
39+
FetchDirection direction = FetchDirection.Before, Snowflake? startFromId = null,
3340
IRestRequestOptions? options = null, CancellationToken cancellationToken = default)
34-
=> client.FetchAuditLogsAsync<IAuditLog>(guildId, limit, actorId, startFromId, options, cancellationToken);
41+
{
42+
return client.FetchAuditLogsAsync<IAuditLog>(guildId, limit, actorId, direction, startFromId, options, cancellationToken);
43+
}
3544

3645
public static Task<IReadOnlyList<TAuditLog>> FetchAuditLogsAsync<TAuditLog>(this IRestClient client,
37-
Snowflake guildId, int limit = Discord.Limits.Rest.FetchAuditLogsPageSize, Snowflake? actorId = null, Snowflake? startFromId = null,
46+
Snowflake guildId, int limit = Discord.Limits.Rest.FetchAuditLogsPageSize, Snowflake? actorId = null,
47+
FetchDirection direction = FetchDirection.Before, Snowflake? startFromId = null,
3848
IRestRequestOptions? options = null, CancellationToken cancellationToken = default)
3949
where TAuditLog : class, IAuditLog
4050
{
4151
if (limit == 0)
4252
return Task.FromResult(ReadOnlyList<TAuditLog>.Empty);
4353

44-
if (limit <= 100)
45-
return client.InternalFetchAuditLogsAsync<TAuditLog>(guildId, limit, actorId, startFromId, options, cancellationToken);
54+
if (limit <= Discord.Limits.Rest.FetchAuditLogsPageSize)
55+
return client.InternalFetchAuditLogsAsync<TAuditLog>(guildId, limit, actorId, direction, startFromId, options, cancellationToken);
4656

47-
var enumerable = client.EnumerateAuditLogs<TAuditLog>(guildId, limit, actorId, startFromId, options);
57+
var enumerable = client.EnumerateAuditLogs<TAuditLog>(guildId, limit, actorId, direction, startFromId, options);
4858
return enumerable.FlattenAsync(cancellationToken);
4959
}
5060

5161
internal static async Task<IReadOnlyList<TAuditLog>> InternalFetchAuditLogsAsync<TAuditLog>(this IRestClient client,
52-
Snowflake guildId, int limit, Snowflake? actorId, Snowflake? startFromId,
62+
Snowflake guildId, int limit, Snowflake? actorId,
63+
FetchDirection direction, Snowflake? startFromId,
5364
IRestRequestOptions? options, CancellationToken cancellationToken)
5465
where TAuditLog : IAuditLog
5566
{
5667
var type = GetAuditLogActionType(typeof(TAuditLog));
57-
var model = await client.ApiClient.FetchAuditLogsAsync(guildId, limit, actorId, type, startFromId, options, cancellationToken).ConfigureAwait(false);
68+
var model = await client.ApiClient.FetchAuditLogsAsync(guildId, limit, actorId, type, direction, startFromId, options, cancellationToken).ConfigureAwait(false);
5869
var list = new List<TAuditLog>();
5970
foreach (var entry in model.AuditLogEntries)
6071
{

‎src/Disqord.Rest/Requests/Pagination/Implementation/FetchAuditLogsPagedEnumerator.cs

+14-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Threading;
33
using System.Threading.Tasks;
44
using Disqord.AuditLogs;
5+
using Qommon;
56

67
namespace Disqord.Rest;
78

@@ -12,16 +13,19 @@ public class FetchAuditLogsPagedEnumerator<TAuditLog> : PagedEnumerator<TAuditLo
1213

1314
private readonly Snowflake _guildId;
1415
private readonly Snowflake? _actorId;
16+
private readonly FetchDirection _direction;
1517
private readonly Snowflake? _startFromId;
1618

1719
public FetchAuditLogsPagedEnumerator(IRestClient client,
18-
Snowflake guildId, int limit, Snowflake? actorId, Snowflake? startFromId,
20+
Snowflake guildId, int limit, Snowflake? actorId,
21+
FetchDirection direction, Snowflake? startFromId,
1922
IRestRequestOptions? options,
2023
CancellationToken cancellationToken)
2124
: base(client, limit, options, cancellationToken)
2225
{
2326
_guildId = guildId;
2427
_actorId = actorId;
28+
_direction = direction;
2529
_startFromId = startFromId;
2630
}
2731

@@ -30,8 +34,15 @@ protected override Task<IReadOnlyList<TAuditLog>> NextPageAsync(
3034
{
3135
var startFromId = _startFromId;
3236
if (previousPage != null && previousPage.Count > 0)
33-
startFromId = previousPage[^1].Id;
37+
{
38+
startFromId = _direction switch
39+
{
40+
FetchDirection.Before => previousPage[^1].Id,
41+
FetchDirection.After => previousPage[0].Id,
42+
_ => Throw.ArgumentOutOfRangeException<Snowflake>("direction"),
43+
};
44+
}
3445

35-
return Client.InternalFetchAuditLogsAsync<TAuditLog>(_guildId, NextPageSize, _actorId, startFromId, options, cancellationToken);
46+
return Client.InternalFetchAuditLogsAsync<TAuditLog>(_guildId, NextPageSize, _actorId, _direction, startFromId, options, cancellationToken);
3647
}
3748
}

0 commit comments

Comments
 (0)
Please sign in to comment.