.repeat, .repinv, .replst, .reprm added/improved
This commit is contained in:
parent
00978c293c
commit
a48fdd1fdc
@ -1,14 +1,18 @@
|
|||||||
using Discord;
|
using Discord;
|
||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using NadekoBot.Attributes;
|
using NadekoBot.Attributes;
|
||||||
using NadekoBot.Extensions;
|
using NadekoBot.Extensions;
|
||||||
using NadekoBot.Services;
|
using NadekoBot.Services;
|
||||||
|
using NadekoBot.Services.Database;
|
||||||
using NadekoBot.Services.Database.Models;
|
using NadekoBot.Services.Database.Models;
|
||||||
using NLog;
|
using NLog;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@ -19,7 +23,8 @@ namespace NadekoBot.Modules.Administration
|
|||||||
[Group]
|
[Group]
|
||||||
public class RepeatCommands : ModuleBase
|
public class RepeatCommands : ModuleBase
|
||||||
{
|
{
|
||||||
public static ConcurrentDictionary<ulong, RepeatRunner> repeaters { get; }
|
//guildid/RepeatRunners
|
||||||
|
public static ConcurrentDictionary<ulong, ConcurrentQueue<RepeatRunner>> repeaters { get; }
|
||||||
|
|
||||||
public class RepeatRunner
|
public class RepeatRunner
|
||||||
{
|
{
|
||||||
@ -83,7 +88,10 @@ namespace NadekoBot.Modules.Administration
|
|||||||
var sw = Stopwatch.StartNew();
|
var sw = Stopwatch.StartNew();
|
||||||
using (var uow = DbHandler.UnitOfWork())
|
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();
|
sw.Stop();
|
||||||
@ -93,41 +101,70 @@ namespace NadekoBot.Modules.Administration
|
|||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
[RequireContext(ContextType.Guild)]
|
[RequireContext(ContextType.Guild)]
|
||||||
[RequireUserPermission(GuildPermission.ManageMessages)]
|
[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))
|
if (!repeaters.TryGetValue(Context.Channel.Id, out rep))
|
||||||
{
|
{
|
||||||
await Context.Channel.SendErrorAsync("ℹ️ **No repeating message found on this server.**").ConfigureAwait(false);
|
await Context.Channel.SendErrorAsync("ℹ️ **No repeating message found on this server.**").ConfigureAwait(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
rep.Reset();
|
|
||||||
await Context.Channel.SendMessageAsync("🔄 " + rep.Repeater.Message).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
var repList = rep.ToList();
|
||||||
[RequireContext(ContextType.Guild)]
|
|
||||||
[RequireUserPermission(GuildPermission.ManageMessages)]
|
if (index >= repList.Count)
|
||||||
public async Task Repeat()
|
|
||||||
{
|
|
||||||
RepeatRunner rep;
|
|
||||||
if (repeaters.TryRemove(Context.Channel.Id, out rep))
|
|
||||||
{
|
{
|
||||||
using (var uow = DbHandler.UnitOfWork())
|
await Context.Channel.SendErrorAsync("Index out of range.").ConfigureAwait(false);
|
||||||
{
|
return;
|
||||||
uow.Repeaters.Remove(rep.Repeater);
|
|
||||||
await uow.CompleteAsync();
|
|
||||||
}
|
|
||||||
rep.Stop();
|
|
||||||
await Context.Channel.SendConfirmAsync("✅ **Stopped repeating a message.**").ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
else
|
var repeater = repList[index].Repeater;
|
||||||
await Context.Channel.SendConfirmAsync("ℹ️ **No message is repeating.**").ConfigureAwait(false);
|
|
||||||
|
await Context.Channel.SendMessageAsync("🔄 " + repeater.Message).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
[RequireContext(ContextType.Guild)]
|
[RequireContext(ContextType.Guild)]
|
||||||
[RequireUserPermission(GuildPermission.ManageMessages)]
|
[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)
|
public async Task Repeat(int minutes, [Remainder] string message)
|
||||||
{
|
{
|
||||||
if (minutes < 1 || minutes > 10080)
|
if (minutes < 1 || minutes > 10080)
|
||||||
@ -136,38 +173,52 @@ namespace NadekoBot.Modules.Administration
|
|||||||
if (string.IsNullOrWhiteSpace(message))
|
if (string.IsNullOrWhiteSpace(message))
|
||||||
return;
|
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())
|
old.Enqueue(rep);
|
||||||
{
|
|
||||||
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();
|
|
||||||
return old;
|
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);
|
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>
|
/// <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>
|
/// </summary>
|
||||||
public static string repeat_desc {
|
public static string repeat_desc {
|
||||||
get {
|
get {
|
||||||
@ -5739,7 +5739,7 @@ namespace NadekoBot.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <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>
|
/// </summary>
|
||||||
public static string repeatinvoke_desc {
|
public static string repeatinvoke_desc {
|
||||||
get {
|
get {
|
||||||
@ -5748,7 +5748,7 @@ namespace NadekoBot.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to `{0}repinv`.
|
/// Looks up a localized string similar to `{0}repinv 1`.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string repeatinvoke_usage {
|
public static string repeatinvoke_usage {
|
||||||
get {
|
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>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to rpeatplaylst rpl.
|
/// Looks up a localized string similar to rpeatplaylst rpl.
|
||||||
/// </summary>
|
/// </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>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to reptcursong rcs.
|
/// Looks up a localized string similar to reptcursong rcs.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -265,16 +265,16 @@
|
|||||||
<value>repeatinvoke repinv</value>
|
<value>repeatinvoke repinv</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="repeatinvoke_desc" xml:space="preserve">
|
<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>
|
||||||
<data name="repeatinvoke_usage" xml:space="preserve">
|
<data name="repeatinvoke_usage" xml:space="preserve">
|
||||||
<value>`{0}repinv`</value>
|
<value>`{0}repinv 1`</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="repeat_cmd" xml:space="preserve">
|
<data name="repeat_cmd" xml:space="preserve">
|
||||||
<value>repeat</value>
|
<value>repeat</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="repeat_desc" xml:space="preserve">
|
<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>
|
||||||
<data name="repeat_usage" xml:space="preserve">
|
<data name="repeat_usage" xml:space="preserve">
|
||||||
<value>`{0}repeat 5 Hello there`</value>
|
<value>`{0}repeat 5 Hello there`</value>
|
||||||
@ -2889,4 +2889,22 @@
|
|||||||
<data name="pollstats_usage" xml:space="preserve">
|
<data name="pollstats_usage" xml:space="preserve">
|
||||||
<value>`{0}pollstats`</value>
|
<value>`{0}pollstats`</value>
|
||||||
</data>
|
</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>
|
</root>
|
@ -58,6 +58,7 @@ namespace NadekoBot.Services.Database.Models
|
|||||||
|
|
||||||
public string MuteRoleName { get; set; }
|
public string MuteRoleName { get; set; }
|
||||||
public bool CleverbotEnabled { get; set; }
|
public bool CleverbotEnabled { get; set; }
|
||||||
|
public HashSet<Repeater> GuildRepeaters { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class FilterChannelId : DbEntity
|
public class FilterChannelId : DbEntity
|
||||||
|
Loading…
Reference in New Issue
Block a user