From 8ac6610c55b673076b193ac8cb80694437342d9e Mon Sep 17 00:00:00 2001 From: Gengar <80122551+bdawg1989@users.noreply.github.com> Date: Tue, 11 Jun 2024 21:41:49 -0500 Subject: [PATCH] Version bump => 2.8.7 - Include Native check for AutoOT - Clean up code - Add Stellar Tera Type to Emoji Settings --- .../Switch/Wireless/SwitchSocketAsync.cs | 3 +- SysBot.Pokemon.Bilibili/BilibiliLiveBot.cs | 3 +- .../Commands/Bots/Pokepaste.cs | 3 +- .../Commands/Bots/SpecialRequestModule.cs | 6 +- .../Commands/Bots/TradeModule.cs | 5 +- .../Commands/Bots/VGCPastes.cs | 12 +- .../Commands/Extra/LegalityCheckModule.cs | 6 +- .../Commands/Extra/LegalizerModule.cs | 3 +- .../Commands/Management/EncounterModule.cs | 3 +- .../Commands/Management/OwnerModule.cs | 6 +- .../Commands/Management/SudoModule.cs | 3 +- .../Helpers/DetailsExtractor.cs | 28 +--- .../Helpers/DiscordTradeNotifier.cs | 5 +- SysBot.Pokemon.Discord/Helpers/QueueHelper.cs | 5 +- SysBot.Pokemon.Discord/SysCord.cs | 3 +- SysBot.Pokemon.Twitch/TwitchBot.cs | 3 +- .../Controls/BotController.cs | 3 +- SysBot.Pokemon.WinForms/UpdateChecker.cs | 2 +- SysBot.Pokemon.WinForms/UpdateForm.cs | 3 +- SysBot.Pokemon.Z3/Z3/Z3Search.cs | 6 +- SysBot.Pokemon.Z3/Z3/Z3SeedSearchHandler.cs | 3 +- .../BDSP/BotTrade/PokeTradeBotBS.cs | 12 +- SysBot.Pokemon/BDSP/PokeRoutineExecutor8BS.cs | 3 +- SysBot.Pokemon/Helpers/AbstractTrade.cs | 25 ++- SysBot.Pokemon/Helpers/AutoCorrectShowdown.cs | 2 +- SysBot.Pokemon/Helpers/AutoLegalityWrapper.cs | 6 +- SysBot.Pokemon/LA/BotTrade/PokeTradeBotLA.cs | 16 +- SysBot.Pokemon/LA/PokeRoutineExecutor8LA.cs | 3 +- SysBot.Pokemon/SV/BotTrade/PokeTradeBotSV.cs | 55 +++++-- SysBot.Pokemon/SV/PokeRoutineExecutor9SV.cs | 3 +- .../SWSH/BotTrade/PokeTradeBotSWSH.cs | 22 ++- .../SWSH/PokeRoutineExecutor8SWSH.cs | 3 +- .../Settings/Integrations/StreamSettings.cs | 3 +- SysBot.Pokemon/Settings/TradeSettings.cs | 150 +++++++++--------- SysBot.Pokemon/Structures/Ledy/PokemonPool.cs | 2 +- SysBot.Pokemon/TradeHub/SpecialRequests.cs | 3 +- 36 files changed, 216 insertions(+), 206 deletions(-) diff --git a/SysBot.Base/Connection/Switch/Wireless/SwitchSocketAsync.cs b/SysBot.Base/Connection/Switch/Wireless/SwitchSocketAsync.cs index 7556b7691..e3dcf8322 100644 --- a/SysBot.Base/Connection/Switch/Wireless/SwitchSocketAsync.cs +++ b/SysBot.Base/Connection/Switch/Wireless/SwitchSocketAsync.cs @@ -110,8 +110,7 @@ public async Task PixelPeek(CancellationToken token) try { - var result = Decoder.ConvertHexByteStringToBytes(data); - return result; + return Decoder.ConvertHexByteStringToBytes(data); } catch (Exception e) { diff --git a/SysBot.Pokemon.Bilibili/BilibiliLiveBot.cs b/SysBot.Pokemon.Bilibili/BilibiliLiveBot.cs index 3ed50c294..a48d63ba6 100644 --- a/SysBot.Pokemon.Bilibili/BilibiliLiveBot.cs +++ b/SysBot.Pokemon.Bilibili/BilibiliLiveBot.cs @@ -180,8 +180,7 @@ private static int GenerateUniqueTradeID() { long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); int randomValue = new Random().Next(1000); - int uniqueTradeID = ((int)(timestamp % int.MaxValue) * 1000) + randomValue; - return uniqueTradeID; + return ((int)(timestamp % int.MaxValue) * 1000) + randomValue; } } } diff --git a/SysBot.Pokemon.Discord/Commands/Bots/Pokepaste.cs b/SysBot.Pokemon.Discord/Commands/Bots/Pokepaste.cs index 576fa0d32..676fa73c7 100644 --- a/SysBot.Pokemon.Discord/Commands/Bots/Pokepaste.cs +++ b/SysBot.Pokemon.Discord/Commands/Bots/Pokepaste.cs @@ -196,8 +196,7 @@ private static List ParseShowdownSets(string pokePasteHtml) { var showdownSets = new List(); var regex = new Regex(@"
(.*?)
", RegexOptions.Singleline); - var matches = regex.Matches(pokePasteHtml); - foreach (Match match in matches) + foreach (Match match in regex.Matches(pokePasteHtml)) { var showdownText = match.Groups[1].Value; showdownText = System.Net.WebUtility.HtmlDecode(Regex.Replace(showdownText, "<.*?>", string.Empty)); diff --git a/SysBot.Pokemon.Discord/Commands/Bots/SpecialRequestModule.cs b/SysBot.Pokemon.Discord/Commands/Bots/SpecialRequestModule.cs index 5b1b9eaa5..2e2143bd6 100644 --- a/SysBot.Pokemon.Discord/Commands/Bots/SpecialRequestModule.cs +++ b/SysBot.Pokemon.Discord/Commands/Bots/SpecialRequestModule.cs @@ -209,8 +209,7 @@ private static EmbedBuilder BuildEventListEmbed(string generationOrGame, IOrdere .WithDescription($"Page {page} of {pageCount}") .WithColor(DiscordColor.Blue); - var pageItems = allEvents.Skip((page - 1) * itemsPerPage).Take(itemsPerPage); - foreach (var item in pageItems) + foreach (var item in allEvents.Skip((page - 1) * itemsPerPage).Take(itemsPerPage)) { embed.AddField($"{item.Index}. {item.EventInfo}", $"Use `{botPrefix}srp {generationOrGame} {item.Index}` to request this event."); } @@ -269,8 +268,7 @@ private async Task CleanupUserMessageAsync() var (start, end) = GetEncounterDateRange(selectedEvent); if (start.HasValue && end.HasValue) { - var randomDate = GenerateRandomDateInRange(start.Value, end.Value); - pk.MetDate = randomDate; + pk.MetDate = GenerateRandomDateInRange(start.Value, end.Value); } else { diff --git a/SysBot.Pokemon.Discord/Commands/Bots/TradeModule.cs b/SysBot.Pokemon.Discord/Commands/Bots/TradeModule.cs index 2b4ca85ab..288e639bc 100644 --- a/SysBot.Pokemon.Discord/Commands/Bots/TradeModule.cs +++ b/SysBot.Pokemon.Discord/Commands/Bots/TradeModule.cs @@ -732,10 +732,9 @@ public async Task BatchTradeAsync([Summary("List of Showdown Sets separated by ' private static List ParseBatchTradeContent(string content) { var delimiters = new[] { "---", "—-" }; // Includes both three hyphens and an em dash followed by a hyphen - var trades = content.Split(delimiters, StringSplitOptions.RemoveEmptyEntries) + return content.Split(delimiters, StringSplitOptions.RemoveEmptyEntries) .Select(trade => trade.Trim()) .ToList(); - return trades; } [Command("batchtradezip")] @@ -777,7 +776,7 @@ public async Task BatchTradeZipAsync() using var archive = new ZipArchive(zipStream, ZipArchiveMode.Read); var entries = archive.Entries.ToList(); - var maxTradesAllowed = 6; // for full team in the zip created + const int maxTradesAllowed = 6; // for full team in the zip created // Check if batch mode is allowed and if the number of trades exceeds the limit if (maxTradesAllowed < 1 || entries.Count > maxTradesAllowed) diff --git a/SysBot.Pokemon.Discord/Commands/Bots/VGCPastes.cs b/SysBot.Pokemon.Discord/Commands/Bots/VGCPastes.cs index b2ee7631d..381e42237 100644 --- a/SysBot.Pokemon.Discord/Commands/Bots/VGCPastes.cs +++ b/SysBot.Pokemon.Discord/Commands/Bots/VGCPastes.cs @@ -26,16 +26,14 @@ private static async Task DownloadSpreadsheetAsCsv() using var httpClient = new HttpClient(); var response = await httpClient.GetAsync(csvUrl); response.EnsureSuccessStatusCode(); - var csvData = await response.Content.ReadAsStringAsync(); - return csvData; + return await response.Content.ReadAsStringAsync(); } private async Task>> FetchSpreadsheetData() { var csvData = await VGCPastes.DownloadSpreadsheetAsCsv(); var rows = csvData.Split('\n'); - var data = rows.Select(row => row.Split(',').Select(cell => cell.Trim('"')).ToList()).ToList(); - return data; + return rows.Select(row => row.Split(',').Select(cell => cell.Trim('"')).ToList()).ToList(); } private static List<(string TrainerName, string PokePasteUrl, string TeamDescription, string DateShared, string RentalCode)> ParsePokePasteData(List> data, string? pokemonName = null) @@ -260,8 +258,7 @@ private static async Task> GetShowdownSetsFromPokePasteUrl(str { var httpClient = new HttpClient(); var pokePasteHtml = await httpClient.GetStringAsync(pokePasteUrl); - var showdownSets = ParseShowdownSets(pokePasteHtml); - return showdownSets; + return ParseShowdownSets(pokePasteHtml); } private static List ParseShowdownSets(string pokePasteHtml) @@ -317,8 +314,7 @@ private static System.Drawing.Image CombineImages(List ima private static string SanitizeFileName(string fileName) { var invalidChars = Path.GetInvalidFileNameChars(); - var validName = string.Join("_", fileName.Split(invalidChars, StringSplitOptions.RemoveEmptyEntries)).TrimEnd('.'); - return validName; + return string.Join("_", fileName.Split(invalidChars, StringSplitOptions.RemoveEmptyEntries)).TrimEnd('.'); } private static DiscordColor GetTypeColor() diff --git a/SysBot.Pokemon.Discord/Commands/Extra/LegalityCheckModule.cs b/SysBot.Pokemon.Discord/Commands/Extra/LegalityCheckModule.cs index dc975e106..f25f756ac 100644 --- a/SysBot.Pokemon.Discord/Commands/Extra/LegalityCheckModule.cs +++ b/SysBot.Pokemon.Discord/Commands/Extra/LegalityCheckModule.cs @@ -11,8 +11,7 @@ public class LegalityCheckModule : ModuleBase [Summary("Verifies the attachment for legality.")] public async Task LegalityCheck() { - var attachments = Context.Message.Attachments; - foreach (var att in attachments) + foreach (var att in (System.Collections.Generic.IReadOnlyCollection)Context.Message.Attachments) await LegalityCheck(att, false).ConfigureAwait(false); } @@ -20,8 +19,7 @@ public async Task LegalityCheck() [Summary("Verifies the attachment for legality with a verbose output.")] public async Task LegalityCheckVerbose() { - var attachments = Context.Message.Attachments; - foreach (var att in attachments) + foreach (var att in (System.Collections.Generic.IReadOnlyCollection)Context.Message.Attachments) await LegalityCheck(att, true).ConfigureAwait(false); } diff --git a/SysBot.Pokemon.Discord/Commands/Extra/LegalizerModule.cs b/SysBot.Pokemon.Discord/Commands/Extra/LegalizerModule.cs index 1e6d676b8..7f35858dc 100644 --- a/SysBot.Pokemon.Discord/Commands/Extra/LegalizerModule.cs +++ b/SysBot.Pokemon.Discord/Commands/Extra/LegalizerModule.cs @@ -26,8 +26,7 @@ public Task ConvertShowdown([Remainder][Summary("Showdown Set")] string content) [Summary("Tries to legalize the attached pkm data.")] public async Task LegalizeAsync() { - var attachments = Context.Message.Attachments; - foreach (var att in attachments) + foreach (var att in (System.Collections.Generic.IReadOnlyCollection)Context.Message.Attachments) await Context.Channel.ReplyWithLegalizedSetAsync(att).ConfigureAwait(false); } } diff --git a/SysBot.Pokemon.Discord/Commands/Management/EncounterModule.cs b/SysBot.Pokemon.Discord/Commands/Management/EncounterModule.cs index 147c454f6..0df2051cc 100644 --- a/SysBot.Pokemon.Discord/Commands/Management/EncounterModule.cs +++ b/SysBot.Pokemon.Discord/Commands/Management/EncounterModule.cs @@ -12,8 +12,7 @@ namespace SysBot.Pokemon.Discord; [RequireSudo] public async Task TossAsync(string name = "") { - var bots = SysCord.Runner.Bots.Select(z => z.Bot); - foreach (var b in bots) + foreach (var b in SysCord.Runner.Bots.Select(z => z.Bot)) { if (b is not IEncounterBot x) continue; diff --git a/SysBot.Pokemon.Discord/Commands/Management/OwnerModule.cs b/SysBot.Pokemon.Discord/Commands/Management/OwnerModule.cs index a24e98148..f01ff42f4 100644 --- a/SysBot.Pokemon.Discord/Commands/Management/OwnerModule.cs +++ b/SysBot.Pokemon.Discord/Commands/Management/OwnerModule.cs @@ -264,7 +264,7 @@ public async Task RePeek() } await using MemoryStream ms = new(bytes); - var img = "cap.jpg"; + const string img = "cap.jpg"; var embed = new EmbedBuilder { ImageUrl = $"attachment://{img}", Color = (DiscordColor?)Color.Purple } .WithFooter(new EmbedFooterBuilder { Text = "Here's your screenshot." }); @@ -295,7 +295,7 @@ public async Task RePeekGIF() return; } - var screenshotCount = 10; + const int screenshotCount = 10; var screenshotInterval = TimeSpan.FromSeconds(0.1 / 10); #pragma warning disable CA1416 // Validate platform compatibility var gifFrames = new List(); @@ -350,7 +350,7 @@ public async Task RePeekGIF() } ms.Position = 0; - var gifFileName = "screenshot.gif"; + const string gifFileName = "screenshot.gif"; var embed = new EmbedBuilder { ImageUrl = $"attachment://{gifFileName}", Color = (DiscordColor?)Color.Red } .WithFooter(new EmbedFooterBuilder { Text = "Here's your GIF." }); diff --git a/SysBot.Pokemon.Discord/Commands/Management/SudoModule.cs b/SysBot.Pokemon.Discord/Commands/Management/SudoModule.cs index b9d15ccf3..4e53545e9 100644 --- a/SysBot.Pokemon.Discord/Commands/Management/SudoModule.cs +++ b/SysBot.Pokemon.Discord/Commands/Management/SudoModule.cs @@ -88,8 +88,7 @@ public async Task BlackListUsers(ulong id, [Remainder] string comment) [RequireSudo] public async Task ForgetPreviousUser([Summary("Comma Separated Online IDs")][Remainder] string content) { - var IDs = GetIDs(content); - foreach (var ID in IDs) + foreach (var ID in GetIDs(content)) { PokeRoutineExecutorBase.PreviousUsers.RemoveAllNID(ID); PokeRoutineExecutorBase.PreviousUsersDistribution.RemoveAllNID(ID); diff --git a/SysBot.Pokemon.Discord/Helpers/DetailsExtractor.cs b/SysBot.Pokemon.Discord/Helpers/DetailsExtractor.cs index 1cd0173fd..6eb039200 100644 --- a/SysBot.Pokemon.Discord/Helpers/DetailsExtractor.cs +++ b/SysBot.Pokemon.Discord/Helpers/DetailsExtractor.cs @@ -5,10 +5,11 @@ using System; using System.Collections.Generic; using System.Linq; +using static SysBot.Pokemon.TradeSettings; namespace SysBot.Pokemon.Discord; -public class DetailsExtractor where T : PKM, new() +public static class DetailsExtractor where T : PKM, new() { public static void AddAdditionalText(EmbedBuilder embedBuilder) { @@ -104,7 +105,7 @@ public static EmbedData ExtractPokemonDetails(T pk, SocketUser user, bool isMyst embedData.IVsDisplay = ivsDisplay; int[] evs = GetEVs(pk); - string evsDisplay = string.Join(" / ", new[] { + embedData.EVsDisplay = string.Join(" / ", new[] { (evs[0] != 0 ? $"{evs[0]} HP" : ""), (evs[1] != 0 ? $"{evs[1]} Atk" : ""), (evs[2] != 0 ? $"{evs[2]} Def" : ""), @@ -112,7 +113,6 @@ public static EmbedData ExtractPokemonDetails(T pk, SocketUser user, bool isMyst (evs[5] != 0 ? $"{evs[5]} SpD" : ""), (evs[3] != 0 ? $"{evs[3]} Spe" : "") // correct pkhex/ALM ordering of stats }.Where(s => !string.IsNullOrEmpty(s))); - embedData.EVsDisplay = evsDisplay; embedData.MetDate = pk.MetDate.ToString(); embedData.MovesDisplay = string.Join("\n", embedData.Moves); embedData.PokemonDisplayName = pk.IsNicknamed ? pk.Nickname : embedData.SpeciesName; @@ -180,14 +180,14 @@ private static List GetMoveNames(T pk) var typeEmojis = SysCord.Runner.Config.Trade.TradeEmbedSettings.CustomTypeEmojis .Where(e => !string.IsNullOrEmpty(e.EmojiCode)) - .ToDictionary(e => e.MoveType, e => $"{e.EmojiCode}"); + .ToDictionary(e => (PKHeX.Core.MoveType)e.MoveType, e => $"{e.EmojiCode}"); for (int i = 0; i < moves.Length; i++) { if (moves[i] == 0) continue; string moveName = GameInfo.MoveDataSource.FirstOrDefault(m => m.Value == moves[i])?.Text ?? ""; byte moveTypeId = MoveInfo.GetType(moves[i], default); - MoveType moveType = (MoveType)moveTypeId; + PKHeX.Core.MoveType moveType = (PKHeX.Core.MoveType)moveTypeId; string formattedMove = $"{moveName} ({movePPs[i]}pp)"; if (SysCord.Runner.Config.Trade.TradeEmbedSettings.MoveTypeEmojis && typeEmojis.TryGetValue(moveType, out var moveEmoji)) { @@ -245,26 +245,14 @@ private static string GetTeraTypeString(PK9 pk9) { if (SysCord.Runner.Config.Trade.TradeEmbedSettings.UseTeraEmojis) { - var teraType = pk9.TeraTypeOverride == (MoveType)TeraTypeUtil.Stellar ? MoveType.Normal : pk9.TeraType; - var emojiInfo = SysCord.Runner.Config.Trade.TradeEmbedSettings.TeraTypeEmojis.FirstOrDefault(e => e.MoveType == teraType); + var teraType = pk9.TeraTypeOverride == (PKHeX.Core.MoveType)TeraTypeUtil.Stellar || (int)pk9.TeraType == 99 ? TradeSettings.MoveType.Stellar : (TradeSettings.MoveType)pk9.TeraType; + var emojiInfo = SysCord.Runner.Config.Trade.TradeEmbedSettings.TeraTypeEmojis.Find(e => e.MoveType == teraType); if (emojiInfo != null && !string.IsNullOrEmpty(emojiInfo.EmojiCode)) { return emojiInfo.EmojiCode; } } - - if (pk9.TeraTypeOverride == (MoveType)TeraTypeUtil.Stellar) - { - return "Stellar"; - } - else if ((int)pk9.TeraType == 99) // Terapagos - { - return "Stellar"; - } - else - { - return pk9.TeraType.ToString(); - } + return pk9.TeraType.ToString(); } private static string GetTradeTitle(bool isMysteryEgg, bool isCloneRequest, bool isDumpRequest, bool isFixOTRequest, bool isSpecialRequest, bool isBatchTrade, int batchTradeNumber, string pokemonDisplayName, bool isShiny) diff --git a/SysBot.Pokemon.Discord/Helpers/DiscordTradeNotifier.cs b/SysBot.Pokemon.Discord/Helpers/DiscordTradeNotifier.cs index aa9d0df81..637611817 100644 --- a/SysBot.Pokemon.Discord/Helpers/DiscordTradeNotifier.cs +++ b/SysBot.Pokemon.Discord/Helpers/DiscordTradeNotifier.cs @@ -1,11 +1,8 @@ using Discord; using Discord.WebSocket; using PKHeX.Core; -using PKHeX.Core.AutoMod; -using PKHeX.Drawing.PokeSprite; using System; using System.Collections.Generic; -using System.Drawing; using System.Linq; using Color = Discord.Color; @@ -48,7 +45,7 @@ public DiscordTradeNotifier(T data, PokeTradeTrainerInfo info, int code, SocketU public void TradeInitialize(PokeRoutineExecutor routine, PokeTradeDetail info) { - int language = 2; + const int language = 2; var speciesName = SpeciesName.GetSpeciesName(Data.Species, language); var batchInfo = TotalBatchTrades > 1 ? $" (Trade {BatchTradeNumber} of {TotalBatchTrades})" : ""; var receive = Data.Species == 0 ? string.Empty : $" ({Data.Nickname})"; diff --git a/SysBot.Pokemon.Discord/Helpers/QueueHelper.cs b/SysBot.Pokemon.Discord/Helpers/QueueHelper.cs index 35ea17084..0453de6d6 100644 --- a/SysBot.Pokemon.Discord/Helpers/QueueHelper.cs +++ b/SysBot.Pokemon.Discord/Helpers/QueueHelper.cs @@ -213,8 +213,7 @@ private static int GenerateUniqueTradeID() { long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); int randomValue = new Random().Next(1000); - int uniqueTradeID = ((int)(timestamp % int.MaxValue) * 1000) + randomValue; - return uniqueTradeID; + return ((int)(timestamp % int.MaxValue) * 1000) + randomValue; } private static string GetImageFolderPath() @@ -253,7 +252,7 @@ private static string SaveImageLocally(System.Drawing.Image image) if (pk.IsEgg) { - string eggImageUrl = "https://raw.githubusercontent.com/bdawg1989/sprites/main/egg.png"; + const string eggImageUrl = "https://raw.githubusercontent.com/bdawg1989/sprites/main/egg.png"; speciesImageUrl = AbstractTrade.PokeImg(pk, false, true, null); System.Drawing.Image combinedImage = await OverlaySpeciesOnEgg(eggImageUrl, speciesImageUrl); embedImageUrl = SaveImageLocally(combinedImage); diff --git a/SysBot.Pokemon.Discord/SysCord.cs b/SysBot.Pokemon.Discord/SysCord.cs index 78bfce9a1..93e1bbf18 100644 --- a/SysBot.Pokemon.Discord/SysCord.cs +++ b/SysBot.Pokemon.Discord/SysCord.cs @@ -197,8 +197,7 @@ public async Task InitCommands() var assembly = Assembly.GetExecutingAssembly(); await _commands.AddModulesAsync(assembly, _services).ConfigureAwait(false); - var genericTypes = assembly.DefinedTypes.Where(z => z.IsSubclassOf(typeof(ModuleBase)) && z.IsGenericType); - foreach (var t in genericTypes) + foreach (var t in assembly.DefinedTypes.Where(z => z.IsSubclassOf(typeof(ModuleBase)) && z.IsGenericType)) { var genModule = t.MakeGenericType(typeof(T)); await _commands.AddModuleAsync(genModule, _services).ConfigureAwait(false); diff --git a/SysBot.Pokemon.Twitch/TwitchBot.cs b/SysBot.Pokemon.Twitch/TwitchBot.cs index d8b21c9cc..7d0cc647e 100644 --- a/SysBot.Pokemon.Twitch/TwitchBot.cs +++ b/SysBot.Pokemon.Twitch/TwitchBot.cs @@ -108,8 +108,7 @@ private static int GenerateUniqueTradeID() { long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); int randomValue = new Random().Next(1000); - int uniqueTradeID = ((int)(timestamp % int.MaxValue) * 1000) + randomValue; - return uniqueTradeID; + return ((int)(timestamp % int.MaxValue) * 1000) + randomValue; } private bool AddToTradeQueue(T pk, int code, OnWhisperReceivedArgs e, RequestSignificance sig, PokeRoutineType type, out string msg) diff --git a/SysBot.Pokemon.WinForms/Controls/BotController.cs b/SysBot.Pokemon.WinForms/Controls/BotController.cs index 51bf359e6..710f8f00d 100644 --- a/SysBot.Pokemon.WinForms/Controls/BotController.cs +++ b/SysBot.Pokemon.WinForms/Controls/BotController.cs @@ -139,8 +139,7 @@ public void ReloadStatus(BotSource b) { // blend from green->red, favoring green until near saturation var factor = seconds / (double)threshold; - var blend = Blend(bad, good, factor * factor); - PB_Lamp.BackColor = blend; + PB_Lamp.BackColor = Blend(bad, good, factor * factor); } } diff --git a/SysBot.Pokemon.WinForms/UpdateChecker.cs b/SysBot.Pokemon.WinForms/UpdateChecker.cs index 087a5aed1..6c43cbc6e 100644 --- a/SysBot.Pokemon.WinForms/UpdateChecker.cs +++ b/SysBot.Pokemon.WinForms/UpdateChecker.cs @@ -64,7 +64,7 @@ public static async Task FetchChangelogAsync() #pragma warning disable CS8604 // Possible null reference argument. #pragma warning disable CS8602 // Dereference of a possibly null reference. - string? downloadUrl = latestRelease.Assets.FirstOrDefault(a => a.Name.EndsWith(".exe", StringComparison.OrdinalIgnoreCase))?.BrowserDownloadUrl; + string? downloadUrl = latestRelease.Assets.Find(a => a.Name.EndsWith(".exe", StringComparison.OrdinalIgnoreCase))?.BrowserDownloadUrl; #pragma warning restore CS8602 // Dereference of a possibly null reference. #pragma warning restore CS8604 // Possible null reference argument. diff --git a/SysBot.Pokemon.WinForms/UpdateForm.cs b/SysBot.Pokemon.WinForms/UpdateForm.cs index 1db7758dd..4e96917a8 100644 --- a/SysBot.Pokemon.WinForms/UpdateForm.cs +++ b/SysBot.Pokemon.WinForms/UpdateForm.cs @@ -99,8 +99,7 @@ private void InitializeComponent() private async Task FetchAndDisplayChangelog() { _ = new UpdateChecker(); - string changelog = await UpdateChecker.FetchChangelogAsync(); - textBoxChangelog.Text = changelog; + textBoxChangelog.Text = await UpdateChecker.FetchChangelogAsync(); } private async void ButtonDownload_Click(object? sender, EventArgs? e) diff --git a/SysBot.Pokemon.Z3/Z3/Z3Search.cs b/SysBot.Pokemon.Z3/Z3/Z3Search.cs index 43d2e0a9b..fc5634988 100644 --- a/SysBot.Pokemon.Z3/Z3/Z3Search.cs +++ b/SysBot.Pokemon.Z3/Z3/Z3Search.cs @@ -9,16 +9,14 @@ public static class Z3Search { public static IEnumerable FindPotentialSeeds(uint ec, uint pid) { - var seeds = new XoroMachineSkip(ec, pid); - foreach (var seed in seeds) + foreach (var seed in new XoroMachineSkip(ec, pid)) yield return seed; } public static IList GetAllSeeds(uint ec, uint pid, Span ivs, SeedCheckResults mode) { var result = new List(); - var seeds = GetSeeds(ec, pid); - foreach (var seed in seeds) + foreach (var seed in GetSeeds(ec, pid)) { // Verify the IVs; at most 5 can match bool added = false; diff --git a/SysBot.Pokemon.Z3/Z3/Z3SeedSearchHandler.cs b/SysBot.Pokemon.Z3/Z3/Z3SeedSearchHandler.cs index 019d1d99b..a958a8723 100644 --- a/SysBot.Pokemon.Z3/Z3/Z3SeedSearchHandler.cs +++ b/SysBot.Pokemon.Z3/Z3/Z3SeedSearchHandler.cs @@ -21,8 +21,7 @@ public void CalculateAndNotify(T pkm, PokeTradeDetail detail, SeedCheckSettin if (settings.ShowAllZ3Results) { - var matches = Z3Search.GetAllSeeds(ec, pid, IVs, settings.ResultDisplayMode); - foreach (var match in matches) + foreach (var match in Z3Search.GetAllSeeds(ec, pid, IVs, settings.ResultDisplayMode)) { var lump = new PokeTradeSummary("Calculated Seed:", match); detail.SendNotification(bot, lump); diff --git a/SysBot.Pokemon/BDSP/BotTrade/PokeTradeBotBS.cs b/SysBot.Pokemon/BDSP/BotTrade/PokeTradeBotBS.cs index 91f39c26e..cd33a4095 100644 --- a/SysBot.Pokemon/BDSP/BotTrade/PokeTradeBotBS.cs +++ b/SysBot.Pokemon/BDSP/BotTrade/PokeTradeBotBS.cs @@ -167,6 +167,13 @@ private async Task ApplyAutoOT(PB8 toSend, PB8 offered, SAV8BS sav, string Log("Trade is a Mystery Gift with specific TID/SID. Skipping AutoOT."); return false; } + + // Current handler cannot be past gen OT + if (toSend.Generation != toSend.Format) + { + Log("Can not apply Partner details: Current handler cannot be different gen OT."); + return false; + } var cln = toSend.Clone(); cln.OriginalTrainerGender = offered.OriginalTrainerGender; cln.TrainerTID7 = offered.TrainerTID7; @@ -179,9 +186,10 @@ private async Task ApplyAutoOT(PB8 toSend, PB8 offered, SAV8BS sav, string cln.ClearNickname(); if (toSend.IsShiny) - cln.SetShiny(); + cln.PID = (uint)((cln.TID16 ^ cln.SID16 ^ (cln.PID & 0xFFFF) ^ toSend.ShinyXor) << 16) | (cln.PID & 0xFFFF); - cln.RefreshChecksum(); + if (!toSend.ChecksumValid) + cln.RefreshChecksum(); var tradeBS = new LegalityAnalysis(cln); if (tradeBS.Valid) diff --git a/SysBot.Pokemon/BDSP/PokeRoutineExecutor8BS.cs b/SysBot.Pokemon/BDSP/PokeRoutineExecutor8BS.cs index 33a966a2f..481f6b363 100644 --- a/SysBot.Pokemon/BDSP/PokeRoutineExecutor8BS.cs +++ b/SysBot.Pokemon/BDSP/PokeRoutineExecutor8BS.cs @@ -246,8 +246,7 @@ public Task UnSoftBan(CancellationToken token) protected virtual async Task EnterLinkCode(int code, PokeTradeHubConfig config, CancellationToken token) { // Default implementation to just press directional arrows. Can do via Hid keys, but users are slower than bots at even the default code entry. - var keys = TradeUtil.GetPresses(code); - foreach (var key in keys) + foreach (var key in TradeUtil.GetPresses(code)) { int delay = config.Timings.KeypressTime; await Click(key, delay, token).ConfigureAwait(false); diff --git a/SysBot.Pokemon/Helpers/AbstractTrade.cs b/SysBot.Pokemon/Helpers/AbstractTrade.cs index 0e4752205..7628eb643 100644 --- a/SysBot.Pokemon/Helpers/AbstractTrade.cs +++ b/SysBot.Pokemon/Helpers/AbstractTrade.cs @@ -156,8 +156,8 @@ public static void DittoTrade(PKM pkm) if (pkm is PK9 pk9) { pk9.ObedienceLevel = pk9.MetLevel; - pk9.TeraTypeOriginal = MoveType.Normal; - pk9.TeraTypeOverride = (MoveType)19; + pk9.TeraTypeOriginal = PKHeX.Core.MoveType.Normal; + pk9.TeraTypeOverride = (PKHeX.Core.MoveType)19; } pkm.Ball = 21; @@ -251,7 +251,7 @@ public static void EggTrade(PKM pk, IBattleTemplate template, bool nicknameEgg = pk9.ObedienceLevel = 1; pk9.Version = 0; pk9.BattleVersion = 0; - pk9.TeraTypeOverride = (MoveType)19; + pk9.TeraTypeOverride = (PKHeX.Core.MoveType)19; } var la = new LegalityAnalysis(pk); @@ -286,7 +286,7 @@ public static string FormOutput(ushort species, byte form, out string[] formStri public static bool HasAdName(T pk, out string ad) { - string pattern = @"(YT$)|(YT\w*$)|(Lab$)|(\.\w*$|\.\w*\/)|(TV$)|(PKHeX)|(FB:)|(AuSLove)|(ShinyMart)|(Blainette)|(\ com)|(\ org)|(\ net)|(2DOS3)|(PPorg)|(Tik\wok$)|(YouTube)|(IG:)|(TTV\ )|(Tools)|(JokersWrath)|(bot$)|(PKMGen)|(TheHighTable)"; + const string pattern = @"(YT$)|(YT\w*$)|(Lab$)|(\.\w*$|\.\w*\/)|(TV$)|(PKHeX)|(FB:)|(AuSLove)|(ShinyMart)|(Blainette)|(\ com)|(\ org)|(\ net)|(2DOS3)|(PPorg)|(Tik\wok$)|(YouTube)|(IG:)|(TTV\ )|(Tools)|(JokersWrath)|(bot$)|(PKMGen)|(TheHighTable)"; bool ot = Regex.IsMatch(pk.OriginalTrainerName, pattern, RegexOptions.IgnoreCase); bool nick = Regex.IsMatch(pk.Nickname, pattern, RegexOptions.IgnoreCase); ad = ot ? pk.OriginalTrainerName : nick ? pk.Nickname : ""; @@ -476,7 +476,7 @@ public bool Check(T pkm, out string msg) LogUtil.LogInfo($"Illegal reason:\n{la.Report()}", nameof(AbstractTrade)); } LogUtil.LogInfo($"pkm type:{pkm.GetType()}, T:{typeof(T)}", nameof(AbstractTrade)); - var reason = "I can't create illegal Pokémon."; + const string reason = "I can't create illegal Pokémon."; msg = $"{reason}"; } catch (Exception ex) @@ -495,28 +495,27 @@ public bool CheckAndGetPkm(string setstring, out string msg, out T outPkm) msg = "Sorry, I'm not accepting requests!"; return false; } - var set = ShowdownUtil.ConvertToShowdown(setstring); if (set == null) { msg = "The delivery is cancelled, and the Pokémon's nickname is empty."; return false; } - var template = AutoLegalityWrapper.GetTemplate(set); if (template.Species < 1) { - msg = - "To cancel delivery, please use the correct Showdown Set code"; + msg = "To cancel delivery, please use the correct Showdown Set code"; return false; } - try { var sav = AutoLegalityWrapper.GetTrainerInfo(); GenerationFix(sav); var pkm = sav.GetLegal(template, out var result); - if (pkm.Nickname.ToLower() == "egg" && Breeding.CanHatchAsEgg(pkm.Species)) EggTrade(pkm, template); + if (string.Equals(pkm.Nickname, "egg", StringComparison.OrdinalIgnoreCase) && Breeding.CanHatchAsEgg(pkm.Species)) + { + EggTrade(pkm, template); + } if (Check((T)pkm, out msg)) { outPkm = (T)pkm; @@ -528,7 +527,6 @@ public bool CheckAndGetPkm(string setstring, out string msg, out T outPkm) LogUtil.LogSafe(ex, nameof(AbstractTrade)); msg = "Cancel delivery, an error occurred."; } - return false; } @@ -669,8 +667,7 @@ private static int GenerateUniqueTradeID() { long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); int randomValue = new Random().Next(1000); - int uniqueTradeID = ((int)(timestamp % int.MaxValue) * 1000) + randomValue; - return uniqueTradeID; + return ((int)(timestamp % int.MaxValue) * 1000) + randomValue; } private static void GenerationFix(ITrainerInfo sav) diff --git a/SysBot.Pokemon/Helpers/AutoCorrectShowdown.cs b/SysBot.Pokemon/Helpers/AutoCorrectShowdown.cs index 039d5bc70..454fc2c86 100644 --- a/SysBot.Pokemon/Helpers/AutoCorrectShowdown.cs +++ b/SysBot.Pokemon/Helpers/AutoCorrectShowdown.cs @@ -730,7 +730,7 @@ private static EntityContext GetGeneration() private static int GetLanguageIndex(GameVersion version) { - var language = GameLanguage.DefaultLanguage; + const string language = GameLanguage.DefaultLanguage; return GameLanguage.GetLanguageIndex(language); } diff --git a/SysBot.Pokemon/Helpers/AutoLegalityWrapper.cs b/SysBot.Pokemon/Helpers/AutoLegalityWrapper.cs index ad4d38548..945780618 100644 --- a/SysBot.Pokemon/Helpers/AutoLegalityWrapper.cs +++ b/SysBot.Pokemon/Helpers/AutoLegalityWrapper.cs @@ -90,7 +90,7 @@ private static SimpleTrainerInfo GetDefaultTrainer(LegalitySettings cfg) var OT = cfg.GenerateOT; if (OT.Length == 0) OT = "Blank"; // Will fail if actually left blank. - var fallback = new SimpleTrainerInfo(GameVersion.Any) + return new SimpleTrainerInfo(GameVersion.Any) { Language = (byte)cfg.GenerateLanguage, TID16 = cfg.GenerateTID16, @@ -98,7 +98,6 @@ private static SimpleTrainerInfo GetDefaultTrainer(LegalitySettings cfg) OT = OT, Generation = 0, }; - return fallback; } private static void InitializeAutoLegality(LegalitySettings cfg) @@ -160,8 +159,7 @@ private static void InitializeTrainerDatabase(LegalitySettings cfg) var fallback = GetDefaultTrainer(cfg); for (byte generation = 1; generation <= PKX.Generation; generation++) { - var versions = GameUtil.GetVersionsInGeneration(generation, PKX.Version); - foreach (var version in versions) + foreach (var version in GameUtil.GetVersionsInGeneration(generation, PKX.Version)) RegisterIfNoneExist(fallback, generation, version); } diff --git a/SysBot.Pokemon/LA/BotTrade/PokeTradeBotLA.cs b/SysBot.Pokemon/LA/BotTrade/PokeTradeBotLA.cs index cbce6dcb2..80840c9a5 100644 --- a/SysBot.Pokemon/LA/BotTrade/PokeTradeBotLA.cs +++ b/SysBot.Pokemon/LA/BotTrade/PokeTradeBotLA.cs @@ -863,12 +863,19 @@ private async Task ApplyAutoOT(PA8 toSend, TradePartnerLA tradePartner, SA return false; } if (toSend is IFatefulEncounterReadOnly fe && fe.FatefulEncounter && - (toSend.TID16 != 0 || toSend.SID16 != 0) && - (toSend.TID16 != 12345 || toSend.SID16 != 54321)) + (toSend.TID16 != 0 || toSend.SID16 != 0) && + (toSend.TID16 != 12345 || toSend.SID16 != 54321)) { Log("Trade is a Mystery Gift with specific TID/SID. Skipping AutoOT."); return false; } + + // Current handler cannot be past gen OT + if (toSend.Generation != toSend.Format) + { + Log("Can not apply Partner details: Current handler cannot be different gen OT."); + return false; + } var cln = toSend.Clone(); cln.OriginalTrainerGender = tradePartner.Gender; cln.TrainerTID7 = uint.Parse(tradePartner.TID7); @@ -881,9 +888,10 @@ private async Task ApplyAutoOT(PA8 toSend, TradePartnerLA tradePartner, SA cln.ClearNickname(); if (toSend.IsShiny) - cln.SetShiny(); + cln.PID = (uint)((cln.TID16 ^ cln.SID16 ^ (cln.PID & 0xFFFF) ^ toSend.ShinyXor) << 16) | (cln.PID & 0xFFFF); - cln.RefreshChecksum(); + if (!toSend.ChecksumValid) + cln.RefreshChecksum(); var tradela = new LegalityAnalysis(cln); if (tradela.Valid) diff --git a/SysBot.Pokemon/LA/PokeRoutineExecutor8LA.cs b/SysBot.Pokemon/LA/PokeRoutineExecutor8LA.cs index c0fad9b03..143a3533c 100644 --- a/SysBot.Pokemon/LA/PokeRoutineExecutor8LA.cs +++ b/SysBot.Pokemon/LA/PokeRoutineExecutor8LA.cs @@ -234,8 +234,7 @@ public Task UnSoftBan(CancellationToken token) protected virtual async Task EnterLinkCode(int code, PokeTradeHubConfig config, CancellationToken token) { // Default implementation to just press directional arrows. Can do via Hid keys, but users are slower than bots at even the default code entry. - var keys = TradeUtil.GetPresses(code); - foreach (var key in keys) + foreach (var key in TradeUtil.GetPresses(code)) { int delay = config.Timings.KeypressTime; await Click(key, delay, token).ConfigureAwait(false); diff --git a/SysBot.Pokemon/SV/BotTrade/PokeTradeBotSV.cs b/SysBot.Pokemon/SV/BotTrade/PokeTradeBotSV.cs index 268a468ee..ae235ca91 100644 --- a/SysBot.Pokemon/SV/BotTrade/PokeTradeBotSV.cs +++ b/SysBot.Pokemon/SV/BotTrade/PokeTradeBotSV.cs @@ -210,12 +210,21 @@ private static PokeRoutineType GetRoutineType(PokeTradeType tradeType) private async Task ApplyAutoOT(PK9 toSend, TradeMyStatus tradePartner, SAV9SV sav, CancellationToken token) { + // Home Tracker Check if (toSend is IHomeTrack pk && pk.HasTracker) { Log("Home tracker detected. Can't apply AutoOT."); return false; } + // Don't apply to Ditto + if (toSend.Species == (ushort)Species.Ditto) + { + Log("Do nothing to trade Pokemon, since pokemon is Ditto"); + return false; + } + + // Mystery Gifts if (toSend is IFatefulEncounterReadOnly fe && fe.FatefulEncounter && (toSend.TID16 != 0 || toSend.SID16 != 0) && (toSend.TID16 != 12345 || toSend.SID16 != 54321)) @@ -224,6 +233,12 @@ private async Task ApplyAutoOT(PK9 toSend, TradeMyStatus tradePartner, SAV return false; } + // Current handler cannot be past gen OT + if (toSend.Generation != toSend.Format) + { + Log("Can not apply Partner details: Current handler cannot be different gen OT."); + return false; + } var cln = toSend.Clone(); cln.OriginalTrainerGender = (byte)tradePartner.Gender; cln.TrainerTID7 = (uint)Math.Abs(tradePartner.DisplayTID); @@ -232,22 +247,38 @@ private async Task ApplyAutoOT(PK9 toSend, TradeMyStatus tradePartner, SAV cln.OriginalTrainerName = tradePartner.OT; ClearOTTrash(cln, tradePartner); + ushort species = toSend.Species; + GameVersion version; + switch (species) + { + case (ushort)Species.Koraidon: + case (ushort)Species.GougingFire: + case (ushort)Species.RagingBolt: + version = GameVersion.SL; + Log("Scarlet version exclusive Pokémon, changing the version to Scarlet."); + break; + + case (ushort)Species.Miraidon: + case (ushort)Species.IronCrown: + case (ushort)Species.IronBoulder: + version = GameVersion.VL; + Log("Violet version exclusive Pokémon, changing the version to Violet."); + break; + + default: + version = (GameVersion)tradePartner.Game; + break; + } + cln.Version = version; + if (!toSend.IsNicknamed) cln.ClearNickname(); - if (toSend.MetLocation == Locations.TeraCavern9 && toSend.IsShiny) - { - cln.PID = ShinyUtil.GetShinyPID(cln.TID16, cln.SID16, cln.PID, 1u); - } - else if (toSend.IsShiny) - { - uint id32 = (uint)((cln.TID16) | (cln.SID16 << 16)); - uint pid = cln.PID; - ShinyUtil.ForceShinyState(true, ref pid, id32, 1u); - cln.PID = pid; - } + if (toSend.IsShiny) + cln.PID = (uint)((cln.TID16 ^ cln.SID16 ^ (cln.PID & 0xFFFF) ^ toSend.ShinyXor) << 16) | (cln.PID & 0xFFFF); - cln.RefreshChecksum(); + if (!toSend.ChecksumValid) + cln.RefreshChecksum(); var tradeSV = new LegalityAnalysis(cln); if (tradeSV.Valid) diff --git a/SysBot.Pokemon/SV/PokeRoutineExecutor9SV.cs b/SysBot.Pokemon/SV/PokeRoutineExecutor9SV.cs index e9787b0b1..2e10a2a21 100644 --- a/SysBot.Pokemon/SV/PokeRoutineExecutor9SV.cs +++ b/SysBot.Pokemon/SV/PokeRoutineExecutor9SV.cs @@ -280,8 +280,7 @@ protected virtual async Task EnterLinkCode(int code, PokeTradeHubConfig config, else { // Enter link code using directional arrows - var keys = TradeUtil.GetPresses(code); - foreach (var key in keys) + foreach (var key in TradeUtil.GetPresses(code)) { int delay = config.Timings.KeypressTime; await Click(key, delay, token).ConfigureAwait(false); diff --git a/SysBot.Pokemon/SWSH/BotTrade/PokeTradeBotSWSH.cs b/SysBot.Pokemon/SWSH/BotTrade/PokeTradeBotSWSH.cs index 7a1dc3931..0ef27aa56 100644 --- a/SysBot.Pokemon/SWSH/BotTrade/PokeTradeBotSWSH.cs +++ b/SysBot.Pokemon/SWSH/BotTrade/PokeTradeBotSWSH.cs @@ -1020,8 +1020,7 @@ private async Task GetTradePartnerTID7(TradeMethod tradeMethod, Cancella var data = await Connection.ReadBytesAsync(ofs, 8, token).ConfigureAwait(false); var tidsid = BitConverter.ToUInt32(data, 0); - var tid7 = $"{tidsid % 1_000_000:000000}"; - return tid7; + return $"{tidsid % 1_000_000:000000}"; } // Thanks Secludely https://github.com/Secludedly/ZE-FusionBot/commit/f064d9eaf11ba2b2a0a79fa4c7ec5bf6dacf780c @@ -1031,8 +1030,7 @@ private async Task GetTradePartnerSID7(TradeMethod tradeMethod, Cancella var data = await Connection.ReadBytesAsync(ofs, 8, token).ConfigureAwait(false); var tidsid = BitConverter.ToUInt32(data, 0); - var sid7 = $"{tidsid / 1_000_000:0000}"; - return sid7; + return $"{tidsid / 1_000_000:0000}"; } public async Task GetTradePartnerNID(CancellationToken token) @@ -1154,12 +1152,19 @@ private async Task ApplyAutoOT(PK8 toSend, string trainerName, SAV8SWSH sa return false; } if (toSend is IFatefulEncounterReadOnly fe && fe.FatefulEncounter && - (toSend.TID16 != 0 || toSend.SID16 != 0) && - (toSend.TID16 != 12345 || toSend.SID16 != 54321)) + (toSend.TID16 != 0 || toSend.SID16 != 0) && + (toSend.TID16 != 12345 || toSend.SID16 != 54321)) { Log("Trade is a Mystery Gift with specific TID/SID. Skipping AutoOT."); return false; } + + // Current handler cannot be past gen OT + if (toSend.Generation != toSend.Format) + { + Log("Can not apply Partner details: Current handler cannot be different gen OT."); + return false; + } var data = await Connection.ReadBytesAsync(LinkTradePartnerNameOffset - 0x8, 8, token).ConfigureAwait(false); var tidsid = BitConverter.ToUInt32(data, 0); var cln = toSend.Clone(); @@ -1173,9 +1178,10 @@ private async Task ApplyAutoOT(PK8 toSend, string trainerName, SAV8SWSH sa cln.ClearNickname(); if (toSend.IsShiny) - cln.SetShiny(); + cln.PID = (uint)((cln.TID16 ^ cln.SID16 ^ (cln.PID & 0xFFFF) ^ toSend.ShinyXor) << 16) | (cln.PID & 0xFFFF); - cln.RefreshChecksum(); + if (!toSend.ChecksumValid) + cln.RefreshChecksum(); var tradeswsh = new LegalityAnalysis(cln); if (tradeswsh.Valid) diff --git a/SysBot.Pokemon/SWSH/PokeRoutineExecutor8SWSH.cs b/SysBot.Pokemon/SWSH/PokeRoutineExecutor8SWSH.cs index 2a45db69c..6df460c33 100644 --- a/SysBot.Pokemon/SWSH/PokeRoutineExecutor8SWSH.cs +++ b/SysBot.Pokemon/SWSH/PokeRoutineExecutor8SWSH.cs @@ -331,8 +331,7 @@ public Task UnSoftBan(CancellationToken token) protected virtual async Task EnterLinkCode(int code, PokeTradeHubConfig config, CancellationToken token) { // Default implementation to just press directional arrows. Can do via Hid keys, but users are slower than bots at even the default code entry. - var keys = TradeUtil.GetPresses(code); - foreach (var key in keys) + foreach (var key in TradeUtil.GetPresses(code)) { int delay = config.Timings.KeypressTime; await Click(key, delay, token).ConfigureAwait(false); diff --git a/SysBot.Pokemon/Settings/Integrations/StreamSettings.cs b/SysBot.Pokemon/Settings/Integrations/StreamSettings.cs index d9ed0242f..872bab376 100644 --- a/SysBot.Pokemon/Settings/Integrations/StreamSettings.cs +++ b/SysBot.Pokemon/Settings/Integrations/StreamSettings.cs @@ -148,8 +148,7 @@ public void IdleAssets(PokeRoutineExecutorBase b) try { - var files = Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "*", SearchOption.TopDirectoryOnly); - foreach (var file in files) + foreach (var file in Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "*", SearchOption.TopDirectoryOnly)) { if (file.Contains(b.Connection.Name)) File.Delete(file); diff --git a/SysBot.Pokemon/Settings/TradeSettings.cs b/SysBot.Pokemon/Settings/TradeSettings.cs index 1eb0d2f47..56c3f4765 100644 --- a/SysBot.Pokemon/Settings/TradeSettings.cs +++ b/SysBot.Pokemon/Settings/TradeSettings.cs @@ -108,29 +108,29 @@ public enum HeldItem { None = 0, - AbilityPatch = 1606, + MasterBall = 1, RareCandy = 50, - AbilityCapsule = 645, - - BottleCap = 795, - - expCandyL = 1127, + ppUp = 51, - expCandyXL = 1128, + ppMax = 53, - MasterBall = 1, + BigPearl = 89, Nugget = 92, - BigPearl = 89, + AbilityCapsule = 645, + + BottleCap = 795, GoldBottleCap = 796, - ppUp = 51, + expCandyL = 1127, - ppMax = 53, + expCandyXL = 1128, + + AbilityPatch = 1606, FreshStartMochi = 2479, } @@ -313,26 +313,27 @@ private void OnUseEmbedsChanged() [Category(EmbedSettings), Description("Custom Emoji information for the move types."), DisplayName("Custom Type Emojis")] public List CustomTypeEmojis { get; set; } = new List - { - new(MoveType.Bug), - new(MoveType.Fire), - new(MoveType.Flying), - new(MoveType.Ground), - new(MoveType.Water), - new(MoveType.Grass), - new(MoveType.Ice), - new(MoveType.Rock), - new(MoveType.Ghost), - new(MoveType.Steel), - new(MoveType.Fighting), - new(MoveType.Electric), - new(MoveType.Dragon), - new(MoveType.Psychic), - new(MoveType.Dark), - new(MoveType.Normal), - new(MoveType.Poison), - new(MoveType.Fairy), - }; + { + new(MoveType.Bug), + new(MoveType.Fire), + new(MoveType.Flying), + new(MoveType.Ground), + new(MoveType.Water), + new(MoveType.Grass), + new(MoveType.Ice), + new(MoveType.Rock), + new(MoveType.Ghost), + new(MoveType.Steel), + new(MoveType.Fighting), + new(MoveType.Electric), + new(MoveType.Dragon), + new(MoveType.Psychic), + new(MoveType.Dark), + new(MoveType.Normal), + new(MoveType.Poison), + new(MoveType.Fairy), + new(MoveType.Stellar) + }; [Category(EmbedSettings), Description("The full string for the male gender emoji."), DisplayName("Male Emoji")] public EmojiInfo MaleEmoji { get; set; } = new EmojiInfo(); @@ -357,26 +358,27 @@ private void OnUseEmbedsChanged() [Category(EmbedSettings), Description("Tera Type Emoji information for the tera types."), DisplayName("Custom Tera Type Emojis")] public List TeraTypeEmojis { get; set; } = new List - { - new(MoveType.Bug), - new(MoveType.Fire), - new(MoveType.Flying), - new(MoveType.Ground), - new(MoveType.Water), - new(MoveType.Grass), - new(MoveType.Ice), - new(MoveType.Rock), - new(MoveType.Ghost), - new(MoveType.Steel), - new(MoveType.Fighting), - new(MoveType.Electric), - new(MoveType.Dragon), - new(MoveType.Psychic), - new(MoveType.Dark), - new(MoveType.Normal), - new(MoveType.Poison), - new(MoveType.Fairy), - }; + { + new(MoveType.Bug), + new(MoveType.Fire), + new(MoveType.Flying), + new(MoveType.Ground), + new(MoveType.Water), + new(MoveType.Grass), + new(MoveType.Ice), + new(MoveType.Rock), + new(MoveType.Ghost), + new(MoveType.Steel), + new(MoveType.Fighting), + new(MoveType.Electric), + new(MoveType.Dragon), + new(MoveType.Psychic), + new(MoveType.Dark), + new(MoveType.Normal), + new(MoveType.Poison), + new(MoveType.Fairy), + new(MoveType.Stellar) + }; [Category(EmbedSettings), Description("Will show Scale in trade embed (SV & Discord only). Requires user to upload the emojis to their server."), DisplayName("Show Scale")] public bool ShowScale { get; set; } = true; @@ -593,34 +595,46 @@ public enum ImageSize Size128x128 } + public enum MoveType + { + Normal, + Fighting, + Flying, + Poison, + Ground, + Rock, + Bug, + Ghost, + Steel, + Fire, + Water, + Grass, + Electric, + Psychic, + Ice, + Dragon, + Dark, + Fairy, + Stellar + } + public class MoveTypeEmojiInfo { [Description("The type of move.")] public MoveType MoveType { get; set; } - [Description("The Discord emoji string for this move type.")] - public string EmojiCode { get; set; } - -#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - + public string EmojiCode { get; set; } = string.Empty; public MoveTypeEmojiInfo() { } - -#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - -#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - public MoveTypeEmojiInfo(MoveType moveType) -#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. { MoveType = moveType; + EmojiCode = string.Empty; } - public override string ToString() { if (string.IsNullOrEmpty(EmojiCode)) return MoveType.ToString(); - return $"{EmojiCode}"; } } @@ -629,30 +643,22 @@ public class TeraTypeEmojiInfo { [Description("The Tera Type.")] public MoveType MoveType { get; set; } - [Description("The Discord emoji string for this tera type.")] public string EmojiCode { get; set; } - #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - public TeraTypeEmojiInfo() { } - #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - public TeraTypeEmojiInfo(MoveType teraType) #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. { MoveType = teraType; } - public override string ToString() { if (string.IsNullOrEmpty(EmojiCode)) return MoveType.ToString(); - return $"{EmojiCode}"; } } diff --git a/SysBot.Pokemon/Structures/Ledy/PokemonPool.cs b/SysBot.Pokemon/Structures/Ledy/PokemonPool.cs index ac83dd68b..b52d90544 100644 --- a/SysBot.Pokemon/Structures/Ledy/PokemonPool.cs +++ b/SysBot.Pokemon/Structures/Ledy/PokemonPool.cs @@ -70,7 +70,7 @@ public bool LoadFolder(string path, SearchOption opt = SearchOption.AllDirectori var files = Directory.EnumerateFiles(path, "*", opt); var matchFiles = LoadUtil.GetFilesOfSize(files, ExpectedSize); - int surpriseBlocked = 0; + const int surpriseBlocked = 0; foreach (var file in matchFiles) { var data = File.ReadAllBytes(file); diff --git a/SysBot.Pokemon/TradeHub/SpecialRequests.cs b/SysBot.Pokemon/TradeHub/SpecialRequests.cs index 9034b226c..22cba6173 100644 --- a/SysBot.Pokemon/TradeHub/SpecialRequests.cs +++ b/SysBot.Pokemon/TradeHub/SpecialRequests.cs @@ -385,8 +385,7 @@ private static Dictionary CollectItemReqs() lock (_sync2) { var rawText = File.ReadAllText(ItemPath); - var split = rawText.Split(separator, StringSplitOptions.RemoveEmptyEntries); - foreach (var st in split) + foreach (var st in rawText.Split(separator, StringSplitOptions.RemoveEmptyEntries)) { var reqs = st.Split(','); tmp.Add(reqs[0], int.Parse(reqs[1]));