100 lines
3.4 KiB
C#
100 lines
3.4 KiB
C#
|
using DryIoc.ImTools;
|
|||
|
using EllieBot.Modules.Utility.LinkFixer;
|
|||
|
|
|||
|
namespace EllieBot.Modules.Utility;
|
|||
|
|
|||
|
public partial class Utility
|
|||
|
{
|
|||
|
[Group]
|
|||
|
public class LinkFixerCommands : EllieModule<LinkFixerService>
|
|||
|
{
|
|||
|
[Cmd]
|
|||
|
[RequireContext(ContextType.Guild)]
|
|||
|
[UserPerm(GuildPerm.ManageMessages)]
|
|||
|
public async Task LinkFix(string oldDomain, string? newDomain = null)
|
|||
|
{
|
|||
|
if (string.IsNullOrWhiteSpace(newDomain))
|
|||
|
{
|
|||
|
var rmSuccess = await _service.RemoveLinkFixAsync(ctx.Guild.Id, oldDomain);
|
|||
|
|
|||
|
if (rmSuccess)
|
|||
|
await Response().Confirm(strs.linkfix_removed(Format.Bold(oldDomain))).SendAsync();
|
|||
|
else
|
|||
|
await Response().Error(strs.linkfix_not_found(Format.Bold(oldDomain))).SendAsync();
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
oldDomain = CleanDomain(oldDomain);
|
|||
|
newDomain = newDomain.Trim();
|
|||
|
|
|||
|
if (string.IsNullOrWhiteSpace(oldDomain) || string.IsNullOrWhiteSpace(newDomain))
|
|||
|
{
|
|||
|
await Response().Error(strs.linkfix_invalid_domains).SendAsync();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var success = await _service.AddLinkFixAsync(ctx.Guild.Id, oldDomain, newDomain);
|
|||
|
if (success)
|
|||
|
await Response().Confirm(strs.linkfix_added(Format.Bold(oldDomain), Format.Bold(newDomain))).SendAsync();
|
|||
|
else
|
|||
|
await Response().Error(strs.linkfix_already_exists(Format.Bold(oldDomain))).SendAsync();
|
|||
|
}
|
|||
|
|
|||
|
[Cmd]
|
|||
|
[RequireContext(ContextType.Guild)]
|
|||
|
public async Task LinkFixList()
|
|||
|
{
|
|||
|
var linkFixes = _service.GetLinkFixes(ctx.Guild.Id);
|
|||
|
if (linkFixes.Count == 0)
|
|||
|
{
|
|||
|
await Response().Confirm(strs.linkfix_list_none).SendAsync();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var items = linkFixes.Select(x => $"{Format.Bold(x.Key)} -> {Format.Bold(x.Value)}").ToList();
|
|||
|
|
|||
|
await Response()
|
|||
|
.Paginated()
|
|||
|
.Items(items)
|
|||
|
.PageSize(10)
|
|||
|
.Page((items, _) =>
|
|||
|
{
|
|||
|
var eb = CreateEmbed()
|
|||
|
.WithTitle(GetText(strs.linkfix_list_title))
|
|||
|
.WithDescription(string.Join('\n', items))
|
|||
|
.WithOkColor();
|
|||
|
|
|||
|
return eb;
|
|||
|
})
|
|||
|
.SendAsync();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Removes protocol and www. from a domain
|
|||
|
/// </summary>
|
|||
|
/// <param name="domain">The domain to clean</param>
|
|||
|
private static string CleanDomain(string domain)
|
|||
|
{
|
|||
|
// Remove protocol if present
|
|||
|
if (domain.StartsWith("http://", StringComparison.OrdinalIgnoreCase))
|
|||
|
domain = domain[7..];
|
|||
|
else if (domain.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
|
|||
|
domain = domain[8..];
|
|||
|
|
|||
|
// Remove www. if present
|
|||
|
if (domain.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
|
|||
|
domain = domain[4..];
|
|||
|
|
|||
|
// Remove any path or query string
|
|||
|
var pathIndex = domain.IndexOf('/');
|
|||
|
if (pathIndex > 0)
|
|||
|
domain = domain[..pathIndex];
|
|||
|
|
|||
|
if (domain.Split('.').Length != 2)
|
|||
|
return string.Empty;
|
|||
|
|
|||
|
return domain.ToLowerInvariant();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|