public static async Task ShopStart(SocketTextChannel channel, SocketGuildUser user) { //Get the account information of the command's target var account = UserInfoClasses.GetAccount(user); var embed = new EmbedBuilder(); var author = new EmbedAuthorBuilder { Name = "Now Loading...", IconUrl = user.GetAvatarUrl() }; embed.WithAuthor(author); //Determine color for embeded message if (account.Profile_Theme == "P3") { embed.WithColor(37, 149, 255); } else if (account.Profile_Theme == "P4") { embed.WithColor(255, 229, 49); } else if (account.Profile_Theme == "P5") { embed.WithColor(213, 27, 4); } // Create a null variable for the message. RestUserMessage message = null; // Try to send a message to the channel. If the bot lacks permissions, catch the exception and return. try { message = await channel.SendMessageAsync("", false, embed.Build()); } catch (Exception ex) { Console.WriteLine(ex); return; } // Create a string list variable. List <string> original_decor_list; // Depending on the user's settings, fill the string list with an assortment of décor according to how the user wishes for it to be organized. original_decor_list = DecorInfoMethods.CreateSortSettingList(account.Shop_Sort); // Create an empty string list. List <string> owned_decor = new List <string> { }; // Check if the user owns any décor. if (account.Decor_Owned != "") { // If so, convert their Decor_Owned value into a string list and assign it to the owned_decor string list. owned_decor = DecorInfoMethods.StringToStringArray(account.Decor_Owned); } // Start comparing the user's owned_decor list to the created decor_list for the shop. // If the user owns any décor from the decor_list or has content blocked, remove the matching entry from the list var new_decor_list = original_decor_list.Except(owned_decor).ToList(); // Create another empty string list. List <string> user_content_filter = new List <string> { }; // Check if the user has any titles listed in their content filter. if (account.Content_Filter != "") { // If so, convert their Content_Filter value into a string list and assign it to the user_content_filter string list. user_content_filter = DecorInfoMethods.StringToStringArray(account.Content_Filter); } // Create a new list by removing any décor that contains content specified in the user's content filter and assign it to the new_decor_list variable. new_decor_list = DecorInfoMethods.RemoveBlockedContentFromList(new_decor_list, user_content_filter); // Search for an item list that corresponds to the user's ID. var itemSession = Global.ItemIdList.SingleOrDefault(x => x.User.Id == user.Id); // If an item session already exists, remove it from the global list. if (itemSession != null) { Global.ItemIdList.Remove(itemSession); } // Create a new item identifier entry for this current user to keep track of the position of décor on the menu. itemSession = new ItemListIterator() { User = user, ItemList = new_decor_list, ItemIndexBase = 0, MaxItemsDisplayed = 6, CurrentPage = 1 }; // Add the item entry to the global list. Global.ItemIdList.Add(itemSession); // Create a new menu identifier entry for this current message and user to keep track of the overall menu status. var idTracker = new MenuIdStructure() { User = user, MenuMessage = message, CurrentMenu = "Shop_Start", MenuTimer = new Timer() { // Create a timer that expires as a "time out" duration for the user. Interval = MenuConfig.menu.timerDuration, AutoReset = false, Enabled = true } }; // Add the menu entry to the global list. Global.MenuIdList.Add(idTracker); // Create a new menu in the current channel. await ShopMainMenu(idTracker.User, idTracker.MenuMessage); }
public static async Task ShopDecorPreview(SocketGuildUser user, RestUserMessage message, int item_index) { // Get the account information of the command's target var account = UserInfoClasses.GetAccount(user); // Find both the menu session and item session associated with the current user and store them in variables. var menuSession = Global.MenuIdList.SingleOrDefault(x => x.User.Id == user.Id); var itemSession = Global.ItemIdList.SingleOrDefault(x => x.User.Id == user.Id); // Get the information of the chosen décor index. var decor_info = DecorInfoMethods.GetDecorInfo(itemSession.ItemList[item_index]); // Create a new embed that will be displayed in the message. var embed = new EmbedBuilder(); var author = new EmbedAuthorBuilder { Name = "Décor Preview", IconUrl = user.GetAvatarUrl() }; embed.WithAuthor(author); // Create an empty string variable for the description text. string description_text = ""; // Create an empty string list. List <string> owned_decor = new List <string> { }; // Check if the user owns any décor. if (account.Decor_Owned != "") { // If so, convert their Decor_Owned value into a string list and assign it to the owned_decor string list. owned_decor = DecorInfoMethods.StringToStringArray(account.Decor_Owned); } // Perform a check to see if the user has enough money to purchase the décor. If so, state the cost. if (account.P_Medals >= decor_info.Price) { description_text = $"Purchase this décor for <:cost:780352551945895936> **{decor_info.Price}**?"; } // If the user does not have enough money, prevent them from purchasing the décor. else { description_text = $"You do not have enough P-Medals to purchase this décor."; } // Add the description to the embed. embed.WithDescription(description_text); embed.WithThumbnailUrl($"{decor_info.Thumbnail_Link}"); embed.AddField("Wallet", $"<:PMedals:672637091171139615> **{account.P_Medals}**"); embed.AddField("Title", $"{decor_info.Title}", true); embed.AddField("Game", $"{decor_info.Game}", true); embed.AddField("Designer", $"[{decor_info.Designer_Name}]({decor_info.Designer_Link})", true); // If a description exists for the décor itself, add it as a field. if (decor_info.Description != null) { embed.AddField("Description", $"{decor_info.Description}", false); } // Set the color of the embed by converting the décor's stored hex value to a usable format. embed.WithColor((Discord.Color)System.Drawing.ColorTranslator.FromHtml($"{decor_info.Embed_Color}")); // Create a string variable for text that will be displayed in the footer. string footer_text = "↩️ Back"; // If the user doesn't own the décor being displayed and has enough money to purchase it, add a "Confirm" emote to the footer. if (owned_decor.Contains(decor_info.Decor_ID) == false && account.P_Medals >= decor_info.Price) { footer_text += $" | ✅ Confirm"; } var footer = new EmbedFooterBuilder { Text = footer_text }; // Add the footer to the embed. embed.WithFooter(footer); // Attach a locally generated image to the embed. This image hasn't been created yet, so the filename is just a placeholder for now. embed.WithImageUrl($"attachment://{decor_info.Decor_ID}_preview.png"); // Create a new stream. We'll use this to create the locally generated image. MemoryStream memoryStream = new MemoryStream(); // Generate a bitmap comprised of the thumbnail of the current décor. Bitmap decor_preview = (Bitmap)System.Drawing.Image.FromFile($@"{AssetDirectoryConfig.assetDirectory.assetFolderPath}//Profile//StatusScreens//Decor//{decor_info.Decor_ID}//_Thumbnails//preview_1.png"); // Save the décor preview bitmap to the stream as a PNG. decor_preview.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png); // Ensure the stream is set to the beginning of itself. memoryStream.Seek(0, SeekOrigin.Begin); // Attempt deleting the message if it hasn't been deleted by the user yet. try { // Delete the current message from the channel. await message.DeleteAsync(); } catch (Exception ex) { Console.WriteLine(ex); } // If the bot lacks permission to attach files, catch the exception, send an error message, and return. try { // Reassign the menu session's message to a new message generated from the created embed and preview image. menuSession.MenuMessage = (RestUserMessage)await message.Channel.SendFileAsync(memoryStream, $"{decor_info.Decor_ID}_preview.png", "", false, embed.Build()); } catch (Exception ex) { await ErrorHandling.AttachFilesError((SocketTextChannel)message.Channel); Console.WriteLine(ex); return; } // Set the "message" variable to the menu session's message. message = menuSession.MenuMessage; // Edit the menu session according to the current message. menuSession.CurrentMenu = "Shop_Decor_Preview"; menuSession.MenuTimer = new Timer() { // Create a timer that expires as a "time out" duration for the user. Interval = MenuConfig.menu.timerDuration, AutoReset = false, Enabled = true }; // Edit the item session to save the selected décor's ID to a variable. // If the user chooses to buy it, we will be able to pass its information to other methods. itemSession.SelectedItem = decor_info.Decor_ID; // If the menu timer runs out, activate a function. menuSession.MenuTimer.Elapsed += (sender, e) => MenuTimer_Elapsed(sender, e, menuSession, itemSession); // Create an empty list for reactions. List <IEmote> reaction_list = new List <IEmote> { }; // Add needed emote reactions for the menu. reaction_list.Add(new Emoji("↩️")); // If the user does not own this décor and has enough money to purchase it, add a checkmark reaction to the message. if (owned_decor.Contains(decor_info.Decor_ID) == false && account.P_Medals >= decor_info.Price) { reaction_list.Add(new Emoji("✅")); } // Add the reactions to the message. _ = ReactionHandling.AddReactionsToMenu(message, reaction_list); }
public static async Task Status_Decor_Start(SocketGuildUser user, RestUserMessage message) { //Get the account information of the command's target var account = UserInfoClasses.GetAccount(user); // Find the menu session associated with the current user. var menuSession = Global.MenuIdList.SingleOrDefault(x => x.User.Id == user.Id); var embed = new EmbedBuilder(); var author = new EmbedAuthorBuilder { Name = "Now Loading...", IconUrl = user.GetAvatarUrl() }; embed.WithAuthor(author); // Determine the color and thumbnail for the embeded message. embed.WithColor(EmbedSettings.Get_Profile_Embed_Color(account)); // Create an empty string list. List <string> owned_decor = new List <string> { }; // Check if the user owns any décor. if (account.Decor_Owned != "") { // If so, convert their Decor_Owned value into a string list and assign it to the owned_decor string list. owned_decor = DecorInfoMethods.StringToStringArray(account.Decor_Owned); } // Create another empty string list. List <string> user_content_filter = new List <string> { }; // Check if the user has any titles listed in their content filter. if (account.Content_Filter != "") { // If so, convert their Content_Filter value into a string list and assign it to the user_content_filter string list. user_content_filter = DecorInfoMethods.StringToStringArray(account.Content_Filter); } // Create a new list by removing any décor that contains content specified in the user's content filter and assign it to the owned_decor variable. owned_decor = DecorInfoMethods.RemoveBlockedContentFromList(owned_decor, user_content_filter); // Search for an item list that corresponds to the user's ID. var itemSession = Global.ItemIdList.SingleOrDefault(x => x.User.Id == user.Id); // If an item session already exists, remove it from the global list. if (itemSession != null) { Global.ItemIdList.Remove(itemSession); } // Create a new item identifier entry for this current user to keep track of the position of décor on the menu. itemSession = new ItemListIterator() { User = user, ItemList = owned_decor, ItemIndexBase = 0, MaxItemsDisplayed = 6, CurrentPage = 1 }; // Add the item entry to the global list. Global.ItemIdList.Add(itemSession); // Attempt editing the message if it hasn't been deleted by the user yet. If it has, catch the exception, send an error message, and return. try { // Remove all reactions from the current message. await message.RemoveAllReactionsAsync(); // Edit the current active message by replacing it with the recently created embed. await message.ModifyAsync(x => { x.Embed = embed.Build(); }); } catch (Exception ex) { await ErrorHandling.MissingMessageError((SocketTextChannel)message.Channel); Console.WriteLine(ex); return; } // Edit the menu session according to the current message. menuSession.CurrentMenu = "Status_Decor_Start"; menuSession.MenuTimer = new Timer() { // Create a timer that expires as a "time out" duration for the user. Interval = MenuConfig.menu.timerDuration, AutoReset = false, Enabled = true }; // Create a new menu in the current channel. await Status_Decor_Main(menuSession.User, menuSession.MenuMessage); }