Merge remote-tracking branch 'refs/remotes/Kwoth/1.0' into unitconversion

# Conflicts:
#	src/NadekoBot/Services/Database/NadekoContext.cs
This commit is contained in:
appelemac 2016-09-04 15:16:38 +02:00
commit 671fb47da5
102 changed files with 2266 additions and 2195 deletions

View File

@ -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())
{
}
}
}

View File

@ -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])
{
}

View File

@ -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<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("ChannelId");
b.Property<int?>("GuildConfigId");
b.Property<ulong>("GuildId");
b.Property<bool>("LastStatus");
b.Property<int>("Type");
b.Property<string>("Username");
b.HasKey("Id");
b.HasIndex("GuildConfigId");
b.ToTable("FollowedStream");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b =>
{
b.Property<int>("Id")
@ -195,6 +219,8 @@ namespace NadekoBot.Migrations
b.Property<bool>("SendDmGreetMessage");
b.Property<bool>("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")

View File

@ -98,7 +98,8 @@ namespace NadekoBot.Migrations
GuildId = table.Column<ulong>(nullable: false),
SendChannelByeMessage = table.Column<bool>(nullable: false),
SendChannelGreetMessage = table.Column<bool>(nullable: false),
SendDmGreetMessage = table.Column<bool>(nullable: false)
SendDmGreetMessage = table.Column<bool>(nullable: false),
VoicePlusTextEnabled = table.Column<bool>(nullable: false)
},
constraints: table =>
{
@ -295,6 +296,30 @@ namespace NadekoBot.Migrations
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "FollowedStream",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Autoincrement", true),
ChannelId = table.Column<ulong>(nullable: false),
GuildConfigId = table.Column<int>(nullable: true),
GuildId = table.Column<ulong>(nullable: false),
LastStatus = table.Column<bool>(nullable: false),
Type = table.Column<int>(nullable: false),
Username = table.Column<string>(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");
}

View File

@ -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<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int?>("BotConfigId");
b.Property<ulong>("ItemId");
b.HasKey("Id");
b.HasIndex("BotConfigId");
b.ToTable("BlacklistItem");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("BufferSize");
b.Property<string>("CurrencyName");
b.Property<string>("CurrencyPluralName");
b.Property<string>("CurrencySign");
b.Property<bool>("DontJoinServers");
b.Property<bool>("ForwardMessages");
b.Property<bool>("ForwardToAllOwners");
b.Property<string>("RemindMessageFormat");
b.Property<bool>("RotatingStatuses");
b.HasKey("Id");
b.ToTable("BotConfig");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<bool>("BaseDestroyed");
b.Property<string>("CallUser");
b.Property<int>("ClashWarId");
b.Property<int>("Stars");
b.Property<DateTime>("TimeAdded");
b.HasKey("Id");
b.HasIndex("ClashWarId");
b.ToTable("ClashCallers");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashWar", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("ChannelId");
b.Property<string>("EnemyClan");
b.Property<ulong>("GuildId");
b.Property<int>("Size");
b.Property<DateTime>("StartedAt");
b.Property<int>("WarState");
b.HasKey("Id");
b.ToTable("ClashOfClans");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.Currency", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<long>("Amount");
b.Property<ulong>("UserId");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("Currency");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int>("Amount");
b.Property<string>("Name");
b.Property<ulong>("UserId");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("Donators");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int?>("BotConfigId");
b.Property<string>("Text");
b.HasKey("Id");
b.HasIndex("BotConfigId");
b.ToTable("EightBallResponse");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("ChannelId");
b.Property<int?>("GuildConfigId");
b.Property<ulong>("GuildId");
b.Property<bool>("LastStatus");
b.Property<int>("Type");
b.Property<string>("Username");
b.HasKey("Id");
b.HasIndex("GuildConfigId");
b.ToTable("FollowedStream");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("AutoAssignRoleId");
b.Property<bool>("AutoDeleteByeMessages");
b.Property<bool>("AutoDeleteGreetMessages");
b.Property<int>("AutoDeleteGreetMessagesTimer");
b.Property<bool>("AutoDeleteSelfAssignedRoleMessages");
b.Property<ulong>("ByeMessageChannelId");
b.Property<string>("ChannelByeMessageText");
b.Property<string>("ChannelGreetMessageText");
b.Property<float>("DefaultMusicVolume");
b.Property<bool>("DeleteMessageOnCommand");
b.Property<string>("DmGreetMessageText");
b.Property<bool>("ExclusiveSelfAssignedRoles");
b.Property<ulong>("GreetMessageChannelId");
b.Property<ulong>("GuildId");
b.Property<bool>("SendChannelByeMessage");
b.Property<bool>("SendChannelGreetMessage");
b.Property<bool>("SendDmGreetMessage");
b.Property<bool>("VoicePlusTextEnabled");
b.HasKey("Id");
b.HasIndex("GuildId")
.IsUnique();
b.ToTable("GuildConfigs");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int?>("BotConfigId");
b.Property<string>("ModuleName");
b.Property<string>("Prefix");
b.HasKey("Id");
b.HasIndex("BotConfigId");
b.ToTable("ModulePrefix");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int?>("BotConfigId");
b.Property<string>("Status");
b.HasKey("Id");
b.HasIndex("BotConfigId");
b.ToTable("PlayingStatus");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("AuthorId");
b.Property<string>("AuthorName")
.IsRequired();
b.Property<ulong>("GuildId");
b.Property<string>("Keyword")
.IsRequired();
b.Property<string>("Text")
.IsRequired();
b.HasKey("Id");
b.ToTable("Quotes");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int?>("BotConfigId");
b.Property<string>("Icon");
b.Property<string>("Name");
b.HasKey("Id");
b.HasIndex("BotConfigId");
b.ToTable("RaceAnimal");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("ChannelId");
b.Property<bool>("IsPrivate");
b.Property<string>("Message");
b.Property<ulong>("ServerId");
b.Property<ulong>("UserId");
b.Property<DateTime>("When");
b.HasKey("Id");
b.ToTable("Reminders");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.Repeater", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("ChannelId");
b.Property<ulong>("GuildId");
b.Property<TimeSpan>("Interval");
b.Property<string>("Message");
b.HasKey("Id");
b.HasIndex("ChannelId")
.IsUnique();
b.ToTable("Repeaters");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("GuildId");
b.Property<ulong>("RoleId");
b.HasKey("Id");
b.HasIndex("GuildId", "RoleId")
.IsUnique();
b.ToTable("SelfAssignableRoles");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.TypingArticle", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<string>("Author");
b.Property<string>("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");
});
}
}
}

View File

@ -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<int>(nullable: false)
.Annotation("Autoincrement", true),
Author = table.Column<string>(nullable: true),
Text = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_TypingArticles", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "TypingArticles");
}
}
}

View File

@ -155,6 +155,30 @@ namespace NadekoBot.Migrations
b.ToTable("EightBallResponse");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("ChannelId");
b.Property<int?>("GuildConfigId");
b.Property<ulong>("GuildId");
b.Property<bool>("LastStatus");
b.Property<int>("Type");
b.Property<string>("Username");
b.HasKey("Id");
b.HasIndex("GuildConfigId");
b.ToTable("FollowedStream");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b =>
{
b.Property<int>("Id")
@ -194,6 +218,8 @@ namespace NadekoBot.Migrations
b.Property<bool>("SendDmGreetMessage");
b.Property<bool>("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<int>("Id")
.ValueGeneratedOnAdd();
b.Property<string>("Author");
b.Property<string>("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")

View File

@ -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)
{

View File

@ -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)

View File

@ -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<int, HashSet<Channel>> Subscribers = new ConcurrentDictionary<int, HashSet<Channel>>();
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<Channel>();
// 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<Channel> set;
// if (!Subscribers.TryGetValue(token, out set))
// return;
// set.Add(e.Channel);
// await channel.SendMessageAsync(":ok:").ConfigureAwait(false);
// });
public static readonly ConcurrentDictionary<int, HashSet<ITextChannel>> Subscribers = new ConcurrentDictionary<int, HashSet<ITextChannel>>();
// 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<ITextChannel>();
// 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<ITextChannel> 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);
}
}
}
}

View File

@ -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();
}
}
}
}

View File

@ -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")

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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<ulong, ConcurrentDictionary<ulong, DateTime>> RatelimitingChannels = new ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, DateTime>>();
public static ConcurrentDictionary<ulong, Ratelimiter> RatelimitingChannels = new ConcurrentDictionary<ulong, Ratelimiter>();
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<ulong, RatelimitedUser> Users { get; set; } = new ConcurrentDictionary<ulong, RatelimitedUser>();
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 t = Task.Run(async () =>
{
var usrMsg = umsg as IUserMessage;
var channel = usrMsg.Channel as ITextChannel;
if (channel == null || await usrMsg.IsAuthor())
return;
ConcurrentDictionary<ulong, DateTime> userTimePair;
if (!RatelimitingChannels.TryGetValue(channel.Id, out userTimePair)) return;
DateTime lastMessageTime;
if (userTimePair.TryGetValue(usrMsg.Author.Id, out lastMessageTime))
{
if (DateTime.Now - lastMessageTime < ratelimitTime)
{
try
{
await usrMsg.DeleteAsync().ConfigureAwait(false);
}
catch { }
Ratelimiter limiter;
if (!RatelimitingChannels.TryGetValue(channel.Id, out limiter))
return;
}
}
userTimePair.AddOrUpdate(usrMsg.Author.Id, id => DateTime.Now, (id, dt) => DateTime.Now);
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<ulong, DateTime> 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<ulong, DateTime>()))
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);
}
}

View File

@ -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)
{

View File

@ -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)
// {

View File

@ -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)

View File

@ -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);
// }
// });
// }
// }
//}

View File

@ -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<ulong, bool> voicePlusTextCache;
public VoicePlusTextCommands()
{
NadekoBot.Client.UserUpdated += UserUpdatedEventHandler;
voicePlusTextCache = new ConcurrentDictionary<ulong, bool>();
}
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.`");
}
}
}
}

View File

@ -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)
{

View File

@ -20,7 +20,7 @@ namespace NadekoBot.Modules.Gambling
{
public static ConcurrentDictionary<ulong, AnimalRace> AnimalRaces = new ConcurrentDictionary<ulong, AnimalRace>();
[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<string> animals { get; }
public bool Fail { get; internal set; }
public bool Fail { get; set; }
public List<Participant> participants = new List<Participant>();
private ulong serverId;

View File

@ -14,17 +14,17 @@ namespace NadekoBot.Modules.Gambling
{
private Regex dndRegex { get; } = new Regex(@"(?<n1>\d+)d(?<n2>\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)
{

View File

@ -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]`")

View File

@ -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)
//{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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`")

View File

@ -14,7 +14,7 @@ namespace NadekoBot.Modules.Games
{
public static ConcurrentDictionary<IGuild, Poll> ActivePolls = new ConcurrentDictionary<IGuild, Poll>();
[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)
{

View File

@ -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<TypingArticle>();
// 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<ulong> 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<ulong> finishedUserIds;
public TypingGame(ITextChannel channel)
{
this.channel = channel;
IsActive = false;
sw = new Stopwatch();
finishedUserIds = new List<ulong>();
}
// public TypingGame(Channel channel)
// {
// this.channel = channel;
// IsActive = false;
// sw = new Stopwatch();
// finishedUserIds = new List<ulong>();
// }
public ITextChannel Channel { get; set; }
// public Channel Channell { get; internal set; }
public async Task<bool> 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<bool> 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<ulong, TypingGame> RunningContests;
}
// public SpeedTyping(DiscordModule module) : base(module)
// {
// RunningContests = new ConcurrentDictionary<ulong, TypingGame>();
// }
[Group]
public class SpeedTypingCommands
{
// public Func<CommandEventArgs, Task> DoFunc() =>
// async e =>
// {
// var game = RunningContests.GetOrAdd(umsg.Author.Server.Id, id => new TypingGame(e.Channel));
public static ConcurrentDictionary<ulong, TypingGame> 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<ulong, TypingGame>();
}
// private Func<CommandEventArgs, Task> 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);
//}
}
}

View File

@ -7,7 +7,6 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
// todo rewrite
namespace NadekoBot.Modules.Games.Trivia
{
public class TriviaGame

View File

@ -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"));

View File

@ -17,7 +17,7 @@ namespace NadekoBot.Modules.Games
{
public static ConcurrentDictionary<ulong, TriviaGame> RunningTrivias = new ConcurrentDictionary<ulong, TriviaGame>();
[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)
{

View File

@ -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)
{

View File

@ -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**: <http://nadekobot.rtfd.io>").ConfigureAwait(false);
}
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
[RequireContext(ContextType.Guild)]
public async Task Donate(IUserMessage umsg)
{

View File

@ -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;

View File

@ -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; }
/// <summary>
/// Will be set only if the providertype is normal
/// </summary>
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());

View File

@ -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<SoundCloudVideo> GetVideoByQueryAsync(string query)
public async Task<SoundCloudVideo> GetVideoByQueryAsync(string query)
{
if (string.IsNullOrWhiteSpace(query))
throw new ArgumentNullException(nameof(query));

View File

@ -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)
{

View File

@ -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<string> GetE621ImageLink(string tags)
public static async Task<string> GetE621ImageLink(string tags)
{
try
{

View File

@ -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)
{

View File

@ -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<AnimeResult> 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<AnimeResult>(content)).ConfigureAwait(false);
// }
var result = await GetMangaData(query).ConfigureAwait(false);
// public static async Task<MangaResult> 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<AnimeResult> 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<AnimeResult>(aniData)).ConfigureAwait(false);
}
}
catch (Exception ex) {
_log.Warn(ex, "Failed anime search for {0}", query);
return null;
}
}
// return await Task.Run(() => JsonConvert.DeserializeObject<MangaResult>(content)).ConfigureAwait(false);
// }
// }
//}
private async Task RefreshAnilistToken()
{
if (DateTime.Now - lastRefresh > TimeSpan.FromMinutes(29))
lastRefresh = DateTime.Now;
else
{
return;
}
var headers = new Dictionary<string, string> {
{"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<MangaResult> 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<MangaResult>(aniData)).ConfigureAwait(false);
}
}
catch (Exception ex)
{
_log.Warn(ex, "Failed anime search for {0}", query);
return null;
}
}
}
}
}

View File

@ -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)
{

View File

@ -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`")

View File

@ -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)
{

View File

@ -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`")

View File

@ -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)
{

View File

@ -1,4 +1,4 @@
namespace NadekoBot.Classes.JSONModels
namespace NadekoBot.Modules.Searches.Models
{
public class AnimeResult
{

View File

@ -1,4 +1,4 @@
namespace NadekoBot.Classes.JSONModels
namespace NadekoBot.Modules.Searches.Models
{
public class MangaResult
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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<string, Tuple<bool, string>> cachedStatuses = new ConcurrentDictionary<string, Tuple<bool, string>>();
// private bool FirstPass { get; set; } = true;
namespace NadekoBot.Modules.Searches
{
public partial class Searches
{
[Group]
public class StreamNotificationCommands
{
private Timer checkTimer { get; }
private ConcurrentDictionary<string, Tuple<bool, string>> cachedStatuses = new ConcurrentDictionary<string, Tuple<bool, string>>();
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<bool, string> data;
// try
// {
// data = await GetStreamStatus(stream).ConfigureAwait(false);
// }
// catch
// {
// continue;
// }
public StreamNotificationCommands()
{
checkTimer = new Timer(async (state) =>
{
cachedStatuses.Clear();
try
{
IEnumerable<FollowedStream> streams;
using (var uow = DbHandler.UnitOfWork())
{
streams = uow.GuildConfigs.GetAllFollowedStreams();
}
foreach (var stream in streams)
{
Tuple<bool, string> 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<Tuple<bool, string>> GetStreamStatus(FollowedStream stream, bool checkCache = true)
{
bool isLive;
string response;
JObject data;
Tuple<bool, string> 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<bool, string>(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<bool, string>(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<bool>() == true;
result = new Tuple<bool, string>(isLive, data["viewersCurrent"].ToString());
cachedStatuses.TryAdd(beamUrl, result);
return result;
default:
break;
}
return new Tuple<bool, string>(false, "0");
}
// private async Task<Tuple<bool, string>> GetStreamStatus(StreamNotificationConfig stream, bool checkCache = true)
// {
// bool isLive;
// string response;
// JObject data;
// Tuple<bool, string> 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<bool, string>(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<bool, string>(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<bool>() == true;
// result = new Tuple<bool, string>(isLive, data["viewersCurrent"].ToString());
// cachedStatuses.TryAdd(beamUrl, result);
// return result;
// default:
// break;
// }
// return new Tuple<bool, string>(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<FollowedStream> 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<CommandEventArgs, Task> 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<bool, string> 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);
// };
// }
// }
//}
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<bool, string> 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);
}
}
}
}

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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;

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
//{

View File

@ -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)
{

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -28,7 +28,7 @@ namespace NadekoBot.Resources {
private static global::System.Globalization.CultureInfo resourceCulture;
internal ResponseStrings() {
public ResponseStrings() {
}
/// <summary>

View File

@ -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<ClashCaller> Bases { get; set; }
}

View File

@ -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
}
}
}

View File

@ -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<FollowedStream> FollowedStreams { get; set; } = new List<FollowedStream>();
}
}

View File

@ -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; }
}
}

View File

@ -21,6 +21,7 @@ namespace NadekoBot.Services.Database
public DbSet<Repeater> Repeaters { get; set; }
public DbSet<Currency> Currency { get; set; }
public DbSet<ConvertUnit> ConversionUnits { get; set; }
public DbSet<TypingArticle> TypingArticles { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{

View File

@ -11,5 +11,6 @@ namespace NadekoBot.Services.Database.Repositories
public interface IGuildConfigRepository : IRepository<GuildConfig>
{
GuildConfig For(ulong guildId);
IEnumerable<FollowedStream> GetAllFollowedStreams();
}
}

View File

@ -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>
{
TypingArticle GetRandom();
}
}

View File

@ -20,7 +20,8 @@ namespace NadekoBot.Services.Database.Repositories.Impl
/// <returns></returns>
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<FollowedStream> GetAllFollowedStreams() =>
_set.Include(gc => gc.FollowedStreams)
.SelectMany(gc => gc.FollowedStreams)
.ToList();
}
}

View File

@ -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<TypingArticle>, 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();
}
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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; }
}
}

View File

@ -1,7 +0,0 @@
namespace NadekoBot.DataModels {
internal class CurrencyState : IDataModel {
public long Value { get; set; }
[SQLite.Unique]
public long UserId { get; set; }
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -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() { }
}
}

View File

@ -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;
}
}

View File

@ -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; }
}
}

View File

@ -1,8 +0,0 @@
namespace NadekoBot.DataModels
{
internal class PlaylistSongInfo : IDataModel
{
public int PlaylistId { get; set; }
public int SongInfoId { get; set; }
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -1,8 +0,0 @@
namespace NadekoBot.DataModels
{
internal class TestDataModel : IDataModel
{
public long TestNumber { get; set; }
public string TestString { get; set; }
}
}

View File

@ -1,5 +0,0 @@
namespace NadekoBot.DataModels {
internal class TypingArticle : IDataModel {
public string Text { get; set; }
}
}

View File

@ -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; }
}
}

View File

@ -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<string, List<string>> DefaultCustomReactions = new Dictionary<string, List<string>>
{
{@"\o\", new List<string>()
{ "/o/" } },
{"/o/", new List<string>()
{ @"\o\" } },
{"moveto", new List<string>() {
@"(👉 ͡° ͜ʖ ͡°)👉 %target%" } },
{"comeatmebro", new List<string>() {
"%target% (ง’̀-‘́)ง" } },
{"e", new List<string>() {
"%user% did it 😒 🔫",
"%target% did it 😒 🔫" } },
{"%mention% insult", new List<string>() {
"%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<string>()
{
"%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<string>() {
"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<string>()
{
"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<string>()
{
"%user%, I will be soon."
} },
{"%mention% are you there?", new List<string>()
{
"Yes. :)"
} },
{"%mention% draw", new List<string>() {
"Sorry, I don't gamble, type $draw for that function."
} },
{"%mention% bb", new List<string>()
{
"Bye %target%"
} },
{"%mention% call", new List<string>() {
"Calling %target%"
} },
{"%mention% disguise", new List<string>() {
"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<string>() {
"To invite your bot, click on this link -> <https://discordapp.com/oauth2/authorize?client_id=%target%&scope=bot&permissions=66186303>"
} },
{ "%mention% threaten", new List<string>() {
"You wanna die, %target%?"
} },
{ "%mention% archer", new List<string>() {
"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<Quote> Quotes { get; set; } = new List<Quote>();
[JsonIgnore]
public List<PokemonType> PokemonTypes { get; set; } = new List<PokemonType>();
public string RemindMessageFormat { get; set; } = "❗⏰**I've been told to remind you to '%message%' now by %user%.**⏰❗";
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public Dictionary<string, List<string>> CustomReactions { get; set; }
public List<string> RotatingStatuses { get; set; } = new List<string>();
public CommandPrefixesModel CommandPrefixes { get; set; } = new CommandPrefixesModel();
public HashSet<ulong> ServerBlacklist { get; set; } = new HashSet<ulong>();
public HashSet<ulong> ChannelBlacklist { get; set; } = new HashSet<ulong>();
public HashSet<ulong> UserBlacklist { get; set; } = new HashSet<ulong>() {
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**
<https://github.com/Kwoth/NadekoBot/blob/master/commandlist.md>
Nadeko Support Server: <https://discord.gg/0ehQwTK2RBjAxzEY>";
}
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}*";
}
}

View File

@ -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<LocalizedStrings>(File.ReadAllText(localeFile));
}
}

View File

@ -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}*";
}
}

View File

@ -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<PokemonMultiplier> multi)
{
Name = n;
Icon = i;
Moves = m;
Multipliers = multi;
}
public string Name { get; set; }
public List<PokemonMultiplier> 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; }
}
}

View File

@ -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"
// }
// }
// ]
//}

View File

@ -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; } = "";

View File

@ -34,6 +34,6 @@ namespace NadekoBot.Classes
/// <summary>
/// Initializes the CommandBuilder with values using CommandGroupBuilder
/// </summary>
internal abstract void Init(CommandGroupBuilder cgb);
public abstract void Init(CommandGroupBuilder cgb);
}
}

View File

@ -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();

View File

@ -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));

View File

@ -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,

View File

@ -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)\/(?<id>([\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")

Some files were not shown because too many files have changed in this diff Show More