From 81ec4922bf2cf902959593db9c7075394f74ad61 Mon Sep 17 00:00:00 2001 From: Lan <50151341+Lannnnnnnnn@users.noreply.github.com> Date: Mon, 29 Nov 2021 02:33:30 +0200 Subject: [PATCH] I don't even know what I changed I should be pushing updates much more often --- Kehyeedra3/ApplicationDbContext.cs | 1 + Kehyeedra3/Bot.cs | 5 +- Kehyeedra3/Commands/Admin.cs | 16 + Kehyeedra3/Commands/Economy.cs | 138 ++++---- Kehyeedra3/Commands/Interactive.cs | 141 ++++++++- Kehyeedra3/Commands/Stuff.cs | 4 +- Kehyeedra3/Discord.Addons.Interactive.dll | Bin 0 -> 31232 bytes Kehyeedra3/Extensions.cs | 27 ++ Kehyeedra3/Kehyeedra3.csproj | 15 +- .../20210806204446_FarmingA.Designer.cs | 294 ++++++++++++++++++ .../Migrations/20210806204446_FarmingA.cs | 47 +++ .../ApplicationDbContextModelSnapshot.cs | 38 +++ Kehyeedra3/Services/ButtonService.cs | 115 +++++++ Kehyeedra3/Services/Models/Farming.cs | 240 ++++++++++++++ Kehyeedra3/Services/Models/Fishing.cs | 9 + Kehyeedra3/Services/Models/User.cs | 2 + Kehyeedra3/Services/ReminderService.cs | 4 +- 17 files changed, 1023 insertions(+), 73 deletions(-) create mode 100644 Kehyeedra3/Discord.Addons.Interactive.dll create mode 100644 Kehyeedra3/Migrations/20210806204446_FarmingA.Designer.cs create mode 100644 Kehyeedra3/Migrations/20210806204446_FarmingA.cs create mode 100644 Kehyeedra3/Services/ButtonService.cs create mode 100644 Kehyeedra3/Services/Models/Farming.cs diff --git a/Kehyeedra3/ApplicationDbContext.cs b/Kehyeedra3/ApplicationDbContext.cs index f215f9d..a1f6bb3 100644 --- a/Kehyeedra3/ApplicationDbContext.cs +++ b/Kehyeedra3/ApplicationDbContext.cs @@ -14,5 +14,6 @@ namespace Kehyeedra3 public DbSet StoreFronts { get; set; } public DbSet Battlefish { get; set; } public DbSet Mining { get; set; } + public DbSet Farming { get; set; } } } diff --git a/Kehyeedra3/Bot.cs b/Kehyeedra3/Bot.cs index c3aceb6..f3d2b37 100644 --- a/Kehyeedra3/Bot.cs +++ b/Kehyeedra3/Bot.cs @@ -12,6 +12,7 @@ using Kehyeedra3.Services; using System.Threading; using Discord.Addons.Interactive; using dotenv.net; +using Kehyeedra3.Buttons; namespace Kehyeedra3 { @@ -138,6 +139,8 @@ namespace Kehyeedra3 try { _bot.Ready += _bot_Ready; + ButtonService.RegisterCumButtons(_bot); // button testing + ButtonService.RegisterFarmButtons(_bot); await _bot.LoginAsync(TokenType.Bot, Configuration.Load().Token); await _bot.StartAsync(); //Clockboy.Start(); @@ -160,7 +163,7 @@ namespace Kehyeedra3 } } - private async Task _bot_Ready() + private async Task _bot_Ready() { IsReady = true; } diff --git a/Kehyeedra3/Commands/Admin.cs b/Kehyeedra3/Commands/Admin.cs index ea6a930..034a201 100644 --- a/Kehyeedra3/Commands/Admin.cs +++ b/Kehyeedra3/Commands/Admin.cs @@ -99,6 +99,14 @@ namespace Kehyeedra3.Commands var message = await NextMessageAsync(); if (message != null && message.Content.ToLowerInvariant() == "yes") { + foreach (User u in users) + { + if (u.Money < 0) + { + u.Money = 0; + u.Money -= difference; + } + } bank.Money += difference; await Database.SaveChangesAsync(); if (difference > 0) @@ -330,6 +338,14 @@ namespace Kehyeedra3.Commands } } + [RequireRolePrecondition(AccessLevel.ServerAdmin)] + [Command("buttontest")] + public async Task ButtonTest() // button testing + { + var components = new ComponentBuilder().WithButton("cum", "cum").WithButton("piss", "piss"); + await Context.Channel.SendMessageAsync($"Greetings traveler, I've potions for you to purchase, what'd you like to have?",component:components.Build()); + } + [RequireRolePrecondition(AccessLevel.ServerAdmin)] [Command("makeimag")] public async Task MakeImage() diff --git a/Kehyeedra3/Commands/Economy.cs b/Kehyeedra3/Commands/Economy.cs index 550daac..794560c 100644 --- a/Kehyeedra3/Commands/Economy.cs +++ b/Kehyeedra3/Commands/Economy.cs @@ -15,17 +15,17 @@ using Kehyeedra3.Preconditions; using System.IO; namespace Kehyeedra3.Commands -{ +{ public class Economy : InteractiveBase { readonly string[] ores = new string[] { "**Gold**,", "**Platinum**,", - "**Plastids**,", + "a **Windows Update**,", "a ticking **Time Bomb**,", "an **Amethyst**,", - "**Germanium**,", + "the **Bone Stone**,", "a **Hotdog**,", "**Corundum**,", "**Quartz**,", @@ -35,11 +35,11 @@ namespace Kehyeedra3.Commands "**Beryllium**,", "**Gallium**,", "an **Amber**,", - "**Bismuth**", + "**Bismuth**,", "an **Emerald**,", "a lost **Sock**,", "**Tellurium**,", - "**Ferrite**,", + "**Bad Apple**,", "a **Glass of Water**,", "**Redstone**,", "**Racism**,", @@ -64,7 +64,7 @@ namespace Kehyeedra3.Commands "a **Viet Cong Tunnel**,", "a single unit of several **Trees**,", "**1,000,000₩**,", - "**Jas's Love**,", + "a **Cunny Rabbit**,", "a **Rock Golem**,", "a piece of **Toast**,", "**Luminite**,", @@ -178,15 +178,7 @@ namespace Kehyeedra3.Commands if (muser.TXp >= muser.Xp) { muser.Lvl += 1; - ulong leXp = 50; - for (ulong i = 0; i < muser.Lvl; i++) - { - if (i <= muser.Lvl) - { - leXp += Convert.ToUInt64(Math.Round((leXp * 0.05d + 50d), 0, MidpointRounding.ToEven)); - } - } - muser.Xp = leXp; + muser.Xp = muser.Lvl.GetLevelXp()[0]; levelup += $"You leveled up. You are now **Lvl {muser.Lvl}**"; } else @@ -635,32 +627,17 @@ namespace Kehyeedra3.Commands int times = 0; if (user.TXp > 50 && user.FXp == 0) { - lvlXp = 50; - for (ulong i = 0; i < user.Lvl; i++) - { - - if (i <= user.Lvl) - { - lvlXp += Convert.ToUInt64(Math.Round((lvlXp * 0.05d + 50d), 0, MidpointRounding.ToEven)); - } - if (i == user.Lvl - 2) - { - user.FXp = lvlXp; - } - - } + ulong[] result = user.Lvl.GetLevelXp(); + lvlXp = result[0]; + user.FXp = result[1]; } if (user.TXp >= user.Xp) { - ulong leXp = 50; + ulong[] result = user.Lvl.GetLevelXp(); + + ulong leXp = result[0]; bool leTrig = false; - for (ulong i = 0; i < user.Lvl; i++) - { - if (i <= user.Lvl) - { - leXp += Convert.ToUInt64(Math.Round((leXp * 0.05d + 50d), 0, MidpointRounding.ToEven)); - } - } + if (leXp != user.Xp) { user.Lvl = 0; @@ -672,27 +649,19 @@ namespace Kehyeedra3.Commands user.Lvl += 1; times += 1; lvlXp = 50; - - for (ulong i = 0; i < user.Lvl; i++) - { - - if (i <= user.Lvl) - { - lvlXp += Convert.ToUInt64(Math.Round((lvlXp * 0.05d + 50d), 0, MidpointRounding.ToEven)); - } - if (i == user.Lvl - 2) - { - user.FXp = lvlXp; - } - } + result = user.Lvl.GetLevelXp(); + lvlXp = result[0]; + user.FXp = result[1]; + user.Xp = lvlXp; } + toNextLvl = user.Xp - user.TXp; level = user.Lvl; if (leTrig) { - lvlUp = $"**Your level was recalculated\n to match your xp.** \nYou are now **Level {level}**"; + lvlUp = $"**Your level was recalculated to match \nyour xp.** You are now **Level {level}**"; } else if (times > 1) { @@ -970,7 +939,7 @@ namespace Kehyeedra3.Commands } } - [Command("fishinventory"), Alias("finv", "fishinv"), Summary("Shows the fish you have currently. Variables: fish tier")] + [Command("fishinventory"), Alias("finv", "fishinv"), Summary("Shows your fish inventory. Variables: fish tier")] public async Task FishInventory(int? tier = null, IGuildUser user = null) { if (user == null) @@ -1152,7 +1121,7 @@ namespace Kehyeedra3.Commands await Context.Channel.SendMessageAsync("Go fish nigger").ConfigureAwait(false); } } - [Command("generalinventory"),Alias("ginv", "geninv"), Summary("Shows the items you have excluding fish.")] + [Command("generalinventory"),Alias("ginv", "geninv"), Summary("Shows your general items inventory.")] public async Task GeneralInventory() { User user; @@ -1163,7 +1132,21 @@ namespace Kehyeedra3.Commands using (var Database = new ApplicationDbContextFactory().CreateDbContext()) { user = Database.Users.FirstOrDefault(x => x.Id == Context.User.Id); - inv = user.GetGenInve(); + if (user == null) + { + user = new User + { + Id = Context.User.Id + }; + + Database.Users.Add(user); + message += "You have no items."; + } + else + { + inv = user.GetGenInve(); + } + foreach (var entry in inv) { if (entry.Value[0] > 0) @@ -1175,6 +1158,42 @@ namespace Kehyeedra3.Commands await Context.Channel.SendMessageAsync($"{Context.User.Mention}\n{message}"); } } + [Command("farminventory"),Alias("fainv","farminv"),Summary("Shows your farm inventory, including seeds and crops.")] + public async Task FarmInventory() + { + string message = ""; + List crops = Farming.ListCrops(); + Dictionary inv = new Dictionary(); + FCrop crop; + using (var Database = new ApplicationDbContextFactory().CreateDbContext()) + { + var user = Database.Farming.FirstOrDefault(x => x.Id == Context.User.Id); + if (user == null) + { + user = new Farming + { + Id = Context.User.Id + }; + + Database.Farming.Add(user); + message += "You have no items."; + } + else + { + inv = user.GetCropInventory(); + } + + foreach (var entry in inv) + { + if (entry.Value[0] > 0) + { + crop = crops.FirstOrDefault(x => x.Id == entry.Key); + message += $"**{crop.Name}** : **{entry.Value[0]}** Seeds, **{entry.Value[1]}** Crops\n"; + } + } + await ReplyAsync($"{Context.User.Mention}\n{message}"); + } + } [RequireRolePrecondition(AccessLevel.ServerAdmin)] [Command("tradebuy", RunMode = RunMode.Async), Summary("Unfinished command")] public async Task TradingBuy(int amount, string itemtype, int price, [Remainder] string item) @@ -1662,19 +1681,10 @@ namespace Kehyeedra3.Commands user.TXp -= presXp; user.Xp = 0; user.Lvl = 0; - ulong lvlXp = 0; while (user.TXp >= user.Xp) { user.Lvl += 1; - lvlXp = 50; - for (ulong i = 0; i < user.Lvl; i++) - { - if (i <= user.Lvl) - { - lvlXp += Convert.ToUInt64(Math.Round((lvlXp * 0.05d + 50d), 0, MidpointRounding.ToEven)); - } - } - user.Xp = lvlXp; + user.Xp = user.Lvl.GetLevelXp()[0]; } await Database.SaveChangesAsync(); await Context.Channel.SendMessageAsync($"{Context.User.Mention}\nYou've successfully upgraded to **P{user.Prestige}**.\nReadjusting level."); diff --git a/Kehyeedra3/Commands/Interactive.cs b/Kehyeedra3/Commands/Interactive.cs index 1c98687..b47c0e6 100644 --- a/Kehyeedra3/Commands/Interactive.cs +++ b/Kehyeedra3/Commands/Interactive.cs @@ -1059,10 +1059,149 @@ namespace Kehyeedra3.Commands } - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// } } + [Command("farming", RunMode = RunMode.Async), Alias("farm"), Summary("arguments: m/manage")] + public async Task FarmCommand(string input = null) + { + Dictionary items = new Dictionary(); + List crops = Farming.ListCrops(); + List plots = Farming.ListFarmLand(); + + + using (var Database = new ApplicationDbContextFactory().CreateDbContext()) + { + var user = Database.Farming.FirstOrDefault(i => i.Id == Context.User.Id); + var buser = Database.Users.FirstOrDefault(i => i.Id == Context.User.Id); + if (user == null) + { + user = new Farming + { + Id = Context.User.Id + }; + Database.Farming.Add(user); + await Database.SaveChangesAsync(); + } + var plotinv = user.GetPlotInventory(); + var cropinv = user.GetCropInventory(); + + string cropitemtxt = ""; + string plotitemtxt = ""; + + FarmTier tier = (FarmTier)user.Tier; + foreach (FCrop i in crops) + { + if (i.Price != 0 && (int)tier >= (int)i.Tier) + { + cropitemtxt += $"{(int)i.Id} : {i.Name} Seed for {((long)i.Price).ToYeedraDisplay()}%\n"; + } + } + foreach (FLand i in plots) + { + if (i.Price != 0 && (int)tier >= (int)i.Tier) + { + plotitemtxt += $"{(int)i.Id} : {i.Name} for {((long)i.Price).ToYeedraDisplay()}%\n"; + } + } + + input = input.ToLowerInvariant(); + if (input == "manage" || input == "m") + { + await ReplyAsync($"{Context.User.Mention}\nSelect a farm"); + var inp = await NextMessageAsync(timeout: TimeSpan.FromMinutes(2)); + var inpsep = inp.Content.Split(" "); + + + } + else if (input == "seedmarket" || input == "sm") + { + await ReplyAsync($"{Context.User.Mention}\nSelect what you want to buy (id, amount).\n{cropitemtxt}"); + var inp = await NextMessageAsync(timeout: TimeSpan.FromMinutes(2)); + var inpsep = inp.Content.Split(" "); + FCrop crop = crops.FirstOrDefault(i => (int)i.Id == int.Parse(inpsep[0])); + + items = user.GetCropInventory(); + + int[] amount = { 0 , 0 }; + + if (!items.TryGetValue(crop.Id, out amount)) + { + amount = new int[] { 0, 0 }; + items.Add(crop.Id, amount); + } + + if (int.Parse(inpsep[1]) * crop.Price <= buser.Money) + { + amount[0] += int.Parse(inpsep[1]); + int count = int.Parse(inpsep[1]); + + await Context.Channel.SendMessageAsync($"{Context.User.Mention}\nThis will cost you {((long)(count * crop.Price)).ToYeedraDisplay()}.\nType 'ok' to confirm."); + + inp = await NextMessageAsync(); + if (inp.Content.ToLowerInvariant() == "ok") + { + if (!buser.GrantMoney(Database.Users.FirstOrDefault(x => x.Id == 0), -(count * crop.Price))) + { + await Context.Channel.SendMessageAsync($"{Context.User.Mention}\nBank has no money, buy more bait."); + return; + } + user.SetCropInventory(items); + await Context.Channel.SendMessageAsync($"{Context.User.Mention}\nBought {count} of {crop.Name}."); + await Database.SaveChangesAsync(); + } + else + { + await Context.Channel.SendMessageAsync($"{Context.User.Mention}\nPlease come back when you feel like spending."); + } + } + else + { + await Context.Channel.SendMessageAsync($"{Context.User.Mention}\nCome back when you're a little, MMMMMMmmmm, richer."); + } + } + else if (input == "propertymarket" || input == "pm") + { + FLand plot; + await ReplyAsync($"{Context.User.Mention}\nHere's a list of property you can buy right now.\n{plotitemtxt}"); + var inp = await NextMessageAsync(timeout: TimeSpan.FromMinutes(2)); + var inpsep = inp.Content.Split(" "); + } + else if (input == "hire" || input == "h") + { + string add = ""; + int cap = (int)tier * 2 - user.EmployeeCount; + if ( cap > 0) + { + add += $"You can currently hire {cap} more farmer{(cap>1?"s":"")}."; + } + await ReplyAsync($"{Context.User.Mention}\nYou currently employ **{user.EmployeeCount} / {(int)tier*2}** farmers.\n{add}\nHow many farmers do you want to hire? (0-{(int)tier*2-user.EmployeeCount})"); + var inp = await NextMessageAsync(timeout: TimeSpan.FromMinutes(2)); + int numbie = int.Parse(inp.Content); + if (numbie > 0 && numbie * 100 + numbie * 100 * user.Tier < buser.Money) + { + + } + else if (numbie * 100 + numbie * 100 * user.Tier > buser.Money) + { + await ReplyAsync($"{Context.User.Mention}\nCome back when you're a little, MMMMMMmmmm, richer."); + } + else + { + await ReplyAsync($"{Context.User.Mention}\nYou're poor haha loser haha"); + } + } + else + { + await ReplyAsync($"Here's a list of arguments you can use:" + + $"\nmanage | m : manage a farm you own" + + $"\nseedmarket | sm : purchase seeds to use at your farm" + + $"\npropertymarket | pm : purchase new property to grow crops on" + + $"\nhire | h : hire workers for your farms"); + } + } + } } } diff --git a/Kehyeedra3/Commands/Stuff.cs b/Kehyeedra3/Commands/Stuff.cs index e90175f..86c99cf 100644 --- a/Kehyeedra3/Commands/Stuff.cs +++ b/Kehyeedra3/Commands/Stuff.cs @@ -246,7 +246,7 @@ namespace Kehyeedra3.Commands } else { - var dmchannel = await Bot._bot.GetUser(Context.User.Id).GetOrCreateDMChannelAsync(); + var dmchannel = await Bot._bot.GetUser(Context.User.Id).CreateDMChannelAsync(); await dmchannel.SendMessageAsync($"**You literally just told me to DM you:**\n\n{r}"); } } @@ -381,7 +381,7 @@ namespace Kehyeedra3.Commands [Command("changenick")] public async Task ChangeNickname(IGuildUser usr = null, [Remainder]string name = null) { - if (Context.Guild.Id != 691361760300761139) + if (Context.Guild.Id != 691361760300761139 && Context.Guild.Id != 912778610300039198) { await Context.Channel.SendMessageAsync($"{Context.User.Mention}\nWrong server retard"); return; diff --git a/Kehyeedra3/Discord.Addons.Interactive.dll b/Kehyeedra3/Discord.Addons.Interactive.dll new file mode 100644 index 0000000000000000000000000000000000000000..c61c39f21b1d0041bb2a6ddcfc0e86208175ed26 GIT binary patch literal 31232 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 literal 0 HcmV?d00001 diff --git a/Kehyeedra3/Extensions.cs b/Kehyeedra3/Extensions.cs index e8ed187..aa280ae 100644 --- a/Kehyeedra3/Extensions.cs +++ b/Kehyeedra3/Extensions.cs @@ -26,6 +26,33 @@ namespace Kehyeedra3 return numb.ToString("N4"); } + public static ulong[] GetLevelXp(this ulong lvl) + { + using (var Database = new ApplicationDbContextFactory().CreateDbContext()) + { + lvl += 1; + ulong lvlXp = 50; + ulong lvlFloor = 0; + for (ulong i = 0; i < lvl; i++) + { + if (i <= lvl) + { + lvlXp += Convert.ToUInt64(Math.Round((lvlXp * 0.05d + 50d), 0, MidpointRounding.ToEven)); + } + if (i == lvl - 2) + { + lvlFloor = lvlXp; + } + } + ulong[] numbies = new ulong[] + { + lvlXp, + lvlFloor + }; + return numbies; + } + } + public static double Remap(this int value, double min1, double max1, double min2, double max2) => ((double)value).Remap(min1, max1, min2, max2); diff --git a/Kehyeedra3/Kehyeedra3.csproj b/Kehyeedra3/Kehyeedra3.csproj index 08a6e2e..5eb8cf1 100644 --- a/Kehyeedra3/Kehyeedra3.csproj +++ b/Kehyeedra3/Kehyeedra3.csproj @@ -2,14 +2,17 @@ Exe - netcoreapp3.1 + net5.0 2020.5.2.0 2020.5.2.0 - - + + + + + @@ -19,6 +22,12 @@ + + + Discord.Addons.Interactive.dll + + + Always diff --git a/Kehyeedra3/Migrations/20210806204446_FarmingA.Designer.cs b/Kehyeedra3/Migrations/20210806204446_FarmingA.Designer.cs new file mode 100644 index 0000000..fbaf54d --- /dev/null +++ b/Kehyeedra3/Migrations/20210806204446_FarmingA.Designer.cs @@ -0,0 +1,294 @@ +// +using System; +using Kehyeedra3; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace Kehyeedra3.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20210806204446_FarmingA")] + partial class FarmingA + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.11") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Kehyeedra3.Services.Models.Farming", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned"); + + b.Property("CropInventory") + .HasColumnType("LONGTEXT"); + + b.Property("EmployeeCount") + .HasColumnType("int"); + + b.Property("FXp") + .HasColumnType("bigint unsigned"); + + b.Property("Lvl") + .HasColumnType("bigint unsigned"); + + b.Property("PlotInventory") + .HasColumnType("LONGTEXT"); + + b.Property("TXp") + .HasColumnType("bigint unsigned"); + + b.Property("Tier") + .HasColumnType("int"); + + b.Property("Xp") + .HasColumnType("bigint unsigned"); + + b.HasKey("Id"); + + b.ToTable("Farming"); + }); + + modelBuilder.Entity("Kehyeedra3.Services.Models.Fishing", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned"); + + b.Property("FXp") + .HasColumnType("bigint unsigned"); + + b.Property("Inventory") + .HasColumnType("LONGTEXT"); + + b.Property("LastFish") + .HasColumnType("bigint unsigned"); + + b.Property("Lvl") + .HasColumnType("bigint unsigned"); + + b.Property("Prestige") + .HasColumnType("int"); + + b.Property("RodOwned") + .HasColumnType("tinyint unsigned"); + + b.Property("RodUsed") + .HasColumnType("tinyint unsigned"); + + b.Property("TXp") + .HasColumnType("bigint unsigned"); + + b.Property("Xp") + .HasColumnType("bigint unsigned"); + + b.HasKey("Id"); + + b.ToTable("Fishing"); + }); + + modelBuilder.Entity("Kehyeedra3.Services.Models.ItemOffer", b => + { + b.Property("OfferId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("BuyerId") + .HasColumnType("bigint unsigned"); + + b.Property("IsPurchaseFromStore") + .HasColumnType("tinyint(1)"); + + b.Property("IsSellOffer") + .HasColumnType("tinyint(1)"); + + b.Property("ItemId") + .HasColumnType("bigint unsigned"); + + b.Property("OfferAmount") + .HasColumnType("int"); + + b.Property("StoreFrontId") + .HasColumnType("bigint unsigned"); + + b.Property("StoreId") + .HasColumnType("bigint unsigned"); + + b.HasKey("OfferId"); + + b.HasIndex("StoreFrontId"); + + b.ToTable("ItemOffer"); + }); + + modelBuilder.Entity("Kehyeedra3.Services.Models.Mining", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned"); + + b.Property("LastMine") + .HasColumnType("bigint unsigned"); + + b.Property("Lvl") + .HasColumnType("bigint unsigned"); + + b.Property("TXp") + .HasColumnType("bigint unsigned"); + + b.Property("Xp") + .HasColumnType("bigint unsigned"); + + b.HasKey("Id"); + + b.ToTable("Mining"); + }); + + modelBuilder.Entity("Kehyeedra3.Services.Models.Reminder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned"); + + b.Property("Created") + .HasColumnType("bigint unsigned"); + + b.Property("Message") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Send") + .HasColumnType("bigint unsigned"); + + b.Property("UserId") + .HasColumnType("bigint unsigned"); + + b.HasKey("Id"); + + b.ToTable("Reminders"); + }); + + modelBuilder.Entity("Kehyeedra3.Services.Models.StoreFront", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned"); + + b.Property("StoreItemType") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("bigint unsigned"); + + b.HasKey("Id"); + + b.ToTable("StoreFronts"); + }); + + modelBuilder.Entity("Kehyeedra3.Services.Models.StoreInventory", b => + { + b.Property("InvId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("Item") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("StoreFrontId") + .HasColumnType("bigint unsigned"); + + b.HasKey("InvId"); + + b.HasIndex("StoreFrontId"); + + b.ToTable("StoreInventory"); + }); + + modelBuilder.Entity("Kehyeedra3.Services.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned"); + + b.Property("Avatar") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("CurrentBattlefish") + .HasColumnType("TINYINT"); + + b.Property("GeneralInventory") + .HasColumnType("LONGTEXT"); + + b.Property("Money") + .HasColumnType("bigint"); + + b.Property("OwnerId") + .HasColumnType("bigint unsigned"); + + b.Property("Username") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Kehyeedra3.Services.Models.User+BattleFishObject", b => + { + b.Property("FishId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned"); + + b.Property("FishType") + .HasColumnType("TINYINT"); + + b.Property("Lvl") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("NextXp") + .HasColumnType("bigint unsigned"); + + b.Property("UserId") + .HasColumnType("bigint unsigned"); + + b.Property("Xp") + .HasColumnType("bigint unsigned"); + + b.HasKey("FishId"); + + b.ToTable("Battlefish"); + }); + + modelBuilder.Entity("Kehyeedra3.Services.Models.ItemOffer", b => + { + b.HasOne("Kehyeedra3.Services.Models.StoreFront", null) + .WithMany("Offers") + .HasForeignKey("StoreFrontId"); + }); + + modelBuilder.Entity("Kehyeedra3.Services.Models.StoreInventory", b => + { + b.HasOne("Kehyeedra3.Services.Models.StoreFront", null) + .WithMany("Items") + .HasForeignKey("StoreFrontId"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Kehyeedra3/Migrations/20210806204446_FarmingA.cs b/Kehyeedra3/Migrations/20210806204446_FarmingA.cs new file mode 100644 index 0000000..95680b4 --- /dev/null +++ b/Kehyeedra3/Migrations/20210806204446_FarmingA.cs @@ -0,0 +1,47 @@ +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Kehyeedra3.Migrations +{ + public partial class FarmingA : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "OwnerId", + table: "Users", + nullable: false, + defaultValue: 0ul); + + migrationBuilder.CreateTable( + name: "Farming", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + Tier = table.Column(nullable: false), + EmployeeCount = table.Column(nullable: false), + Lvl = table.Column(nullable: false), + Xp = table.Column(nullable: false), + FXp = table.Column(nullable: false), + TXp = table.Column(nullable: false), + CropInventory = table.Column(type: "LONGTEXT", nullable: true), + PlotInventory = table.Column(type: "LONGTEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Farming", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Farming"); + + migrationBuilder.DropColumn( + name: "OwnerId", + table: "Users"); + } + } +} diff --git a/Kehyeedra3/Migrations/ApplicationDbContextModelSnapshot.cs b/Kehyeedra3/Migrations/ApplicationDbContextModelSnapshot.cs index c529103..2c855d3 100644 --- a/Kehyeedra3/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Kehyeedra3/Migrations/ApplicationDbContextModelSnapshot.cs @@ -17,6 +17,41 @@ namespace Kehyeedra3.Migrations .HasAnnotation("ProductVersion", "3.1.11") .HasAnnotation("Relational:MaxIdentifierLength", 64); + modelBuilder.Entity("Kehyeedra3.Services.Models.Farming", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned"); + + b.Property("CropInventory") + .HasColumnType("LONGTEXT"); + + b.Property("EmployeeCount") + .HasColumnType("int"); + + b.Property("FXp") + .HasColumnType("bigint unsigned"); + + b.Property("Lvl") + .HasColumnType("bigint unsigned"); + + b.Property("PlotInventory") + .HasColumnType("LONGTEXT"); + + b.Property("TXp") + .HasColumnType("bigint unsigned"); + + b.Property("Tier") + .HasColumnType("int"); + + b.Property("Xp") + .HasColumnType("bigint unsigned"); + + b.HasKey("Id"); + + b.ToTable("Farming"); + }); + modelBuilder.Entity("Kehyeedra3.Services.Models.Fishing", b => { b.Property("Id") @@ -198,6 +233,9 @@ namespace Kehyeedra3.Migrations b.Property("Money") .HasColumnType("bigint"); + b.Property("OwnerId") + .HasColumnType("bigint unsigned"); + b.Property("Username") .HasColumnType("longtext CHARACTER SET utf8mb4"); diff --git a/Kehyeedra3/Services/ButtonService.cs b/Kehyeedra3/Services/ButtonService.cs new file mode 100644 index 0000000..45fd487 --- /dev/null +++ b/Kehyeedra3/Services/ButtonService.cs @@ -0,0 +1,115 @@ +using Discord; +using Discord.Addons.Interactive; +using Discord.Commands; +using Discord.WebSocket; +using Kehyeedra3.Services.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Kehyeedra3.Buttons +{ + public static class ButtonService // button testing + { + public static void RegisterCumButtons(DiscordSocketClient client) + { + client.InteractionCreated += HandleCumButtons; + } + + private static async Task HandleCumButtons(SocketInteraction arg) + { + if (arg.Type == InteractionType.MessageComponent) + { + var parsedArg = (SocketMessageComponent)arg; + + switch (parsedArg.Data.CustomId) + { + case "cum": + { + await parsedArg.Message.ModifyAsync(z => { z.Components = null; }); + + + await parsedArg.FollowupAsync("You have selected cum, prepare to die"); + } + break; + case "piss": + { + await parsedArg.Message.ModifyAsync(z => { z.Components = null; }); + + await parsedArg.FollowupAsync("You have selected piss, prepare to shit"); + } + break; + } + } + } + + public static void RegisterFarmButtons(DiscordSocketClient client) + { + client.InteractionCreated += HandleFarmButtons; + } + + private static async Task HandleFarmButtons(SocketInteraction arg) + { + if (arg.Type == InteractionType.MessageComponent) + { + var parsedArg = (SocketMessageComponent)arg; + Dictionary items = new Dictionary(); + List crops = Farming.ListCrops(); + List plots = Farming.ListFarmLand(); + FarmTier tier = FarmTier.T0; + + string cropitemtxt = ""; + string plotitemtxt = ""; + + switch (parsedArg.Data.CustomId) + { + //case "crop": + // { + // foreach (FCrop i in crops) + // { + // if (i.Price > 0 && (int)tier >= (int)i.Tier) + // { + // cropitemtxt += $"{(int)i.Id} : {i.Name} Seed for {((long)i.Price).ToYeedraDisplay()}%\n"; + // } + // } + // await parsedArg.Message.ModifyAsync(z => { z.Components = null; }); + // if (cropitemtxt != "") + // { + // await parsedArg.FollowupAsync($"Select an item\n{cropitemtxt}"); + // } + // else + // { + // await parsedArg.FollowupAsync($"There is nothing you can buy right now."); + // } + + // } + // break; + //case "plot": + // { + // foreach (FLand i in plots) + // { + // if (i.Price > 0 && (int)tier >= (int)i.Tier) + // { + // plotitemtxt += $"{(int)i.Id} : {i.Name} for {((long)i.Price).ToYeedraDisplay()}%\n"; + // } + // } + // await parsedArg.Message.ModifyAsync(z => { z.Components = null; }); + + // if (plotitemtxt != "") + // { + // await parsedArg.FollowupAsync($"Select an item\n{plotitemtxt}"); + // } + // else + // { + // await parsedArg.FollowupAsync($"There is nothing you can buy right now."); + // } + + // } + // break; + } + } + } + } +} diff --git a/Kehyeedra3/Services/Models/Farming.cs b/Kehyeedra3/Services/Models/Farming.cs new file mode 100644 index 0000000..854c987 --- /dev/null +++ b/Kehyeedra3/Services/Models/Farming.cs @@ -0,0 +1,240 @@ +using System; +using System.Text; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; + +namespace Kehyeedra3.Services.Models +{ + public class Farming + { + [Key] + public ulong Id { get; set; } = 0; + public int Tier { get; set; } = 0; + public int EmployeeCount { get; set; } = 0; + public ulong Lvl { get; set; } = 0; + public ulong Xp { get; set; } = 50; + public ulong FXp { get; set; } = 0; + public ulong TXp { get; set; } = 0; + + [Column(TypeName = "LONGTEXT")] + public string CropInventory { get; set; } = "{}"; + [Column(TypeName = "LONGTEXT")] + public string PlotInventory { get; set; } = "{}"; + + public Dictionary GetCropInventory() + { + return JsonConvert.DeserializeObject>(CropInventory); + } + public Dictionary GetPlotInventory() + { + return JsonConvert.DeserializeObject>(PlotInventory); + } + public void SetCropInventory(Dictionary inv) + { + Dictionary temp = new Dictionary(); + foreach (var entry in inv) + { + temp.Add((int)entry.Key, entry.Value); + } + CropInventory = JsonConvert.SerializeObject(temp); + } + public void SetPlotInventory(Dictionary inv) + { + Dictionary temp = new Dictionary(); + foreach (var entry in inv) + { + temp.Add((int)entry.Key, entry.Value); + } + PlotInventory = JsonConvert.SerializeObject(temp); + } + public static List ListCrops() + { + return new List + { + new FCrop() + { + Id = FarmCrop.Wheat, + Name = "Wheat", + Description = "Common wheat, 'Triticum aestivum' is the most widely grown cereal grain, you should get in on it before we reach peak wheat.", + Type = FarmType.Plant, + Tier = FarmTier.T0, + GrowTime = 10, + Price = 100, + }, + new FCrop() + { + Id = FarmCrop.Rye, + Name = "Rye", + Description = "Rye, 'Secale cereale' is a hardy cereal grain, grows slower than wheat, but also tastes better.", + Type = FarmType.Plant, + Tier = FarmTier.T1, + GrowTime = 15, + Price = 150, + }, + new FCrop() + { + Id = FarmCrop.Lettuce, + Name = "Lettuce", + Description = "Lettuce, 'Lactuca sativa' is an annual daisy plant first cultivated in ancient Egypt, worshipped as ancient viagra. Incidentally, it can be harvested very often.", + Type = FarmType.Plant, + Tier = FarmTier.T2, + GrowTime = 5, + Price = 200, + }, + new FCrop() + { + Id = FarmCrop.Leek, + Name = "Leek", + Description = "Leek, 'Allium ampeloprasum' is an onion, the word leek is derived from the old english word 'leac', it has a medium growth time. I know what you're thinking about doing and I want you to stop right now.", + Type = FarmType.Plant, + Tier = FarmTier.T3, + GrowTime = 13, + Price = 250, + }, + new FCrop() + { + Id = FarmCrop.Bookweed, + Name = "Bookweed", + Description = "Bookweed, 'Lactuca liber' is an enchanted variant of lettuce used for special crafting. Eating it by itself is said to give you diarrhea.", + Type = FarmType.Plant, + Tier = FarmTier.T4, + GrowTime = 50, + Price = 0, + }, + new FCrop() + { + Id = FarmCrop.LuckyLeek, + Name = "Polkka", + Description = "Polkka, 'Allium dexter' is an enchanted variant of leek used for special crafting. It contains a natural power to spin, and can be used as a green energy source. If you're a huge faggot.", + Type = FarmType.Plant, + Tier = FarmTier.T5, + GrowTime = 50, + Price = 0, + }, + }; + } + public static List ListFarmLand() + { + return new List + { + new FLand() + { + Id = FarmLand.Backyard, + Name = "Backyard", + Type = FarmType.Plant, + Tier = FarmTier.T0, + WorkerMax = 1, + Price = 0 + }, + new FLand() + { + Id = FarmLand.SPlot, + Name = "Small Plot", + Type = FarmType.Plant, + Tier = FarmTier.T1, + WorkerMax = 2, + Price = 600 + }, + new FLand() + { + Id = FarmLand.MPlot, + Name = "Medium Plot", + Type = FarmType.Plant, + Tier = FarmTier.T3, + WorkerMax = 4, + Price = 1000 + }, + new FLand() + { + Id = FarmLand.LPlot, + Name = "Large Plot", + Type = FarmType.Plant, + Tier = FarmTier.T5, + WorkerMax = 6, + Price = 1400 + }, + }; + } + } + public enum FarmLand + { + Backyard = 0, + Bathtub = 1, + SPlot = 2, + MPlot = 3, + LPlot = 4, + } + public enum FarmType + { + Plant = 0, + Fish = 1, + } + public enum FarmCrop + { + Wheat = 0, + Rye = 1, + Lettuce = 2, + Leek = 3, + + LuckyLeek = 100, + Bookweed = 101, + } + public enum FarmTier + { + T0 = 0, + T1 = 1, + T2 = 2, + T3 = 3, + T4 = 4, + T5 = 5, + } + public class FLand + { + public FarmLand Id { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public FarmType Type { get; set; } + public FarmTier Tier { get; set; } + public int WorkerMax { get; set; } + public int Price { get; set; } + + } + + public class FCrop + { + public FarmCrop Id { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public FarmType Type { get; set; } + public FarmTier Tier { get; set; } + public int GrowTime { get; set; } + public int Price { get; set; } + } + + public class PlotObject + { + [Key] + public ulong PlotId { get; set; } = 0; + [Required] + public ulong UserId { get; set; } = 0; + public ulong Planted { get; set; } = 0; + public ulong Grown { get; set; } = 0; + public int FarmType { get; set; } = 0; + public int WorkerAmount { get; set; } = 0; + + } + public class FCropSlot + { + public int Id; + public int Seeds; + public int Produce; + } + public class FPlotSlot + { + public int Id; + public int Amount; + } + +} diff --git a/Kehyeedra3/Services/Models/Fishing.cs b/Kehyeedra3/Services/Models/Fishing.cs index 641c4d4..815af0e 100644 --- a/Kehyeedra3/Services/Models/Fishing.cs +++ b/Kehyeedra3/Services/Models/Fishing.cs @@ -276,6 +276,14 @@ namespace Kehyeedra3.Services.Models Tier = FishTier.T2 }, new Fish() + { + Id = FishSpecies.Wololo, + Name = "Wololo", + + Rarity = FishRarity.Rare, + Tier = FishTier.T2 + }, + new Fish() { Id = FishSpecies.Gunfish, Name = "Gunfish", @@ -444,6 +452,7 @@ namespace Kehyeedra3.Services.Models //T2 Rare Swolefish = 21, Dogfish = 22, + Wololo = 23, //T2 Uncommon Gunfish = 30, Dingus = 31, diff --git a/Kehyeedra3/Services/Models/User.cs b/Kehyeedra3/Services/Models/User.cs index b86a386..cb43b1b 100644 --- a/Kehyeedra3/Services/Models/User.cs +++ b/Kehyeedra3/Services/Models/User.cs @@ -16,6 +16,7 @@ namespace Kehyeedra3.Services.Models public string GeneralInventory { get; set; } = "{}"; [Column(TypeName = "TINYINT")] public BattleFish CurrentBattlefish { get; set; } = 0; + public ulong OwnerId { get; set; } = 0; @@ -152,6 +153,7 @@ namespace Kehyeedra3.Services.Models UpgradeT2 = 200, UpgradeT3 = 201, UpgradeT4 = 202, + } public class ItemSlot { diff --git a/Kehyeedra3/Services/ReminderService.cs b/Kehyeedra3/Services/ReminderService.cs index d4f0a36..d7feef4 100644 --- a/Kehyeedra3/Services/ReminderService.cs +++ b/Kehyeedra3/Services/ReminderService.cs @@ -14,7 +14,7 @@ namespace Kehyeedra3.Services private static async Task SendReminderAsync(Reminder reminder) { try { - var dmchannel = await Bot._bot.GetUser(reminder.UserId).GetOrCreateDMChannelAsync(); + var dmchannel = await Bot._bot.GetUser(reminder.UserId).CreateDMChannelAsync(); if (dmchannel != null) { ulong m = (reminder.Send - reminder.Created) / 60; @@ -61,7 +61,7 @@ namespace Kehyeedra3.Services catch { if (LanChannel is null) { IUser Lan = Bot._bot.GetUser(242040333309837327); - LanChannel = await Lan.GetOrCreateDMChannelAsync(); + LanChannel = await Lan.CreateDMChannelAsync(); } await LanChannel.SendMessageAsync($"Time of error ^\n" +