.repeat, .repinv, .replst, .reprm added/improved
This commit is contained in:
parent
00978c293c
commit
a48fdd1fdc
@ -1,14 +1,18 @@
|
||||
using Discord;
|
||||
using Discord.Commands;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using NadekoBot.Attributes;
|
||||
using NadekoBot.Extensions;
|
||||
using NadekoBot.Services;
|
||||
using NadekoBot.Services.Database;
|
||||
using NadekoBot.Services.Database.Models;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@ -19,7 +23,8 @@ namespace NadekoBot.Modules.Administration
|
||||
[Group]
|
||||
public class RepeatCommands : ModuleBase
|
||||
{
|
||||
public static ConcurrentDictionary<ulong, RepeatRunner> repeaters { get; }
|
||||
//guildid/RepeatRunners
|
||||
public static ConcurrentDictionary<ulong, ConcurrentQueue<RepeatRunner>> repeaters { get; }
|
||||
|
||||
public class RepeatRunner
|
||||
{
|
||||
@ -83,7 +88,10 @@ namespace NadekoBot.Modules.Administration
|
||||
var sw = Stopwatch.StartNew();
|
||||
using (var uow = DbHandler.UnitOfWork())
|
||||
{
|
||||
repeaters = new ConcurrentDictionary<ulong, RepeatRunner>(uow.Repeaters.GetAll().Select(r => new RepeatRunner(r)).Where(r => r != null).ToDictionary(r => r.Repeater.ChannelId));
|
||||
repeaters = new ConcurrentDictionary<ulong, ConcurrentQueue<RepeatRunner>>(NadekoBot.AllGuildConfigs
|
||||
.ToDictionary(gc => gc.GuildId,
|
||||
gc => new ConcurrentQueue<RepeatRunner>(gc.GuildRepeaters.Select(gr => new RepeatRunner(gr))
|
||||
.Where(gr => gr.Channel != null))));
|
||||
}
|
||||
|
||||
sw.Stop();
|
||||
@ -93,41 +101,70 @@ namespace NadekoBot.Modules.Administration
|
||||
[NadekoCommand, Usage, Description, Aliases]
|
||||
[RequireContext(ContextType.Guild)]
|
||||
[RequireUserPermission(GuildPermission.ManageMessages)]
|
||||
public async Task RepeatInvoke()
|
||||
public async Task RepeatInvoke(int index)
|
||||
{
|
||||
RepeatRunner rep;
|
||||
index -= 1;
|
||||
ConcurrentQueue<RepeatRunner> rep;
|
||||
if (!repeaters.TryGetValue(Context.Channel.Id, out rep))
|
||||
{
|
||||
await Context.Channel.SendErrorAsync("ℹ️ **No repeating message found on this server.**").ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
rep.Reset();
|
||||
await Context.Channel.SendMessageAsync("🔄 " + rep.Repeater.Message).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
[NadekoCommand, Usage, Description, Aliases]
|
||||
[RequireContext(ContextType.Guild)]
|
||||
[RequireUserPermission(GuildPermission.ManageMessages)]
|
||||
public async Task Repeat()
|
||||
{
|
||||
RepeatRunner rep;
|
||||
if (repeaters.TryRemove(Context.Channel.Id, out rep))
|
||||
var repList = rep.ToList();
|
||||
|
||||
if (index >= repList.Count)
|
||||
{
|
||||
using (var uow = DbHandler.UnitOfWork())
|
||||
{
|
||||
uow.Repeaters.Remove(rep.Repeater);
|
||||
await uow.CompleteAsync();
|
||||
}
|
||||
rep.Stop();
|
||||
await Context.Channel.SendConfirmAsync("✅ **Stopped repeating a message.**").ConfigureAwait(false);
|
||||
await Context.Channel.SendErrorAsync("Index out of range.").ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
else
|
||||
await Context.Channel.SendConfirmAsync("ℹ️ **No message is repeating.**").ConfigureAwait(false);
|
||||
var repeater = repList[index].Repeater;
|
||||
|
||||
await Context.Channel.SendMessageAsync("🔄 " + repeater.Message).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
[NadekoCommand, Usage, Description, Aliases]
|
||||
[RequireContext(ContextType.Guild)]
|
||||
[RequireUserPermission(GuildPermission.ManageMessages)]
|
||||
[Priority(0)]
|
||||
public async Task RepeatRemove(int index)
|
||||
{
|
||||
if (index < 1)
|
||||
return;
|
||||
index -= 1;
|
||||
|
||||
ConcurrentQueue<RepeatRunner> rep;
|
||||
if (!repeaters.TryGetValue(Context.Guild.Id, out rep))
|
||||
return;
|
||||
|
||||
var repeaterList = rep.ToList();
|
||||
|
||||
if (index >= repeaterList.Count)
|
||||
{
|
||||
await Context.Channel.SendErrorAsync("Index out of range.").ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
var repeater = repeaterList[index];
|
||||
repeater.Stop();
|
||||
repeaterList.RemoveAt(index);
|
||||
|
||||
using (var uow = DbHandler.UnitOfWork())
|
||||
{
|
||||
var guildConfig = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(gc => gc.GuildRepeaters));
|
||||
|
||||
guildConfig.GuildRepeaters.RemoveWhere(r=>r.Id == repeater.Repeater.Id);
|
||||
await uow.CompleteAsync().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
if (repeaters.TryUpdate(Context.Guild.Id, new ConcurrentQueue<RepeatRunner>(repeaterList), rep))
|
||||
await Context.Channel.SendConfirmAsync("✅ **Stopped repeating a message.**").ConfigureAwait(false);
|
||||
}
|
||||
|
||||
[NadekoCommand, Usage, Description, Aliases]
|
||||
[RequireContext(ContextType.Guild)]
|
||||
[RequireUserPermission(GuildPermission.ManageMessages)]
|
||||
[Priority(1)]
|
||||
public async Task Repeat(int minutes, [Remainder] string message)
|
||||
{
|
||||
if (minutes < 1 || minutes > 10080)
|
||||
@ -136,38 +173,52 @@ namespace NadekoBot.Modules.Administration
|
||||
if (string.IsNullOrWhiteSpace(message))
|
||||
return;
|
||||
|
||||
RepeatRunner rep;
|
||||
var toAdd = new Repeater()
|
||||
{
|
||||
ChannelId = Context.Channel.Id,
|
||||
GuildId = Context.Guild.Id,
|
||||
Interval = TimeSpan.FromMinutes(minutes),
|
||||
Message = message
|
||||
};
|
||||
|
||||
rep = repeaters.AddOrUpdate(Context.Channel.Id, (cid) =>
|
||||
var rep = new RepeatRunner(toAdd, (ITextChannel)Context.Channel);
|
||||
|
||||
repeaters.AddOrUpdate(Context.Guild.Id, new ConcurrentQueue<RepeatRunner>(new[] { rep }), (key, old) =>
|
||||
{
|
||||
using (var uow = DbHandler.UnitOfWork())
|
||||
{
|
||||
var localRep = new Repeater
|
||||
{
|
||||
ChannelId = Context.Channel.Id,
|
||||
GuildId = Context.Guild.Id,
|
||||
Interval = TimeSpan.FromMinutes(minutes),
|
||||
Message = message,
|
||||
};
|
||||
uow.Repeaters.Add(localRep);
|
||||
uow.Complete();
|
||||
return new RepeatRunner(localRep, (ITextChannel)Context.Channel);
|
||||
}
|
||||
}, (cid, old) =>
|
||||
{
|
||||
using (var uow = DbHandler.UnitOfWork())
|
||||
{
|
||||
old.Repeater.Message = message;
|
||||
old.Repeater.Interval = TimeSpan.FromMinutes(minutes);
|
||||
uow.Repeaters.Update(old.Repeater);
|
||||
uow.Complete();
|
||||
}
|
||||
old.Reset();
|
||||
old.Enqueue(rep);
|
||||
return old;
|
||||
});
|
||||
|
||||
|
||||
await Context.Channel.SendConfirmAsync($"🔁 Repeating **\"{rep.Repeater.Message}\"** every `{rep.Repeater.Interval.Days} day(s), {rep.Repeater.Interval.Hours} hour(s) and {rep.Repeater.Interval.Minutes} minute(s)`.").ConfigureAwait(false);
|
||||
}
|
||||
|
||||
[NadekoCommand, Usage, Description, Aliases]
|
||||
[RequireContext(ContextType.Guild)]
|
||||
[RequireUserPermission(GuildPermission.ManageMessages)]
|
||||
public async Task RepeatList()
|
||||
{
|
||||
ConcurrentQueue<RepeatRunner> repRunners;
|
||||
if (!repeaters.TryGetValue(Context.Guild.Id, out repRunners))
|
||||
{
|
||||
await Context.Channel.SendConfirmAsync("No repeaters running on this server.").ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
var replist = repRunners.ToList();
|
||||
var sb = new StringBuilder();
|
||||
|
||||
for (int i = 0; i < replist.Count; i++)
|
||||
{
|
||||
var rep = replist[i];
|
||||
|
||||
sb.AppendLine($"`{i + 1}.` {rep.Channel.Mention} | {(int)rep.Repeater.Interval.TotalHours}:{rep.Repeater.Interval:mm} | {rep.Repeater.Message.TrimTo(20)}");
|
||||
}
|
||||
|
||||
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
|
||||
.WithTitle("List Of Repeaters")
|
||||
.WithDescription(sb.ToString()))
|
||||
.ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
60
src/NadekoBot/Resources/CommandStrings.Designer.cs
generated
60
src/NadekoBot/Resources/CommandStrings.Designer.cs
generated
@ -5712,7 +5712,7 @@ namespace NadekoBot.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Repeat a message every X minutes. If no parameters are specified, repeat is disabled..
|
||||
/// Looks up a localized string similar to Repeat a message every X minutes in the current channel..
|
||||
/// </summary>
|
||||
public static string repeat_desc {
|
||||
get {
|
||||
@ -5739,7 +5739,7 @@ namespace NadekoBot.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Immediately shows the repeat message and restarts the timer..
|
||||
/// Looks up a localized string similar to Immediately shows the repeat message on a certain index and restarts its timer..
|
||||
/// </summary>
|
||||
public static string repeatinvoke_desc {
|
||||
get {
|
||||
@ -5748,7 +5748,7 @@ namespace NadekoBot.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to `{0}repinv`.
|
||||
/// Looks up a localized string similar to `{0}repinv 1`.
|
||||
/// </summary>
|
||||
public static string repeatinvoke_usage {
|
||||
get {
|
||||
@ -5756,6 +5756,33 @@ namespace NadekoBot.Resources {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to repeatlist replst.
|
||||
/// </summary>
|
||||
public static string repeatlist_cmd {
|
||||
get {
|
||||
return ResourceManager.GetString("repeatlist_cmd", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Shows currently repeating messages and their indexes..
|
||||
/// </summary>
|
||||
public static string repeatlist_desc {
|
||||
get {
|
||||
return ResourceManager.GetString("repeatlist_desc", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to `{0}repeatlist`.
|
||||
/// </summary>
|
||||
public static string repeatlist_usage {
|
||||
get {
|
||||
return ResourceManager.GetString("repeatlist_usage", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to rpeatplaylst rpl.
|
||||
/// </summary>
|
||||
@ -5783,6 +5810,33 @@ namespace NadekoBot.Resources {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to repeatremove reprm.
|
||||
/// </summary>
|
||||
public static string repeatremove_cmd {
|
||||
get {
|
||||
return ResourceManager.GetString("repeatremove_cmd", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Removes a repeating message on a specified index. Use `{0}repeatlist` to see indexes..
|
||||
/// </summary>
|
||||
public static string repeatremove_desc {
|
||||
get {
|
||||
return ResourceManager.GetString("repeatremove_desc", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to `{0}reprm 2`.
|
||||
/// </summary>
|
||||
public static string repeatremove_usage {
|
||||
get {
|
||||
return ResourceManager.GetString("repeatremove_usage", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to reptcursong rcs.
|
||||
/// </summary>
|
||||
|
@ -265,16 +265,16 @@
|
||||
<value>repeatinvoke repinv</value>
|
||||
</data>
|
||||
<data name="repeatinvoke_desc" xml:space="preserve">
|
||||
<value>Immediately shows the repeat message and restarts the timer.</value>
|
||||
<value>Immediately shows the repeat message on a certain index and restarts its timer.</value>
|
||||
</data>
|
||||
<data name="repeatinvoke_usage" xml:space="preserve">
|
||||
<value>`{0}repinv`</value>
|
||||
<value>`{0}repinv 1`</value>
|
||||
</data>
|
||||
<data name="repeat_cmd" xml:space="preserve">
|
||||
<value>repeat</value>
|
||||
</data>
|
||||
<data name="repeat_desc" xml:space="preserve">
|
||||
<value>Repeat a message every X minutes. If no parameters are specified, repeat is disabled.</value>
|
||||
<value>Repeat a message every X minutes in the current channel.</value>
|
||||
</data>
|
||||
<data name="repeat_usage" xml:space="preserve">
|
||||
<value>`{0}repeat 5 Hello there`</value>
|
||||
@ -2889,4 +2889,22 @@
|
||||
<data name="pollstats_usage" xml:space="preserve">
|
||||
<value>`{0}pollstats`</value>
|
||||
</data>
|
||||
<data name="repeatlist_cmd" xml:space="preserve">
|
||||
<value>repeatlist replst</value>
|
||||
</data>
|
||||
<data name="repeatlist_desc" xml:space="preserve">
|
||||
<value>Shows currently repeating messages and their indexes.</value>
|
||||
</data>
|
||||
<data name="repeatlist_usage" xml:space="preserve">
|
||||
<value>`{0}repeatlist`</value>
|
||||
</data>
|
||||
<data name="repeatremove_cmd" xml:space="preserve">
|
||||
<value>repeatremove reprm</value>
|
||||
</data>
|
||||
<data name="repeatremove_desc" xml:space="preserve">
|
||||
<value>Removes a repeating message on a specified index. Use `{0}repeatlist` to see indexes.</value>
|
||||
</data>
|
||||
<data name="repeatremove_usage" xml:space="preserve">
|
||||
<value>`{0}reprm 2`</value>
|
||||
</data>
|
||||
</root>
|
@ -58,6 +58,7 @@ namespace NadekoBot.Services.Database.Models
|
||||
|
||||
public string MuteRoleName { get; set; }
|
||||
public bool CleverbotEnabled { get; set; }
|
||||
public HashSet<Repeater> GuildRepeaters { get; set; }
|
||||
}
|
||||
|
||||
public class FilterChannelId : DbEntity
|
||||
|
Loading…
Reference in New Issue
Block a user