139 lines
5.1 KiB
C#
139 lines
5.1 KiB
C#
using Discord;
|
|
using Discord.Commands;
|
|
using NadekoBot.Attributes;
|
|
using NadekoBot.Extensions;
|
|
using NadekoBot.Services;
|
|
using NadekoBot.Services.Database.Models;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace NadekoBot.Modules.Utility
|
|
{
|
|
public partial class Utility
|
|
{
|
|
[Group]
|
|
public class QuoteCommands : ModuleBase
|
|
{
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
public async Task ListQuotes(int page = 1)
|
|
{
|
|
page -= 1;
|
|
|
|
if (page < 0)
|
|
return;
|
|
|
|
IEnumerable<Quote> quotes;
|
|
using (var uow = DbHandler.UnitOfWork())
|
|
{
|
|
quotes = uow.Quotes.GetGroup(Context.Guild.Id, page * 16, 16);
|
|
}
|
|
|
|
if (quotes.Any())
|
|
await Context.Channel.SendConfirmAsync($"💬 **Page {page + 1} of quotes:**\n```xl\n" + String.Join("\n", quotes.Select((q) => $"{q.Keyword,-20} by {q.AuthorName}")) + "\n```")
|
|
.ConfigureAwait(false);
|
|
else
|
|
await Context.Channel.SendErrorAsync("No quotes on this page.").ConfigureAwait(false);
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
public async Task ShowQuote([Remainder] string keyword)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(keyword))
|
|
return;
|
|
|
|
keyword = keyword.ToUpperInvariant();
|
|
|
|
Quote quote;
|
|
using (var uow = DbHandler.Instance.GetUnitOfWork())
|
|
{
|
|
quote = await uow.Quotes.GetRandomQuoteByKeywordAsync(Context.Guild.Id, keyword).ConfigureAwait(false);
|
|
}
|
|
|
|
if (quote == null)
|
|
return;
|
|
|
|
await Context.Channel.SendMessageAsync("📣 " + quote.Text.SanitizeMentions());
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
public async Task AddQuote(string keyword, [Remainder] string text)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(keyword) || string.IsNullOrWhiteSpace(text))
|
|
return;
|
|
|
|
keyword = keyword.ToUpperInvariant();
|
|
|
|
using (var uow = DbHandler.UnitOfWork())
|
|
{
|
|
uow.Quotes.Add(new Quote
|
|
{
|
|
AuthorId = Context.Message.Author.Id,
|
|
AuthorName = Context.Message.Author.Username,
|
|
GuildId = Context.Guild.Id,
|
|
Keyword = keyword,
|
|
Text = text,
|
|
});
|
|
await uow.CompleteAsync().ConfigureAwait(false);
|
|
}
|
|
await Context.Channel.SendConfirmAsync("✅ Quote added.").ConfigureAwait(false);
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
public async Task DeleteQuote([Remainder] string keyword)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(keyword))
|
|
return;
|
|
|
|
var isAdmin = ((IGuildUser)Context.Message.Author).GuildPermissions.Administrator;
|
|
|
|
keyword = keyword.ToUpperInvariant();
|
|
string response;
|
|
using (var uow = DbHandler.UnitOfWork())
|
|
{
|
|
var qs = uow.Quotes.GetAllQuotesByKeyword(Context.Guild.Id, keyword);
|
|
|
|
if (qs == null || !qs.Any())
|
|
{
|
|
await Context.Channel.SendErrorAsync("No quotes found.").ConfigureAwait(false);
|
|
return;
|
|
}
|
|
|
|
var q = qs.Shuffle().FirstOrDefault(elem => isAdmin || elem.AuthorId == Context.Message.Author.Id);
|
|
|
|
uow.Quotes.Remove(q);
|
|
await uow.CompleteAsync().ConfigureAwait(false);
|
|
response = "🗑 **Deleted a random quote.**";
|
|
}
|
|
await Context.Channel.SendConfirmAsync(response);
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
[RequireUserPermission(GuildPermission.Administrator)]
|
|
public async Task DelAllQuotes([Remainder] string keyword)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(keyword))
|
|
return;
|
|
|
|
keyword = keyword.ToUpperInvariant();
|
|
|
|
using (var uow = DbHandler.UnitOfWork())
|
|
{
|
|
var quotes = uow.Quotes.GetAllQuotesByKeyword(Context.Guild.Id, keyword);
|
|
|
|
uow.Quotes.RemoveRange(quotes.ToArray());//wtf?!
|
|
|
|
await uow.CompleteAsync();
|
|
}
|
|
|
|
await Context.Channel.SendConfirmAsync($"🗑 **Deleted all quotes** with **{keyword}** keyword.");
|
|
}
|
|
}
|
|
}
|
|
} |