diff --git a/src/NadekoBot/Attributes/LocalizedAlias.cs b/src/NadekoBot/Attributes/LocalizedAlias.cs new file mode 100644 index 00000000..97f808aa --- /dev/null +++ b/src/NadekoBot/Attributes/LocalizedAlias.cs @@ -0,0 +1,18 @@ +using Discord.Commands; +using NadekoBot.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Attributes +{ + public class LocalizedAliasAttribute : AliasAttribute + { + public LocalizedAliasAttribute([CallerMemberName] string memberName = "") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_text").Split(' ').Skip(1).ToArray()) + { + } + } +} diff --git a/src/NadekoBot/Attributes/LocalizedCommand.cs b/src/NadekoBot/Attributes/LocalizedCommand.cs index fb371a6e..dcb96537 100644 --- a/src/NadekoBot/Attributes/LocalizedCommand.cs +++ b/src/NadekoBot/Attributes/LocalizedCommand.cs @@ -1,12 +1,13 @@ using Discord.Commands; using NadekoBot.Services; +using System.Linq; using System.Runtime.CompilerServices; namespace NadekoBot.Attributes { public class LocalizedCommandAttribute : CommandAttribute { - public LocalizedCommandAttribute([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_text")) + public LocalizedCommandAttribute([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_text").Split(' ')[0]) { } diff --git a/src/NadekoBot/Migrations/20160830011641_first.Designer.cs b/src/NadekoBot/Migrations/20160901001820_first.Designer.cs similarity index 91% rename from src/NadekoBot/Migrations/20160830011641_first.Designer.cs rename to src/NadekoBot/Migrations/20160901001820_first.Designer.cs index a1c78a53..dd86f1dc 100644 --- a/src/NadekoBot/Migrations/20160830011641_first.Designer.cs +++ b/src/NadekoBot/Migrations/20160901001820_first.Designer.cs @@ -8,7 +8,7 @@ using NadekoBot.Services.Database.Impl; namespace NadekoBot.Migrations { [DbContext(typeof(NadekoSqliteContext))] - [Migration("20160830011641_first")] + [Migration("20160901001820_first")] partial class first { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -156,6 +156,30 @@ namespace NadekoBot.Migrations b.ToTable("EightBallResponse"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("LastStatus"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => { b.Property("Id") @@ -195,6 +219,8 @@ namespace NadekoBot.Migrations b.Property("SendDmGreetMessage"); + b.Property("VoicePlusTextEnabled"); + b.HasKey("Id"); b.HasIndex("GuildId") @@ -360,6 +386,13 @@ namespace NadekoBot.Migrations .HasForeignKey("BotConfigId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FollowedStreams") + .HasForeignKey("GuildConfigId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") diff --git a/src/NadekoBot/Migrations/20160830011641_first.cs b/src/NadekoBot/Migrations/20160901001820_first.cs similarity index 91% rename from src/NadekoBot/Migrations/20160830011641_first.cs rename to src/NadekoBot/Migrations/20160901001820_first.cs index cf8464d4..b1d5d6b5 100644 --- a/src/NadekoBot/Migrations/20160830011641_first.cs +++ b/src/NadekoBot/Migrations/20160901001820_first.cs @@ -98,7 +98,8 @@ namespace NadekoBot.Migrations GuildId = table.Column(nullable: false), SendChannelByeMessage = table.Column(nullable: false), SendChannelGreetMessage = table.Column(nullable: false), - SendDmGreetMessage = table.Column(nullable: false) + SendDmGreetMessage = table.Column(nullable: false), + VoicePlusTextEnabled = table.Column(nullable: false) }, constraints: table => { @@ -295,6 +296,30 @@ namespace NadekoBot.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "FollowedStream", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Autoincrement", true), + ChannelId = table.Column(nullable: false), + GuildConfigId = table.Column(nullable: true), + GuildId = table.Column(nullable: false), + LastStatus = table.Column(nullable: false), + Type = table.Column(nullable: false), + Username = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_FollowedStream", x => x.Id); + table.ForeignKey( + name: "FK_FollowedStream_GuildConfigs_GuildConfigId", + column: x => x.GuildConfigId, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + migrationBuilder.CreateIndex( name: "IX_BlacklistItem_BotConfigId", table: "BlacklistItem", @@ -322,6 +347,11 @@ namespace NadekoBot.Migrations table: "EightBallResponse", column: "BotConfigId"); + migrationBuilder.CreateIndex( + name: "IX_FollowedStream_GuildConfigId", + table: "FollowedStream", + column: "GuildConfigId"); + migrationBuilder.CreateIndex( name: "IX_GuildConfigs_GuildId", table: "GuildConfigs", @@ -374,7 +404,7 @@ namespace NadekoBot.Migrations name: "EightBallResponse"); migrationBuilder.DropTable( - name: "GuildConfigs"); + name: "FollowedStream"); migrationBuilder.DropTable( name: "ModulePrefix"); @@ -400,6 +430,9 @@ namespace NadekoBot.Migrations migrationBuilder.DropTable( name: "ClashOfClans"); + migrationBuilder.DropTable( + name: "GuildConfigs"); + migrationBuilder.DropTable( name: "BotConfig"); } diff --git a/src/NadekoBot/Migrations/20160901010812_second.Designer.cs b/src/NadekoBot/Migrations/20160901010812_second.Designer.cs new file mode 100644 index 00000000..939154cf --- /dev/null +++ b/src/NadekoBot/Migrations/20160901010812_second.Designer.cs @@ -0,0 +1,432 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using NadekoBot.Services.Database.Impl; + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoSqliteContext))] + [Migration("20160901010812_second")] + partial class second + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.0.0-rtm-21431"); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("ItemId"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("BlacklistItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BufferSize"); + + b.Property("CurrencyName"); + + b.Property("CurrencyPluralName"); + + b.Property("CurrencySign"); + + b.Property("DontJoinServers"); + + b.Property("ForwardMessages"); + + b.Property("ForwardToAllOwners"); + + b.Property("RemindMessageFormat"); + + b.Property("RotatingStatuses"); + + b.HasKey("Id"); + + b.ToTable("BotConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BaseDestroyed"); + + b.Property("CallUser"); + + b.Property("ClashWarId"); + + b.Property("Stars"); + + b.Property("TimeAdded"); + + b.HasKey("Id"); + + b.HasIndex("ClashWarId"); + + b.ToTable("ClashCallers"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashWar", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("EnemyClan"); + + b.Property("GuildId"); + + b.Property("Size"); + + b.Property("StartedAt"); + + b.Property("WarState"); + + b.HasKey("Id"); + + b.ToTable("ClashOfClans"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Currency", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Currency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("Name"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Donators"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("EightBallResponse"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("LastStatus"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoAssignRoleId"); + + b.Property("AutoDeleteByeMessages"); + + b.Property("AutoDeleteGreetMessages"); + + b.Property("AutoDeleteGreetMessagesTimer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages"); + + b.Property("ByeMessageChannelId"); + + b.Property("ChannelByeMessageText"); + + b.Property("ChannelGreetMessageText"); + + b.Property("DefaultMusicVolume"); + + b.Property("DeleteMessageOnCommand"); + + b.Property("DmGreetMessageText"); + + b.Property("ExclusiveSelfAssignedRoles"); + + b.Property("GreetMessageChannelId"); + + b.Property("GuildId"); + + b.Property("SendChannelByeMessage"); + + b.Property("SendChannelGreetMessage"); + + b.Property("SendDmGreetMessage"); + + b.Property("VoicePlusTextEnabled"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("GuildConfigs"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("ModuleName"); + + b.Property("Prefix"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("ModulePrefix"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Status"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("PlayingStatus"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuthorId"); + + b.Property("AuthorName") + .IsRequired(); + + b.Property("GuildId"); + + b.Property("Keyword") + .IsRequired(); + + b.Property("Text") + .IsRequired(); + + b.HasKey("Id"); + + b.ToTable("Quotes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Icon"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("RaceAnimal"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("IsPrivate"); + + b.Property("Message"); + + b.Property("ServerId"); + + b.Property("UserId"); + + b.Property("When"); + + b.HasKey("Id"); + + b.ToTable("Reminders"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Repeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildId"); + + b.Property("Interval"); + + b.Property("Message"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId") + .IsUnique(); + + b.ToTable("Repeaters"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.TypingArticle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.ToTable("TypingArticles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("Blacklist") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ClashWar", "ClashWar") + .WithMany("Bases") + .HasForeignKey("ClashWarId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("EightBallResponses") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FollowedStreams") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("ModulePrefixes") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("RotatingStatusMessages") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("RaceAnimals") + .HasForeignKey("BotConfigId"); + }); + } + } +} diff --git a/src/NadekoBot/Migrations/20160901010812_second.cs b/src/NadekoBot/Migrations/20160901010812_second.cs new file mode 100644 index 00000000..b3eee6b4 --- /dev/null +++ b/src/NadekoBot/Migrations/20160901010812_second.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class second : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "TypingArticles", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Autoincrement", true), + Author = table.Column(nullable: true), + Text = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_TypingArticles", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "TypingArticles"); + } + } +} diff --git a/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs b/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs index 456411fc..14198069 100644 --- a/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs +++ b/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs @@ -155,6 +155,30 @@ namespace NadekoBot.Migrations b.ToTable("EightBallResponse"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("LastStatus"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => { b.Property("Id") @@ -194,6 +218,8 @@ namespace NadekoBot.Migrations b.Property("SendDmGreetMessage"); + b.Property("VoicePlusTextEnabled"); + b.HasKey("Id"); b.HasIndex("GuildId") @@ -337,6 +363,20 @@ namespace NadekoBot.Migrations b.ToTable("SelfAssignableRoles"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.TypingArticle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.ToTable("TypingArticles"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") @@ -359,6 +399,13 @@ namespace NadekoBot.Migrations .HasForeignKey("BotConfigId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FollowedStreams") + .HasForeignKey("GuildConfigId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") diff --git a/src/NadekoBot/Modules/Administration/Administration.cs b/src/NadekoBot/Modules/Administration/Administration.cs index f0e8b7a5..77260348 100644 --- a/src/NadekoBot/Modules/Administration/Administration.cs +++ b/src/NadekoBot/Modules/Administration/Administration.cs @@ -48,7 +48,7 @@ namespace NadekoBot.Modules.Administration } ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Restart(IUserMessage umsg) //{ @@ -60,7 +60,7 @@ namespace NadekoBot.Modules.Administration // Environment.Exit(0); //} - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.Administrator)] public async Task Delmsgoncmd(IUserMessage umsg) @@ -80,7 +80,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("❗`Stopped automatic deletion of successfull command invokations.`"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task Setrole(IUserMessage umsg, IGuildUser usr, [Remainder] IRole role) @@ -98,7 +98,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task Removerole(IUserMessage umsg, IGuildUser usr, [Remainder] IRole role) @@ -115,7 +115,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task RenameRole(IUserMessage umsg, IRole roleToEdit, string newname) @@ -137,7 +137,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task RemoveAllRoles(IUserMessage umsg, [Remainder] IGuildUser user) @@ -155,7 +155,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task CreateRole(IUserMessage umsg, [Remainder] string roleName = null) @@ -176,7 +176,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task RoleColor(IUserMessage umsg, params string[] args) @@ -214,7 +214,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.BanMembers)] public async Task Ban(IUserMessage umsg, IGuildUser user) @@ -241,7 +241,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.BanMembers)] public async Task Softban(IUserMessage umsg, IGuildUser user, [Remainder] string msg = null) @@ -267,7 +267,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Kick(IUserMessage umsg, IGuildUser user, [Remainder] string msg = null) { @@ -295,7 +295,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.MuteMembers)] public async Task Mute(IUserMessage umsg, params IGuildUser[] users) @@ -318,7 +318,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.MuteMembers)] public async Task Unmute(IUserMessage umsg, params IGuildUser[] users) @@ -341,7 +341,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.DeafenMembers)] public async Task Deafen(IUserMessage umsg, params IGuildUser[] users) @@ -364,7 +364,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.DeafenMembers)] public async Task UnDeafen(IUserMessage umsg, params IGuildUser[] users) @@ -387,7 +387,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task DelVoiChanl(IUserMessage umsg, [Remainder] IVoiceChannel voiceChannel) @@ -396,7 +396,7 @@ namespace NadekoBot.Modules.Administration await umsg.Channel.SendMessageAsync($"Removed channel **{voiceChannel.Name}**.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task CreatVoiChanl(IUserMessage umsg, [Remainder] string channelName) @@ -406,7 +406,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync($"Created voice channel **{ch.Name}**, id `{ch.Id}`.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task DelTxtChanl(IUserMessage umsg, [Remainder] ITextChannel channel) @@ -415,7 +415,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync($"Removed text channel **{channel.Name}**, id `{channel.Id}`.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task CreaTxtChanl(IUserMessage umsg, [Remainder] string channelName) @@ -425,7 +425,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync($"Added text channel **{txtCh.Name}**, id `{txtCh.Id}`.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task SetTopic(IUserMessage umsg, [Remainder] string topic = null) @@ -436,7 +436,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync(":ok: **New channel topic set.**").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task SetChanlName(IUserMessage umsg, [Remainder] string name) @@ -449,7 +449,7 @@ namespace NadekoBot.Modules.Administration //delets her own messages, no perm required - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Prune(IUserMessage umsg) { @@ -462,7 +462,7 @@ namespace NadekoBot.Modules.Administration } // prune x - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(ChannelPermission.ManageMessages)] public async Task Prune(IUserMessage msg, int count) @@ -481,7 +481,7 @@ namespace NadekoBot.Modules.Administration } //prune @user [x] - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Prune(IUserMessage msg, IGuildUser user, int count = 100) { @@ -491,7 +491,7 @@ namespace NadekoBot.Modules.Administration await msg.Channel.DeleteMessagesAsync(enumerable); } ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Die(IUserMessage umsg) //{ @@ -503,7 +503,7 @@ namespace NadekoBot.Modules.Administration //} ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Setname(IUserMessage umsg, [Remainder] string newName = null) //{ @@ -512,7 +512,7 @@ namespace NadekoBot.Modules.Administration //} ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task NewAvatar(IUserMessage umsg, [Remainder] string img = null) //{ @@ -531,7 +531,7 @@ namespace NadekoBot.Modules.Administration //} ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task SetGame(IUserMessage umsg, [Remainder] string game = null) //{ @@ -543,7 +543,7 @@ namespace NadekoBot.Modules.Administration //} ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Send(IUserMessage umsg, string where, [Remainder] string msg = null) //{ @@ -588,7 +588,7 @@ namespace NadekoBot.Modules.Administration //} ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Announce(IUserMessage umsg, [Remainder] string message) //{ @@ -603,7 +603,7 @@ namespace NadekoBot.Modules.Administration //} ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task SaveChat(IUserMessage umsg, int cnt) //{ @@ -635,7 +635,7 @@ namespace NadekoBot.Modules.Administration //} - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.MentionEveryone)] public async Task MentionRole(IUserMessage umsg, params IRole[] roles) @@ -660,7 +660,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync(send).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Donators(IUserMessage umsg) { @@ -676,7 +676,7 @@ namespace NadekoBot.Modules.Administration } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Donadd(IUserMessage umsg, IUser donator, int amount) { diff --git a/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs b/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs index ff2342cd..cd74103a 100644 --- a/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs @@ -38,7 +38,7 @@ namespace NadekoBot.Modules.Administration }; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task AutoAssignRole(IUserMessage umsg, [Remainder] IRole role = null) diff --git a/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs b/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs index 5c0bd358..f5f2cfe9 100644 --- a/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs +++ b/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs @@ -1,111 +1,103 @@ -//using Discord; -//using Discord.Commands; -//using NadekoBot.Classes; -//using NadekoBot.Modules.Permissions.Classes; -//using System; -//using System.Collections.Concurrent; -//using System.Collections.Generic; -//using System.Linq; +using Discord; +using Discord.Commands; +using Discord.WebSocket; +using NadekoBot.Attributes; +using NadekoBot.Extensions; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; -////todo DB -//namespace NadekoBot.Modules.Administration -//{ -// class CrossServerTextChannel : DiscordCommand -// { -// public CrossServerTextChannel(DiscordModule module) : base(module) -// { -// NadekoBot.Client.MessageReceived += async (s, e) => -// { -// try -// { -// if (umsg.Author.Id == NadekoBot.Client.CurrentUser.Id) return; -// foreach (var subscriber in Subscribers) -// { -// var set = subscriber.Value; -// if (!set.Contains(e.Channel)) -// continue; -// foreach (var chan in set.Except(new[] { e.Channel })) -// { -// await chan.SendMessageAsync(GetText(e.Server, e.Channel, umsg.Author, e.Message)).ConfigureAwait(false); -// } -// } -// } -// catch { } -// }; -// NadekoBot.Client.MessageUpdated += async (s, e) => -// { -// try -// { -// if (e.After?.User?.Id == null || e.After.User.Id == NadekoBot.Client.CurrentUser.Id) return; -// foreach (var subscriber in Subscribers) -// { -// var set = subscriber.Value; -// if (!set.Contains(e.Channel)) -// continue; -// foreach (var chan in set.Except(new[] { e.Channel })) -// { -// var msg = chan.Messages -// .FirstOrDefault(m => -// m.RawText == GetText(e.Server, e.Channel, umsg.Author, e.Before)); -// if (msg != default(Message)) -// await msg.Edit(GetText(e.Server, e.Channel, umsg.Author, e.After)).ConfigureAwait(false); -// } -// } +namespace NadekoBot.Modules.Administration +{ + public partial class Administration + { + [Group] + public class CrossServerTextChannel + { + public CrossServerTextChannel() + { + NadekoBot.Client.MessageReceived += (imsg) => + { + var msg = imsg as IUserMessage; + if (msg == null) + return Task.CompletedTask; -// } -// catch { } -// }; -// } + var channel = imsg.Channel as ITextChannel; + if (channel == null) + return Task.CompletedTask; -// private string GetText(Server server, Channel channel, User user, Message message) => -// $"**{server.Name} | {channel.Name}** `{user.Name}`: " + message.RawText; + Task.Run(async () => + { + try + { + if (msg.Author.Id == NadekoBot.Client.GetCurrentUser().Id) return; + foreach (var subscriber in Subscribers) + { + var set = subscriber.Value; + if (!set.Contains(msg.Channel)) + continue; + foreach (var chan in set.Except(new[] { channel })) + { + await chan.SendMessageAsync(GetText(channel.Guild, channel, (IGuildUser)msg.Author, msg)).ConfigureAwait(false); + } + } + } + catch { } + }); -// public static readonly ConcurrentDictionary> Subscribers = new ConcurrentDictionary>(); + return Task.CompletedTask; + }; + } -// internal override void Init(CommandGroupBuilder cgb) -// { -// cgb.CreateCommand(Module.Prefix + "scsc") -// .Description("Starts an instance of cross server channel. You will get a token as a DM " + -// $"that other people will use to tune in to the same instance. **Bot Owner Only.** | `{Prefix}scsc`") -// .AddCheck(SimpleCheckers.OwnerOnly()) -// .Do(async e => -// { -// var token = new Random().Next(); -// var set = new HashSet(); -// if (Subscribers.TryAdd(token, set)) -// { -// set.Add(e.Channel); -// await umsg.Author.SendMessageAsync("This is your CSC token:" + token.ToString()).ConfigureAwait(false); -// } -// }); + private string GetText(IGuild server, ITextChannel channel, IGuildUser user, IUserMessage message) => + $"**{server.Name} | {channel.Name}** `{user.Username}`: " + message.Content; -// cgb.CreateCommand(Module.Prefix + "jcsc") -// .Description($"Joins current channel to an instance of cross server channel using the token. **Needs Manage Server Permissions.**| `{Prefix}jcsc`") -// .Parameter("token") -// .AddCheck(SimpleCheckers.ManageServer()) -// .Do(async e => -// { -// int token; -// if (!int.TryParse(token, out token)) -// return; -// HashSet set; -// if (!Subscribers.TryGetValue(token, out set)) -// return; -// set.Add(e.Channel); -// await channel.SendMessageAsync(":ok:").ConfigureAwait(false); -// }); + public static readonly ConcurrentDictionary> Subscribers = new ConcurrentDictionary>(); -// cgb.CreateCommand(Module.Prefix + "lcsc") -// .Description($"Leaves Cross server channel instance from this channel. **Needs Manage Server Permissions.**| `{Prefix}lcsc`") -// .AddCheck(SimpleCheckers.ManageServer()) -// .Do(async e => -// { -// foreach (var subscriber in Subscribers) -// { -// subscriber.Value.Remove(e.Channel); -// } -// await channel.SendMessageAsync(":ok:").ConfigureAwait(false); -// }); -// } -// } -//} + ////todo owner only + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + //[RequireContext(ContextType.Guild)] + //public async Task Scsc(IUserMessage msg) + //{ + // var channel = (ITextChannel)msg.Channel; + // var token = new Random().Next(); + // var set = new HashSet(); + // if (Subscribers.TryAdd(token, set)) + // { + // set.Add(channel); + // await ((IGuildUser)msg.Author).SendMessageAsync("This is your CSC token:" + token.ToString()).ConfigureAwait(false); + // } + //} + + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.ManageGuild)] + public async Task Jcsc(IUserMessage imsg, int token) + { + var channel = (ITextChannel)imsg.Channel; + + HashSet set; + if (!Subscribers.TryGetValue(token, out set)) + return; + set.Add(channel); + await channel.SendMessageAsync(":ok:").ConfigureAwait(false); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.ManageGuild)] + public async Task Lcsc(IUserMessage imsg) + { + var channel = (ITextChannel)imsg.Channel; + + foreach (var subscriber in Subscribers) + { + subscriber.Value.Remove(channel); + } + await channel.SendMessageAsync(":ok:").ConfigureAwait(false); + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Administration/Commands/LogCommand - Copy.cs b/src/NadekoBot/Modules/Administration/Commands/LogCommand - Copy.cs new file mode 100644 index 00000000..220c1d51 --- /dev/null +++ b/src/NadekoBot/Modules/Administration/Commands/LogCommand - Copy.cs @@ -0,0 +1,33 @@ +using Discord; +using Discord.Commands; +using Discord.WebSocket; +using NadekoBot.Extensions; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Administration +{ + public partial class Administration { + [Group] + public class LogCommands + { + private DiscordSocketClient _client; + + private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】"; + + public LogCommands(DiscordSocketClient client) + { + _client = client; + _client.MessageReceived += _client_MessageReceived; + } + + private Task _client_MessageReceived(IMessage arg) + { + throw new NotImplementedException(); + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs b/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs index 012a580a..8b205fdf 100644 --- a/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs +++ b/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs @@ -13,7 +13,7 @@ ////todo Add flags for every event //namespace NadekoBot.Modules.Administration //{ -// internal class LogCommand : DiscordCommand +// public class LogCommand : DiscordCommand // { // private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】"; @@ -373,7 +373,7 @@ // catch { } // } -// internal override void Init(CommandGroupBuilder cgb) +// public override void Init(CommandGroupBuilder cgb) // { // cgb.CreateCommand(Module.Prefix + "spmom") diff --git a/src/NadekoBot/Modules/Administration/Commands/MessageRepeater.cs b/src/NadekoBot/Modules/Administration/Commands/MessageRepeater.cs index dfefc505..57c5fe9a 100644 --- a/src/NadekoBot/Modules/Administration/Commands/MessageRepeater.cs +++ b/src/NadekoBot/Modules/Administration/Commands/MessageRepeater.cs @@ -73,7 +73,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageMessages)] public async Task RepeatInvoke(IUserMessage imsg) @@ -90,7 +90,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("🔄 " + rep.Repeater.Message).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Repeat(IUserMessage imsg) { @@ -110,7 +110,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("`No message is repeating.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Repeat(IUserMessage imsg, int minutes, [Remainder] string message) { diff --git a/src/NadekoBot/Modules/Administration/Commands/PlayingRotateCommands.cs b/src/NadekoBot/Modules/Administration/Commands/PlayingRotateCommands.cs index 34e36096..59baf3d4 100644 --- a/src/NadekoBot/Modules/Administration/Commands/PlayingRotateCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/PlayingRotateCommands.cs @@ -86,7 +86,7 @@ namespace NadekoBot.Modules.Administration {"%queued%", () => Music.Music.MusicPlayers.Sum(kvp => kvp.Value.Playlist.Count).ToString()} }; - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task RotatePlaying(IUserMessage umsg) { @@ -106,7 +106,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("`Rotating playing status disabled.`"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task AddPlaying(IUserMessage umsg, [Remainder] string status) { @@ -122,7 +122,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("`Added.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ListPlaying(IUserMessage umsg) { @@ -144,7 +144,7 @@ namespace NadekoBot.Modules.Administration } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task RemovePlaying(IUserMessage umsg, int index) { diff --git a/src/NadekoBot/Modules/Administration/Commands/RatelimitCommand.cs b/src/NadekoBot/Modules/Administration/Commands/RatelimitCommand.cs index 16ae221e..c1460795 100644 --- a/src/NadekoBot/Modules/Administration/Commands/RatelimitCommand.cs +++ b/src/NadekoBot/Modules/Administration/Commands/RatelimitCommand.cs @@ -5,9 +5,9 @@ using NadekoBot.Attributes; using NadekoBot.Extensions; using System; using System.Collections.Concurrent; +using System.Threading; using System.Threading.Tasks; -//todo rewrite to accept msg/sec (for example 1/5 - 1 message every 5 seconds) namespace NadekoBot.Modules.Administration { public partial class Administration @@ -15,58 +15,103 @@ namespace NadekoBot.Modules.Administration [Group] public class RatelimitCommand { - public static ConcurrentDictionary> RatelimitingChannels = new ConcurrentDictionary>(); + public static ConcurrentDictionary RatelimitingChannels = new ConcurrentDictionary(); - private static readonly TimeSpan ratelimitTime = new TimeSpan(0, 0, 0, 5); private DiscordSocketClient _client { get; } + public class Ratelimiter + { + public class RatelimitedUser + { + public ulong UserId { get; set; } + public int MessageCount { get; set; } = 0; + } + + public ulong ChannelId { get; set; } + + public int MaxMessages { get; set; } + public int PerSeconds { get; set; } + + public CancellationTokenSource cancelSource { get; set; } = new CancellationTokenSource(); + + public ConcurrentDictionary Users { get; set; } = new ConcurrentDictionary(); + + public bool CheckUserRatelimit(ulong id) + { + RatelimitedUser usr = Users.GetOrAdd(id, (key) => new RatelimitedUser() { UserId = id }); + if (usr.MessageCount == MaxMessages) + { + return true; + } + else + { + usr.MessageCount++; + var t = Task.Run(async () => { + try + { + await Task.Delay(PerSeconds * 1000, cancelSource.Token); + } + catch (OperationCanceledException) { } + usr.MessageCount--; + }); + return false; + } + + } + } + public RatelimitCommand() { - this._client = NadekoBot.Client; - _client.MessageReceived += async (umsg) => + _client.MessageReceived += (umsg) => { - var usrMsg = umsg as IUserMessage; - var channel = usrMsg.Channel as ITextChannel; - - if (channel == null || await usrMsg.IsAuthor()) - return; - ConcurrentDictionary userTimePair; - if (!RatelimitingChannels.TryGetValue(channel.Id, out userTimePair)) return; - DateTime lastMessageTime; - if (userTimePair.TryGetValue(usrMsg.Author.Id, out lastMessageTime)) + var t = Task.Run(async () => { - if (DateTime.Now - lastMessageTime < ratelimitTime) - { - try - { - await usrMsg.DeleteAsync().ConfigureAwait(false); - } - catch { } + var usrMsg = umsg as IUserMessage; + var channel = usrMsg.Channel as ITextChannel; + + if (channel == null || await usrMsg.IsAuthor()) return; - } - } - userTimePair.AddOrUpdate(usrMsg.Author.Id, id => DateTime.Now, (id, dt) => DateTime.Now); + Ratelimiter limiter; + if (!RatelimitingChannels.TryGetValue(channel.Id, out limiter)) + return; + + if (limiter.CheckUserRatelimit(usrMsg.Author.Id)) + await usrMsg.DeleteAsync(); + }); + return Task.CompletedTask; }; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] - public async Task Slowmode(IUserMessage umsg) + public async Task Slowmode(IUserMessage umsg, int msg = 1, int perSec = 5) { var channel = (ITextChannel)umsg.Channel; - ConcurrentDictionary throwaway; + Ratelimiter throwaway; if (RatelimitingChannels.TryRemove(channel.Id, out throwaway)) { - await channel.SendMessageAsync("Slow mode disabled.").ConfigureAwait(false); + throwaway.cancelSource.Cancel(); + await channel.SendMessageAsync("`Slow mode disabled.`").ConfigureAwait(false); return; } - if (RatelimitingChannels.TryAdd(channel.Id, new ConcurrentDictionary())) + + if (msg < 1 || perSec < 1) { - await channel.SendMessageAsync("Slow mode initiated. " + - "Users can't send more than 1 message every 5 seconds.") + await channel.SendMessageAsync("`Invalid parameters.`"); + return; + } + + if (RatelimitingChannels.TryAdd(channel.Id,throwaway = new Ratelimiter() { + ChannelId = channel.Id, + MaxMessages = msg, + PerSeconds = perSec, + })) + { + await channel.SendMessageAsync("`Slow mode initiated.` " + + $"Users can't send more than {throwaway.MaxMessages} message(s) every {throwaway.PerSeconds} second(s).") .ConfigureAwait(false); } } diff --git a/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs b/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs index 291e065b..8a05ceea 100644 --- a/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs +++ b/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs @@ -19,7 +19,7 @@ namespace NadekoBot.Modules.Administration public class SelfAssignedRolesCommands { - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task Asar(IUserMessage umsg, [Remainder] IRole role) @@ -49,7 +49,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync(msg.ToString()).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task Rsar(IUserMessage umsg, [Remainder] IRole role) @@ -70,7 +70,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync($":ok:**{role.Name}** has been removed from the list of self-assignable roles").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Lsar(IUserMessage umsg) { @@ -105,7 +105,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync(msg.ToString() + "\n\n" + removeMsg.ToString()).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task Tesar(IUserMessage umsg) @@ -124,7 +124,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Self assigned roles are now " + exl); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Iam(IUserMessage umsg, [Remainder] IRole role) { @@ -182,7 +182,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Iamnot(IUserMessage umsg, [Remainder] IRole role) { diff --git a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs index fc6052cf..ef6c11a6 100644 --- a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs @@ -20,7 +20,7 @@ // this._client = client; // } -// [LocalizedCommand, LocalizedDescription, LocalizedSummary] +// [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] // [RequireContext(ContextType.Guild)] // public async Task Leave(IUserMessage umsg, [Remainder] string guildStr) // { diff --git a/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs b/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs index 98867f8e..53a5abd5 100644 --- a/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs @@ -106,7 +106,7 @@ namespace NadekoBot.Modules.Administration return Task.CompletedTask; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task GreetDel(IUserMessage umsg) @@ -128,7 +128,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("`Automatic deletion of greet messages has been disabled.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task Greet(IUserMessage umsg) @@ -151,7 +151,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Greet announcements disabled.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task GreetMsg(IUserMessage umsg, [Remainder] string text) @@ -180,7 +180,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Enable greet messsages by typing `.greet`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task GreetDm(IUserMessage umsg) @@ -202,7 +202,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Greet announcements disabled.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task GreetDmMsg(IUserMessage umsg, [Remainder] string text) @@ -231,7 +231,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Enable DM greet messsages by typing `.greetdm`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task Bye(IUserMessage umsg) @@ -254,7 +254,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Bye announcements disabled.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task ByeMsg(IUserMessage umsg, [Remainder] string text) @@ -283,7 +283,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Enable bye messsages by typing `.bye`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task ByeDel(IUserMessage umsg) diff --git a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommand.cs b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommand.cs deleted file mode 100644 index 7d8bab1a..00000000 --- a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommand.cs +++ /dev/null @@ -1,166 +0,0 @@ -//using Discord; -//using Discord.Commands; -//using NadekoBot.Classes; -//using NadekoBot.Extensions; -//using NadekoBot.Modules.Permissions.Classes; -//using System; -//using System.Linq; -//using System.Text.RegularExpressions; -//using System.Threading.Tasks; -//using ChPermOverride = Discord.ChannelPermissionOverrides; - -////todo DB -////todo rewrite -//namespace NadekoBot.Modules.Administration -//{ -// internal class VoicePlusTextCommand : DiscordCommand -// { -// Regex channelNameRegex = new Regex(@"[^a-zA-Z0-9 -]", RegexOptions.Compiled); -// public VoicePlusTextCommand(DiscordModule module) : base(module) -// { -// // changing servers may cause bugs -// NadekoBot.Client.UserUpdated += async (sender, e) => -// { -// try -// { -// if (e.Server == null) -// return; -// var config = SpecificConfigurations.Default.Of(e.Server.Id); -// if (e.Before.VoiceChannel == e.After.VoiceChannel) return; -// if (!config.VoicePlusTextEnabled) -// return; -// var serverPerms = e.Server.GetUser(NadekoBot.Client.CurrentUser.Id)?.ServerPermissions; -// if (serverPerms == null) -// return; -// if (!serverPerms.Value.ManageChannels || !serverPerms.Value.ManageRoles) -// { - -// try -// { -// await e.Server.Owner.SendMessageAsync( -// "I don't have manage server and/or Manage Channels permission," + -// $" so I cannot run voice+text on **{e.Server.Name}** server.").ConfigureAwait(false); -// } -// catch { } // meh -// config.VoicePlusTextEnabled = false; -// return; -// } - - -// var beforeVch = e.Before.VoiceChannel; -// if (beforeVch != null) -// { -// var textChannel = -// e.Server.FindChannels(GetChannelName(beforeVch.Name), ChannelType.Text).FirstOrDefault(); -// if (textChannel != null) -// await textChannel.AddPermissionsRule(e.Before, -// new ChPermOverride(readMessages: PermValue.Deny, -// sendMessages: PermValue.Deny)).ConfigureAwait(false); -// } -// var afterVch = e.After.VoiceChannel; -// if (afterVch != null && e.Server.AFKChannel != afterVch) -// { -// var textChannel = e.Server.FindChannels( -// GetChannelName(afterVch.Name), -// ChannelType.Text) -// .FirstOrDefault(); -// if (textChannel == null) -// { -// textChannel = (await e.Server.CreateChannel(GetChannelName(afterVch.Name), ChannelType.Text).ConfigureAwait(false)); -// await textChannel.AddPermissionsRule(e.Server.EveryoneRole, -// new ChPermOverride(readMessages: PermValue.Deny, -// sendMessages: PermValue.Deny)).ConfigureAwait(false); -// } -// await textChannel.AddPermissionsRule(e.After, -// new ChPermOverride(readMessages: PermValue.Allow, -// sendMessages: PermValue.Allow)).ConfigureAwait(false); -// } -// } -// catch (Exception ex) -// { -// Console.WriteLine(ex); -// } -// }; -// } - -// private string GetChannelName(string voiceName) => -// channelNameRegex.Replace(voiceName, "").Trim().Replace(" ", "-").TrimTo(90, true) + "-voice"; - -// internal override void Init(CommandGroupBuilder cgb) -// { -// cgb.CreateCommand(Module.Prefix + "cleanv+t") -// .Alias(Module.Prefix + "cv+t") -// .Description($"Deletes all text channels ending in `-voice` for which voicechannels are not found. **Use at your own risk.\nNeeds Manage Roles and Manage Channels Permissions.** | `{Prefix}cleanv+t`") -// .AddCheck(SimpleCheckers.CanManageRoles) -// .AddCheck(SimpleCheckers.ManageChannels()) -// .Do(async e => -// { -// if (!e.Server.CurrentUser.ServerPermissions.ManageChannels) -// { -// await channel.SendMessageAsync("`I have insufficient permission to do that.`"); -// return; -// } - -// var allTxtChannels = e.Server.TextChannels.Where(c => c.Name.EndsWith("-voice")); -// var validTxtChannelNames = e.Server.VoiceChannels.Select(c => GetChannelName(c.Name)); - -// var invalidTxtChannels = allTxtChannels.Where(c => !validTxtChannelNames.Contains(c.Name)); - -// foreach (var c in invalidTxtChannels) -// { -// try -// { -// await c.Delete(); -// } -// catch { } -// await Task.Delay(500); -// } - -// await channel.SendMessageAsync("`Done.`"); -// }); - -// cgb.CreateCommand(Module.Prefix + "voice+text") -// .Alias(Module.Prefix + "v+t") -// .Description("Creates a text channel for each voice channel only users in that voice channel can see." + -// $"If you are server owner, keep in mind you will see them all the time regardless. **Needs Manage Roles and Manage Channels Permissions.**| `{Prefix}voice+text`") -// .AddCheck(SimpleCheckers.ManageChannels()) -// .AddCheck(SimpleCheckers.CanManageRoles) -// .Do(async e => -// { -// try -// { -// var config = SpecificConfigurations.Default.Of(e.Server.Id); -// if (config.VoicePlusTextEnabled == true) -// { -// config.VoicePlusTextEnabled = false; -// foreach (var textChannel in e.Server.TextChannels.Where(c => c.Name.EndsWith("-voice"))) -// { -// try -// { -// await textChannel.Delete().ConfigureAwait(false); -// } -// catch -// { -// await channel.SendMessageAsync( -// ":anger: Error: Most likely i don't have permissions to do this.") -// .ConfigureAwait(false); -// return; -// } -// } -// await channel.SendMessageAsync("Successfuly removed voice + text feature.").ConfigureAwait(false); -// return; -// } -// config.VoicePlusTextEnabled = true; -// await channel.SendMessageAsync("Successfuly enabled voice + text feature. " + -// "**Make sure the bot has manage roles and manage channels permissions**") -// .ConfigureAwait(false); - -// } -// catch (Exception ex) -// { -// await channel.SendMessageAsync(ex.ToString()).ConfigureAwait(false); -// } -// }); -// } -// } -//} diff --git a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs new file mode 100644 index 00000000..a9d60515 --- /dev/null +++ b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs @@ -0,0 +1,170 @@ +using Discord; +using Discord.Commands; +using Discord.WebSocket; +using NadekoBot.Attributes; +using NadekoBot.Extensions; +using NadekoBot.Services; +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Administration +{ + public partial class Administration + { + [Group] + public class VoicePlusTextCommands + { + Regex channelNameRegex = new Regex(@"[^a-zA-Z0-9 -]", RegexOptions.Compiled); + //guildid/voiceplustextenabled + private ConcurrentDictionary voicePlusTextCache; + public VoicePlusTextCommands() + { + NadekoBot.Client.UserUpdated += UserUpdatedEventHandler; + voicePlusTextCache = new ConcurrentDictionary(); + } + + private Task UserUpdatedEventHandler(IGuildUser before, IGuildUser after) + { + Task.Run(async () => + { + var guild = before.Guild ?? after.Guild; + var botUserPerms = guild.GetCurrentUser().GuildPermissions; + try + { + if (before.VoiceChannel == after.VoiceChannel) return; + + bool isEnabled; + voicePlusTextCache.TryGetValue(guild.Id, out isEnabled); + if (!isEnabled) + return; + + if (!botUserPerms.ManageChannels || !botUserPerms.ManageRoles) + { + try + { + await (await guild.GetOwnerAsync()).SendMessageAsync( + "I don't have manage server and/or Manage Channels permission," + + $" so I cannot run voice+text on **{guild.Name}** server.").ConfigureAwait(false); + } + catch { } + using (var uow = DbHandler.UnitOfWork()) + { + uow.GuildConfigs.For(before.Guild.Id).VoicePlusTextEnabled = false; + voicePlusTextCache.TryUpdate(guild.Id, false, true); + } + return; + } + + + var beforeVch = before.VoiceChannel; + if (beforeVch != null) + { + var textChannel = guild.GetTextChannels().Where(t => t.Name == GetChannelName(beforeVch.Name)).FirstOrDefault(); + if (textChannel != null) + await textChannel.AddPermissionOverwriteAsync(before, + new OverwritePermissions(readMessages: PermValue.Deny, + sendMessages: PermValue.Deny)).ConfigureAwait(false); + } + var afterVch = after.VoiceChannel; + if (afterVch != null && guild.AFKChannelId != afterVch.Id) + { + var textChannel = guild.GetTextChannels() + .Where(t => t.Name == GetChannelName(afterVch.Name)) + .FirstOrDefault(); + if (textChannel == null) + { + textChannel = (await guild.CreateTextChannelAsync(GetChannelName(afterVch.Name)).ConfigureAwait(false)); + await textChannel.AddPermissionOverwriteAsync(guild.EveryoneRole, + new OverwritePermissions(readMessages: PermValue.Deny, + sendMessages: PermValue.Deny)).ConfigureAwait(false); + } + await textChannel.AddPermissionOverwriteAsync(after, + new OverwritePermissions(readMessages: PermValue.Allow, + sendMessages: PermValue.Allow)).ConfigureAwait(false); + } + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + }); + return Task.CompletedTask; + } + + private string GetChannelName(string voiceName) => + channelNameRegex.Replace(voiceName, "").Trim().Replace(" ", "-").TrimTo(90, true) + "-voice"; + + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.ManageRoles)] + [RequirePermission(GuildPermission.ManageChannels)] + public async Task VoicePlusText(IUserMessage msg, [Remainder] string arg) + { + var channel = (ITextChannel)msg.Channel; + var guild = channel.Guild; + + var botUser = guild.GetCurrentUser(); + if (!botUser.GuildPermissions.ManageRoles || !botUser.GuildPermissions.ManageChannels) + { + await channel.SendMessageAsync(":anger: `I require manage roles and manage channels permissions to enable this feature.`"); + return; + } + try + { + bool isEnabled; + using (var uow = DbHandler.UnitOfWork()) + { + var conf = uow.GuildConfigs.For(guild.Id); + isEnabled = conf.VoicePlusTextEnabled = !conf.VoicePlusTextEnabled; + } + voicePlusTextCache.AddOrUpdate(guild.Id, isEnabled, (id, val) => isEnabled); + if (isEnabled) + { + foreach (var textChannel in guild.GetTextChannels().Where(c => c.Name.EndsWith("-voice"))) + { + try { await textChannel.DeleteAsync().ConfigureAwait(false); } catch { } + } + await channel.SendMessageAsync("Successfuly removed voice + text feature.").ConfigureAwait(false); + return; + } + await channel.SendMessageAsync("Successfuly enabled voice + text feature.").ConfigureAwait(false); + + } + catch (Exception ex) + { + await channel.SendMessageAsync(ex.ToString()).ConfigureAwait(false); + } + } + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.ManageChannels)] + [RequirePermission(GuildPermission.ManageRoles)] + public async Task CleanVPlusT(IUserMessage msg, [Remainder] string arg) + { + var channel = (ITextChannel)msg.Channel; + var guild = channel.Guild; + if (!guild.GetCurrentUser().GuildPermissions.ManageChannels) + { + await channel.SendMessageAsync("`I have insufficient permission to do that.`"); + return; + } + + var allTxtChannels = guild.GetTextChannels().Where(c => c.Name.EndsWith("-voice")); + var validTxtChannelNames = guild.GetVoiceChannels().Select(c => GetChannelName(c.Name)); + + var invalidTxtChannels = allTxtChannels.Where(c => !validTxtChannelNames.Contains(c.Name)); + + foreach (var c in invalidTxtChannels) + { + try { await c.DeleteAsync().ConfigureAwait(false); } catch { } + await Task.Delay(500); + } + + await channel.SendMessageAsync("`Done.`"); + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs b/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs index d2aa77a1..9dc4ebf1 100644 --- a/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs +++ b/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs @@ -54,7 +54,7 @@ namespace NadekoBot.Modules.ClashOfClans } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task CreateWar(IUserMessage umsg, int size, [Remainder] string enemyClan = null) { @@ -87,7 +87,7 @@ namespace NadekoBot.Modules.ClashOfClans await channel.SendMessageAsync($"❗🔰**CREATED CLAN WAR AGAINST {cw.ShortPrint()}**").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task StartWar(IUserMessage umsg, [Remainder] string number = null) { @@ -115,7 +115,7 @@ namespace NadekoBot.Modules.ClashOfClans SaveWar(war); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ListWar(IUserMessage umsg, [Remainder] string number = null) { @@ -158,7 +158,7 @@ namespace NadekoBot.Modules.ClashOfClans await channel.SendMessageAsync(warsInfo.Item1[warsInfo.Item2].ToPrettyString()).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Claim(IUserMessage umsg, int number, int baseNumber, [Remainder] string other_name = null) { @@ -186,7 +186,7 @@ namespace NadekoBot.Modules.ClashOfClans } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ClaimFinish1(IUserMessage umsg, int number, int baseNumber, [Remainder] string other_name = null) { @@ -194,7 +194,7 @@ namespace NadekoBot.Modules.ClashOfClans await FinishClaim(umsg, number, baseNumber, other_name, 1); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ClaimFinish2(IUserMessage umsg, int number, int baseNumber, [Remainder] string other_name = null) { @@ -202,7 +202,7 @@ namespace NadekoBot.Modules.ClashOfClans await FinishClaim(umsg, number, baseNumber, other_name, 2); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ClaimFinish(IUserMessage umsg, int number, int baseNumber, [Remainder] string other_name = null) { @@ -210,7 +210,7 @@ namespace NadekoBot.Modules.ClashOfClans await FinishClaim(umsg, number, baseNumber, other_name); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task EndWar(IUserMessage umsg, int number) { @@ -231,7 +231,7 @@ namespace NadekoBot.Modules.ClashOfClans warsInfo.Item1.RemoveAt(warsInfo.Item2); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Unclaim(IUserMessage umsg, int number, [Remainder] string otherName = null) { diff --git a/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs b/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs index 7aece0bc..e7787e9e 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs @@ -20,7 +20,7 @@ namespace NadekoBot.Modules.Gambling { public static ConcurrentDictionary AnimalRaces = new ConcurrentDictionary(); - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Race(IUserMessage umsg) { @@ -32,7 +32,7 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync("🏁 `Failed starting a race. Another race is probably running.`"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task JoinRace(IUserMessage umsg, int amount = 0) { @@ -60,7 +60,7 @@ namespace NadekoBot.Modules.Gambling private ConcurrentQueue animals { get; } - public bool Fail { get; internal set; } + public bool Fail { get; set; } public List participants = new List(); private ulong serverId; diff --git a/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs index c3e9d9ed..c9556d9d 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs @@ -14,17 +14,17 @@ namespace NadekoBot.Modules.Gambling { private Regex dndRegex { get; } = new Regex(@"(?\d+)d(?\d+)", RegexOptions.Compiled); - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public Task Roll(IUserMessage umsg, [Remainder] string arg = null) => - InternalRoll(umsg, arg, true); + publicRoll(umsg, arg, true); - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public Task Rolluo(IUserMessage umsg, [Remainder] string arg = null) => - InternalRoll(umsg, arg, false); + publicRoll(umsg, arg, false); //todo drawing - private async Task InternalRoll(IUserMessage umsg, string arg, bool ordered) + private async Task publicRoll(IUserMessage umsg, string arg, bool ordered) { var channel = (ITextChannel)umsg.Channel; var r = new Random(); @@ -106,7 +106,7 @@ namespace NadekoBot.Modules.Gambling //} } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task NRoll(IUserMessage umsg, [Remainder] string range) { diff --git a/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs index 099649f6..17c5033b 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs @@ -11,11 +11,11 @@ ////todo drawing //namespace NadekoBot.Modules.Gambling //{ -// internal class DrawCommand : DiscordCommand +// public class DrawCommand : DiscordCommand // { // public DrawCommand(DiscordModule module) : base(module) { } -// internal override void Init(CommandGroupBuilder cgb) +// public override void Init(CommandGroupBuilder cgb) // { // cgb.CreateCommand(Module.Prefix + "draw") // .Description($"Draws a card from the deck.If you supply number [x], she draws up to 5 cards from the deck. | `{Prefix}draw [x]`") diff --git a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs index 2afca817..cc20db4c 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs @@ -12,7 +12,7 @@ namespace NadekoBot.Modules.Gambling ////todo drawing - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Flip(IUserMessage imsg, int count = 0) //{ @@ -39,7 +39,7 @@ namespace NadekoBot.Modules.Gambling // await channel.SendMessageAsync("Invalid number").ConfigureAwait(false); //} - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Betflip(IUserMessage umsg, int amount, string guess) //{ diff --git a/src/NadekoBot/Modules/Gambling/Gambling.cs b/src/NadekoBot/Modules/Gambling/Gambling.cs index 73eacc19..2151fdf6 100644 --- a/src/NadekoBot/Modules/Gambling/Gambling.cs +++ b/src/NadekoBot/Modules/Gambling/Gambling.cs @@ -34,7 +34,7 @@ namespace NadekoBot.Modules.Gambling } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Raffle(IUserMessage umsg, [Remainder] IRole role = null) { @@ -48,7 +48,7 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync($"**Raffled user:** {usr.Username} (id: {usr.Id})").ConfigureAwait(false); } - [LocalizedCommand("$$$"), LocalizedDescription("$$$"), LocalizedSummary("$$$")] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Cash(IUserMessage umsg, [Remainder] IUser user = null) { @@ -66,7 +66,7 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync($"{user.Username} has {amount} {config.CurrencySign}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Give(IUserMessage umsg, long amount, [Remainder] IUser receiver) { @@ -92,12 +92,12 @@ namespace NadekoBot.Modules.Gambling } ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public Task Award(IUserMessage umsg, long amount, [Remainder] IGuildUser usr) => // Award(umsg, amount, usr.Id); - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Award(IUserMessage umsg, long amount, [Remainder] ulong usrId) //{ @@ -112,13 +112,13 @@ namespace NadekoBot.Modules.Gambling //} ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public Task Take(IUserMessage umsg, long amount, [Remainder] IGuildUser user) => // Take(umsg, amount, user.Id); //todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Take(IUserMessage umsg, long amount, [Remainder] ulong usrId) //{ @@ -131,7 +131,7 @@ namespace NadekoBot.Modules.Gambling // await channel.SendMessageAsync($"{umsg.Author.Mention} successfully took {amount} {Gambling.CurrencyName}s from <@{usrId}>!").ConfigureAwait(false); //} - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task BetRoll(IUserMessage umsg, long amount) { @@ -181,7 +181,7 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync(str).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Leaderboard(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Games/Commands/LeetCommands.cs b/src/NadekoBot/Modules/Games/Commands/LeetCommands.cs index 26408cd2..c327e823 100644 --- a/src/NadekoBot/Modules/Games/Commands/LeetCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/LeetCommands.cs @@ -12,7 +12,7 @@ namespace NadekoBot.Modules.Games { public partial class GamesModule { - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Leet(IUserMessage umsg, int level, [Remainder] string text = null) { diff --git a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs index 3700813e..f7dcd48a 100644 --- a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs @@ -63,7 +63,7 @@ // private SemaphoreSlim locker = new SemaphoreSlim(1,1); -// internal override void Init(CommandGroupBuilder cgb) +// public override void Init(CommandGroupBuilder cgb) // { // cgb.CreateCommand(Module.Prefix + "pick") // .Description($"Picks a flower planted in this channel. | `{Prefix}pick`") diff --git a/src/NadekoBot/Modules/Games/Commands/PollCommands.cs b/src/NadekoBot/Modules/Games/Commands/PollCommands.cs index e8b3711c..37cae486 100644 --- a/src/NadekoBot/Modules/Games/Commands/PollCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PollCommands.cs @@ -14,7 +14,7 @@ namespace NadekoBot.Modules.Games { public static ConcurrentDictionary ActivePolls = new ConcurrentDictionary(); - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Poll(IUserMessage umsg, [Remainder] string arg = null) { @@ -35,7 +35,7 @@ namespace NadekoBot.Modules.Games } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Pollend(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs b/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs index 875f235c..54ce8226 100644 --- a/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs @@ -1,196 +1,190 @@ -//using Discord; -//using Discord.Commands; -//using NadekoBot.Classes; -//using NadekoBot.DataModels; -//using NadekoBot.Extensions; -//using System; -//using System.Collections.Concurrent; -//using System.Collections.Generic; -//using System.Diagnostics; -//using System.Linq; -//using System.Threading.Tasks; +using Discord; +using Discord.Commands; +using Discord.WebSocket; +using NadekoBot.Attributes; +using NadekoBot.Extensions; +using NadekoBot.Services; +using NadekoBot.Services.Database; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; -////todo DB -////todo Rewrite? -//namespace NadekoBot.Modules.Games -//{ -// public static class SentencesProvider -// { -// internal static string GetRandomSentence() -// { -// var data = DbHandler.Instance.GetAllRows(); -// try -// { -// return data.ToList()[new Random().Next(0, data.Count())].Text; -// } -// catch -// { -// return "Failed retrieving data from parse. Owner didn't add any articles to type using `typeadd`."; -// } -// } -// } +namespace NadekoBot.Modules.Games +{ + public class TypingGame + { + public const float WORD_VALUE = 4.5f; + private readonly ITextChannel channel; + public string CurrentSentence; + public bool IsActive; + private readonly Stopwatch sw; + private readonly List finishedUserIds; -// public class TypingGame -// { -// public const float WORD_VALUE = 4.5f; -// private readonly Channel channel; -// public string CurrentSentence; -// public bool IsActive; -// private readonly Stopwatch sw; -// private readonly List finishedUserIds; + public TypingGame(ITextChannel channel) + { + this.channel = channel; + IsActive = false; + sw = new Stopwatch(); + finishedUserIds = new List(); + } -// public TypingGame(Channel channel) -// { -// this.channel = channel; -// IsActive = false; -// sw = new Stopwatch(); -// finishedUserIds = new List(); -// } + public ITextChannel Channel { get; set; } -// public Channel Channell { get; internal set; } + public async Task Stop() + { + if (!IsActive) return false; + NadekoBot.Client.MessageReceived -= AnswerReceived; + finishedUserIds.Clear(); + IsActive = false; + sw.Stop(); + sw.Reset(); + await channel.SendMessageAsync("Typing contest stopped").ConfigureAwait(false); + return true; + } -// internal async Task Stop() -// { -// if (!IsActive) return false; -// NadekoBot.Client.MessageReceived -= AnswerReceived; -// finishedUserIds.Clear(); -// IsActive = false; -// sw.Stop(); -// sw.Reset(); -// await channel.Send("Typing contest stopped").ConfigureAwait(false); -// return true; -// } - -// internal async Task Start() -// { -// while (true) -// { -// if (IsActive) return; // can't start running game -// IsActive = true; -// CurrentSentence = SentencesProvider.GetRandomSentence(); -// var i = (int)(CurrentSentence.Length / WORD_VALUE * 1.7f); -// await channel.SendMessageAsync($":clock2: Next contest will last for {i} seconds. Type the bolded text as fast as you can.").ConfigureAwait(false); + public async Task Start() + { + while (true) + { + if (IsActive) return; // can't start running game + IsActive = true; + CurrentSentence = GetRandomSentence(); + var i = (int)(CurrentSentence.Length / WORD_VALUE * 1.7f); + await channel.SendMessageAsync($":clock2: Next contest will last for {i} seconds. Type the bolded text as fast as you can.").ConfigureAwait(false); -// var msg = await channel.SendMessageAsync("Starting new typing contest in **3**...").ConfigureAwait(false); -// await Task.Delay(1000).ConfigureAwait(false); -// await msg.Edit("Starting new typing contest in **2**...").ConfigureAwait(false); -// await Task.Delay(1000).ConfigureAwait(false); -// await msg.Edit("Starting new typing contest in **1**...").ConfigureAwait(false); -// await Task.Delay(1000).ConfigureAwait(false); -// await msg.Edit($":book:**{CurrentSentence.Replace(" ", " \x200B")}**:book:").ConfigureAwait(false); -// sw.Start(); -// HandleAnswers(); + var msg = await channel.SendMessageAsync("Starting new typing contest in **3**...").ConfigureAwait(false); + await Task.Delay(1000).ConfigureAwait(false); + await msg.ModifyAsync(m => m.Content = "Starting new typing contest in **2**...").ConfigureAwait(false); + await Task.Delay(1000).ConfigureAwait(false); + await msg.ModifyAsync(m => m.Content = "Starting new typing contest in **1**...").ConfigureAwait(false); + await Task.Delay(1000).ConfigureAwait(false); + await msg.ModifyAsync(m => m.Content = $":book:**{CurrentSentence.Replace(" ", " \x200B")}**:book:").ConfigureAwait(false); + sw.Start(); + HandleAnswers(); -// while (i > 0) -// { -// await Task.Delay(1000).ConfigureAwait(false); -// i--; -// if (!IsActive) -// return; -// } + while (i > 0) + { + await Task.Delay(1000).ConfigureAwait(false); + i--; + if (!IsActive) + return; + } -// await Stop().ConfigureAwait(false); -// } -// } + await Stop().ConfigureAwait(false); + } + } -// private void HandleAnswers() -// { -// NadekoBot.Client.MessageReceived += AnswerReceived; -// } + public string GetRandomSentence() + { + using (var uow = DbHandler.UnitOfWork()) + { + return uow.TypingArticles.GetRandom()?.Text ?? "No typing articles found. Use `>typeadd` command to add a new article for typing."; + } -// private async void AnswerReceived(object sender, MessageEventArgs e) -// { -// try -// { -// if (e.Channel == null || e.Channel.Id != channel.Id || umsg.Author.Id == NadekoBot.Client.CurrentUser.Id) return; + } -// var guess = e.Message.RawText; + private void HandleAnswers() + { + NadekoBot.Client.MessageReceived += AnswerReceived; + } -// var distance = CurrentSentence.LevenshteinDistance(guess); -// var decision = Judge(distance, guess.Length); -// if (decision && !finishedUserIds.Contains(umsg.Author.Id)) -// { -// finishedUserIds.Add(umsg.Author.Id); -// await channel.Send($"{umsg.Author.Mention} finished in **{sw.Elapsed.Seconds}** seconds with { distance } errors, **{ CurrentSentence.Length / WORD_VALUE / sw.Elapsed.Seconds * 60 }** WPM!").ConfigureAwait(false); -// if (finishedUserIds.Count % 2 == 0) -// { -// await channel.SendMessageAsync($":exclamation: `A lot of people finished, here is the text for those still typing:`\n\n:book:**{CurrentSentence}**:book:").ConfigureAwait(false); -// } -// } -// } -// catch { } -// } + private async Task AnswerReceived(IMessage imsg) + { + var msg = imsg as IUserMessage; + if (msg == null) + return; + try + { + if (channel== null || channel.Id != channel.Id || msg.Author.Id == NadekoBot.Client.GetCurrentUser().Id) return; -// private bool Judge(int errors, int textLength) => errors <= textLength / 25; + var guess = msg.Content; -// } + var distance = CurrentSentence.LevenshteinDistance(guess); + var decision = Judge(distance, guess.Length); + if (decision && !finishedUserIds.Contains(msg.Author.Id)) + { + finishedUserIds.Add(msg.Author.Id); + await channel.SendMessageAsync($"{msg.Author.Mention} finished in **{sw.Elapsed.Seconds}** seconds with { distance } errors, **{ CurrentSentence.Length / WORD_VALUE / sw.Elapsed.Seconds * 60 }** WPM!").ConfigureAwait(false); + if (finishedUserIds.Count % 2 == 0) + { + await channel.SendMessageAsync($":exclamation: `A lot of people finished, here is the text for those still typing:`\n\n:book:**{CurrentSentence}**:book:").ConfigureAwait(false); + } + } + } + catch { } + } -// internal class SpeedTyping : DiscordCommand -// { + private bool Judge(int errors, int textLength) => errors <= textLength / 25; -// public static ConcurrentDictionary RunningContests; + } -// public SpeedTyping(DiscordModule module) : base(module) -// { -// RunningContests = new ConcurrentDictionary(); -// } + [Group] + public class SpeedTypingCommands + { -// public Func DoFunc() => -// async e => -// { -// var game = RunningContests.GetOrAdd(umsg.Author.Server.Id, id => new TypingGame(e.Channel)); + public static ConcurrentDictionary RunningContests; -// if (game.IsActive) -// { -// await channel.SendMessageAsync( -// $"Contest already running in " + -// $"{game.Channell.Mention} channel.") -// .ConfigureAwait(false); -// } -// else -// { -// await game.Start().ConfigureAwait(false); -// } -// }; + public SpeedTypingCommands() + { + RunningContests = new ConcurrentDictionary(); + } -// private Func QuitFunc() => -// async e => -// { -// TypingGame game; -// if (RunningContests.TryRemove(umsg.Author.Server.Id, out game)) -// { -// await game.Stop().ConfigureAwait(false); -// return; -// } -// await channel.SendMessageAsync("No contest to stop on this channel.").ConfigureAwait(false); -// }; + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public async Task TypeStart(IUserMessage msg) + { + var channel = (ITextChannel)msg.Channel; -// internal override void Init(CommandGroupBuilder cgb) -// { -// cgb.CreateCommand(Module.Prefix + "typestart") -// .Description($"Starts a typing contest. | `{Prefix}typestart`") -// .Do(DoFunc()); + var game = RunningContests.GetOrAdd(channel.Guild.Id, id => new TypingGame(channel)); -// cgb.CreateCommand(Module.Prefix + "typestop") -// .Description($"Stops a typing contest on the current channel. | `{Prefix}typestop`") -// .Do(QuitFunc()); + if (game.IsActive) + { + await channel.SendMessageAsync( + $"Contest already running in " + + $"{game.Channel.Mention} channel.") + .ConfigureAwait(false); + } + else + { + await game.Start().ConfigureAwait(false); + } + } -// cgb.CreateCommand(Module.Prefix + "typeadd") -// .Description($"Adds a new article to the typing contest. Owner only. | `{Prefix}typeadd wordswords`") -// .Parameter("text", ParameterType.Unparsed) -// .Do(async e => -// { -// if (!NadekoBot.IsOwner(umsg.Author.Id) || string.IsNullOrWhiteSpace(text)) return; + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public async Task TypeStop(IUserMessage imsg) + { + var channel = (ITextChannel)imsg.Channel; + TypingGame game; + if (RunningContests.TryRemove(channel.Guild.Id, out game)) + { + await game.Stop().ConfigureAwait(false); + return; + } + await channel.SendMessageAsync("No contest to stop on this channel.").ConfigureAwait(false); + } -// DbHandler.Instance.Connection.Insert(new TypingArticle -// { -// Text = text, -// DateAdded = DateTime.Now -// }); + ////todo owner only + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + //[RequireContext(ContextType.Guild)] + //public async Task Typeadd(IUserMessage imsg, [Remainder] string text) + //{ + // var channel = (ITextChannel)imsg.Channel; -// await channel.SendMessageAsync("Added new article for typing game.").ConfigureAwait(false); -// }); -// } -// } -//} + // using (var uow = DbHandler.UnitOfWork()) + // { + // uow.TypingArticles.Add(new Services.Database.Models.TypingArticle + // { + // Author = imsg.Author.Username, + // Text = text + // }); + // } + + // await channel.SendMessageAsync("Added new article for typing game.").ConfigureAwait(false); + //} + } +} diff --git a/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs b/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs index ac20336c..2aebbc74 100644 --- a/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs +++ b/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs @@ -7,7 +7,6 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -// todo rewrite namespace NadekoBot.Modules.Games.Trivia { public class TriviaGame diff --git a/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaQuestionPool.cs b/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaQuestionPool.cs index bb684141..56d65ca9 100644 --- a/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaQuestionPool.cs +++ b/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaQuestionPool.cs @@ -27,7 +27,7 @@ namespace NadekoBot.Modules.Games.Trivia return list[rand]; } - internal void Reload() + public void Reload() { var arr = JArray.Parse(File.ReadAllText("data/triviaquestions.json")); diff --git a/src/NadekoBot/Modules/Games/Commands/TriviaCommands.cs b/src/NadekoBot/Modules/Games/Commands/TriviaCommands.cs index 13c0adaf..e5de052e 100644 --- a/src/NadekoBot/Modules/Games/Commands/TriviaCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/TriviaCommands.cs @@ -17,7 +17,7 @@ namespace NadekoBot.Modules.Games { public static ConcurrentDictionary RunningTrivias = new ConcurrentDictionary(); - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Trivia(IUserMessage umsg, string[] args) { @@ -44,7 +44,7 @@ namespace NadekoBot.Modules.Games await channel.SendMessageAsync("Trivia game is already running on this server.\n" + trivia.CurrentQuestion).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Tl(IUserMessage umsg) { @@ -57,7 +57,7 @@ namespace NadekoBot.Modules.Games await channel.SendMessageAsync("No trivia is running on this server.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Tq(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Games/Games.cs b/src/NadekoBot/Modules/Games/Games.cs index 071ec72c..7548f202 100644 --- a/src/NadekoBot/Modules/Games/Games.cs +++ b/src/NadekoBot/Modules/Games/Games.cs @@ -27,7 +27,7 @@ namespace NadekoBot.Modules.Games { } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Choose(IUserMessage umsg, [Remainder] string list = null) { @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Games await channel.SendMessageAsync(listArr[rng.Next(0, listArr.Length)]).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task _8Ball(IUserMessage umsg, [Remainder] string question = null) { @@ -54,7 +54,7 @@ namespace NadekoBot.Modules.Games 🎱 `8Ball Answers` __**{_8BallResponses.Shuffle().FirstOrDefault()}**__").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Rps(IUserMessage umsg, string input) { @@ -104,7 +104,7 @@ namespace NadekoBot.Modules.Games await channel.SendMessageAsync(msg).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Linux(IUserMessage umsg, string guhnoo, string loonix) { diff --git a/src/NadekoBot/Modules/Help/Help.cs b/src/NadekoBot/Modules/Help/Help.cs index c62c39c4..81e986ed 100644 --- a/src/NadekoBot/Modules/Help/Help.cs +++ b/src/NadekoBot/Modules/Help/Help.cs @@ -25,7 +25,7 @@ namespace NadekoBot.Modules.Help { } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Modules(IUserMessage umsg) { @@ -35,7 +35,7 @@ namespace NadekoBot.Modules.Help .ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Commands(IUserMessage umsg, [Remainder] string module = null) { @@ -44,7 +44,7 @@ namespace NadekoBot.Modules.Help module = module?.Trim().ToUpperInvariant(); if (string.IsNullOrWhiteSpace(module)) return; - var cmds = _commands.Commands.Where(c => c.Module.Name.ToUpperInvariant() == module) + var cmds = _commands.Commands.Where(c => c.Module.Name.ToUpperInvariant().StartsWith(module)) .OrderBy(c => c.Text) .AsEnumerable(); var cmdsArray = cmds as Command[] ?? cmds.ToArray(); @@ -55,8 +55,7 @@ namespace NadekoBot.Modules.Help } if (module != "customreactions" && module != "conversations") { - //todo aliases - await channel.SendTableAsync("`List Of Commands:`\n", cmdsArray, el => $"{el.Text,-15}").ConfigureAwait(false); + await channel.SendTableAsync("`List Of Commands:`\n", cmdsArray, el => $"{el.Text,-15} {"["+el.Aliases.Skip(1).FirstOrDefault()+"]",-8}").ConfigureAwait(false); } else { @@ -65,7 +64,7 @@ namespace NadekoBot.Modules.Help await channel.SendMessageAsync($"`You can type \"-h command_name\" to see the help about that specific command.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task H(IUserMessage umsg, [Remainder] string comToFind = null) { @@ -77,16 +76,23 @@ namespace NadekoBot.Modules.Help await (await (umsg.Author as IGuildUser).CreateDMChannelAsync()).SendMessageAsync(HelpString).ConfigureAwait(false); return; } - var com = _commands.Commands.FirstOrDefault(c => c.Text.ToLowerInvariant() == comToFind); + var com = _commands.Commands.FirstOrDefault(c => c.Text.ToLowerInvariant() == comToFind || c.Aliases.Select(a=>a.ToLowerInvariant()).Contains(comToFind)); - //todo aliases + if (com == null) + { + await channel.SendMessageAsync("`No command found.`"); + return; + } + var str = $"**__Help for:__ `{com.Text}`**"; + var alias = com.Aliases.Skip(1).FirstOrDefault(); + if (alias != null) + str += $" / `{ alias }`"; if (com != null) - await channel.SendMessageAsync($@"**__Help for:__ `{com.Text}`** -**Desc:** {com.Description} + await channel.SendMessageAsync(str + $@"{Environment.NewLine}**Desc:** {com.Description} **Usage:** {com.Summary}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Hgit(IUserMessage umsg) { @@ -102,8 +108,7 @@ namespace NadekoBot.Modules.Help helpstr.AppendLine("----------------|--------------|-------"); lastModule = com.Module.Name; } - //todo aliases - helpstr.AppendLine($"`{com.Text}` | {com.Description} | {com.Summary}"); + helpstr.AppendLine($"`{com.Text}` {string.Join(" ", com.Aliases.Skip(1).Select(a=>"`"+a+"`"))} | {com.Description} | {com.Summary}"); } helpstr = helpstr.Replace((await NadekoBot.Client.GetCurrentUserAsync()).Username , "@BotName"); #if DEBUG @@ -113,7 +118,7 @@ namespace NadekoBot.Modules.Help #endif } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Guide(IUserMessage umsg) { @@ -124,7 +129,7 @@ namespace NadekoBot.Modules.Help **Hosting Guides and docs can be found here**: ").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Donate(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Music/Classes/MusicControls.cs b/src/NadekoBot/Modules/Music/Classes/MusicControls.cs index 03aaccef..233bca09 100644 --- a/src/NadekoBot/Modules/Music/Classes/MusicControls.cs +++ b/src/NadekoBot/Modules/Music/Classes/MusicControls.cs @@ -234,7 +234,7 @@ namespace NadekoBot.Modules.Music.Classes }); } - internal void ClearQueue() + public void ClearQueue() { actionQueue.Enqueue(() => { @@ -256,7 +256,7 @@ namespace NadekoBot.Modules.Music.Classes }); } - internal Task MoveToVoiceChannel(IVoiceChannel voiceChannel) + public Task MoveToVoiceChannel(IVoiceChannel voiceChannel) { if (audioClient?.ConnectionState != ConnectionState.Connected) throw new InvalidOperationException("Can't move while bot is not connected to voice channel."); @@ -264,13 +264,13 @@ namespace NadekoBot.Modules.Music.Classes return PlaybackVoiceChannel.ConnectAsync(); } - internal bool ToggleRepeatSong() => this.RepeatSong = !this.RepeatSong; + public bool ToggleRepeatSong() => this.RepeatSong = !this.RepeatSong; - internal bool ToggleRepeatPlaylist() => this.RepeatPlaylist = !this.RepeatPlaylist; + public bool ToggleRepeatPlaylist() => this.RepeatPlaylist = !this.RepeatPlaylist; - internal bool ToggleAutoplay() => this.Autoplay = !this.Autoplay; + public bool ToggleAutoplay() => this.Autoplay = !this.Autoplay; - internal void ThrowIfQueueFull() + public void ThrowIfQueueFull() { if (MaxQueueSize == 0) return; diff --git a/src/NadekoBot/Modules/Music/Classes/Song.cs b/src/NadekoBot/Modules/Music/Classes/Song.cs index 9ec3c1db..00757f92 100644 --- a/src/NadekoBot/Modules/Music/Classes/Song.cs +++ b/src/NadekoBot/Modules/Music/Classes/Song.cs @@ -16,18 +16,18 @@ namespace NadekoBot.Modules.Music.Classes { public class SongInfo { - public string Provider { get; internal set; } - public MusicType ProviderType { get; internal set; } + public string Provider { get; set; } + public MusicType ProviderType { get; set; } /// /// Will be set only if the providertype is normal /// - public string Query { get; internal set; } - public string Title { get; internal set; } - public string Uri { get; internal set; } + public string Query { get; set; } + public string Title { get; set; } + public string Uri { get; set; } } public class Song { - public StreamState State { get; internal set; } + public StreamState State { get; set; } public string PrettyName => $"**【 {SongInfo.Title.TrimTo(55)} 】**`{(SongInfo.Provider ?? "-")}` `by {QueuerName}`"; public SongInfo SongInfo { get; } @@ -80,7 +80,7 @@ namespace NadekoBot.Modules.Music.Classes return this; } - internal async Task Play(IAudioClient voiceClient, CancellationToken cancelToken) + public async Task Play(IAudioClient voiceClient, CancellationToken cancelToken) { var filename = Path.Combine(Music.MusicDataPath, DateTime.Now.UnixTimestamp().ToString()); diff --git a/src/NadekoBot/Modules/Music/Classes/SoundCloud.cs b/src/NadekoBot/Modules/Music/Classes/SoundCloud.cs index c788ed74..c653d5a2 100644 --- a/src/NadekoBot/Modules/Music/Classes/SoundCloud.cs +++ b/src/NadekoBot/Modules/Music/Classes/SoundCloud.cs @@ -40,7 +40,7 @@ namespace NadekoBot.Modules.Music.Classes public bool IsSoundCloudLink(string url) => System.Text.RegularExpressions.Regex.IsMatch(url, "(.*)(soundcloud.com|snd.sc)(.*)"); - internal async Task GetVideoByQueryAsync(string query) + public async Task GetVideoByQueryAsync(string query) { if (string.IsNullOrWhiteSpace(query)) throw new ArgumentNullException(nameof(query)); diff --git a/src/NadekoBot/Modules/Music/Music.cs b/src/NadekoBot/Modules/Music/Music.cs index 4f7572ce..7cc9ac04 100644 --- a/src/NadekoBot/Modules/Music/Music.cs +++ b/src/NadekoBot/Modules/Music/Music.cs @@ -35,7 +35,7 @@ namespace NadekoBot.Modules.Music _google = google; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Next(IUserMessage umsg) { @@ -47,7 +47,7 @@ namespace NadekoBot.Modules.Music musicPlayer.Next(); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Stop(IUserMessage umsg) { @@ -62,7 +62,7 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Destroy(IUserMessage umsg) { @@ -74,7 +74,7 @@ namespace NadekoBot.Modules.Music musicPlayer.Destroy(); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Pause(IUserMessage umsg) { @@ -91,7 +91,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync("🎵`Music Player unpaused.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Queue(IUserMessage umsg, [Remainder] string query) { @@ -105,7 +105,7 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task SoundCloudQueue(IUserMessage umsg, [Remainder] string query) { @@ -119,7 +119,7 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ListQueue(IUserMessage umsg, int page = 1) { @@ -152,7 +152,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync(toSend + string.Join("\n", musicPlayer.Playlist.Skip(startAt).Take(15).Select(v => $"`{number++}.` {v.PrettyName}"))).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task NowPlaying(IUserMessage umsg) { @@ -167,7 +167,7 @@ namespace NadekoBot.Modules.Music $"{currentSong.PrettyCurrentTime()}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Volume(IUserMessage umsg, int val) { @@ -183,7 +183,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync($"🎵 `Volume set to {volume}%`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Defvol(IUserMessage umsg, [Remainder] int val) { @@ -202,7 +202,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync($"🎵 `Default volume set to {val}%`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Mute(IUserMessage umsg) { @@ -215,7 +215,7 @@ namespace NadekoBot.Modules.Music musicPlayer.SetVolume(0); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Max(IUserMessage umsg) { @@ -228,7 +228,7 @@ namespace NadekoBot.Modules.Music musicPlayer.SetVolume(100); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Shuffle(IUserMessage umsg) { @@ -248,7 +248,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync("🎵 `Songs shuffled.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Playlist(IUserMessage umsg, [Remainder] string playlist) { @@ -290,7 +290,7 @@ namespace NadekoBot.Modules.Music await msg.ModifyAsync(m => m.Content = "🎵 `Playlist queue complete.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task SoundCloudPl(IUserMessage umsg, [Remainder] string pl) { @@ -327,7 +327,7 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task LocalPl(IUserMessage umsg, [Remainder] string directory) { @@ -356,7 +356,7 @@ namespace NadekoBot.Modules.Music catch { } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Radio(IUserMessage umsg, string radio_link) { @@ -374,7 +374,7 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Local(IUserMessage umsg, [Remainder] string path) { @@ -386,7 +386,7 @@ namespace NadekoBot.Modules.Music } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Move(IUserMessage umsg) { @@ -398,7 +398,7 @@ namespace NadekoBot.Modules.Music musicPlayer.MoveToVoiceChannel(voiceChannel); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Remove(IUserMessage umsg, int num) { @@ -417,8 +417,8 @@ namespace NadekoBot.Modules.Music musicPlayer.RemoveSongAt(num - 1); await channel.SendMessageAsync($"🎵**Track {song.PrettyName} at position `#{num}` has been removed.**").ConfigureAwait(false); } - //todo fix - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Remove(IUserMessage umsg, string all) { @@ -433,7 +433,7 @@ namespace NadekoBot.Modules.Music return; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task MoveSong(IUserMessage umsg, [Remainder] string fromto) { @@ -469,7 +469,7 @@ namespace NadekoBot.Modules.Music } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task SetMaxQueue(IUserMessage umsg, uint size) { @@ -483,7 +483,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync($"🎵 `Max queue set to {(size == 0 ? ("unlimited") : size + " tracks")}`"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ReptCurSong(IUserMessage umsg) { @@ -501,7 +501,7 @@ namespace NadekoBot.Modules.Music .ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task RepeatPl(IUserMessage umsg) { @@ -514,7 +514,7 @@ namespace NadekoBot.Modules.Music } /// - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Save(IUserMessage umsg, [Remainder] string name) //{ @@ -522,7 +522,7 @@ namespace NadekoBot.Modules.Music //} - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Load(IUserMessage umsg, [Remainder] string name) //{ @@ -530,7 +530,7 @@ namespace NadekoBot.Modules.Music //} - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Playlists(IUserMessage umsg, [Remainder] string num) //{ @@ -538,7 +538,7 @@ namespace NadekoBot.Modules.Music //} - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task DeletePlaylist(IUserMessage umsg, [Remainder] string pl) //{ @@ -546,7 +546,7 @@ namespace NadekoBot.Modules.Music //} - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Goto(IUserMessage umsg, int time) { @@ -583,7 +583,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync($"`Skipped to {minutes}:{seconds}`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task GetLink(IUserMessage umsg, int index = 0) { @@ -618,7 +618,7 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Autoplay(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/NSFW/NSFW.cs b/src/NadekoBot/Modules/NSFW/NSFW.cs index 407f2116..377a2cd9 100644 --- a/src/NadekoBot/Modules/NSFW/NSFW.cs +++ b/src/NadekoBot/Modules/NSFW/NSFW.cs @@ -22,7 +22,7 @@ namespace NadekoBot.Modules.NSFW { } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Hentai(IUserMessage umsg, [Remainder] string tag = null) { @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync(String.Join("\n\n", links)).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Danbooru(IUserMessage umsg, [Remainder] string tag = null) { @@ -55,7 +55,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync(link).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Gelbooru(IUserMessage umsg, [Remainder] string tag = null) { @@ -69,7 +69,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync(link).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Rule34(IUserMessage umsg, [Remainder] string tag = null) { @@ -83,7 +83,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync(link).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task E621(IUserMessage umsg, [Remainder] string tag = null) { @@ -97,7 +97,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync(link).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Cp(IUserMessage umsg) { @@ -106,7 +106,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync("http://i.imgur.com/MZkY1md.jpg").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Boobs(IUserMessage umsg) { @@ -126,7 +126,7 @@ namespace NadekoBot.Modules.NSFW } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Butts(IUserMessage umsg) { @@ -204,7 +204,7 @@ namespace NadekoBot.Modules.NSFW } - internal static async Task GetE621ImageLink(string tags) + public static async Task GetE621ImageLink(string tags) { try { diff --git a/src/NadekoBot/Modules/Pokemon/Pokemon.cs b/src/NadekoBot/Modules/Pokemon/Pokemon.cs index 6418fcdf..31082944 100644 --- a/src/NadekoBot/Modules/Pokemon/Pokemon.cs +++ b/src/NadekoBot/Modules/Pokemon/Pokemon.cs @@ -15,7 +15,7 @@ namespace NadekoBot.Modules.Games } //todo Dragon should PR this in - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Poke(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Searches/Commands/AnimeSearchCommands.cs b/src/NadekoBot/Modules/Searches/Commands/AnimeSearchCommands.cs index 769c989d..dd96cf0e 100644 --- a/src/NadekoBot/Modules/Searches/Commands/AnimeSearchCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/AnimeSearchCommands.cs @@ -1,99 +1,132 @@ -//using Discord; -//using Discord.Commands; -//using NadekoBot.Attributes; -//using System; -//using System.Collections.Generic; -//using System.Linq; -//using System.Threading.Tasks; +using Discord; +using Discord.Commands; +using NadekoBot.Attributes; +using NadekoBot.Extensions; +using NadekoBot.Modules.Searches.Models; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NLog; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; -//// todo RestSharp -//namespace NadekoBot.Modules.Searches -//{ -// public partial class SearchesModule -// { -// [LocalizedCommand, LocalizedDescription, LocalizedSummary] -// [RequireContext(ContextType.Guild)] -// public async Task Anime(IUserMessage umsg, [Remainder] string query = null) -// { -// var channel = (ITextChannel)umsg.Channel; +namespace NadekoBot.Modules.Searches +{ + public partial class Searches + { + [Group] + public class AnimeSearchCommands + { + private Logger _log; -// if (!(await ValidateQuery(umsg.Channel as ITextChannel, query).ConfigureAwait(false))) return; -// string result; -// try -// { -// result = (await GetAnimeData(query).ConfigureAwait(false)).ToString(); -// } -// catch -// { -// await channel.SendMessageAsync("Failed to find that anime.").ConfigureAwait(false); -// return; -// } + private string anilistToken { get; set; } + private DateTime lastRefresh { get; set; } -// await channel.SendMessageAsync(result.ToString()).ConfigureAwait(false); -// } + public AnimeSearchCommands() + { + _log = LogManager.GetCurrentClassLogger(); + } -// [LocalizedCommand, LocalizedDescription, LocalizedSummary] -// [RequireContext(ContextType.Guild)] -// public async Task Manga(IUserMessage umsg, [Remainder] string query = null) -// { -// var channel = (ITextChannel)umsg.Channel; + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public async Task Anime(IUserMessage umsg, [Remainder] string query) + { + var channel = (ITextChannel)umsg.Channel; -// if (!(await ValidateQuery(umsg.Channel as ITextChannel, query).ConfigureAwait(false))) return; -// string result; -// try -// { -// result = (await GetMangaData(query).ConfigureAwait(false)).ToString(); -// } -// catch -// { -// await channel.SendMessageAsync("Failed to find that manga.").ConfigureAwait(false); -// return; -// } -// await channel.SendMessageAsync(result).ConfigureAwait(false); -// } + if (string.IsNullOrWhiteSpace(query)) + return; -// public static async Task GetAnimeData(string query) -// { -// if (string.IsNullOrWhiteSpace(query)) -// throw new ArgumentNullException(nameof(query)); + var result = await GetAnimeData(query).ConfigureAwait(false); -// await RefreshAnilistToken().ConfigureAwait(false); + await channel.SendMessageAsync(result.ToString() ?? "`No anime found.`").ConfigureAwait(false); + } -// var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query); -// var smallContent = ""; -// var cl = new RestSharp.RestClient("http://anilist.co/api"); -// var rq = new RestSharp.RestRequest("/anime/search/" + Uri.EscapeUriString(query)); -// rq.AddParameter("access_token", token); -// smallContent = cl.Execute(rq).Content; -// var smallObj = JArray.Parse(smallContent)[0]; + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public async Task Manga(IUserMessage umsg, [Remainder] string query) + { + var channel = (ITextChannel)umsg.Channel; -// rq = new RestSharp.RestRequest("/anime/" + smallObj["id"]); -// rq.AddParameter("access_token", token); -// var content = cl.Execute(rq).Content; + if (string.IsNullOrWhiteSpace(query)) + return; -// return await Task.Run(() => JsonConvert.DeserializeObject(content)).ConfigureAwait(false); -// } + var result = await GetMangaData(query).ConfigureAwait(false); -// public static async Task GetMangaData(string query) -// { -// if (string.IsNullOrWhiteSpace(query)) -// throw new ArgumentNullException(nameof(query)); + await channel.SendMessageAsync(result.ToString() ?? "`No manga found.`").ConfigureAwait(false); + } -// await RefreshAnilistToken().ConfigureAwait(false); + private async Task GetAnimeData(string query) + { + if (string.IsNullOrWhiteSpace(query)) + throw new ArgumentNullException(nameof(query)); + try + { + await RefreshAnilistToken().ConfigureAwait(false); -// var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query); -// var smallContent = ""; -// var cl = new RestSharp.RestClient("http://anilist.co/api"); -// var rq = new RestSharp.RestRequest("/manga/search/" + Uri.EscapeUriString(query)); -// rq.AddParameter("access_token", token); -// smallContent = cl.Execute(rq).Content; -// var smallObj = JArray.Parse(smallContent)[0]; + var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query); + using (var http = new HttpClient()) + { + var res = await http.GetStringAsync("http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query) + $"?access_token={anilistToken}").ConfigureAwait(false); + var smallObj = JArray.Parse(res)[0]; + var aniData = await http.GetStringAsync("http://anilist.co/api/anime/" + smallObj["id"] + $"?access_token={anilistToken}").ConfigureAwait(false); -// rq = new RestSharp.RestRequest("/manga/" + smallObj["id"]); -// rq.AddParameter("access_token", token); -// var content = cl.Execute(rq).Content; + return await Task.Run(() => JsonConvert.DeserializeObject(aniData)).ConfigureAwait(false); + } + } + catch (Exception ex) { + _log.Warn(ex, "Failed anime search for {0}", query); + return null; + } + } -// return await Task.Run(() => JsonConvert.DeserializeObject(content)).ConfigureAwait(false); -// } -// } -//} + private async Task RefreshAnilistToken() + { + if (DateTime.Now - lastRefresh > TimeSpan.FromMinutes(29)) + lastRefresh = DateTime.Now; + else + { + return; + } + var headers = new Dictionary { + {"grant_type", "client_credentials"}, + {"client_id", "kwoth-w0ki9"}, + {"client_secret", "Qd6j4FIAi1ZK6Pc7N7V4Z"}, + }; + using (var http = new HttpClient()) + { + http.AddFakeHeaders(); + var formContent = new FormUrlEncodedContent(headers); + var response = await http.PostAsync("http://anilist.co/api/auth/access_token", formContent).ConfigureAwait(false); + var stringContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + anilistToken = JObject.Parse(stringContent)["access_token"].ToString(); + } + + } + + private async Task GetMangaData(string query) + { + if (string.IsNullOrWhiteSpace(query)) + throw new ArgumentNullException(nameof(query)); + try + { + await RefreshAnilistToken().ConfigureAwait(false); + using (var http = new HttpClient()) + { + var res = await http.GetStringAsync("http://anilist.co/api/manga/search/" + Uri.EscapeUriString(query) + $"?access_token={anilistToken}").ConfigureAwait(false); + var smallObj = JArray.Parse(res)[0]; + var aniData = await http.GetStringAsync("http://anilist.co/api/manga/" + smallObj["id"] + $"?access_token={anilistToken}").ConfigureAwait(false); + + return await Task.Run(() => JsonConvert.DeserializeObject(aniData)).ConfigureAwait(false); + } + } + catch (Exception ex) + { + _log.Warn(ex, "Failed anime search for {0}", query); + return null; + } + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Searches/Commands/CalcCommand.cs b/src/NadekoBot/Modules/Searches/Commands/CalcCommand.cs index dd2e7d35..1f9f00dc 100644 --- a/src/NadekoBot/Modules/Searches/Commands/CalcCommand.cs +++ b/src/NadekoBot/Modules/Searches/Commands/CalcCommand.cs @@ -14,7 +14,7 @@ namespace NadekoBot.Modules.Searches [Group] public partial class Searches { - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public static async Task Calculate(IUserMessage msg, [Remainder] string expression) { @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task CalcOps(IUserMessage msg) { diff --git a/src/NadekoBot/Modules/Searches/Commands/ConverterCommands.cs b/src/NadekoBot/Modules/Searches/Commands/ConverterCommands.cs index 52a6d157..63ed2205 100644 --- a/src/NadekoBot/Modules/Searches/Commands/ConverterCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/ConverterCommands.cs @@ -30,7 +30,7 @@ // } -// internal override void Init(CommandGroupBuilder cgb) +// public override void Init(CommandGroupBuilder cgb) // { // cgb.CreateCommand(Module.Prefix + "convert") // .Description($"Convert quantities from>to. | `{Prefix}convert m>km 1000`") diff --git a/src/NadekoBot/Modules/Searches/Commands/JokeCommands.cs b/src/NadekoBot/Modules/Searches/Commands/JokeCommands.cs index bb24cee1..94347cc6 100644 --- a/src/NadekoBot/Modules/Searches/Commands/JokeCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/JokeCommands.cs @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Searches _log.Warn("data/magicitems.json is missing. Magic items are not loaded."); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Yomama(IUserMessage umsg) { @@ -53,7 +53,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Randjoke(IUserMessage umsg) { @@ -65,7 +65,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ChuckNorris(IUserMessage umsg) { @@ -77,7 +77,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task WowJoke(IUserMessage umsg) { @@ -89,7 +89,7 @@ namespace NadekoBot.Modules.Searches await channel.SendMessageAsync(wowJokes[new Random().Next(0, wowJokes.Count)].ToString()); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task MagicItem(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Searches/Commands/LoLCommands.cs b/src/NadekoBot/Modules/Searches/Commands/LoLCommands.cs index 8e52985a..27d6b611 100644 --- a/src/NadekoBot/Modules/Searches/Commands/LoLCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/LoLCommands.cs @@ -31,7 +31,7 @@ namespace NadekoBot.Modules.Searches "Doesn't matter what you ban really. Enemy will ban your main and you will lose." }; - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Lolban(IUserMessage umsg) { @@ -113,7 +113,7 @@ namespace NadekoBot.Modules.Searches // public float StatScore { get; set; } // } -// internal override void Init(CommandGroupBuilder cgb) +// public override void Init(CommandGroupBuilder cgb) // { // cgb.CreateCommand(Module.Prefix + "lolchamp") // .Description($"Shows League Of Legends champion statistics. If there are spaces/apostrophes or in the name - omit them. Optional second parameter is a role. |`{Prefix}lolchamp Riven` or `{Prefix}lolchamp Annie sup`") diff --git a/src/NadekoBot/Modules/Searches/Commands/MemegenCommands.cs b/src/NadekoBot/Modules/Searches/Commands/MemegenCommands.cs index 16995259..43b6fbe4 100644 --- a/src/NadekoBot/Modules/Searches/Commands/MemegenCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/MemegenCommands.cs @@ -15,7 +15,7 @@ namespace NadekoBot.Modules.Searches { public partial class Searches { - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Memelist(IUserMessage umsg) { @@ -29,7 +29,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Memegen(IUserMessage umsg, string meme, string topText, string botText) { diff --git a/src/NadekoBot/_Models/JSONModels/AnimeResult.cs b/src/NadekoBot/Modules/Searches/Commands/Models/AnimeResult.cs similarity index 93% rename from src/NadekoBot/_Models/JSONModels/AnimeResult.cs rename to src/NadekoBot/Modules/Searches/Commands/Models/AnimeResult.cs index a092ae03..d2a6152d 100644 --- a/src/NadekoBot/_Models/JSONModels/AnimeResult.cs +++ b/src/NadekoBot/Modules/Searches/Commands/Models/AnimeResult.cs @@ -1,4 +1,4 @@ -namespace NadekoBot.Classes.JSONModels +namespace NadekoBot.Modules.Searches.Models { public class AnimeResult { diff --git a/src/NadekoBot/_Models/JSONModels/MangaResult.cs b/src/NadekoBot/Modules/Searches/Commands/Models/MangaResult.cs similarity index 94% rename from src/NadekoBot/_Models/JSONModels/MangaResult.cs rename to src/NadekoBot/Modules/Searches/Commands/Models/MangaResult.cs index b7cb9f73..f5269017 100644 --- a/src/NadekoBot/_Models/JSONModels/MangaResult.cs +++ b/src/NadekoBot/Modules/Searches/Commands/Models/MangaResult.cs @@ -1,4 +1,4 @@ -namespace NadekoBot.Classes.JSONModels +namespace NadekoBot.Modules.Searches.Models { public class MangaResult { diff --git a/src/NadekoBot/Modules/Searches/Commands/OsuCommands.cs b/src/NadekoBot/Modules/Searches/Commands/OsuCommands.cs index 6fd23a29..fffe02e2 100644 --- a/src/NadekoBot/Modules/Searches/Commands/OsuCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/OsuCommands.cs @@ -25,7 +25,7 @@ namespace NadekoBot.Modules.Searches { _log = LogManager.GetCurrentClassLogger(); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Osu(IUserMessage umsg, string usr, string mode) { @@ -58,7 +58,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Osub(IUserMessage umsg, [Remainder] string map) { @@ -95,7 +95,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Osu5(IUserMessage umsg, string user, [Remainder] string mode) { diff --git a/src/NadekoBot/Modules/Searches/Commands/PokemonSearchCommands.cs b/src/NadekoBot/Modules/Searches/Commands/PokemonSearchCommands.cs index 6449ceb6..e090d09f 100644 --- a/src/NadekoBot/Modules/Searches/Commands/PokemonSearchCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/PokemonSearchCommands.cs @@ -38,7 +38,7 @@ namespace NadekoBot.Modules.Searches _log.Warn(PokemonAbilitiesFile + " is missing. Pokemon abilities not loaded."); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Pokemon(IUserMessage umsg, [Remainder] string pokemon = null) { @@ -59,7 +59,7 @@ namespace NadekoBot.Modules.Searches await channel.SendMessageAsync("`No pokemon found.`"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task PokemonAbility(IUserMessage umsg, [Remainder] string ability = null) { diff --git a/src/NadekoBot/Modules/Searches/Commands/StreamNotificationCommands.cs b/src/NadekoBot/Modules/Searches/Commands/StreamNotificationCommands.cs index 92e14b69..b313bf63 100644 --- a/src/NadekoBot/Modules/Searches/Commands/StreamNotificationCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/StreamNotificationCommands.cs @@ -1,348 +1,288 @@ -//using Discord.Commands; -//using NadekoBot.Classes; -//using Newtonsoft.Json.Linq; -//using System; -//using System.Collections.Concurrent; -//using System.Linq; -//using System.Threading.Tasks; -//using Discord; -//using NadekoBot.Services; -//using System.Threading; +using Discord.Commands; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Threading.Tasks; +using Discord; +using NadekoBot.Services; +using System.Threading; +using NadekoBot.Services.Database; +using System.Collections.Generic; +using NadekoBot.Services.Database.Models; +using System.Net.Http; +using Discord.WebSocket; +using NadekoBot.Attributes; -//todo DB -//namespace NadekoBot.Modules.Searches -//{ -// public partial class Searches -// { -// [Group] -// public class StreamNotificationCommands -// { -// private readonly Timer checkTimer; -// private ConcurrentDictionary> cachedStatuses = new ConcurrentDictionary>(); -// private bool FirstPass { get; set; } = true; +namespace NadekoBot.Modules.Searches +{ + public partial class Searches + { + [Group] + public class StreamNotificationCommands + { + private Timer checkTimer { get; } + private ConcurrentDictionary> cachedStatuses = new ConcurrentDictionary>(); + private bool FirstPass { get; set; } = true; -// public StreamNotifications(DiscordModule module) -// { -// checkTimer = new Timer(async (state) => -// { -// cachedStatuses.Clear(); -// try -// { -// var streams = SpecificConfigurations.Default.AllConfigs.SelectMany(c => c.ObservingStreams); -// if (!streams.Any()) return; -// foreach (var stream in streams) -// { -// Tuple data; -// try -// { -// data = await GetStreamStatus(stream).ConfigureAwait(false); -// } -// catch -// { -// continue; -// } + public StreamNotificationCommands() + { + checkTimer = new Timer(async (state) => + { + cachedStatuses.Clear(); + try + { + IEnumerable streams; + using (var uow = DbHandler.UnitOfWork()) + { + streams = uow.GuildConfigs.GetAllFollowedStreams(); + } + foreach (var stream in streams) + { + Tuple data; + try + { + data = await GetStreamStatus(stream).ConfigureAwait(false); + } + catch + { + continue; + } -// if (data.Item1 != stream.LastStatus) -// { -// stream.LastStatus = data.Item1; -// if (FirstPass) -// continue; -// var server = NadekoBot.Client.GetServer(stream.ServerId); -// var channel = server?.GetChannel(stream.ChannelId); -// if (channel == null) -// continue; -// var msg = $"`{stream.Username}`'s stream is now " + -// $"**{(data.Item1 ? "ONLINE" : "OFFLINE")}** with " + -// $"**{data.Item2}** viewers."; -// if (stream.LastStatus) -// if (stream.Type == StreamNotificationConfig.StreamType.Hitbox) -// msg += $"\n`Here is the Link:`【 http://www.hitbox.tv/{stream.Username}/ 】"; -// else if (stream.Type == StreamNotificationConfig.StreamType.Twitch) -// msg += $"\n`Here is the Link:`【 http://www.twitch.tv/{stream.Username}/ 】"; -// else if (stream.Type == StreamNotificationConfig.StreamType.Beam) -// msg += $"\n`Here is the Link:`【 http://www.beam.pro/{stream.Username}/ 】"; -// else if (stream.Type == StreamNotificationConfig.StreamType.YoutubeGaming) -// msg += $"\n`Here is the Link:`【 not implemented yet - {stream.Username} 】"; -// await channel.SendMessageAsync(msg).ConfigureAwait(false); -// } -// } -// FirstPass = false; -// } -// catch { } -// }, null, TimeSpan.Zero, TimeSpan.FromSeconds(15)); -// } + if (data.Item1 != stream.LastStatus) + { + stream.LastStatus = data.Item1; + if (FirstPass) + continue; + var server = NadekoBot.Client.GetGuild(stream.GuildId); + var channel = server?.GetTextChannel(stream.ChannelId); + if (channel == null) + continue; + var msg = $"`{stream.Username}`'s stream is now " + + $"**{(data.Item1 ? "ONLINE" : "OFFLINE")}** with " + + $"**{data.Item2}** viewers."; + if (stream.LastStatus) + if (stream.Type == FollowedStream.FollowedStreamType.Hitbox) + msg += $"\n`Here is the Link:`【 http://www.hitbox.tv/{stream.Username}/ 】"; + else if (stream.Type == FollowedStream.FollowedStreamType.Twitch) + msg += $"\n`Here is the Link:`【 http://www.twitch.tv/{stream.Username}/ 】"; + else if (stream.Type == FollowedStream.FollowedStreamType.Beam) + msg += $"\n`Here is the Link:`【 http://www.beam.pro/{stream.Username}/ 】"; + //else if (stream.Type == FollowedStream.FollowedStreamType.YoutubeGaming) + // msg += $"\n`Here is the Link:`【 not implemented yet - {stream.Username} 】"; + await channel.SendMessageAsync(msg).ConfigureAwait(false); + } + } + FirstPass = false; + } + catch { } + }, null, TimeSpan.Zero, TimeSpan.FromSeconds(15)); + } -// public StreamNotifications(ILocalization loc, CommandService cmds, IBotConfiguration config, DiscordSocketClient client) : base(loc, cmds, config, client) -// { -// } + private async Task> GetStreamStatus(FollowedStream stream, bool checkCache = true) + { + bool isLive; + string response; + JObject data; + Tuple result; + switch (stream.Type) + { + case FollowedStream.FollowedStreamType.Hitbox: + var hitboxUrl = $"https://api.hitbox.tv/media/status/{stream.Username}"; + if (checkCache && cachedStatuses.TryGetValue(hitboxUrl, out result)) + return result; + using (var http = new HttpClient()) + { + response = await http.GetStringAsync(hitboxUrl).ConfigureAwait(false); + } + data = JObject.Parse(response); + isLive = data["media_is_live"].ToString() == "1"; + result = new Tuple(isLive, data["media_views"].ToString()); + cachedStatuses.TryAdd(hitboxUrl, result); + return result; + case FollowedStream.FollowedStreamType.Twitch: + var twitchUrl = $"https://api.twitch.tv/kraken/streams/{Uri.EscapeUriString(stream.Username)}"; + if (checkCache && cachedStatuses.TryGetValue(twitchUrl, out result)) + return result; + using (var http = new HttpClient()) + { + response = await http.GetStringAsync(twitchUrl).ConfigureAwait(false); + } + data = JObject.Parse(response); + isLive = !string.IsNullOrWhiteSpace(data["stream"].ToString()); + result = new Tuple(isLive, isLive ? data["stream"]["viewers"].ToString() : "0"); + cachedStatuses.TryAdd(twitchUrl, result); + return result; + case FollowedStream.FollowedStreamType.Beam: + var beamUrl = $"https://beam.pro/api/v1/channels/{stream.Username}"; + if (checkCache && cachedStatuses.TryGetValue(beamUrl, out result)) + return result; + using (var http = new HttpClient()) + { + response = await http.GetStringAsync(beamUrl).ConfigureAwait(false); + } + data = JObject.Parse(response); + isLive = data["online"].ToObject() == true; + result = new Tuple(isLive, data["viewersCurrent"].ToString()); + cachedStatuses.TryAdd(beamUrl, result); + return result; + default: + break; + } + return new Tuple(false, "0"); + } -// private async Task> GetStreamStatus(StreamNotificationConfig stream, bool checkCache = true) -// { -// bool isLive; -// string response; -// JObject data; -// Tuple result; -// switch (stream.Type) -// { -// case StreamNotificationConfig.StreamType.Hitbox: -// var hitboxUrl = $"https://api.hitbox.tv/media/status/{stream.Username}"; -// if (checkCache && cachedStatuses.TryGetValue(hitboxUrl, out result)) -// return result; -// response = await http.GetStringAsync(hitboxUrl).ConfigureAwait(false); -// data = JObject.Parse(response); -// isLive = data["media_is_live"].ToString() == "1"; -// result = new Tuple(isLive, data["media_views"].ToString()); -// cachedStatuses.TryAdd(hitboxUrl, result); -// return result; -// case StreamNotificationConfig.StreamType.Twitch: -// var twitchUrl = $"https://api.twitch.tv/kraken/streams/{Uri.EscapeUriString(stream.Username)}"; -// if (checkCache && cachedStatuses.TryGetValue(twitchUrl, out result)) -// return result; -// response = await http.GetStringAsync(twitchUrl).ConfigureAwait(false); -// data = JObject.Parse(response); -// isLive = !string.IsNullOrWhiteSpace(data["stream"].ToString()); -// result = new Tuple(isLive, isLive ? data["stream"]["viewers"].ToString() : "0"); -// cachedStatuses.TryAdd(twitchUrl, result); -// return result; -// case StreamNotificationConfig.StreamType.Beam: -// var beamUrl = $"https://beam.pro/api/v1/channels/{stream.Username}"; -// if (checkCache && cachedStatuses.TryGetValue(beamUrl, out result)) -// return result; -// response = await http.GetStringAsync(beamUrl).ConfigureAwait(false); -// data = JObject.Parse(response); -// isLive = data["online"].ToObject() == true; -// result = new Tuple(isLive, data["viewersCurrent"].ToString()); -// cachedStatuses.TryAdd(beamUrl, result); -// return result; -// default: -// break; -// } -// return new Tuple(false, "0"); -// } + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.ManageMessages)] + public async Task Hitbox(IUserMessage msg, [Remainder] string username) => + await TrackStream((ITextChannel)msg.Channel, username, FollowedStream.FollowedStreamType.Hitbox) + .ConfigureAwait(false); -// internal override void Init(CommandGroupBuilder cgb) -// { -// cgb.CreateCommand(Module.Prefix + "hitbox") -// .Alias(Module.Prefix + "hb") -// .Description("Notifies this channel when a certain user starts streaming." + -// $" | `{Prefix}hitbox SomeStreamer`") -// .Parameter("username", ParameterType.Unparsed) -// .AddCheck(SimpleCheckers.ManageServer()) -// .Do(TrackStream(StreamNotificationConfig.StreamType.Hitbox)); + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.ManageMessages)] + public async Task Twitch(IUserMessage msg, [Remainder] string username) => + await TrackStream((ITextChannel)msg.Channel, username, FollowedStream.FollowedStreamType.Twitch) + .ConfigureAwait(false); -// cgb.CreateCommand(Module.Prefix + "twitch") -// .Alias(Module.Prefix + "tw") -// .Description("Notifies this channel when a certain user starts streaming." + -// $" | `{Prefix}twitch SomeStreamer`") -// .AddCheck(SimpleCheckers.ManageServer()) -// .Parameter("username", ParameterType.Unparsed) -// .Do(TrackStream(StreamNotificationConfig.StreamType.Twitch)); + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.ManageMessages)] + public async Task Beam(IUserMessage msg, [Remainder] string username) => + await TrackStream((ITextChannel)msg.Channel, username, FollowedStream.FollowedStreamType.Beam) + .ConfigureAwait(false); -// cgb.CreateCommand(Module.Prefix + "beam") -// .Alias(Module.Prefix + "bm") -// .Description("Notifies this channel when a certain user starts streaming." + -// $" | `{Prefix}beam SomeStreamer`") -// .AddCheck(SimpleCheckers.ManageServer()) -// .Parameter("username", ParameterType.Unparsed) -// .Do(TrackStream(StreamNotificationConfig.StreamType.Beam)); + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public async Task ListStreams(IUserMessage imsg) + { + var channel = (ITextChannel)imsg.Channel; -// cgb.CreateCommand(Module.Prefix + "checkhitbox") -// .Alias(Module.Prefix + "chhb") -// .Description("Checks if a certain user is streaming on the hitbox platform." + -// $" | `{Prefix}chhb SomeStreamer`") -// .Parameter("username", ParameterType.Unparsed) -// .AddCheck(SimpleCheckers.ManageServer()) -// .Do(async e => -// { -// var stream = username?.Trim(); -// if (string.IsNullOrWhiteSpace(stream)) -// return; -// try -// { -// var streamStatus = (await GetStreamStatus(new StreamNotificationConfig -// { -// Username = stream, -// Type = StreamNotificationConfig.StreamType.Hitbox -// })); -// if (streamStatus.Item1) -// { -// await channel.SendMessageAsync($"`Streamer {streamStatus.Item2} is online.`"); -// } -// } -// catch -// { -// await channel.SendMessageAsync("No channel found."); -// } -// }); + IEnumerable streams; + using (var uow = DbHandler.UnitOfWork()) + { + streams = uow.GuildConfigs.For(channel.Guild.Id).FollowedStreams; + } -// cgb.CreateCommand(Module.Prefix + "checktwitch") -// .Alias(Module.Prefix + "chtw") -// .Description("Checks if a certain user is streaming on the twitch platform." + -// $" | `{Prefix}chtw SomeStreamer`") -// .AddCheck(SimpleCheckers.ManageServer()) -// .Parameter("username", ParameterType.Unparsed) -// .Do(async e => -// { -// var stream = username?.Trim(); -// if (string.IsNullOrWhiteSpace(stream)) -// return; -// try -// { -// var streamStatus = (await GetStreamStatus(new StreamNotificationConfig -// { -// Username = stream, -// Type = StreamNotificationConfig.StreamType.Twitch -// })); -// if (streamStatus.Item1) -// { -// await channel.SendMessageAsync($"`Streamer {streamStatus.Item2} is online.`"); -// } -// } -// catch -// { -// await channel.SendMessageAsync("No channel found."); -// } -// }); + if (!streams.Any()) + { + await channel.SendMessageAsync("You are not following any streams on this server.").ConfigureAwait(false); + return; + } -// cgb.CreateCommand(Module.Prefix + "checkbeam") -// .Alias(Module.Prefix + "chbm") -// .Description("Checks if a certain user is streaming on the beam platform." + -// $" | `{Prefix}chbm SomeStreamer`") -// .AddCheck(SimpleCheckers.ManageServer()) -// .Parameter("username", ParameterType.Unparsed) -// .Do(async e => -// { -// var stream = username?.Trim(); -// if (string.IsNullOrWhiteSpace(stream)) -// return; -// try -// { -// var streamStatus = (await GetStreamStatus(new StreamNotificationConfig -// { -// Username = stream, -// Type = StreamNotificationConfig.StreamType.Beam -// })); -// if (streamStatus.Item1) -// { -// await channel.SendMessageAsync($"`Streamer {streamStatus.Item2} is online.`"); -// } -// } -// catch -// { -// await channel.SendMessageAsync("No channel found."); -// } -// }); + var text = string.Join("\n", streams.Select(snc => + { + return $"`{snc.Username}`'s stream on **{channel.Guild.GetTextChannel(snc.ChannelId)?.Name}** channel. 【`{snc.Type.ToString()}`】"; + })); -// cgb.CreateCommand(Module.Prefix + "removestream") -// .Alias(Module.Prefix + "rms") -// .Description("Removes notifications of a certain streamer on this channel." + -// $" | `{Prefix}rms SomeGuy`") -// .AddCheck(SimpleCheckers.ManageServer()) -// .Parameter("username", ParameterType.Unparsed) -// .Do(async e => -// { -// var username = username?.ToLower().Trim(); -// if (string.IsNullOrWhiteSpace(username)) -// return; + await channel.SendMessageAsync($"You are following **{streams.Count()}** streams on this server.\n\n" + text).ConfigureAwait(false); + } -// var config = SpecificConfigurations.Default.Of(e.Server.Id); + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public async Task RemoveStream(IUserMessage msg, [Remainder] string username) + { + var channel = (ITextChannel)msg.Channel; -// var toRemove = config.ObservingStreams -// .FirstOrDefault(snc => snc.ChannelId == e.Channel.Id && -// snc.Username.ToLower().Trim() == username); -// if (toRemove == null) -// { -// await channel.SendMessageAsync(":anger: No such stream.").ConfigureAwait(false); -// return; -// } + username = username.ToUpperInvariant().Trim(); -// config.ObservingStreams.Remove(toRemove); -// await ConfigHandler.SaveConfig().ConfigureAwait(false); -// await channel.SendMessageAsync($":ok: Removed `{toRemovumsg.Authorname}`'s stream from notifications.").ConfigureAwait(false); -// }); + FollowedStream toRemove; + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(channel.Guild.Id); + var streams = config.FollowedStreams; + toRemove = streams.Where(fs => fs.ChannelId == channel.Id && fs.Username.ToUpperInvariant() == username).FirstOrDefault(); + if (toRemove != null) + { + config.FollowedStreams = streams.Except(new[] { toRemove }).ToList(); + await uow.CompleteAsync(); + } + } + if (toRemove == null) + { + await channel.SendMessageAsync(":anger: No such stream.").ConfigureAwait(false); + return; + } + await channel.SendMessageAsync($":ok: Removed `{toRemove.Username}`'s stream ({toRemove.Type}) from notifications.").ConfigureAwait(false); + } -// cgb.CreateCommand(Module.Prefix + "liststreams") -// .Alias(Module.Prefix + "ls") -// .Description("Lists all streams you are following on this server." + -// $" | `{Prefix}ls`") -// .Do(async e => -// { + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public async Task CheckStream(IUserMessage imsg, FollowedStream.FollowedStreamType platform, [Remainder] string username) + { + var channel = (ITextChannel)imsg.Channel; -// var config = SpecificConfigurations.Default.Of(e.Server.Id); + var stream = username?.Trim(); + if (string.IsNullOrWhiteSpace(stream)) + return; + try + { + var streamStatus = (await GetStreamStatus(new FollowedStream + { + Username = stream, + Type = platform + })); + if (streamStatus.Item1) + { + await channel.SendMessageAsync($"`Streamer {streamStatus.Item2} is online.`"); + } + } + catch + { + await channel.SendMessageAsync("No channel found."); + } + } -// var streams = config.ObservingStreams.Where(snc => -// snc.ServerId == e.Server.Id); - -// var streamsArray = streams as StreamNotificationConfig[] ?? streams.ToArray(); - -// if (streamsArray.Length == 0) -// { -// await channel.SendMessageAsync("You are not following any streams on this server.").ConfigureAwait(false); -// return; -// } - -// var text = string.Join("\n", streamsArray.Select(snc => -// { -// try -// { -// return $"`{snc.Username}`'s stream on **{e.Server.GetChannel(e.Channel.Id).Name}** channel. 【`{snc.Type.ToString()}`】"; -// } -// catch { } -// return ""; -// })); - -// await channel.SendMessageAsync($"You are following **{streamsArray.Length}** streams on this server.\n\n" + text).ConfigureAwait(false); -// }); -// } - -// private Func TrackStream(StreamNotificationConfig.StreamType type) => -// async e => -// { -// var username = username?.ToLowerInvariant(); -// if (string.IsNullOrWhiteSpace(username)) -// return; - -// var config = SpecificConfigurations.Default.Of(e.Server.Id); - -// var stream = new StreamNotificationConfig -// { -// ServerId = e.Server.Id, -// ChannelId = e.Channel.Id, -// Username = username, -// Type = type, -// }; -// var exists = config.ObservingStreams.Contains(stream); -// if (exists) -// { -// await channel.SendMessageAsync(":anger: I am already notifying that stream on this channel.").ConfigureAwait(false); -// return; -// } -// Tuple data; -// try -// { -// data = await GetStreamStatus(stream).ConfigureAwait(false); -// } -// catch -// { -// await channel.SendMessageAsync(":anger: Stream probably doesn't exist.").ConfigureAwait(false); -// return; -// } -// var msg = $"Stream is currently **{(data.Item1 ? "ONLINE" : "OFFLINE")}** with **{data.Item2}** viewers"; -// if (data.Item1) -// if (type == StreamNotificationConfig.StreamType.Hitbox) -// msg += $"\n`Here is the Link:`【 http://www.hitbox.tv/{stream.Username}/ 】"; -// else if (type == StreamNotificationConfig.StreamType.Twitch) -// msg += $"\n`Here is the Link:`【 http://www.twitch.tv/{stream.Username}/ 】"; -// else if (type == StreamNotificationConfig.StreamType.Beam) -// msg += $"\n`Here is the Link:`【 https://beam.pro/{stream.Username}/ 】"; -// else if (type == StreamNotificationConfig.StreamType.YoutubeGaming) -// msg += $"\n`Here is the Link:` not implemented yet - {stream.Username}"; -// stream.LastStatus = data.Item1; -// if (!exists) -// msg = $":ok: I will notify this channel when status changes.\n{msg}"; -// await channel.SendMessageAsync(msg).ConfigureAwait(false); -// config.ObservingStreams.Add(stream); -// }; -// } -// } -//} \ No newline at end of file + private async Task TrackStream(ITextChannel channel, string username, FollowedStream.FollowedStreamType type) + { + username = username.ToUpperInvariant().Trim(); + var stream = new FollowedStream + { + GuildId = channel.Guild.Id, + ChannelId = channel.Id, + Username = username, + Type = type, + }; + bool exists; + using (var uow = DbHandler.UnitOfWork()) + { + exists = uow.GuildConfigs.For(channel.Guild.Id).FollowedStreams.Where(fs => fs.ChannelId == channel.Id && fs.Username.ToUpperInvariant().Trim() == username).Any(); + } + if (exists) + { + await channel.SendMessageAsync($":anger: I am already following `{username}` ({type}) stream on this channel.").ConfigureAwait(false); + return; + } + Tuple data; + try + { + data = await GetStreamStatus(stream).ConfigureAwait(false); + } + catch + { + await channel.SendMessageAsync(":anger: Stream probably doesn't exist.").ConfigureAwait(false); + return; + } + var msg = $"Stream is currently **{(data.Item1 ? "ONLINE" : "OFFLINE")}** with **{data.Item2}** viewers"; + if (data.Item1) + if (type == FollowedStream.FollowedStreamType.Hitbox) + msg += $"\n`Here is the Link:`【 http://www.hitbox.tv/{stream.Username}/ 】"; + else if (type == FollowedStream.FollowedStreamType.Twitch) + msg += $"\n`Here is the Link:`【 http://www.twitch.tv/{stream.Username}/ 】"; + else if (type == FollowedStream.FollowedStreamType.Beam) + msg += $"\n`Here is the Link:`【 https://beam.pro/{stream.Username}/ 】"; + //else if (type == FollowedStream.FollowedStreamType.YoutubeGaming) + // msg += $"\n`Here is the Link:` not implemented yet - {stream.Username}"; + stream.LastStatus = data.Item1; + using (var uow = DbHandler.UnitOfWork()) + { + uow.GuildConfigs.For(channel.Guild.Id).FollowedStreams.Add(stream); + await uow.CompleteAsync(); + } + msg = $":ok: I will notify this channel when status changes.\n{msg}"; + await channel.SendMessageAsync(msg).ConfigureAwait(false); + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Searches/Searches.cs b/src/NadekoBot/Modules/Searches/Searches.cs index 59828814..9fb3a387 100644 --- a/src/NadekoBot/Modules/Searches/Searches.cs +++ b/src/NadekoBot/Modules/Searches/Searches.cs @@ -26,7 +26,7 @@ namespace NadekoBot.Modules.Searches _google = youtube; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Weather(IUserMessage umsg, string city, string country) { @@ -47,7 +47,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 🌄 **Sunrise:** {obj["sunrise"]} 🌇 **Sunset:** {obj["sunset"]}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Youtube(IUserMessage umsg, [Remainder] string query = null) { @@ -62,7 +62,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendMessageAsync(result).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Imdb(IUserMessage umsg, [Remainder] string query = null) { @@ -86,7 +86,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendMessageAsync(result.ToString()).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task RandomCat(IUserMessage umsg) { @@ -99,7 +99,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task RandomDog(IUserMessage umsg) { @@ -110,7 +110,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task I(IUserMessage umsg, [Remainder] string query = null) { @@ -140,7 +140,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Ir(IUserMessage umsg, [Remainder] string query = null) { @@ -172,7 +172,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Lmgtfy(IUserMessage umsg, [Remainder] string ffs = null) { @@ -186,7 +186,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Google(IUserMessage umsg, [Remainder] string terms = null) { @@ -200,7 +200,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .ConfigureAwait(false); } ////todo drawing - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Hearthstone(IUserMessage umsg, [Remainder] string name = null) //{ @@ -245,7 +245,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 // } //} - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Ud(IUserMessage umsg, [Remainder] string query = null) { @@ -279,7 +279,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Hashtag(IUserMessage umsg, [Remainder] string query = null) { @@ -314,7 +314,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Catfact(IUserMessage umsg) { @@ -328,7 +328,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Revav(IUserMessage umsg, [Remainder] string arg = null) { @@ -345,7 +345,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Revimg(IUserMessage umsg, [Remainder] string imageLink = null) { @@ -357,7 +357,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={imageLink}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Safebooru(IUserMessage umsg, [Remainder] string tag = null) { @@ -371,7 +371,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendMessageAsync(link).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Wiki(IUserMessage umsg, [Remainder] string query = null) { @@ -392,7 +392,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } ////todo drawing - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task Clr(IUserMessage umsg, [Remainder] string color = null) //{ @@ -417,7 +417,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 // await channel.SendFileAsync("arg1.png", img.ToStream()); //} - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Videocall(IUserMessage umsg, [Remainder] string arg = null) { @@ -440,7 +440,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Avatar(IUserMessage umsg, [Remainder] string mention = null) { diff --git a/src/NadekoBot/Modules/Translator/Translator.cs b/src/NadekoBot/Modules/Translator/Translator.cs index 425d9b0c..c1cf0850 100644 --- a/src/NadekoBot/Modules/Translator/Translator.cs +++ b/src/NadekoBot/Modules/Translator/Translator.cs @@ -16,7 +16,7 @@ namespace NadekoBot.Modules.Translator { } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Translate(IUserMessage umsg, string langs, [Remainder] string text = null) { @@ -44,7 +44,7 @@ namespace NadekoBot.Modules.Translator } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Translangs(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Trello/Trello.cs b/src/NadekoBot/Modules/Trello/Trello.cs index 18e1a4d5..fbda6fab 100644 --- a/src/NadekoBot/Modules/Trello/Trello.cs +++ b/src/NadekoBot/Modules/Trello/Trello.cs @@ -11,7 +11,7 @@ ////todo rewrite //namespace NadekoBot.Modules.Trello //{ -// internal class Trello : DiscordModule +// public class Trello : DiscordModule // { // private readonly Timer t = new Timer { Interval = 2000 }; // public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.Trello; diff --git a/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs b/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs index 62aab7b1..7b5a9ef1 100644 --- a/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs +++ b/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs @@ -12,7 +12,7 @@ namespace NadekoBot.Modules.Utility { partial class Utility : DiscordModule { - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ServerInfo(IUserMessage msg, string guild = null) { @@ -47,7 +47,7 @@ namespace NadekoBot.Modules.Utility await msg.Reply(sb.ToString()).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ChannelInfo(IUserMessage msg, ITextChannel channel = null) { @@ -63,7 +63,7 @@ namespace NadekoBot.Modules.Utility await msg.Reply(toReturn).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task UserInfo(IUserMessage msg, IGuildUser usr = null) { diff --git a/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs b/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs index d1206ee6..98f62442 100644 --- a/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs +++ b/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs @@ -14,7 +14,7 @@ namespace NadekoBot.Modules.Utility { public partial class Utility { - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ShowQuote(IUserMessage umsg, string keyword) { @@ -37,7 +37,7 @@ namespace NadekoBot.Modules.Utility await channel.SendMessageAsync("📣 " + quote.Text); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task AddQuote(IUserMessage umsg, string keyword, [Remainder] string text) { @@ -63,7 +63,7 @@ namespace NadekoBot.Modules.Utility } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task DeleteQuote(IUserMessage umsg, string keyword) { @@ -90,7 +90,7 @@ namespace NadekoBot.Modules.Utility await channel.SendMessageAsync("`Deleted a random quote.`"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task DelAllQuotes(IUserMessage umsg, string keyword) { diff --git a/src/NadekoBot/Modules/Utility/Commands/Remind.cs b/src/NadekoBot/Modules/Utility/Commands/Remind.cs index 8f273aa6..ba48f1e9 100644 --- a/src/NadekoBot/Modules/Utility/Commands/Remind.cs +++ b/src/NadekoBot/Modules/Utility/Commands/Remind.cs @@ -92,7 +92,7 @@ namespace NadekoBot.Modules.Utility } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Remind(IUserMessage umsg, string meorchannel, string timeStr, [Remainder] string message) { @@ -185,7 +185,7 @@ namespace NadekoBot.Modules.Utility } ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary] + //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] //public async Task RemindTemplate(IUserMessage umsg, [Remainder] string arg) //{ diff --git a/src/NadekoBot/Modules/Utility/Utility.cs b/src/NadekoBot/Modules/Utility/Utility.cs index 07499f5a..a10441c7 100644 --- a/src/NadekoBot/Modules/Utility/Utility.cs +++ b/src/NadekoBot/Modules/Utility/Utility.cs @@ -23,7 +23,7 @@ namespace NadekoBot.Modules.Utility } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task WhosPlaying(IUserMessage umsg, [Remainder] string game = null) { @@ -43,7 +43,7 @@ namespace NadekoBot.Modules.Utility await channel.SendMessageAsync("```xl\n" + string.Join("\n", arr.GroupBy(item => (i++) / 3).Select(ig => string.Concat(ig.Select(el => $"• {el,-35}")))) + "\n```").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task InRole(IUserMessage umsg, [Remainder] string roles = null) { @@ -76,7 +76,7 @@ namespace NadekoBot.Modules.Utility await channel.SendMessageAsync(send).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task CheckMyPerms(IUserMessage msg) { @@ -93,7 +93,7 @@ namespace NadekoBot.Modules.Utility await msg.Reply(builder.ToString()); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task UserId(IUserMessage msg, IGuildUser target = null) { @@ -101,20 +101,20 @@ namespace NadekoBot.Modules.Utility await msg.Reply($"Id of the user { usr.Username } is { usr.Id })").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] public async Task ChannelId(IUserMessage msg) { await msg.Reply($"This Channel's ID is {msg.Channel.Id}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ServerId(IUserMessage msg) { await msg.Reply($"This server's ID is {(msg.Channel as ITextChannel).Guild.Id}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Roles(IUserMessage msg, IGuildUser target = null) { @@ -129,7 +129,7 @@ namespace NadekoBot.Modules.Utility } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task ChannelTopic(IUserMessage umsg) { @@ -142,7 +142,7 @@ namespace NadekoBot.Modules.Utility await channel.SendMessageAsync("`Topic:` " + topic); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] [RequireContext(ContextType.Guild)] public async Task Stats(IUserMessage umsg) { diff --git a/src/NadekoBot/Resources/CommandStrings.Designer.cs b/src/NadekoBot/Resources/CommandStrings.Designer.cs index 380f6767..0c172970 100644 --- a/src/NadekoBot/Resources/CommandStrings.Designer.cs +++ b/src/NadekoBot/Resources/CommandStrings.Designer.cs @@ -86,33 +86,6 @@ namespace NadekoBot.Resources { } } - /// - /// Looks up a localized string similar to Try to get 'abalabahaha'. - /// - public static string ab_desc { - get { - return ResourceManager.GetString("ab_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `@NadekoBot ab`. - /// - public static string ab_summary { - get { - return ResourceManager.GetString("ab_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ab. - /// - public static string ab_text { - get { - return ResourceManager.GetString("ab_text", resourceCulture); - } - } - /// /// Looks up a localized string similar to Add a custom reaction. Guide here: <https://github.com/Kwoth/NadekoBot/wiki/Custom-Reactions> **Bot Owner Only!**. /// @@ -132,7 +105,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to addcustreact. + /// Looks up a localized string similar to addcustreact acr. /// public static string addcustreact_text { get { @@ -159,7 +132,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to addfilterword. + /// Looks up a localized string similar to addfilterword afw. /// public static string addfilterword_text { get { @@ -186,7 +159,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to addplaying. + /// Looks up a localized string similar to addplaying adpl. /// public static string addplaying_text { get { @@ -240,7 +213,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to allchnlcmds. + /// Looks up a localized string similar to allchnlcmds acc. /// public static string allchnlcmds_text { get { @@ -267,7 +240,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to allchnlmdls. + /// Looks up a localized string similar to allchnlmdls acm. /// public static string allchnlmdls_text { get { @@ -321,7 +294,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to allrolecmds. + /// Looks up a localized string similar to allrolecmds acmdcds. /// public static string allrolecmds_text { get { @@ -348,7 +321,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to allrolemdls. + /// Looks up a localized string similar to allrolemdls arm. /// public static string allrolemdls_text { get { @@ -375,7 +348,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to allsrvrcmds. + /// Looks up a localized string similar to allsrvrcmds asc. /// public static string allsrvrcmds_text { get { @@ -402,7 +375,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to allsrvrmdls. + /// Looks up a localized string similar to allsrvrmdls asm. /// public static string allsrvrmdls_text { get { @@ -429,7 +402,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to ani. + /// Looks up a localized string similar to ani anime aq. /// public static string ani_text { get { @@ -537,7 +510,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to autoassignrole. + /// Looks up a localized string similar to autoassignrole aar. /// public static string autoassignrole_text { get { @@ -564,7 +537,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to autoplay. + /// Looks up a localized string similar to autoplay ap. /// public static string autoplay_text { get { @@ -591,7 +564,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to av. + /// Looks up a localized string similar to av avatar. /// public static string avatar_text { get { @@ -645,7 +618,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to ban. + /// Looks up a localized string similar to ban b. /// public static string ban_text { get { @@ -672,7 +645,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to beam. + /// Looks up a localized string similar to beam bm. /// public static string beam_text { get { @@ -699,7 +672,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to betflip. + /// Looks up a localized string similar to betflip bf. /// public static string betflip_text { get { @@ -726,7 +699,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to betroll. + /// Looks up a localized string similar to betroll br. /// public static string betroll_text { get { @@ -807,7 +780,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to butts. + /// Looks up a localized string similar to butts ass butt. /// public static string butts_text { get { @@ -942,7 +915,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to calculate. + /// Looks up a localized string similar to calculate calc. /// public static string calculate_text { get { @@ -977,6 +950,33 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to Check how much NadekoFlowers a person has. (Defaults to yourself). + /// + public static string cash_desc { + get { + return ResourceManager.GetString("cash_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `$$$` or `$$$ @SomeGuy`. + /// + public static string cash_summary { + get { + return ResourceManager.GetString("cash_summary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to $$$. + /// + public static string cash_text { + get { + return ResourceManager.GetString("cash_text", resourceCulture); + } + } + /// /// Looks up a localized string similar to Shows a random catfact from <http://catfacts-api.appspot.com/api/facts>. /// @@ -1077,7 +1077,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to channelinfo. + /// Looks up a localized string similar to channelinfo cinfo. /// public static string channelinfo_text { get { @@ -1104,7 +1104,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to channeltopic. + /// Looks up a localized string similar to channeltopic ct. /// public static string channeltopic_text { get { @@ -1131,7 +1131,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to checkbeam. + /// Looks up a localized string similar to checkbeam chbm. /// public static string checkbeam_text { get { @@ -1158,7 +1158,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to checkhitbox. + /// Looks up a localized string similar to checkhitbox chhb. /// public static string checkhitbox_text { get { @@ -1212,7 +1212,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to checktwitch. + /// Looks up a localized string similar to checktwitch chtw. /// public static string checktwitch_text { get { @@ -1239,7 +1239,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to chnlcmd. + /// Looks up a localized string similar to chnlcmd cc. /// public static string chnlcmd_text { get { @@ -1266,7 +1266,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to chnlfilterinv. + /// Looks up a localized string similar to chnlfilterinv cfi. /// public static string chnlfilterinv_text { get { @@ -1293,7 +1293,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to chnlfilterwords. + /// Looks up a localized string similar to chnlfilterwords cfw. /// public static string chnlfilterwords_text { get { @@ -1320,7 +1320,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to chnlmdl. + /// Looks up a localized string similar to chnlmdl cm. /// public static string chnlmdl_text { get { @@ -1347,7 +1347,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to chnlperms. + /// Looks up a localized string similar to chnlperms cp. /// public static string chnlperms_text { get { @@ -1374,7 +1374,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to chnlpermscopy. + /// Looks up a localized string similar to chnlpermscopy cpc. /// public static string chnlpermscopy_text { get { @@ -1428,7 +1428,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to chucknorris. + /// Looks up a localized string similar to chucknorris cn. /// public static string chucknorris_text { get { @@ -1455,7 +1455,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to claim. + /// Looks up a localized string similar to claim call c. /// public static string claim_text { get { @@ -1482,7 +1482,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to claimfinish. + /// Looks up a localized string similar to claimfinish cf cf3 claimfinish3. /// public static string claimfinish_text { get { @@ -1509,7 +1509,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to claimfinish1. + /// Looks up a localized string similar to claimfinish1 cf1. /// public static string claimfinish1_text { get { @@ -1536,7 +1536,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to claimfinish2. + /// Looks up a localized string similar to claimfinish2 cf2. /// public static string claimfinish2_text { get { @@ -1590,7 +1590,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to cleanvplust. + /// Looks up a localized string similar to cleanvplust cv+t. /// public static string cleanvplust_text { get { @@ -1617,7 +1617,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to clr. + /// Looks up a localized string similar to clr prune. /// public static string clr_text { get { @@ -1644,7 +1644,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to cmdcooldown. + /// Looks up a localized string similar to cmdcooldown cmdcd. /// public static string cmdcooldown_text { get { @@ -1779,7 +1779,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to createrole. + /// Looks up a localized string similar to createrole cr. /// public static string createrole_text { get { @@ -1806,7 +1806,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to createwar. + /// Looks up a localized string similar to createwar cw. /// public static string createwar_text { get { @@ -1833,7 +1833,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to creatvoichanl. + /// Looks up a localized string similar to creatvoichanl cvch. /// public static string creatvoichanl_text { get { @@ -1860,7 +1860,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to creatxtchanl. + /// Looks up a localized string similar to creatxtchanl ctch. /// public static string creatxtchanl_text { get { @@ -1941,7 +1941,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to deafen. + /// Looks up a localized string similar to deafen deaf. /// public static string deafen_text { get { @@ -1968,7 +1968,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to defvol. + /// Looks up a localized string similar to defvol dv. /// public static string defvol_text { get { @@ -1995,7 +1995,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to delallq. + /// Looks up a localized string similar to delallq daq. /// public static string delallquotes_text { get { @@ -2022,7 +2022,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to delcustreact. + /// Looks up a localized string similar to delcustreact dcr. /// public static string delcustreact_text { get { @@ -2049,7 +2049,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to deleteplaylist. + /// Looks up a localized string similar to deleteplaylist delpls. /// public static string deleteplaylist_text { get { @@ -2076,7 +2076,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to deletequote. + /// Looks up a localized string similar to deletequote delq. /// public static string deletequote_text { get { @@ -2130,7 +2130,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to deltxtchanl. + /// Looks up a localized string similar to deltxtchanl dtch. /// public static string deltxtchanl_text { get { @@ -2157,7 +2157,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to delvoichanl. + /// Looks up a localized string similar to delvoichanl dvch. /// public static string delvoichanl_text { get { @@ -2184,7 +2184,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to destroy. + /// Looks up a localized string similar to destroy d. /// public static string destroy_text { get { @@ -2454,7 +2454,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to editcustreact. + /// Looks up a localized string similar to editcustreact ecr. /// public static string editcustreact_text { get { @@ -2481,7 +2481,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to endwar. + /// Looks up a localized string similar to endwar ew. /// public static string endwar_text { get { @@ -2589,7 +2589,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to gencurrency. + /// Looks up a localized string similar to gencurrency gc. /// public static string gencurrency_text { get { @@ -2616,7 +2616,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to getlink. + /// Looks up a localized string similar to getlink gl. /// public static string getlink_text { get { @@ -2670,7 +2670,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to google. + /// Looks up a localized string similar to google g. /// public static string google_text { get { @@ -2859,7 +2859,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to readme. + /// Looks up a localized string similar to readme guide. /// public static string guide_text { get { @@ -2886,7 +2886,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to h. + /// Looks up a localized string similar to h help. /// public static string h_text { get { @@ -3075,7 +3075,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to hitbox. + /// Looks up a localized string similar to hitbox hb. /// public static string hitbox_text { get { @@ -3156,7 +3156,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to i. + /// Looks up a localized string similar to img i. /// public static string i_text { get { @@ -3210,7 +3210,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to iamnot. + /// Looks up a localized string similar to iamnot iamn. /// public static string iamnot_text { get { @@ -3345,7 +3345,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to joinrace. + /// Looks up a localized string similar to joinrace jr. /// public static string joinrace_text { get { @@ -3372,7 +3372,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to kick. + /// Looks up a localized string similar to kick k. /// public static string kick_text { get { @@ -3426,7 +3426,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to leaderboard. + /// Looks up a localized string similar to leaderboard lb. /// public static string leaderboard_text { get { @@ -3534,7 +3534,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to listallincidents. + /// Looks up a localized string similar to listallincidents lain. /// public static string listallincidents_text { get { @@ -3561,7 +3561,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to listcustreact. + /// Looks up a localized string similar to listcustreact lcr. /// public static string listcustreact_text { get { @@ -3588,7 +3588,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to listincidents. + /// Looks up a localized string similar to listincidents lin. /// public static string listincidents_text { get { @@ -3615,7 +3615,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to listplaying. + /// Looks up a localized string similar to listplaying lipl. /// public static string listplaying_text { get { @@ -3642,7 +3642,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to listqueue. + /// Looks up a localized string similar to listqueue lq. /// public static string listqueue_text { get { @@ -3669,7 +3669,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to lists. + /// Looks up a localized string similar to lists list. /// public static string lists_text { get { @@ -3696,7 +3696,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to liststreams. + /// Looks up a localized string similar to liststreams ls. /// public static string liststreams_text { get { @@ -3723,7 +3723,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to listwar. + /// Looks up a localized string similar to listwar lw. /// public static string listwar_text { get { @@ -3804,7 +3804,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to local. + /// Looks up a localized string similar to local lo. /// public static string local_text { get { @@ -3831,7 +3831,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to localplaylst. + /// Looks up a localized string similar to localplaylst lopl. /// public static string localpl_text { get { @@ -3993,7 +3993,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to lstfilterwords. + /// Looks up a localized string similar to lstfilterwords lfw. /// public static string lstfilterwords_text { get { @@ -4020,7 +4020,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to magicitem. + /// Looks up a localized string similar to magicitem mi. /// public static string magicitem_text { get { @@ -4031,27 +4031,27 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to Queries anilist for a manga and shows the first result.. /// - public static string mang_desc { + public static string manga_desc { get { - return ResourceManager.GetString("mang_desc", resourceCulture); + return ResourceManager.GetString("manga_desc", resourceCulture); } } /// /// Looks up a localized string similar to `~mq Shingeki no kyojin`. /// - public static string mang_summary { + public static string manga_summary { get { - return ResourceManager.GetString("mang_summary", resourceCulture); + return ResourceManager.GetString("manga_summary", resourceCulture); } } /// - /// Looks up a localized string similar to mang. + /// Looks up a localized string similar to manga mang mq. /// - public static string mang_text { + public static string manga_text { get { - return ResourceManager.GetString("mang_text", resourceCulture); + return ResourceManager.GetString("manga_text", resourceCulture); } } @@ -4155,7 +4155,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to mentionrole. + /// Looks up a localized string similar to mentionrole menro. /// public static string mentionrole_text { get { @@ -4209,7 +4209,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to move. + /// Looks up a localized string similar to move mv. /// public static string move_text { get { @@ -4236,7 +4236,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to movelist. + /// Looks up a localized string similar to movelist ml. /// public static string movelist_text { get { @@ -4263,7 +4263,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to movesong. + /// Looks up a localized string similar to movesong ms. /// public static string movesong_text { get { @@ -4290,7 +4290,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to mute. + /// Looks up a localized string similar to mute min. /// public static string mute_text { get { @@ -4317,7 +4317,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to newavatar. + /// Looks up a localized string similar to newavatar setavatar. /// public static string newavatar_text { get { @@ -4344,7 +4344,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to next. + /// Looks up a localized string similar to next n. /// public static string next_text { get { @@ -4371,7 +4371,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to nowplaying. + /// Looks up a localized string similar to nowplaying np. /// public static string nowplaying_text { get { @@ -4506,7 +4506,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to pause. + /// Looks up a localized string similar to pause p. /// public static string pause_text { get { @@ -4533,7 +4533,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to permrole. + /// Looks up a localized string similar to permrole pr. /// public static string permrole_text { get { @@ -4614,7 +4614,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to playlist. + /// Looks up a localized string similar to playlist pl. /// public static string playlist_text { get { @@ -4641,7 +4641,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to playlists. + /// Looks up a localized string similar to playlists pls. /// public static string playlists_text { get { @@ -4668,7 +4668,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to pokemon. + /// Looks up a localized string similar to pokemon poke. /// public static string pokemon_text { get { @@ -4695,7 +4695,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to pokemonability. + /// Looks up a localized string similar to pokemonability pokeab. /// public static string pokemonability_text { get { @@ -4776,7 +4776,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to prune. + /// Looks up a localized string similar to prune clr. /// public static string prune_text { get { @@ -4803,7 +4803,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to queue. + /// Looks up a localized string similar to queue q yq. /// public static string queue_text { get { @@ -4857,7 +4857,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to radio. + /// Looks up a localized string similar to radio ra. /// public static string radio_text { get { @@ -4911,7 +4911,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to randjoke. + /// Looks up a localized string similar to randjoke rj. /// public static string randjoke_text { get { @@ -4938,7 +4938,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to randomcat. + /// Looks up a localized string similar to randomcat meow. /// public static string randomcat_text { get { @@ -4965,7 +4965,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to randomdog. + /// Looks up a localized string similar to randomdog woof. /// public static string randomdog_text { get { @@ -5046,7 +5046,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to remove. + /// Looks up a localized string similar to remove rm. /// public static string remove_text { get { @@ -5073,7 +5073,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to removeallroles. + /// Looks up a localized string similar to removeallroles rar. /// public static string removeallroles_text { get { @@ -5100,7 +5100,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to removeplaying. + /// Looks up a localized string similar to removeplaying rmlp repl. /// public static string removeplaying_text { get { @@ -5127,7 +5127,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to removerole. + /// Looks up a localized string similar to removerole rr. /// public static string removerole_text { get { @@ -5154,7 +5154,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to removestream. + /// Looks up a localized string similar to removestream rms. /// public static string removestream_text { get { @@ -5181,7 +5181,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to renamerole. + /// Looks up a localized string similar to renamerole renr. /// public static string renamerole_text { get { @@ -5235,7 +5235,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to repeatinvoke. + /// Looks up a localized string similar to repeatinvoke repinv. /// public static string repeatinvoke_text { get { @@ -5262,7 +5262,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to rpeatplaylst. + /// Looks up a localized string similar to rpeatplaylst rpl. /// public static string repeatpl_text { get { @@ -5289,7 +5289,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to reptcursong. + /// Looks up a localized string similar to reptcursong rcs. /// public static string reptcursong_text { get { @@ -5361,7 +5361,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `~revav Image link`. + /// Looks up a localized string similar to `~revimg Image link`. /// public static string revimg_summary { get { @@ -5424,7 +5424,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to rmvfilterword. + /// Looks up a localized string similar to rmvfilterword rw. /// public static string rmvfilterword_text { get { @@ -5451,7 +5451,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to rolecmd. + /// Looks up a localized string similar to rolecmd rc. /// public static string rolecmd_text { get { @@ -5478,7 +5478,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to rolecolor. + /// Looks up a localized string similar to rolecolor rc. /// public static string rolecolor_text { get { @@ -5505,7 +5505,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to rolemdl. + /// Looks up a localized string similar to rolemdl rm. /// public static string rolemdl_text { get { @@ -5532,7 +5532,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to roleperms. + /// Looks up a localized string similar to roleperms rp. /// public static string roleperms_text { get { @@ -5559,7 +5559,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to rolepermscopy. + /// Looks up a localized string similar to rolepermscopy rpc. /// public static string rolepermscopy_text { get { @@ -5667,7 +5667,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to rotateplaying. + /// Looks up a localized string similar to rotateplaying ropl. /// public static string rotateplaying_text { get { @@ -5937,7 +5937,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to serverid. + /// Looks up a localized string similar to serverid sid. /// public static string serverid_text { get { @@ -5964,7 +5964,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to serverinfo. + /// Looks up a localized string similar to serverinfo sinfo. /// public static string serverinfo_text { get { @@ -5991,7 +5991,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to setchanlname. + /// Looks up a localized string similar to setchanlname schn. /// public static string setchanlname_text { get { @@ -6045,7 +6045,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to setmaxqueue. + /// Looks up a localized string similar to setmaxqueue smq. /// public static string setmaxqueue_text { get { @@ -6072,7 +6072,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to setname. + /// Looks up a localized string similar to setname newnm. /// public static string setname_text { get { @@ -6099,7 +6099,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to setrole. + /// Looks up a localized string similar to setrole sr. /// public static string setrole_text { get { @@ -6126,7 +6126,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to settopic. + /// Looks up a localized string similar to settopic st. /// public static string settopic_text { get { @@ -6180,7 +6180,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to showcustreact. + /// Looks up a localized string similar to showcustreact scr. /// public static string showcustreact_text { get { @@ -6234,7 +6234,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to shuffle. + /// Looks up a localized string similar to shuffle sh. /// public static string shuffle_text { get { @@ -6288,7 +6288,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to softban. + /// Looks up a localized string similar to softban sb. /// public static string softban_text { get { @@ -6315,7 +6315,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to soundcloudpl. + /// Looks up a localized string similar to soundcloudpl scpl. /// public static string soundcloudpl_text { get { @@ -6342,7 +6342,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to soundcloudqueue. + /// Looks up a localized string similar to soundcloudqueue sq. /// public static string soundcloudqueue_text { get { @@ -6396,7 +6396,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to srvrcmd. + /// Looks up a localized string similar to srvrcmd sc. /// public static string srvrcmd_text { get { @@ -6423,7 +6423,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to srvrfilterinv. + /// Looks up a localized string similar to srvrfilterinv sfi. /// public static string srvrfilterinv_text { get { @@ -6450,7 +6450,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to srvrfilterwords. + /// Looks up a localized string similar to srvrfilterwords sfw. /// public static string srvrfilterwords_text { get { @@ -6477,7 +6477,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to srvrmdl. + /// Looks up a localized string similar to srvrmdl sm. /// public static string srvrmdl_text { get { @@ -6504,7 +6504,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to srvrperms. + /// Looks up a localized string similar to srvrperms sp. /// public static string srvrperms_text { get { @@ -6531,7 +6531,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to startwar. + /// Looks up a localized string similar to startwar sw. /// public static string startwar_text { get { @@ -6585,7 +6585,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to stop. + /// Looks up a localized string similar to stop s. /// public static string stop_text { get { @@ -6612,7 +6612,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to t. + /// Looks up a localized string similar to trivia t. /// public static string t_text { get { @@ -6666,7 +6666,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to tesar. + /// Looks up a localized string similar to togglexclsar tesar. /// public static string tesar_text { get { @@ -6774,7 +6774,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to translate. + /// Looks up a localized string similar to translate trans. /// public static string translate_text { get { @@ -6801,7 +6801,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to twitch. + /// Looks up a localized string similar to twitch tw. /// public static string twitch_text { get { @@ -6944,33 +6944,6 @@ namespace NadekoBot.Resources { } } - /// - /// Looks up a localized string similar to Searches Urban Dictionary for a word.. - /// - public static string ud_desc { - get { - return ResourceManager.GetString("ud_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `~ud Pineapple`. - /// - public static string ud_summary { - get { - return ResourceManager.GetString("ud_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ud. - /// - public static string ud_text { - get { - return ResourceManager.GetString("ud_text", resourceCulture); - } - } - /// /// Looks up a localized string similar to Unbinds a bot from the channel and board. **Bot Owner Only!**. /// @@ -7017,7 +6990,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to unclaim. + /// Looks up a localized string similar to unclaim ucall uc. /// public static string unclaim_text { get { @@ -7044,7 +7017,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to undeafen. + /// Looks up a localized string similar to undeafen undef. /// public static string undeafen_text { get { @@ -7106,6 +7079,33 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to Searches Urban Dictionary for a word.. + /// + public static string urbandict_desc { + get { + return ResourceManager.GetString("urbandict_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `~ud Pineapple`. + /// + public static string urbandict_summary { + get { + return ResourceManager.GetString("urbandict_summary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to urbandict ud. + /// + public static string urbandict_text { + get { + return ResourceManager.GetString("urbandict_text", resourceCulture); + } + } + /// /// Looks up a localized string similar to Shows user ID.. /// @@ -7125,7 +7125,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to userid. + /// Looks up a localized string similar to userid uid. /// public static string userid_text { get { @@ -7152,7 +7152,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to userinfo. + /// Looks up a localized string similar to userinfo uinfo. /// public static string userinfo_text { get { @@ -7179,7 +7179,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to userperms. + /// Looks up a localized string similar to userperms up. /// public static string userperms_text { get { @@ -7233,7 +7233,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to usrcmd. + /// Looks up a localized string similar to usrcmd uc. /// public static string usrcmd_text { get { @@ -7260,7 +7260,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to usrmdl. + /// Looks up a localized string similar to usrmdl um. /// public static string usrmdl_text { get { @@ -7287,7 +7287,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to usrpermscopy. + /// Looks up a localized string similar to usrpermscopy upc. /// public static string usrpermscopy_text { get { @@ -7341,7 +7341,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to verbose. + /// Looks up a localized string similar to verbose v. /// public static string verbose_text { get { @@ -7395,7 +7395,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to voiceplustext. + /// Looks up a localized string similar to voice+text v+t. /// public static string voiceplustext_text { get { @@ -7449,7 +7449,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to volume. + /// Looks up a localized string similar to volume vol. /// public static string volume_text { get { @@ -7476,7 +7476,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to we. + /// Looks up a localized string similar to weather we. /// public static string weather_text { get { @@ -7530,7 +7530,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to wiki. + /// Looks up a localized string similar to wikipedia wiki. /// public static string wiki_text { get { @@ -7584,7 +7584,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to yomama. + /// Looks up a localized string similar to yomama ym. /// public static string yomama_text { get { @@ -7611,7 +7611,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to yt. + /// Looks up a localized string similar to youtube yt. /// public static string youtube_text { get { diff --git a/src/NadekoBot/Resources/CommandStrings.resx b/src/NadekoBot/Resources/CommandStrings.resx index d18d35b8..0a629b84 100644 --- a/src/NadekoBot/Resources/CommandStrings.resx +++ b/src/NadekoBot/Resources/CommandStrings.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - h + h help Either shows a help for a single command, or PMs you help link if no arguments are specified. @@ -271,7 +271,7 @@ `.voicerpresence` - repeatinvoke + repeatinvoke repinv Immediately shows the repeat message and restarts the timer. **Needs Manage Messages Permissions.** @@ -289,7 +289,7 @@ `.repeat 5 Hello there` - rotateplaying + rotateplaying ropl Toggles rotation of playing status of the dynamic strings you specified earlier. **Bot Owner Only!** @@ -298,7 +298,7 @@ `.ropl` - addplaying + addplaying adpl Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued%, %trivia% **Bot Owner Only!** @@ -307,7 +307,7 @@ `.adpl` - listplaying + listplaying lipl Lists all playing statuses with their corresponding number. **Bot Owner Only!** @@ -316,7 +316,7 @@ `.lipl` - removeplaying + removeplaying rmlp repl Removes a playing string on a given number. **Bot Owner Only!** @@ -334,7 +334,7 @@ `.slowmode` - cleanvplust + cleanvplust cv+t Deletes all text channels ending in `-voice` for which voicechannels are not found. **Use at your own risk. Needs Manage Roles and Manage Channels Permissions.** @@ -343,7 +343,7 @@ `.cleanv+t` - voiceplustext + voice+text v+t Creates a text channel for each voice channel only users in that voice channel can see.If you are server owner, keep in mind you will see them all the time regardless. **Needs Manage Roles and Manage Channels Permissions.** @@ -406,7 +406,7 @@ `.lsar` - tesar + togglexclsar tesar toggle whether the self-assigned roles should be exclusive @@ -424,7 +424,7 @@ `.iam Gamer` - iamnot + iamnot iamn Removes a role to you that you choose. Role must be on a list of self-assignable roles. @@ -433,7 +433,7 @@ `.iamn Gamer` - addcustreact + addcustreact acr Add a custom reaction. Guide here: <https://github.com/Kwoth/NadekoBot/wiki/Custom-Reactions> **Bot Owner Only!** @@ -442,7 +442,7 @@ `.acr "hello" Hi there %user%` - listcustreact + listcustreact lcr Lists custom reactions (paginated with 30 commands per page). Use 'all' instead of page number to get all custom reactions DM-ed to you. @@ -451,7 +451,7 @@ `.lcr 1` - showcustreact + showcustreact scr Shows all possible responses from a single custom reaction. @@ -460,7 +460,7 @@ `.scr %mention% bb` - editcustreact + editcustreact ecr Edits a custom reaction, arguments are custom reactions name, index to change, and a (multiword) message **Bot Owner Only** @@ -469,7 +469,7 @@ `.ecr "%mention% disguise" 2 Test 123` - delcustreact + delcustreact dcr Deletes a custom reaction with given name (and index). **Bot Owner Only.** @@ -478,7 +478,7 @@ `.dcr index` - autoassignrole + autoassignrole aar Automaticaly assigns a specified role to every user who joins the server. **Needs Manage Roles Permissions.** @@ -496,7 +496,7 @@ `.leave 123123123331` - listincidents + listincidents lin List all UNREAD incidents and flags them as read. **Needs Manage Server Permissions.** @@ -505,7 +505,7 @@ `.lin` - listallincidents + listallincidents lain Sends you a file containing all incidents and flags them as read. **Needs Manage Server Permissions.** @@ -532,7 +532,7 @@ `.restart` - setrole + setrole sr Sets a role for a given user. **Needs Manage Roles Permissions.** @@ -541,7 +541,7 @@ `.sr @User Guest` - removerole + removerole rr Removes a role from a given user. **Needs Manage Roles Permissions.** @@ -550,7 +550,7 @@ `.rr @User Admin` - renamerole + renamerole renr Renames a role. Roles you are renaming must be lower than bot's highest role. **Manage Roles Permissions.** @@ -559,7 +559,7 @@ `.renr "First role" SecondRole` - removeallroles + removeallroles rar Removes all roles from a mentioned user. **Needs Manage Roles Permissions.** @@ -568,7 +568,7 @@ `.rar @User` - createrole + createrole cr Creates a role with a given name. **Needs Manage Roles Permissions.** @@ -577,7 +577,7 @@ `.cr Awesome Role` - rolecolor + rolecolor rc Set a role's color to the hex or 0-255 rgb color value provided. **Needs Manage Roles Permissions.** @@ -586,7 +586,7 @@ `.rc Admin 255 200 100` or `.rc Admin ffba55` - ban + ban b Bans a user by id or name with an optional message. **Needs Ban Permissions.** @@ -595,7 +595,7 @@ `.b "@some Guy" Your behaviour is toxic.` - softban + softban sb Bans and then unbans a user by id or name with an optional message. **Needs Ban Permissions.** @@ -604,7 +604,7 @@ `.sb "@some Guy" Your behaviour is toxic.` - kick + kick k Kicks a mentioned user. **Needs Kick Permissions.** @@ -613,7 +613,7 @@ `.k "@some Guy" Your behaviour is toxic.` - mute + mute min Sets the music volume to 0% @@ -631,7 +631,7 @@ `.unmute "@Someguy"` or `.unmute "@Someguy" "@Someguy"` - deafen + deafen deaf Deafens mentioned user or users. **Needs Deafen Permissions.** @@ -640,7 +640,7 @@ `.deaf "@Someguy"` or `.deaf "@Someguy" "@Someguy"` - undeafen + undeafen undef Undeafens mentioned user or users. **Needs Deafen Permissions.** @@ -649,7 +649,7 @@ `.undef "@Someguy"` or `.undef "@Someguy" "@Someguy"` - delvoichanl + delvoichanl dvch Deletes a voice channel with a given name. **Needs Manage Channel Permissions.** @@ -658,7 +658,7 @@ `.dvch VoiceChannelName` - creatvoichanl + creatvoichanl cvch Creates a new voice channel with a given name. **Needs Manage Channel Permissions.** @@ -667,7 +667,7 @@ `.cvch VoiceChannelName` - deltxtchanl + deltxtchanl dtch Deletes a text channel with a given name. **Needs Manage Channel Permissions.** @@ -676,7 +676,7 @@ `.dtch TextChannelName` - creatxtchanl + creatxtchanl ctch Creates a new text channel with a given name. **Needs Manage Channel Permissions.** @@ -685,7 +685,7 @@ `.ctch TextChannelName` - settopic + settopic st Sets a topic on the current channel. **Needs Manage Channel Permissions.** @@ -694,7 +694,7 @@ `.st My new topic` - setchanlname + setchanlname schn Changed the name of the current channel. **Needs Manage Channel Permissions.** @@ -712,7 +712,7 @@ `.heap` - prune + prune clr `.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. **Needs Manage Messages Permissions** @@ -730,7 +730,7 @@ `@NadekoBot die` - setname + setname newnm Give the bot a new name. **Bot Owner Only!** @@ -739,7 +739,7 @@ `.newnm BotName` - newavatar + newavatar setavatar Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot Owner Only!** @@ -766,7 +766,7 @@ `.send sid - mentionrole + mentionrole menro Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission. @@ -838,7 +838,7 @@ `.remindmsg do something else` - serverinfo + serverinfo sinfo Shows info about the server the bot is on. If no channel is supplied, it defaults to current one. @@ -847,7 +847,7 @@ `.sinfo Some Server` - channelinfo + channelinfo cinfo Shows info about the channel. If no channel is supplied, it defaults to current one. @@ -856,7 +856,7 @@ `.cinfo #some-channel` - userinfo + userinfo uinfo Shows info about the user. If no user is supplied, it defaults a user running the command. @@ -910,7 +910,7 @@ `.dysyd` - userid + userid uid Shows user ID. @@ -928,7 +928,7 @@ `.cid` - serverid + serverid sid Shows current server ID. @@ -946,7 +946,7 @@ `.roles` - channeltopic + channeltopic ct Sends current channel's topic as a message. @@ -955,7 +955,7 @@ `.ct` - chnlfilterinv + chnlfilterinv cfi Enables or disables automatic deleting of invites on the channel.If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once. @@ -964,7 +964,7 @@ `;cfi enable #general-chat` - srvrfilterinv + srvrfilterinv sfi Enables or disables automatic deleting of invites on the server. @@ -973,7 +973,7 @@ `;sfi disable` - chnlfilterwords + chnlfilterwords cfw Enables or disables automatic deleting of messages containing banned words on the channel.If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once. @@ -982,7 +982,7 @@ `;cfw enable #general-chat` - addfilterword + addfilterword afw Adds a new word to the list of filtered words @@ -991,7 +991,7 @@ `;afw poop` - rmvfilterword + rmvfilterword rw Removes the word from the list of filtered words @@ -1000,7 +1000,7 @@ `;rw poop` - lstfilterwords + lstfilterwords lfw Shows a list of filtered words @@ -1009,7 +1009,7 @@ `;lfw` - srvrfilterwords + srvrfilterwords sfw Enables or disables automatic deleting of messages containing forbidden words on the server. @@ -1018,7 +1018,7 @@ `;sfw disable` - permrole + permrole pr Sets a role which can change permissions. Or supply no parameters to find out the current one. Default one is 'Nadeko'. @@ -1027,7 +1027,7 @@ `;pr role` - rolepermscopy + rolepermscopy rpc Copies BOT PERMISSIONS (not discord permissions) from one role to another. @@ -1036,7 +1036,7 @@ `;rpc Some Role ~ Some other role` - chnlpermscopy + chnlpermscopy cpc Copies BOT PERMISSIONS (not discord permissions) from one channel to another. @@ -1045,7 +1045,7 @@ `;cpc Some Channel ~ Some other channel` - usrpermscopy + usrpermscopy upc Copies BOT PERMISSIONS (not discord permissions) from one role to another. @@ -1054,7 +1054,7 @@ `;upc @SomeUser ~ @SomeOtherUser` - verbose + verbose v Sets whether to show when a command/module is blocked. @@ -1063,7 +1063,7 @@ `;verbose true` - srvrperms + srvrperms sp Shows banned permissions for this server. @@ -1072,7 +1072,7 @@ `;sp` - roleperms + roleperms rp Shows banned permissions for a certain role. No argument means for everyone. @@ -1081,7 +1081,7 @@ `;rp AwesomeRole` - chnlperms + chnlperms cp Shows banned permissions for a certain channel. No argument means for this channel. @@ -1090,7 +1090,7 @@ `;cp #dev` - userperms + userperms up Shows banned permissions for a certain user. No argument means for yourself. @@ -1099,7 +1099,7 @@ `;up Kwoth` - srvrmdl + srvrmdl sm Sets a module's permission at the server level. @@ -1108,7 +1108,7 @@ `;sm "module name" enable` - srvrcmd + srvrcmd sc Sets a command's permission at the server level. @@ -1117,7 +1117,7 @@ `;sc "command name" disable` - rolemdl + rolemdl rm Sets a module's permission at the role level. @@ -1126,7 +1126,7 @@ `;rm "module name" enable MyRole` - rolecmd + rolecmd rc Sets a command's permission at the role level. @@ -1135,7 +1135,7 @@ `;rc "command name" disable MyRole` - chnlmdl + chnlmdl cm Sets a module's permission at the channel level. @@ -1144,7 +1144,7 @@ `;cm "module name" enable SomeChannel` - chnlcmd + chnlcmd cc Sets a command's permission at the channel level. @@ -1153,7 +1153,7 @@ `;cc "command name" enable SomeChannel` - usrmdl + usrmdl um Sets a module's permission at the user level. @@ -1162,7 +1162,7 @@ `;um "module name" enable SomeUsername` - usrcmd + usrcmd uc Sets a command's permission at the user level. @@ -1171,7 +1171,7 @@ `;uc "command name" enable SomeUsername` - allsrvrmdls + allsrvrmdls asm Sets permissions for all modules at the server level. @@ -1180,7 +1180,7 @@ `;asm [enable/disable]` - allsrvrcmds + allsrvrcmds asc Sets permissions for all commands from a certain module at the server level. @@ -1189,7 +1189,7 @@ `;asc "module name" [enable/disable]` - allchnlmdls + allchnlmdls acm Sets permissions for all modules at the channel level. @@ -1198,7 +1198,7 @@ `;acm [enable/disable] SomeChannel` - allchnlcmds + allchnlcmds acc Sets permissions for all commands from a certain module at the channel level. @@ -1207,7 +1207,7 @@ `;acc "module name" [enable/disable] SomeChannel` - allrolemdls + allrolemdls arm Sets permissions for all modules at the role level. @@ -1216,7 +1216,7 @@ `;arm [enable/disable] MyRole` - allrolecmds + allrolecmds acmdcds Sets permissions for all commands from a certain module at the role level. @@ -1270,7 +1270,7 @@ `;sbl [servername/serverid]` - cmdcooldown + cmdcooldown cmdcd Sets a cooldown per user for a command. Set 0 to clear. **Needs Manager Messages Permissions** @@ -1306,7 +1306,7 @@ `... abc` - deletequote + deletequote delq Deletes all quotes with the specified keyword. You have to either be bot owner or the creator of the quote to delete it. @@ -1359,15 +1359,6 @@ `@NadekoBot dump` - - ab - - - Try to get 'abalabahaha' - - - `@NadekoBot ab` - draw @@ -1378,7 +1369,7 @@ `$draw [x]` - shuffle + shuffle sh Shuffles the current playlist. @@ -1396,7 +1387,7 @@ `$flip` or `$flip 3` - betflip + betflip bf Bet to guess will the result be heads or tails. Guessing award you double flowers you've bet. @@ -1441,7 +1432,7 @@ `$race` - joinrace + joinrace jr Joins a new race. You can specify an amount of flowers for betting (optional). You will get YourBet*(participants-1) back if you win. @@ -1486,7 +1477,7 @@ `$take 1 "@someguy"` - betroll + betroll br Bets a certain amount of NadekoFlowers and rolls a dice. Rolling over 66 yields x2 flowers, over 90 - x3 and 100 x10. @@ -1495,7 +1486,7 @@ `$br 5` - leaderboard + leaderboard lb Displays bot currency leaderboard @@ -1504,7 +1495,7 @@ `$lb` - t + trivia t Starts a game of trivia. You can add nohint to prevent hints.First player to get to 10 points wins by default. You can specify a different number. 30 seconds per question. @@ -1594,7 +1585,7 @@ `>plant` - gencurrency + gencurrency gc Toggles currency generation on this channel. Every posted message will have 2% chance to spawn a NadekoFlower. Optional parameter cooldown time in minutes, 5 minutes by default. Requires Manage Messages permission. @@ -1648,7 +1639,7 @@ `>linux Spyware Windows` - next + next n Goes to the next song in the queue. You have to be in the same voice channel as the bot. @@ -1657,7 +1648,7 @@ `!!n` - stop + stop s Stops the music and clears the playlist. Stays in the channel. @@ -1666,7 +1657,7 @@ `!!s` - destroy + destroy d Completely stops the music and unbinds the bot from the channel. (may cause weird behaviour) @@ -1675,7 +1666,7 @@ `!!d` - pause + pause p Pauses or Unpauses the song. @@ -1684,7 +1675,7 @@ `!!p` - queue + queue q yq Queue a song using keywords or a link. Bot will join your voice channel.**You must be in a voice channel**. @@ -1693,7 +1684,7 @@ `!!q Dream Of Venice` - soundcloudqueue + soundcloudqueue sq Queue a soundcloud song using keywords. Bot will join your voice channel.**You must be in a voice channel**. @@ -1702,7 +1693,7 @@ `!!sq Dream Of Venice` - listqueue + listqueue lq Lists 15 currently queued songs per page. Default page is 1. @@ -1711,7 +1702,7 @@ `!!lq` or `!!lq 2` - nowplaying + nowplaying np Shows the song currently playing. @@ -1720,7 +1711,7 @@ `!!np` - volume + volume vol Sets the music volume 0-100% @@ -1729,7 +1720,7 @@ `!!vol 50` - defvol + defvol dv Sets the default music volume when music playback is started (0-100). Persists through restarts. @@ -1756,7 +1747,7 @@ `!!half` - playlist + playlist pl Queues up to 500 songs from a youtube playlist specified by a link, or keywords. @@ -1765,7 +1756,7 @@ `!!pl playlist link or name` - soundcloudpl + soundcloudpl scpl Queue a soundcloud playlist using a link. @@ -1774,7 +1765,7 @@ `!!scpl soundcloudseturl` - localplaylst + localplaylst lopl Queues all songs from a directory. **Bot Owner Only!** @@ -1783,7 +1774,7 @@ `!!lopl C:/music/classical` - radio + radio ra Queues a radio stream from a link. It can be a direct mp3 radio stream, .m3u, .pls .asx or .xspf (Usage Video: <https://streamable.com/al54>) @@ -1792,7 +1783,7 @@ `!!ra radio link here` - local + local lo Queues a local file by specifying a full path. **Bot Owner Only!** @@ -1801,7 +1792,7 @@ `!!lo C:/music/mysong.mp3` - move + move mv Moves the bot to your voice channel. (works only if music is already playing) @@ -1810,7 +1801,7 @@ `!!mv` - remove + remove rm Remove a song by its # in the queue, or 'all' to remove whole queue. @@ -1819,7 +1810,7 @@ `!!rm 5` - movesong + movesong ms Moves a song from one position to another. @@ -1828,7 +1819,7 @@ `!! ms 5>3` - setmaxqueue + setmaxqueue smq Sets a maximum queue size. Supply 0 or no argument to have no limit. @@ -1846,7 +1837,7 @@ `!!cleanup` - reptcursong + reptcursong rcs Toggles repeat of current song. @@ -1855,7 +1846,7 @@ `!!rcs` - rpeatplaylst + rpeatplaylst rpl Toggles repeat of all songs in the queue (every song that finishes is added to the end of the queue). @@ -1882,7 +1873,7 @@ `!!load classical-1` - playlists + playlists pls Lists all playlists. Paginated. 20 per page. Default page is 0. @@ -1891,7 +1882,7 @@ `!!pls 1` - deleteplaylist + deleteplaylist delpls Deletes a saved playlist. Only if you made it or if you are the bot owner. @@ -1909,7 +1900,7 @@ `!!goto 30` - getlink + getlink gl Shows a link to the song in the queue by index, or the currently playing song by default. @@ -1918,7 +1909,7 @@ `!!gl` - autoplay + autoplay ap Toggles autoplay - When the song is finished, automatically queue a related youtube song. (Works only for youtube songs and when queue is empty) @@ -1945,7 +1936,7 @@ `~lolban` - hitbox + hitbox hb Notifies this channel when a certain user starts streaming. @@ -1954,7 +1945,7 @@ `~hitbox SomeStreamer` - twitch + twitch tw Notifies this channel when a certain user starts streaming. @@ -1963,7 +1954,7 @@ `~twitch SomeStreamer` - beam + beam bm Notifies this channel when a certain user starts streaming. @@ -1972,7 +1963,7 @@ `~beam SomeStreamer` - checkhitbox + checkhitbox chhb Checks if a certain user is streaming on the hitbox platform. @@ -1981,7 +1972,7 @@ `~chhb SomeStreamer` - checktwitch + checktwitch chtw Checks if a certain user is streaming on the twitch platform. @@ -1990,7 +1981,7 @@ `~chtw SomeStreamer` - checkbeam + checkbeam chbm Checks if a certain user is streaming on the beam platform. @@ -1999,7 +1990,7 @@ `~chbm SomeStreamer` - removestream + removestream rms Removes notifications of a certain streamer on this channel. @@ -2008,7 +1999,7 @@ `~rms SomeGuy` - liststreams + liststreams ls Lists all streams you are following on this server. @@ -2044,7 +2035,7 @@ `~wowjoke` - calculate + calculate calc Evaluate a mathematical expression. @@ -2080,7 +2071,7 @@ `~osu top5 Name` - pokemon + pokemon poke Searches for a pokemon. @@ -2089,7 +2080,7 @@ `~poke Sylveon` - pokemonability + pokemonability pokeab Searches for a pokemon ability. @@ -2116,7 +2107,7 @@ `~memegen biw "gets iced coffee" "in the winter"` - we + weather we Shows weather data for a specified city and a country. BOTH ARE REQUIRED. Use country abbrevations. @@ -2125,7 +2116,7 @@ `~we Moscow RF` - yt + youtube yt Searches youtubes and shows the first result @@ -2134,7 +2125,7 @@ `~yt query` - ani + ani anime aq Queries anilist for an anime and shows the first result. @@ -2151,17 +2142,17 @@ `~imdb Batman vs Superman` - - mang + + manga mang mq - + Queries anilist for a manga and shows the first result. - + `~mq Shingeki no kyojin` - randomcat + randomcat meow Shows a random cat image. @@ -2170,7 +2161,7 @@ `~meow` - randomdog + randomdog woof Shows a random dog image. @@ -2179,7 +2170,7 @@ `~woof` - i + img i Pulls the first image found using a search parameter. Use ~ir for different results. @@ -2206,7 +2197,7 @@ `~lmgtfy query` - google + google g Get a google search link for some terms. @@ -2223,13 +2214,13 @@ `~hs Ysera` - - ud + + urbandict ud - + Searches Urban Dictionary for a word. - + `~ud Pineapple` @@ -2251,7 +2242,7 @@ `~catfact` - yomama + yomama ym Shows a random joke from <http://api.yomomma.info/> @@ -2260,7 +2251,7 @@ `~ym` - randjoke + randjoke rj Shows a random joke from <http://tambal.azurewebsites.net/joke/random> @@ -2269,7 +2260,7 @@ `~rj` - chucknorris + chucknorris cn Shows a random chucknorris joke from <http://tambal.azurewebsites.net/joke/random> @@ -2278,7 +2269,7 @@ `~cn` - magicitem + magicitem mi Shows a random magicitem from <https://1d4chan.org/wiki/List_of_/tg/%27s_magic_items> @@ -2302,7 +2293,7 @@ Returns a google reverse image search for an image from a link. - `~revav Image link` + `~revimg Image link` safebooru @@ -2314,7 +2305,7 @@ `~safebooru yuri+kissing` - wiki + wikipedia wiki Gives you back a wikipedia link @@ -2323,7 +2314,7 @@ `~wiki query` - clr + clr prune Shows you what color corresponds to that hex. @@ -2341,7 +2332,7 @@ `~videocall "@SomeGuy"` - av + av avatar Shows a mentioned person's avatar. @@ -2413,7 +2404,7 @@ `~boobs` - butts + butts ass butt Real adult content. @@ -2422,7 +2413,7 @@ `~butts` or `~ass` - createwar + createwar cw Creates a new war by specifying a size (>10 and multiple of 5) and enemy clan name. @@ -2431,7 +2422,7 @@ `,cw 15 The Enemy Clan` - startwar + startwar sw Starts a war with a given number. @@ -2440,7 +2431,7 @@ `,sw 15` - listwar + listwar lw Shows the active war claims by a number. Shows all wars in a short way if no number is specified. @@ -2449,7 +2440,7 @@ `,lw [war_number] or ,lw` - claim + claim call c Claims a certain base from a certain war. You can supply a name in the third optional argument to claim in someone else's place. @@ -2458,7 +2449,7 @@ `,call [war_number] [base_number] [optional_other_name]` - claimfinish + claimfinish cf cf3 claimfinish3 Finish your claim with 3 stars if you destroyed a base. Optional second argument finishes for someone else. @@ -2467,7 +2458,7 @@ `,cf [war_number] [optional_other_name]` - claimfinish2 + claimfinish2 cf2 Finish your claim with 2 stars if you destroyed a base. Optional second argument finishes for someone else. @@ -2476,7 +2467,7 @@ `,cf [war_number] [optional_other_name]` - claimfinish1 + claimfinish1 cf1 Finish your claim with 1 stars if you destroyed a base. Optional second argument finishes for someone else. @@ -2485,7 +2476,7 @@ `,cf [war_number] [optional_other_name]` - unclaim + unclaim ucall uc Removes your claim from a certain war. Optional second argument denotes a person in whose place to unclaim @@ -2494,7 +2485,7 @@ `,uc [war_number] [optional_other_name]` - endwar + endwar ew Ends the war with a given index. @@ -2512,7 +2503,7 @@ `>attack "vine whip" @someguy` - movelist + movelist ml Lists the moves you are able to use @@ -2548,7 +2539,7 @@ `>settype fire` - translate + translate trans Translates from>to text. From the given language to the destiation language. @@ -2584,7 +2575,7 @@ `trello unbind` - lists + lists list Lists all lists, yo ;) **Bot Owner Only!** @@ -2608,7 +2599,7 @@ `-readme` or `-guide` - readme + readme guide Shows all available operations in .calc command @@ -2626,7 +2617,7 @@ `.delallq` - delallq + delallq daq greetdmmsg @@ -2637,4 +2628,13 @@ Sets a new join announcement message which will be sent to the user who joined. Type %user% if you want to mention the new member. Using it with no message will show the current DM greet message. **Needs Manage Server Permissions.** + + Check how much NadekoFlowers a person has. (Defaults to yourself) + + + `$$$` or `$$$ @SomeGuy` + + + $$$ + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.Designer.cs b/src/NadekoBot/Resources/ResponseStrings.Designer.cs index 72395491..38b66963 100644 --- a/src/NadekoBot/Resources/ResponseStrings.Designer.cs +++ b/src/NadekoBot/Resources/ResponseStrings.Designer.cs @@ -28,7 +28,7 @@ namespace NadekoBot.Resources { private static global::System.Globalization.CultureInfo resourceCulture; - internal ResponseStrings() { + public ResponseStrings() { } /// diff --git a/src/NadekoBot/Services/Database/Models/ClashWar.cs b/src/NadekoBot/Services/Database/Models/ClashWar.cs index 2daaf699..77c77994 100644 --- a/src/NadekoBot/Services/Database/Models/ClashWar.cs +++ b/src/NadekoBot/Services/Database/Models/ClashWar.cs @@ -29,7 +29,7 @@ namespace NadekoBot.Services.Database.Models public ulong ChannelId { get; set; } [NotMapped] - public ITextChannel Channel { get; internal set; } + public ITextChannel Channel { get; set; } public List Bases { get; set; } } diff --git a/src/NadekoBot/Services/Database/Models/FollowedStream.cs b/src/NadekoBot/Services/Database/Models/FollowedStream.cs new file mode 100644 index 00000000..8bab223e --- /dev/null +++ b/src/NadekoBot/Services/Database/Models/FollowedStream.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Database.Models +{ + public class FollowedStream : DbEntity + { + public ulong ChannelId { get; set; } + public string Username { get; set; } + public FollowedStreamType Type { get; set; } + public bool LastStatus { get; set; } + public ulong GuildId { get; set; } + + public enum FollowedStreamType + { + Twitch, Hitbox, Beam + } + } +} diff --git a/src/NadekoBot/Services/Database/Models/GuildConfig.cs b/src/NadekoBot/Services/Database/Models/GuildConfig.cs index a4cb10c5..62d2ead8 100644 --- a/src/NadekoBot/Services/Database/Models/GuildConfig.cs +++ b/src/NadekoBot/Services/Database/Models/GuildConfig.cs @@ -31,6 +31,11 @@ namespace NadekoBot.Services.Database.Models //self assignable roles public bool ExclusiveSelfAssignedRoles { get; set; } public bool AutoDeleteSelfAssignedRoleMessages { get; set; } - public float DefaultMusicVolume { get; set; } + public float DefaultMusicVolume { get; set; } = 1.0f; + public bool VoicePlusTextEnabled { get; set; } + + + //stream notifications + public List FollowedStreams { get; set; } = new List(); } } diff --git a/src/NadekoBot/Services/Database/Models/TypingArticle.cs b/src/NadekoBot/Services/Database/Models/TypingArticle.cs new file mode 100644 index 00000000..508ace03 --- /dev/null +++ b/src/NadekoBot/Services/Database/Models/TypingArticle.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Database.Models +{ + public class TypingArticle : DbEntity + { + public string Author { get; set; } + public string Text { get; set; } + } +} diff --git a/src/NadekoBot/Services/Database/NadekoContext.cs b/src/NadekoBot/Services/Database/NadekoContext.cs index da725a30..db1f1298 100644 --- a/src/NadekoBot/Services/Database/NadekoContext.cs +++ b/src/NadekoBot/Services/Database/NadekoContext.cs @@ -21,6 +21,7 @@ namespace NadekoBot.Services.Database public DbSet Repeaters { get; set; } public DbSet Currency { get; set; } public DbSet ConversionUnits { get; set; } + public DbSet TypingArticles { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { diff --git a/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs b/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs index 70e602f7..82767a80 100644 --- a/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs @@ -11,5 +11,6 @@ namespace NadekoBot.Services.Database.Repositories public interface IGuildConfigRepository : IRepository { GuildConfig For(ulong guildId); + IEnumerable GetAllFollowedStreams(); } } diff --git a/src/NadekoBot/Services/Database/Repositories/ITypingArticlesRepository.cs b/src/NadekoBot/Services/Database/Repositories/ITypingArticlesRepository.cs new file mode 100644 index 00000000..d60dae77 --- /dev/null +++ b/src/NadekoBot/Services/Database/Repositories/ITypingArticlesRepository.cs @@ -0,0 +1,14 @@ +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Database.Repositories +{ + public interface ITypingArticlesRepository : IRepository + { + TypingArticle GetRandom(); + } +} diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs index 13f05404..2bca9cbd 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs @@ -20,7 +20,8 @@ namespace NadekoBot.Services.Database.Repositories.Impl /// public GuildConfig For(ulong guildId) { - var config = _set.FirstOrDefault(c => c.GuildId == guildId); + var config = _set.Include(gc=>gc.FollowedStreams) + .FirstOrDefault(c => c.GuildId == guildId); if (config == null) { @@ -32,5 +33,10 @@ namespace NadekoBot.Services.Database.Repositories.Impl } return config; } + + public IEnumerable GetAllFollowedStreams() => + _set.Include(gc => gc.FollowedStreams) + .SelectMany(gc => gc.FollowedStreams) + .ToList(); } } diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/TypingArticlesRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/TypingArticlesRepository.cs new file mode 100644 index 00000000..5322b990 --- /dev/null +++ b/src/NadekoBot/Services/Database/Repositories/Impl/TypingArticlesRepository.cs @@ -0,0 +1,25 @@ +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; + +namespace NadekoBot.Services.Database.Repositories.Impl +{ + public class TypingArticlesRepository : Repository, ITypingArticlesRepository + { + private Random _rand = null; + private Random rand => _rand ?? (_rand = new Random()); + public TypingArticlesRepository(DbContext context) : base(context) + { + } + + public TypingArticle GetRandom() + { + var skip = (int)(rand.NextDouble() * _set.Count()); + return _set.Skip(skip).FirstOrDefault(); + } + } +} diff --git a/src/NadekoBot/Services/Database/UnitOfWork.cs b/src/NadekoBot/Services/Database/UnitOfWork.cs index 58def7dd..7a4c9520 100644 --- a/src/NadekoBot/Services/Database/UnitOfWork.cs +++ b/src/NadekoBot/Services/Database/UnitOfWork.cs @@ -41,6 +41,9 @@ namespace NadekoBot.Services.Database private IUnitConverterRepository _conUnits; public IUnitConverterRepository ConverterUnits => _conUnits ?? (_conUnits = new UnitConverterRepository(_context)); + private ITypingArticlesRepository _typingArticles; + public ITypingArticlesRepository TypingArticles => _typingArticles ?? (_typingArticles = new TypingArticlesRepository(_context)); + public UnitOfWork(NadekoContext context) { _context = context; diff --git a/src/NadekoBot/_Classes/ServerSpecificConfig.cs b/src/NadekoBot/_Classes/ServerSpecificConfig.cs index 9142e574..46351c82 100644 --- a/src/NadekoBot/_Classes/ServerSpecificConfig.cs +++ b/src/NadekoBot/_Classes/ServerSpecificConfig.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; namespace NadekoBot.Classes { - internal class SpecificConfigurations + public class SpecificConfigurations { public static SpecificConfigurations Default { get; } = new SpecificConfigurations(); public static bool Instantiated { get; private set; } @@ -73,7 +73,7 @@ namespace NadekoBot.Classes } } - internal class ServerSpecificConfig : INotifyPropertyChanged + public class ServerSpecificConfig : INotifyPropertyChanged { [JsonProperty("VoicePlusTextEnabled")] private bool voicePlusTextEnabled; diff --git a/src/NadekoBot/_Models/DataModels/AnnouncementModel.cs b/src/NadekoBot/_Models/DataModels/AnnouncementModel.cs deleted file mode 100644 index c4103dad..00000000 --- a/src/NadekoBot/_Models/DataModels/AnnouncementModel.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Newtonsoft.Json; - -namespace NadekoBot.DataModels -{ - internal class Announcement : IDataModel - { - public long ServerId { get; set; } = 0; - public bool Greet { get; set; } = false; - public bool GreetPM { get; set; } = false; - [JsonProperty("greetChannel")] - public long GreetChannelId { get; set; } = 0; - public string GreetText { get; set; } = "Welcome %user%!"; - public bool Bye { get; set; } = false; - public bool ByePM { get; set; } = false; - [JsonProperty("byeChannel")] - public long ByeChannelId { get; set; } = 0; - public string ByeText { get; set; } = "%user% has left the server."; - public bool DeleteGreetMessages { get; set; } = true; - } -} diff --git a/src/NadekoBot/_Models/DataModels/CommandModel.cs b/src/NadekoBot/_Models/DataModels/CommandModel.cs deleted file mode 100644 index 204ec061..00000000 --- a/src/NadekoBot/_Models/DataModels/CommandModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace NadekoBot.DataModels { - internal class Command : IDataModel { - public long UserId { get; set; } - public string UserName { get; set; } - public long ServerId { get; set; } - public string ServerName { get; set; } - public long ChannelId { get; set; } - public string ChannelName { get; set; } - public string CommandName { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/CurrencyStateModel.cs b/src/NadekoBot/_Models/DataModels/CurrencyStateModel.cs deleted file mode 100644 index 9c8b8671..00000000 --- a/src/NadekoBot/_Models/DataModels/CurrencyStateModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace NadekoBot.DataModels { - internal class CurrencyState : IDataModel { - public long Value { get; set; } - [SQLite.Unique] - public long UserId { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/CurrencyTransactionModel.cs b/src/NadekoBot/_Models/DataModels/CurrencyTransactionModel.cs deleted file mode 100644 index 51fcccc3..00000000 --- a/src/NadekoBot/_Models/DataModels/CurrencyTransactionModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace NadekoBot.DataModels { - internal class CurrencyTransaction : IDataModel { - public string Reason { get; set; } - public int Value { get; set; } - public long UserId { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/Donator.cs b/src/NadekoBot/_Models/DataModels/Donator.cs deleted file mode 100644 index 483898ec..00000000 --- a/src/NadekoBot/_Models/DataModels/Donator.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace NadekoBot.DataModels { - internal class Donator : IDataModel { - public long UserId { get; set; } - public string UserName { get; set; } - public int Amount { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/IDataModel.cs b/src/NadekoBot/_Models/DataModels/IDataModel.cs deleted file mode 100644 index 90191474..00000000 --- a/src/NadekoBot/_Models/DataModels/IDataModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -using SQLite; -using System; - -namespace NadekoBot.DataModels -{ - internal abstract class IDataModel - { - [PrimaryKey, AutoIncrement] - public int? Id { get; set; } - [Newtonsoft.Json.JsonProperty("createdAt")] - public DateTime DateAdded { get; set; } = DateTime.Now; - public IDataModel() { } - } -} diff --git a/src/NadekoBot/_Models/DataModels/Incident.cs b/src/NadekoBot/_Models/DataModels/Incident.cs deleted file mode 100644 index 2ce2ddd6..00000000 --- a/src/NadekoBot/_Models/DataModels/Incident.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace NadekoBot.DataModels -{ - class Incident : IDataModel - { - public long ServerId { get; set; } - public long ChannelId { get; set; } - public string Text { get; set; } - public bool Read { get; set; } = false; - } -} diff --git a/src/NadekoBot/_Models/DataModels/MusicPlaylist.cs b/src/NadekoBot/_Models/DataModels/MusicPlaylist.cs deleted file mode 100644 index 60973baa..00000000 --- a/src/NadekoBot/_Models/DataModels/MusicPlaylist.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace NadekoBot.DataModels -{ - internal class MusicPlaylist : IDataModel - { - public string Name { get; set; } - public long CreatorId { get; set; } - public string CreatorName { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/PlaylistSongInfo.cs b/src/NadekoBot/_Models/DataModels/PlaylistSongInfo.cs deleted file mode 100644 index 84929781..00000000 --- a/src/NadekoBot/_Models/DataModels/PlaylistSongInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace NadekoBot.DataModels -{ - internal class PlaylistSongInfo : IDataModel - { - public int PlaylistId { get; set; } - public int SongInfoId { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/PokeTypes.cs b/src/NadekoBot/_Models/DataModels/PokeTypes.cs deleted file mode 100644 index d0f538af..00000000 --- a/src/NadekoBot/_Models/DataModels/PokeTypes.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NadekoBot.DataModels -{ - class UserPokeTypes : IDataModel - { - public long UserId { get; set; } - public string type { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/RequestModel.cs b/src/NadekoBot/_Models/DataModels/RequestModel.cs deleted file mode 100644 index 7b86198f..00000000 --- a/src/NadekoBot/_Models/DataModels/RequestModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace NadekoBot.DataModels { - internal class Request : IDataModel { - public string UserName { get; set; } - public long UserId { get; set; } - public string ServerName { get; set; } - public long ServerId { get; set; } - [Newtonsoft.Json.JsonProperty("Request")] - public string RequestText { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/SongInfo.cs b/src/NadekoBot/_Models/DataModels/SongInfo.cs deleted file mode 100644 index 6fe980ac..00000000 --- a/src/NadekoBot/_Models/DataModels/SongInfo.cs +++ /dev/null @@ -1,14 +0,0 @@ -using SQLite; - -namespace NadekoBot.DataModels -{ - internal class SongInfo : IDataModel - { - public string Provider { get; internal set; } - public int ProviderType { get; internal set; } - public string Title { get; internal set; } - public string Uri { get; internal set; } - [Unique] - public string Query { get; internal set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/StatsModel.cs b/src/NadekoBot/_Models/DataModels/StatsModel.cs deleted file mode 100644 index 480b569f..00000000 --- a/src/NadekoBot/_Models/DataModels/StatsModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace NadekoBot.DataModels { - internal class Stats : IDataModel { - public int ConnectedServers { get; set; } - public int OnlineUsers { get; set; } - public TimeSpan Uptime { get; set; } - public int RealOnlineUsers { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/TestDataModel.cs b/src/NadekoBot/_Models/DataModels/TestDataModel.cs deleted file mode 100644 index 247743ca..00000000 --- a/src/NadekoBot/_Models/DataModels/TestDataModel.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace NadekoBot.DataModels -{ - internal class TestDataModel : IDataModel - { - public long TestNumber { get; set; } - public string TestString { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/TypingArticleModel.cs b/src/NadekoBot/_Models/DataModels/TypingArticleModel.cs deleted file mode 100644 index 2557a51c..00000000 --- a/src/NadekoBot/_Models/DataModels/TypingArticleModel.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace NadekoBot.DataModels { - internal class TypingArticle : IDataModel { - public string Text { get; set; } - } -} diff --git a/src/NadekoBot/_Models/DataModels/UserQuoteModel.cs b/src/NadekoBot/_Models/DataModels/UserQuoteModel.cs deleted file mode 100644 index 544252cc..00000000 --- a/src/NadekoBot/_Models/DataModels/UserQuoteModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace NadekoBot.DataModels { - internal class UserQuote : IDataModel { - public string UserName { get; set; } - public string Keyword { get; set; } - public string Text { get; set; } - } -} diff --git a/src/NadekoBot/_Models/JSONModels/Configuration.cs b/src/NadekoBot/_Models/JSONModels/Configuration.cs deleted file mode 100644 index 04a4895e..00000000 --- a/src/NadekoBot/_Models/JSONModels/Configuration.cs +++ /dev/null @@ -1,246 +0,0 @@ -using Discord; -using NadekoBot.Extensions; -using Newtonsoft.Json; -using System.Collections.Generic; -using System.IO; -using System.Runtime.Serialization; -using System.Threading; -using System.Threading.Tasks; - -namespace NadekoBot.Classes.JSONModels -{ - public class Configuration - { - [JsonIgnore] - public static readonly Dictionary> DefaultCustomReactions = new Dictionary> - { - {@"\o\", new List() - { "/o/" } }, - {"/o/", new List() - { @"\o\" } }, - {"moveto", new List() { - @"(👉 ͡° ͜ʖ ͡°)👉 %target%" } }, - {"comeatmebro", new List() { - "%target% (ง’̀-‘́)ง" } }, - {"e", new List() { - "%user% did it 😒 🔫", - "%target% did it 😒 🔫" } }, - {"%mention% insult", new List() { - "%target% You are a poop.", - "%target% You're a jerk.", - "%target% I will eat you when I get my powers back." - } }, - {"%mention% praise", new List() - { - "%target% You are cool.", - "%target% You are nice!", - "%target% You did a good job.", - "%target% You did something nice.", - "%target% is awesome!", - "%target% Wow." - } }, - {"%mention% pat", new List() { - "http://i.imgur.com/IiQwK12.gif", - "http://i.imgur.com/JCXj8yD.gif", - "http://i.imgur.com/qqBl2bm.gif", - "http://i.imgur.com/eOJlnwP.gif", - "https://45.media.tumblr.com/229ec0458891c4dcd847545c81e760a5/tumblr_mpfy232F4j1rxrpjzo1_r2_500.gif", - "https://media.giphy.com/media/KZQlfylo73AMU/giphy.gif", - "https://media.giphy.com/media/12hvLuZ7uzvCvK/giphy.gif", - "http://gallery1.anivide.com/_full/65030_1382582341.gif", - "https://49.media.tumblr.com/8e8a099c4eba22abd3ec0f70fd087cce/tumblr_nxovj9oY861ur1mffo1_500.gif ", - } }, - {"%mention% cry", new List() - { - "http://i.imgur.com/Xg3i1Qy.gif", - "http://i.imgur.com/3K8DRrU.gif", - "http://i.imgur.com/k58BcAv.gif", - "http://i.imgur.com/I2fLXwo.gif" - } }, - {"%mention% are you real?", new List() - { - "%user%, I will be soon." - } }, - {"%mention% are you there?", new List() - { - "Yes. :)" - } }, - {"%mention% draw", new List() { - "Sorry, I don't gamble, type $draw for that function." - } }, - {"%mention% bb", new List() - { - "Bye %target%" - } }, - {"%mention% call", new List() { - "Calling %target%" - } }, - {"%mention% disguise", new List() { - "https://cdn.discordapp.com/attachments/140007341880901632/156721710458994690/Cc5mixjUYAADgBs.jpg", - "https://cdn.discordapp.com/attachments/140007341880901632/156721715831898113/hqdefault.jpg", - "https://cdn.discordapp.com/attachments/140007341880901632/156721724430352385/okawari_01_haruka_weird_mask.jpg", - "https://cdn.discordapp.com/attachments/140007341880901632/156721728763068417/mustache-best-girl.png" - - } }, - {"%mention% inv", new List() { - "To invite your bot, click on this link -> " - } }, - { "%mention% threaten", new List() { - "You wanna die, %target%?" - } }, - { "%mention% archer", new List() { - "http://i.imgur.com/Bha9NhL.jpg" - } } - }; - - public bool DontJoinServers { get; set; } = false; - public bool ForwardMessages { get; set; } = true; - public bool ForwardToAllOwners { get; set; } = false; - public bool IsRotatingStatus { get; set; } = false; - public int BufferSize { get; set; } = 4.MiB(); - - public string[] RaceAnimals { get; internal set; } = { - "🐼", - "🐻", - "🐧", - "🐨", - "🐬", - "🐞", - "🦀", - "🦄" }; - - [JsonIgnore] - public List Quotes { get; set; } = new List(); - - [JsonIgnore] - public List PokemonTypes { get; set; } = new List(); - - public string RemindMessageFormat { get; set; } = "❗⏰**I've been told to remind you to '%message%' now by %user%.**⏰❗"; - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] - public Dictionary> CustomReactions { get; set; } - - public List RotatingStatuses { get; set; } = new List(); - public CommandPrefixesModel CommandPrefixes { get; set; } = new CommandPrefixesModel(); - public HashSet ServerBlacklist { get; set; } = new HashSet(); - public HashSet ChannelBlacklist { get; set; } = new HashSet(); - - public HashSet UserBlacklist { get; set; } = new HashSet() { - 105309315895693312, - 119174277298782216, - 143515953525817344 - }; - - [OnDeserialized] - internal void OnDeserialized(StreamingContext context) - { - if (CustomReactions == null) - { - CustomReactions = DefaultCustomReactions; - } - } - [OnSerializing] - internal void OnSerializing(StreamingContext context) - { - if (CustomReactions == null) - { - CustomReactions = DefaultCustomReactions; - } - } - - public string[] _8BallResponses { get; set; } = - { - "Most definitely yes", - "For sure", - "As I see it, yes", - "My sources say yes", - "Yes", - "Most likely", - "Perhaps", - "Maybe", - "Not sure", - "It is uncertain", - "Ask me again later", - "Don't count on it", - "Probably not", - "Very doubtful", - "Most likely no", - "Nope", - "No", - "My sources say no", - "Dont even think about it", - "Definitely no", - "NO - It may cause disease contraction" - }; - - public string CurrencySign { get; set; } = "🌸"; - public string CurrencyName { get; set; } = "NadekoFlower"; - public string DMHelpString { get; set; } = "Type `-h` for help."; - public string HelpString { get; set; } = @"You can use `{0}modules` command to see a list of all modules. -You can use `{0}commands ModuleName` -(for example `{0}commands Administration`) to see a list of all of the commands in that module. -For a specific command help, use `{0}h ""Command name""` (for example `-h ""!m q""`) - - -**LIST OF COMMANDS CAN BE FOUND ON THIS LINK** - - - -Nadeko Support Server: "; - } - - public class CommandPrefixesModel - { - public string Administration { get; set; } = "."; - public string Searches { get; set; } = "~"; - public string NSFW { get; set; } = "~"; - public string Conversations { get; set; } = "<@{0}>"; - public string ClashOfClans { get; set; } = ","; - public string Help { get; set; } = "-"; - public string Music { get; set; } = "!!"; - public string Trello { get; set; } = "trello "; - public string Games { get; set; } = ">"; - public string Gambling { get; set; } = "$"; - public string Permissions { get; set; } = ";"; - public string Programming { get; set; } = "%"; - public string Pokemon { get; set; } = ">"; - public string Utility { get; set; } = "."; - } - - public static class ConfigHandler - { - private static readonly SemaphoreSlim configLock = new SemaphoreSlim(1, 1); - public static async Task SaveConfig() - { - await configLock.WaitAsync(); - try - { - File.WriteAllText("data/config.json", JsonConvert.SerializeObject(NadekoBot.Config, Formatting.Indented)); - } - finally - { - configLock.Release(); - } - } - - public static bool IsBlackListed(MessageEventArgs evArgs) => IsUserBlacklisted(evArgs.User.Id) || - (!evArgs.Channel.IsPrivate && - (IsChannelBlacklisted(evArgs.Channel.Id) || IsServerBlacklisted(evArgs.Server.Id))); - - public static bool IsServerBlacklisted(ulong id) => NadekoBot.Config.ServerBlacklist.Contains(id); - - public static bool IsChannelBlacklisted(ulong id) => NadekoBot.Config.ChannelBlacklist.Contains(id); - - public static bool IsUserBlacklisted(ulong id) => NadekoBot.Config.UserBlacklist.Contains(id); - } - - public class Quote - { - public string Author { get; set; } - public string Text { get; set; } - - public override string ToString() => - $"{Text}\n\t*-{Author}*"; - } - -} diff --git a/src/NadekoBot/_Models/JSONModels/LocalizedStrings.cs b/src/NadekoBot/_Models/JSONModels/LocalizedStrings.cs deleted file mode 100644 index 861ebb69..00000000 --- a/src/NadekoBot/_Models/JSONModels/LocalizedStrings.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.IO; - -namespace NadekoBot.Classes.JSONModels { - public class LocalizedStrings { - public string[] Insults { get; set; } = { - " You are a poop.", " You're a jerk.", - " I will eat you when I get my powers back." - }; - - public string[] Praises { get; set; } = { - " You are cool.", - " You are nice!", - " You did a good job.", - " You did something nice.", - " is awesome!", - " Wow." - }; - - public static string[] GetAvailableLocales() { - Directory.CreateDirectory("data/locales"); - return Directory.GetFiles("data/locales"); - } - - //public static void HandleLocalization() { - // var locales = LocalizedStrings.GetAvailableLocales(); - - - // Console.WriteLine("Pick a language:\n" + - // "1. English"); - // for (var i = 0; i < locales.Length; i++) { - // Console.WriteLine((i + 2) + ". " + Path.GetFileNameWithoutExtension(locales[i])); - // } - // File.WriteAllText("data/locales/english.json", JsonConvert.SerializeObject(new LocalizedStrings(), Formatting.Indented)); - // try { - // Console.WriteLine($"Type in a number from {1} to {locales.Length + 1}\n"); - // var input = Console.ReadLine(); - // if (input != "1") - // Locale = LocalizedStrings.LoadLocale(locales[int.Parse(input) - 2]); - // } catch (Exception ex) { - // Console.ForegroundColor = ConsoleColor.Red; - // Console.WriteLine(ex); - // Console.ReadKey(); - // return; - // } - //} - - public static LocalizedStrings LoadLocale(string localeFile) => - Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(localeFile)); - } -} diff --git a/src/NadekoBot/_Models/JSONModels/MagicItem.cs b/src/NadekoBot/_Models/JSONModels/MagicItem.cs deleted file mode 100644 index 1ef3db1b..00000000 --- a/src/NadekoBot/_Models/JSONModels/MagicItem.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NadekoBot.Classes.JSONModels -{ - class MagicItem - { - public string Name { get; set; } - public string Description { get; set; } - public override string ToString() => - $"✨`{Name}`\n\t*{Description}*"; - } -} diff --git a/src/NadekoBot/_Models/JSONModels/PokemonType.cs b/src/NadekoBot/_Models/JSONModels/PokemonType.cs deleted file mode 100644 index 02e50e2f..00000000 --- a/src/NadekoBot/_Models/JSONModels/PokemonType.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NadekoBot.Classes.JSONModels -{ - public class PokemonType - { - public PokemonType(string n, string i, string[] m, List multi) - { - Name = n; - Icon = i; - Moves = m; - Multipliers = multi; - } - public string Name { get; set; } - public List Multipliers { get; set; } - public string Icon { get; set; } - public string[] Moves { get; set; } - } - public class PokemonMultiplier - { - public PokemonMultiplier(string t, double m) - { - Type = t; - Multiplication = m; - } - public string Type { get; set; } - public double Multiplication { get; set; } - } -} diff --git a/src/NadekoBot/_Models/JSONModels/_JSONModels.cs b/src/NadekoBot/_Models/JSONModels/_JSONModels.cs deleted file mode 100644 index c60d32d8..00000000 --- a/src/NadekoBot/_Models/JSONModels/_JSONModels.cs +++ /dev/null @@ -1,155 +0,0 @@ -// ReSharper disable InconsistentNaming - -using System.Diagnostics; - -namespace NadekoBot.Classes.JSONModels -{ - public class Credentials - { - public string Token { get; set; } = ""; - public string ClientId { get; set; } = "170254782546575360"; - public ulong BotId { get; set; } = 1231231231231; - public ulong[] OwnerIds { get; set; } = { 123123123123, 5675675679845 }; - public string GoogleAPIKey { get; set; } = ""; - public string SoundCloudClientID { get; set; } = ""; - public string MashapeKey { get; set; } = ""; - public string LOLAPIKey { get; set; } = ""; - public string TrelloAppKey { get; set; } = ""; - public string CarbonKey { get; set; } = ""; - public string OsuAPIKey { get; set; } = ""; - } - [DebuggerDisplay("{items[0].id.playlistId}")] - public class YoutubePlaylistSearch - { - public YtPlaylistItem[] items { get; set; } - } - public class YtPlaylistItem - { - public YtPlaylistId id { get; set; } - } - public class YtPlaylistId - { - public string kind { get; set; } - public string playlistId { get; set; } - } - [DebuggerDisplay("{items[0].id.videoId}")] - public class YoutubeVideoSearch - { - public YtVideoItem[] items { get; set; } - } - public class YtVideoItem - { - public YtVideoId id { get; set; } - } - public class YtVideoId - { - public string kind { get; set; } - public string videoId { get; set; } - } - public class PlaylistItemsSearch - { - public string nextPageToken { get; set; } - public PlaylistItem[] items { get; set; } - } - public class PlaylistItem - { - public YtVideoId contentDetails { get; set; } - } - - #region wikpedia example - // { - // "batchcomplete": true, - // "query": { - // "normalized": [ - // { - // "from": "u3fn92fb32f9yb329f32", - // "to": "U3fn92fb32f9yb329f32" - // } - // ], - // "pages": [ - // { - // "ns": 0, - // "title": "U3fn92fb32f9yb329f32", - // "missing": true, - // "contentmodel": "wikitext", - // "pagelanguage": "en", - // "pagelanguagehtmlcode": "en", - // "pagelanguagedir": "ltr", - // "fullurl": "https://en.wikipedia.org/wiki/U3fn92fb32f9yb329f32", - // "editurl": "https://en.wikipedia.org/w/index.php?title=U3fn92fb32f9yb329f32&action=edit", - // "canonicalurl": "https://en.wikipedia.org/wiki/U3fn92fb32f9yb329f32" - // } - // ] - // } - //} - #endregion - - public class WikipediaApiModel - { - public WikipediaQuery Query { get; set; } - } - - public class WikipediaQuery - { - public WikipediaPage[] Pages { get; set; } - } - - public class WikipediaPage - { - public bool Missing { get; set; } = false; - public string FullUrl { get; set; } - } - - public class WoWJoke - { - public string Question { get; set; } - public string Answer { get; set; } - public override string ToString() => $"`{Question}`\n\n**{Answer}**"; - } -} - -//{ -// "kind": "youtube#searchListResponse", -// "etag": "\"kiOs9cZLH2FUp6r6KJ8eyq_LIOk/hCJTmyH_v57mh_MvnUFSTHfjzBs\"", -// "nextPageToken": "CAEQAA", -// "regionCode": "RS", -// "pageInfo": { -// "totalResults": 4603, -// "resultsPerPage": 1 -// }, -// "items": [ -// { -// "kind": "youtube#searchResult", -// "etag": "\"kiOs9cZLH2FUp6r6KJ8eyq_LIOk/iD1S35mk0xOfwTB_8lpPZ9u-Vzc\"", -// "id": { -// "kind": "youtube#playlist", -// "playlistId": "PLs_KC2CCxJVMfOBnIyW5Kbu_GciNiYNAI" -// }, -// "snippet": { -// "publishedAt": "2016-04-14T11:35:29.000Z", -// "channelId": "UCMLwm18Qa20L2L-HGpgC3jQ", -// "title": "Popular Videos - Otorimonogatari & mousou express", -// "description": "", -// "thumbnails": { -// "default": { -// "url": "https://i.ytimg.com/vi/2FeptLky2mU/default.jpg", -// "width": 120, -// "height": 90 -// }, -// "medium": { -// "url": "https://i.ytimg.com/vi/2FeptLky2mU/mqdefault.jpg", -// "width": 320, -// "height": 180 -// }, -// "high": { -// "url": "https://i.ytimg.com/vi/2FeptLky2mU/hqdefault.jpg", -// "width": 480, -// "height": 360 -// } -// }, -// "channelTitle": "Otorimonogatari - Topic", -// "liveBroadcastContent": "none" -// } -// } -// ] -//} \ No newline at end of file diff --git a/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs b/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs index 920675b4..8e9aa652 100644 --- a/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs +++ b/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs @@ -9,7 +9,7 @@ using System.Text.RegularExpressions; namespace NadekoBot.Modules.CustomReactions { - internal class CustomReactionsModule : DiscordModule + public class CustomReactionsModule : DiscordModule { public override string Prefix { get; } = ""; diff --git a/src/NadekoBot/_Modules/DiscordCommand.cs b/src/NadekoBot/_Modules/DiscordCommand.cs index 05f9a42a..39637e1b 100644 --- a/src/NadekoBot/_Modules/DiscordCommand.cs +++ b/src/NadekoBot/_Modules/DiscordCommand.cs @@ -34,6 +34,6 @@ namespace NadekoBot.Classes /// /// Initializes the CommandBuilder with values using CommandGroupBuilder /// - internal abstract void Init(CommandGroupBuilder cgb); + public abstract void Init(CommandGroupBuilder cgb); } } diff --git a/src/NadekoBot/_Modules/Permissions/Classes/PermissionChecker.cs b/src/NadekoBot/_Modules/Permissions/Classes/PermissionChecker.cs index cf658aad..6c1fcd89 100644 --- a/src/NadekoBot/_Modules/Permissions/Classes/PermissionChecker.cs +++ b/src/NadekoBot/_Modules/Permissions/Classes/PermissionChecker.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace NadekoBot.Modules.Permissions.Classes { - internal class PermissionChecker : IPermissionChecker + public class PermissionChecker : IPermissionChecker { public static PermissionChecker Instance { get; } = new PermissionChecker(); diff --git a/src/NadekoBot/_Modules/Permissions/Classes/PermissionHelper.cs b/src/NadekoBot/_Modules/Permissions/Classes/PermissionHelper.cs index c972953e..e17801d9 100644 --- a/src/NadekoBot/_Modules/Permissions/Classes/PermissionHelper.cs +++ b/src/NadekoBot/_Modules/Permissions/Classes/PermissionHelper.cs @@ -6,7 +6,7 @@ using System.Linq; namespace NadekoBot.Modules.Permissions.Classes { - internal static class PermissionHelper + public static class PermissionHelper { public static bool ValidateBool(string passedArg) { @@ -37,7 +37,7 @@ namespace NadekoBot.Modules.Permissions.Classes } } - internal static string ValidateModule(string mod) + public static string ValidateModule(string mod) { if (string.IsNullOrWhiteSpace(mod)) throw new ArgumentNullException(nameof(mod)); @@ -50,7 +50,7 @@ namespace NadekoBot.Modules.Permissions.Classes throw new ArgumentException("That module does not exist."); } - internal static string ValidateCommand(string commandText) + public static string ValidateCommand(string commandText) { if (string.IsNullOrWhiteSpace(commandText)) throw new ArgumentNullException(nameof(commandText)); @@ -65,7 +65,7 @@ namespace NadekoBot.Modules.Permissions.Classes throw new NullReferenceException("That command does not exist."); } - internal static Role ValidateRole(Server server, string roleName) + public static Role ValidateRole(Server server, string roleName) { if (string.IsNullOrWhiteSpace(roleName)) throw new ArgumentNullException(nameof(roleName)); @@ -78,7 +78,7 @@ namespace NadekoBot.Modules.Permissions.Classes return role; } - internal static Channel ValidateChannel(Server server, string channelName) + public static Channel ValidateChannel(Server server, string channelName) { if (string.IsNullOrWhiteSpace(channelName)) throw new ArgumentNullException(nameof(channelName)); @@ -88,7 +88,7 @@ namespace NadekoBot.Modules.Permissions.Classes return channel; } - internal static User ValidateUser(Server server, string userName) + public static User ValidateUser(Server server, string userName) { if (string.IsNullOrWhiteSpace(userName)) throw new ArgumentNullException(nameof(userName)); diff --git a/src/NadekoBot/_Modules/Permissions/Classes/PermissionsHandler.cs b/src/NadekoBot/_Modules/Permissions/Classes/PermissionsHandler.cs index 6839b276..29ebeb20 100644 --- a/src/NadekoBot/_Modules/Permissions/Classes/PermissionsHandler.cs +++ b/src/NadekoBot/_Modules/Permissions/Classes/PermissionsHandler.cs @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Permissions.Classes Console.WriteLine("Permission initialization complete."); } - internal static Permissions GetRolePermissionsById(Server server, ulong id) + public static Permissions GetRolePermissionsById(Server server, ulong id) { ServerPermissions serverPerms; if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) @@ -52,7 +52,7 @@ namespace NadekoBot.Modules.Permissions.Classes return toReturn; } - internal static Permissions GetUserPermissionsById(Server server, ulong id) + public static Permissions GetUserPermissionsById(Server server, ulong id) { ServerPermissions serverPerms; if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) @@ -63,7 +63,7 @@ namespace NadekoBot.Modules.Permissions.Classes return toReturn; } - internal static Permissions GetChannelPermissionsById(Server server, ulong id) + public static Permissions GetChannelPermissionsById(Server server, ulong id) { ServerPermissions serverPerms; if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) @@ -74,13 +74,13 @@ namespace NadekoBot.Modules.Permissions.Classes return toReturn; } - internal static Permissions GetServerPermissions(Server server) + public static Permissions GetServerPermissions(Server server) { ServerPermissions serverPerms; return !PermissionsDict.TryGetValue(server.Id, out serverPerms) ? null : serverPerms.Permissions; } - internal static PermissionBanType GetPermissionBanType(Command command, User user, Channel channel) + public static PermissionBanType GetPermissionBanType(Command command, User user, Channel channel) { var server = user.Server; ServerPermissions serverPerms = PermissionsDict.GetOrAdd(server.Id, id => new ServerPermissions(id, server.Name)); @@ -174,7 +174,7 @@ namespace NadekoBot.Modules.Permissions.Classes return serverPerms.PermissionsControllerRole; } - internal static async Task SetPermissionsRole(Server server, string roleName) + public static async Task SetPermissionsRole(Server server, string roleName) { var serverPerms = PermissionsDict.GetOrAdd(server.Id, new ServerPermissions(server.Id, server.Name)); @@ -183,7 +183,7 @@ namespace NadekoBot.Modules.Permissions.Classes await WriteServerToJson(serverPerms).ConfigureAwait(false); } - internal static async Task SetVerbosity(Server server, bool val) + public static async Task SetVerbosity(Server server, bool val) { var serverPerms = PermissionsDict.GetOrAdd(server.Id, new ServerPermissions(server.Id, server.Name)); @@ -192,7 +192,7 @@ namespace NadekoBot.Modules.Permissions.Classes await WriteServerToJson(serverPerms).ConfigureAwait(false); } - internal static async Task CopyRolePermissions(Role fromRole, Role toRole) + public static async Task CopyRolePermissions(Role fromRole, Role toRole) { var server = fromRole.Server; var serverPerms = PermissionsDict.GetOrAdd(server.Id, @@ -210,7 +210,7 @@ namespace NadekoBot.Modules.Permissions.Classes await WriteServerToJson(serverPerms).ConfigureAwait(false); } - internal static async Task CopyChannelPermissions(Channel fromChannel, Channel toChannel) + public static async Task CopyChannelPermissions(Channel fromChannel, Channel toChannel) { var server = fromChannel.Server; var serverPerms = PermissionsDict.GetOrAdd(server.Id, @@ -228,7 +228,7 @@ namespace NadekoBot.Modules.Permissions.Classes await WriteServerToJson(serverPerms).ConfigureAwait(false); } - internal static async Task CopyUserPermissions(User fromUser, User toUser) + public static async Task CopyUserPermissions(User fromUser, User toUser) { var server = fromUser.Server; var serverPerms = PermissionsDict.GetOrAdd(server.Id, diff --git a/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs b/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs index 7b9b1dc1..0eb94cec 100644 --- a/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs +++ b/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs @@ -7,7 +7,7 @@ using System.Text.RegularExpressions; namespace NadekoBot.Modules.Permissions { - internal class FilterInvitesCommand : DiscordCommand + public class FilterInvitesCommand : DiscordCommand { private readonly Regex filterRegex = new Regex(@"(?:discord(?:\.gg|app\.com\/invite)\/(?([\w]{16}|(?:[\w]+-?){3})))"); @@ -49,7 +49,7 @@ namespace NadekoBot.Modules.Permissions return serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perms) && perms.FilterInvites; } - internal override void Init(CommandGroupBuilder cgb) + public override void Init(CommandGroupBuilder cgb) { cgb.CreateCommand(Module.Prefix + "chnlfilterinv") .Alias(Module.Prefix + "cfi") diff --git a/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs b/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs index 781faa93..2c0c3cdf 100644 --- a/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs +++ b/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs @@ -7,7 +7,7 @@ using System.Linq; namespace NadekoBot.Modules.Permissions { - internal class FilterWords : DiscordCommand + public class FilterWords : DiscordCommand { public FilterWords(DiscordModule module) : base(module) { @@ -47,7 +47,7 @@ namespace NadekoBot.Modules.Permissions return serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perms) && perms.FilterWords; } - internal override void Init(CommandGroupBuilder cgb) + public override void Init(CommandGroupBuilder cgb) { cgb.CreateCommand(Module.Prefix + "chnlfilterwords") .Alias(Module.Prefix + "cfw") diff --git a/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs b/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs index 69d70eac..b9d6dc38 100644 --- a/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs +++ b/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; namespace NadekoBot.Modules.Permissions { - internal class PermissionModule : DiscordModule + public class PermissionModule : DiscordModule { public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.Permissions;