- Reworked embed builder

- Use IEmbedBuilderService to create embed builders
- Wrapped embed builder and using IEmbedBuilder
This commit is contained in:
Kwoth
2021-07-09 22:23:19 +02:00
parent 5b4daa9dd3
commit 5e4754fa40
103 changed files with 730 additions and 540 deletions

View File

@@ -25,14 +25,19 @@ namespace NadekoBot.Services
private GreetGrouper<IGuildUser> greets = new GreetGrouper<IGuildUser>();
private GreetGrouper<IGuildUser> byes = new GreetGrouper<IGuildUser>();
private readonly BotConfigService _bss;
private readonly IEmbedBuilderService _eb;
public bool GroupGreets => _bss.Data.GroupGreets;
public GreetSettingsService(DiscordSocketClient client, Bot bot, DbService db,
BotConfigService bss)
public GreetSettingsService(DiscordSocketClient client,
Bot bot,
DbService db,
BotConfigService bss,
IEmbedBuilderService eb)
{
_db = db;
_client = client;
_bss = bss;
_eb = eb;
GuildConfigsCache = new ConcurrentDictionary<ulong, GreetSettings>(
bot.AllGuildConfigs
@@ -139,7 +144,7 @@ namespace NadekoBot.Services
rep.Replace(embedData);
try
{
var toDelete = await channel.EmbedAsync(embedData).ConfigureAwait(false);
var toDelete = await channel.EmbedAsync(embedData, _eb).ConfigureAwait(false);
if (conf.AutoDeleteByeMessagesTimer > 0)
{
toDelete.DeleteAfter(conf.AutoDeleteByeMessagesTimer);
@@ -190,7 +195,7 @@ namespace NadekoBot.Services
rep.Replace(embedData);
try
{
var toDelete = await channel.EmbedAsync(embedData).ConfigureAwait(false);
var toDelete = await channel.EmbedAsync(embedData, _eb).ConfigureAwait(false);
if (conf.AutoDeleteGreetMessagesTimer > 0)
{
toDelete.DeleteAfter(conf.AutoDeleteGreetMessagesTimer);
@@ -233,7 +238,7 @@ namespace NadekoBot.Services
rep.Replace(embedData);
try
{
await channel.EmbedAsync(embedData).ConfigureAwait(false);
await channel.EmbedAsync(embedData, _eb).ConfigureAwait(false);
}
catch
{
@@ -247,7 +252,7 @@ namespace NadekoBot.Services
{
try
{
await channel.SendConfirmAsync(msg).ConfigureAwait(false);
await channel.SendConfirmAsync(_eb, msg).ConfigureAwait(false);
}
catch
{

View File

@@ -1,46 +0,0 @@
using System;
using Discord;
namespace NadekoBot.Services
{
public interface IEmbedBuilderProvider
{
public IEmbedBuilder Create();
}
public interface IEmbedBuilder
{
public IEmbedBuilder WithDescription(string desc);
public IEmbedBuilder WithTitle(string title);
public IEmbedBuilder AddField(string title, object value, bool isInline = false);
public IEmbedBuilder WithFooter(string text, string iconUrl = null);
}
public class DiscordEmbedBuilderWrapper : IEmbedBuilder
{
private EmbedBuilder _embed;
public DiscordEmbedBuilderWrapper()
{
_embed = new EmbedBuilder();
}
public IEmbedBuilder WithDescription(string desc)
=> Wrap(_embed.WithDescription(desc));
public IEmbedBuilder WithTitle(string title)
=> Wrap(_embed.WithTitle(title));
public IEmbedBuilder AddField(string title, object value, bool isInline = false)
=> Wrap(_embed.AddField(title, value, isInline));
public IEmbedBuilder WithFooter(string text, string iconUrl = null)
=> Wrap(_embed.WithFooter(text, iconUrl));
private IEmbedBuilder Wrap(EmbedBuilder eb)
{
_embed = eb;
return this;
}
}
}

View File

@@ -0,0 +1,84 @@
using System;
using Discord;
using Discord.Commands;
using NadekoBot.Common.Configs;
using NadekoBot.Extensions;
namespace NadekoBot.Services
{
public interface IEmbedBuilderService
{
IEmbedBuilder Create(ICommandContext ctx = null);
IEmbedBuilder Create(EmbedBuilder eb);
}
public class EmbedBuilderService : IEmbedBuilderService, INService
{
private readonly BotConfigService _botConfigService;
public EmbedBuilderService(BotConfigService botConfigService)
{
_botConfigService = botConfigService;
}
public IEmbedBuilder Create(ICommandContext ctx = null)
=> new DiscordEmbedBuilderWrapper(_botConfigService.Data);
public IEmbedBuilder Create(EmbedBuilder embed)
=> new DiscordEmbedBuilderWrapper(_botConfigService.Data, embed);
}
public sealed class DiscordEmbedBuilderWrapper : IEmbedBuilder
{
private readonly BotConfig _botConfig;
private EmbedBuilder _embed;
public DiscordEmbedBuilderWrapper(in BotConfig botConfig, EmbedBuilder embed = null)
{
_botConfig = botConfig;
_embed = embed ?? new EmbedBuilder();
}
public IEmbedBuilder WithDescription(string desc)
=> Wrap(_embed.WithDescription(desc));
public IEmbedBuilder WithTitle(string title)
=> Wrap(_embed.WithTitle(title));
public IEmbedBuilder AddField(string title, object value, bool isInline = false)
=> Wrap(_embed.AddField(title, value, isInline));
public IEmbedBuilder WithFooter(string text, string iconUrl = null)
=> Wrap(_embed.WithFooter(text, iconUrl));
public IEmbedBuilder WithAuthor(string name, string iconUrl = null, string url = null)
=> Wrap(_embed.WithAuthor(name, iconUrl, url));
public IEmbedBuilder WithUrl(string url)
=> Wrap(_embed.WithAuthor(url));
public IEmbedBuilder WithImageUrl(string url)
=> Wrap(_embed.WithAuthor(url));
public IEmbedBuilder WithThumbnailUrl(string url)
=> Wrap(_embed.WithThumbnailUrl(url));
public IEmbedBuilder WithColor(EmbedColor color)
=> color switch
{
EmbedColor.Ok => Wrap(_embed.WithColor(_botConfig.Color.Ok.ToDiscordColor())),
EmbedColor.Pending => Wrap(_embed.WithColor(_botConfig.Color.Pending.ToDiscordColor())),
EmbedColor.Error => Wrap(_embed.WithColor(_botConfig.Color.Error.ToDiscordColor())),
_ => throw new ArgumentOutOfRangeException(nameof(color), "Unsupported EmbedColor type")
};
public Embed Build()
=> _embed.Build();
private IEmbedBuilder Wrap(EmbedBuilder eb)
{
_embed = eb;
return this;
}
}
}

View File

@@ -16,12 +16,14 @@ namespace NadekoBot.Services
{
private readonly DbService _db;
private readonly GamblingConfigService _gss;
private readonly IEmbedBuilderService _eb;
private readonly IUser _bot;
public CurrencyService(DbService db, DiscordSocketClient c, GamblingConfigService gss)
public CurrencyService(DbService db, DiscordSocketClient c, GamblingConfigService gss, IEmbedBuilderService eb)
{
_db = db;
_gss = gss;
_eb = eb;
_bot = c.CurrentUser;
}
@@ -80,7 +82,7 @@ namespace NadekoBot.Services
{
var sign = _gss.Data.Currency.Sign;
await (await user.GetOrCreateDMChannelAsync())
.EmbedAsync(new EmbedBuilder()
.EmbedAsync(_eb.Create()
.WithOkColor()
.WithTitle($"Received Currency")
.AddField("Amount", amount + sign)