add registered role to bot
This commit is contained in:
@@ -1,8 +1,13 @@
|
||||
using System.Collections.Concurrent;
|
||||
using Discord;
|
||||
using Discord.Net;
|
||||
using Discord.Rest;
|
||||
using Discord.WebSocket;
|
||||
using MareSynchronosShared.Metrics;
|
||||
using MareSynchronosShared.Models;
|
||||
using MareSynchronosShared.Services;
|
||||
using MareSynchronosShared.Utils.Configuration;
|
||||
using StackExchange.Redis;
|
||||
|
||||
namespace MareSynchronosServices.Discord;
|
||||
|
||||
@@ -51,6 +56,7 @@ public class DiscordBotServices
|
||||
public async Task LogToChannel(string msg)
|
||||
{
|
||||
if (_guild == null) return;
|
||||
Logger.LogInformation("LogToChannel: {msg}", msg);
|
||||
var logChannelId = _configuration.GetValueOrDefault<ulong?>(nameof(ServicesConfiguration.DiscordChannelForBotLog), null);
|
||||
if (logChannelId == null) return;
|
||||
if (logChannelId != _logChannelId)
|
||||
@@ -67,10 +73,74 @@ public class DiscordBotServices
|
||||
}
|
||||
|
||||
if (_logChannel == null) return;
|
||||
|
||||
await _logChannel.SendMessageAsync(msg).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private async Task RetryAsync(Task action, IUser user, string operation, bool logInfoToChannel = true)
|
||||
{
|
||||
int retryCount = 0;
|
||||
int maxRetries = 5;
|
||||
var retryDelay = TimeSpan.FromSeconds(5);
|
||||
|
||||
while (retryCount < maxRetries)
|
||||
{
|
||||
try
|
||||
{
|
||||
await action.ConfigureAwait(false);
|
||||
if (logInfoToChannel)
|
||||
await LogToChannel($"{user.Mention} {operation} SUCCESS").ConfigureAwait(false);
|
||||
break;
|
||||
}
|
||||
catch (RateLimitedException)
|
||||
{
|
||||
retryCount++;
|
||||
await LogToChannel($"{user.Mention} {operation} RATELIMIT, retry {retryCount} in {retryDelay}.").ConfigureAwait(false);
|
||||
await Task.Delay(retryDelay).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await LogToChannel($"{user.Mention} {operation} FAILED: {ex.Message}").ConfigureAwait(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (retryCount == maxRetries)
|
||||
{
|
||||
await LogToChannel($"{user.Mention} FAILED: RetryCount exceeded.").ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task RemoveRegisteredRoleAsync(IUser user)
|
||||
{
|
||||
var registeredRole = _configuration.GetValueOrDefault<ulong?>(nameof(ServicesConfiguration.DiscordRoleRegistered), null);
|
||||
if (registeredRole == null) return;
|
||||
var restUser = await _guild.GetUserAsync(user.Id).ConfigureAwait(false);
|
||||
if (restUser == null) return;
|
||||
if (!restUser.RoleIds.Contains(registeredRole.Value)) return;
|
||||
await RetryAsync(restUser.RemoveRoleAsync(registeredRole.Value), user, $"Remove Registered Role").ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task AddRegisteredRoleAsync(IUser user)
|
||||
{
|
||||
var registeredRole = _configuration.GetValueOrDefault<ulong?>(nameof(ServicesConfiguration.DiscordRoleRegistered), null);
|
||||
if (registeredRole == null) return;
|
||||
var restUser = await _guild.GetUserAsync(user.Id).ConfigureAwait(false);
|
||||
if (restUser == null) return;
|
||||
if (restUser.RoleIds.Contains(registeredRole.Value)) return;
|
||||
await RetryAsync(restUser.AddRoleAsync(registeredRole.Value), user, $"Add Registered Role").ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task AddRegisteredRoleAsync(RestGuildUser user, RestRole role)
|
||||
{
|
||||
if (user.RoleIds.Contains(role.Id)) return;
|
||||
await RetryAsync(user.AddRoleAsync(role), user, $"Add Registered Role", false).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task KickUserAsync(RestGuildUser user)
|
||||
{
|
||||
await RetryAsync(user.KickAsync("No registration found"), user, "Kick").ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private async Task ProcessVerificationQueue()
|
||||
{
|
||||
while (!verificationTaskCts.IsCancellationRequested)
|
||||
|
||||
Reference in New Issue
Block a user