Added default stuff to db. Added NadekoRandom class. Cleanup.

This commit is contained in:
Kwoth 2016-09-10 21:40:25 +02:00
parent 92c98545e3
commit 5d08e0f14c
28 changed files with 371 additions and 359 deletions

View File

@ -0,0 +1,52 @@
using Discord.Commands;
using NadekoBot.Services;
using NadekoBot.Services.Database;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace NadekoBot.Attributes
{
[System.AttributeUsage(AttributeTargets.Class)]
sealed class NadekoModuleAttribute : ModuleAttribute
{
//modulename / prefix
private static Dictionary<string, string> modulePrefixes = null;
public static Dictionary<string, string> ModulePrefixes {
get {
if (modulePrefixes != null)
return modulePrefixes;
using (var uow = DbHandler.UnitOfWork())
{
return (modulePrefixes = uow.BotConfig
.GetOrCreate()
.ModulePrefixes
.ToDictionary(p => p.ModuleName, p => p.Prefix));
}
}
}
public NadekoModuleAttribute(string moduleName, string defaultPrefix) : base(GetModulePrefix(moduleName) ?? defaultPrefix)
{
AppendSpace = false;
}
private static string GetModulePrefix(string moduleName)
{
string prefix;
if (ModulePrefixes.TryGetValue(moduleName, out prefix))
{
Console.WriteLine("Cache hit");
return prefix;
}
Console.WriteLine("Cache not hit for " + moduleName);
return null;
}
}
}

View File

@ -8,7 +8,7 @@ using NadekoBot.Services.Database.Impl;
namespace NadekoBot.Migrations namespace NadekoBot.Migrations
{ {
[DbContext(typeof(NadekoSqliteContext))] [DbContext(typeof(NadekoSqliteContext))]
[Migration("20160908202817_first")] [Migration("20160910180231_first")]
partial class first partial class first
{ {
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -173,7 +173,7 @@ namespace NadekoBot.Migrations
b.HasIndex("BotConfigId"); b.HasIndex("BotConfigId");
b.ToTable("EightBallResponse"); b.ToTable("EightBallResponses");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b =>
@ -336,7 +336,7 @@ namespace NadekoBot.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd();
b.Property<int?>("BotConfigId"); b.Property<int>("BotConfigId");
b.Property<string>("ModuleName"); b.Property<string>("ModuleName");
@ -346,7 +346,7 @@ namespace NadekoBot.Migrations
b.HasIndex("BotConfigId"); b.HasIndex("BotConfigId");
b.ToTable("ModulePrefix"); b.ToTable("ModulePrefixes");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b =>
@ -403,7 +403,7 @@ namespace NadekoBot.Migrations
b.HasIndex("BotConfigId"); b.HasIndex("BotConfigId");
b.ToTable("RaceAnimal"); b.ToTable("RaceAnimals");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b =>
@ -532,9 +532,10 @@ namespace NadekoBot.Migrations
modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b =>
{ {
b.HasOne("NadekoBot.Services.Database.Models.BotConfig") b.HasOne("NadekoBot.Services.Database.Models.BotConfig", "BotConfig")
.WithMany("ModulePrefixes") .WithMany("ModulePrefixes")
.HasForeignKey("BotConfigId"); .HasForeignKey("BotConfigId")
.OnDelete(DeleteBehavior.Cascade);
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b =>

View File

@ -222,7 +222,7 @@ namespace NadekoBot.Migrations
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "EightBallResponse", name: "EightBallResponses",
columns: table => new columns: table => new
{ {
Id = table.Column<int>(nullable: false) Id = table.Column<int>(nullable: false)
@ -232,9 +232,9 @@ namespace NadekoBot.Migrations
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_EightBallResponse", x => x.Id); table.PrimaryKey("PK_EightBallResponses", x => x.Id);
table.ForeignKey( table.ForeignKey(
name: "FK_EightBallResponse_BotConfig_BotConfigId", name: "FK_EightBallResponses_BotConfig_BotConfigId",
column: x => x.BotConfigId, column: x => x.BotConfigId,
principalTable: "BotConfig", principalTable: "BotConfig",
principalColumn: "Id", principalColumn: "Id",
@ -242,24 +242,24 @@ namespace NadekoBot.Migrations
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "ModulePrefix", name: "ModulePrefixes",
columns: table => new columns: table => new
{ {
Id = table.Column<int>(nullable: false) Id = table.Column<int>(nullable: false)
.Annotation("Autoincrement", true), .Annotation("Autoincrement", true),
BotConfigId = table.Column<int>(nullable: true), BotConfigId = table.Column<int>(nullable: false),
ModuleName = table.Column<string>(nullable: true), ModuleName = table.Column<string>(nullable: true),
Prefix = table.Column<string>(nullable: true) Prefix = table.Column<string>(nullable: true)
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_ModulePrefix", x => x.Id); table.PrimaryKey("PK_ModulePrefixes", x => x.Id);
table.ForeignKey( table.ForeignKey(
name: "FK_ModulePrefix_BotConfig_BotConfigId", name: "FK_ModulePrefixes_BotConfig_BotConfigId",
column: x => x.BotConfigId, column: x => x.BotConfigId,
principalTable: "BotConfig", principalTable: "BotConfig",
principalColumn: "Id", principalColumn: "Id",
onDelete: ReferentialAction.Restrict); onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
@ -283,7 +283,7 @@ namespace NadekoBot.Migrations
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "RaceAnimal", name: "RaceAnimals",
columns: table => new columns: table => new
{ {
Id = table.Column<int>(nullable: false) Id = table.Column<int>(nullable: false)
@ -294,9 +294,9 @@ namespace NadekoBot.Migrations
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_RaceAnimal", x => x.Id); table.PrimaryKey("PK_RaceAnimals", x => x.Id);
table.ForeignKey( table.ForeignKey(
name: "FK_RaceAnimal_BotConfig_BotConfigId", name: "FK_RaceAnimals_BotConfig_BotConfigId",
column: x => x.BotConfigId, column: x => x.BotConfigId,
principalTable: "BotConfig", principalTable: "BotConfig",
principalColumn: "Id", principalColumn: "Id",
@ -451,8 +451,8 @@ namespace NadekoBot.Migrations
unique: true); unique: true);
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_EightBallResponse_BotConfigId", name: "IX_EightBallResponses_BotConfigId",
table: "EightBallResponse", table: "EightBallResponses",
column: "BotConfigId"); column: "BotConfigId");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
@ -482,8 +482,8 @@ namespace NadekoBot.Migrations
column: "LogSettingId"); column: "LogSettingId");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_ModulePrefix_BotConfigId", name: "IX_ModulePrefixes_BotConfigId",
table: "ModulePrefix", table: "ModulePrefixes",
column: "BotConfigId"); column: "BotConfigId");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
@ -492,8 +492,8 @@ namespace NadekoBot.Migrations
column: "BotConfigId"); column: "BotConfigId");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_RaceAnimal_BotConfigId", name: "IX_RaceAnimals_BotConfigId",
table: "RaceAnimal", table: "RaceAnimals",
column: "BotConfigId"); column: "BotConfigId");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
@ -527,7 +527,7 @@ namespace NadekoBot.Migrations
name: "Donators"); name: "Donators");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "EightBallResponse"); name: "EightBallResponses");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "FollowedStream"); name: "FollowedStream");
@ -539,7 +539,7 @@ namespace NadekoBot.Migrations
name: "IgnoredVoicePresenceCHannels"); name: "IgnoredVoicePresenceCHannels");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "ModulePrefix"); name: "ModulePrefixes");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "PlayingStatus"); name: "PlayingStatus");
@ -548,7 +548,7 @@ namespace NadekoBot.Migrations
name: "Quotes"); name: "Quotes");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "RaceAnimal"); name: "RaceAnimals");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Reminders"); name: "Reminders");

View File

@ -172,7 +172,7 @@ namespace NadekoBot.Migrations
b.HasIndex("BotConfigId"); b.HasIndex("BotConfigId");
b.ToTable("EightBallResponse"); b.ToTable("EightBallResponses");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b =>
@ -335,7 +335,7 @@ namespace NadekoBot.Migrations
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd();
b.Property<int?>("BotConfigId"); b.Property<int>("BotConfigId");
b.Property<string>("ModuleName"); b.Property<string>("ModuleName");
@ -345,7 +345,7 @@ namespace NadekoBot.Migrations
b.HasIndex("BotConfigId"); b.HasIndex("BotConfigId");
b.ToTable("ModulePrefix"); b.ToTable("ModulePrefixes");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b =>
@ -402,7 +402,7 @@ namespace NadekoBot.Migrations
b.HasIndex("BotConfigId"); b.HasIndex("BotConfigId");
b.ToTable("RaceAnimal"); b.ToTable("RaceAnimals");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b =>
@ -531,9 +531,10 @@ namespace NadekoBot.Migrations
modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b =>
{ {
b.HasOne("NadekoBot.Services.Database.Models.BotConfig") b.HasOne("NadekoBot.Services.Database.Models.BotConfig", "BotConfig")
.WithMany("ModulePrefixes") .WithMany("ModulePrefixes")
.HasForeignKey("BotConfigId"); .HasForeignKey("BotConfigId")
.OnDelete(DeleteBehavior.Cascade);
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b =>

View File

@ -61,7 +61,7 @@ namespace NadekoBot.Modules.Administration
//public async Task Scsc(IUserMessage msg) //public async Task Scsc(IUserMessage msg)
//{ //{
// var channel = (ITextChannel)msg.Channel; // var channel = (ITextChannel)msg.Channel;
// var token = new Random().Next(); // var token = new NadekoRandom().Next();
// var set = new HashSet<ITextChannel>(); // var set = new HashSet<ITextChannel>();
// if (Subscribers.TryAdd(token, set)) // if (Subscribers.TryAdd(token, set))
// { // {

View File

@ -1,220 +0,0 @@
//using Discord;
//using Discord.Commands;
//using NadekoBot.Classes;
//using NadekoBot.Extensions;
//using NadekoBot.Modules.Permissions.Classes;
//using System;
//using System.Collections.Concurrent;
//using System.Collections.Generic;
//using System.Linq;
//using System.Threading.Tasks;
////todo DB
////todo Add flags for every event
//namespace NadekoBot.Modules.Administration
//{
// public class LogCommand : DiscordCommand
// {
// private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
// private ConcurrentBag<KeyValuePair<Channel, string>> voicePresenceUpdates = new ConcurrentBag<KeyValuePair<Channel, string>>();
// public LogCommand(DiscordModule module) : base(module)
// {
// NadekoBot.Client.MessageReceived += MsgRecivd;
// NadekoBot.Client.MessageDeleted += MsgDltd;
// NadekoBot.Client.MessageUpdated += MsgUpdtd;
// NadekoBot.Client.UserUpdated += UsrUpdtd;
// NadekoBot.Client.UserBanned += UsrBanned;
// NadekoBot.Client.UserLeft += UsrLeft;
// NadekoBot.Client.UserJoined += UsrJoined;
// NadekoBot.Client.UserUnbanned += UsrUnbanned;
// NadekoBot.Client.ChannelCreated += ChannelCreated;
// NadekoBot.Client.ChannelDestroyed += ChannelDestroyed;
// NadekoBot.Client.ChannelUpdated += ChannelUpdated;
// // start the userpresence queue
// private async void MsgRecivd(object sender, MessageEventArgs e)
// {
// try
// {
// if (e.Server == null || e.Channel.IsPrivate || umsg.Author.Id == NadekoBot.Client.CurrentUser.Id)
// return;
// var config = SpecificConfigurations.Default.Of(e.Server.Id);
// var chId = config.LogServerChannel;
// if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
// return;
// Channel ch;
// if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
// return;
// if (!string.IsNullOrWhiteSpace(e.Message.Text))
// {
// await ch.SendMessageAsync(
// $@"🕔`{prettyCurrentTime}` **New Message** `#{e.Channel.Name}`
//👤`{umsg.Author?.ToString() ?? ("NULL")}` {e.Message.Text.Unmention()}").ConfigureAwait(false);
// }
// else
// {
// await ch.SendMessageAsync(
// $@"🕔`{prettyCurrentTime}` **File Uploaded** `#{e.Channel.Name}`
//👤`{umsg.Author?.ToString() ?? ("NULL")}` {e.Message.Attachments.FirstOrDefault()?.ProxyUrl}").ConfigureAwait(false);
// }
// }
// catch { }
// private async void UsrUpdtd(object sender, UserUpdatedEventArgs e)
// {
// try
// {
// var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
// if (chId == null)
// return;
// Channel ch;
// if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
// return;
// string str = $"🕔`{prettyCurrentTime}`";
// if (e.Before.Name != e.After.Name)
// str += $"**Name Changed**👤`{e.Before?.ToString()}`\n\t\t`New:`{e.After.ToString()}`";
// else if (e.Before.Nickname != e.After.Nickname)
// str += $"**Nickname Changed**👤`{e.Before?.ToString()}`\n\t\t`Old:` {e.Before.Nickname}#{e.Before.Discriminator}\n\t\t`New:` {e.After.Nickname}#{e.After.Discriminator}";
// else if (e.Before.AvatarUrl != e.After.AvatarUrl)
// str += $"**Avatar Changed**👤`{e.Before?.ToString()}`\n\t {await e.Before.AvatarUrl.ShortenUrl()} `=>` {await e.After.AvatarUrl.ShortenUrl()}";
// else if (!e.Before.Roles.SequenceEqual(e.After.Roles))
// {
// if (e.Before.Roles.Count() < e.After.Roles.Count())
// {
// var diffRoles = e.After.Roles.Where(r => !e.Before.Roles.Contains(r)).Select(r => "`" + r.Name + "`");
// str += $"**User's Roles changed ⚔➕**👤`{e.Before?.ToString()}`\n\tNow has {string.Join(", ", diffRoles)} role.";
// }
// else if (e.Before.Roles.Count() > e.After.Roles.Count())
// {
// var diffRoles = e.Before.Roles.Where(r => !e.After.Roles.Contains(r)).Select(r => "`" + r.Name + "`");
// str += $"**User's Roles changed ⚔➖**👤`{e.Before?.ToString()}`\n\tNo longer has {string.Join(", ", diffRoles)} role.";
// }
// else
// {
// Console.WriteLine("SEQUENCE NOT EQUAL BUT NO DIFF ROLES - REPORT TO KWOTH on #NADEKOLOG server");
// return;
// }
// }
// else
// return;
// await ch.SendMessageAsync(str).ConfigureAwait(false);
// }
// catch { }
// }
// public override void Init(CommandGroupBuilder cgb)
// {
// cgb.CreateCommand(Module.Prefix + "spmom")
// .Description($"Toggles whether mentions of other offline users on your server will send a pm to them. **Needs Manage Server Permissions.**| `{Prefix}spmom`")
// .AddCheck(SimpleCheckers.ManageServer())
// .Do(async e =>
// {
// var specificConfig = SpecificConfigurations.Default.Of(e.Server.Id);
// specificConfig.SendPrivateMessageOnMention =
// !specificConfig.SendPrivateMessageOnMention;
// if (specificConfig.SendPrivateMessageOnMention)
// await channel.SendMessageAsync(":ok: I will send private messages " +
// "to mentioned offline users.").ConfigureAwait(false);
// else
// await channel.SendMessageAsync(":ok: I won't send private messages " +
// "to mentioned offline users anymore.").ConfigureAwait(false);
// });
// cgb.CreateCommand(Module.Prefix + "logserver")
// .Description($"Toggles logging in this channel. Logs every message sent/deleted/edited on the server. **Bot Owner Only!** | `{Prefix}logserver`")
// .AddCheck(SimpleCheckers.OwnerOnly())
// .AddCheck(SimpleCheckers.ManageServer())
// .Do(async e =>
// {
// var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
// if (chId == null)
// {
// SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = e.Channel.Id;
// await channel.SendMessageAsync($"❗**I WILL BEGIN LOGGING SERVER ACTIVITY IN THIS CHANNEL**❗").ConfigureAwait(false);
// return;
// }
// Channel ch;
// if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
// return;
// SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = null;
// await channel.SendMessageAsync($"❗**NO LONGER LOGGING IN {ch.Mention} CHANNEL**❗").ConfigureAwait(false);
// });
// cgb.CreateCommand(Prefix + "logignore")
// .Description($"Toggles whether the {Prefix}logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. **Bot Owner Only!**| `{Prefix}logignore`")
// .AddCheck(SimpleCheckers.OwnerOnly())
// .AddCheck(SimpleCheckers.ManageServer())
// .Do(async e =>
// {
// var config = SpecificConfigurations.Default.Of(e.Server.Id);
// if (config.LogserverIgnoreChannels.Remove(e.Channel.Id))
// {
// await channel.SendMessageAsync($"`{Prefix}logserver will stop ignoring this channel.`");
// }
// else
// {
// config.LogserverIgnoreChannels.Add(e.Channel.Id);
// await channel.SendMessageAsync($"`{Prefix}logserver will ignore this channel.`");
// }
// });
// cgb.CreateCommand(Module.Prefix + "userpresence")
// .Description($"Starts logging to this channel when someone from the server goes online/offline/idle. **Needs Manage Server Permissions.**| `{Prefix}userpresence`")
// .AddCheck(SimpleCheckers.ManageServer())
// .Do(async e =>
// {
// var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel;
// if (chId == null)
// {
// SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel = e.Channel.Id;
// await channel.SendMessageAsync($"**User presence notifications enabled.**").ConfigureAwait(false);
// return;
// }
// SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel = null;
// await channel.SendMessageAsync($"**User presence notifications disabled.**").ConfigureAwait(false);
// });
// cgb.CreateCommand(Module.Prefix + "voicepresence")
// .Description($"Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. **Needs Manage Server Permissions.**| `{Prefix}voicerpresence`")
// .Parameter("all", ParameterType.Optional)
// .AddCheck(SimpleCheckers.ManageServer())
// .Do(async e =>
// {
// var config = SpecificConfigurations.Default.Of(e.Server.Id);
// if (all?.ToLower() == "all")
// {
// foreach (var voiceChannel in e.Server.VoiceChannels)
// {
// config.VoiceChannelLog.TryAdd(voiceChannel.Id, e.Channel.Id);
// }
// await channel.SendMessageAsync("Started logging user presence for **ALL** voice channels!").ConfigureAwait(false);
// return;
// }
// if (umsg.Author.VoiceChannel == null)
// {
// await channel.SendMessageAsync("💢 You are not in a voice channel right now. If you are, please rejoin it.").ConfigureAwait(false);
// return;
// }
// ulong throwaway;
// if (!config.VoiceChannelLog.TryRemove(umsg.Author.VoiceChannel.Id, out throwaway))
// {
// config.VoiceChannelLog.TryAdd(umsg.Author.VoiceChannel.Id, e.Channel.Id);
// await channel.SendMessageAsync($"`Logging user updates for` {umsg.Author.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false);
// }
// else
// await channel.SendMessageAsync($"`Stopped logging user updates for` {umsg.Author.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false);
// });
// }
// }
//}

View File

@ -49,12 +49,14 @@ namespace NadekoBot.Modules.Administration
t = new Timer(async (state) => t = new Timer(async (state) =>
{ {
var keys = UserPresenceUpdates.Keys.ToList(); var keys = UserPresenceUpdates.Keys.ToList();
foreach (var key in keys)
await Task.WhenAll(keys.Select(key =>
{ {
List<string> messages; List<string> messages;
if (UserPresenceUpdates.TryRemove(key, out messages)) if (UserPresenceUpdates.TryRemove(key, out messages))
try { await key.SendMessageAsync(string.Join(Environment.NewLine, messages)); } catch { } //502/403 try { return key.SendMessageAsync(string.Join(Environment.NewLine, messages)); } catch { } //502/403
} return Task.CompletedTask;
}));
}, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10)); }, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));

View File

@ -130,7 +130,7 @@ namespace NadekoBot.Modules.Gambling
private async Task StartRace() private async Task StartRace()
{ {
var rng = new Random(); var rng = new NadekoRandom();
Participant winner = null; Participant winner = null;
IUserMessage msg = null; IUserMessage msg = null;
int place = 1; int place = 1;
@ -194,14 +194,15 @@ namespace NadekoBot.Modules.Gambling
} }
private async Task Client_MessageReceived(IMessage imsg) private Task Client_MessageReceived(IMessage imsg)
{ {
var msg = imsg as IUserMessage; var msg = imsg as IUserMessage;
if (msg == null) if (msg == null)
return; return Task.CompletedTask;
if (msg.IsAuthor() || !(imsg.Channel is ITextChannel) || imsg.Channel != raceChannel) if (msg.IsAuthor() || !(imsg.Channel is ITextChannel) || imsg.Channel != raceChannel)
return; return Task.CompletedTask;
messagesSinceGameStarted++; messagesSinceGameStarted++;
return Task.CompletedTask;
} }
private async Task CheckForFullGameAsync(CancellationToken cancelToken) private async Task CheckForFullGameAsync(CancellationToken cancelToken)

View File

@ -2,6 +2,7 @@ using Discord;
using Discord.Commands; using Discord.Commands;
using NadekoBot.Attributes; using NadekoBot.Attributes;
using NadekoBot.Extensions; using NadekoBot.Extensions;
using NadekoBot.Services;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -27,7 +28,7 @@ namespace NadekoBot.Modules.Gambling
private async Task publicRoll(IUserMessage umsg, string arg, bool ordered) private async Task publicRoll(IUserMessage umsg, string arg, bool ordered)
{ {
var channel = (ITextChannel)umsg.Channel; var channel = (ITextChannel)umsg.Channel;
var r = new Random(); var r = new NadekoRandom();
//if (string.IsNullOrWhiteSpace(arg)) //if (string.IsNullOrWhiteSpace(arg))
//{ //{
// var gen = r.Next(0, 101); // var gen = r.Next(0, 101);
@ -124,11 +125,11 @@ namespace NadekoBot.Modules.Gambling
.ToArray(); .ToArray();
if (arr[0] > arr[1]) if (arr[0] > arr[1])
throw new ArgumentException("First argument should be bigger than the second one."); throw new ArgumentException("First argument should be bigger than the second one.");
rolled = new Random().Next(arr[0], arr[1] + 1); rolled = new NadekoRandom().Next(arr[0], arr[1] + 1);
} }
else else
{ {
rolled = new Random().Next(0, int.Parse(range) + 1); rolled = new NadekoRandom().Next(0, int.Parse(range) + 1);
} }
await channel.SendMessageAsync($"{umsg.Author.Mention} rolled **{rolled}**.").ConfigureAwait(false); await channel.SendMessageAsync($"{umsg.Author.Mention} rolled **{rolled}**.").ConfigureAwait(false);

View File

@ -66,7 +66,7 @@ namespace NadekoBot.Modules.Gambling
// var isHeads = guessStr == "HEADS" || guessStr == "H"; // var isHeads = guessStr == "HEADS" || guessStr == "H";
// bool result = false; // bool result = false;
// var rng = new Random(); // var rng = new NadekoRandom();
// if (rng.Next(0, 2) == 1) // if (rng.Next(0, 2) == 1)
// { // {
// await channel.SendFileAsync("heads.png", Properties.Resources.heads.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false); // await channel.SendFileAsync("heads.png", Properties.Resources.heads.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false);

View File

@ -1,4 +1,6 @@
using System; using NadekoBot.Extensions;
using NadekoBot.Services;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -114,7 +116,7 @@ namespace NadekoBot.Modules.Gambling.Models
} }
} }
} }
private Random r = new Random(); private Random r = new NadekoRandom();
/// <summary> /// <summary>
/// Take a card from the pool, you either take it from the top if the deck is shuffled, or from a random place if the deck is in the default order. /// Take a card from the pool, you either take it from the top if the deck is shuffled, or from a random place if the deck is in the default order.
/// </summary> /// </summary>
@ -143,7 +145,7 @@ namespace NadekoBot.Modules.Gambling.Models
private void Shuffle() private void Shuffle()
{ {
if (cardPool.Count <= 1) return; if (cardPool.Count <= 1) return;
var orderedPool = cardPool.OrderBy(x => r.Next()); var orderedPool = cardPool.Shuffle();
cardPool = cardPool as List<Card> ?? orderedPool.ToList(); cardPool = cardPool as List<Card> ?? orderedPool.ToList();
} }
public override string ToString() => string.Concat(cardPool.Select(c => c.ToString())) + Environment.NewLine; public override string ToString() => string.Concat(cardPool.Select(c => c.ToString())) + Environment.NewLine;

View File

@ -43,7 +43,7 @@ namespace NadekoBot.Modules.Gambling
var members = role.Members().Where(u => u.Status == UserStatus.Online); var members = role.Members().Where(u => u.Status == UserStatus.Online);
var membersArray = members as IUser[] ?? members.ToArray(); var membersArray = members as IUser[] ?? members.ToArray();
var usr = membersArray[new Random().Next(0, membersArray.Length)]; var usr = membersArray[new NadekoRandom().Next(0, membersArray.Length)];
await channel.SendMessageAsync($"**Raffled user:** {usr.Username} (id: {usr.Id})").ConfigureAwait(false); await channel.SendMessageAsync($"**Raffled user:** {usr.Username} (id: {usr.Id})").ConfigureAwait(false);
} }
@ -147,7 +147,7 @@ namespace NadekoBot.Modules.Gambling
await CurrencyHandler.RemoveCurrencyAsync(guildUser, "Betroll Gamble", amount, false).ConfigureAwait(false); await CurrencyHandler.RemoveCurrencyAsync(guildUser, "Betroll Gamble", amount, false).ConfigureAwait(false);
var rng = new Random().Next(0, 101); var rng = new NadekoRandom().Next(0, 101);
var str = $"{guildUser.Mention} `You rolled {rng}.` "; var str = $"{guildUser.Mention} `You rolled {rng}.` ";
if (rng < 67) if (rng < 67)
{ {

View File

@ -44,7 +44,7 @@ namespace NadekoBot.Modules.Games
public PlantPickCommands() public PlantPickCommands()
{ {
NadekoBot.Client.MessageReceived += PotentialFlowerGeneration; NadekoBot.Client.MessageReceived += PotentialFlowerGeneration;
rng = new Random(); rng = new NadekoRandom();
using (var uow = DbHandler.UnitOfWork()) using (var uow = DbHandler.UnitOfWork())
{ {

View File

@ -100,11 +100,11 @@ namespace NadekoBot.Modules.Games.Trivia
ShouldStopGame = true; ShouldStopGame = true;
} }
private async Task PotentialGuess(IMessage imsg) private Task PotentialGuess(IMessage imsg)
{ {
var umsg = imsg as IUserMessage; var umsg = imsg as IUserMessage;
if (umsg == null) if (umsg == null)
return; return Task.CompletedTask;
var t = Task.Run(async () => var t = Task.Run(async () =>
{ {
try try
@ -135,6 +135,7 @@ namespace NadekoBot.Modules.Games.Trivia
} }
catch { } catch { }
}); });
return Task.CompletedTask;
} }
public string GetLeaderboard() public string GetLeaderboard()

View File

@ -1,4 +1,5 @@
using Newtonsoft.Json.Linq; using NadekoBot.Services;
using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
@ -11,7 +12,7 @@ namespace NadekoBot.Modules.Games.Trivia
public static TriviaQuestionPool Instance { get; } = new TriviaQuestionPool(); public static TriviaQuestionPool Instance { get; } = new TriviaQuestionPool();
public HashSet<TriviaQuestion> pool = new HashSet<TriviaQuestion>(); public HashSet<TriviaQuestion> pool = new HashSet<TriviaQuestion>();
private Random rng { get; } = new Random(); private Random rng { get; } = new NadekoRandom();
static TriviaQuestionPool() { } static TriviaQuestionPool() { }
@ -36,7 +37,7 @@ namespace NadekoBot.Modules.Games.Trivia
var tq = new TriviaQuestion(item["Question"].ToString(), item["Answer"].ToString(), item["Category"]?.ToString()); var tq = new TriviaQuestion(item["Question"].ToString(), item["Answer"].ToString(), item["Category"]?.ToString());
pool.Add(tq); pool.Add(tq);
} }
var r = new Random(); var r = new NadekoRandom();
pool = new HashSet<TriviaQuestion>(pool.OrderBy(x => r.Next())); pool = new HashSet<TriviaQuestion>(pool.OrderBy(x => r.Next()));
} }
} }

View File

@ -37,7 +37,7 @@ namespace NadekoBot.Modules.Games
var listArr = list.Split(';'); var listArr = list.Split(';');
if (listArr.Count() < 2) if (listArr.Count() < 2)
return; return;
var rng = new Random(); var rng = new NadekoRandom();
await channel.SendMessageAsync(listArr[rng.Next(0, listArr.Length)]).ConfigureAwait(false); await channel.SendMessageAsync(listArr[rng.Next(0, listArr.Length)]).ConfigureAwait(false);
} }
@ -49,7 +49,7 @@ namespace NadekoBot.Modules.Games
if (string.IsNullOrWhiteSpace(question)) if (string.IsNullOrWhiteSpace(question))
return; return;
var rng = new Random(); var rng = new NadekoRandom();
await channel.SendMessageAsync($@":question: `Question` __**{question}**__ await channel.SendMessageAsync($@":question: `Question` __**{question}**__
🎱 `8Ball Answers` __**{_8BallResponses.Shuffle().FirstOrDefault()}**__").ConfigureAwait(false); 🎱 `8Ball Answers` __**{_8BallResponses.Shuffle().FirstOrDefault()}**__").ConfigureAwait(false);
} }
@ -90,7 +90,7 @@ namespace NadekoBot.Modules.Games
default: default:
return; return;
} }
var nadekoPick = new Random().Next(0, 3); var nadekoPick = new NadekoRandom().Next(0, 3);
var msg = ""; var msg = "";
if (pick == nadekoPick) if (pick == nadekoPick)
msg = $"It's a draw! Both picked :{GetRPSPick(pick)}:"; msg = $"It's a draw! Both picked :{GetRPSPick(pick)}:";

View File

@ -37,41 +37,44 @@ namespace NadekoBot.Modules.Music
[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task Next(IUserMessage umsg) public Task Next(IUserMessage umsg)
{ {
var channel = (ITextChannel)umsg.Channel; var channel = (ITextChannel)umsg.Channel;
MusicPlayer musicPlayer; MusicPlayer musicPlayer;
if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) return; if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) return Task.CompletedTask;
if (musicPlayer.PlaybackVoiceChannel == ((IGuildUser)umsg.Author).VoiceChannel) if (musicPlayer.PlaybackVoiceChannel == ((IGuildUser)umsg.Author).VoiceChannel)
musicPlayer.Next(); musicPlayer.Next();
return Task.CompletedTask;
} }
[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task Stop(IUserMessage umsg) public Task Stop(IUserMessage umsg)
{ {
var channel = (ITextChannel)umsg.Channel; var channel = (ITextChannel)umsg.Channel;
MusicPlayer musicPlayer; MusicPlayer musicPlayer;
if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) return; if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) return Task.CompletedTask;
if (((IGuildUser)umsg.Author).VoiceChannel == musicPlayer.PlaybackVoiceChannel) if (((IGuildUser)umsg.Author).VoiceChannel == musicPlayer.PlaybackVoiceChannel)
{ {
musicPlayer.Autoplay = false; musicPlayer.Autoplay = false;
musicPlayer.Stop(); musicPlayer.Stop();
} }
return Task.CompletedTask;
} }
[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task Destroy(IUserMessage umsg) public Task Destroy(IUserMessage umsg)
{ {
var channel = (ITextChannel)umsg.Channel; var channel = (ITextChannel)umsg.Channel;
MusicPlayer musicPlayer; MusicPlayer musicPlayer;
if (!MusicPlayers.TryRemove(channel.Guild.Id, out musicPlayer)) return; if (!MusicPlayers.TryRemove(channel.Guild.Id, out musicPlayer)) return Task.CompletedTask;
if (((IGuildUser)umsg.Author).VoiceChannel == musicPlayer.PlaybackVoiceChannel) if (((IGuildUser)umsg.Author).VoiceChannel == musicPlayer.PlaybackVoiceChannel)
musicPlayer.Destroy(); musicPlayer.Destroy();
return Task.CompletedTask;
} }
[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
@ -204,28 +207,30 @@ namespace NadekoBot.Modules.Music
[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task Mute(IUserMessage umsg) public Task Mute(IUserMessage umsg)
{ {
var channel = (ITextChannel)umsg.Channel; var channel = (ITextChannel)umsg.Channel;
MusicPlayer musicPlayer; MusicPlayer musicPlayer;
if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer))
return; return Task.CompletedTask;
if (((IGuildUser)umsg.Author).VoiceChannel != musicPlayer.PlaybackVoiceChannel) if (((IGuildUser)umsg.Author).VoiceChannel != musicPlayer.PlaybackVoiceChannel)
return; return Task.CompletedTask;
musicPlayer.SetVolume(0); musicPlayer.SetVolume(0);
return Task.CompletedTask;
} }
[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task Max(IUserMessage umsg) public Task Max(IUserMessage umsg)
{ {
var channel = (ITextChannel)umsg.Channel; var channel = (ITextChannel)umsg.Channel;
MusicPlayer musicPlayer; MusicPlayer musicPlayer;
if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer))
return; return Task.CompletedTask;
if (((IGuildUser)umsg.Author).VoiceChannel != musicPlayer.PlaybackVoiceChannel) if (((IGuildUser)umsg.Author).VoiceChannel != musicPlayer.PlaybackVoiceChannel)
return; return Task.CompletedTask;
musicPlayer.SetVolume(100); musicPlayer.SetVolume(100);
return Task.CompletedTask;
} }
[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
@ -395,7 +400,7 @@ namespace NadekoBot.Modules.Music
var voiceChannel = ((IGuildUser)umsg.Author).VoiceChannel; var voiceChannel = ((IGuildUser)umsg.Author).VoiceChannel;
if (voiceChannel == null || voiceChannel.Guild != channel.Guild || !MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) if (voiceChannel == null || voiceChannel.Guild != channel.Guild || !MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer))
return; return;
musicPlayer.MoveToVoiceChannel(voiceChannel); await musicPlayer.MoveToVoiceChannel(voiceChannel);
} }
[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]

View File

@ -116,7 +116,7 @@ namespace NadekoBot.Modules.NSFW
JToken obj; JToken obj;
using (var http = new HttpClient()) using (var http = new HttpClient())
{ {
obj = JArray.Parse(await http.GetStringAsync($"http://api.oboobs.ru/boobs/{ new Random().Next(0, 9880) }").ConfigureAwait(false))[0]; obj = JArray.Parse(await http.GetStringAsync($"http://api.oboobs.ru/boobs/{ new NadekoRandom().Next(0, 9880) }").ConfigureAwait(false))[0];
} }
await channel.SendMessageAsync($"http://media.oboobs.ru/{ obj["preview"].ToString() }").ConfigureAwait(false); await channel.SendMessageAsync($"http://media.oboobs.ru/{ obj["preview"].ToString() }").ConfigureAwait(false);
} }
@ -137,7 +137,7 @@ namespace NadekoBot.Modules.NSFW
JToken obj; JToken obj;
using (var http = new HttpClient()) using (var http = new HttpClient())
{ {
obj = JArray.Parse(await http.GetStringAsync($"http://api.obutts.ru/butts/{ new Random().Next(0, 3873) }").ConfigureAwait(false))[0]; obj = JArray.Parse(await http.GetStringAsync($"http://api.obutts.ru/butts/{ new NadekoRandom().Next(0, 3873) }").ConfigureAwait(false))[0];
} }
await channel.SendMessageAsync($"http://media.obutts.ru/{ obj["preview"].ToString() }").ConfigureAwait(false); await channel.SendMessageAsync($"http://media.obutts.ru/{ obj["preview"].ToString() }").ConfigureAwait(false);
} }
@ -149,7 +149,7 @@ namespace NadekoBot.Modules.NSFW
public static async Task<string> GetDanbooruImageLink(string tag) public static async Task<string> GetDanbooruImageLink(string tag)
{ {
var rng = new Random(); var rng = new NadekoRandom();
if (tag == "loli") //loli doesn't work for some reason atm if (tag == "loli") //loli doesn't work for some reason atm
tag = "flat_chest"; tag = "flat_chest";
@ -181,7 +181,7 @@ namespace NadekoBot.Modules.NSFW
if (matches.Count == 0) if (matches.Count == 0)
return null; return null;
var rng = new Random(); var rng = new NadekoRandom();
var match = matches[rng.Next(0, matches.Count)]; var match = matches[rng.Next(0, matches.Count)];
return matches[rng.Next(0, matches.Count)].Groups["url"].Value; return matches[rng.Next(0, matches.Count)].Groups["url"].Value;
} }
@ -189,7 +189,7 @@ namespace NadekoBot.Modules.NSFW
public static async Task<string> GetRule34ImageLink(string tag) public static async Task<string> GetRule34ImageLink(string tag)
{ {
var rng = new Random(); var rng = new NadekoRandom();
var url = var url =
$"http://rule34.xxx/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; $"http://rule34.xxx/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}";
using (var http = new HttpClient()) using (var http = new HttpClient())

View File

@ -2,6 +2,7 @@
using Discord.Commands; using Discord.Commands;
using NadekoBot.Attributes; using NadekoBot.Attributes;
using NadekoBot.Modules.Searches.Models; using NadekoBot.Modules.Searches.Models;
using NadekoBot.Services;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using NLog; using NLog;
@ -86,7 +87,7 @@ namespace NadekoBot.Modules.Searches
if (!wowJokes.Any()) if (!wowJokes.Any())
{ {
} }
await channel.SendMessageAsync(wowJokes[new Random().Next(0, wowJokes.Count)].ToString()); await channel.SendMessageAsync(wowJokes[new NadekoRandom().Next(0, wowJokes.Count)].ToString());
} }
[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
@ -94,7 +95,7 @@ namespace NadekoBot.Modules.Searches
public async Task MagicItem(IUserMessage umsg) public async Task MagicItem(IUserMessage umsg)
{ {
var channel = (ITextChannel)umsg.Channel; var channel = (ITextChannel)umsg.Channel;
var rng = new Random(); var rng = new NadekoRandom();
var item = magicItems[rng.Next(0, magicItems.Count)].ToString(); var item = magicItems[rng.Next(0, magicItems.Count)].ToString();
await channel.SendMessageAsync(item).ConfigureAwait(false); await channel.SendMessageAsync(item).ConfigureAwait(false);

View File

@ -2,6 +2,7 @@
using Discord.Commands; using Discord.Commands;
using NadekoBot.Attributes; using NadekoBot.Attributes;
using NadekoBot.Extensions; using NadekoBot.Extensions;
using NadekoBot.Services;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -52,7 +53,7 @@ namespace NadekoBot.Modules.Searches
var dataList = data.Distinct(new ChampionNameComparer()).Take(showCount).ToList(); var dataList = data.Distinct(new ChampionNameComparer()).Take(showCount).ToList();
var sb = new StringBuilder(); var sb = new StringBuilder();
sb.AppendLine($"**Showing {dataList.Count} top banned champions.**"); sb.AppendLine($"**Showing {dataList.Count} top banned champions.**");
sb.AppendLine($"`{trashTalk[new Random().Next(0, trashTalk.Length)]}`"); sb.AppendLine($"`{trashTalk[new NadekoRandom().Next(0, trashTalk.Length)]}`");
for (var i = 0; i < dataList.Count; i++) for (var i = 0; i < dataList.Count; i++)
{ {
if (i % 2 == 0 && i != 0) if (i % 2 == 0 && i != 0)

View File

@ -152,7 +152,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】
{ {
using (var http = new HttpClient()) using (var http = new HttpClient())
{ {
var rng = new Random(); var rng = new NadekoRandom();
var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(query)}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&start={ rng.Next(1, 50) }&fields=items%2Flink&key={NadekoBot.Credentials.GoogleApiKey}"; var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(query)}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&start={ rng.Next(1, 50) }&fields=items%2Flink&key={NadekoBot.Credentials.GoogleApiKey}";
var obj = JObject.Parse(await http.GetStringAsync(reqString).ConfigureAwait(false)); var obj = JObject.Parse(await http.GetStringAsync(reqString).ConfigureAwait(false));
var items = obj["items"] as JArray; var items = obj["items"] as JArray;
@ -428,7 +428,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】
var allUsrs = umsg.MentionedUsers.Append(umsg.Author); var allUsrs = umsg.MentionedUsers.Append(umsg.Author);
var allUsrsArray = allUsrs.ToArray(); var allUsrsArray = allUsrs.ToArray();
var str = allUsrsArray.Aggregate("http://appear.in/", (current, usr) => current + Uri.EscapeUriString(usr.Username[0].ToString())); var str = allUsrsArray.Aggregate("http://appear.in/", (current, usr) => current + Uri.EscapeUriString(usr.Username[0].ToString()));
str += new Random().Next(); str += new NadekoRandom().Next();
foreach (var usr in allUsrsArray) foreach (var usr in allUsrsArray)
{ {
await (await (usr as IGuildUser).CreateDMChannelAsync()).SendMessageAsync(str).ConfigureAwait(false); await (await (usr as IGuildUser).CreateDMChannelAsync()).SendMessageAsync(str).ConfigureAwait(false);
@ -457,7 +457,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】
public static async Task<string> GetSafebooruImageLink(string tag) public static async Task<string> GetSafebooruImageLink(string tag)
{ {
var rng = new Random(); var rng = new NadekoRandom();
var url = var url =
$"http://safebooru.org/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; $"http://safebooru.org/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}";
using (var http = new HttpClient()) using (var http = new HttpClient())

View File

@ -2,6 +2,7 @@
using Discord.Commands; using Discord.Commands;
using Discord.WebSocket; using Discord.WebSocket;
using NadekoBot.Services; using NadekoBot.Services;
using NadekoBot.Services.Database;
using NadekoBot.Services.Impl; using NadekoBot.Services.Impl;
using NLog; using NLog;
using NLog.Config; using NLog.Config;
@ -31,6 +32,12 @@ namespace NadekoBot
{ {
SetupLogger(); SetupLogger();
for (int i = 0; i < 100; i++)
{
var rnd = new NadekoRandom();
Console.WriteLine(rnd.Next(-10, -1));
}
//create client //create client
Client = new DiscordSocketClient(new DiscordSocketConfig Client = new DiscordSocketClient(new DiscordSocketConfig
{ {
@ -48,6 +55,12 @@ namespace NadekoBot
Stats = new StatsService(Client, CommandHandler); Stats = new StatsService(Client, CommandHandler);
_log = LogManager.GetCurrentClassLogger(); _log = LogManager.GetCurrentClassLogger();
//init db
using (var context = DbHandler.Instance.GetDbContext())
{
context.EnsureSeedData();
}
//setup DI //setup DI
var depMap = new DependencyMap(); var depMap = new DependencyMap();
depMap.Add<ILocalization>(Localizer); depMap.Add<ILocalization>(Localizer);

View File

@ -2,6 +2,7 @@
{ {
public class Program public class Program
{ {
public static void Main(string[] args) => new NadekoBot().RunAsync(args).GetAwaiter().GetResult(); public static void Main(string[] args) =>
new NadekoBot().RunAsync(args).GetAwaiter().GetResult();
} }
} }

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -18,21 +19,7 @@ namespace NadekoBot.Services.Database.Models
public float CurrencyGenerationChance { get; set; } = 0.02f; public float CurrencyGenerationChance { get; set; } = 0.02f;
public int CurrencyGenerationCooldown { get; set; } = 10; public int CurrencyGenerationCooldown { get; set; } = 10;
public List<ModulePrefix> ModulePrefixes { get; set; } = new List<ModulePrefix>() public List<ModulePrefix> ModulePrefixes { get; set; } = new List<ModulePrefix>();
{
new ModulePrefix() { ModuleName="Administration", Prefix="." },
new ModulePrefix() { ModuleName="Searches", Prefix="~" },
new ModulePrefix() { ModuleName="NSFW", Prefix="~" },
new ModulePrefix() { ModuleName="ClashOfClans", Prefix="," },
new ModulePrefix() { ModuleName="Help", Prefix="-" },
new ModulePrefix() { ModuleName="Music", Prefix="!!" },
new ModulePrefix() { ModuleName="Trello", Prefix="trello" },
new ModulePrefix() { ModuleName="Games", Prefix=">" },
new ModulePrefix() { ModuleName="Gambling", Prefix="$" },
new ModulePrefix() { ModuleName="Permissions", Prefix=";" },
new ModulePrefix() { ModuleName="Pokemon", Prefix=">" },
new ModulePrefix() { ModuleName="Utility", Prefix="." }
};
public List<PlayingStatus> RotatingStatusMessages { get; set; } = new List<PlayingStatus>(); public List<PlayingStatus> RotatingStatusMessages { get; set; } = new List<PlayingStatus>();
@ -44,43 +31,8 @@ namespace NadekoBot.Services.Database.Models
public string CurrencyName { get; set; } = "Nadeko Flower"; public string CurrencyName { get; set; } = "Nadeko Flower";
public string CurrencyPluralName { get; set; } = "Nadeko Flowers"; public string CurrencyPluralName { get; set; } = "Nadeko Flowers";
public List<EightBallResponse> EightBallResponses { get; set; } = new List<EightBallResponse> public List<EightBallResponse> EightBallResponses { get; set; } = new List<EightBallResponse>();
{ public List<RaceAnimal> RaceAnimals { get; set; } = new List<RaceAnimal>();
new EightBallResponse() { Text = "Most definitely yes" },
new EightBallResponse() { Text = "For sure" },
new EightBallResponse() { Text = "Totally!" },
new EightBallResponse() { Text = "As I see it, yes" },
new EightBallResponse() { Text = "My sources say yes" },
new EightBallResponse() { Text = "Yes" },
new EightBallResponse() { Text = "Most likely" },
new EightBallResponse() { Text = "Perhaps" },
new EightBallResponse() { Text = "Maybe" },
new EightBallResponse() { Text = "Not sure" },
new EightBallResponse() { Text = "It is uncertain" },
new EightBallResponse() { Text = "Ask me again later" },
new EightBallResponse() { Text = "Don't count on it" },
new EightBallResponse() { Text = "Probably not" },
new EightBallResponse() { Text = "Very doubtful" },
new EightBallResponse() { Text = "Most likely no" },
new EightBallResponse() { Text = "Nope" },
new EightBallResponse() { Text = "No" },
new EightBallResponse() { Text = "My sources say no" },
new EightBallResponse() { Text = "Dont even think about it" },
new EightBallResponse() { Text = "Definitely no" },
new EightBallResponse() { Text = "NO - It may cause disease contraction" }
};
public List<RaceAnimal> RaceAnimals { get; set; } = new List<RaceAnimal>
{
new RaceAnimal { Icon = "🐼", Name = "Panda" },
new RaceAnimal { Icon = "🐻", Name = "Bear" },
new RaceAnimal { Icon = "🐧", Name = "Pengu" },
new RaceAnimal { Icon = "🐨", Name = "Koala" },
new RaceAnimal { Icon = "🐬", Name = "Dolphin" },
new RaceAnimal { Icon = "🐞", Name = "Ladybird" },
new RaceAnimal { Icon = "🦀", Name = "Crab" },
new RaceAnimal { Icon = "🦄", Name = "Unicorn" }
};
} }
public class PlayingStatus :DbEntity public class PlayingStatus :DbEntity
@ -102,17 +54,59 @@ namespace NadekoBot.Services.Database.Models
public class EightBallResponse : DbEntity public class EightBallResponse : DbEntity
{ {
public string Text { get; set; } public string Text { get; set; }
public override int GetHashCode()
{
return Text.GetHashCode();
}
public override bool Equals(object obj)
{
if (!(obj is EightBallResponse))
return base.Equals(obj);
return ((EightBallResponse)obj).Text == Text;
}
} }
public class RaceAnimal : DbEntity public class RaceAnimal : DbEntity
{ {
public string Icon { get; set; } public string Icon { get; set; }
public string Name { get; set; } public string Name { get; set; }
public override int GetHashCode()
{
return Icon.GetHashCode();
}
public override bool Equals(object obj)
{
if (!(obj is RaceAnimal))
return base.Equals(obj);
return ((RaceAnimal)obj).Icon == Icon;
}
} }
public class ModulePrefix : DbEntity public class ModulePrefix : DbEntity
{ {
public string ModuleName { get; set; } public string ModuleName { get; set; }
public string Prefix { get; set; } public string Prefix { get; set; }
public int BotConfigId { get; set; } = 1;
public BotConfig BotConfig { get; set; }
public override int GetHashCode()
{
return ModuleName.GetHashCode();
}
public override bool Equals(object obj)
{
if(!(obj is ModulePrefix))
return base.Equals(obj);
return ((ModulePrefix)obj).ModuleName == ModuleName;
}
} }
} }

View File

@ -28,6 +28,80 @@ namespace NadekoBot.Services.Database
public DbSet<IgnoredLogChannel> IgnoredLogChannels { get; set; } public DbSet<IgnoredLogChannel> IgnoredLogChannels { get; set; }
public DbSet<IgnoredVoicePresenceChannel> IgnoredVoicePresenceCHannels { get; set; } public DbSet<IgnoredVoicePresenceChannel> IgnoredVoicePresenceCHannels { get; set; }
//orphans xD
public DbSet<EightBallResponse> EightBallResponses { get; set; }
public DbSet<RaceAnimal> RaceAnimals { get; set; }
public DbSet<ModulePrefix> ModulePrefixes { get; set; }
public void EnsureSeedData()
{
if (!BotConfig.Any())
{
var bc = new BotConfig();
bc.ModulePrefixes.AddRange(new HashSet<ModulePrefix>()
{
new ModulePrefix() { ModuleName = "Administration", Prefix = "." },
new ModulePrefix() { ModuleName = "Searches", Prefix = "~" },
new ModulePrefix() { ModuleName = "NSFW", Prefix = "~" },
new ModulePrefix() { ModuleName = "ClashOfClans", Prefix = "," },
new ModulePrefix() { ModuleName = "Help", Prefix = "-" },
new ModulePrefix() { ModuleName = "Music", Prefix = "!!" },
new ModulePrefix() { ModuleName = "Trello", Prefix = "trello" },
new ModulePrefix() { ModuleName = "Games", Prefix = ">" },
new ModulePrefix() { ModuleName = "Gambling", Prefix = "$" },
new ModulePrefix() { ModuleName = "Permissions", Prefix = ";" },
new ModulePrefix() { ModuleName = "Pokemon", Prefix = ">" },
new ModulePrefix() { ModuleName = "Utility", Prefix = "." }
});
bc.RaceAnimals.AddRange(new HashSet<RaceAnimal>
{
new RaceAnimal { Icon = "🐼", Name = "Panda" },
new RaceAnimal { Icon = "🐻", Name = "Bear" },
new RaceAnimal { Icon = "🐧", Name = "Pengu" },
new RaceAnimal { Icon = "🐨", Name = "Koala" },
new RaceAnimal { Icon = "🐬", Name = "Dolphin" },
new RaceAnimal { Icon = "🐞", Name = "Ladybird" },
new RaceAnimal { Icon = "🦀", Name = "Crab" },
new RaceAnimal { Icon = "🦄", Name = "Unicorn" }
});
bc.EightBallResponses.AddRange(new HashSet<EightBallResponse>
{
new EightBallResponse() { Text = "Most definitely yes" },
new EightBallResponse() { Text = "For sure" },
new EightBallResponse() { Text = "Totally!" },
new EightBallResponse() { Text = "Of course!" },
new EightBallResponse() { Text = "As I see it, yes" },
new EightBallResponse() { Text = "My sources say yes" },
new EightBallResponse() { Text = "Yes" },
new EightBallResponse() { Text = "Most likely" },
new EightBallResponse() { Text = "Perhaps" },
new EightBallResponse() { Text = "Maybe" },
new EightBallResponse() { Text = "Not sure" },
new EightBallResponse() { Text = "It is uncertain" },
new EightBallResponse() { Text = "Ask me again later" },
new EightBallResponse() { Text = "Don't count on it" },
new EightBallResponse() { Text = "Probably not" },
new EightBallResponse() { Text = "Very doubtful" },
new EightBallResponse() { Text = "Most likely no" },
new EightBallResponse() { Text = "Nope" },
new EightBallResponse() { Text = "No" },
new EightBallResponse() { Text = "My sources say no" },
new EightBallResponse() { Text = "Dont even think about it" },
new EightBallResponse() { Text = "Definitely no" },
new EightBallResponse() { Text = "NO - It may cause disease contraction" }
});
BotConfig.Add(bc);
this.SaveChanges();
}
if (!TypingArticles.Any())
{
//todo load default typing articles
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
#region QUOTES #region QUOTES
@ -45,7 +119,7 @@ namespace NadekoBot.Services.Database
#endregion #endregion
#region Config #region GuildConfig
var configEntity = modelBuilder.Entity<GuildConfig>(); var configEntity = modelBuilder.Entity<GuildConfig>();
configEntity configEntity
@ -54,6 +128,15 @@ namespace NadekoBot.Services.Database
#endregion #endregion
#region BotConfig
var botConfigEntity = modelBuilder.Entity<BotConfig>();
//botConfigEntity
// .HasMany(c => c.ModulePrefixes)
// .WithOne(mp => mp.BotConfig)
// .HasForeignKey(mp => mp.BotConfigId);
#endregion
#region ClashOfClans #region ClashOfClans
var callersEntity = modelBuilder.Entity<ClashCaller>(); var callersEntity = modelBuilder.Entity<ClashCaller>();

View File

@ -20,7 +20,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl
public Task<Quote> GetRandomQuoteByKeywordAsync(ulong guildId, string keyword) public Task<Quote> GetRandomQuoteByKeywordAsync(ulong guildId, string keyword)
{ {
var rng = new Random(); var rng = new NadekoRandom();
return _set.Where(q => q.Keyword == keyword).OrderBy(q => rng.Next()).FirstOrDefaultAsync(); return _set.Where(q => q.Keyword == keyword).OrderBy(q => rng.Next()).FirstOrDefaultAsync();
} }
} }

View File

@ -11,7 +11,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl
public class TypingArticlesRepository : Repository<TypingArticle>, ITypingArticlesRepository public class TypingArticlesRepository : Repository<TypingArticle>, ITypingArticlesRepository
{ {
private Random _rand = null; private Random _rand = null;
private Random rand => _rand ?? (_rand = new Random()); private Random rand => _rand ?? (_rand = new NadekoRandom());
public TypingArticlesRepository(DbContext context) : base(context) public TypingArticlesRepository(DbContext context) : base(context)
{ {
} }

View File

@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace NadekoBot.Services
{
public class NadekoRandom : Random
{
RandomNumberGenerator rng;
public NadekoRandom() : base()
{
rng = RandomNumberGenerator.Create();
}
private NadekoRandom(int Seed) : base(Seed)
{
rng = RandomNumberGenerator.Create();
}
public override int Next()
{
var bytes = new byte[sizeof(int)];
rng.GetBytes(bytes);
return Math.Abs(BitConverter.ToInt32(bytes, 0));
}
public override int Next(int maxValue)
{
if (maxValue <= 0)
throw new ArgumentOutOfRangeException();
var bytes = new byte[sizeof(int)];
rng.GetBytes(bytes);
return Math.Abs(BitConverter.ToInt32(bytes, 0)) % maxValue;
}
public override int Next(int minValue, int maxValue)
{
if (minValue > maxValue)
throw new ArgumentOutOfRangeException();
if (minValue == maxValue)
return minValue;
var bytes = new byte[sizeof(int)];
rng.GetBytes(bytes);
var num = BitConverter.ToInt32(bytes, 0);
var sign = Math.Sign(BitConverter.ToInt32(bytes, 0));
return (sign * BitConverter.ToInt32(bytes, 0)) % (maxValue - minValue) + minValue;
}
public override void NextBytes(byte[] buffer)
{
rng.GetBytes(buffer);
}
protected override double Sample()
{
var bytes = new byte[sizeof(double)];
rng.GetBytes(bytes);
return Math.Abs(BitConverter.ToDouble(bytes, 0) / double.MaxValue + 1);
}
public override double NextDouble()
{
var bytes = new byte[sizeof(double)];
rng.GetBytes(bytes);
return BitConverter.ToDouble(bytes, 0);
}
}
}