From 088d95340fa9a051ae5735b44ee3ee5804f1e477 Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Tue, 22 Aug 2017 05:48:45 +0200 Subject: [PATCH 1/2] Started work on the xp system --- src/NadekoBot/Common/BotConfigEditType.cs | 2 + .../20170821085106_xp-stuff.Designer.cs | 1825 +++++++++++++++++ .../Migrations/20170821085106_xp-stuff.cs | 153 ++ .../NadekoSqliteContextModelSnapshot.cs | 112 + .../Modules/Games/Services/GamesService.cs | 10 +- .../Modules/Xp/Extensions/Extensions.cs | 34 + .../Modules/Xp/Services/UserCacheItem.cs | 18 + .../Modules/Xp/Services/XpService.cs | 229 +++ src/NadekoBot/Modules/Xp/Xp.cs | 105 + src/NadekoBot/NadekoBot.csproj | 6 + src/NadekoBot/Resources/CommandStrings.resx | 27 + .../Services/Database/IUnitOfWork.cs | 1 + .../Services/Database/Models/BotConfig.cs | 2 + .../Services/Database/Models/GuildConfig.cs | 2 + .../Services/Database/Models/UserXpStats.cs | 10 + .../Services/Database/Models/XpSettings.cs | 50 + .../Services/Database/NadekoContext.cs | 13 + .../Repositories/IGuildConfigRepository.cs | 1 + .../Database/Repositories/IXpRepository.cs | 9 + .../Impl/GuildConfigRepository.cs | 14 + .../Repositories/Impl/XpRepository.cs | 31 + src/NadekoBot/Services/Database/UnitOfWork.cs | 3 + .../Services/Impl/BotConfigProvider.cs | 12 + .../_strings/ResponseStrings.en-US.json | 13 +- 24 files changed, 2676 insertions(+), 6 deletions(-) create mode 100644 src/NadekoBot/Migrations/20170821085106_xp-stuff.Designer.cs create mode 100644 src/NadekoBot/Migrations/20170821085106_xp-stuff.cs create mode 100644 src/NadekoBot/Modules/Xp/Extensions/Extensions.cs create mode 100644 src/NadekoBot/Modules/Xp/Services/UserCacheItem.cs create mode 100644 src/NadekoBot/Modules/Xp/Services/XpService.cs create mode 100644 src/NadekoBot/Modules/Xp/Xp.cs create mode 100644 src/NadekoBot/Services/Database/Models/UserXpStats.cs create mode 100644 src/NadekoBot/Services/Database/Models/XpSettings.cs create mode 100644 src/NadekoBot/Services/Database/Repositories/IXpRepository.cs create mode 100644 src/NadekoBot/Services/Database/Repositories/Impl/XpRepository.cs diff --git a/src/NadekoBot/Common/BotConfigEditType.cs b/src/NadekoBot/Common/BotConfigEditType.cs index 5eadbe9d..92be166a 100644 --- a/src/NadekoBot/Common/BotConfigEditType.cs +++ b/src/NadekoBot/Common/BotConfigEditType.cs @@ -17,6 +17,8 @@ CurrencyDropAmountMax, MinimumBetAmount, TriviaCurrencyReward, + XpPerMessage, + XpMinutesTimeout, //ErrorColor, //after i fix the nadekobot.cs static variables //OkColor diff --git a/src/NadekoBot/Migrations/20170821085106_xp-stuff.Designer.cs b/src/NadekoBot/Migrations/20170821085106_xp-stuff.Designer.cs new file mode 100644 index 00000000..ba66fe44 --- /dev/null +++ b/src/NadekoBot/Migrations/20170821085106_xp-stuff.Designer.cs @@ -0,0 +1,1825 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoContext))] + [Migration("20170821085106_xp-stuff")] + partial class xpstuff + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.1.1"); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.Property("UserThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiRaidSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AntiSpamSettingId"); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.HasKey("Id"); + + b.HasIndex("AntiSpamSettingId"); + + b.ToTable("AntiSpamIgnore"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("MessageThreshold"); + + b.Property("MuteTime"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiSpamSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + b.Property("ItemId"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("BlacklistItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlockedCmdOrMdl", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("BotConfigId1"); + + b.Property("DateAdded"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.HasIndex("BotConfigId1"); + + b.ToTable("BlockedCmdOrMdl"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BetflipMultiplier"); + + b.Property("Betroll100Multiplier"); + + b.Property("Betroll67Multiplier"); + + b.Property("Betroll91Multiplier"); + + b.Property("BufferSize"); + + b.Property("CurrencyDropAmount"); + + b.Property("CurrencyDropAmountMax"); + + b.Property("CurrencyGenerationChance"); + + b.Property("CurrencyGenerationCooldown"); + + b.Property("CurrencyName"); + + b.Property("CurrencyPluralName"); + + b.Property("CurrencySign"); + + b.Property("CustomReactionsStartWith"); + + b.Property("DMHelpString"); + + b.Property("DateAdded"); + + b.Property("DefaultPrefix"); + + b.Property("ErrorColor"); + + b.Property("ForwardMessages"); + + b.Property("ForwardToAllOwners"); + + b.Property("HelpString"); + + b.Property("Locale"); + + b.Property("MigrationVersion"); + + b.Property("MinimumBetAmount"); + + b.Property("OkColor"); + + b.Property("PermissionVersion"); + + b.Property("RemindMessageFormat"); + + b.Property("RotatingStatuses"); + + b.Property("TriviaCurrencyReward"); + + b.Property("XpMinutesTimeout"); + + b.Property("XpPerMessage"); + + b.HasKey("Id"); + + b.ToTable("BotConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BaseDestroyed"); + + b.Property("CallUser"); + + b.Property("ClashWarId"); + + b.Property("DateAdded"); + + b.Property("SequenceNumber"); + + b.Property("Stars"); + + b.Property("TimeAdded"); + + b.HasKey("Id"); + + b.HasIndex("ClashWarId"); + + b.ToTable("ClashCallers"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashWar", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("EnemyClan"); + + b.Property("GuildId"); + + b.Property("Size"); + + b.Property("StartedAt"); + + b.Property("WarState"); + + b.HasKey("Id"); + + b.ToTable("ClashOfClans"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandAlias", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Mapping"); + + b.Property("Trigger"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandAlias"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CommandName"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandPrice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("CommandName"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.HasIndex("Price") + .IsUnique(); + + b.ToTable("CommandPrice"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("InternalTrigger"); + + b.Property("Modifier"); + + b.Property("UnitType"); + + b.HasKey("Id"); + + b.ToTable("ConversionUnits"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Currency", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Currency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CurrencyTransaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + b.Property("Reason"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.ToTable("CurrencyTransactions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoDeleteTrigger"); + + b.Property("ContainsAnywhere"); + + b.Property("DateAdded"); + + b.Property("DmResponse"); + + b.Property("GuildId"); + + b.Property("IsRegex"); + + b.Property("OwnerOnly"); + + b.Property("Response"); + + b.Property("Trigger"); + + b.HasKey("Id"); + + b.ToTable("CustomReactions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.DiscordUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AvatarId"); + + b.Property("DateAdded"); + + b.Property("Discriminator"); + + b.Property("UserId"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasAlternateKey("UserId"); + + b.ToTable("DiscordUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + b.Property("Name"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Donators"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("EightBallResponses"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ExcludedItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("ItemId"); + + b.Property("ItemType"); + + b.Property("XpSettingsId"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId"); + + b.ToTable("ExcludedItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildConfigId1"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.HasIndex("GuildConfigId1"); + + b.ToTable("FilterChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Word"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilteredWord"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GCChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoAssignRoleId"); + + b.Property("AutoDeleteByeMessages"); + + b.Property("AutoDeleteByeMessagesTimer"); + + b.Property("AutoDeleteGreetMessages"); + + b.Property("AutoDeleteGreetMessagesTimer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages"); + + b.Property("ByeMessageChannelId"); + + b.Property("ChannelByeMessageText"); + + b.Property("ChannelGreetMessageText"); + + b.Property("CleverbotEnabled"); + + b.Property("DateAdded"); + + b.Property("DefaultMusicVolume"); + + b.Property("DeleteMessageOnCommand"); + + b.Property("DmGreetMessageText"); + + b.Property("ExclusiveSelfAssignedRoles"); + + b.Property("FilterInvites"); + + b.Property("FilterWords"); + + b.Property("GameVoiceChannel"); + + b.Property("GreetMessageChannelId"); + + b.Property("GuildId"); + + b.Property("Locale"); + + b.Property("LogSettingId"); + + b.Property("MuteRoleName"); + + b.Property("PermissionRole"); + + b.Property("Prefix"); + + b.Property("RootPermissionId"); + + b.Property("SendChannelByeMessage"); + + b.Property("SendChannelGreetMessage"); + + b.Property("SendDmGreetMessage"); + + b.Property("TimeZoneId"); + + b.Property("VerboseErrors"); + + b.Property("VerbosePermissions"); + + b.Property("VoicePlusTextEnabled"); + + b.Property("WarningsInitialized"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.HasIndex("LogSettingId"); + + b.HasIndex("RootPermissionId"); + + b.ToTable("GuildConfigs"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildRepeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Interval"); + + b.Property("Message"); + + b.Property("StartTimeOfDay"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GuildRepeater"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("LogSettingId"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredLogChannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("LogSettingId"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredVoicePresenceCHannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelCreated"); + + b.Property("ChannelCreatedId"); + + b.Property("ChannelDestroyed"); + + b.Property("ChannelDestroyedId"); + + b.Property("ChannelId"); + + b.Property("ChannelUpdated"); + + b.Property("ChannelUpdatedId"); + + b.Property("DateAdded"); + + b.Property("IsLogging"); + + b.Property("LogOtherId"); + + b.Property("LogUserPresence"); + + b.Property("LogUserPresenceId"); + + b.Property("LogVoicePresence"); + + b.Property("LogVoicePresenceId"); + + b.Property("LogVoicePresenceTTSId"); + + b.Property("MessageDeleted"); + + b.Property("MessageDeletedId"); + + b.Property("MessageUpdated"); + + b.Property("MessageUpdatedId"); + + b.Property("UserBanned"); + + b.Property("UserBannedId"); + + b.Property("UserJoined"); + + b.Property("UserJoinedId"); + + b.Property("UserLeft"); + + b.Property("UserLeftId"); + + b.Property("UserMutedId"); + + b.Property("UserPresenceChannelId"); + + b.Property("UserUnbanned"); + + b.Property("UserUnbannedId"); + + b.Property("UserUpdated"); + + b.Property("UserUpdatedId"); + + b.Property("VoicePresenceChannelId"); + + b.HasKey("Id"); + + b.ToTable("LogSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + b.Property("ModuleName"); + + b.Property("Prefix"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("ModulePrefixes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("AuthorId"); + + b.Property("DateAdded"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("MutedUserId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.NsfwBlacklitedTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Tag"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("NsfwBlacklitedTag"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("NextId"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("NextId") + .IsUnique(); + + b.ToTable("Permission"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permissionv2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Index"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("Permissionv2"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + b.Property("Status"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("PlayingStatus"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("MusicPlaylistId"); + + b.Property("Provider"); + + b.Property("ProviderType"); + + b.Property("Query"); + + b.Property("Title"); + + b.Property("Uri"); + + b.HasKey("Id"); + + b.HasIndex("MusicPlaylistId"); + + b.ToTable("PlaylistSong"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuthorId"); + + b.Property("AuthorName") + .IsRequired(); + + b.Property("DateAdded"); + + b.Property("GuildId"); + + b.Property("Keyword") + .IsRequired(); + + b.Property("Text") + .IsRequired(); + + b.HasKey("Id"); + + b.ToTable("Quotes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + b.Property("Icon"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("RaceAnimals"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("IsPrivate"); + + b.Property("Message"); + + b.Property("ServerId"); + + b.Property("UserId"); + + b.Property("When"); + + b.HasKey("Id"); + + b.ToTable("Reminders"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RewardedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AmountRewardedThisMonth"); + + b.Property("DateAdded"); + + b.Property("LastReward"); + + b.Property("PatreonUserId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("RewardedUsers"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuthorId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Index"); + + b.Property("Name"); + + b.Property("Price"); + + b.Property("RoleId"); + + b.Property("RoleName"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("ShopEntry"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntryItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("ShopEntryId"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.HasIndex("ShopEntryId"); + + b.ToTable("ShopEntryItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("SlowmodeIgnoredRole"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("SlowmodeIgnoredUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StartupCommand", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("ChannelId"); + + b.Property("ChannelName"); + + b.Property("CommandText"); + + b.Property("DateAdded"); + + b.Property("GuildId"); + + b.Property("GuildName"); + + b.Property("Index"); + + b.Property("VoiceChannelId"); + + b.Property("VoiceChannelName"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("StartupCommand"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleBlacklistedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("StreamRoleSettingsId"); + + b.Property("UserId"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("StreamRoleSettingsId"); + + b.ToTable("StreamRoleBlacklistedUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddRoleId"); + + b.Property("DateAdded"); + + b.Property("Enabled"); + + b.Property("FromRoleId"); + + b.Property("GuildConfigId"); + + b.Property("Keyword"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("StreamRoleSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleWhitelistedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("StreamRoleSettingsId"); + + b.Property("UserId"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("StreamRoleSettingsId"); + + b.ToTable("StreamRoleWhitelistedUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UnmuteAt"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnmuteTimer"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UserPokeTypes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("UserId"); + + b.Property("type"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("PokeGame"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UserXpStats", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildId"); + + b.Property("NotifyOnLevelUp"); + + b.Property("UserId"); + + b.Property("Xp"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "GuildId") + .IsUnique(); + + b.ToTable("UserXpStats"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("RoleId"); + + b.Property("VoiceChannelId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("VcRoleInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AffinityId"); + + b.Property("ClaimerId"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.Property("WaifuId"); + + b.HasKey("Id"); + + b.HasIndex("AffinityId"); + + b.HasIndex("ClaimerId"); + + b.HasIndex("WaifuId") + .IsUnique(); + + b.ToTable("WaifuInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("Item"); + + b.Property("ItemEmoji"); + + b.Property("Price"); + + b.Property("WaifuInfoId"); + + b.HasKey("Id"); + + b.HasIndex("WaifuInfoId"); + + b.ToTable("WaifuItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("NewId"); + + b.Property("OldId"); + + b.Property("UpdateType"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("NewId"); + + b.HasIndex("OldId"); + + b.HasIndex("UserId"); + + b.ToTable("WaifuUpdates"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Warning", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("Forgiven"); + + b.Property("ForgivenBy"); + + b.Property("GuildId"); + + b.Property("Moderator"); + + b.Property("Reason"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.ToTable("Warnings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WarningPunishment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Punishment"); + + b.Property("Time"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("WarningPunishment"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpRoleReward", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("Level"); + + b.Property("RoleId"); + + b.Property("XpSettingsId"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId"); + + b.ToTable("XpRoleReward"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("NotifyMessage"); + + b.Property("ServerExcluded"); + + b.Property("XpRoleRewardExclusive"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("XpSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiRaidSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiRaidSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.HasOne("NadekoBot.Services.Database.Models.AntiSpamSetting") + .WithMany("IgnoredChannels") + .HasForeignKey("AntiSpamSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiSpamSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiSpamSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + 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.BlockedCmdOrMdl", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("BlockedCommands") + .HasForeignKey("BotConfigId"); + + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("BlockedModules") + .HasForeignKey("BotConfigId1"); + }); + + 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.CommandAlias", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("CommandAliases") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("CommandCooldowns") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandPrice", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("CommandPrices") + .HasForeignKey("BotConfigId"); + }); + + 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.ExcludedItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.XpSettings") + .WithMany("ExclusionList") + .HasForeignKey("XpSettingsId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterInvitesChannelIds") + .HasForeignKey("GuildConfigId"); + + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterWordsChannelIds") + .HasForeignKey("GuildConfigId1"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilteredWords") + .HasForeignKey("GuildConfigId"); + }); + + 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.GCChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GenerateCurrencyChannelIds") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany() + .HasForeignKey("LogSettingId"); + + b.HasOne("NadekoBot.Services.Database.Models.Permission", "RootPermission") + .WithMany() + .HasForeignKey("RootPermissionId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildRepeater", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GuildRepeaters") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany("IgnoredChannels") + .HasForeignKey("LogSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany("IgnoredVoicePresenceChannelIds") + .HasForeignKey("LogSettingId"); + }); + + 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.MutedUserId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("MutedUsers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.NsfwBlacklitedTag", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("NsfwBlacklistedTags") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.HasOne("NadekoBot.Services.Database.Models.Permission", "Next") + .WithOne("Previous") + .HasForeignKey("NadekoBot.Services.Database.Models.Permission", "NextId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permissionv2", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("Permissions") + .HasForeignKey("GuildConfigId"); + }); + + 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.PlaylistSong", b => + { + b.HasOne("NadekoBot.Services.Database.Models.MusicPlaylist") + .WithMany("Songs") + .HasForeignKey("MusicPlaylistId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("RaceAnimals") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntry", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("ShopEntries") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntryItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ShopEntry") + .WithMany("Items") + .HasForeignKey("ShopEntryId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredRole", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("SlowmodeIgnoredRoles") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredUser", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("SlowmodeIgnoredUsers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StartupCommand", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("StartupCommands") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleBlacklistedUser", b => + { + b.HasOne("NadekoBot.Services.Database.Models.StreamRoleSettings") + .WithMany("Blacklist") + .HasForeignKey("StreamRoleSettingsId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleSettings", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("StreamRole") + .HasForeignKey("NadekoBot.Services.Database.Models.StreamRoleSettings", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleWhitelistedUser", b => + { + b.HasOne("NadekoBot.Services.Database.Models.StreamRoleSettings") + .WithMany("Whitelist") + .HasForeignKey("StreamRoleSettingsId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("UnmuteTimers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("VcRoleInfos") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Affinity") + .WithMany() + .HasForeignKey("AffinityId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Claimer") + .WithMany() + .HasForeignKey("ClaimerId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Waifu") + .WithOne() + .HasForeignKey("NadekoBot.Services.Database.Models.WaifuInfo", "WaifuId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.WaifuInfo") + .WithMany("Items") + .HasForeignKey("WaifuInfoId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "New") + .WithMany() + .HasForeignKey("NewId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Old") + .WithMany() + .HasForeignKey("OldId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WarningPunishment", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("WarnPunishments") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpRoleReward", b => + { + b.HasOne("NadekoBot.Services.Database.Models.XpSettings") + .WithMany("RoleRewards") + .HasForeignKey("XpSettingsId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpSettings", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("XpSettings") + .HasForeignKey("NadekoBot.Services.Database.Models.XpSettings", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + } + } +} diff --git a/src/NadekoBot/Migrations/20170821085106_xp-stuff.cs b/src/NadekoBot/Migrations/20170821085106_xp-stuff.cs new file mode 100644 index 00000000..166a53f6 --- /dev/null +++ b/src/NadekoBot/Migrations/20170821085106_xp-stuff.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class xpstuff : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "XpMinutesTimeout", + table: "BotConfig", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "XpPerMessage", + table: "BotConfig", + nullable: false, + defaultValue: 0); + + migrationBuilder.CreateTable( + name: "UserXpStats", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + GuildId = table.Column(nullable: false), + NotifyOnLevelUp = table.Column(nullable: false), + UserId = table.Column(nullable: false), + Xp = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserXpStats", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "XpSettings", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + GuildConfigId = table.Column(nullable: false), + NotifyMessage = table.Column(nullable: true), + ServerExcluded = table.Column(nullable: false), + XpRoleRewardExclusive = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_XpSettings", x => x.Id); + table.ForeignKey( + name: "FK_XpSettings_GuildConfigs_GuildConfigId", + column: x => x.GuildConfigId, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ExcludedItem", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + ItemId = table.Column(nullable: false), + ItemType = table.Column(nullable: false), + XpSettingsId = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ExcludedItem", x => x.Id); + table.ForeignKey( + name: "FK_ExcludedItem_XpSettings_XpSettingsId", + column: x => x.XpSettingsId, + principalTable: "XpSettings", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "XpRoleReward", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + Level = table.Column(nullable: false), + RoleId = table.Column(nullable: false), + XpSettingsId = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_XpRoleReward", x => x.Id); + table.ForeignKey( + name: "FK_XpRoleReward_XpSettings_XpSettingsId", + column: x => x.XpSettingsId, + principalTable: "XpSettings", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_ExcludedItem_XpSettingsId", + table: "ExcludedItem", + column: "XpSettingsId"); + + migrationBuilder.CreateIndex( + name: "IX_UserXpStats_UserId_GuildId", + table: "UserXpStats", + columns: new[] { "UserId", "GuildId" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_XpRoleReward_XpSettingsId", + table: "XpRoleReward", + column: "XpSettingsId"); + + migrationBuilder.CreateIndex( + name: "IX_XpSettings_GuildConfigId", + table: "XpSettings", + column: "GuildConfigId", + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ExcludedItem"); + + migrationBuilder.DropTable( + name: "UserXpStats"); + + migrationBuilder.DropTable( + name: "XpRoleReward"); + + migrationBuilder.DropTable( + name: "XpSettings"); + + migrationBuilder.DropColumn( + name: "XpMinutesTimeout", + table: "BotConfig"); + + migrationBuilder.DropColumn( + name: "XpPerMessage", + table: "BotConfig"); + } + } +} diff --git a/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs b/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs index 97c06375..3ebfeafa 100644 --- a/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs +++ b/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs @@ -183,6 +183,10 @@ namespace NadekoBot.Migrations b.Property("TriviaCurrencyReward"); + b.Property("XpMinutesTimeout"); + + b.Property("XpPerMessage"); + b.HasKey("Id"); b.ToTable("BotConfig"); @@ -445,6 +449,26 @@ namespace NadekoBot.Migrations b.ToTable("EightBallResponses"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.ExcludedItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("ItemId"); + + b.Property("ItemType"); + + b.Property("XpSettingsId"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId"); + + b.ToTable("ExcludedItem"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => { b.Property("Id") @@ -1252,6 +1276,29 @@ namespace NadekoBot.Migrations b.ToTable("PokeGame"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.UserXpStats", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildId"); + + b.Property("NotifyOnLevelUp"); + + b.Property("UserId"); + + b.Property("Xp"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "GuildId") + .IsUnique(); + + b.ToTable("UserXpStats"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => { b.Property("Id") @@ -1393,6 +1440,49 @@ namespace NadekoBot.Migrations b.ToTable("WarningPunishment"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpRoleReward", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("Level"); + + b.Property("RoleId"); + + b.Property("XpSettingsId"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId"); + + b.ToTable("XpRoleReward"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("NotifyMessage"); + + b.Property("ServerExcluded"); + + b.Property("XpRoleRewardExclusive"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("XpSettings"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => { b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") @@ -1470,6 +1560,13 @@ namespace NadekoBot.Migrations .HasForeignKey("BotConfigId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.ExcludedItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.XpSettings") + .WithMany("ExclusionList") + .HasForeignKey("XpSettingsId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => { b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") @@ -1707,6 +1804,21 @@ namespace NadekoBot.Migrations .WithMany("WarnPunishments") .HasForeignKey("GuildConfigId"); }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpRoleReward", b => + { + b.HasOne("NadekoBot.Services.Database.Models.XpSettings") + .WithMany("RoleRewards") + .HasForeignKey("XpSettingsId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpSettings", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("XpSettings") + .HasForeignKey("NadekoBot.Services.Database.Models.XpSettings", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); } } } diff --git a/src/NadekoBot/Modules/Games/Services/GamesService.cs b/src/NadekoBot/Modules/Games/Services/GamesService.cs index f09c606b..39164486 100644 --- a/src/NadekoBot/Modules/Games/Services/GamesService.cs +++ b/src/NadekoBot/Modules/Games/Services/GamesService.cs @@ -28,7 +28,7 @@ namespace NadekoBot.Modules.Games.Services public readonly ImmutableArray EightBallResponses; private readonly Timer _t; - private readonly DiscordSocketClient _client; + private readonly CommandHandler _cmd; private readonly NadekoStrings _strings; private readonly IImagesService _images; private readonly Logger _log; @@ -38,11 +38,11 @@ namespace NadekoBot.Modules.Games.Services public List TypingArticles { get; } = new List(); - public GamesService(DiscordSocketClient client, IBotConfigProvider bc, IEnumerable gcs, + public GamesService(CommandHandler cmd, IBotConfigProvider bc, IEnumerable gcs, NadekoStrings strings, IImagesService images, CommandHandler cmdHandler) { _bc = bc; - _client = client; + _cmd = cmd; _strings = strings; _images = images; _cmdHandler = cmdHandler; @@ -59,7 +59,7 @@ namespace NadekoBot.Modules.Games.Services }, null, TimeSpan.FromDays(1), TimeSpan.FromDays(1)); //plantpick - client.MessageReceived += PotentialFlowerGeneration; + _cmd.OnMessageNoTrigger += PotentialFlowerGeneration; GenerationChannels = new ConcurrentHashSet(gcs .SelectMany(c => c.GenerateCurrencyChannelIds.Select(obj => obj.ChannelId))); @@ -102,7 +102,7 @@ namespace NadekoBot.Modules.Games.Services private string GetText(ITextChannel ch, string key, params object[] rep) => _strings.GetText(key, ch.GuildId, "Games".ToLowerInvariant(), rep); - private Task PotentialFlowerGeneration(SocketMessage imsg) + private Task PotentialFlowerGeneration(IUserMessage imsg) { var msg = imsg as SocketUserMessage; if (msg == null || msg.Author.IsBot) diff --git a/src/NadekoBot/Modules/Xp/Extensions/Extensions.cs b/src/NadekoBot/Modules/Xp/Extensions/Extensions.cs new file mode 100644 index 00000000..c5d6605b --- /dev/null +++ b/src/NadekoBot/Modules/Xp/Extensions/Extensions.cs @@ -0,0 +1,34 @@ +using NadekoBot.Modules.Xp.Services; +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Xp.Extensions +{ + public static class Extensions + { + public static (int Level, int LevelXp, int LevelRequiredXp) GetLevelData(this UserXpStats stats) + { + var baseXp = XpService.XP_REQUIRED_LVL_1; + + var required = baseXp; + var totalXp = 0; + var lvl = 1; + while (true) + { + required = (int)(baseXp + baseXp / 4.0 * (lvl - 1)); + + if (required + totalXp > stats.Xp) + break; + + totalXp += required; + lvl++; + } + + return (lvl - 1, stats.Xp - totalXp, required); + } + } +} diff --git a/src/NadekoBot/Modules/Xp/Services/UserCacheItem.cs b/src/NadekoBot/Modules/Xp/Services/UserCacheItem.cs new file mode 100644 index 00000000..4cebef92 --- /dev/null +++ b/src/NadekoBot/Modules/Xp/Services/UserCacheItem.cs @@ -0,0 +1,18 @@ +namespace NadekoBot.Modules.Xp.Services +{ + public class UserCacheItem + { + public ulong UserId { get; set; } + public ulong GuildId { get; set; } + + public override int GetHashCode() + { + return UserId.GetHashCode(); + } + + public override bool Equals(object obj) + { + return obj is UserCacheItem uci && uci.UserId == UserId; + } + } +} diff --git a/src/NadekoBot/Modules/Xp/Services/XpService.cs b/src/NadekoBot/Modules/Xp/Services/XpService.cs new file mode 100644 index 00000000..ccd3c6ed --- /dev/null +++ b/src/NadekoBot/Modules/Xp/Services/XpService.cs @@ -0,0 +1,229 @@ +using Discord; +using Discord.WebSocket; +using NadekoBot.Common.Collections; +using NadekoBot.Services; +using NadekoBot.Services.Database.Models; +using NLog; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Xp.Services +{ + public class XpService : INService + { + private readonly DbService _db; + private readonly CommandHandler _cmd; + private readonly IBotConfigProvider _bc; + private readonly Logger _log; + public const int XP_REQUIRED_LVL_1 = 36; + + private readonly ConcurrentDictionary> _excludedRoles + = new ConcurrentDictionary>(); + private readonly ConcurrentDictionary> _excludedChannels + = new ConcurrentDictionary>(); + private readonly ConcurrentHashSet _excludedServers = new ConcurrentHashSet(); + + private readonly ConcurrentHashSet _rewardedUsers = new ConcurrentHashSet(); + + private readonly ConcurrentQueue _addMessageXp = new ConcurrentQueue(); + + private readonly Timer updateXpTimer; + private readonly Timer clearRewardedUsersTimer; + + public XpService(CommandHandler cmd, IBotConfigProvider bc, + IEnumerable allGuildConfigs, DbService db) + { + _db = db; + _cmd = cmd; + _bc = bc; + _log = LogManager.GetCurrentClassLogger(); + + _cmd.OnMessageNoTrigger += _cmd_OnMessageNoTrigger; + + updateXpTimer = new Timer(_ => + { + using (var uow = _db.UnitOfWork) + { + while (_addMessageXp.TryDequeue(out var usr)) + { + var usrObj = uow.Xp.GetOrCreateUser(usr.GuildId, usr.UserId); + usrObj.Xp += _bc.BotConfig.XpPerMessage; + } + uow.Complete(); + } + }, null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5)); + + clearRewardedUsersTimer = new Timer(_ => + { + _rewardedUsers.Clear(); + }, null, TimeSpan.FromSeconds(bc.BotConfig.XpMinutesTimeout), TimeSpan.FromSeconds(bc.BotConfig.XpMinutesTimeout)); + } + + private Task _cmd_OnMessageNoTrigger(IUserMessage arg) + { + if (!(arg.Author is SocketGuildUser user) || user.IsBot) + return Task.CompletedTask; + + var _ = Task.Run(() => + { + if (!SetUserRewarded(user.Id)) + return; + + if (_excludedChannels.TryGetValue(user.Guild.Id, out var chans) && + chans.Contains(arg.Channel.Id)) + return; + + if (_excludedServers.Contains(user.Guild.Id)) + return; + + if (_excludedRoles.TryGetValue(user.Guild.Id, out var roles) && + user.Roles.Any(x => roles.Contains(x.Id))) + return; + + _log.Info("Adding {0} xp to {1} on {2} server", _bc.BotConfig.XpPerMessage, user.ToString(), user.Guild.Name); + _addMessageXp.Enqueue(new UserCacheItem { GuildId = user.Guild.Id, UserId = user.Id }); + }); + return Task.CompletedTask; + } + + public bool IsServerExcluded(ulong id) + { + return _excludedServers.Contains(id); + } + + public IEnumerable GetExcludedRoles(ulong id) + { + if (_excludedRoles.TryGetValue(id, out var val)) + return val.ToArray(); + + return Enumerable.Empty(); + } + + public IEnumerable GetExcludedChannels(ulong id) + { + if (_excludedChannels.TryGetValue(id, out var val)) + return val.ToArray(); + + return Enumerable.Empty(); + } + + private bool SetUserRewarded(ulong userId) + { + return _rewardedUsers.Add(userId); + } + + public UserXpStats GetUserStats(ulong guildId, ulong userId) + { + UserXpStats user; + using (var uow = _db.UnitOfWork) + { + user = uow.Xp.GetOrCreateUser(guildId, userId); + } + + return user; + } + + public string GenerateXpBar(int currentXp, int requiredXp) + { + //todo + return $"{currentXp}/{requiredXp}"; + } + + + //todo exclude in database + public bool ToggleExcludeServer(ulong id) + { + using (var uow = _db.UnitOfWork) + { + var xpSetting = uow.GuildConfigs.XpSettingsFor(id); + if (_excludedServers.Add(id)) + { + xpSetting.ServerExcluded = true; + uow.Complete(); + return true; + } + + _excludedServers.TryRemove(id); + xpSetting.ServerExcluded = false; + uow.Complete(); + return false; + } + } + + public bool ToggleExcludeRole(ulong guildId, ulong rId) + { + var roles = _excludedRoles.GetOrAdd(guildId, _ => new ConcurrentHashSet()); + using (var uow = _db.UnitOfWork) + { + var xpSetting = uow.GuildConfigs.XpSettingsFor(guildId); + var excludeObj = new ExcludedItem + { + ItemId = rId, + ItemType = ExcludedItemType.Role, + }; + + if (roles.Add(rId)) + { + + if (xpSetting.ExclusionList.Add(excludeObj)) + { + uow.Complete(); + } + + return true; + } + else + { + roles.TryRemove(rId); + + if (xpSetting.ExclusionList.Remove(excludeObj)) + { + uow.Complete(); + } + + return false; + } + } + } + + public bool ToggleExcludeChannel(ulong guildId, ulong chId) + { + var channels = _excludedChannels.GetOrAdd(guildId, _ => new ConcurrentHashSet()); + using (var uow = _db.UnitOfWork) + { + var xpSetting = uow.GuildConfigs.XpSettingsFor(guildId); + var excludeObj = new ExcludedItem + { + ItemId = chId, + ItemType = ExcludedItemType.Channel, + }; + + if (channels.Add(chId)) + { + + if (xpSetting.ExclusionList.Add(excludeObj)) + { + uow.Complete(); + } + + return true; + } + else + { + channels.TryRemove(chId); + + if (xpSetting.ExclusionList.Remove(excludeObj)) + { + uow.Complete(); + } + + return false; + } + } + } + } +} diff --git a/src/NadekoBot/Modules/Xp/Xp.cs b/src/NadekoBot/Modules/Xp/Xp.cs new file mode 100644 index 00000000..44b5b006 --- /dev/null +++ b/src/NadekoBot/Modules/Xp/Xp.cs @@ -0,0 +1,105 @@ +using Discord; +using Discord.Commands; +using NadekoBot.Common.Attributes; +using NadekoBot.Extensions; +using NadekoBot.Modules.Xp.Extensions; +using NadekoBot.Modules.Xp.Services; +using System.Linq; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Xp +{ + public partial class Xp : NadekoTopLevelModule + { + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task Experience(IUser user = null) + { + user = user ?? Context.User; + await Task.Delay(64).ConfigureAwait(false); // wait a bit in case user got XP with this message + + var stats = _service.GetUserStats(Context.Guild.Id, user.Id); + + var levelData = stats.GetLevelData(); + var xpBarStr = _service.GenerateXpBar(levelData.LevelXp, levelData.LevelRequiredXp); + + await Context.Channel.EmbedAsync(new EmbedBuilder() + .WithTitle(user.ToString()) + //.AddField(GetText("server_level"), stats.ServerLevel.ToString(), true) + .AddField(GetText("level"), levelData.Level.ToString(), true) + //.AddField(GetText("club"), stats.ClubName ?? "-", true) + .AddField(GetText("xp"), xpBarStr, false) + .WithOkColor()) + .ConfigureAwait(false); + } + + public enum Server { Server }; + + //[NadekoCommand, Usage, Description, Aliases] + //[RequireContext(ContextType.Guild)] + //[OwnerOnly] + //[Priority(1)] + //public async Task XpExclude(Server _, IGuild guild) + //{ + //} + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [RequireUserPermission(GuildPermission.Administrator)] + public async Task XpExclude(Server _) + { + var ex = _service.ToggleExcludeServer(Context.Guild.Id); + + await ReplyConfirmLocalized((ex ? "excluded" : "not_excluded"), Format.Bold(Context.Guild.ToString())).ConfigureAwait(false); + } + + public enum Role { Role }; + + [NadekoCommand, Usage, Description, Aliases] + [RequireUserPermission(GuildPermission.ManageRoles)] + [RequireContext(ContextType.Guild)] + public async Task XpExclude(Role _, [Remainder] IRole role) + { + var ex = _service.ToggleExcludeRole(Context.Guild.Id, role.Id); + + await ReplyConfirmLocalized((ex ? "excluded" : "not_excluded"), Format.Bold(role.ToString())).ConfigureAwait(false); + } + + public enum Channel { Channel }; + + [NadekoCommand, Usage, Description, Aliases] + [RequireUserPermission(GuildPermission.ManageChannels)] + [RequireContext(ContextType.Guild)] + public async Task XpExclude(Channel _, [Remainder] ITextChannel channel) + { + var ex = _service.ToggleExcludeChannel(Context.Guild.Id, channel.Id); + + await ReplyConfirmLocalized((ex ? "excluded" : "not_excluded"), Format.Bold(channel.ToString())).ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task XpExclusionList() + { + var serverExcluded = _service.IsServerExcluded(Context.Guild.Id); + var roles = _service.GetExcludedRoles(Context.Guild.Id) + .Select(x => Context.Guild.GetRole(x)?.Name) + .Where(x => x != null); + + var chans = (await Task.WhenAll(_service.GetExcludedChannels(Context.Guild.Id) + .Select(x => Context.Guild.GetChannelAsync(x))) + .ConfigureAwait(false)) + .Where(x => x != null) + .Select(x => x.Name); + + var embed = new EmbedBuilder() + .WithTitle(GetText("exclusion_list")) + .WithDescription((serverExcluded ? GetText("server_is_excluded") : GetText("server_is_not_excluded"))) + .AddField(GetText("excluded_roles"), roles.Any() ? string.Join("\n", roles) : "-", false) + .AddField(GetText("excluded_channels"), chans.Any() ? string.Join("\n", chans) : "-", false) + .WithOkColor(); + + await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); + } + } +} diff --git a/src/NadekoBot/NadekoBot.csproj b/src/NadekoBot/NadekoBot.csproj index 5e1db116..f18c711c 100644 --- a/src/NadekoBot/NadekoBot.csproj +++ b/src/NadekoBot/NadekoBot.csproj @@ -91,4 +91,10 @@ + + + + Designer + + diff --git a/src/NadekoBot/Resources/CommandStrings.resx b/src/NadekoBot/Resources/CommandStrings.resx index e547c0cb..8493d383 100644 --- a/src/NadekoBot/Resources/CommandStrings.resx +++ b/src/NadekoBot/Resources/CommandStrings.resx @@ -3573,4 +3573,31 @@ Toggles whether the tag is blacklisted or not in nsfw searches. Provide no parameters to see the list of blacklisted tags. + + experience xp + + + `{0}xp` + + + Shows your xp stats. Specify the user to show that user's stats instead. + + + xpexclusionlist xpexl + + + `{0}xpexl` + + + Shows the roles and channels excluded from the XP system on this server, as well as whether the whole server is excluded. + + + xpexclude xpex + + + `{0}xpex User @b1nzy` `{0}xpex Server` + + + Exclude a user or a role from the xp system, or whole current server. + diff --git a/src/NadekoBot/Services/Database/IUnitOfWork.cs b/src/NadekoBot/Services/Database/IUnitOfWork.cs index 52cb01cf..fdd2eb0d 100644 --- a/src/NadekoBot/Services/Database/IUnitOfWork.cs +++ b/src/NadekoBot/Services/Database/IUnitOfWork.cs @@ -24,6 +24,7 @@ namespace NadekoBot.Services.Database IWaifuRepository Waifus { get; } IDiscordUserRepository DiscordUsers { get; } IWarningsRepository Warnings { get; } + IXpRepository Xp { get; } int Complete(); Task CompleteAsync(); diff --git a/src/NadekoBot/Services/Database/Models/BotConfig.cs b/src/NadekoBot/Services/Database/Models/BotConfig.cs index d765b813..98b84594 100644 --- a/src/NadekoBot/Services/Database/Models/BotConfig.cs +++ b/src/NadekoBot/Services/Database/Models/BotConfig.cs @@ -68,6 +68,8 @@ Nadeko Support Server: https://discord.gg/nadekobot"; public int PermissionVersion { get; set; } public string DefaultPrefix { get; set; } = "."; public bool CustomReactionsStartWith { get; set; } = false; + public int XpPerMessage { get; set; } = 3; + public int XpMinutesTimeout { get; set; } = 5; } public class BlockedCmdOrMdl : DbEntity diff --git a/src/NadekoBot/Services/Database/Models/GuildConfig.cs b/src/NadekoBot/Services/Database/Models/GuildConfig.cs index 7ae60508..82cc8bdf 100644 --- a/src/NadekoBot/Services/Database/Models/GuildConfig.cs +++ b/src/NadekoBot/Services/Database/Models/GuildConfig.cs @@ -86,6 +86,8 @@ namespace NadekoBot.Services.Database.Models public StreamRoleSettings StreamRole { get; set; } + public XpSettings XpSettings { get; set; } + //public List ProtectionIgnoredChannels { get; set; } = new List(); } diff --git a/src/NadekoBot/Services/Database/Models/UserXpStats.cs b/src/NadekoBot/Services/Database/Models/UserXpStats.cs new file mode 100644 index 00000000..9c515ec2 --- /dev/null +++ b/src/NadekoBot/Services/Database/Models/UserXpStats.cs @@ -0,0 +1,10 @@ +namespace NadekoBot.Services.Database.Models +{ + public class UserXpStats : DbEntity + { + public ulong UserId { get; set; } + public ulong GuildId { get; set; } + public int Xp { get; set; } + public bool NotifyOnLevelUp { get; set; } + } +} diff --git a/src/NadekoBot/Services/Database/Models/XpSettings.cs b/src/NadekoBot/Services/Database/Models/XpSettings.cs new file mode 100644 index 00000000..cf89d611 --- /dev/null +++ b/src/NadekoBot/Services/Database/Models/XpSettings.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; + +namespace NadekoBot.Services.Database.Models +{ + public class XpSettings : DbEntity + { + public int GuildConfigId { get; set; } + public GuildConfig GuildConfig { get; set; } + + public HashSet RoleRewards { get; set; } = new HashSet(); + public bool XpRoleRewardExclusive { get; set; } + public string NotifyMessage { get; set; } = "Congratulations {0}! You have reached level {1}!"; + public HashSet ExclusionList { get; set; } = new HashSet(); + public bool ServerExcluded { get; set; } + } + + public enum ExcludedItemType { Channel, Role } + + public class XpRoleReward : DbEntity + { + public int Level { get; set; } + public ulong RoleId { get; set; } + + public override int GetHashCode() + { + return Level.GetHashCode() ^ RoleId.GetHashCode(); + } + + public override bool Equals(object obj) + { + return obj is XpRoleReward xrr && xrr.Level == Level && xrr.RoleId == RoleId; + } + } + + public class ExcludedItem : DbEntity + { + public ulong ItemId { get; set; } + public ExcludedItemType ItemType { get; set; } + + public override int GetHashCode() + { + return ItemId.GetHashCode() ^ ItemType.GetHashCode(); + } + + public override bool Equals(object obj) + { + return obj is ExcludedItem ei && ei.ItemId == ItemId && ei.ItemType == ItemType; + } + } +} diff --git a/src/NadekoBot/Services/Database/NadekoContext.cs b/src/NadekoBot/Services/Database/NadekoContext.cs index 7c00e1f3..5ae153d0 100644 --- a/src/NadekoBot/Services/Database/NadekoContext.cs +++ b/src/NadekoBot/Services/Database/NadekoContext.cs @@ -43,6 +43,7 @@ namespace NadekoBot.Services.Database public DbSet PokeGame { get; set; } public DbSet WaifuUpdates { get; set; } public DbSet Warnings { get; set; } + public DbSet UserXpStats { get; set; } //logging public DbSet LogSettings { get; set; } @@ -292,6 +293,18 @@ namespace NadekoBot.Services.Database pr.HasIndex(x => x.UserId) .IsUnique(); #endregion + + #region XpStatas + modelBuilder.Entity() + .HasIndex(x => new { x.UserId, x.GuildId }) + .IsUnique(); + #endregion + + #region XpSettings + modelBuilder.Entity() + .HasOne(x => x.GuildConfig) + .WithOne(x => x.XpSettings); + #endregion } } } diff --git a/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs b/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs index e56a9026..498b72ed 100644 --- a/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs @@ -16,5 +16,6 @@ namespace NadekoBot.Services.Database.Repositories void SetCleverbotEnabled(ulong id, bool cleverbotEnabled); IEnumerable Permissionsv2ForAll(List include); GuildConfig GcWithPermissionsv2For(ulong guildId); + XpSettings XpSettingsFor(ulong guildId); } } diff --git a/src/NadekoBot/Services/Database/Repositories/IXpRepository.cs b/src/NadekoBot/Services/Database/Repositories/IXpRepository.cs new file mode 100644 index 00000000..1973504a --- /dev/null +++ b/src/NadekoBot/Services/Database/Repositories/IXpRepository.cs @@ -0,0 +1,9 @@ +using NadekoBot.Services.Database.Models; + +namespace NadekoBot.Services.Database.Repositories +{ + public interface IXpRepository : IRepository + { + UserXpStats GetOrCreateUser(ulong guildId, ulong userId); + } +} diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs index e6087bec..1c296db7 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs @@ -189,5 +189,19 @@ namespace NadekoBot.Services.Database.Repositories.Impl conf.CleverbotEnabled = cleverbotEnabled; } + + public XpSettings XpSettingsFor(ulong guildId) + { + var gc = For(guildId, + set => set.Include(x => x.XpSettings) + .ThenInclude(x => x.RoleRewards) + .Include(x => x.XpSettings) + .ThenInclude(x => x.ExclusionList)); + + if (gc.XpSettings == null) + gc.XpSettings = new XpSettings(); + + return gc.XpSettings; + } } } diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/XpRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/XpRepository.cs new file mode 100644 index 00000000..6326587d --- /dev/null +++ b/src/NadekoBot/Services/Database/Repositories/Impl/XpRepository.cs @@ -0,0 +1,31 @@ +using NadekoBot.Services.Database.Models; +using System.Linq; +using Microsoft.EntityFrameworkCore; + +namespace NadekoBot.Services.Database.Repositories.Impl +{ + public class XpRepository : Repository, IXpRepository + { + public XpRepository(DbContext context) : base(context) + { + } + + public UserXpStats GetOrCreateUser(ulong guildId, ulong userId) + { + var usr = _set.FirstOrDefault(x => x.UserId == userId); + + if (usr == null) + { + _context.Add(usr = new UserXpStats() + { + Xp = 0, + UserId = userId, + NotifyOnLevelUp = false, + GuildId = guildId, + }); + } + + return usr; + } + } +} diff --git a/src/NadekoBot/Services/Database/UnitOfWork.cs b/src/NadekoBot/Services/Database/UnitOfWork.cs index 02e78a97..3b450f86 100644 --- a/src/NadekoBot/Services/Database/UnitOfWork.cs +++ b/src/NadekoBot/Services/Database/UnitOfWork.cs @@ -57,6 +57,9 @@ namespace NadekoBot.Services.Database private IWarningsRepository _warnings; public IWarningsRepository Warnings => _warnings ?? (_warnings = new WarningsRepository(_context)); + private IXpRepository _xp; + public IXpRepository Xp => _xp ?? (_xp = new XpRepository(_context)); + public UnitOfWork(NadekoContext context) { _context = context; diff --git a/src/NadekoBot/Services/Impl/BotConfigProvider.cs b/src/NadekoBot/Services/Impl/BotConfigProvider.cs index 0ed97550..2d293401 100644 --- a/src/NadekoBot/Services/Impl/BotConfigProvider.cs +++ b/src/NadekoBot/Services/Impl/BotConfigProvider.cs @@ -122,6 +122,18 @@ namespace NadekoBot.Services.Impl else return false; break; + case BotConfigEditType.XpPerMessage: + if (int.TryParse(newValue, out var xp) && xp > 0) + bc.XpPerMessage = xp; + else + return false; + break; + case BotConfigEditType.XpMinutesTimeout: + if (int.TryParse(newValue, out var min) && min > 0) + bc.XpMinutesTimeout = min; + else + return false; + break; default: return false; } diff --git a/src/NadekoBot/_strings/ResponseStrings.en-US.json b/src/NadekoBot/_strings/ResponseStrings.en-US.json index 2d123486..2ccc0b70 100644 --- a/src/NadekoBot/_strings/ResponseStrings.en-US.json +++ b/src/NadekoBot/_strings/ResponseStrings.en-US.json @@ -822,5 +822,16 @@ "administration_prefix_current": "Prefix on this server is {0}", "administration_prefix_new": "Changed prefix on this server from {0} to {1}", "administration_defprefix_current": "Default bot prefix is {0}", - "administration_defprefix_new": "Changed Default bot prefix from {0} to {1}" + "administration_defprefix_new": "Changed Default bot prefix from {0} to {1}", + "xp_server_level": "Server Level", + "xp_level": "Level", + "xp_club": "Club", + "xp_xp": "Experience", + "xp_excluded": "{0} has been excluded from the XP system on this server.", + "xp_not_excluded": "{0} is no longer excluded from the XP system on this server.", + "xp_exclusion_list": "Exclusion List", + "xp_server_is_excluded": "This server is excluded.", + "xp_server_is_not_excluded": "This server is not excluded.", + "xp_excluded_roles": "Excluded Roles", + "xp_excluded_channels": "Excluded Channels" } \ No newline at end of file From 96d792f63ba757389af9a0e1a3f269d975939bda Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Sun, 10 Sep 2017 03:52:34 +0200 Subject: [PATCH 2/2] Xp and clubs finished. Need a lot of testing. Version upped to 1.8-beta --- .../Migrations/20170821085106_xp-stuff.cs | 153 ----- ...> 20170908230730_xp-and-clubs.Designer.cs} | 130 +++- .../Migrations/20170908230730_xp-and-clubs.cs | 296 ++++++++++ src/NadekoBot/Migrations/MigrationQueries.cs | 38 ++ .../NadekoSqliteContextModelSnapshot.cs | 126 +++- .../Administration/MigrationCommands.cs | 48 -- .../CustomReactions/CustomReactions.cs | 2 +- .../Modules/Gambling/WaifuClaimCommands.cs | 10 +- src/NadekoBot/Modules/Games/Games.cs | 2 +- src/NadekoBot/Modules/NSFW/NSFW.cs | 1 + src/NadekoBot/Modules/Searches/LoLCommands.cs | 319 +--------- .../Modules/Searches/TranslatorCommands.cs | 21 + .../Utility/Services/StreamRoleService.cs | 2 +- src/NadekoBot/Modules/Utility/Utility.cs | 2 +- src/NadekoBot/Modules/Xp/Club.cs | 311 ++++++++++ .../Modules/Xp/Common/FullUserStats.cs | 26 + src/NadekoBot/Modules/Xp/Common/LevelStats.cs | 43 ++ .../Modules/Xp/Services/ClubService.cs | 312 ++++++++++ .../Modules/Xp/Services/UserCacheItem.cs | 13 +- .../Modules/Xp/Services/XpService.cs | 554 +++++++++++++++++- src/NadekoBot/Modules/Xp/Xp.cs | 192 +++++- src/NadekoBot/NadekoBot.csproj | 14 +- src/NadekoBot/Resources/CommandStrings.resx | 180 ++++++ src/NadekoBot/Services/CommandHandler.cs | 2 +- .../Services/Database/IUnitOfWork.cs | 1 + .../Services/Database/Models/ClubInfo.cs | 47 ++ .../Services/Database/Models/DiscordUser.cs | 20 +- .../Services/Database/Models/UserXpStats.cs | 10 +- .../Services/Database/NadekoContext.cs | 86 ++- .../Database/Repositories/IClubRepository.cs | 16 + .../Database/Repositories/IXpRepository.cs | 5 + .../Repositories/Impl/BotConfigRepository.cs | 1 - .../Repositories/Impl/ClubRepository.cs | 65 ++ .../Impl/DiscordUserRepository.cs | 11 +- .../Repositories/Impl/XpRepository.cs | 52 +- src/NadekoBot/Services/Database/UnitOfWork.cs | 3 + src/NadekoBot/Services/DbService.cs | 24 +- src/NadekoBot/Services/IImagesService.cs | 2 + .../Services/Impl/GoogleApiService.cs | 3 +- src/NadekoBot/Services/Impl/ImagesService.cs | 6 + src/NadekoBot/Services/Impl/StatsService.cs | 2 +- src/NadekoBot/_Extensions/Extensions.cs | 2 +- .../_Extensions/IMessageChannelExtensions.cs | 10 +- src/NadekoBot/_Extensions/IUserExtensions.cs | 14 +- .../_strings/ResponseStrings.en-US.json | 37 +- src/NadekoBot/data/fonts/Uni Sans.ttf | Bin 0 -> 50856 bytes src/NadekoBot/data/fonts/WhitneyBold.ttf | Bin 0 -> 59652 bytes .../data/fonts/WhitneyBoldItalic.ttf | Bin 0 -> 56336 bytes src/NadekoBot/data/images/xp/xp.png | Bin 0 -> 294486 bytes 49 files changed, 2566 insertions(+), 648 deletions(-) delete mode 100644 src/NadekoBot/Migrations/20170821085106_xp-stuff.cs rename src/NadekoBot/Migrations/{20170821085106_xp-stuff.Designer.cs => 20170908230730_xp-and-clubs.Designer.cs} (92%) create mode 100644 src/NadekoBot/Migrations/20170908230730_xp-and-clubs.cs create mode 100644 src/NadekoBot/Migrations/MigrationQueries.cs create mode 100644 src/NadekoBot/Modules/Xp/Club.cs create mode 100644 src/NadekoBot/Modules/Xp/Common/FullUserStats.cs create mode 100644 src/NadekoBot/Modules/Xp/Common/LevelStats.cs create mode 100644 src/NadekoBot/Modules/Xp/Services/ClubService.cs create mode 100644 src/NadekoBot/Services/Database/Models/ClubInfo.cs create mode 100644 src/NadekoBot/Services/Database/Repositories/IClubRepository.cs create mode 100644 src/NadekoBot/Services/Database/Repositories/Impl/ClubRepository.cs create mode 100644 src/NadekoBot/data/fonts/Uni Sans.ttf create mode 100644 src/NadekoBot/data/fonts/WhitneyBold.ttf create mode 100644 src/NadekoBot/data/fonts/WhitneyBoldItalic.ttf create mode 100644 src/NadekoBot/data/images/xp/xp.png diff --git a/src/NadekoBot/Migrations/20170821085106_xp-stuff.cs b/src/NadekoBot/Migrations/20170821085106_xp-stuff.cs deleted file mode 100644 index 166a53f6..00000000 --- a/src/NadekoBot/Migrations/20170821085106_xp-stuff.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace NadekoBot.Migrations -{ - public partial class xpstuff : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "XpMinutesTimeout", - table: "BotConfig", - nullable: false, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "XpPerMessage", - table: "BotConfig", - nullable: false, - defaultValue: 0); - - migrationBuilder.CreateTable( - name: "UserXpStats", - columns: table => new - { - Id = table.Column(nullable: false) - .Annotation("Sqlite:Autoincrement", true), - DateAdded = table.Column(nullable: true), - GuildId = table.Column(nullable: false), - NotifyOnLevelUp = table.Column(nullable: false), - UserId = table.Column(nullable: false), - Xp = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserXpStats", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "XpSettings", - columns: table => new - { - Id = table.Column(nullable: false) - .Annotation("Sqlite:Autoincrement", true), - DateAdded = table.Column(nullable: true), - GuildConfigId = table.Column(nullable: false), - NotifyMessage = table.Column(nullable: true), - ServerExcluded = table.Column(nullable: false), - XpRoleRewardExclusive = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_XpSettings", x => x.Id); - table.ForeignKey( - name: "FK_XpSettings_GuildConfigs_GuildConfigId", - column: x => x.GuildConfigId, - principalTable: "GuildConfigs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "ExcludedItem", - columns: table => new - { - Id = table.Column(nullable: false) - .Annotation("Sqlite:Autoincrement", true), - DateAdded = table.Column(nullable: true), - ItemId = table.Column(nullable: false), - ItemType = table.Column(nullable: false), - XpSettingsId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_ExcludedItem", x => x.Id); - table.ForeignKey( - name: "FK_ExcludedItem_XpSettings_XpSettingsId", - column: x => x.XpSettingsId, - principalTable: "XpSettings", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "XpRoleReward", - columns: table => new - { - Id = table.Column(nullable: false) - .Annotation("Sqlite:Autoincrement", true), - DateAdded = table.Column(nullable: true), - Level = table.Column(nullable: false), - RoleId = table.Column(nullable: false), - XpSettingsId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_XpRoleReward", x => x.Id); - table.ForeignKey( - name: "FK_XpRoleReward_XpSettings_XpSettingsId", - column: x => x.XpSettingsId, - principalTable: "XpSettings", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateIndex( - name: "IX_ExcludedItem_XpSettingsId", - table: "ExcludedItem", - column: "XpSettingsId"); - - migrationBuilder.CreateIndex( - name: "IX_UserXpStats_UserId_GuildId", - table: "UserXpStats", - columns: new[] { "UserId", "GuildId" }, - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_XpRoleReward_XpSettingsId", - table: "XpRoleReward", - column: "XpSettingsId"); - - migrationBuilder.CreateIndex( - name: "IX_XpSettings_GuildConfigId", - table: "XpSettings", - column: "GuildConfigId", - unique: true); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "ExcludedItem"); - - migrationBuilder.DropTable( - name: "UserXpStats"); - - migrationBuilder.DropTable( - name: "XpRoleReward"); - - migrationBuilder.DropTable( - name: "XpSettings"); - - migrationBuilder.DropColumn( - name: "XpMinutesTimeout", - table: "BotConfig"); - - migrationBuilder.DropColumn( - name: "XpPerMessage", - table: "BotConfig"); - } - } -} diff --git a/src/NadekoBot/Migrations/20170821085106_xp-stuff.Designer.cs b/src/NadekoBot/Migrations/20170908230730_xp-and-clubs.Designer.cs similarity index 92% rename from src/NadekoBot/Migrations/20170821085106_xp-stuff.Designer.cs rename to src/NadekoBot/Migrations/20170908230730_xp-and-clubs.Designer.cs index ba66fe44..6b324c08 100644 --- a/src/NadekoBot/Migrations/20170821085106_xp-stuff.Designer.cs +++ b/src/NadekoBot/Migrations/20170908230730_xp-and-clubs.Designer.cs @@ -9,8 +9,8 @@ using NadekoBot.Services.Database.Models; namespace NadekoBot.Migrations { [DbContext(typeof(NadekoContext))] - [Migration("20170821085106_xp-stuff")] - partial class xpstuff + [Migration("20170908230730_xp-and-clubs")] + partial class xpandclubs { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -184,9 +184,13 @@ namespace NadekoBot.Migrations b.Property("TriviaCurrencyReward"); - b.Property("XpMinutesTimeout"); + b.Property("XpMinutesTimeout") + .ValueGeneratedOnAdd() + .HasDefaultValue(5); - b.Property("XpPerMessage"); + b.Property("XpPerMessage") + .ValueGeneratedOnAdd() + .HasDefaultValue(3); b.HasKey("Id"); @@ -243,6 +247,63 @@ namespace NadekoBot.Migrations b.ToTable("ClashOfClans"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubApplicants", b => + { + b.Property("ClubId"); + + b.Property("UserId"); + + b.HasKey("ClubId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("ClubApplicants"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubBans", b => + { + b.Property("ClubId"); + + b.Property("UserId"); + + b.HasKey("ClubId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("ClubBans"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("Discrim"); + + b.Property("ImageUrl"); + + b.Property("MinimumLevelReq"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(20); + + b.Property("OwnerId"); + + b.Property("Xp"); + + b.HasKey("Id"); + + b.HasAlternateKey("Name", "Discrim"); + + b.HasIndex("OwnerId") + .IsUnique(); + + b.ToTable("Clubs"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandAlias", b => { b.Property("Id") @@ -396,10 +457,18 @@ namespace NadekoBot.Migrations b.Property("AvatarId"); + b.Property("ClubId"); + b.Property("DateAdded"); b.Property("Discriminator"); + b.Property("LastLevelUp") + .ValueGeneratedOnAdd() + .HasDefaultValue(new DateTime(2017, 9, 9, 1, 7, 29, 857, DateTimeKind.Local)); + + b.Property("NotifyOnLevelUp"); + b.Property("UserId"); b.Property("Username"); @@ -408,6 +477,8 @@ namespace NadekoBot.Migrations b.HasAlternateKey("UserId"); + b.HasIndex("ClubId"); + b.ToTable("DiscordUser"); }); @@ -1282,11 +1353,17 @@ namespace NadekoBot.Migrations b.Property("Id") .ValueGeneratedOnAdd(); + b.Property("AwardedXp"); + b.Property("DateAdded"); b.Property("GuildId"); - b.Property("NotifyOnLevelUp"); + b.Property("LastLevelUp") + .ValueGeneratedOnAdd() + .HasDefaultValue(new DateTime(2017, 9, 9, 1, 7, 29, 858, DateTimeKind.Local)); + + b.Property("NotifyOnLevelUp"); b.Property("UserId"); @@ -1456,6 +1533,8 @@ namespace NadekoBot.Migrations b.HasKey("Id"); + b.HasAlternateKey("Level"); + b.HasIndex("XpSettingsId"); b.ToTable("XpRoleReward"); @@ -1533,6 +1612,40 @@ namespace NadekoBot.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubApplicants", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ClubInfo", "Club") + .WithMany("Applicants") + .HasForeignKey("ClubId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubBans", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ClubInfo", "Club") + .WithMany("Bans") + .HasForeignKey("ClubId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Owner") + .WithOne() + .HasForeignKey("NadekoBot.Services.Database.Models.ClubInfo", "OwnerId") + .OnDelete(DeleteBehavior.Cascade); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandAlias", b => { b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") @@ -1554,6 +1667,13 @@ namespace NadekoBot.Migrations .HasForeignKey("BotConfigId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.DiscordUser", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ClubInfo", "Club") + .WithMany("Users") + .HasForeignKey("ClubId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") diff --git a/src/NadekoBot/Migrations/20170908230730_xp-and-clubs.cs b/src/NadekoBot/Migrations/20170908230730_xp-and-clubs.cs new file mode 100644 index 00000000..aad21131 --- /dev/null +++ b/src/NadekoBot/Migrations/20170908230730_xp-and-clubs.cs @@ -0,0 +1,296 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class xpandclubs : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "XpMinutesTimeout", + table: "BotConfig", + nullable: false, + defaultValue: 5) + .Annotation("Sqlite:Autoincrement", true); + + migrationBuilder.AddColumn( + name: "XpPerMessage", + table: "BotConfig", + nullable: false, + defaultValue: 3) + .Annotation("Sqlite:Autoincrement", true); + + migrationBuilder.CreateTable( + name: "Clubs", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + Discrim = table.Column(nullable: false), + ImageUrl = table.Column(nullable: true), + MinimumLevelReq = table.Column(nullable: false), + Name = table.Column(maxLength: 20, nullable: false), + OwnerId = table.Column(nullable: false), + Xp = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Clubs", x => x.Id); + table.UniqueConstraint("AK_Clubs_Name_Discrim", x => new { x.Name, x.Discrim }); + table.ForeignKey( + name: "FK_Clubs_DiscordUser_OwnerId", + column: x => x.OwnerId, + principalTable: "DiscordUser", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.Sql(MigrationQueries.UserClub); + + migrationBuilder.AddColumn( + name: "LastLevelUp", + table: "DiscordUser", + nullable: false, + defaultValue: DateTime.UtcNow); + + migrationBuilder.AddColumn( + name: "NotifyOnLevelUp", + table: "DiscordUser", + nullable: false, + defaultValue: 0); + + migrationBuilder.CreateTable( + name: "UserXpStats", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + AwardedXp = table.Column(nullable: false), + DateAdded = table.Column(nullable: true), + GuildId = table.Column(nullable: false), + LastLevelUp = table.Column(nullable: false, defaultValue: new DateTime(2017, 9, 9, 1, 7, 29, 858, DateTimeKind.Local)), + NotifyOnLevelUp = table.Column(nullable: false), + UserId = table.Column(nullable: false), + Xp = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserXpStats", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "XpSettings", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + GuildConfigId = table.Column(nullable: false), + NotifyMessage = table.Column(nullable: true), + ServerExcluded = table.Column(nullable: false), + XpRoleRewardExclusive = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_XpSettings", x => x.Id); + table.ForeignKey( + name: "FK_XpSettings_GuildConfigs_GuildConfigId", + column: x => x.GuildConfigId, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ClubApplicants", + columns: table => new + { + ClubId = table.Column(nullable: false), + UserId = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ClubApplicants", x => new { x.ClubId, x.UserId }); + table.ForeignKey( + name: "FK_ClubApplicants_Clubs_ClubId", + column: x => x.ClubId, + principalTable: "Clubs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ClubApplicants_DiscordUser_UserId", + column: x => x.UserId, + principalTable: "DiscordUser", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ClubBans", + columns: table => new + { + ClubId = table.Column(nullable: false), + UserId = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ClubBans", x => new { x.ClubId, x.UserId }); + table.ForeignKey( + name: "FK_ClubBans_Clubs_ClubId", + column: x => x.ClubId, + principalTable: "Clubs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ClubBans_DiscordUser_UserId", + column: x => x.UserId, + principalTable: "DiscordUser", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ExcludedItem", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + ItemId = table.Column(nullable: false), + ItemType = table.Column(nullable: false), + XpSettingsId = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ExcludedItem", x => x.Id); + table.ForeignKey( + name: "FK_ExcludedItem_XpSettings_XpSettingsId", + column: x => x.XpSettingsId, + principalTable: "XpSettings", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "XpRoleReward", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + Level = table.Column(nullable: false), + RoleId = table.Column(nullable: false), + XpSettingsId = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_XpRoleReward", x => x.Id); + table.UniqueConstraint("AK_XpRoleReward_Level", x => x.Level); + table.ForeignKey( + name: "FK_XpRoleReward_XpSettings_XpSettingsId", + column: x => x.XpSettingsId, + principalTable: "XpSettings", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_DiscordUser_ClubId", + table: "DiscordUser", + column: "ClubId"); + + migrationBuilder.CreateIndex( + name: "IX_ClubApplicants_UserId", + table: "ClubApplicants", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_ClubBans_UserId", + table: "ClubBans", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_Clubs_OwnerId", + table: "Clubs", + column: "OwnerId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ExcludedItem_XpSettingsId", + table: "ExcludedItem", + column: "XpSettingsId"); + + migrationBuilder.CreateIndex( + name: "IX_UserXpStats_UserId_GuildId", + table: "UserXpStats", + columns: new[] { "UserId", "GuildId" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_XpRoleReward_XpSettingsId", + table: "XpRoleReward", + column: "XpSettingsId"); + + migrationBuilder.CreateIndex( + name: "IX_XpSettings_GuildConfigId", + table: "XpSettings", + column: "GuildConfigId", + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_DiscordUser_Clubs_ClubId", + table: "DiscordUser"); + + migrationBuilder.DropTable( + name: "ClubApplicants"); + + migrationBuilder.DropTable( + name: "ClubBans"); + + migrationBuilder.DropTable( + name: "ExcludedItem"); + + migrationBuilder.DropTable( + name: "UserXpStats"); + + migrationBuilder.DropTable( + name: "XpRoleReward"); + + migrationBuilder.DropTable( + name: "Clubs"); + + migrationBuilder.DropTable( + name: "XpSettings"); + + migrationBuilder.DropIndex( + name: "IX_DiscordUser_ClubId", + table: "DiscordUser"); + + migrationBuilder.DropColumn( + name: "ClubId", + table: "DiscordUser"); + + migrationBuilder.DropColumn( + name: "LastLevelUp", + table: "DiscordUser"); + + migrationBuilder.DropColumn( + name: "NotifyOnLevelUp", + table: "DiscordUser"); + + migrationBuilder.DropColumn( + name: "XpMinutesTimeout", + table: "BotConfig"); + + migrationBuilder.DropColumn( + name: "XpPerMessage", + table: "BotConfig"); + } + } +} diff --git a/src/NadekoBot/Migrations/MigrationQueries.cs b/src/NadekoBot/Migrations/MigrationQueries.cs new file mode 100644 index 00000000..201f0c34 --- /dev/null +++ b/src/NadekoBot/Migrations/MigrationQueries.cs @@ -0,0 +1,38 @@ +namespace NadekoBot.Migrations +{ + internal class MigrationQueries + { + public static string UserClub { get; } = @" +CREATE TABLE DiscordUser_tmp( + Id INTEGER PRIMARY KEY, + AvatarId TEXT, + Discriminator TEXT, + UserId INTEGER UNIQUE NOT NULL, + DateAdded TEXT, + Username TEXT +); + +INSERT INTO DiscordUser_tmp + SELECT Id, AvatarId, Discriminator, UserId, DateAdded, Username + FROM DiscordUser; + +DROP TABLE DiscordUser; + +CREATE TABLE DiscordUser( + Id INTEGER PRIMARY KEY, + AvatarId TEXT, + Discriminator TEXT, + UserId INTEGER UNIQUE NOT NULL, + DateAdded TEXT, + Username TEXT, + ClubId INTEGER, + CONSTRAINT FK_DiscordUser_Clubs_ClubId FOREIGN KEY(ClubId) REFERENCES Clubs(Id) ON DELETE RESTRICT +); + +INSERT INTO DiscordUser + SELECT Id, AvatarId, Discriminator, UserId, DateAdded, Username, NULL + FROM DiscordUser_tmp; + +DROP TABLE DiscordUser_tmp;"; + } +} \ No newline at end of file diff --git a/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs b/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs index 3ebfeafa..da931d6b 100644 --- a/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs +++ b/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs @@ -183,9 +183,13 @@ namespace NadekoBot.Migrations b.Property("TriviaCurrencyReward"); - b.Property("XpMinutesTimeout"); + b.Property("XpMinutesTimeout") + .ValueGeneratedOnAdd() + .HasDefaultValue(5); - b.Property("XpPerMessage"); + b.Property("XpPerMessage") + .ValueGeneratedOnAdd() + .HasDefaultValue(3); b.HasKey("Id"); @@ -242,6 +246,63 @@ namespace NadekoBot.Migrations b.ToTable("ClashOfClans"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubApplicants", b => + { + b.Property("ClubId"); + + b.Property("UserId"); + + b.HasKey("ClubId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("ClubApplicants"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubBans", b => + { + b.Property("ClubId"); + + b.Property("UserId"); + + b.HasKey("ClubId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("ClubBans"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("Discrim"); + + b.Property("ImageUrl"); + + b.Property("MinimumLevelReq"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(20); + + b.Property("OwnerId"); + + b.Property("Xp"); + + b.HasKey("Id"); + + b.HasAlternateKey("Name", "Discrim"); + + b.HasIndex("OwnerId") + .IsUnique(); + + b.ToTable("Clubs"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandAlias", b => { b.Property("Id") @@ -395,10 +456,18 @@ namespace NadekoBot.Migrations b.Property("AvatarId"); + b.Property("ClubId"); + b.Property("DateAdded"); b.Property("Discriminator"); + b.Property("LastLevelUp") + .ValueGeneratedOnAdd() + .HasDefaultValue(new DateTime(2017, 9, 9, 1, 7, 29, 857, DateTimeKind.Local)); + + b.Property("NotifyOnLevelUp"); + b.Property("UserId"); b.Property("Username"); @@ -407,6 +476,8 @@ namespace NadekoBot.Migrations b.HasAlternateKey("UserId"); + b.HasIndex("ClubId"); + b.ToTable("DiscordUser"); }); @@ -1281,11 +1352,17 @@ namespace NadekoBot.Migrations b.Property("Id") .ValueGeneratedOnAdd(); + b.Property("AwardedXp"); + b.Property("DateAdded"); b.Property("GuildId"); - b.Property("NotifyOnLevelUp"); + b.Property("LastLevelUp") + .ValueGeneratedOnAdd() + .HasDefaultValue(new DateTime(2017, 9, 9, 1, 7, 29, 858, DateTimeKind.Local)); + + b.Property("NotifyOnLevelUp"); b.Property("UserId"); @@ -1455,6 +1532,8 @@ namespace NadekoBot.Migrations b.HasKey("Id"); + b.HasAlternateKey("Level"); + b.HasIndex("XpSettingsId"); b.ToTable("XpRoleReward"); @@ -1532,6 +1611,40 @@ namespace NadekoBot.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubApplicants", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ClubInfo", "Club") + .WithMany("Applicants") + .HasForeignKey("ClubId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubBans", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ClubInfo", "Club") + .WithMany("Bans") + .HasForeignKey("ClubId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClubInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Owner") + .WithOne() + .HasForeignKey("NadekoBot.Services.Database.Models.ClubInfo", "OwnerId") + .OnDelete(DeleteBehavior.Cascade); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandAlias", b => { b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") @@ -1553,6 +1666,13 @@ namespace NadekoBot.Migrations .HasForeignKey("BotConfigId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.DiscordUser", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ClubInfo", "Club") + .WithMany("Users") + .HasForeignKey("ClubId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") diff --git a/src/NadekoBot/Modules/Administration/MigrationCommands.cs b/src/NadekoBot/Modules/Administration/MigrationCommands.cs index 1228690a..5c9b4a70 100644 --- a/src/NadekoBot/Modules/Administration/MigrationCommands.cs +++ b/src/NadekoBot/Modules/Administration/MigrationCommands.cs @@ -352,54 +352,6 @@ namespace NadekoBot.Modules.Administration oldConfig.RotatingStatuses.ForEach(i => messages.Add(new PlayingStatus { Status = i })); botConfig.RotatingStatusMessages = messages; - //Prefix - botConfig.ModulePrefixes.Clear(); - botConfig.ModulePrefixes.AddRange(new HashSet - { - new ModulePrefix() - { - ModuleName = "Administration", - Prefix = oldConfig.CommandPrefixes.Administration - }, - new ModulePrefix() - { - ModuleName = "Searches", - Prefix = oldConfig.CommandPrefixes.Searches - }, - new ModulePrefix() {ModuleName = "NSFW", Prefix = oldConfig.CommandPrefixes.NSFW}, - new ModulePrefix() - { - ModuleName = "Conversations", - Prefix = oldConfig.CommandPrefixes.Conversations - }, - new ModulePrefix() - { - ModuleName = "ClashOfClans", - Prefix = oldConfig.CommandPrefixes.ClashOfClans - }, - new ModulePrefix() {ModuleName = "Help", Prefix = oldConfig.CommandPrefixes.Help}, - new ModulePrefix() {ModuleName = "Music", Prefix = oldConfig.CommandPrefixes.Music}, - new ModulePrefix() {ModuleName = "Trello", Prefix = oldConfig.CommandPrefixes.Trello}, - new ModulePrefix() {ModuleName = "Games", Prefix = oldConfig.CommandPrefixes.Games}, - new ModulePrefix() - { - ModuleName = "Gambling", - Prefix = oldConfig.CommandPrefixes.Gambling - }, - new ModulePrefix() - { - ModuleName = "Permissions", - Prefix = oldConfig.CommandPrefixes.Permissions - }, - new ModulePrefix() - { - ModuleName = "Programming", - Prefix = oldConfig.CommandPrefixes.Programming - }, - new ModulePrefix() {ModuleName = "Pokemon", Prefix = oldConfig.CommandPrefixes.Pokemon}, - new ModulePrefix() {ModuleName = "Utility", Prefix = oldConfig.CommandPrefixes.Utility} - }); - //Blacklist var blacklist = new HashSet(oldConfig.ServerBlacklist.Select(server => new BlacklistItem() { ItemId = server, Type = BlacklistType.Server })); blacklist.AddRange(oldConfig.ChannelBlacklist.Select(channel => new BlacklistItem() { ItemId = channel, Type = BlacklistType.Channel })); diff --git a/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs b/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs index b466b158..9867dbcb 100644 --- a/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs +++ b/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs @@ -153,7 +153,7 @@ namespace NadekoBot.Modules.CustomReactions if (Context.Guild == null) // its a private one, just send back await Context.Channel.SendFileAsync(txtStream, "customreactions.txt", GetText("list_all")).ConfigureAwait(false); else - await ((IGuildUser)Context.User).SendFileAsync(txtStream, "customreactions.txt", GetText("list_all")).ConfigureAwait(false); + await ((IGuildUser)Context.User).SendFileAsync(txtStream, "customreactions.txt", GetText("list_all"), false).ConfigureAwait(false); } [NadekoCommand, Usage, Description, Aliases] diff --git a/src/NadekoBot/Modules/Gambling/WaifuClaimCommands.cs b/src/NadekoBot/Modules/Gambling/WaifuClaimCommands.cs index 3019155e..5d46f976 100644 --- a/src/NadekoBot/Modules/Gambling/WaifuClaimCommands.cs +++ b/src/NadekoBot/Modules/Gambling/WaifuClaimCommands.cs @@ -48,8 +48,8 @@ namespace NadekoBot.Modules.Gambling [Group] public class WaifuClaimCommands : NadekoSubmodule { - private static ConcurrentDictionary divorceCooldowns { get; } = new ConcurrentDictionary(); - private static ConcurrentDictionary affinityCooldowns { get; } = new ConcurrentDictionary(); + private static ConcurrentDictionary _divorceCooldowns { get; } = new ConcurrentDictionary(); + private static ConcurrentDictionary _affinityCooldowns { get; } = new ConcurrentDictionary(); enum WaifuClaimResult { @@ -219,7 +219,7 @@ namespace NadekoBot.Modules.Gambling var now = DateTime.UtcNow; if (w?.Claimer == null || w.Claimer.UserId != Context.User.Id) result = DivorceResult.NotYourWife; - else if (divorceCooldowns.AddOrUpdate(Context.User.Id, + else if (_divorceCooldowns.AddOrUpdate(Context.User.Id, now, (key, old) => ((difference = now.Subtract(old)) > _divorceLimit) ? now : old) != now) { @@ -303,7 +303,7 @@ namespace NadekoBot.Modules.Gambling if (w?.Affinity?.UserId == u?.Id) { } - else if (affinityCooldowns.AddOrUpdate(Context.User.Id, + else if (_affinityCooldowns.AddOrUpdate(Context.User.Id, now, (key, old) => ((difference = now.Subtract(old)) > _affinityLimit) ? now : old) != now) { @@ -459,7 +459,7 @@ namespace NadekoBot.Modules.Gambling .AddField(efb => efb.WithName(GetText("likes")).WithValue(w.Affinity?.ToString() ?? nobody).WithIsInline(true)) .AddField(efb => efb.WithName(GetText("changes_of_heart")).WithValue($"{affInfo.Count} - \"the {affInfo.Title}\"").WithIsInline(true)) .AddField(efb => efb.WithName(GetText("divorces")).WithValue(divorces.ToString()).WithIsInline(true)) - .AddField(efb => efb.WithName(GetText("gifts")).WithValue(!w.Items.Any() ? "-" : string.Join("\n", w.Items.OrderBy(x => x.Price).GroupBy(x => x.ItemEmoji).Select(x => $"{x.Key} x{x.Count()}"))).WithIsInline(true)) + .AddField(efb => efb.WithName(GetText("gifts")).WithValue(!w.Items.Any() ? "-" : string.Join("\n", w.Items.OrderBy(x => x.Price).GroupBy(x => x.ItemEmoji).Select(x => $"{x.Key} x{x.Count()}"))).WithIsInline(false)) .AddField(efb => efb.WithName($"Waifus ({claims.Count})").WithValue(claims.Count == 0 ? nobody : string.Join("\n", claims.OrderBy(x => rng.Next()).Take(30).Select(x => x.Waifu))).WithIsInline(false)); await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); diff --git a/src/NadekoBot/Modules/Games/Games.cs b/src/NadekoBot/Modules/Games/Games.cs index b1db0acd..811a1a1f 100644 --- a/src/NadekoBot/Modules/Games/Games.cs +++ b/src/NadekoBot/Modules/Games/Games.cs @@ -11,7 +11,7 @@ using NadekoBot.Modules.Games.Services; namespace NadekoBot.Modules.Games { - /*todo more games + /* more games - Blackjack - Shiritori - Simple RPG adventure diff --git a/src/NadekoBot/Modules/NSFW/NSFW.cs b/src/NadekoBot/Modules/NSFW/NSFW.cs index 81daf9c6..522713dd 100644 --- a/src/NadekoBot/Modules/NSFW/NSFW.cs +++ b/src/NadekoBot/Modules/NSFW/NSFW.cs @@ -15,6 +15,7 @@ using NadekoBot.Modules.Searches.Common; using NadekoBot.Modules.Searches.Services; using NadekoBot.Modules.NSFW.Exceptions; +//todo static httpclient namespace NadekoBot.Modules.NSFW { public class NSFW : NadekoTopLevelModule diff --git a/src/NadekoBot/Modules/Searches/LoLCommands.cs b/src/NadekoBot/Modules/Searches/LoLCommands.cs index 78b6928c..39c86636 100644 --- a/src/NadekoBot/Modules/Searches/LoLCommands.cs +++ b/src/NadekoBot/Modules/Searches/LoLCommands.cs @@ -10,7 +10,6 @@ using System.Threading.Tasks; using NadekoBot.Common; using NadekoBot.Common.Attributes; -//todo 50 drawing namespace NadekoBot.Modules.Searches { public partial class Searches @@ -66,320 +65,4 @@ namespace NadekoBot.Modules.Searches } } } -} - -// private class CachedChampion -// { -// public System.IO.Stream ImageStream { get; set; } -// public DateTime AddedAt { get; set; } -// public string Name { get; set; } -// } - -// -// private static Dictionary CachedChampionImages = new Dictionary(); - -// private System.Timers.Timer clearTimer { get; } = new System.Timers.Timer(); -// public LoLCommands(DiscordModule module) : base(module) -// { -// clearTimer.Interval = new TimeSpan(0, 10, 0).TotalMilliseconds; -// clearTimer.Start(); -// clearTimer.Elapsed += (s, e) => -// { -// try -// { -// CachedChampionImages = CachedChampionImages -// .Where(kvp => DateTime.UtcNow - kvp.Value.AddedAt > new TimeSpan(1, 0, 0)) -// .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); -// } -// catch { } -// }; -// } - -// public Func DoFunc() -// { -// throw new NotImplementedException(); -// } - -// private class MatchupModel -// { -// public int Games { get; set; } -// public float WinRate { get; set; } -// [Newtonsoft.Json.JsonProperty("key")] -// public string Name { get; set; } -// public float StatScore { get; set; } -// } - -// public override void Init(CommandGroupBuilder cgb) -// { -// cgb.CreateCommand(Module.Name + "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`") -// .Parameter("champ", ParameterType.Required) -// .Parameter("position", ParameterType.Unparsed) -// .Do(async e => -// { -// try -// { -// //get role -// var role = ResolvePos(position); -// var resolvedRole = role; -// var name = champ.Replace(" ", "").ToLower(); -// CachedChampion champ = null; - -// if (CachedChampionImages.TryGetValue(name + "_" + resolvedRole, out champ)) -// if (champ != null) -// { -// champ.ImageStream.Position = 0; -// await e.Channel.SendFile("champ.png", champ.ImageStream).ConfigureAwait(false); -// return; -// } -// var allData = JArray.Parse(await Classes.http.GetStringAsync($"http://api.champion.gg/champion/{name}?api_key={_creds.LOLAPIKey}").ConfigureAwait(false)); -// JToken data = null; -// if (role != null) -// { -// for (var i = 0; i < allData.Count; i++) -// { -// if (allData[i]["role"].ToString().Equals(role)) -// { -// data = allData[i]; -// break; -// } -// } -// if (data == null) -// { -// await channel.SendMessageAsync("💢 Data for that role does not exist.").ConfigureAwait(false); -// return; -// } -// } -// else -// { -// data = allData[0]; -// role = allData[0]["role"].ToString(); -// resolvedRole = ResolvePos(role); -// } -// if (CachedChampionImages.TryGetValue(name + "_" + resolvedRole, out champ)) -// if (champ != null) -// { -// champ.ImageStream.Position = 0; -// await e.Channel.SendFile("champ.png", champ.ImageStream).ConfigureAwait(false); -// return; -// } -// //name = data["title"].ToString(); -// // get all possible roles, and "select" the shown one -// var roles = new string[allData.Count]; -// for (var i = 0; i < allData.Count; i++) -// { -// roles[i] = allData[i]["role"].ToString(); -// if (roles[i] == role) -// roles[i] = ">" + roles[i] + "<"; -// } -// var general = JArray.Parse(await http.GetStringAsync($"http://api.champion.gg/stats/" + -// $"champs/{name}?api_key={_creds.LOLAPIKey}") -// .ConfigureAwait(false)) -// .FirstOrDefault(jt => jt["role"].ToString() == role)?["general"]; -// if (general == null) -// { -// return; -// } -// //get build data for this role -// var buildData = data["items"]["mostGames"]["items"]; -// var items = new string[6]; -// for (var i = 0; i < 6; i++) -// { -// items[i] = buildData[i]["id"].ToString(); -// } - -// //get matchup data to show counters and countered champions -// var matchupDataIE = data["matchups"].ToObject>(); - -// var matchupData = matchupDataIE.OrderBy(m => m.StatScore).ToArray(); - -// var countered = new[] { matchupData[0].Name, matchupData[1].Name, matchupData[2].Name }; -// var counters = new[] { matchupData[matchupData.Length - 1].Name, matchupData[matchupData.Length - 2].Name, matchupData[matchupData.Length - 3].Name }; - -// //get runes data -// var runesJArray = data["runes"]["mostGames"]["runes"] as JArray; -// var runes = string.Join("\n", runesJArray.OrderBy(jt => int.Parse(jt["number"].ToString())).Select(jt => jt["number"].ToString() + "x" + jt["name"])); - -// // get masteries data - -// var masteries = (data["masteries"]["mostGames"]["masteries"] as JArray); - -// //get skill order data - -// var orderArr = (data["skills"]["mostGames"]["order"] as JArray); - -// var img = Image.FromFile("data/lol/bg.png"); -// using (var g = Graphics.FromImage(img)) -// { -// g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; -// //g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; -// const int margin = 5; -// const int imageSize = 75; -// var normalFont = new Font("Monaco", 8, FontStyle.Regular); -// var smallFont = new Font("Monaco", 7, FontStyle.Regular); -// //draw champ image -// var champName = data["key"].ToString().Replace(" ", ""); - -// g.DrawImage(GetImage(champName), new Rectangle(margin, margin, imageSize, imageSize)); -// //draw champ name -// if (champName == "MonkeyKing") -// champName = "Wukong"; -// g.DrawString($"{champName}", new Font("Times New Roman", 24, FontStyle.Regular), Brushes.WhiteSmoke, margin + imageSize + margin, margin); -// //draw champ surname - -// //draw skill order -// if (orderArr.Count != 0) -// { -// float orderFormula = 120 / orderArr.Count; -// const float orderVerticalSpacing = 10; -// for (var i = 0; i < orderArr.Count; i++) -// { -// var orderX = margin + margin + imageSize + orderFormula * i + i; -// float orderY = margin + 35; -// var spellName = orderArr[i].ToString().ToLowerInvariant(); - -// switch (spellName) -// { -// case "w": -// orderY += orderVerticalSpacing; -// break; -// case "e": -// orderY += orderVerticalSpacing * 2; -// break; -// case "r": -// orderY += orderVerticalSpacing * 3; -// break; -// default: -// break; -// } - -// g.DrawString(spellName.ToUpperInvariant(), new Font("Monaco", 7), Brushes.LimeGreen, orderX, orderY); -// } -// } -// //draw roles -// g.DrawString("Roles: " + string.Join(", ", roles), normalFont, Brushes.WhiteSmoke, margin, margin + imageSize + margin); - -// //draw average stats -// g.DrawString( -//$@" Average Stats - -//Kills: {general["kills"]} CS: {general["minionsKilled"]} -//Deaths: {general["deaths"]} Win: {general["winPercent"]}% -//Assists: {general["assists"]} Ban: {general["banRate"]}% -//", normalFont, Brushes.WhiteSmoke, img.Width - 150, margin); -// //draw masteries -// g.DrawString($"Masteries: {string.Join(" / ", masteries?.Select(jt => jt["total"]))}", normalFont, Brushes.WhiteSmoke, margin, margin + imageSize + margin + 20); -// //draw runes -// g.DrawString($"{runes}", smallFont, Brushes.WhiteSmoke, margin, margin + imageSize + margin + 40); -// //draw counters -// g.DrawString($"Best against", smallFont, Brushes.WhiteSmoke, margin, img.Height - imageSize + margin); -// var smallImgSize = 50; - -// for (var i = 0; i < counters.Length; i++) -// { -// g.DrawImage(GetImage(counters[i]), -// new Rectangle(i * (smallImgSize + margin) + margin, img.Height - smallImgSize - margin, -// smallImgSize, -// smallImgSize)); -// } -// //draw countered by -// g.DrawString($"Worst against", smallFont, Brushes.WhiteSmoke, img.Width - 3 * (smallImgSize + margin), img.Height - imageSize + margin); - -// for (var i = 0; i < countered.Length; i++) -// { -// var j = countered.Length - i; -// g.DrawImage(GetImage(countered[i]), -// new Rectangle(img.Width - (j * (smallImgSize + margin) + margin), img.Height - smallImgSize - margin, -// smallImgSize, -// smallImgSize)); -// } -// //draw item build -// g.DrawString("Popular build", normalFont, Brushes.WhiteSmoke, img.Width - (3 * (smallImgSize + margin) + margin), 77); - -// for (var i = 0; i < 6; i++) -// { -// var inverseI = 5 - i; -// var j = inverseI % 3 + 1; -// var k = inverseI / 3; -// g.DrawImage(GetImage(items[i], GetImageType.Item), -// new Rectangle(img.Width - (j * (smallImgSize + margin) + margin), 92 + k * (smallImgSize + margin), -// smallImgSize, -// smallImgSize)); -// } -// } -// var cachedChamp = new CachedChampion { AddedAt = DateTime.UtcNow, ImageStream = img.ToStream(System.Drawing.Imaging.ImageFormat.Png), Name = name.ToLower() + "_" + resolvedRole }; -// CachedChampionImages.Add(cachedChamp.Name, cachedChamp); -// await e.Channel.SendFile(data["title"] + "_stats.png", cachedChamp.ImageStream).ConfigureAwait(false); -// } -// catch (Exception ex) -// { -// await channel.SendMessageAsync("💢 Failed retreiving data for that champion.").ConfigureAwait(false); -// } -// }); -// } - -// private enum GetImageType -// { -// Champion, -// Item -// } -// private static Image GetImage(string id, GetImageType imageType = GetImageType.Champion) -// { -// try -// { -// switch (imageType) -// { -// case GetImageType.Champion: -// return Image.FromFile($"data/lol/champions/{id}.png"); -// case GetImageType.Item: -// default: -// return Image.FromFile($"data/lol/items/{id}.png"); -// } -// } -// catch (Exception) -// { -// return Image.FromFile("data/lol/_ERROR.png"); -// } -// } - -// private static string ResolvePos(string pos) -// { -// if (string.IsNullOrWhiteSpace(pos)) -// return null; -// switch (pos.ToLowerInvariant()) -// { -// case "m": -// case "mid": -// case "midorfeed": -// case "midd": -// case "middle": -// return "Middle"; -// case "top": -// case "topp": -// case "t": -// case "toporfeed": -// return "Top"; -// case "j": -// case "jun": -// case "jungl": -// case "jungle": -// return "Jungle"; -// case "a": -// case "ad": -// case "adc": -// case "carry": -// case "ad carry": -// case "adcarry": -// case "c": -// return "ADC"; -// case "s": -// case "sup": -// case "supp": -// case "support": -// return "Support"; -// default: -// return pos; -// } -// } -// } -//} +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Searches/TranslatorCommands.cs b/src/NadekoBot/Modules/Searches/TranslatorCommands.cs index 5084e2f3..9f4960fe 100644 --- a/src/NadekoBot/Modules/Searches/TranslatorCommands.cs +++ b/src/NadekoBot/Modules/Searches/TranslatorCommands.cs @@ -38,6 +38,27 @@ namespace NadekoBot.Modules.Searches } } + //[NadekoCommand, Usage, Description, Aliases] + //[OwnerOnly] + //public async Task Obfuscate([Remainder] string txt) + //{ + // var lastItem = "en"; + // foreach (var item in _google.Languages.Except(new[] { "en" }).Where(x => x.Length < 4)) + // { + // var txt2 = await _searches.Translate(lastItem + ">" + item, txt); + // await Context.Channel.EmbedAsync(new EmbedBuilder() + // .WithOkColor() + // .WithTitle(lastItem + ">" + item) + // .AddField("Input", txt) + // .AddField("Output", txt2)); + // txt = txt2; + // await Task.Delay(500); + // lastItem = item; + // } + // txt = await _searches.Translate(lastItem + ">en", txt); + // await Context.Channel.SendConfirmAsync("Final output:\n\n" + txt); + //} + public enum AutoDeleteAutoTranslate { Del, diff --git a/src/NadekoBot/Modules/Utility/Services/StreamRoleService.cs b/src/NadekoBot/Modules/Utility/Services/StreamRoleService.cs index 81018a77..98f34eaf 100644 --- a/src/NadekoBot/Modules/Utility/Services/StreamRoleService.cs +++ b/src/NadekoBot/Modules/Utility/Services/StreamRoleService.cs @@ -207,7 +207,7 @@ namespace NadekoBot.Modules.Utility.Services if (guildSettings.TryRemove(guild.Id, out var setting) && cleanup) await RescanUsers(guild).ConfigureAwait(false); } - //todo multiple rescans at the same time? + private async Task RescanUser(IGuildUser user, StreamRoleSettings setting, IRole addRole = null) { if (user.Game.HasValue && diff --git a/src/NadekoBot/Modules/Utility/Utility.cs b/src/NadekoBot/Modules/Utility/Utility.cs index 5ee6de70..d3f0e112 100644 --- a/src/NadekoBot/Modules/Utility/Utility.cs +++ b/src/NadekoBot/Modules/Utility/Utility.cs @@ -417,7 +417,7 @@ namespace NadekoBot.Modules.Utility }) }); await Context.User.SendFileAsync( - await JsonConvert.SerializeObject(grouping, Formatting.Indented).ToStream().ConfigureAwait(false), title, title).ConfigureAwait(false); + await JsonConvert.SerializeObject(grouping, Formatting.Indented).ToStream().ConfigureAwait(false), title, title, false).ConfigureAwait(false); } [NadekoCommand, Usage, Description, Aliases] public async Task Ping() diff --git a/src/NadekoBot/Modules/Xp/Club.cs b/src/NadekoBot/Modules/Xp/Club.cs new file mode 100644 index 00000000..a911ab4f --- /dev/null +++ b/src/NadekoBot/Modules/Xp/Club.cs @@ -0,0 +1,311 @@ +using Discord; +using Discord.Commands; +using Discord.WebSocket; +using NadekoBot.Common.Attributes; +using NadekoBot.Extensions; +using NadekoBot.Modules.Xp.Common; +using NadekoBot.Modules.Xp.Services; +using NadekoBot.Services.Database.Models; +using System; +using System.Linq; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Xp +{ + public partial class Xp + { + [Group] + public class Club : NadekoSubmodule + { + private readonly XpService _xps; + private readonly DiscordSocketClient _client; + + public Club(XpService xps, DiscordSocketClient client) + { + _xps = xps; + _client = client; + } + + [NadekoCommand, Usage, Description, Aliases] + public async Task ClubCreate([Remainder]string clubName) + { + if (string.IsNullOrWhiteSpace(clubName) || clubName.Length > 20) + return; + + if (!_service.CreateClub(Context.User, clubName, out ClubInfo club)) + { + await ReplyErrorLocalized("club_create_error").ConfigureAwait(false); + return; + } + + await ReplyConfirmLocalized("club_created", Format.Bold(club.ToString())).ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + public Task ClubIcon([Remainder]string url = null) + { + if ((!Uri.IsWellFormedUriString(url, UriKind.Absolute) && url != null) + || !_service.SetClubIcon(Context.User.Id, url)) + { + return ReplyErrorLocalized("club_icon_error"); + } + + return ReplyConfirmLocalized("club_icon_set"); + } + + [NadekoCommand, Usage, Description, Aliases] + [Priority(1)] + public async Task ClubInformation(IUser user = null) + { + user = user ?? Context.User; + var club = _service.GetClubByMember(user); + if (club == null) + { + await ReplyErrorLocalized("club_not_exists").ConfigureAwait(false); + return; + } + + await ClubInformation(club.ToString()).ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [Priority(0)] + public async Task ClubInformation([Remainder]string clubName = null) + { + if (string.IsNullOrWhiteSpace(clubName)) + { + await ClubInformation(Context.User).ConfigureAwait(false); + return; + } + + ClubInfo club; + if (!_service.GetClubByName(clubName, out club)) + { + await ReplyErrorLocalized("club_not_exists").ConfigureAwait(false); + return; + } + + var lvl = new LevelStats(club.Xp); + + await Context.Channel.SendPaginatedConfirmAsync(_client, 0, (page) => + { + var embed = new EmbedBuilder() + .WithOkColor() + .WithTitle($"{club.ToString()}") + .WithDescription(GetText("level_x", lvl.Level) + $" ({club.Xp} xp)") + .AddField("Owner", club.Owner.ToString(), true) + .AddField("Level Req.", club.MinimumLevelReq.ToString(), true) + .AddField("Members", string.Join("\n", club.Users + .Skip(page * 10) + .Take(10)), false); + + if (Uri.IsWellFormedUriString(club.ImageUrl, UriKind.Absolute)) + return embed.WithThumbnailUrl(club.ImageUrl); + + return embed; + }, club.Users.Count / 10); + } + + [NadekoCommand, Usage, Description, Aliases] + public Task ClubBans(int page = 1) + { + if (--page < 0) + return Task.CompletedTask; + + var club = _service.GetBansAndApplications(Context.User.Id); + if (club == null) + return ReplyErrorLocalized("club_not_exists"); + + var bans = club + .Bans + .Select(x => x.User) + .ToArray(); + + return Context.Channel.SendPaginatedConfirmAsync(_client, page, + curPage => + { + var toShow = string.Join("\n", bans + .Skip(page * 10) + .Take(10) + .Select(x => x.ToString())); + + return new EmbedBuilder() + .WithTitle(GetText("club_bans_for", club.ToString())) + .WithDescription(toShow); + + }, bans.Length / 10); + } + + + [NadekoCommand, Usage, Description, Aliases] + public Task ClubApps(int page = 1) + { + if (--page < 0) + return Task.CompletedTask; + + var club = _service.GetBansAndApplications(Context.User.Id); + if (club == null) + return ReplyErrorLocalized("club_not_exists"); + + var bans = club + .Applicants + .Select(x => x.User) + .ToArray(); + + return Context.Channel.SendPaginatedConfirmAsync(_client, page, + curPage => + { + var toShow = string.Join("\n", bans + .Skip(page * 10) + .Take(10) + .Select(x => x.ToString())); + + return new EmbedBuilder() + .WithTitle(GetText("club_apps_for", club.ToString())) + .WithDescription(toShow); + + }, bans.Length / 10); + } + + [NadekoCommand, Usage, Description, Aliases] + public async Task ClubApply([Remainder]string clubName) + { + if (string.IsNullOrWhiteSpace(clubName)) + return; + + if (!_service.GetClubByName(clubName, out ClubInfo club)) + { + await ReplyErrorLocalized("club_not_exists").ConfigureAwait(false); + return; + } + + if (_service.ApplyToClub(Context.User, club)) + { + await ReplyConfirmLocalized("club_applied", Format.Bold(club.ToString())).ConfigureAwait(false); + } + else + { + await ReplyErrorLocalized("club_apply_error").ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + [Priority(1)] + public Task ClubAccept(IUser user) + => ClubAccept(user.ToString()); + + [NadekoCommand, Usage, Description, Aliases] + [Priority(0)] + public async Task ClubAccept([Remainder]string userName) + { + if (_service.AcceptApplication(Context.User.Id, userName, out var discordUser)) + { + await ReplyConfirmLocalized("club_accepted", Format.Bold(discordUser.ToString())).ConfigureAwait(false); + } + else + await ReplyErrorLocalized("club_accept_error").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + public async Task Clubleave() + { + if (_service.LeaveClub(Context.User)) + await ReplyConfirmLocalized("club_left").ConfigureAwait(false); + else + await ReplyErrorLocalized("club_not_in_club").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [Priority(1)] + public Task ClubKick([Remainder]IUser user) + => ClubKick(user.ToString()); + + [NadekoCommand, Usage, Description, Aliases] + [Priority(0)] + public Task ClubKick([Remainder]string userName) + { + if (_service.Kick(Context.User.Id, userName, out var club)) + return ReplyConfirmLocalized("club_user_kick", Format.Bold(userName), Format.Bold(club.ToString())); + else + return ReplyErrorLocalized("club_user_kick_fail"); + } + + [NadekoCommand, Usage, Description, Aliases] + [Priority(1)] + public Task ClubBan([Remainder]IUser user) + => ClubBan(user.ToString()); + + [NadekoCommand, Usage, Description, Aliases] + [Priority(0)] + public Task ClubBan([Remainder]string userName) + { + if (_service.Ban(Context.User.Id, userName, out var club)) + return ReplyConfirmLocalized("club_user_banned", Format.Bold(userName), Format.Bold(club.ToString())); + else + return ReplyErrorLocalized("club_user_ban_fail"); + } + + [NadekoCommand, Usage, Description, Aliases] + [Priority(1)] + public Task ClubUnBan([Remainder]IUser user) + => ClubUnBan(user.ToString()); + + [NadekoCommand, Usage, Description, Aliases] + [Priority(0)] + public Task ClubUnBan([Remainder]string userName) + { + if (_service.UnBan(Context.User.Id, userName, out var club)) + return ReplyConfirmLocalized("club_user_unbanned", Format.Bold(userName), Format.Bold(club.ToString())); + else + return ReplyErrorLocalized("club_user_unban_fail"); + } + + [NadekoCommand, Usage, Description, Aliases] + public async Task ClubLevelReq(int level) + { + if (_service.ChangeClubLevelReq(Context.User.Id, level)) + { + await ReplyConfirmLocalized("club_level_req_changed", Format.Bold(level.ToString())).ConfigureAwait(false); + } + else + { + await ReplyErrorLocalized("club_level_req_change_error").ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + public async Task ClubDisband() + { + if (_service.Disband(Context.User.Id, out ClubInfo club)) + { + await ReplyConfirmLocalized("club_disbanded", Format.Bold(club.ToString())).ConfigureAwait(false); + } + else + { + await ReplyErrorLocalized("club_disaband_error").ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + public Task ClubLeaderboard(int page = 1) + { + if (--page < 0) + return Task.CompletedTask; + + var clubs = _service.GetClubLeaderboardPage(page); + + var embed = new EmbedBuilder() + .WithTitle(GetText("club_leaderboard", page + 1)) + .WithOkColor(); + + var i = page * 9; + foreach (var club in clubs) + { + embed.AddField($"#{++i} " + club.ToString(), club.Xp.ToString() + " xp", false); + } + + return Context.Channel.EmbedAsync(embed); + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Xp/Common/FullUserStats.cs b/src/NadekoBot/Modules/Xp/Common/FullUserStats.cs new file mode 100644 index 00000000..11f38648 --- /dev/null +++ b/src/NadekoBot/Modules/Xp/Common/FullUserStats.cs @@ -0,0 +1,26 @@ +using NadekoBot.Services.Database.Models; + +namespace NadekoBot.Modules.Xp.Common +{ + public class FullUserStats + { + public DiscordUser User { get; } + public UserXpStats FullGuildStats { get; } + public LevelStats Global { get; } + public LevelStats Guild { get; } + public int GlobalRanking { get; } + public int GuildRanking { get; } + + public FullUserStats(DiscordUser usr, + UserXpStats fullGuildStats, LevelStats global, + LevelStats guild, int globalRanking, int guildRanking) + { + this.User = usr; + this.Global = global; + this.Guild = guild; + this.GlobalRanking = globalRanking; + this.GuildRanking = guildRanking; + this.FullGuildStats = fullGuildStats; + } + } +} diff --git a/src/NadekoBot/Modules/Xp/Common/LevelStats.cs b/src/NadekoBot/Modules/Xp/Common/LevelStats.cs new file mode 100644 index 00000000..11dfc8c7 --- /dev/null +++ b/src/NadekoBot/Modules/Xp/Common/LevelStats.cs @@ -0,0 +1,43 @@ +using NadekoBot.Modules.Xp.Services; +using System; + +namespace NadekoBot.Modules.Xp.Common +{ + public class LevelStats + { + public int Level { get; } + public int LevelXp { get; } + public int RequiredXp { get; } + public int TotalXp { get; } + + public LevelStats(int xp) + { + if (xp < 0) + xp = 0; + + TotalXp = xp; + + const int baseXp = XpService.XP_REQUIRED_LVL_1; + + var required = baseXp; + var totalXp = 0; + var lvl = 1; + while (true) + { + required = (int)(baseXp + baseXp / 4.0 * (lvl - 1)); + + if (required + totalXp > xp) + break; + + totalXp += required; + lvl++; + } + + Level = lvl - 1; + LevelXp = xp - totalXp; + RequiredXp = required; + } + + public static LevelStats FromXp(int xp) => new LevelStats(xp); + } +} diff --git a/src/NadekoBot/Modules/Xp/Services/ClubService.cs b/src/NadekoBot/Modules/Xp/Services/ClubService.cs new file mode 100644 index 00000000..f8d08f66 --- /dev/null +++ b/src/NadekoBot/Modules/Xp/Services/ClubService.cs @@ -0,0 +1,312 @@ +using NadekoBot.Services; +using System; +using NadekoBot.Services.Database.Models; +using Discord; +using NadekoBot.Modules.Xp.Common; +using System.Linq; +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; + +namespace NadekoBot.Modules.Xp.Services +{ + public class ClubService : INService + { + private readonly DbService _db; + + public ClubService(DbService db) + { + _db = db; + } + + public bool CreateClub(IUser user, string clubName, out ClubInfo club) + { + //must be lvl 5 and must not be in a club already + + club = null; + using (var uow = _db.UnitOfWork) + { + var du = uow.DiscordUsers.GetOrCreate(user); + uow._context.SaveChanges(); + var xp = new LevelStats(uow.Xp.GetTotalUserXp(user.Id)); + + if (xp.Level >= 5 && du.Club == null) + { + du.Club = new ClubInfo() + { + Name = clubName, + Discrim = uow.Clubs.GetNextDiscrim(clubName), + Owner = du, + }; + uow.Clubs.Add(du.Club); + uow._context.SaveChanges(); + } + else + return false; + + uow._context.Set() + .RemoveRange(uow._context.Set().Where(x => x.UserId == du.Id)); + club = du.Club; + uow.Complete(); + } + + return true; + } + + public ClubInfo GetClubByMember(IUser user) + { + using (var uow = _db.UnitOfWork) + { + return uow.Clubs.GetByMember(user.Id); + } + } + + public bool SetClubIcon(ulong ownerUserId, string url) + { + using (var uow = _db.UnitOfWork) + { + var club = uow.Clubs.GetByOwner(ownerUserId, set => set); + + if (club == null) + return false; + + club.ImageUrl = url; + uow.Complete(); + } + + return true; + } + + public bool GetClubByName(string clubName, out ClubInfo club) + { + club = null; + var arr = clubName.Split('#'); + if (arr.Length < 2 || !int.TryParse(arr[arr.Length - 1], out var discrim)) + return false; + + //incase club has # in it + var name = string.Concat(arr.Except(new[] { arr[arr.Length - 1] })); + + if (string.IsNullOrWhiteSpace(name)) + return false; + + using (var uow = _db.UnitOfWork) + { + club = uow.Clubs.GetByName(name.Trim().ToLowerInvariant(), discrim); + if (club == null) + return false; + else + return true; + } + } + + public bool ApplyToClub(IUser user, ClubInfo club) + { + using (var uow = _db.UnitOfWork) + { + var du = uow.DiscordUsers.GetOrCreate(user); + uow._context.SaveChanges(); + + if (du.Club != null + || new LevelStats(uow.Xp.GetTotalUserXp(user.Id)).Level < club.MinimumLevelReq + || club.Bans.Any(x => x.UserId == du.Id) + || club.Applicants.Any(x => x.UserId == du.Id)) + { + //user banned or a member of a club, or already applied, + // or doesn't min minumum level requirement, can't apply + return false; + } + + var app = new ClubApplicants + { + ClubId = club.Id, + UserId = du.Id, + }; + + uow._context.Set().Add(app); + + uow.Complete(); + } + return true; + } + + public bool AcceptApplication(ulong clubOwnerUserId, string userName, out DiscordUser discordUser) + { + discordUser = null; + using (var uow = _db.UnitOfWork) + { + var club = uow.Clubs.GetByOwner(clubOwnerUserId, + set => set.Include(x => x.Applicants) + .ThenInclude(x => x.Club) + .Include(x => x.Applicants) + .ThenInclude(x => x.User)); + if (club == null) + return false; + + var applicant = club.Applicants.FirstOrDefault(x => x.User.ToString().ToLowerInvariant() == userName.ToLowerInvariant()); + if (applicant == null) + return false; + + applicant.User.Club = club; + club.Applicants.Remove(applicant); + + //remove that user's all other applications + uow._context.Set() + .RemoveRange(uow._context.Set().Where(x => x.UserId == applicant.User.Id)); + + discordUser = applicant.User; + uow.Complete(); + } + return true; + } + + public ClubInfo GetBansAndApplications(ulong ownerUserId) + { + using (var uow = _db.UnitOfWork) + { + return uow.Clubs.GetByOwner(ownerUserId, + x => x.Include(y => y.Bans) + .ThenInclude(y => y.User) + .Include(y => y.Applicants) + .ThenInclude(y => y.User)); + } + } + + public bool LeaveClub(IUser user) + { + using (var uow = _db.UnitOfWork) + { + var du = uow.DiscordUsers.GetOrCreate(user); + if (du.Club == null || du.Club.OwnerId == du.Id) + return false; + + du.Club = null; + uow.Complete(); + } + return true; + } + + public bool ChangeClubLevelReq(ulong userId, int level) + { + if (level < 5) + return false; + + using (var uow = _db.UnitOfWork) + { + var club = uow.Clubs.GetByOwner(userId); + if (club == null) + return false; + + club.MinimumLevelReq = level; + uow.Complete(); + } + + return true; + } + + public bool Disband(ulong userId, out ClubInfo club) + { + using (var uow = _db.UnitOfWork) + { + club = uow.Clubs.GetByOwner(userId); + if (club == null) + return false; + + uow.Clubs.Remove(club); + uow.Complete(); + } + return true; + } + + public bool Ban(ulong ownerUserId, string userName, out ClubInfo club) + { + using (var uow = _db.UnitOfWork) + { + club = uow.Clubs.GetByOwner(ownerUserId, + set => set.Include(x => x.Applicants) + .ThenInclude(x => x.User)); + if (club == null) + return false; + + var usr = club.Users.FirstOrDefault(x => x.ToString().ToLowerInvariant() == userName.ToLowerInvariant()) + ?? club.Applicants.FirstOrDefault(x => x.User.ToString().ToLowerInvariant() == userName.ToLowerInvariant())?.User; + if (usr == null) + return false; + + if (club.OwnerId == usr.Id) // can't ban the owner kek, whew + return false; + + club.Bans.Add(new ClubBans + { + Club = club, + User = usr, + }); + club.Users.Remove(usr); + + var app = club.Applicants.FirstOrDefault(x => x.UserId == usr.Id); + if (app != null) + club.Applicants.Remove(app); + + uow.Complete(); + } + + return true; + } + + public bool UnBan(ulong ownerUserId, string userName, out ClubInfo club) + { + using (var uow = _db.UnitOfWork) + { + club = uow.Clubs.GetByOwner(ownerUserId, + set => set.Include(x => x.Bans) + .ThenInclude(x => x.User)); + if (club == null) + return false; + + var ban = club.Bans.FirstOrDefault(x => x.User.ToString().ToLowerInvariant() == userName.ToLowerInvariant()); + if (ban == null) + return false; + + club.Bans.Remove(ban); + uow.Complete(); + } + + return true; + } + + public bool Kick(ulong ownerUserId, string userName, out ClubInfo club) + { + using (var uow = _db.UnitOfWork) + { + club = uow.Clubs.GetByOwner(ownerUserId); + if (club == null) + return false; + + var usr = club.Users.FirstOrDefault(x => x.ToString().ToLowerInvariant() == userName.ToLowerInvariant()); + if (usr == null) + return false; + + if (club.OwnerId == usr.Id) + return false; + + club.Users.Remove(usr); + var app = club.Applicants.FirstOrDefault(x => x.UserId == usr.Id); + if (app != null) + club.Applicants.Remove(app); + uow.Complete(); + } + + return true; + } + + public ClubInfo[] GetClubLeaderboardPage(int page) + { + if (page < 0) + throw new ArgumentOutOfRangeException(nameof(page)); + + using (var uow = _db.UnitOfWork) + { + return uow.Clubs.GetClubLeaderboardPage(page); + } + } + } +} diff --git a/src/NadekoBot/Modules/Xp/Services/UserCacheItem.cs b/src/NadekoBot/Modules/Xp/Services/UserCacheItem.cs index 4cebef92..d1a07c11 100644 --- a/src/NadekoBot/Modules/Xp/Services/UserCacheItem.cs +++ b/src/NadekoBot/Modules/Xp/Services/UserCacheItem.cs @@ -1,18 +1,21 @@ -namespace NadekoBot.Modules.Xp.Services +using Discord; + +namespace NadekoBot.Modules.Xp.Services { public class UserCacheItem { - public ulong UserId { get; set; } - public ulong GuildId { get; set; } + public IGuildUser User { get; set; } + public IGuild Guild { get; set; } + public IMessageChannel Channel { get; set; } public override int GetHashCode() { - return UserId.GetHashCode(); + return User.GetHashCode(); } public override bool Equals(object obj) { - return obj is UserCacheItem uci && uci.UserId == UserId; + return obj is UserCacheItem uci && uci.User == User; } } } diff --git a/src/NadekoBot/Modules/Xp/Services/XpService.cs b/src/NadekoBot/Modules/Xp/Services/XpService.cs index ccd3c6ed..52944064 100644 --- a/src/NadekoBot/Modules/Xp/Services/XpService.cs +++ b/src/NadekoBot/Modules/Xp/Services/XpService.cs @@ -1,8 +1,11 @@ using Discord; using Discord.WebSocket; using NadekoBot.Common.Collections; +using NadekoBot.Extensions; +using NadekoBot.Modules.Xp.Common; using NadekoBot.Services; using NadekoBot.Services.Database.Models; +using NadekoBot.Services.Impl; using NLog; using System; using System.Collections.Concurrent; @@ -10,57 +13,289 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using ImageSharp; +using Image = ImageSharp.Image; +using SixLabors.Fonts; +using System.IO; +using SixLabors.Primitives; +using System.Net.Http; +using SixLabors.Shapes; +using System.Numerics; +using ImageSharp.Drawing.Pens; +using ImageSharp.Drawing.Brushes; namespace NadekoBot.Modules.Xp.Services { public class XpService : INService { + private enum NotifOf { Server, Global } // is it a server level-up or global level-up notification + private readonly DbService _db; private readonly CommandHandler _cmd; private readonly IBotConfigProvider _bc; + private readonly IImagesService _images; private readonly Logger _log; + private readonly NadekoStrings _strings; + private readonly FontCollection _fonts = new FontCollection(); public const int XP_REQUIRED_LVL_1 = 36; - private readonly ConcurrentDictionary> _excludedRoles + private readonly ConcurrentDictionary> _excludedRoles = new ConcurrentDictionary>(); - private readonly ConcurrentDictionary> _excludedChannels + + private readonly ConcurrentDictionary> _excludedChannels = new ConcurrentDictionary>(); - private readonly ConcurrentHashSet _excludedServers = new ConcurrentHashSet(); - private readonly ConcurrentHashSet _rewardedUsers = new ConcurrentHashSet(); + private readonly ConcurrentHashSet _excludedServers + = new ConcurrentHashSet(); - private readonly ConcurrentQueue _addMessageXp = new ConcurrentQueue(); + private readonly ConcurrentHashSet _rewardedUsers + = new ConcurrentHashSet(); + + private readonly ConcurrentQueue _addMessageXp + = new ConcurrentQueue(); + + private readonly ConcurrentDictionary _imageStreams + = new ConcurrentDictionary(); private readonly Timer updateXpTimer; - private readonly Timer clearRewardedUsersTimer; + private readonly HttpClient http = new HttpClient(); + private FontFamily _usernameFontFamily; + private FontFamily _clubFontFamily; + private Font _levelFont; + private Font _xpFont; + private Font _awardedFont; + private Font _rankFont; + private Font _timeFont; - public XpService(CommandHandler cmd, IBotConfigProvider bc, - IEnumerable allGuildConfigs, DbService db) + public XpService(CommandHandler cmd, IBotConfigProvider bc, + IEnumerable allGuildConfigs, IImagesService images, + DbService db, NadekoStrings strings) { _db = db; _cmd = cmd; _bc = bc; + _images = images; _log = LogManager.GetCurrentClassLogger(); + _strings = strings; + + //todo 60 move to font provider or somethign + _fonts = new FontCollection(); + if (Directory.Exists("data/fonts")) + foreach (var file in Directory.GetFiles("data/fonts")) + { + _fonts.Install(file); + } + + InitializeFonts(); _cmd.OnMessageNoTrigger += _cmd_OnMessageNoTrigger; - updateXpTimer = new Timer(_ => + updateXpTimer = new Timer(async _ => { - using (var uow = _db.UnitOfWork) + try { + var toNotify = new List<(IMessageChannel MessageChannel, IUser User, int Level, XpNotificationType NotifyType, NotifOf NotifOf)>(); + var roleRewards = new Dictionary>(); + + var toAddTo = new List(); while (_addMessageXp.TryDequeue(out var usr)) + toAddTo.Add(usr); + + var group = toAddTo.GroupBy(x => (GuildId: x.Guild.Id, User: x.User)); + if (toAddTo.Count == 0) + return; + + _log.Info("Adding XP to {0} users.", toAddTo.Count); + + using (var uow = _db.UnitOfWork) { - var usrObj = uow.Xp.GetOrCreateUser(usr.GuildId, usr.UserId); - usrObj.Xp += _bc.BotConfig.XpPerMessage; + foreach (var item in group) + { + var xp = item.Select(x => bc.BotConfig.XpPerMessage).Sum(); + + var usr = uow.Xp.GetOrCreateUser(item.Key.GuildId, item.Key.User.Id); + var du = uow.DiscordUsers.GetOrCreate(item.Key.User); + + var globalXp = uow.Xp.GetTotalUserXp(item.Key.User.Id); + var oldGlobalLevelData = new LevelStats(globalXp); + var newGlobalLevelData = new LevelStats(globalXp + xp); + + var oldGuildLevelData = new LevelStats(usr.Xp + usr.AwardedXp); + usr.Xp += xp; + if (du.Club != null) + du.Club.Xp += xp; + var newGuildLevelData = new LevelStats(usr.Xp + usr.AwardedXp); + + if (oldGlobalLevelData.Level < newGlobalLevelData.Level) + { + du.LastLevelUp = DateTime.UtcNow; + var first = item.First(); + if (du.NotifyOnLevelUp != XpNotificationType.None) + toNotify.Add((first.Channel, first.User, newGlobalLevelData.Level, du.NotifyOnLevelUp, NotifOf.Global)); + } + + if (oldGuildLevelData.Level < newGuildLevelData.Level) + { + usr.LastLevelUp = DateTime.UtcNow; + //send level up notification + var first = item.First(); + if (usr.NotifyOnLevelUp != XpNotificationType.None) + toNotify.Add((first.Channel, first.User, newGuildLevelData.Level, usr.NotifyOnLevelUp, NotifOf.Server)); + + //give role + if (!roleRewards.TryGetValue(usr.GuildId, out var rewards)) + { + rewards = uow.GuildConfigs.XpSettingsFor(usr.GuildId).RoleRewards.ToList(); + roleRewards.Add(usr.GuildId, rewards); + } + + var rew = rewards.FirstOrDefault(x => x.Level == newGuildLevelData.Level); + if (rew != null) + { + var role = first.User.Guild.GetRole(rew.RoleId); + if (role != null) + { + var __ = first.User.AddRoleAsync(role); + } + } + } + } + + uow.Complete(); } - uow.Complete(); + + await Task.WhenAll(toNotify.Select(async x => + { + if (x.NotifOf == NotifOf.Server) + { + if (x.NotifyType == XpNotificationType.Dm) + { + var chan = await x.User.GetOrCreateDMChannelAsync().ConfigureAwait(false); + if (chan != null) + await chan.SendConfirmAsync(_strings.GetText("level_up_dm", + (x.MessageChannel as ITextChannel)?.GuildId, + "xp", + x.User.Mention, Format.Bold(x.Level.ToString()), + Format.Bold((x.MessageChannel as ITextChannel)?.Guild.ToString() ?? "-"))) + .ConfigureAwait(false); + } + else // channel + { + await x.MessageChannel.SendConfirmAsync(_strings.GetText("level_up_channel", + (x.MessageChannel as ITextChannel)?.GuildId, + "xp", + x.User.Mention, Format.Bold(x.Level.ToString()))) + .ConfigureAwait(false); + } + } + else + { + IMessageChannel chan; + if (x.NotifyType == XpNotificationType.Dm) + { + chan = await x.User.GetOrCreateDMChannelAsync().ConfigureAwait(false); + } + else // channel + { + chan = x.MessageChannel; + } + await chan.SendConfirmAsync(_strings.GetText("level_up_global", + (x.MessageChannel as ITextChannel)?.GuildId, + "xp", + x.User.Mention, Format.Bold(x.Level.ToString()))) + .ConfigureAwait(false); + } + })); + } + catch (Exception ex) + { + _log.Warn(ex); } }, null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5)); - clearRewardedUsersTimer = new Timer(_ => + var clearRewardTimer = Task.Run(async () => { - _rewardedUsers.Clear(); - }, null, TimeSpan.FromSeconds(bc.BotConfig.XpMinutesTimeout), TimeSpan.FromSeconds(bc.BotConfig.XpMinutesTimeout)); + while (true) + { + _rewardedUsers.Clear(); + + await Task.Delay(TimeSpan.FromMinutes(_bc.BotConfig.XpMinutesTimeout)); + } + }); + } + + public IEnumerable GetRoleRewards(ulong id) + { + using (var uow = _db.UnitOfWork) + { + return uow.GuildConfigs.XpSettingsFor(id) + .RoleRewards + .ToArray(); + } + } + + public void SetRoleReward(ulong guildId, int level, ulong? roleId) + { + using (var uow = _db.UnitOfWork) + { + var settings = uow.GuildConfigs.XpSettingsFor(guildId); + + if (roleId == null) + { + settings.RoleRewards.RemoveWhere(x => x.Level == level); + } + else + { + var rew = settings.RoleRewards.FirstOrDefault(x => x.Level == level); + + if (rew != null) + rew.RoleId = roleId.Value; + else + settings.RoleRewards.Add(new XpRoleReward() + { + Level = level, + RoleId = roleId.Value, + }); + } + + uow.Complete(); + } + } + + public UserXpStats[] GetUserXps(ulong guildId, int page) + { + using (var uow = _db.UnitOfWork) + { + return uow.Xp.GetUsersFor(guildId, page); + } + } + + public (ulong UserId, int TotalXp)[] GetUserXps(int page) + { + using (var uow = _db.UnitOfWork) + { + return uow.Xp.GetUsersFor(page); + } + } + + public async Task ChangeNotificationType(ulong userId, ulong guildId, XpNotificationType type) + { + using (var uow = _db.UnitOfWork) + { + var user = uow.Xp.GetOrCreateUser(guildId, userId); + user.NotifyOnLevelUp = type; + await uow.CompleteAsync().ConfigureAwait(false); + } + } + + public async Task ChangeNotificationType(IUser user, XpNotificationType type) + { + using (var uow = _db.UnitOfWork) + { + var du = uow.DiscordUsers.GetOrCreate(user); + du.NotifyOnLevelUp = type; + await uow.CompleteAsync().ConfigureAwait(false); + } } private Task _cmd_OnMessageNoTrigger(IUserMessage arg) @@ -84,12 +319,25 @@ namespace NadekoBot.Modules.Xp.Services user.Roles.Any(x => roles.Contains(x.Id))) return; - _log.Info("Adding {0} xp to {1} on {2} server", _bc.BotConfig.XpPerMessage, user.ToString(), user.Guild.Name); - _addMessageXp.Enqueue(new UserCacheItem { GuildId = user.Guild.Id, UserId = user.Id }); + if (!arg.Content.Contains(' ') && arg.Content.Length < 5) + return; + _addMessageXp.Enqueue(new UserCacheItem { Guild = user.Guild, Channel = arg.Channel, User = user }); }); return Task.CompletedTask; } + public void AddXp(ulong userId, ulong guildId, int amount) + { + using (var uow = _db.UnitOfWork) + { + var usr = uow.Xp.GetOrCreateUser(guildId, userId); + + usr.AwardedXp += amount; + + uow.Complete(); + } + } + public bool IsServerExcluded(ulong id) { return _excludedServers.Contains(id); @@ -116,25 +364,62 @@ namespace NadekoBot.Modules.Xp.Services return _rewardedUsers.Add(userId); } - public UserXpStats GetUserStats(ulong guildId, ulong userId) + public LevelStats GetGlobalUserStats(ulong userId) { - UserXpStats user; + int totalXp; using (var uow = _db.UnitOfWork) { - user = uow.Xp.GetOrCreateUser(guildId, userId); + totalXp = uow.Xp.GetTotalUserXp(userId); } - return user; + return new LevelStats(totalXp); } - public string GenerateXpBar(int currentXp, int requiredXp) + public FullUserStats GetUserStats(IGuildUser user) { - //todo - return $"{currentXp}/{requiredXp}"; + DiscordUser du; + UserXpStats stats; + int totalXp; + int globalRank; + int guildRank; + using (var uow = _db.UnitOfWork) + { + du = uow.DiscordUsers.GetOrCreate(user); + stats = uow.Xp.GetOrCreateUser(user.GuildId, user.Id); + totalXp = uow.Xp.GetTotalUserXp(user.Id); + globalRank = uow.Xp.GetUserGlobalRanking(user.Id); + guildRank = uow.Xp.GetUserGuildRanking(user.Id, user.GuildId); + } + + return new FullUserStats(du, + stats, + new LevelStats(totalXp), + new LevelStats(stats.Xp + stats.AwardedXp), + globalRank, + guildRank); } + public static (int Level, int LevelXp, int LevelRequiredXp) GetLevelData(UserXpStats stats) + { + var baseXp = XpService.XP_REQUIRED_LVL_1; + + var required = baseXp; + var totalXp = 0; + var lvl = 1; + while (true) + { + required = (int)(baseXp + baseXp / 4.0 * (lvl - 1)); + + if (required + totalXp > stats.Xp) + break; + + totalXp += required; + lvl++; + } + + return (lvl - 1, stats.Xp - totalXp, required); + } - //todo exclude in database public bool ToggleExcludeServer(ulong id) { using (var uow = _db.UnitOfWork) @@ -225,5 +510,222 @@ namespace NadekoBot.Modules.Xp.Services } } } + + public Task> GenerateImageAsync(IGuildUser user) + { + return GenerateImageAsync(GetUserStats(user)); + } + + private void InitializeFonts() + { + _usernameFontFamily = _fonts.Find("Whitney-Bold"); + _clubFontFamily = _fonts.Find("Whitney-Bold"); + _levelFont = _fonts.Find("Whitney-Bold").CreateFont(45); + _xpFont = _fonts.Find("Whitney-Bold").CreateFont(50); + _awardedFont = _fonts.Find("Whitney-Bold").CreateFont(25); + _rankFont = _fonts.Find("Uni Sans Thin CAPS").CreateFont(30); + _timeFont = _fonts.Find("Whitney-Bold").CreateFont(20); + } + + public async Task> GenerateImageAsync(FullUserStats stats) + { + var img = Image.Load(_images.XpCard.ToArray()); + + var username = stats.User.ToString(); + var usernameFont = _usernameFontFamily + .CreateFont(username.Length <= 6 + ? 50 + : 50 - username.Length); + + img.DrawText("@" + username, usernameFont, Rgba32.White, + new PointF(130, 5)); + + // level + + img.DrawText(stats.Global.Level.ToString(), _levelFont, Rgba32.White, + new PointF(47, 137)); + + img.DrawText(stats.Guild.Level.ToString(), _levelFont, Rgba32.White, + new PointF(47, 285)); + + //club name + + var clubName = stats.User.Club?.ToString() ?? "-"; + + var clubFont = _clubFontFamily + .CreateFont(clubName.Length <= 8 + ? 35 + : 35 - (clubName.Length / 2)); + + img.DrawText(clubName, clubFont, Rgba32.White, + new PointF(650 - clubName.Length * 10, 40)); + + var pen = new Pen(Rgba32.Black, 1); + var brush = Brushes.Solid(Rgba32.White); + var xpBgBrush = Brushes.Solid(new Rgba32(0, 0, 0, 0.4f)); + + var global = stats.Global; + var guild = stats.Guild; + + //xp bar + + img.FillPolygon(xpBgBrush, new[] { + new PointF(321, 104), + new PointF(321 + (450 * (global.LevelXp / (float)global.RequiredXp)), 104), + new PointF(286 + (450 * (global.LevelXp / (float)global.RequiredXp)), 235), + new PointF(286, 235), + }); + img.DrawText($"{global.LevelXp}/{global.RequiredXp}", _xpFont, brush, pen, + new PointF(430, 130)); + + img.FillPolygon(xpBgBrush, new[] { + new PointF(282, 248), + new PointF(282 + (450 * (guild.LevelXp / (float)guild.RequiredXp)), 248), + new PointF(247 + (450 * (guild.LevelXp / (float)guild.RequiredXp)), 379), + new PointF(247, 379), + }); + img.DrawText($"{guild.LevelXp}/{guild.RequiredXp}", _xpFont, brush, pen, + new PointF(400, 270)); + + if (stats.FullGuildStats.AwardedXp != 0) + { + var sign = stats.FullGuildStats.AwardedXp > 0 + ? "+ " + : ""; + img.DrawText($"({sign}{stats.FullGuildStats.AwardedXp})", _awardedFont, brush, pen, + new PointF(445 - (Math.Max(0, (stats.FullGuildStats.AwardedXp.ToString().Length - 2)) * 5), 335)); + } + + //ranking + + img.DrawText(stats.GlobalRanking.ToString(), _rankFont, Rgba32.White, + new PointF(148, 170)); + + img.DrawText(stats.GuildRanking.ToString(), _rankFont, Rgba32.White, + new PointF(148, 317)); + + //time on this level + + string GetTimeSpent(DateTime time) + { + var offset = DateTime.UtcNow - time; + return $"{offset.Days}d{offset.Hours}h{offset.Minutes}m"; + } + + img.DrawText(GetTimeSpent(stats.User.LastLevelUp), _timeFont, Rgba32.White, + new PointF(50, 197)); + + img.DrawText(GetTimeSpent(stats.FullGuildStats.LastLevelUp), _timeFont, Rgba32.White, + new PointF(50, 344)); + + //avatar + + if (stats.User.AvatarId != null) + { + try + { + var avatarUrl = stats.User.RealAvatarUrl(); + + byte[] s; + if (!_imageStreams.TryGetValue(avatarUrl, out s)) + { + using (var temp = await http.GetStreamAsync(avatarUrl)) + { + var tempDraw = Image.Load(temp); + tempDraw = tempDraw.Resize(69, 70); + ApplyRoundedCorners(tempDraw, 35); + s = tempDraw.ToStream().ToArray(); + } + + _imageStreams.AddOrUpdate(avatarUrl, s, (k, v) => s); + } + var toDraw = Image.Load(s); + + + img.DrawImage(toDraw, + 1, + new Size(69, 70), + new Point(32, 10)); + } + catch (Exception ex) + { + _log.Warn(ex); + } + } + + //club image + + if (!string.IsNullOrWhiteSpace(stats.User.Club?.ImageUrl)) + { + var imgUrl = stats.User.Club.ImageUrl; + try + { + byte[] s; + if (!_imageStreams.TryGetValue(imgUrl, out s)) + { + using (var temp = await http.GetStreamAsync(imgUrl)) + { + var tempDraw = Image.Load(temp); + tempDraw = tempDraw.Resize(45, 45); + ApplyRoundedCorners(tempDraw, 22.5f); + s = tempDraw.ToStream().ToArray(); + } + + _imageStreams.AddOrUpdate(imgUrl, s, (k, v) => s); + } + var toDraw = Image.Load(s); + + img.DrawImage(toDraw, + 1, + new Size(45, 45), + new Point(722, 25)); + } + catch (Exception ex) + { + _log.Warn(ex); + } + } + + var arr = img.ToStream().ToArray(); + + //_log.Info("{0:F2} KB", arr.Length * 1.0f / 1.KB()); + + return img; + } + + + // https://github.com/SixLabors/ImageSharp/tree/master/samples/AvatarWithRoundedCorner + public static void ApplyRoundedCorners(Image img, float cornerRadius) + { + var corners = BuildCorners(img.Width, img.Height, cornerRadius); + // now we have our corners time to draw them + img.Fill(Rgba32.Transparent, corners, new GraphicsOptions(true) + { + BlenderMode = ImageSharp.PixelFormats.PixelBlenderMode.Src // enforces that any part of this shape that has color is punched out of the background + }); + } + + public static IPathCollection BuildCorners(int imageWidth, int imageHeight, float cornerRadius) + { + // first create a square + var rect = new RectangularePolygon(-0.5f, -0.5f, cornerRadius, cornerRadius); + + // then cut out of the square a circle so we are left with a corner + var cornerToptLeft = rect.Clip(new EllipsePolygon(cornerRadius - 0.5f, cornerRadius - 0.5f, cornerRadius)); + + // corner is now a corner shape positions top left + //lets make 3 more positioned correctly, we can do that by translating the orgional around the center of the image + var center = new Vector2(imageWidth / 2, imageHeight / 2); + + float rightPos = imageWidth - cornerToptLeft.Bounds.Width + 1; + float bottomPos = imageHeight - cornerToptLeft.Bounds.Height + 1; + + // move it across the width of the image - the width of the shape + var cornerTopRight = cornerToptLeft.RotateDegree(90).Translate(rightPos, 0); + var cornerBottomLeft = cornerToptLeft.RotateDegree(-90).Translate(0, bottomPos); + var cornerBottomRight = cornerToptLeft.RotateDegree(180).Translate(rightPos, bottomPos); + + return new PathCollection(cornerToptLeft, cornerBottomLeft, cornerTopRight, cornerBottomRight); + } } } diff --git a/src/NadekoBot/Modules/Xp/Xp.cs b/src/NadekoBot/Modules/Xp/Xp.cs index 44b5b006..4362e06c 100644 --- a/src/NadekoBot/Modules/Xp/Xp.cs +++ b/src/NadekoBot/Modules/Xp/Xp.cs @@ -1,9 +1,12 @@ using Discord; using Discord.Commands; +using Discord.WebSocket; using NadekoBot.Common.Attributes; using NadekoBot.Extensions; -using NadekoBot.Modules.Xp.Extensions; +using NadekoBot.Modules.Xp.Common; using NadekoBot.Modules.Xp.Services; +using NadekoBot.Services.Database.Models; +using System.Diagnostics; using System.Linq; using System.Threading.Tasks; @@ -11,37 +14,94 @@ namespace NadekoBot.Modules.Xp { public partial class Xp : NadekoTopLevelModule { + private readonly DiscordSocketClient _client; + + public Xp(DiscordSocketClient client) + { + _client = client; + } + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task Experience(IUser user = null) + public async Task Experience([Remainder]IUser user = null) { user = user ?? Context.User; - await Task.Delay(64).ConfigureAwait(false); // wait a bit in case user got XP with this message - var stats = _service.GetUserStats(Context.Guild.Id, user.Id); - - var levelData = stats.GetLevelData(); - var xpBarStr = _service.GenerateXpBar(levelData.LevelXp, levelData.LevelRequiredXp); - - await Context.Channel.EmbedAsync(new EmbedBuilder() - .WithTitle(user.ToString()) - //.AddField(GetText("server_level"), stats.ServerLevel.ToString(), true) - .AddField(GetText("level"), levelData.Level.ToString(), true) - //.AddField(GetText("club"), stats.ClubName ?? "-", true) - .AddField(GetText("xp"), xpBarStr, false) - .WithOkColor()) + await Context.Channel.TriggerTypingAsync(); + var img = await _service.GenerateImageAsync((IGuildUser)user); + + await Context.Channel.SendFileAsync(img.ToStream(), $"{user.Id}_xp.png") .ConfigureAwait(false); } + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public Task XpRoleRewards(int page = 1) + { + page--; + + if (page < 0) + return Task.CompletedTask; + + var roles = _service.GetRoleRewards(Context.Guild.Id) + .OrderBy(x => x.Level) + .Skip(page * 9) + .Take(9); + + var embed = new EmbedBuilder() + .WithTitle(GetText("role_rewards")) + .WithOkColor(); + + if (!roles.Any()) + return Context.Channel.EmbedAsync(embed.WithDescription(GetText("no_role_rewards"))); + + foreach (var rolerew in roles) + { + var role = Context.Guild.GetRole(rolerew.RoleId); + + if (role == null) + continue; + + embed.AddField(GetText("level_x", Format.Bold(rolerew.Level.ToString())), role.ToString()); + } + return Context.Channel.EmbedAsync(embed); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireUserPermission(GuildPermission.ManageRoles)] + [RequireContext(ContextType.Guild)] + public async Task XpRoleReward(int level, [Remainder] IRole role = null) + { + if (level < 1) + return; + + _service.SetRoleReward(Context.Guild.Id, level, role?.Id); + + if(role == null) + await ReplyConfirmLocalized("role_reward_cleared", level).ConfigureAwait(false); + else + await ReplyConfirmLocalized("role_reward_added", level, Format.Bold(role.ToString())).ConfigureAwait(false); + } + + public enum NotifyPlace + { + Server = 0, + Guild = 0, + Global = 1, + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task XpNotify(NotifyPlace place = NotifyPlace.Guild, XpNotificationType type = XpNotificationType.Channel) + { + if (place == NotifyPlace.Guild) + await _service.ChangeNotificationType(Context.User.Id, Context.Guild.Id, type); + else + await _service.ChangeNotificationType(Context.User, type); + await Context.Channel.SendConfirmAsync("👌").ConfigureAwait(false); + } + public enum Server { Server }; - - //[NadekoCommand, Usage, Description, Aliases] - //[RequireContext(ContextType.Guild)] - //[OwnerOnly] - //[Priority(1)] - //public async Task XpExclude(Server _, IGuild guild) - //{ - //} [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] @@ -101,5 +161,91 @@ namespace NadekoBot.Modules.Xp await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public Task XpLeaderboard(int page = 1) + { + if (--page < 0) + return Task.CompletedTask; + + return Context.Channel.SendPaginatedConfirmAsync(_client, page, async (curPage) => + { + var users = _service.GetUserXps(Context.Guild.Id, curPage); + + var embed = new EmbedBuilder() + .WithTitle(GetText("server_leaderboard")) + .WithOkColor(); + + if (!users.Any()) + return embed.WithDescription("-"); + else + { + for (int i = 0; i < users.Length; i++) + { + var levelStats = LevelStats.FromXp(users[i].Xp + users[i].AwardedXp); + var user = await Context.Guild.GetUserAsync(users[i].UserId).ConfigureAwait(false); + + var userXpData = users[i]; + + var awardStr = ""; + if (userXpData.AwardedXp > 0) + awardStr = $"(+{userXpData.AwardedXp})"; + else if (userXpData.AwardedXp < 0) + awardStr = $"({userXpData.AwardedXp.ToString()})"; + + embed.AddField( + $"#{(i + 1 + curPage * 9)} {(user?.ToString() ?? users[i].UserId.ToString())}", + $"{GetText("level_x", levelStats.Level)} - {levelStats.TotalXp}xp {awardStr}"); + } + return embed; + } + }, addPaginatedFooter: false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task XpGlobalLeaderboard(int page = 1) + { + if (--page < 0) + return; + + await Context.Channel.SendPaginatedConfirmAsync(_client, page, async (curPage) => + { + var users = _service.GetUserXps(curPage); + + var embed = new EmbedBuilder() + .WithTitle(GetText("global_leaderboard")) + .WithOkColor(); + + if (!users.Any()) + return embed.WithDescription("-"); + else + { + for (int i = 0; i < users.Length; i++) + { + var user = await Context.Guild.GetUserAsync(users[i].UserId).ConfigureAwait(false); + embed.AddField( + $"#{(i + 1 + curPage * 9)} {(user?.ToString() ?? users[i].UserId.ToString())}", + $"{GetText("level_x", LevelStats.FromXp(users[i].TotalXp).Level)} - {users[i].TotalXp}xp"); + } + + return embed; + } + }, addPaginatedFooter: false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [RequireUserPermission(GuildPermission.Administrator)] + public async Task XpAdd(int amount, [Remainder] IGuildUser user) + { + if (amount == 0) + return; + + _service.AddXp(user.Id, Context.Guild.Id, amount); + + await ReplyConfirmLocalized("modified", Format.Bold(user.ToString()), Format.Bold(amount.ToString())).ConfigureAwait(false); + } } } diff --git a/src/NadekoBot/NadekoBot.csproj b/src/NadekoBot/NadekoBot.csproj index f18c711c..22abd80f 100644 --- a/src/NadekoBot/NadekoBot.csproj +++ b/src/NadekoBot/NadekoBot.csproj @@ -58,14 +58,14 @@ - + - - + + @@ -87,6 +87,14 @@ $(NoWarn);CS1573;CS1591 + + latest + + + + latest + + diff --git a/src/NadekoBot/Resources/CommandStrings.resx b/src/NadekoBot/Resources/CommandStrings.resx index 8493d383..81133fdc 100644 --- a/src/NadekoBot/Resources/CommandStrings.resx +++ b/src/NadekoBot/Resources/CommandStrings.resx @@ -3600,4 +3600,184 @@ Exclude a user or a role from the xp system, or whole current server. + + xpnotify xpn + + + `{0}xpn global dm` `{0}xpn server channel` + + + Sets how the bot should notify you when you get a `server` or `global` level. You can set `dm` (for the bot to send a direct message), `channel` (to get notified in the channel you sent the last message in) or `none` to disable. + + + xprolerewards xprrs + + + `{0}xprrs` + + + Shows currently set role rewards. + + + xprolereward xprr + + + `{0}xprr 3 Social` + + + Sets a role reward on a specified level. + + + xpleaderboard xplb + + + `{0}xplb` + + + Shows current server's xp leaderboard. + + + xpgleaderboard xpglb + + + `{0}xpglb` + + + Shows current server's xp leaderboard. + + + xpadd + + + `{0}xpadd 100 @b1nzy` + + + Adds xp to a user on the server. This does not affect their global ranking. You can use negative values. + + + clubcreate + + + `{0}clubcreate b1nzy's friends` + + + Creates a club. You must be atleast level 5 and not be in the club already. + + + clubinfo + + + `{0}clubinfo b1nzy's friends#123` + + + Shows information about the club. + + + clubapply + + + `{0}clubapply b1nzy's friends#123` + + + Apply to join a club. You must meet that club's minimum level requirement, and not be on its ban list. + + + clubaccept + + + `{0}clubaccept b1nzy#1337` + + + Apply to join a club. You must meet that club's minimum level requirement, and not be on its ban list. + + + clubleave + + + `{0}clubleave` + + + Leaves the club you're currently in. + + + clubdisband + + + `{0}clubdisband` + + + Disbands the club you're the owner of. This action is irreversible. + + + clubkick + + + `{0}clubkick b1nzy#1337` + + + Kicks the user from the club. You must be the club owner. They will be able to apply again. + + + clubban + + + `{0}clubban b1nzy#1337` + + + Bans the user from the club. You must be the club owner. They will not be able to apply again. + + + clubunban + + + `{0}clubunban b1nzy#1337` + + + Unbans the previously banned user from the club. You must be the club owner. + + + clublevelreq + + + `{0}clublevelreq 7` + + + Sets the club required level to apply to join the club. You must be club owner. You can't set this number below 5. + + + clubicon + + + `{0}clubicon https://i.imgur.com/htfDMfU.png` + + + Sets the club icon. + + + clubapps + + + `{0}clubapps 2` + + + Shows the list of users who have applied to your club. Paginated. You must be club owner to use this command. + + + clubbans + + + `{0}clubbans 2` + + + Shows the list of users who have banned from your club. Paginated. You must be club owner to use this command. + + + clublb + + + `{0}clublb 2` + + + Shows club rankings on the specified page. + diff --git a/src/NadekoBot/Services/CommandHandler.cs b/src/NadekoBot/Services/CommandHandler.cs index ad51c579..c06d14ab 100644 --- a/src/NadekoBot/Services/CommandHandler.cs +++ b/src/NadekoBot/Services/CommandHandler.cs @@ -39,7 +39,7 @@ namespace NadekoBot.Services public string DefaultPrefix { get; private set; } private ConcurrentDictionary _prefixes { get; } = new ConcurrentDictionary(); - private ImmutableArray> ownerChannels { get; set; } = new ImmutableArray>(); + private ImmutableArray> OwnerChannels { get; set; } = new ImmutableArray>(); public event Func CommandExecuted = delegate { return Task.CompletedTask; }; public event Func CommandErrored = delegate { return Task.CompletedTask; }; diff --git a/src/NadekoBot/Services/Database/IUnitOfWork.cs b/src/NadekoBot/Services/Database/IUnitOfWork.cs index fdd2eb0d..6b97a085 100644 --- a/src/NadekoBot/Services/Database/IUnitOfWork.cs +++ b/src/NadekoBot/Services/Database/IUnitOfWork.cs @@ -25,6 +25,7 @@ namespace NadekoBot.Services.Database IDiscordUserRepository DiscordUsers { get; } IWarningsRepository Warnings { get; } IXpRepository Xp { get; } + IClubRepository Clubs { get; } int Complete(); Task CompleteAsync(); diff --git a/src/NadekoBot/Services/Database/Models/ClubInfo.cs b/src/NadekoBot/Services/Database/Models/ClubInfo.cs new file mode 100644 index 00000000..68f68bc3 --- /dev/null +++ b/src/NadekoBot/Services/Database/Models/ClubInfo.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace NadekoBot.Services.Database.Models +{ + public class ClubInfo : DbEntity + { + [MaxLength(20)] + public string Name { get; set; } + public int Discrim { get; set; } + + public string ImageUrl { get; set; } = ""; + public int MinimumLevelReq { get; set; } = 5; + public int Xp { get; set; } = 0; + + public int OwnerId { get; set; } + public DiscordUser Owner { get; set; } + + public List Users { get; set; } = new List(); + + public List Applicants { get; set; } = new List(); + public List Bans { get; set; } = new List(); + + public override string ToString() + { + return Name + "#" + Discrim; + } + } + + public class ClubApplicants + { + public int ClubId { get; set; } + public ClubInfo Club { get; set; } + + public int UserId { get; set; } + public DiscordUser User { get; set; } + } + + public class ClubBans + { + public int ClubId { get; set; } + public ClubInfo Club { get; set; } + + public int UserId { get; set; } + public DiscordUser User { get; set; } + } +} diff --git a/src/NadekoBot/Services/Database/Models/DiscordUser.cs b/src/NadekoBot/Services/Database/Models/DiscordUser.cs index 86b84d5b..2ca8fc68 100644 --- a/src/NadekoBot/Services/Database/Models/DiscordUser.cs +++ b/src/NadekoBot/Services/Database/Models/DiscordUser.cs @@ -1,4 +1,6 @@ -namespace NadekoBot.Services.Database.Models +using System; + +namespace NadekoBot.Services.Database.Models { public class DiscordUser : DbEntity { @@ -6,6 +8,22 @@ public string Username { get; set; } public string Discriminator { get; set; } public string AvatarId { get; set; } + + public ClubInfo Club { get; set; } + public DateTime LastLevelUp { get; set; } = DateTime.UtcNow; + public XpNotificationType NotifyOnLevelUp { get; set; } + + public override bool Equals(object obj) + { + return obj is DiscordUser du + ? du.UserId == UserId + : false; + } + + public override int GetHashCode() + { + return UserId.GetHashCode(); + } public override string ToString() => Username + "#" + Discriminator; diff --git a/src/NadekoBot/Services/Database/Models/UserXpStats.cs b/src/NadekoBot/Services/Database/Models/UserXpStats.cs index 9c515ec2..8695298e 100644 --- a/src/NadekoBot/Services/Database/Models/UserXpStats.cs +++ b/src/NadekoBot/Services/Database/Models/UserXpStats.cs @@ -1,10 +1,16 @@ -namespace NadekoBot.Services.Database.Models +using System; + +namespace NadekoBot.Services.Database.Models { public class UserXpStats : DbEntity { public ulong UserId { get; set; } public ulong GuildId { get; set; } public int Xp { get; set; } - public bool NotifyOnLevelUp { get; set; } + public int AwardedXp { get; set; } + public XpNotificationType NotifyOnLevelUp { get; set; } + public DateTime LastLevelUp { get; set; } = DateTime.UtcNow; } + + public enum XpNotificationType { None, Dm, Channel } } diff --git a/src/NadekoBot/Services/Database/NadekoContext.cs b/src/NadekoBot/Services/Database/NadekoContext.cs index 5ae153d0..5c04c816 100644 --- a/src/NadekoBot/Services/Database/NadekoContext.cs +++ b/src/NadekoBot/Services/Database/NadekoContext.cs @@ -4,6 +4,7 @@ using System.Linq; using NadekoBot.Services.Database.Models; using NadekoBot.Extensions; using Microsoft.EntityFrameworkCore.Infrastructure; +using System; namespace NadekoBot.Services.Database { @@ -44,6 +45,7 @@ namespace NadekoBot.Services.Database public DbSet WaifuUpdates { get; set; } public DbSet Warnings { get; set; } public DbSet UserXpStats { get; set; } + public DbSet Clubs { get; set; } //logging public DbSet LogSettings { get; set; } @@ -71,24 +73,6 @@ namespace NadekoBot.Services.Database { var bc = new BotConfig(); - bc.ModulePrefixes.AddRange(new HashSet() - { - new ModulePrefix() { ModuleName = "Administration", Prefix = "." }, - new ModulePrefix() { ModuleName = "Searches", Prefix = "~" }, - new ModulePrefix() { ModuleName = "Translator", Prefix = "~" }, - new ModulePrefix() { ModuleName = "NSFW", Prefix = "~" }, - new ModulePrefix() { ModuleName = "ClashOfClans", Prefix = "," }, - new ModulePrefix() { ModuleName = "Help", Prefix = "-" }, - new ModulePrefix() { ModuleName = "Music", Prefix = "!!" }, - new ModulePrefix() { ModuleName = "Trello", Prefix = "trello" }, - new ModulePrefix() { ModuleName = "Games", Prefix = ">" }, - new ModulePrefix() { ModuleName = "Gambling", Prefix = "$" }, - new ModulePrefix() { ModuleName = "Permissions", Prefix = ";" }, - new ModulePrefix() { ModuleName = "Pokemon", Prefix = ">" }, - new ModulePrefix() { ModuleName = "Utility", Prefix = "." }, - new ModulePrefix() { ModuleName = "CustomReactions", Prefix = "." }, - new ModulePrefix() { ModuleName = "PokeGame", Prefix = ">" } - }); bc.RaceAnimals.AddRange(new HashSet { new RaceAnimal { Icon = "🐼", Name = "Panda" }, @@ -177,7 +161,14 @@ namespace NadekoBot.Services.Database #endregion #region BotConfig - //var botConfigEntity = modelBuilder.Entity(); + var botConfigEntity = modelBuilder.Entity(); + + botConfigEntity.Property(x => x.XpMinutesTimeout) + .HasDefaultValue(5); + + botConfigEntity.Property(x => x.XpPerMessage) + .HasDefaultValue(3); + //botConfigEntity // .HasMany(c => c.ModulePrefixes) // .WithOne(mp => mp.BotConfig) @@ -278,9 +269,19 @@ namespace NadekoBot.Services.Database // .WithOne(); // //.HasForeignKey(w => w.ClaimerId) // //.IsRequired(false); + #endregion + #region DiscordUser + var du = modelBuilder.Entity(); du.HasAlternateKey(w => w.UserId); + du.HasOne(x => x.Club) + .WithMany(x => x.Users) + .IsRequired(false); + + modelBuilder.Entity() + .Property(x => x.LastLevelUp) + .HasDefaultValue(DateTime.Now); #endregion @@ -294,10 +295,14 @@ namespace NadekoBot.Services.Database .IsUnique(); #endregion - #region XpStatas + #region XpStats modelBuilder.Entity() .HasIndex(x => new { x.UserId, x.GuildId }) .IsUnique(); + + modelBuilder.Entity() + .Property(x => x.LastLevelUp) + .HasDefaultValue(DateTime.Now); #endregion #region XpSettings @@ -305,6 +310,47 @@ namespace NadekoBot.Services.Database .HasOne(x => x.GuildConfig) .WithOne(x => x.XpSettings); #endregion + + #region XpRoleReward + modelBuilder.Entity() + .HasAlternateKey(x => x.Level); + #endregion + + #region Club + var ci = modelBuilder.Entity(); + ci.HasOne(x => x.Owner) + .WithOne() + .HasForeignKey(x => x.OwnerId); + + + ci.HasAlternateKey(x => new { x.Name, x.Discrim }); + #endregion + + #region ClubManytoMany + + modelBuilder.Entity() + .HasKey(t => new { t.ClubId, t.UserId }); + + modelBuilder.Entity() + .HasOne(pt => pt.User) + .WithMany(); + + modelBuilder.Entity() + .HasOne(pt => pt.Club) + .WithMany(x => x.Applicants); + + modelBuilder.Entity() + .HasKey(t => new { t.ClubId, t.UserId }); + + modelBuilder.Entity() + .HasOne(pt => pt.User) + .WithMany(); + + modelBuilder.Entity() + .HasOne(pt => pt.Club) + .WithMany(x => x.Bans); + + #endregion } } } diff --git a/src/NadekoBot/Services/Database/Repositories/IClubRepository.cs b/src/NadekoBot/Services/Database/Repositories/IClubRepository.cs new file mode 100644 index 00000000..086d638b --- /dev/null +++ b/src/NadekoBot/Services/Database/Repositories/IClubRepository.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; +using NadekoBot.Services.Database.Models; +using System; +using System.Linq; + +namespace NadekoBot.Services.Database.Repositories +{ + public interface IClubRepository : IRepository + { + int GetNextDiscrim(string clubName); + ClubInfo GetByName(string v, int discrim, Func, IQueryable> func = null); + ClubInfo GetByOwner(ulong userId, Func, IQueryable> func = null); + ClubInfo GetByMember(ulong userId, Func, IQueryable> func = null); + ClubInfo[] GetClubLeaderboardPage(int page); + } +} diff --git a/src/NadekoBot/Services/Database/Repositories/IXpRepository.cs b/src/NadekoBot/Services/Database/Repositories/IXpRepository.cs index 1973504a..667dd315 100644 --- a/src/NadekoBot/Services/Database/Repositories/IXpRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/IXpRepository.cs @@ -5,5 +5,10 @@ namespace NadekoBot.Services.Database.Repositories public interface IXpRepository : IRepository { UserXpStats GetOrCreateUser(ulong guildId, ulong userId); + int GetTotalUserXp(ulong userId); + UserXpStats[] GetUsersFor(ulong guildId, int page); + (ulong UserId, int TotalXp)[] GetUsersFor(int page); + int GetUserGlobalRanking(ulong userId); + int GetUserGuildRanking(ulong userId, ulong guildId); } } diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/BotConfigRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/BotConfigRepository.cs index dd329796..c21b1ff2 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/BotConfigRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/BotConfigRepository.cs @@ -20,7 +20,6 @@ namespace NadekoBot.Services.Database.Repositories.Impl .Include(bc => bc.RaceAnimals) .Include(bc => bc.Blacklist) .Include(bc => bc.EightBallResponses) - .Include(bc => bc.ModulePrefixes) .Include(bc => bc.StartupCommands) .Include(bc => bc.BlockedCommands) .Include(bc => bc.BlockedModules) diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/ClubRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/ClubRepository.cs new file mode 100644 index 00000000..21421bfa --- /dev/null +++ b/src/NadekoBot/Services/Database/Repositories/Impl/ClubRepository.cs @@ -0,0 +1,65 @@ +using NadekoBot.Services.Database.Models; +using System.Linq; +using Microsoft.EntityFrameworkCore; +using System; + +namespace NadekoBot.Services.Database.Repositories.Impl +{ + public class ClubRepository : Repository, IClubRepository + { + public ClubRepository(DbContext context) : base(context) + { + } + + public ClubInfo GetByOwner(ulong userId, Func, IQueryable> func = null) + { + if (func == null) + return _set + .Include(x => x.Bans) + .Include(x => x.Applicants) + .Include(x => x.Users) + .Include(x => x.Owner) + .FirstOrDefault(x => x.Owner.UserId == userId); + + return func(_set).FirstOrDefault(x => x.Owner.UserId == userId); + } + + public ClubInfo GetByName(string name, int discrim, Func, IQueryable> func = null) + { + if (func == null) + return _set + .Include(x => x.Bans) + .Include(x => x.Applicants) + .Include(x => x.Users) + .FirstOrDefault(x => x.Name.ToLowerInvariant() == name && x.Discrim == discrim); + + return func(_set).FirstOrDefault(x => x.Name == name && x.Discrim == discrim); + } + + public int GetNextDiscrim(string clubName) + { + return _set + .Where(x => x.Name.ToLowerInvariant() == clubName.ToLowerInvariant()) + .Max(x => x.Discrim) + 1; + } + + public ClubInfo GetByMember(ulong userId, Func, IQueryable> func = null) + { + if (func == null) + return _set.Include(x => x.Users) + .Include(x => x.Bans) + .Include(x => x.Applicants) + .FirstOrDefault(x => x.Users.Any(y => y.UserId == userId)); + + return func(_set).FirstOrDefault(x => x.Users.Any(y => y.UserId == userId)); + } + + public ClubInfo[] GetClubLeaderboardPage(int page) + { + return _set.OrderBy(x => x.Xp) + .Skip(page * 9) + .Take(9) + .ToArray(); + } + } +} diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/DiscordUserRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/DiscordUserRepository.cs index e61c2d0e..6fa22ebc 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/DiscordUserRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/DiscordUserRepository.cs @@ -15,7 +15,15 @@ namespace NadekoBot.Services.Database.Repositories.Impl { DiscordUser toReturn; - toReturn = _set.FirstOrDefault(u => u.UserId == original.Id); + toReturn = _set.Include(x => x.Club) + .FirstOrDefault(u => u.UserId == original.Id); + + if (toReturn != null) + { + toReturn.AvatarId = original.AvatarId; + toReturn.Username = original.Username; + toReturn.Discriminator = original.Discriminator; + } if (toReturn == null) _set.Add(toReturn = new DiscordUser() @@ -24,6 +32,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl Discriminator = original.Discriminator, UserId = original.Id, Username = original.Username, + Club = null, }); return toReturn; diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/XpRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/XpRepository.cs index 6326587d..ddd5a8e2 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/XpRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/XpRepository.cs @@ -2,6 +2,7 @@ using System.Linq; using Microsoft.EntityFrameworkCore; +//todo add pagination to .lb namespace NadekoBot.Services.Database.Repositories.Impl { public class XpRepository : Repository, IXpRepository @@ -12,7 +13,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl public UserXpStats GetOrCreateUser(ulong guildId, ulong userId) { - var usr = _set.FirstOrDefault(x => x.UserId == userId); + var usr = _set.FirstOrDefault(x => x.UserId == userId && x.GuildId == guildId); if (usr == null) { @@ -20,12 +21,57 @@ namespace NadekoBot.Services.Database.Repositories.Impl { Xp = 0, UserId = userId, - NotifyOnLevelUp = false, + NotifyOnLevelUp = XpNotificationType.None, GuildId = guildId, }); } return usr; } + + public int GetTotalUserXp(ulong userId) + { + return _set.Where(x => x.UserId == userId).Sum(x => x.Xp); + } + + public UserXpStats[] GetUsersFor(ulong guildId, int page) + { + return _set.Where(x => x.GuildId == guildId) + .OrderByDescending(x => x.Xp + x.AwardedXp) + .Skip(page * 9) + .Take(9) + .ToArray(); + } + + public int GetUserGlobalRanking(ulong userId) + { + return _set + .GroupBy(x => x.UserId) + .Count(x => x.Sum(y => y.Xp) > _set + .Where(y => y.UserId == userId) + .Sum(y => y.Xp)) + 1; + } + + public int GetUserGuildRanking(ulong userId, ulong guildId) + { + return _set + .Where(x => x.GuildId == guildId) + .Count(x => x.Xp > (_set + .Where(y => y.UserId == userId && y.GuildId == guildId) + .Sum(y => y.Xp))) + 1; + } + + public (ulong UserId, int TotalXp)[] GetUsersFor(int page) + { + return (from orduser in _set + group orduser by orduser.UserId into g + orderby g.Sum(x => x.Xp) descending + select new { UserId = g.Key, TotalXp = g.Sum(x => x.Xp) }) + .Skip(page * 9) + .Take(9) + .AsEnumerable() + .Select(x => (x.UserId, x.TotalXp)) + .ToArray(); + } } -} +} \ No newline at end of file diff --git a/src/NadekoBot/Services/Database/UnitOfWork.cs b/src/NadekoBot/Services/Database/UnitOfWork.cs index 3b450f86..27a43b13 100644 --- a/src/NadekoBot/Services/Database/UnitOfWork.cs +++ b/src/NadekoBot/Services/Database/UnitOfWork.cs @@ -60,6 +60,9 @@ namespace NadekoBot.Services.Database private IXpRepository _xp; public IXpRepository Xp => _xp ?? (_xp = new XpRepository(_context)); + private IClubRepository _clubs; + public IClubRepository Clubs => _clubs ?? (_clubs = new ClubRepository(_context)); + public UnitOfWork(NadekoContext context) { _context = context; diff --git a/src/NadekoBot/Services/DbService.cs b/src/NadekoBot/Services/DbService.cs index 6e9532ca..5bc9f6bf 100644 --- a/src/NadekoBot/Services/DbService.cs +++ b/src/NadekoBot/Services/DbService.cs @@ -1,11 +1,13 @@ using Microsoft.EntityFrameworkCore; using NadekoBot.Services.Database; +using System.Linq; namespace NadekoBot.Services { public class DbService { private readonly DbContextOptions options; + private readonly DbContextOptions migrateOptions; private readonly string _connectionString; @@ -15,25 +17,23 @@ namespace NadekoBot.Services var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseSqlite(creds.Db.ConnectionString); options = optionsBuilder.Options; - //switch (_creds.Db.Type.ToUpperInvariant()) - //{ - // case "SQLITE": - // dbType = typeof(NadekoSqliteContext); - // break; - // //case "SQLSERVER": - // // dbType = typeof(NadekoSqlServerContext); - // // break; - // default: - // break; - //} + optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseSqlite(creds.Db.ConnectionString, x => x.SuppressForeignKeyEnforcement()); + migrateOptions = optionsBuilder.Options; } public NadekoContext GetDbContext() { var context = new NadekoContext(options); + if (context.Database.GetPendingMigrations().Any()) + { + var mContext = new NadekoContext(migrateOptions); + mContext.Database.Migrate(); + mContext.SaveChanges(); + mContext.Dispose(); + } context.Database.SetCommandTimeout(60); - context.Database.Migrate(); context.EnsureSeedData(); //set important sqlite stuffs diff --git a/src/NadekoBot/Services/IImagesService.cs b/src/NadekoBot/Services/IImagesService.cs index 08d8f504..0b2b94f2 100644 --- a/src/NadekoBot/Services/IImagesService.cs +++ b/src/NadekoBot/Services/IImagesService.cs @@ -17,6 +17,8 @@ namespace NadekoBot.Services ImmutableArray WifeMatrix { get; } ImmutableArray RategirlDot { get; } + ImmutableArray XpCard { get; } + void Reload(); } } diff --git a/src/NadekoBot/Services/Impl/GoogleApiService.cs b/src/NadekoBot/Services/Impl/GoogleApiService.cs index ec09f169..45727fba 100644 --- a/src/NadekoBot/Services/Impl/GoogleApiService.cs +++ b/src/NadekoBot/Services/Impl/GoogleApiService.cs @@ -377,8 +377,7 @@ namespace NadekoBot.Services.Impl private string ConvertToLanguageCode(string language) { - string mode; - _languageDictionary.TryGetValue(language, out mode); + _languageDictionary.TryGetValue(language, out var mode); return mode; } } diff --git a/src/NadekoBot/Services/Impl/ImagesService.cs b/src/NadekoBot/Services/Impl/ImagesService.cs index 7153328f..3bb0bd2e 100644 --- a/src/NadekoBot/Services/Impl/ImagesService.cs +++ b/src/NadekoBot/Services/Impl/ImagesService.cs @@ -25,6 +25,8 @@ namespace NadekoBot.Services.Impl private const string _wifeMatrixPath = _basePath + "rategirl/wifematrix.png"; private const string _rategirlDot = _basePath + "rategirl/dot.png"; + private const string _xpCardPath = _basePath + "xp/xp.png"; + public ImmutableArray Heads { get; private set; } public ImmutableArray Tails { get; private set; } @@ -40,6 +42,8 @@ namespace NadekoBot.Services.Impl public ImmutableArray WifeMatrix { get; private set; } public ImmutableArray RategirlDot { get; private set; } + public ImmutableArray XpCard { get; private set; } + public ImagesService() { _log = LogManager.GetCurrentClassLogger(); @@ -76,6 +80,8 @@ namespace NadekoBot.Services.Impl WifeMatrix = File.ReadAllBytes(_wifeMatrixPath).ToImmutableArray(); RategirlDot = File.ReadAllBytes(_rategirlDot).ToImmutableArray(); + + XpCard = File.ReadAllBytes(_xpCardPath).ToImmutableArray(); } catch (Exception ex) { diff --git a/src/NadekoBot/Services/Impl/StatsService.cs b/src/NadekoBot/Services/Impl/StatsService.cs index 335db6b8..7e5f560d 100644 --- a/src/NadekoBot/Services/Impl/StatsService.cs +++ b/src/NadekoBot/Services/Impl/StatsService.cs @@ -20,7 +20,7 @@ namespace NadekoBot.Services.Impl private readonly IBotCredentials _creds; private readonly DateTime _started; - public const string BotVersion = "1.7"; + public const string BotVersion = "1.8"; public string Author => "Kwoth#2560"; public string Library => "Discord.Net"; diff --git a/src/NadekoBot/_Extensions/Extensions.cs b/src/NadekoBot/_Extensions/Extensions.cs index c901afaf..84901d21 100644 --- a/src/NadekoBot/_Extensions/Extensions.cs +++ b/src/NadekoBot/_Extensions/Extensions.cs @@ -132,7 +132,7 @@ namespace NadekoBot.Extensions public static string ToJson(this T any, Formatting formatting = Formatting.Indented) => JsonConvert.SerializeObject(any, formatting); - public static Stream ToStream(this ImageSharp.Image img) + public static MemoryStream ToStream(this ImageSharp.Image img) { var imageStream = new MemoryStream(); img.SaveAsPng(imageStream); diff --git a/src/NadekoBot/_Extensions/IMessageChannelExtensions.cs b/src/NadekoBot/_Extensions/IMessageChannelExtensions.cs index 806ec904..992d7453 100644 --- a/src/NadekoBot/_Extensions/IMessageChannelExtensions.cs +++ b/src/NadekoBot/_Extensions/IMessageChannelExtensions.cs @@ -10,7 +10,7 @@ namespace NadekoBot.Extensions public static class IMessageChannelExtensions { public static Task EmbedAsync(this IMessageChannel ch, EmbedBuilder embed, string msg = "") - => ch.SendMessageAsync(msg, embed: embed); + => ch.SendMessageAsync(msg, embed: embed.Build()); public static Task SendErrorAsync(this IMessageChannel ch, string title, string error, string url = null, string footer = null) { @@ -20,11 +20,11 @@ namespace NadekoBot.Extensions eb.WithUrl(url); if (!string.IsNullOrWhiteSpace(footer)) eb.WithFooter(efb => efb.WithText(footer)); - return ch.SendMessageAsync("", embed: eb); + return ch.SendMessageAsync("", embed: eb.Build()); } public static Task SendErrorAsync(this IMessageChannel ch, string error) - => ch.SendMessageAsync("", embed: new EmbedBuilder().WithErrorColor().WithDescription(error)); + => ch.SendMessageAsync("", embed: new EmbedBuilder().WithErrorColor().WithDescription(error).Build()); public static Task SendConfirmAsync(this IMessageChannel ch, string title, string text, string url = null, string footer = null) { @@ -34,11 +34,11 @@ namespace NadekoBot.Extensions eb.WithUrl(url); if (!string.IsNullOrWhiteSpace(footer)) eb.WithFooter(efb => efb.WithText(footer)); - return ch.SendMessageAsync("", embed: eb); + return ch.SendMessageAsync("", embed: eb.Build()); } public static Task SendConfirmAsync(this IMessageChannel ch, string text) - => ch.SendMessageAsync("", embed: new EmbedBuilder().WithOkColor().WithDescription(text)); + => ch.SendMessageAsync("", embed: new EmbedBuilder().WithOkColor().WithDescription(text).Build()); public static Task SendTableAsync(this IMessageChannel ch, string seed, IEnumerable items, Func howToPrint, int columns = 3) { diff --git a/src/NadekoBot/_Extensions/IUserExtensions.cs b/src/NadekoBot/_Extensions/IUserExtensions.cs index d1183e19..89650f21 100644 --- a/src/NadekoBot/_Extensions/IUserExtensions.cs +++ b/src/NadekoBot/_Extensions/IUserExtensions.cs @@ -1,4 +1,5 @@ using Discord; +using NadekoBot.Services.Database.Models; using System; using System.IO; using System.Threading.Tasks; @@ -8,14 +9,14 @@ namespace NadekoBot.Extensions public static class IUserExtensions { public static async Task SendConfirmAsync(this IUser user, string text) - => await (await user.GetOrCreateDMChannelAsync()).SendMessageAsync("", embed: new EmbedBuilder().WithOkColor().WithDescription(text)); + => await (await user.GetOrCreateDMChannelAsync()).SendMessageAsync("", embed: new EmbedBuilder().WithOkColor().WithDescription(text).Build()); public static async Task SendConfirmAsync(this IUser user, string title, string text, string url = null) { var eb = new EmbedBuilder().WithOkColor().WithDescription(text); if (url != null && Uri.IsWellFormedUriString(url, UriKind.Absolute)) eb.WithUrl(url); - return await (await user.GetOrCreateDMChannelAsync()).SendMessageAsync("", embed: eb); + return await (await user.GetOrCreateDMChannelAsync()).SendMessageAsync("", embed: eb.Build()); } public static async Task SendErrorAsync(this IUser user, string title, string error, string url = null) @@ -23,11 +24,11 @@ namespace NadekoBot.Extensions var eb = new EmbedBuilder().WithErrorColor().WithDescription(error); if (url != null && Uri.IsWellFormedUriString(url, UriKind.Absolute)) eb.WithUrl(url); - return await (await user.GetOrCreateDMChannelAsync()).SendMessageAsync("", embed: eb); + return await (await user.GetOrCreateDMChannelAsync()).SendMessageAsync("", embed: eb.Build()); } public static async Task SendErrorAsync(this IUser user, string error) - => await (await user.GetOrCreateDMChannelAsync()).SendMessageAsync("", embed: new EmbedBuilder().WithErrorColor().WithDescription(error)); + => await (await user.GetOrCreateDMChannelAsync()).SendMessageAsync("", embed: new EmbedBuilder().WithErrorColor().WithDescription(error).Build()); public static async Task SendFileAsync(this IUser user, string filePath, string caption = null, string text = null, bool isTTS = false) => await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(File.Open(filePath, FileMode.Open), caption ?? "x", text, isTTS).ConfigureAwait(false); @@ -39,5 +40,10 @@ namespace NadekoBot.Extensions usr.AvatarId.StartsWith("a_") ? $"{DiscordConfig.CDNUrl}avatars/{usr.Id}/{usr.AvatarId}.gif" : usr.GetAvatarUrl(ImageFormat.Auto); + + public static string RealAvatarUrl(this DiscordUser usr) => + usr.AvatarId.StartsWith("a_") + ? $"{DiscordConfig.CDNUrl}avatars/{usr.UserId}/{usr.AvatarId}.gif" + : $"{DiscordConfig.CDNUrl}avatars/{usr.UserId}/{usr.AvatarId}.png"; } } diff --git a/src/NadekoBot/_strings/ResponseStrings.en-US.json b/src/NadekoBot/_strings/ResponseStrings.en-US.json index 2ccc0b70..1ee47eed 100644 --- a/src/NadekoBot/_strings/ResponseStrings.en-US.json +++ b/src/NadekoBot/_strings/ResponseStrings.en-US.json @@ -833,5 +833,40 @@ "xp_server_is_excluded": "This server is excluded.", "xp_server_is_not_excluded": "This server is not excluded.", "xp_excluded_roles": "Excluded Roles", - "xp_excluded_channels": "Excluded Channels" + "xp_excluded_channels": "Excluded Channels", + "xp_level_up_channel": "Congratulations {0}, You've reached level {1}!", + "xp_level_up_dm": "Congratulations {0}, You've reached level {1} on {2} server!", + "xp_level_up_global": "Congratulations {0}, You've reached global level {1}!", + "xp_role_reward_cleared": "Level {0} will no longer reward a role.", + "xp_role_reward_added": "Users who reach level {0} will receive {1} role.", + "xp_role_rewards": "Role Rewards", + "xp_level_x": "Level {0}", + "xp_no_role_rewards": "No role reward on this page.", + "xp_server_leaderboard": "Server XP Leaderboard", + "xp_global_leaderboard": "Global XP Leaderboard", + "xp_modified": "Modified server XP of the user {0} by {1}", + "xp_club_create_error": "Failed creating the club. Make sure you're above level 5 and not a member of a club already.", + "xp_club_created": "Club {0} successfully created!", + "xp_club_not_exists": "That club doesn't exist.", + "xp_club_applied": "You've applied for membership in {0} club.", + "xp_club_apply_error": "Error applying. You are either already a member of the club, or you don't meet the minimum level requirement, or you've been banned from this one.", + "xp_club_accepted": "Accepted user {0} to the club.", + "xp_club_accept_error": "User not found", + "xp_club_left": "You've left the club.", + "xp_club_not_in_club": "You are not in a club, or you're trying to leave the club you're the owner of.", + "xp_club_user_kick": "User {0} kicked from {1} club.", + "xp_club_user_kick_fail": "Error kicking. You're either not the club owner, or that user is not in your club.", + "xp_club_user_banned": "Banned user {0} from {1} club.", + "xp_club_user_ban_fail": "Failed to ban. You're either not the club owner, or that user is not in your club or applied to it.", + "xp_club_user_unbanned": "Unbanned user {0} in {1} club.", + "xp_club_user_unban_fail": "Failed to unban. You're either not the club owner, or that user is not in your club or applied to it.", + "xp_club_level_req_changed": "Changed club's level requirement to {0}", + "xp_club_level_req_change_error": "Failed changing level requirement.", + "xp_club_disbanded": "Club {0} has been disbanded", + "xp_club_disband_error": "Error. You are either not in a club, or you are not the owner of your club.", + "xp_club_icon_error": "Not a valid image url or you're not the club owner.", + "xp_club_icon_set": "New club icon set.", + "xp_club_bans_for": "Bans for {0} club", + "xp_club_apps_for": "Applicants for {0} club", + "xp_club_leaderboard": "Club leaderboard - page {0}" } \ No newline at end of file diff --git a/src/NadekoBot/data/fonts/Uni Sans.ttf b/src/NadekoBot/data/fonts/Uni Sans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a7b39d02e5e7a21622648839874e4277332031d1 GIT binary patch literal 50856 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

Z;>+L8& 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 z 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 literal 0 HcmV?d00001 diff --git a/src/NadekoBot/data/images/xp/xp.png b/src/NadekoBot/data/images/xp/xp.png new file mode 100644 index 0000000000000000000000000000000000000000..28025180e2ed45fffe08372a846a9f5bcf1b5b1b GIT binary patch literal 294486 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�gWDMx(atllKvB7CY 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 literal 0 HcmV?d00001