Added default stuff to db. Added NadekoRandom class. Cleanup.
This commit is contained in:
		
							
								
								
									
										52
									
								
								src/NadekoBot/Attributes/NadekoModule.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/NadekoBot/Attributes/NadekoModule.cs
									
									
									
									
									
										Normal 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; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -8,7 +8,7 @@ using NadekoBot.Services.Database.Impl; | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|     [DbContext(typeof(NadekoSqliteContext))] | ||||
|     [Migration("20160908202817_first")] | ||||
|     [Migration("20160910180231_first")] | ||||
|     partial class first | ||||
|     { | ||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) | ||||
| @@ -173,7 +173,7 @@ namespace NadekoBot.Migrations | ||||
| 
 | ||||
|                     b.HasIndex("BotConfigId"); | ||||
| 
 | ||||
|                     b.ToTable("EightBallResponse"); | ||||
|                     b.ToTable("EightBallResponses"); | ||||
|                 }); | ||||
| 
 | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => | ||||
| @@ -336,7 +336,7 @@ namespace NadekoBot.Migrations | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
| 
 | ||||
|                     b.Property<int?>("BotConfigId"); | ||||
|                     b.Property<int>("BotConfigId"); | ||||
| 
 | ||||
|                     b.Property<string>("ModuleName"); | ||||
| 
 | ||||
| @@ -346,7 +346,7 @@ namespace NadekoBot.Migrations | ||||
| 
 | ||||
|                     b.HasIndex("BotConfigId"); | ||||
| 
 | ||||
|                     b.ToTable("ModulePrefix"); | ||||
|                     b.ToTable("ModulePrefixes"); | ||||
|                 }); | ||||
| 
 | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => | ||||
| @@ -403,7 +403,7 @@ namespace NadekoBot.Migrations | ||||
| 
 | ||||
|                     b.HasIndex("BotConfigId"); | ||||
| 
 | ||||
|                     b.ToTable("RaceAnimal"); | ||||
|                     b.ToTable("RaceAnimals"); | ||||
|                 }); | ||||
| 
 | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => | ||||
| @@ -532,9 +532,10 @@ namespace NadekoBot.Migrations | ||||
| 
 | ||||
|             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") | ||||
|                         .HasForeignKey("BotConfigId"); | ||||
|                         .HasForeignKey("BotConfigId") | ||||
|                         .OnDelete(DeleteBehavior.Cascade); | ||||
|                 }); | ||||
| 
 | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => | ||||
| @@ -222,7 +222,7 @@ namespace NadekoBot.Migrations | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "EightBallResponse", | ||||
|                 name: "EightBallResponses", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<int>(nullable: false) | ||||
| @@ -232,9 +232,9 @@ namespace NadekoBot.Migrations | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_EightBallResponse", x => x.Id); | ||||
|                     table.PrimaryKey("PK_EightBallResponses", x => x.Id); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_EightBallResponse_BotConfig_BotConfigId", | ||||
|                         name: "FK_EightBallResponses_BotConfig_BotConfigId", | ||||
|                         column: x => x.BotConfigId, | ||||
|                         principalTable: "BotConfig", | ||||
|                         principalColumn: "Id", | ||||
| @@ -242,24 +242,24 @@ namespace NadekoBot.Migrations | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "ModulePrefix", | ||||
|                 name: "ModulePrefixes", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<int>(nullable: false) | ||||
|                         .Annotation("Autoincrement", true), | ||||
|                     BotConfigId = table.Column<int>(nullable: true), | ||||
|                     BotConfigId = table.Column<int>(nullable: false), | ||||
|                     ModuleName = table.Column<string>(nullable: true), | ||||
|                     Prefix = table.Column<string>(nullable: true) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_ModulePrefix", x => x.Id); | ||||
|                     table.PrimaryKey("PK_ModulePrefixes", x => x.Id); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_ModulePrefix_BotConfig_BotConfigId", | ||||
|                         name: "FK_ModulePrefixes_BotConfig_BotConfigId", | ||||
|                         column: x => x.BotConfigId, | ||||
|                         principalTable: "BotConfig", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Restrict); | ||||
|                         onDelete: ReferentialAction.Cascade); | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateTable( | ||||
| @@ -283,7 +283,7 @@ namespace NadekoBot.Migrations | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "RaceAnimal", | ||||
|                 name: "RaceAnimals", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<int>(nullable: false) | ||||
| @@ -294,9 +294,9 @@ namespace NadekoBot.Migrations | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_RaceAnimal", x => x.Id); | ||||
|                     table.PrimaryKey("PK_RaceAnimals", x => x.Id); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_RaceAnimal_BotConfig_BotConfigId", | ||||
|                         name: "FK_RaceAnimals_BotConfig_BotConfigId", | ||||
|                         column: x => x.BotConfigId, | ||||
|                         principalTable: "BotConfig", | ||||
|                         principalColumn: "Id", | ||||
| @@ -451,8 +451,8 @@ namespace NadekoBot.Migrations | ||||
|                 unique: true); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_EightBallResponse_BotConfigId", | ||||
|                 table: "EightBallResponse", | ||||
|                 name: "IX_EightBallResponses_BotConfigId", | ||||
|                 table: "EightBallResponses", | ||||
|                 column: "BotConfigId"); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
| @@ -482,8 +482,8 @@ namespace NadekoBot.Migrations | ||||
|                 column: "LogSettingId"); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_ModulePrefix_BotConfigId", | ||||
|                 table: "ModulePrefix", | ||||
|                 name: "IX_ModulePrefixes_BotConfigId", | ||||
|                 table: "ModulePrefixes", | ||||
|                 column: "BotConfigId"); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
| @@ -492,8 +492,8 @@ namespace NadekoBot.Migrations | ||||
|                 column: "BotConfigId"); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_RaceAnimal_BotConfigId", | ||||
|                 table: "RaceAnimal", | ||||
|                 name: "IX_RaceAnimals_BotConfigId", | ||||
|                 table: "RaceAnimals", | ||||
|                 column: "BotConfigId"); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
| @@ -527,7 +527,7 @@ namespace NadekoBot.Migrations | ||||
|                 name: "Donators"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "EightBallResponse"); | ||||
|                 name: "EightBallResponses"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "FollowedStream"); | ||||
| @@ -539,7 +539,7 @@ namespace NadekoBot.Migrations | ||||
|                 name: "IgnoredVoicePresenceCHannels"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "ModulePrefix"); | ||||
|                 name: "ModulePrefixes"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "PlayingStatus"); | ||||
| @@ -548,7 +548,7 @@ namespace NadekoBot.Migrations | ||||
|                 name: "Quotes"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "RaceAnimal"); | ||||
|                 name: "RaceAnimals"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "Reminders"); | ||||
| @@ -172,7 +172,7 @@ namespace NadekoBot.Migrations | ||||
|  | ||||
|                     b.HasIndex("BotConfigId"); | ||||
|  | ||||
|                     b.ToTable("EightBallResponse"); | ||||
|                     b.ToTable("EightBallResponses"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => | ||||
| @@ -335,7 +335,7 @@ namespace NadekoBot.Migrations | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("BotConfigId"); | ||||
|                     b.Property<int>("BotConfigId"); | ||||
|  | ||||
|                     b.Property<string>("ModuleName"); | ||||
|  | ||||
| @@ -345,7 +345,7 @@ namespace NadekoBot.Migrations | ||||
|  | ||||
|                     b.HasIndex("BotConfigId"); | ||||
|  | ||||
|                     b.ToTable("ModulePrefix"); | ||||
|                     b.ToTable("ModulePrefixes"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => | ||||
| @@ -402,7 +402,7 @@ namespace NadekoBot.Migrations | ||||
|  | ||||
|                     b.HasIndex("BotConfigId"); | ||||
|  | ||||
|                     b.ToTable("RaceAnimal"); | ||||
|                     b.ToTable("RaceAnimals"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => | ||||
| @@ -531,9 +531,10 @@ namespace NadekoBot.Migrations | ||||
|  | ||||
|             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") | ||||
|                         .HasForeignKey("BotConfigId"); | ||||
|                         .HasForeignKey("BotConfigId") | ||||
|                         .OnDelete(DeleteBehavior.Cascade); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => | ||||
|   | ||||
| @@ -61,7 +61,7 @@ namespace NadekoBot.Modules.Administration | ||||
|             //public async Task Scsc(IUserMessage msg) | ||||
|             //{ | ||||
|             //    var channel = (ITextChannel)msg.Channel; | ||||
|             //    var token = new Random().Next(); | ||||
|             //    var token = new NadekoRandom().Next(); | ||||
|             //    var set = new HashSet<ITextChannel>(); | ||||
|             //    if (Subscribers.TryAdd(token, set)) | ||||
|             //    { | ||||
|   | ||||
| @@ -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); | ||||
| //                  }); | ||||
| //        } | ||||
| //    } | ||||
| //} | ||||
| @@ -49,12 +49,14 @@ namespace NadekoBot.Modules.Administration | ||||
|                 t = new Timer(async (state) => | ||||
|                 { | ||||
|                     var keys = UserPresenceUpdates.Keys.ToList(); | ||||
|                     foreach (var key in keys) | ||||
|  | ||||
|                     await Task.WhenAll(keys.Select(key => | ||||
|                     { | ||||
|                         List<string> 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)); | ||||
|                  | ||||
|  | ||||
|   | ||||
| @@ -130,7 +130,7 @@ namespace NadekoBot.Modules.Gambling | ||||
|  | ||||
|                 private async Task StartRace() | ||||
|                 { | ||||
|                     var rng = new Random(); | ||||
|                     var rng = new NadekoRandom(); | ||||
|                     Participant winner = null; | ||||
|                     IUserMessage msg = null; | ||||
|                     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; | ||||
|                     if (msg == null) | ||||
|                         return; | ||||
|                         return Task.CompletedTask; | ||||
|                     if (msg.IsAuthor() || !(imsg.Channel is ITextChannel) || imsg.Channel != raceChannel) | ||||
|                         return; | ||||
|                         return Task.CompletedTask; | ||||
|                     messagesSinceGameStarted++; | ||||
|                     return Task.CompletedTask; | ||||
|                 } | ||||
|  | ||||
|                 private async Task CheckForFullGameAsync(CancellationToken cancelToken) | ||||
|   | ||||
| @@ -2,6 +2,7 @@ using Discord; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| @@ -27,7 +28,7 @@ namespace NadekoBot.Modules.Gambling | ||||
|         private async Task publicRoll(IUserMessage umsg, string arg, bool ordered) | ||||
|         { | ||||
|             var channel = (ITextChannel)umsg.Channel; | ||||
|             var r = new Random(); | ||||
|             var r = new NadekoRandom(); | ||||
|             //if (string.IsNullOrWhiteSpace(arg)) | ||||
|             //{ | ||||
|             //    var gen = r.Next(0, 101); | ||||
| @@ -124,11 +125,11 @@ namespace NadekoBot.Modules.Gambling | ||||
|                                     .ToArray(); | ||||
|                     if (arr[0] > arr[1]) | ||||
|                         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 | ||||
|                 { | ||||
|                     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); | ||||
|   | ||||
| @@ -66,7 +66,7 @@ namespace NadekoBot.Modules.Gambling | ||||
|  | ||||
|         //    var isHeads = guessStr == "HEADS" || guessStr == "H"; | ||||
|         //    bool result = false; | ||||
|         //    var rng = new Random(); | ||||
|         //    var rng = new NadekoRandom(); | ||||
|         //    if (rng.Next(0, 2) == 1) | ||||
|         //    { | ||||
|         //        await channel.SendFileAsync("heads.png", Properties.Resources.heads.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false); | ||||
|   | ||||
| @@ -1,4 +1,6 @@ | ||||
| using System; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
|  | ||||
| @@ -114,7 +116,7 @@ namespace NadekoBot.Modules.Gambling.Models | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         private Random r = new Random(); | ||||
|         private Random r = new NadekoRandom(); | ||||
|         /// <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. | ||||
|         /// </summary> | ||||
| @@ -143,7 +145,7 @@ namespace NadekoBot.Modules.Gambling.Models | ||||
|         private void Shuffle() | ||||
|         { | ||||
|             if (cardPool.Count <= 1) return; | ||||
|             var orderedPool = cardPool.OrderBy(x => r.Next()); | ||||
|             var orderedPool = cardPool.Shuffle(); | ||||
|             cardPool = cardPool as List<Card> ?? orderedPool.ToList(); | ||||
|         } | ||||
|         public override string ToString() => string.Concat(cardPool.Select(c => c.ToString())) + Environment.NewLine; | ||||
|   | ||||
| @@ -43,7 +43,7 @@ namespace NadekoBot.Modules.Gambling | ||||
|  | ||||
|             var members = role.Members().Where(u => u.Status == UserStatus.Online); | ||||
|             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); | ||||
|         } | ||||
|          | ||||
| @@ -147,7 +147,7 @@ namespace NadekoBot.Modules.Gambling | ||||
|  | ||||
|             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}.` "; | ||||
|             if (rng < 67) | ||||
|             { | ||||
|   | ||||
| @@ -44,7 +44,7 @@ namespace NadekoBot.Modules.Games | ||||
|             public PlantPickCommands() | ||||
|             { | ||||
|                 NadekoBot.Client.MessageReceived += PotentialFlowerGeneration; | ||||
|                 rng = new Random(); | ||||
|                 rng = new NadekoRandom(); | ||||
|  | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 { | ||||
|   | ||||
| @@ -100,11 +100,11 @@ namespace NadekoBot.Modules.Games.Trivia | ||||
|             ShouldStopGame = true; | ||||
|         } | ||||
|  | ||||
|         private async Task PotentialGuess(IMessage imsg) | ||||
|         private Task PotentialGuess(IMessage imsg) | ||||
|         { | ||||
|             var umsg = imsg as IUserMessage; | ||||
|             if (umsg == null) | ||||
|                 return; | ||||
|                 return Task.CompletedTask; | ||||
|             var t = Task.Run(async () => | ||||
|             { | ||||
|                 try | ||||
| @@ -135,6 +135,7 @@ namespace NadekoBot.Modules.Games.Trivia | ||||
|                 } | ||||
|                 catch { } | ||||
|             }); | ||||
|             return Task.CompletedTask; | ||||
|         } | ||||
|  | ||||
|         public string GetLeaderboard() | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| using Newtonsoft.Json.Linq; | ||||
| using NadekoBot.Services; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| @@ -11,7 +12,7 @@ namespace NadekoBot.Modules.Games.Trivia | ||||
|         public static TriviaQuestionPool Instance { get; } = new TriviaQuestionPool(); | ||||
|         public HashSet<TriviaQuestion> pool = new HashSet<TriviaQuestion>(); | ||||
|  | ||||
|         private Random rng { get; } = new Random(); | ||||
|         private Random rng { get; } = new NadekoRandom(); | ||||
|  | ||||
|         static TriviaQuestionPool() { } | ||||
|  | ||||
| @@ -36,7 +37,7 @@ namespace NadekoBot.Modules.Games.Trivia | ||||
|                 var tq = new TriviaQuestion(item["Question"].ToString(), item["Answer"].ToString(), item["Category"]?.ToString()); | ||||
|                 pool.Add(tq); | ||||
|             } | ||||
|             var r = new Random(); | ||||
|             var r = new NadekoRandom(); | ||||
|             pool = new HashSet<TriviaQuestion>(pool.OrderBy(x => r.Next())); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -37,7 +37,7 @@ namespace NadekoBot.Modules.Games | ||||
|             var listArr = list.Split(';'); | ||||
|             if (listArr.Count() < 2) | ||||
|                 return; | ||||
|             var rng = new Random(); | ||||
|             var rng = new NadekoRandom(); | ||||
|             await channel.SendMessageAsync(listArr[rng.Next(0, listArr.Length)]).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
| @@ -49,7 +49,7 @@ namespace NadekoBot.Modules.Games | ||||
|  | ||||
|             if (string.IsNullOrWhiteSpace(question)) | ||||
|                 return; | ||||
|                 var rng = new Random(); | ||||
|                 var rng = new NadekoRandom(); | ||||
|             await channel.SendMessageAsync($@":question: `Question` __**{question}**__  | ||||
| 🎱 `8Ball Answers` __**{_8BallResponses.Shuffle().FirstOrDefault()}**__").ConfigureAwait(false); | ||||
|         } | ||||
| @@ -90,7 +90,7 @@ namespace NadekoBot.Modules.Games | ||||
|                 default: | ||||
|                     return; | ||||
|             } | ||||
|             var nadekoPick = new Random().Next(0, 3); | ||||
|             var nadekoPick = new NadekoRandom().Next(0, 3); | ||||
|             var msg = ""; | ||||
|             if (pick == nadekoPick) | ||||
|                 msg = $"It's a draw! Both picked :{GetRPSPick(pick)}:"; | ||||
|   | ||||
| @@ -37,41 +37,44 @@ namespace NadekoBot.Modules.Music | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Next(IUserMessage umsg) | ||||
|         public Task Next(IUserMessage umsg) | ||||
|         { | ||||
|             var channel = (ITextChannel)umsg.Channel; | ||||
|  | ||||
|             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) | ||||
|                 musicPlayer.Next(); | ||||
|             return Task.CompletedTask; | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Stop(IUserMessage umsg) | ||||
|         public Task Stop(IUserMessage umsg) | ||||
|         { | ||||
|             var channel = (ITextChannel)umsg.Channel; | ||||
|  | ||||
|             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) | ||||
|             { | ||||
|                 musicPlayer.Autoplay = false; | ||||
|                 musicPlayer.Stop(); | ||||
|             } | ||||
|             return Task.CompletedTask; | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Destroy(IUserMessage umsg) | ||||
|         public Task Destroy(IUserMessage umsg) | ||||
|         { | ||||
|             var channel = (ITextChannel)umsg.Channel; | ||||
|  | ||||
|             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) | ||||
|                 musicPlayer.Destroy(); | ||||
|             return Task.CompletedTask; | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
| @@ -204,28 +207,30 @@ namespace NadekoBot.Modules.Music | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Mute(IUserMessage umsg) | ||||
|         public Task Mute(IUserMessage umsg) | ||||
|         { | ||||
|             var channel = (ITextChannel)umsg.Channel; | ||||
|             MusicPlayer musicPlayer; | ||||
|             if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) | ||||
|                 return; | ||||
|                 return Task.CompletedTask; | ||||
|             if (((IGuildUser)umsg.Author).VoiceChannel != musicPlayer.PlaybackVoiceChannel) | ||||
|                 return; | ||||
|                 return Task.CompletedTask; | ||||
|             musicPlayer.SetVolume(0); | ||||
|             return Task.CompletedTask; | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Max(IUserMessage umsg) | ||||
|         public Task Max(IUserMessage umsg) | ||||
|         { | ||||
|             var channel = (ITextChannel)umsg.Channel; | ||||
|             MusicPlayer musicPlayer; | ||||
|             if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) | ||||
|                 return; | ||||
|                 return Task.CompletedTask; | ||||
|             if (((IGuildUser)umsg.Author).VoiceChannel != musicPlayer.PlaybackVoiceChannel) | ||||
|                 return; | ||||
|                 return Task.CompletedTask; | ||||
|             musicPlayer.SetVolume(100); | ||||
|             return Task.CompletedTask; | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
| @@ -395,7 +400,7 @@ namespace NadekoBot.Modules.Music | ||||
|             var voiceChannel = ((IGuildUser)umsg.Author).VoiceChannel; | ||||
|             if (voiceChannel == null || voiceChannel.Guild != channel.Guild || !MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) | ||||
|                 return; | ||||
|             musicPlayer.MoveToVoiceChannel(voiceChannel); | ||||
|             await musicPlayer.MoveToVoiceChannel(voiceChannel); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
|   | ||||
| @@ -116,7 +116,7 @@ namespace NadekoBot.Modules.NSFW | ||||
|                 JToken obj; | ||||
|                 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); | ||||
|             } | ||||
| @@ -137,7 +137,7 @@ namespace NadekoBot.Modules.NSFW | ||||
|                 JToken obj; | ||||
|                 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); | ||||
|             } | ||||
| @@ -149,7 +149,7 @@ namespace NadekoBot.Modules.NSFW | ||||
|  | ||||
|         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 | ||||
|                 tag = "flat_chest"; | ||||
| @@ -181,7 +181,7 @@ namespace NadekoBot.Modules.NSFW | ||||
|                 if (matches.Count == 0) | ||||
|                     return null; | ||||
|  | ||||
|                 var rng = new Random(); | ||||
|                 var rng = new NadekoRandom(); | ||||
|                 var match = matches[rng.Next(0, matches.Count)]; | ||||
|                 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) | ||||
|         { | ||||
|             var rng = new Random(); | ||||
|             var rng = new NadekoRandom(); | ||||
|             var url = | ||||
|             $"http://rule34.xxx/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; | ||||
|             using (var http = new HttpClient()) | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Modules.Searches.Models; | ||||
| using NadekoBot.Services; | ||||
| using Newtonsoft.Json; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using NLog; | ||||
| @@ -86,7 +87,7 @@ namespace NadekoBot.Modules.Searches | ||||
|                 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] | ||||
| @@ -94,7 +95,7 @@ namespace NadekoBot.Modules.Searches | ||||
|             public async Task MagicItem(IUserMessage umsg) | ||||
|             { | ||||
|                 var channel = (ITextChannel)umsg.Channel; | ||||
|                 var rng = new Random(); | ||||
|                 var rng = new NadekoRandom(); | ||||
|                 var item = magicItems[rng.Next(0, magicItems.Count)].ToString(); | ||||
|  | ||||
|                 await channel.SendMessageAsync(item).ConfigureAwait(false); | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| @@ -52,7 +53,7 @@ namespace NadekoBot.Modules.Searches | ||||
|                     var dataList = data.Distinct(new ChampionNameComparer()).Take(showCount).ToList(); | ||||
|                     var sb = new StringBuilder(); | ||||
|                     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++) | ||||
|                     { | ||||
|                         if (i % 2 == 0 && i != 0) | ||||
|   | ||||
| @@ -152,7 +152,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 | ||||
|             { | ||||
|                 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 obj = JObject.Parse(await http.GetStringAsync(reqString).ConfigureAwait(false)); | ||||
|                     var items = obj["items"] as JArray; | ||||
| @@ -428,7 +428,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 | ||||
|                 var allUsrs = umsg.MentionedUsers.Append(umsg.Author); | ||||
|                 var allUsrsArray = allUsrs.ToArray(); | ||||
|                 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) | ||||
|                 { | ||||
|                     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) | ||||
|         { | ||||
|             var rng = new Random(); | ||||
|             var rng = new NadekoRandom(); | ||||
|             var url = | ||||
|             $"http://safebooru.org/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; | ||||
|             using (var http = new HttpClient()) | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| using Discord.Commands; | ||||
| using Discord.WebSocket; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database; | ||||
| using NadekoBot.Services.Impl; | ||||
| using NLog; | ||||
| using NLog.Config; | ||||
| @@ -31,6 +32,12 @@ namespace NadekoBot | ||||
|         { | ||||
|             SetupLogger(); | ||||
|  | ||||
|             for (int i = 0; i < 100; i++) | ||||
|             { | ||||
|                 var rnd = new NadekoRandom(); | ||||
|                 Console.WriteLine(rnd.Next(-10, -1)); | ||||
|             } | ||||
|  | ||||
|             //create client | ||||
|             Client = new DiscordSocketClient(new DiscordSocketConfig | ||||
|             { | ||||
| @@ -48,6 +55,12 @@ namespace NadekoBot | ||||
|             Stats = new StatsService(Client, CommandHandler); | ||||
|             _log = LogManager.GetCurrentClassLogger(); | ||||
|  | ||||
|             //init db | ||||
|             using (var context = DbHandler.Instance.GetDbContext()) | ||||
|             { | ||||
|                 context.EnsureSeedData(); | ||||
|             } | ||||
|  | ||||
|             //setup DI | ||||
|             var depMap = new DependencyMap(); | ||||
|             depMap.Add<ILocalization>(Localizer); | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| { | ||||
|     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(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
| using System.ComponentModel.DataAnnotations.Schema; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| @@ -18,21 +19,7 @@ namespace NadekoBot.Services.Database.Models | ||||
|         public float CurrencyGenerationChance { get; set; } = 0.02f; | ||||
|         public int CurrencyGenerationCooldown { get; set; } = 10; | ||||
|  | ||||
|         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<ModulePrefix> ModulePrefixes { get; set; } = new List<ModulePrefix>(); | ||||
|  | ||||
|         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 CurrencyPluralName { get; set; } = "Nadeko Flowers"; | ||||
|  | ||||
|         public List<EightBallResponse> EightBallResponses { get; set; } = new List<EightBallResponse> | ||||
|         { | ||||
|             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 List<EightBallResponse> EightBallResponses { get; set; } = new List<EightBallResponse>(); | ||||
|         public List<RaceAnimal> RaceAnimals { get; set; } = new List<RaceAnimal>(); | ||||
|     } | ||||
|  | ||||
|     public class PlayingStatus :DbEntity | ||||
| @@ -102,17 +54,59 @@ namespace NadekoBot.Services.Database.Models | ||||
|     public class EightBallResponse : DbEntity | ||||
|     { | ||||
|         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 string Icon { 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 string ModuleName { 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; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -28,6 +28,80 @@ namespace NadekoBot.Services.Database | ||||
|         public DbSet<IgnoredLogChannel> IgnoredLogChannels { 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) | ||||
|         { | ||||
|             #region QUOTES | ||||
| @@ -45,7 +119,7 @@ namespace NadekoBot.Services.Database | ||||
|  | ||||
|             #endregion | ||||
|  | ||||
|             #region Config | ||||
|             #region GuildConfig | ||||
|  | ||||
|             var configEntity = modelBuilder.Entity<GuildConfig>(); | ||||
|             configEntity | ||||
| @@ -54,6 +128,15 @@ namespace NadekoBot.Services.Database | ||||
|  | ||||
|             #endregion | ||||
|  | ||||
|             #region BotConfig | ||||
|             var botConfigEntity = modelBuilder.Entity<BotConfig>(); | ||||
|             //botConfigEntity | ||||
|             //    .HasMany(c => c.ModulePrefixes) | ||||
|             //    .WithOne(mp => mp.BotConfig) | ||||
|             //    .HasForeignKey(mp => mp.BotConfigId); | ||||
|                  | ||||
|             #endregion | ||||
|  | ||||
|             #region ClashOfClans | ||||
|  | ||||
|             var callersEntity = modelBuilder.Entity<ClashCaller>(); | ||||
|   | ||||
| @@ -20,7 +20,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl | ||||
|  | ||||
|         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(); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -11,7 +11,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl | ||||
|     public class TypingArticlesRepository : Repository<TypingArticle>, ITypingArticlesRepository | ||||
|     { | ||||
|         private Random _rand = null; | ||||
|         private Random rand => _rand ?? (_rand = new Random()); | ||||
|         private Random rand => _rand ?? (_rand = new NadekoRandom()); | ||||
|         public TypingArticlesRepository(DbContext context) : base(context) | ||||
|         { | ||||
|         } | ||||
|   | ||||
							
								
								
									
										72
									
								
								src/NadekoBot/Services/NadekoRandom.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								src/NadekoBot/Services/NadekoRandom.cs
									
									
									
									
									
										Normal 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user