/// <summary> /// Roll x dice of y sides. Translatable. /// </summary> /// <param name="rolls"></param> /// <param name="diceType"></param> /// <param name="localisation"></param> /// <param name="adjustDice">Adjust total by amount (or 0)</param> /// <returns></returns> private static void RollFudgeDice(ushort rolls, int adjustDice, LanguageHandler languageHandler, Languages language, ref StringBuilder output) { const byte diceType = 3; int[] results = new int[diceType]; for (int i = 0; i < rolls; i++) { int rolled0base = (rand.Next(diceType)); results[rolled0base]++; } int total = results[2] - results[0]; // Positive minus negative. StringBuilder resultsStr = new StringBuilder(); for (int index = 0; index < diceType; index++) { int rolled = results[index]; if (rolled > 0) { switch (index) { case 0: // Negative resultsStr.Append($"`-: {rolled}x` "); break; default: case 1: // Zero resultsStr.Append($"`0: {rolled}x` "); break; case 2: // Positive resultsStr.Append($"`+: {rolled}x` "); break; } } } output.AppendLine($"{Emojis.Dice} {languageHandler.GetPhrase(language, "Rolled")}: {rolls}dF:"); if (rolls == 1) { // Simple case. output.Append(resultsStr); } else { output.Append($"{resultsStr} {languageHandler.GetPhrase(language, "Total")}: {total}"); } if (adjustDice != 0) { output.Append(adjustDice.ToString("+#;-#;0") + " = " + (total + adjustDice)); } output.AppendLine(); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { Response response = new Response { Embed = EmbedUtility.ToEmbed(Help), Message = Help, ResponseType = ResponseType.Default }; ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string commandDetail = command.CommandDetail; response = waitHandler.CreatePleaseWaitResponse(senderDetail.ServerSettings.Language); Task.Run(async() => { Response asyncResponse = await BuildMemeAsync(senderDetail.ServerSettings.Language, args); if (asyncResponse == null) { string err = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoImageMessages")}"); asyncResponse = new Response { Embed = EmbedUtility.ToEmbed(err), Message = err, ResponseType = ResponseType.Default }; } await asyncResponder.SendResponseAsync(args, asyncResponse); waitHandler.PopPleaseWaitMessage(); }); return(new[] { response }); }
internal void DeleteStack() { foreach (var m in pleaseWaitMessageStack) { IGuild s = m.Channel.GetGuild(); if (s != null) { var serverSettings = serverSettingsHandler.GetOrCreateServerSettings(s.Id); m.EditAsync(languageHandler.GetPhrase(serverSettings.Language, "Error_Oops")).ConfigureAwait(false); } } }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string responseMessage; if (Constants.IsBotOwner(args.UserId)) { string channelIdStr = command.CommandParams[1]; if (!string.IsNullOrWhiteSpace(channelIdStr)) { bool parsed = ulong.TryParse(channelIdStr, out ulong targetChannelId); if (parsed) { string messageToSend = string.Join(" ", command.CommandParams, 2, command.CommandParams.Length - 2); if (string.IsNullOrEmpty(messageToSend)) { responseMessage = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: say <channel id> <message> -- message"); } else { if (asyncResponder.SendResponse(targetChannelId, Response.CreateFromString(messageToSend))) { responseMessage = ($"{Emojis.TickSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "YourRequestHasBeenSent")}: {messageToSend} --> {channelIdStr}"); } else { responseMessage = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}: {channelIdStr}"); } } } else { responseMessage = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: say <channel id> <message> -- {channelIdStr}"); } } else { responseMessage = $"{Emojis.CrossSymbol} say <channel id> <message>."; } } else { responseMessage = $"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_BotOwnerOnly")}."; } return(Response.CreateArrayFromString(responseMessage)); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); if (Constants.IsBotOwner(args.UserId)) { Task.Run(async() => { string name = command.CommandDetail; if (args.ChannelId != Constants.ConsoleId) { var guild = await client.GetGuildAsync(args.GuildId).ConfigureAwait(false); var user = guild.GetUser(client.CurrentUser.Id); await user.ModifyAsync(x => x.Nickname = name).ConfigureAwait(false); } else { Console.Title = name; } }); return(new Response[] { Response.CreateFromReact(Emojis.ThumbsUpUnicode) }); } else { return(Response.CreateArrayFromString($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_BotOwnerOnly")}.")); } }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string requestStr = command.CommandDetail; ulong requestedId; if (string.IsNullOrWhiteSpace(requestStr)) { // Default to the user asking. requestedId = args.UserId; } else { // Parse a mention? if (requestStr.StartsWith("<@") && requestStr.EndsWith(">")) { requestStr = requestStr.Substring("<@".Length, requestStr.Length - 3); // Minus 3 for <@nnnnn> } // Id? if (!ulong.TryParse(requestStr, out requestedId)) { // No, fail. return(Response.CreateArrayFromString($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}: {requestStr}")); } } if (client != null) { Task.Run(async() => { // From the id, determine if it's a user or server. // Is it a server? var candidateServer = await client.GetGuildAsync(requestedId).ConfigureAwait(false); if (candidateServer != null) { await asyncResponder.SendResponseAsync(args, Response.CreateFromString($"{candidateServer.IconUrl}")).ConfigureAwait(false); } // Is it a channel? IChannel candidateChannel = await client.GetDMChannelAsync(requestedId).ConfigureAwait(false); if (candidateChannel != null) { await asyncResponder.SendResponseAsync(args, Response.CreateFromString($"{candidateChannel.GetGuild().IconUrl}")).ConfigureAwait(false); } // Is it a user? IUser candidateUser = client.GetUser(requestedId); if (candidateUser != null) { await asyncResponder.SendResponseAsync(args, Response.CreateFromString($"{candidateUser.GetAvatarUrl(ImageFormat.Auto, 2048)}")).ConfigureAwait(false); } }); } return(new Response[] { Response.WaitForAsync }); }
/// <summary> /// Roll x dice of y sides. Translatable. /// </summary> /// <param name="rolls"></param> /// <param name="diceType"></param> /// <param name="localisation"></param> /// <param name="adjustDice">Adjust total by amount (or 0)</param> /// <returns></returns> private static void RollDice(ushort rolls, byte diceType, int adjustDice, LanguageHandler languageHandler, Languages language, ref StringBuilder output) { if (diceType == 0) { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(language, Errors.ErrorCode.IncorrectParameter)}: {diceType}"); } else { output.AppendLine($"{Emojis.Dice} {languageHandler.GetPhrase(language, "Rolled")}: {rolls}d{diceType}:"); string resultsStr; int total; if (rolls == 1) { // Simplify everything for a single roll. total = (rand.Next(diceType) + 1); resultsStr = total.ToString(); output.Append(resultsStr); } else { int[] results = new int[diceType]; for (int i = 0; i < rolls; i++) { int rolled0base = (rand.Next(diceType)); results[rolled0base]++; } total = results.Select((rolled, index) => (index + 1) * rolled).Sum(); double average = (double)total / rolls; resultsStr = string.Join("", results.Select((rolled, index) => (rolled > 0 ? ($"`{(index + 1)}: {rolled}x` ") : ("")))).Trim(); output.AppendLine(resultsStr); output.Append($"{languageHandler.GetPhrase(language, "Average")}: {average.ToString("N2", languageHandler.GetCultureInfo(language))}, {languageHandler.GetPhrase(language, "Total")}: {total}"); } if (adjustDice != 0) { output.Append(adjustDice.ToString("+#;-#;0") + " = " + (total + adjustDice)); } output.AppendLine(); } }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); StringBuilder sb = new StringBuilder(); string charArray = command.CommandDetail.StripAccents(); int length = charArray.Length; if (length > 80) { string err = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(serverSettings.Language, "Error_NotAFile")}"); sb.AppendLine(err); } else { sb.AppendLine(); foreach (char c in charArray) { if (char.IsLetterOrDigit(c)) { sb.Append(":regional_indicator_").Append(char.ToLowerInvariant(c)).Append(": "); } else if (c == ' ') { sb.Append(":blue_heart: "); } else if (c == '!') { sb.Append(":grey_exclamation: "); } else if (c == '?') { sb.Append(":grey_question: "); } else if (c == '\'') { sb.Append(":arrow_down_small: "); } else { sb.Append(c); } } sb.AppendLine(); foreach (char _ in charArray) { sb.Append(Emojis.CheerleaderSymbols[rand.Next(0, Emojis.CheerleaderSymbols.Count)]).Append(' '); } } return(Response.CreateArrayFromString(sb.ToString())); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { if (Constants.IsBotOwner(senderDetail.UserSettings.UserId)) { controller.Initialise(); return(new Response[] { Response.CreateFromReact(Emojis.SoonUnicode) }); } else { return(Response.CreateArrayFromString($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_BotOwnerOnly")}.")); } }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { StringBuilder retVal = new StringBuilder(); ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string[] commandParams = command.CommandParams; Command[] commands = commandController.GetCommandsForLanguage(senderDetail.ServerSettings.Language); Discord.Color responseColor = Discord.Color.Green; if (string.IsNullOrWhiteSpace(command.CommandDetail)) { var commandsByModule = commands.GroupBy(x => x.Module).ToDictionary(grouping => grouping.Key, grouping => grouping.ToList()); foreach (var pair in commandsByModule) { retVal.Append("**"); retVal.Append(pair.Key.ToString()); retVal.AppendLine("**"); retVal.AppendLine(string.Join(", ", pair.Value.Select(c => c.Aliases[0]))); retVal.AppendLine(); } } else { string search = command.CommandArgs.First().ToLowerInvariant(); Command found = commands.FirstOrDefault(c => c.Aliases.Contains(search, StringComparer.OrdinalIgnoreCase)); if (found != null) { retVal.AppendLine(found.Help + "\r\n" + found.Examples); } else { retVal.AppendLine($"{Emojis.QuestionSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}"); responseColor = Discord.Color.Red; } } string message = retVal.ToString(); Response response = new Response { Embed = Utility.EmbedUtility.ToEmbed(message, responseColor), Message = message, ResponseType = ResponseType.Default }; return(new[] { response }); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; UserSettings userSettings = senderDetail.UserSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string[] commandParams = command.CommandParams; var allAchievements = SaveData.Achievements.Achievement.AllAchievements; var unlockedAchievements = userSettings.UserStats.GetAchievements(); // First, reply to the room that the command was written in. // This has minimal information so as to not spoil achievements // for other users. string outputToChannel = ($"{languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Achievements_AchievementsUnlocked")}: {unlockedAchievements.Count}/{allAchievements.Count} {Emojis.Trophy}"); Response channelResponse = new Response { Embed = Utility.EmbedUtility.ToEmbed(outputToChannel, 200, 200, 50), ResponseType = ResponseType.Default }; // Next, PM the user their achievements and any still to unlock. StringBuilder sb = new StringBuilder(); foreach (var achievement in allAchievements) { if (achievement.HasAchieved(userSettings.UserStats)) { sb.AppendLine($"{Emojis.Trophy} {achievement.GetDescription(languageHandler, senderDetail.ServerSettings.Language)}"); } else { sb.AppendLine($"???"); } } string outputToPrivate = sb.ToString(); Response privateResponse = new Response { Embed = Utility.EmbedUtility.ToEmbed(outputToPrivate, 200, 200, 50), ResponseType = ResponseType.Private }; return(new[] { channelResponse, privateResponse }); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { StringBuilder sb = new StringBuilder(); ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string commandDetail = command.CommandDetail; // Split by or delimiter, not space. if (command.FullCommandExcludingCommandPrefix.ToLowerInvariant().Contains(delimiter)) { string[] orChoices = commandDetail.Split(delimiter); if (!orChoices.Any()) { sb.AppendLine($"{command.CommandSymbol}{command.CommandLower} A{delimiter}B{delimiter}C..."); } else { sb.AppendLine(orChoices[rand.Next(orChoices.Length)].Trim()); sb.Append("_").Append(languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "IgnoredOr")).Append("_"); } } // Else split by space else { string[] choices = command.CommandArgs.ToArray(); if (!choices.Any()) { sb.AppendLine($"{command.CommandSymbol}{command.CommandLower} A B C ..."); } else { sb.AppendLine(choices[rand.Next(choices.Length)]); } } return(Response.CreateArrayFromString(sb.ToString())); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { // Responds asynchronously. Task.Run(async() => { JContainer json; string message = null; try { json = (JContainer)await JSONHelper.GetJsonAsync(url); } catch (Exception) { json = null; message = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_ServerNotFound")}"); } string file = null; if (json != null) { file = formattedResponseURL.Replace("%file%", json[jsonProperty].ToString()); message = file; } Response asyncResponse = new Response { ResponseType = ResponseType.Default, Embed = (file == null) ? null : EmbedUtility.ToEmbed(imageURL: file), Message = message }; await asyncResponder.SendResponseAsync(args, asyncResponse); }); // Return out the lifecycle with no response. return(new[] { Response.WaitForAsync }); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string[] commandParams = command.CommandParams; if (Constants.IsBotOwner(args.UserId)) { var servers = (client.Guilds).ToArray(); string serverOutputString = string.Join("\n ", servers.Select((server) => { var ss = serverSettingsHandler.GetOrCreateServerSettings(server.Id); var owner = server.Owner; return($"`{server.Name}` ({ss.Language}): `{owner?.Username}`"); })); return(Response.CreateArrayFromString(servers.Length + " servers: \n" + serverOutputString)); } return(Response.CreateArrayFromString($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_BotOwnerOnly")}.")); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; CultureInfo cultureInfo = languageHandler.GetCultureInfo(serverSettings.Language); CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); Discord.Color responseColor = Discord.Color.Green; // First, check the cache if we already have this pokémon. string query = command.CommandDetail; if (args.URLs.Length > 0) { var response = new[] { waitHandler.CreatePleaseWaitResponse(senderDetail.ServerSettings.Language) }; Task.Run(async() => { Response asyncResponse = await CorrelatePokemonAsync(senderDetail.ServerSettings.Language, args); if (asyncResponse == null) { string err = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoImageMessages")}"); asyncResponse = new Response { Embed = EmbedUtility.ToEmbed(err), Message = err, ResponseType = ResponseType.Default }; } await asyncResponder.SendResponseAsync(args, asyncResponse); waitHandler.PopPleaseWaitMessage(); }); return(response); } query = query.Replace("(Pokemon)", "").Replace("(Pokémon)", "").Trim(); query = query.Replace("(move)", "").Trim(); StringBuilder output = new StringBuilder(); Pokemon pokemon = KnowledgeBase.GetPokémon(query); string imageUrl = null; bool isCached = (pokemon != null); try { // For now, assume that it is a Pokémon. string url = "https://bulbapedia.bulbagarden.net/wiki/" + query.Capitalize() + "_(Pokémon)"; string urlRaw = url + "?action=raw"; if (!isCached) { // Assume correct URL pokemon = Pokemon.ParsePage(urlRaw); } if (pokemon != null) { string p = pokemon.Name + "_(Pokémon)"; dynamic imageJson = null; output .Append("https://bulbapedia.bulbagarden.net/wiki/") .Append(p) .AppendLine("#") // # is for mobile where () is not correctly parsed in the URL parser .AppendLine(MakeAPokemonString(pokemon, cultureInfo, serverSettings.Language)); try { cancellationTokenSource.CancelAfter(300000); Task.Run(async() => { imageJson = await JSONHelper.GetJsonAsync(Uri.EscapeUriString("https://bulbapedia.bulbagarden.net/w/api.php?action=query&format=json&prop=pageimages&titles=" + p)).ConfigureAwait(false); }, cancellationTokenSource.Token).Wait(); JToken token = imageJson["query"]["pages"]; token = token.First.First; imageUrl = token["thumbnail"]["source"]?.ToString(); } catch (TaskCanceledException tcex) { errorLogger.LogDebug("Did not query Bulbapedia in time to retrieve the Pokemon image.", true); errorLogger.LogException(tcex, ErrorSeverity.Warning); } catch (Exception ex) { errorLogger.LogDebug($"Exception occurred retrieving the Pokemon image for {pokemon?.Name}.\n" + $"imageUrl: {imageUrl}\n" + $"imageJson: {imageJson}", true); errorLogger.LogException(ex, ErrorSeverity.Error); } } else { output.AppendLine($"{Emojis.ExclamationSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_PokemonNotFound")}: {urlRaw}"); } } catch (WebException) { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_PokemonNotFound")}: {query}"); } catch (Exception ex) { output.AppendLine($"{languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops")}: {ex.Message}"); } return(Response.CreateArrayFromString(output.ToString(), responseColor, pokemon.Name, imageUrl)); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { StringBuilder output = new StringBuilder(); ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string[] commandParams = command.CommandParams; long min = 0; long max; if (commandParams.Length == 1) { max = 10; } else if (commandParams.Length == 2) { if (!long.TryParse(commandParams[1], NumberStyles.Any, CultureInfo.InvariantCulture, out max)) { if (commandParams[1] == "∞" || commandParams[1].StartsWith("inf")) { max = long.MaxValue; } else if (commandParams[1] == "-∞" || commandParams[1].StartsWith("-inf")) { max = long.MinValue; } else { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {commandParams[1]}."); max = 10; } } } else { if (!long.TryParse(commandParams[1], NumberStyles.Any, CultureInfo.InvariantCulture, out min)) { if (commandParams[1] == "∞" || commandParams[1].StartsWith("inf")) { min = long.MaxValue; } else if (commandParams[1] == "-∞" || commandParams[1].StartsWith("-inf")) { min = long.MinValue; } else { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {commandParams[1]}."); min = 0; } } if (!long.TryParse(commandParams[2], NumberStyles.Any, CultureInfo.InvariantCulture, out max)) { if (commandParams[2] == "∞" || commandParams[2].StartsWith("inf")) { max = long.MaxValue; } else if (commandParams[2] == "-∞" || commandParams[2].StartsWith("-inf")) { max = long.MinValue; } else { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {commandParams[2]}."); max = 10; } } } if (min > max) { // Swap long temp = max; max = min; min = temp; } long num = rand.NextLong(min, max == long.MaxValue ? long.MaxValue : max + 1); output.AppendLine((min) + " -> " + (max) + ": " + num); ulong range = (ulong)(max - min); if (range == 0) { range = 1; } long normNum = (num - min); float percentage = (((float)normNum) / range) * 360; if (percentage > 360) { percentage = 360; } var drawingColour = Imaging.ImageManipulator.FromAHSB(255, percentage, 0.8f, 0.5f); var responseColor = new Discord.Color(drawingColour.R, drawingColour.G, drawingColour.B); string retVal = output.ToString(); Response response = new Response { Embed = Utility.EmbedUtility.ToEmbed(retVal, responseColor), Message = retVal, ResponseType = ResponseType.Default }; return(new[] { response }); }
/// <summary> /// Handle a command received from chat. /// This is after filtering to make sure a message is a command. /// </summary> internal void HandleCommandReceived(SenderSettings senderSettings, IMessageDetail message) { bool success; IList <Response> responses; try { responses = commandHandlerController.ExecuteCommand(senderSettings, message); success = true; } catch (Exception ex) { ErrorLogger.LogException(ex, ErrorSeverity.Error); ErrorLogger.LogDebug($"Exception while handling: {message}", false); responses = new List <Response> { new Response { Message = $"{Emojis.ExclamationSymbol} {languageHandler.GetPhrase(senderSettings.ServerSettings.Language, "Error_Oops")}: {ex.Message}" } }; success = false; } if (dumpDebug) { var sb = MiscUtility.DumpObject(message); ErrorLogger.LogDebug("Handled " + message.GetType() + ": \r\n" + sb, true); } if (responses.Count > 0) { foreach (Response response in responses) { OnCommandReceived?.Invoke(this, new CommandReceivedEventArgs(senderSettings, message, response)); /// Handled by <see cref="SlateBotController_OnCommandReceived"/> /// and the <see cref="UserSettingsHandler"/> if (dumpDebug) { var sb = MiscUtility.DumpObject(response); ErrorLogger.LogDebug("Response " + response.GetType() + ": \r\n" + sb, true); } } if ((message is SocketMessageWrapper smw) && (smw.socketMessage is SocketUserMessage sum)) { // Help out if we're debugging. if (Debugger.IsAttached) { var sb = MiscUtility.DumpObject(sum); ErrorLogger.LogDebug("Handled " + sum.GetType() + ": \r\n" + sb, dumpDebug); } // React to the message handled. sum.AddReactionAsync(new Emoji(success ? Emojis.CheckUnicode : Emojis.CrossSymbol)).ConfigureAwait(false); } } else if (message is ConsoleMessageDetail) // If from the console { ErrorLogger.LogDebug(NO_RESPONSE_CONSOLE_MESSAGE + "(" + message.Message + ")", true); } }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { StringBuilder output = new StringBuilder(); ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); bool handled = false; string toParse = command.CommandLower; string commandDetail = command.CommandDetail; if (Aliases.Contains(toParse)) { if (Regex.IsMatch(commandDetail, D_REGEX, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.Multiline)) { // Ignore the command entered because the full command is in the detail. toParse = commandDetail; } else { // Convert the command into a d6 command. string timesToRollStr = "1"; string adjustmentStr = "+0"; // If number of times to roll is specified. if (!string.IsNullOrEmpty(commandDetail)) { // If adjustments are specified. if (commandDetail.Contains("-") || commandDetail.Contains("+")) { int index = commandDetail.LastIndexOf("+"); if (index == -1) { index = commandDetail.LastIndexOf("-"); } if (index > 0) { adjustmentStr = commandDetail.Substring(index, commandDetail.Length - index).Trim(); timesToRollStr = commandDetail.Substring(0, index).Trim(); } } else { timesToRollStr = commandDetail; } } toParse = $"{timesToRollStr}d6{adjustmentStr}"; } } else { // Parse the whole thing toParse += " " + commandDetail; } if (Regex.IsMatch(toParse, D_REGEX, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.Multiline)) { handled = true; string[] diceParams = toParse.Split('d', 'D'); string rollsStr = string.IsNullOrEmpty(diceParams[0]) ? "1" : diceParams[0]; string diceTypeStr = string.IsNullOrEmpty(diceParams[1]) ? "6" : diceParams[1]; string adjustmentStr = "0"; if (diceTypeStr.Contains("-") || diceTypeStr.Contains("+")) { int index = diceTypeStr.LastIndexOf("+"); if (index == -1) { index = diceTypeStr.LastIndexOf("-"); } if (index > 0) { adjustmentStr = diceTypeStr.Substring(index, diceTypeStr.Length - index).Trim(); diceTypeStr = diceTypeStr.Substring(0, index).Trim(); } } bool validNumberOfRolls = ushort.TryParse(rollsStr, out ushort rolls); bool validDiceType = byte.TryParse(diceTypeStr, out byte diceType) || diceTypeStr == "F" || diceTypeStr == "f"; bool validAdjustmentDice = int.TryParse(adjustmentStr, NumberStyles.Any, CultureInfo.InvariantCulture, out int adjustment); if (validNumberOfRolls && validDiceType && validAdjustmentDice) { if (diceTypeStr == "F" || diceTypeStr == "f") { RollFudgeDice(rolls, adjustment, languageHandler, serverSettings.Language, ref output); } else { RollDice(rolls, diceType, adjustment, languageHandler, serverSettings.Language, ref output); } if (diceType == 1) { output.AppendLine($"_{languageHandler.GetPhrase(serverSettings.Language, "WhatDidYouExpect")}_"); } } else { if (!validNumberOfRolls) { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {rollsStr} [0-65535]"); } if (!validDiceType) { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {diceTypeStr} [0-255]"); } if (!validAdjustmentDice) { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {adjustmentStr} [+-F]"); } } } if (handled) { string retVal = output.ToString(); Response response = new Response { Embed = Utility.EmbedUtility.ToEmbed(retVal), Message = retVal, ResponseType = ResponseType.Default }; return(new[] { response }); } else { // Not handled. return(Response.NoResponse); } }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string query = command.CommandDetail; // Responds asynchronously. Task.Run(async() => { JContainer json; string message = null; string weapon = Splatoon.SplatoonDefs.TryFindWeapon(query); if (weapon != null) { try { string buildsQuery = $@"query {{ searchForBuilds(weapon: ""{weapon}"") {{ headgear clothing shoes }} }}"; string builtUrl = $"{url}?query={Uri.EscapeUriString(buildsQuery)}"; json = (JContainer)JsonConvert.DeserializeObject(await RequestsHelper.CurlGetCommand(builtUrl, origin).ConfigureAwait(false)); } catch (Exception ex) { json = null; message = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_ServerNotFound")}"); Console.WriteLine(ex); } try { dynamic jsonResult = json["data"]["searchForBuilds"]; int count = 0; foreach (var node in jsonResult) { JArray headgear = node["headgear"]; JArray clothing = node["clothing"]; JArray shoes = node["shoes"]; string[] mains = new string[] { headgear[0].ToString(), clothing[0].ToString(), shoes[0].ToString() }; List <string> subs = new List <string>(); subs.AddRange(headgear.Skip <JToken>(1).Values <string>()); subs.AddRange(clothing.Skip <JToken>(1).Values <string>()); subs.AddRange(shoes.Skip <JToken>(1).Values <string>()); var mainsDict = new Dictionary <string, int>(mains.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count()).OrderByDescending(pair => pair.Value)); var subsDict = new Dictionary <string, int>(subs.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count()).OrderByDescending(pair => pair.Value)); StringBuilder sb = new StringBuilder(); foreach (var pair in mainsDict) { sb.Append(pair.Value).Append("m"); if (subsDict.ContainsKey(pair.Key)) { sb.Append(pair.Value).Append("s"); subsDict.Remove(pair.Key); } sb.Append(" ").Append(pair.Key).Append(", "); } foreach (var pair in subsDict) { sb.Append(pair.Value).Append("s"); sb.Append(" ").Append(pair.Key).Append(", "); } sb.AppendLine(); message += sb.ToString(); count++; if (count > 6) { break; } } } catch (Exception ex) { message = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops")}"); Console.WriteLine(ex); } } else { message = ($"{Emojis.QuestionSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}"); } Response asyncResponse = new Response { ResponseType = ResponseType.Default, Embed = EmbedUtility.ToEmbed(message, null), Message = message }; await asyncResponder.SendResponseAsync(args, asyncResponse); }); // Return out the lifecycle with no response. return(new[] { Response.WaitForAsync }); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); // Verify command. string[] splitCommand = command.CommandLower.Split('>', StringSplitOptions.RemoveEmptyEntries); if (splitCommand.Length == 2) { var sourceLanguage = splitCommand[0]; if (!translateCodes.Contains(sourceLanguage)) { if (string.Equals(sourceLanguage, "?") || sourceLanguage.Equals("auto", StringComparison.OrdinalIgnoreCase)) { sourceLanguage = "auto"; } else { // If the source language is not found, then assume the command is not for us. return(Response.NoResponse); } } // Command verified, continue with the translation. var targetLanguage = splitCommand[1]; var toTranslate = command.CommandDetail; if (string.IsNullOrWhiteSpace(toTranslate)) { return(Response.CreateArrayFromString(TRANSLATE_HOMEPAGE)); } else if (!translateCodes.Contains(targetLanguage)) { string err = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {targetLanguage}"); return(Response.CreateArrayFromString(err)); } string query = Uri.EscapeDataString(toTranslate); string request = "https://translate.googleapis.com/translate_a/single?client=gtx&dt=t" + $"&ie=UTF-8" + $"&oe=UTF-8" + $"&sl={sourceLanguage}" + $"&tl={targetLanguage}" + $"&q={query}"; errorLogger.LogDebug(request, false); // Responds asynchronously. Task.Run(async() => { JContainer json; string message = null; try { json = (JContainer)await JSONHelper.GetJsonAsync(request).ConfigureAwait(false); } catch (Exception) { json = null; message = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_ServerNotFound")}"); } try { dynamic outer = json[0]; if (outer.Count > 0) { StringBuilder translation = new StringBuilder(); for (int i = 0; i < outer.Count; i++) { string translatedLine = outer[i][0]?.ToString(); if (translatedLine != null) { translation.AppendLine(translatedLine); } } if (translation.Length <= 0) { message = ($"{Emojis.Warning} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}"); } else { message = translation.ToString(); } } else { message = ($"{Emojis.Warning} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}"); } } catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex) { // Extra information for debugging. errorLogger.LogException(ex, ErrorSeverity.Error); errorLogger.LogDebug("Unable to process the translation response: " + ex, true); errorLogger.LogDebug("Request: " + request, true); errorLogger.LogDebug("Response: " + json, true); // Let the usual error handling kick in. throw; } Response asyncResponse = Response.CreateFromString(message); await asyncResponder.SendResponseAsync(args, asyncResponse).ConfigureAwait(false); }); // Return out the lifecycle with no response. return(new[] { Response.WaitForAsync }); } else { return(Response.NoResponse); } }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { Response response = new Response { Message = "https://www.youtube.com", ResponseType = ResponseType.Default }; ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string keywords = command.CommandDetail; if (!string.IsNullOrWhiteSpace(keywords)) { if (keywords.Length > 150) { response.Message = $"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_IncorrectParameter")}: {languageHandler.GetPhrase(serverSettings.Language, "Text")} < 150"; } else { // Already a YouTube URL? Extract the id and prepend it with youtube.com?v= var match = youtubeRegex.Match(keywords); if (match.Length > 1) { response.Message = $"https://www.youtube.com/watch?v={match.Groups["id"].Value}"; } else { response = waitHandler.CreatePleaseWaitResponse(senderDetail.ServerSettings.Language); Task.Run(async() => { string asyncRetVal; string query = $"https://www.googleapis.com/youtube/v3/search?" + $"part=snippet&maxResults=8" + $"&q={Uri.EscapeDataString(keywords)}" + $"&key={Tokens.GoogleAPIKey}"; string json = await GetResponseStringAsync(query); dynamic data = JsonConvert.DeserializeObject(json); if (data.items.Count > 0) { // Attempt to get the first item that is a video. int itemIndex = 0; string videoId; do { videoId = (data.items[itemIndex].id.videoId); itemIndex++; }while (itemIndex < data.items.Count && string.IsNullOrWhiteSpace(videoId)); if (string.IsNullOrWhiteSpace(videoId)) { asyncRetVal = ($"{Emojis.Warning} {languageHandler.GetPhrase(serverSettings.Language, "Error_NoResults")}"); } else { string youTubeURL = ("https://www.youtube.com/watch?v=" + videoId); switch (youTubeCommandType) { case YouTubeCommandType.YouTube: asyncRetVal = youTubeURL; break; case YouTubeCommandType.SaveFrom: asyncRetVal = ("http://en.savefrom.net/#url=" + youTubeURL); break; case YouTubeCommandType.Repeat: asyncRetVal = ("http://www.youtubeonrepeat.com/watch?v=" + videoId); break; default: asyncRetVal = $"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_Oops")}: {youTubeCommandType}"; break; } } } else { asyncRetVal = $"{Emojis.Warning} {languageHandler.GetPhrase(serverSettings.Language, "Error_NoResults")}"; } Response asyncResponse = new Response { Message = asyncRetVal, ResponseType = ResponseType.Default }; await asyncResponder.SendResponseAsync(args, asyncResponse); waitHandler.PopPleaseWaitMessage(); }); } } } response.Embed = EmbedUtility.ToEmbed(response.Message); return(new[] { response }); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string query = command.CommandDetail; StringBuilder output = new StringBuilder(); try { const string url = "https://wiki.teamfortress.com/wiki/Crafting"; const string urlRaw = url + "?action=raw"; if (cachedText == null) { cachedText = WebHelper.GetText(urlRaw); } string rawText = cachedText; // First we need to decide on what we're searching for. bool multiLookup = (!query.Contains("Fabricate", StringComparison.OrdinalIgnoreCase) && !query.Contains("Smelt", StringComparison.OrdinalIgnoreCase) && !query.Contains("Combine", StringComparison.OrdinalIgnoreCase)); if (multiLookup) { query = "Fabricate " + query; } bool querySatisfied = rawText.ContainsIgnore(query, StringComparison.OrdinalIgnoreCase, " ", "_", "-", "."); if (!querySatisfied && multiLookup) { query = "Smelt " + query; querySatisfied = rawText.ContainsIgnore(query, StringComparison.OrdinalIgnoreCase, " ", "_", "-", "."); } if (!querySatisfied && multiLookup) { query = "Combine " + query; querySatisfied = rawText.ContainsIgnore(query, StringComparison.OrdinalIgnoreCase, " ", "_", "-", "."); } if (!querySatisfied) { string error = ($"{Emojis.ExclamationSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_UnknownRecipe")}"); output.AppendLine(error + " " + query + ": " + url); } else { // We're in business. TextParser parser = new TextParser(rawText); parser.MovePast(query, true); parser.MovePast("|", true); // First parameter is blueprint name string recipeTemplate = parser.ExtractUntil("bprow", false, true); if (string.IsNullOrEmpty(recipeTemplate)) { // Go to the end of the table instead. recipeTemplate = parser.ExtractUntil("</", false, true); } recipeTemplate = recipeTemplate.Replace("{{Item icon|", "").Replace("'''", "").Replace("''", "").Replace("{", "").Replace("}", "").Replace("\r", "").Replace("\n", "").Replace("\\r", "").Replace("\\n", "").Replace(" ", " ").Replace("<small>", " ").Replace("</small>", " ").Replace("=", "").Replace("×", "x").Replace("→", "→").Trim('|', ' '); string[] templateArgs = recipeTemplate.Split('|'); if (templateArgs.Length < 2) { string error = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops")}"); output.Append(error).Append(' ').Append(query).Append(": ").AppendLine(url); } else { output.AppendLine("`Requirements: " + templateArgs[0].Trim() + "`"); output.AppendLine("`Produces: " + templateArgs[1].Trim() + "`"); for (int i = 2; i < templateArgs.Length; i++) { if (templateArgs[i].Contains("cost") || i == templateArgs.Length - 1) { string costStr = templateArgs[i].Replace("cost", ""); if (costStr.Contains("</")) { costStr = (costStr.Substring(0, costStr.IndexOf("</"))); } output.AppendLine("`Cost: " + costStr.Trim() + " weapon units.`"); break; } else { output.AppendLine("`" + templateArgs[i].Trim() + "`"); } } } } } catch (Exception ex) { string error = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops")}"); output.AppendLine(error + " " + query + " " + ex.Message); } return(Response.CreateArrayFromString(output.ToString())); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { ServerSettings serverSettings = senderDetail.ServerSettings; CultureInfo cultureInfo = languageHandler.GetCultureInfo(serverSettings.Language); CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string[] commandParams = command.CommandParams; Discord.Color responseColor = Discord.Color.Green; string[] typeStrings; if (command.CommandDetail.Contains('-')) { // User wrote e.g. normal-flying typeStrings = command.CommandDetail.Split('-'); } else { typeStrings = command.CommandArgs.Where(s => !string.IsNullOrWhiteSpace(s)).ToArray(); } if (typeStrings.Length == 0) { // No types specified. return(Response.CreateArrayFromString("http://bulbapedia.bulbagarden.net/wiki/Type")); } List <string> incorrectTypes = new List <string>(); List <string> duplicateTypes = new List <string>(); var foundTypes = new HashSet <PokemonType>(); // TODO - translate. if (typeStrings.Length == 1 && typeStrings[0].Equals("all", StringComparison.OrdinalIgnoreCase)) { // Add all types. foreach (PokemonType t in PokemonTypeHandler.PokemonTypes) { if (t != PokemonType.NumberOfTypes) { foundTypes.Add(t); } } } else { foreach (string typeStr in typeStrings) { bool found = PokemonTypeHandler.GetTypeFromLocalisedName(typeStr, cultureInfo, out PokemonType t); if (found) { bool added = foundTypes.Add(t); if (!added) { duplicateTypes.Add(typeStr); } } else { incorrectTypes.Add(typeStr); } } } bool foundAny = foundTypes.Any(); if (!foundAny) { // Check if is actually a Pokémon. Pokemon pokemon = (KnowledgeBase.GetOrFetchPokémon(command.CommandDetail)); if (pokemon != null) { foundTypes.Add(pokemon.PrimaryType); if (pokemon.SecondaryType != PokemonType.NumberOfTypes) { foundTypes.Add(pokemon.SecondaryType); } foundAny = true; // Ignore the typing - it's a Pokémon. incorrectTypes.Clear(); duplicateTypes.Clear(); } } StringBuilder sb = new StringBuilder(); // Incorrect types if (incorrectTypes.Any()) { sb.Append($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}"); sb.Append(": "); sb.AppendLine(string.Join(" ", incorrectTypes)); } // Duplicate types if (duplicateTypes.Any()) { sb.Append($"{Emojis.ExclamationSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Warning_SameType")}"); sb.Append(": "); sb.AppendLine(string.Join(" ", duplicateTypes)); } if (foundAny) { sb.AppendLine("```objectivec"); sb.Append("// "); foreach (PokemonType foundType in foundTypes) { string foundTypeName = PokemonTypeHandler.GetLocalisedName(foundType, cultureInfo); sb.Append(foundTypeName); sb.Append(" "); } sb.AppendLine(); // Attacking if (foundTypes.Count < 3) { sb.AppendLine($"# {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Attacking")}"); foreach (PokemonType foundType in foundTypes) { double[] attackingType1 = PokemonTypeHandler.GetAttacking(foundType); for (int i = 0; i < attackingType1.Length; i++) { double eff = attackingType1[i]; if (eff != 1.0) { sb.Append(eff.ToString("G", cultureInfo.NumberFormat)); sb.Append($"x {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Against")} "); sb.Append(PokemonTypeHandler.GetLocalisedName(PokemonTypeHandler.PokemonTypes[i], cultureInfo)); sb.Append($" {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "WhenAttackingWith")} "); sb.Append(PokemonTypeHandler.GetLocalisedName(foundType, cultureInfo)); sb.AppendLine(); } } } } sb.AppendLine(); // Defending sb.AppendLine($"# {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Defending")}"); double[] defending = PokemonTypeHandler.GetDefending(foundTypes.ToArray()); for (int i = 0; i < defending.Length; i++) { double eff = defending[i]; if (eff != 1.0) { sb.Append(eff.ToString("G", cultureInfo.NumberFormat)); sb.Append($"x {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "DamageTakenFrom")} "); sb.AppendLine(PokemonTypeHandler.GetLocalisedName(PokemonTypeHandler.PokemonTypes[i], cultureInfo)); } } // Add on status immunities. foreach (PokemonType foundType in foundTypes) { string immunity = PokemonTypeHandler.GetTypeStatusImmunityString(foundType, cultureInfo); if (immunity != string.Empty) { sb.AppendLine(immunity); } } sb.Append("```"); } return(Response.CreateArrayFromString(sb.ToString(), responseColor)); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { StringBuilder output = new StringBuilder(); if ((Constants.IsBotOwner(args.UserId)) || (args.GuildOwnerId == args.UserId)) { ServerSettings serverSettings = senderDetail.ServerSettings; IEnumerable <ScheduledMessageData> scheduledData = serverSettings.ScheduledMessages.Where(d => d.channelId == args.ChannelId); int scheduledDataLength = scheduledData.Count(); CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string[] commandParams = command.CommandParams; switch (commandParams.Length) { case 0: // Should not occur. output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops")}"); break; case 1: // Show help. output.AppendLine(Help); output.AppendLine(Examples); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); break; case 2: { // Remove without an id? if (commandParams[1].Equals("remove", StringComparison.OrdinalIgnoreCase)) { switch (scheduledDataLength) { case 0: { // No messages set up output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}"); break; } case 1: { // Only one, remove that ScheduledMessageData matchedData = serverSettings.ScheduledMessages.Single(d => d.channelId == args.ChannelId); AttemptDisable(serverSettings, matchedData, output, senderDetail.ServerSettings.Language); // And remove serverSettings.ScheduledMessages.Remove(matchedData); serverSettingsHandler.WriteServerSettings(serverSettings); break; } default: { // More than one, require an id. output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {Constants.BotMention_Nick} {command.CommandLower} remove _id_"); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); break; } } } else if (commandParams[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) { switch (scheduledDataLength) { case 0: { // No messages set up output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}"); break; } case 1: { // Only one, try to enable that ScheduledMessageData matchedData = serverSettings.ScheduledMessages.Single(d => d.channelId == args.ChannelId); AttemptEnable(serverSettings, matchedData, output, serverSettings.Language); break; } default: { // More than one, require an id. output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {Constants.BotMention_Nick} {command.CommandLower} enable _id_"); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); break; } } } else if (commandParams[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) { switch (scheduledDataLength) { case 0: { // No messages set up output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}"); break; } case 1: { // Only one, disable that ScheduledMessageData matchedData = serverSettings.ScheduledMessages.Single(d => d.channelId == args.ChannelId); AttemptDisable(serverSettings, matchedData, output, senderDetail.ServerSettings.Language); break; } default: { // More than one, require an id. output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {Constants.BotMention_Nick} {command.CommandLower} enable _id_"); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); break; } } } else if (commandParams[1].Equals("list", StringComparison.OrdinalIgnoreCase)) { string list = BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language); if (list == string.Empty) { output.AppendLine("<none>"); } else { output.AppendLine(list); } } else if (commandParams[1].Equals("set", StringComparison.OrdinalIgnoreCase)) { output.AppendLine($"{Constants.BotMention_Nick} {command.CommandLower} set _id_ <Due|Repeating|Message|Enabled> <_value_>"); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); } else if (commandParams[1].Equals("new", StringComparison.OrdinalIgnoreCase)) { ushort id = 1; var takenIds = serverSettings.ScheduledMessages.Select(d => d.id).ToArray(); while (takenIds.Contains(id)) { ++id; } serverSettings.ScheduledMessages.Insert(id - 1, new ScheduledMessageData(args.ChannelId, id)); output.AppendLine($"{Constants.BotMention_Nick} {command.CommandLower} set **{id}** <Due|Repeating|Message|Enabled> <_value_>"); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); } break; } case 3: { bool idParsed = ushort.TryParse(commandParams[2], out ushort id); if (!idParsed) { // Id not in range output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {id}"); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); } else { var matchedData = serverSettings.ScheduledMessages.Find(m => m.id == id); if (matchedData != default(ScheduledMessageData)) { if (commandParams[1].Equals("set", StringComparison.OrdinalIgnoreCase)) { output.AppendLine($"{Constants.BotMention_Nick} {command.CommandLower} set _id_ <Due|Repeating|Message|Enabled> <value>"); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); } else if (commandParams[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) { AttemptEnable(serverSettings, matchedData, output, serverSettings.Language); } else if (commandParams[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) { AttemptDisable(serverSettings, matchedData, output, serverSettings.Language); } else { // Remove with an id? if (commandParams[1].Equals("remove", StringComparison.OrdinalIgnoreCase)) { if (!scheduledData.Any()) { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}"); } else { if (id > 0 && id <= scheduledDataLength) { AttemptDisable(serverSettings, matchedData, output, senderDetail.ServerSettings.Language); // And remove serverSettings.ScheduledMessages.Remove(matchedData); serverSettingsHandler.WriteServerSettings(serverSettings); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); } } } } } else { // Id not found output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {id}"); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); } } break; } // 4 or more default: { bool idParsed = uint.TryParse(commandParams[2], out uint id); if (!idParsed) { // Id not in range output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {id}"); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); } else { var matchedData = serverSettings.ScheduledMessages.Find(m => m.id == id); if (matchedData != default(ScheduledMessageData)) { if (commandParams[1].Equals("set", StringComparison.OrdinalIgnoreCase)) { // Due|Repeating|Message|Enabled if (commandParams[3].Equals("Due", StringComparison.OrdinalIgnoreCase)) { string dueStr = string.Join(" ", commandParams.Skip(4)); if (string.IsNullOrWhiteSpace(dueStr)) { output.AppendLine($"{Emojis.InfoSymbol} Due is the next time to send the message e.g. 5:30pm, 00:00"); } else { bool success = DateTime.TryParse(dueStr, languageHandler.GetCultureInfo(serverSettings.Language), DateTimeStyles.AssumeUniversal, out matchedData.nextDue); if (success) { matchedData.nextDue = matchedData.nextDue.ToUniversalTime(); while (matchedData.nextDue < DateTime.UtcNow) { matchedData.nextDue = matchedData.nextDue.AddDays(1); } string localisedToGo = languageHandler.GetLocalisedTimeSpan(serverSettings.Language, matchedData.nextDue - DateTime.UtcNow); output.AppendLine($"{Emojis.TimerSymbol} {matchedData.nextDue.ToString("t")} UTC ({localisedToGo})"); serverSettingsHandler.WriteServerSettings(serverSettings); } else { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {dueStr}"); } } } else if (commandParams[3].Equals("Repeating", StringComparison.OrdinalIgnoreCase)) { string repeatingStr = string.Join(" ", commandParams.Skip(4)); if (string.IsNullOrWhiteSpace(repeatingStr)) { output.AppendLine($"{Emojis.InfoSymbol} Repeating is the period to wait between each message, or 0 to not repeat. In form _days_ or _days_._hours_:_minutes_:_seconds_ or _hours_:_minutes_:_seconds_"); } else { bool success = TimeSpan.TryParse(repeatingStr, languageHandler.GetCultureInfo(senderDetail.ServerSettings.Language), out matchedData.repetitionTimeSpan); if (success) { TimeSpan ts = matchedData.repetitionTimeSpan; string localisedTs = languageHandler.GetLocalisedTimeSpan(serverSettings.Language, ts); output.AppendLine($"{Emojis.RepeatSymbol} {localisedTs}"); serverSettingsHandler.WriteServerSettings(serverSettings); } else { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {repeatingStr}"); } } } else if (commandParams[3].Equals("Message", StringComparison.OrdinalIgnoreCase)) { string messageStr = string.Join(" ", commandParams.Skip(4)); if (string.IsNullOrWhiteSpace(messageStr)) { output.AppendLine($"{Emojis.InfoSymbol} Message is the message to write."); } else { matchedData.message = messageStr; output.AppendLine($"{Emojis.MessageUnicode} {messageStr}"); serverSettingsHandler.WriteServerSettings(serverSettings); } } else if (commandParams[3].Equals("Enabled", StringComparison.OrdinalIgnoreCase)) { string enabledStr = string.Join(" ", commandParams.Skip(4)); if (string.IsNullOrWhiteSpace(enabledStr)) { output.AppendLine($"{Emojis.InfoSymbol} Enabled is if the message should be enabled (true/false). Long hand for the enable/disable command."); } else { if (enabledStr.Equals("true", StringComparison.OrdinalIgnoreCase) || enabledStr.Equals("yes", StringComparison.OrdinalIgnoreCase) || enabledStr.Equals("y", StringComparison.OrdinalIgnoreCase)) { AttemptEnable(serverSettings, matchedData, output, senderDetail.ServerSettings.Language); serverSettingsHandler.WriteServerSettings(serverSettings); } else if (enabledStr.Equals("false", StringComparison.OrdinalIgnoreCase) || enabledStr.Equals("no", StringComparison.OrdinalIgnoreCase) || enabledStr.Equals("n", StringComparison.OrdinalIgnoreCase)) { AttemptDisable(serverSettings, matchedData, output, senderDetail.ServerSettings.Language); serverSettingsHandler.WriteServerSettings(serverSettings); } else { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {enabledStr}"); } } } else { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {commandParams[3]}"); output.AppendLine($"{Constants.BotMention_Nick} {command.CommandLower} set _id_ <Due|Repeating|Message|Enabled> [value]"); } } } else { // Id not found output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {id}"); output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language)); } } break; } } } else { output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_ServerOwnerOnly")}"); } return(new[] { new Response { Message = output.ToString(), ResponseType = ResponseType.Default } }); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { // Responds asynchronously. Task.Run(async() => { CommandMessageHelper command = new CommandMessageHelper(senderDetail.ServerSettings.CommandSymbol, args.Message); string manualUrl = "http://minecraft.gamepedia.com/index.php?search=" + command.EscapedCommandDetail + "&title=Special%3ASearch&go=Go"; StringBuilder output = new StringBuilder(manualUrl + " \n"); string[] craftingTemplateParams = new string[] { "\n", "|" }; string query = command.EscapedCommandDetail; string json = ""; try { bool redirectResolved = true; // Resolve redirects do { json = await WebHelper.GetTextAsync($"http://minecraft.gamepedia.com/api.php?format=json&action=query&titles={query}&prop=revisions&rvprop=content&callback=?"); if (json.Contains(RedirectString)) { // Resolve redirect TextParser parser = new TextParser(json); parser.MovePast(RedirectString, true); parser.MovePast("[[", true); string article = parser.ExtractUntil("]]", false, true); string newQuery = Uri.EscapeDataString(article); if (query == newQuery) { output.AppendLine(Emojis.ExclamationSymbol + " infinite recursion error on: " + query); redirectResolved = false; break; } else { query = newQuery; } } }while (json.Contains(RedirectString)); if (redirectResolved) { string url = "http://minecraft.gamepedia.com/" + query; // Get the recipe. if (!json.ContainsIgnore(CraftingString, StringComparison.OrdinalIgnoreCase, " ", "\n", "\r")) { string error = Emojis.InfoSymbol + " " + languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_UnknownRecipe"); output.AppendLine(error + " " + command.CommandDetail + ": " + url); } else { // We're in business. TextParser parser = new TextParser(json); parser.MovePast(CraftingString, true); string recipeTemplate = parser.ExtractUntil("}}", false, true).Replace("|head=0", "").Replace("|head=1", "").Replace("|showdescription=0", "").Replace("|showdescription=1", "").Replace("|showname=0", "").Replace("|showname=1", ""); parser = new TextParser(recipeTemplate); parser.MovePast("|", true); // First parameter is template name string[,] recipe = new string[3, 3]; // Initialise all elements with an empty string. for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { recipe[x, y] = ""; } } if (recipeTemplate.Contains("A2") || recipeTemplate.Contains("B2") || recipeTemplate.Contains("C2")) { // Method 1, cells specified string a1Cell = parser.ExtractBetween("A1", craftingTemplateParams, true); recipe[0, 0] = TidyRecipeParameter(a1Cell); string b1Cell = parser.ExtractBetween("B1", craftingTemplateParams, true); recipe[1, 0] = TidyRecipeParameter(b1Cell); string c1Cell = parser.ExtractBetween("C1", craftingTemplateParams, true); recipe[2, 0] = TidyRecipeParameter(c1Cell); string a2Cell = parser.ExtractBetween("A2", craftingTemplateParams, true); recipe[0, 1] = TidyRecipeParameter(a2Cell); string b2Cell = parser.ExtractBetween("B2", craftingTemplateParams, true); recipe[1, 1] = TidyRecipeParameter(b2Cell); string c2Cell = parser.ExtractBetween("C2", craftingTemplateParams, true); recipe[2, 1] = TidyRecipeParameter(c2Cell); string a3Cell = parser.ExtractBetween("A3", craftingTemplateParams, true); recipe[0, 2] = TidyRecipeParameter(a3Cell); string b3Cell = parser.ExtractBetween("B3", craftingTemplateParams, true); recipe[1, 2] = TidyRecipeParameter(b3Cell); string c3Cell = parser.ExtractBetween("C3", craftingTemplateParams, true); recipe[2, 2] = TidyRecipeParameter(c3Cell); } else { // Method 2, all fields present -OR- clockwise layout. List <string> items = new List <string>(); for (int i = 0; i < 9; i++) { string candidateItem = TidyRecipeParameter(parser.ExtractUntil(craftingTemplateParams, false, true)); if (candidateItem.Contains("output", StringComparison.OrdinalIgnoreCase)) { break; } else { items.Add(candidateItem); parser.MovePast("|"); } } // If we have less than 4, then it's constructed in a clockwise fashion. switch (items.Count) { case 0: break; case 1: recipe[0, 1] = items[0]; break; case 2: recipe[0, 1] = items[0]; recipe[1, 1] = items[1]; break; case 3: recipe[0, 1] = items[0]; recipe[1, 1] = items[1]; recipe[1, 2] = items[2]; break; case 4: recipe[0, 1] = items[0]; recipe[1, 1] = items[1]; recipe[1, 2] = items[2]; recipe[0, 2] = items[3]; break; default: { recipe[0, 1] = items[0]; recipe[1, 1] = items[1]; recipe[1, 2] = items[2]; recipe[0, 2] = items[3]; break; } case 9: // Otherwise, all parameters are specified and just go from top left to bottom right. for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { recipe[x, y] = items[(x * 3) + y]; } } break; } } parser.MovePast(OutputNameString, true); string outputName = TidyRecipeParameter(parser.ExtractUntil(craftingTemplateParams, false, true)); if (string.IsNullOrWhiteSpace(outputName)) { string error = Emojis.ExclamationSymbol + " " + languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_UnknownRecipe"); output.AppendLine($"{error}{command.CommandDetail}: " + url); } else { const int pad = 14; output.AppendLine($"```"); // Mono-space engage! output.AppendLine($"|--------------|--------------|--------------|"); output.AppendLine($"|{recipe[0, 0].CentreString(pad)}|{recipe[1, 0].CentreString(pad)}|{recipe[2, 0].CentreString(pad)}|"); output.AppendLine($"|--------------|--------------|--------------|"); output.AppendLine($"|{recipe[0, 1].CentreString(pad)}|{recipe[1, 1].CentreString(pad)}|{recipe[2, 1].CentreString(pad)}|"); output.AppendLine($"|--------------|--------------|--------------|"); output.AppendLine($"|{recipe[0, 2].CentreString(pad)}|{recipe[1, 2].CentreString(pad)}|{recipe[2, 2].CentreString(pad)}|"); output.AppendLine($"|--------------|--------------|--------------|"); output.AppendLine($"```"); output.AppendLine($"{outputName}"); } } } } catch (Exception ex) { string error = Emojis.CrossSymbol + " " + languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops"); output.AppendLine(error + " " + command.CommandDetail); errorLogger.LogDebug("Query: " + query, true); errorLogger.LogDebug("JSON: " + json, true); errorLogger.LogDebug(ex.ToString(), true); } Response asyncResponse = new Response { ResponseType = ResponseType.Default, Embed = EmbedUtility.ToEmbed(output.ToString(), null), Message = output.ToString() }; await asyncResponder.SendResponseAsync(args, asyncResponse); }); // Return out the lifecycle with no response. return(new[] { Response.WaitForAsync }); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { string retVal = ""; ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string[] commandParams = command.CommandParams; ushort flips; Discord.Color responseColor = new Discord.Color(0); if (commandParams.Length == 1) { flips = 1; } else { if (!ushort.TryParse(commandParams[1], out flips) || flips <= 0) { retVal = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {commandParams[1]}. [1-{uint.MaxValue}]."); } } if (flips > 0) { int heads = 0, tails = 0; string localeHead = languageHandler.GetPhrase(serverSettings.Language, "CoinHead"); string localeTail = languageHandler.GetPhrase(serverSettings.Language, "CoinTail"); if (flips == 1) { switch (rand.Next(2)) { default: case 0: retVal = localeHead; heads++; break; case 1: retVal = localeTail; tails++; break; } } else { char headLetter = (localeHead)[0]; char tailLetter = (localeTail)[0]; string flipped = languageHandler.GetPhrase(serverSettings.Language, "Flipped"); if (flips > 100) { for (int i = 0; i < flips; i++) { switch (rand.Next(2)) { case 0: heads++; break; case 1: tails++; break; } } retVal = ($"{flipped} {flips}x, `{localeHead}:` {heads}, `{localeTail}:` {tails}"); } else { StringBuilder coinflips = new StringBuilder(); for (int i = 0; i < flips; i++) { switch (rand.Next(2)) { case 0: coinflips.Append(headLetter); heads++; break; case 1: coinflips.Append(tailLetter); tails++; break; } } retVal = ($"{flipped} {flips}x, `{localeHead}:` {heads}, `{localeTail}:` {tails}: {coinflips.ToString()}"); } } if (heads < tails) { responseColor = new Discord.Color(200, 50, 50); } else if (heads > tails) { responseColor = new Discord.Color(50, 200, 50); } else { responseColor = new Discord.Color(200, 200, 50); } } Response response = new Response { Embed = Utility.EmbedUtility.ToEmbed(retVal, responseColor), Message = retVal, ResponseType = ResponseType.Default }; return(new[] { response }); }
public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args) { StringBuilder sb = new StringBuilder(); ServerSettings serverSettings = senderDetail.ServerSettings; CommandMessageHelper command = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message); string commandDetail = command.CommandDetail; Discord.Color?embedColour = null; if (string.IsNullOrEmpty(commandDetail)) { sb.AppendLine(Help); } else { // Remove decorators commandDetail = commandDetail.Replace("0x", "").Replace("0b", "").Replace("#", ""); // Replace commas with spaces commandDetail = commandDetail.Replace(",", " ").Trim(); // Special case hex to decimal in cases of 6 or 8 characters. bool is6Chars = commandDetail.Length == 6; bool is8Chars = commandDetail.Length == 8; if (fromBase == 16 && (is6Chars || is8Chars)) { // Try and convert the source hex number into a colour. if (uint.TryParse(commandDetail, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out uint argb)) { // Remove alpha channel (N.B. this usually makes it transparent as a = 0, but Discord fixes this to fully opaque) argb &= 0x00FFFFFF; embedColour = new Discord.Color(argb); } commandDetail += " "; commandDetail += commandDetail.Substring(0, 2); commandDetail += " "; commandDetail += commandDetail.Substring(2, 2); commandDetail += " "; commandDetail += commandDetail.Substring(4, 2); if (is8Chars) { commandDetail += " "; commandDetail += commandDetail.Substring(6, 2); } } string[] commandParams = commandDetail.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s)).ToArray(); if (fromBase == 10) { // Try and convert the source decimal number(s) into a colour. if (commandParams.Length == 1) { if (uint.TryParse(commandParams[0], out uint argb)) { // Remove alpha channel (N.B. this usually makes it transparent as a = 0, but Discord fixes this to fully opaque) argb &= 0x00FFFFFF; embedColour = new Discord.Color(argb); } } else if (commandParams.Length == 3 || commandParams.Length == 4) { // Using -n here as alpha could be included at the front. bool canParseColour = (byte.TryParse(commandParams[commandParams.Length - 3], out byte r)); canParseColour &= (byte.TryParse(commandParams[commandParams.Length - 2], out byte g)); canParseColour &= (byte.TryParse(commandParams[commandParams.Length - 1], out byte b)); if (canParseColour) { embedColour = new Discord.Color(r, g, b); } } } foreach (string col in commandParams) { try { switch (fromBase) { case 2: case 8: case 10: case 16: { long part = Convert.ToInt64(col, fromBase); byte[] parts = BitConverter.GetBytes(part); if (toBase == 64) { sb.Append(Convert.ToBase64String(parts) + " "); } else if (toBase == 16) { sb.Append(part.ToString("X2") + " "); } else { sb.Append(Convert.ToString(part, toBase) + " "); } break; } case 64: { byte[] parts = Convert.FromBase64String(col); long part = BitConverter.ToInt64(parts, 0); if (toBase == 64) { sb.Append(Convert.ToBase64String(parts) + " "); } else if (toBase == 16) { sb.Append(part.ToString("X2") + " "); } else { sb.Append(Convert.ToString(part, toBase) + " "); } break; } } } catch (FormatException) { sb.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_IncorrectParameter")}: {col}."); } catch (Exception ex) { sb.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_Oops")}: {col} {ex.Message}"); } } // If multiple things to translate, also provide the answer without spaces. if (command.CommandParams.Length > 2) { string outputWithoutSpace = sb.ToString().Replace(" ", ""); sb.AppendLine(); switch (toBase) { case 2: sb.Append("0b "); break; case 8: sb.Append("0o "); break; case 16: sb.Append("0x "); break; } sb.AppendLine(outputWithoutSpace); } } string output = sb.ToString(); Response response = new Response { Embed = EmbedUtility.ToEmbed(output, embedColour), Message = output, ResponseType = ResponseType.Default }; return(new[] { response }); }