ratelimited done, closes #45
This commit is contained in:
parent
ed0fc7fd9d
commit
707418fc46
53
NadekoBot/Commands/RatelimitCommand.cs
Normal file
53
NadekoBot/Commands/RatelimitCommand.cs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using Discord.Commands;
|
||||||
|
|
||||||
|
namespace NadekoBot.Commands {
|
||||||
|
internal class RatelimitCommand : IDiscordCommand {
|
||||||
|
|
||||||
|
public static ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, DateTime>> RatelimitingChannels = new ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, DateTime>>();
|
||||||
|
|
||||||
|
private static readonly TimeSpan ratelimitTime = new TimeSpan(0, 0, 0, 5);
|
||||||
|
|
||||||
|
public RatelimitCommand() {
|
||||||
|
NadekoBot.Client.MessageReceived += async (s, e) => {
|
||||||
|
if (e.Channel.IsPrivate)
|
||||||
|
return;
|
||||||
|
ConcurrentDictionary<ulong, DateTime> userTimePair;
|
||||||
|
if (!RatelimitingChannels.TryGetValue(e.Channel.Id, out userTimePair)) return;
|
||||||
|
DateTime lastMessageTime;
|
||||||
|
if (userTimePair.TryGetValue(e.User.Id, out lastMessageTime)) {
|
||||||
|
if (DateTime.Now - lastMessageTime < ratelimitTime) {
|
||||||
|
try {
|
||||||
|
await e.Message.Delete();
|
||||||
|
} catch { }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
userTimePair.AddOrUpdate(e.User.Id, id => DateTime.Now, (id, dt) => DateTime.Now);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Init(CommandGroupBuilder cgb) {
|
||||||
|
cgb.CreateCommand(".slowmode")
|
||||||
|
.Description("Toggles slow mode. When ON, users will be able to send only 1 message every 5 seconds.")
|
||||||
|
.Parameter("minutes", ParameterType.Optional)
|
||||||
|
.Do(async e => {
|
||||||
|
//var minutesStr = e.GetArg("minutes");
|
||||||
|
//if (string.IsNullOrWhiteSpace(minutesStr)) {
|
||||||
|
// RatelimitingChannels.Remove(e.Channel.Id);
|
||||||
|
// return;
|
||||||
|
//}
|
||||||
|
ConcurrentDictionary<ulong, DateTime> throwaway;
|
||||||
|
if (RatelimitingChannels.TryRemove(e.Channel.Id, out throwaway)) {
|
||||||
|
await e.Channel.SendMessage("Slow mode disabled.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (RatelimitingChannels.TryAdd(e.Channel.Id, new ConcurrentDictionary<ulong, DateTime>())) {
|
||||||
|
await e.Channel.SendMessage("Slow mode initiated. " +
|
||||||
|
"Users can't send more than 1 message every 5 seconds.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,6 +18,7 @@ namespace NadekoBot.Modules {
|
|||||||
commands.Add(new ServerGreetCommand());
|
commands.Add(new ServerGreetCommand());
|
||||||
commands.Add(new LogCommand());
|
commands.Add(new LogCommand());
|
||||||
commands.Add(new PlayingRotate());
|
commands.Add(new PlayingRotate());
|
||||||
|
commands.Add(new Commands.RatelimitCommand());
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string Prefix { get; } = ".";
|
public override string Prefix { get; } = ".";
|
||||||
|
@ -171,6 +171,7 @@
|
|||||||
<Compile Include="Commands\PollCommand.cs" />
|
<Compile Include="Commands\PollCommand.cs" />
|
||||||
<Compile Include="Modules\NSFW.cs" />
|
<Compile Include="Modules\NSFW.cs" />
|
||||||
<Compile Include="Modules\Permissions.cs" />
|
<Compile Include="Modules\Permissions.cs" />
|
||||||
|
<Compile Include="Commands\RatelimitCommand.cs" />
|
||||||
<Compile Include="Modules\Searches.cs" />
|
<Compile Include="Modules\Searches.cs" />
|
||||||
<Compile Include="Modules\Trello.cs" />
|
<Compile Include="Modules\Trello.cs" />
|
||||||
<Compile Include="NadekoBot.cs" />
|
<Compile Include="NadekoBot.cs" />
|
||||||
|
Loading…
Reference in New Issue
Block a user