Esempio n. 1
0
        /// <summary>
        /// Load the <see cref="CommandFile"/> from xml.
        /// Returns success.
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        public bool FromXML(string xml)
        {
            bool retVal = true;

            try
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
                XmlNode root = doc.LastChild; // FirstChild is decl

                Aliases        = root["Aliases"].InnerText.Split(',').Select(s => s.Trim()).ToArray();
                CommandType    = root["CommandType"].InnerText;
                Examples       = root["Examples"]?.InnerText ?? (Aliases.Length > 0 ? (Constants.BotMention_Nick + " " + Aliases[0]) : "");
                Help           = root["Help"]?.InnerText ?? "No help available for this command.";
                Module         = (root["Module"]?.InnerText) ?? Commands.ModuleType.General.ToString();
                RequiresSymbol = (root["RequiresSymbol"]?.InnerText) ?? true.ToString();

                ExtraData = new List <KeyValuePair <string, string> >();
                var extraDataNodes = root["ExtraData"];
                foreach (XmlElement node in extraDataNodes?.OfType <XmlElement>() ?? new XmlElement[0])
                {
                    ExtraData.Add(node.Name, node.InnerText);
                }
            }
            catch (Exception ex)
            {
                retVal = false;
                errorLogger.LogException(ex, ErrorSeverity.Error);
            }

            return(retVal);
        }
Esempio n. 2
0
        private async Task <Response> BuildMemeAsync(Languages language, IMessageDetail m)
        {
            string[] urls     = m.URLs;
            Response response = null;

            for (int i = 0; i < urls.Length; i++)
            {
                string url = urls[i];
                try
                {
                    // Check if the url is a file
                    if (WebHelper.IsImageUrl(url))
                    {
                        // It is, download and perform meme
                        var tuple = await WebHelper.DownloadFile(url);

                        if (tuple.Item2 != null)
                        {
                            response = DoBuildMemeImage(language, tuple.Item2);
                        }
                        else
                        {
                            // We failed, return a response indicating the failure.
                            string err = Emojis.NoEntrySign + " " + tuple.Item1.ReasonPhrase;
                            response = new Response
                            {
                                Embed        = EmbedUtility.ToEmbed(err),
                                Message      = err,
                                ResponseType = ResponseType.Default
                            };
                        }
                        break;
                    }
                }
                catch (HttpRequestException ex)
                {
                    errorLogger.LogDebug($"HttpRequestException exception downloading file: {url}. Assuming file too big.", true);
                    errorLogger.LogException(ex, ErrorSeverity.Information);
                    string err = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(language, "Error_NotAFile")}");
                    response = new Response
                    {
                        Embed        = EmbedUtility.ToEmbed(err),
                        Message      = err,
                        ResponseType = ResponseType.Default
                    };
                    break;
                }
                catch (Exception ex)
                {
                    errorLogger.LogDebug($"Exception downloading or handling meme file: {url}", true);
                    errorLogger.LogException(ex, ErrorSeverity.Information);
                    // try other urls
                }
            }
            return(response);
        }
Esempio n. 3
0
        public async void SaveFileAsync(ServerSettings settingsToSave, string filename)
        {
            await semaphore.WaitAsync();

            try
            {
                ServerSettingsFile file = new ServerSettingsFile(errorLogger);
                file.Initialise(settingsToSave);
                string contents = file.ToXML();
                if (contents != null)
                {
                    if (!filename.EndsWith(".xml"))
                    {
                        filename += ".xml";
                    }
                    File.WriteAllText(Path.Combine(saveDirectory, filename), contents);
                }
            }
            catch (Exception ex)
            {
                errorLogger.LogException(ex, ErrorSeverity.Error);
            }

            semaphore.Release();
        }
Esempio n. 4
0
        /// <summary>
        /// Initialise the server settings handler.
        /// </summary>
        public void Initialise()
        {
            serverSettings = new Dictionary <ulong, ServerSettings>();
            var serverSettingsFiles = dal.ReadServerSettingsFiles();

            foreach (var file in serverSettingsFiles)
            {
                try
                {
                    ulong          serverId = ulong.Parse(file.ServerId);
                    ServerSettings fromFile = new ServerSettings(serverId)
                    {
                        BlockedModules            = new HashSet <ModuleType>(file.BlockedModules.Select(m => (ModuleType)Enum.Parse(typeof(ModuleType), m))),
                        CommandSymbol             = file.CommandSymbol,
                        JoinQuitChannelId         = ulong.Parse(file.JoinQuitChannelId),
                        JoinServerMessages        = file.JoinServerMessages,
                        Language                  = (Languages)Enum.Parse(typeof(Languages), file.Language),
                        QuitServerMessages        = file.QuitServerMessages,
                        RateChannels              = new HashSet <ulong>(file.RateChannels.Select(c => ulong.Parse(c))),
                        ScheduledMessages         = new List <ScheduledMessageData>(file.ScheduledMessages),
                        ServerId                  = serverId,
                        Splatoon2RotationChannels = new HashSet <ulong>(file.Splatoon2RotationChannels.Select(c => ulong.Parse(c))),
                        TrackDeletedMessages      = file.TrackDeletedMessages
                    };
                    serverSettings[fromFile.ServerId] = fromFile;
                }
                catch (Exception ex)
                {
                    errorLogger.LogException(ex, ErrorSeverity.Error);
                }
            }
        }
Esempio n. 5
0
        /// <summary>
        /// Load the <see cref="LanguagesFile"/> from xml.
        /// Returns success.
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        public bool FromXML(string xml)
        {
            bool retVal = true;

            try
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);

                Data = new Dictionary <string, string>();
                var nodes = doc["resources"];

                foreach (XmlElement node in nodes?.OfType <XmlElement>())
                {
                    string key   = (node.HasAttribute("name")) ? node.GetAttribute("name") : node.Name;
                    string value = node.InnerText.TrimStart('\"').TrimEnd('\"');
                    Data.Add(key, value);
                }
            }
            catch (Exception ex)
            {
                retVal = false;
                errorLogger.LogException(ex, ErrorSeverity.Error);
            }

            return(retVal);
        }
Esempio n. 6
0
        /// <summary>
        /// Load the <see cref="UserSettingsFile"/> from xml.
        /// Returns success.
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        public bool FromXML(string xml)
        {
            bool retVal = true;

            try
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
                XmlNode root = doc.LastChild; // FirstChild is decl

                CommandsCount = (root["UserStats"]["CommandsCount"].InnerText);
                UserId        = (root["UserId"].InnerText);
            }
            catch (Exception ex)
            {
                retVal = false;
                errorLogger.LogException(ex, ErrorSeverity.Error);
            }

            return(retVal);
        }
Esempio n. 7
0
 public void SaveFile(Commands.Command commandToSave, string filename)
 {
     try
     {
         CommandFile file = new CommandFile(errorLogger);
         file.Initialise(commandToSave);
         string contents = file.ToXML();
         if (contents != null)
         {
             if (!filename.EndsWith(".xml"))
             {
                 filename += ".xml";
             }
             File.WriteAllText(Path.Combine(saveDirectory, filename), contents);
         }
     }
     catch (Exception ex)
     {
         errorLogger.LogException(ex, ErrorSeverity.Error);
     }
 }
Esempio n. 8
0
        /// <summary>
        /// Load the <see cref="ServerSettingsFile"/> from xml.
        /// Returns success.
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        public bool FromXML(string xml)
        {
            bool retVal = true;

            try
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
                XmlNode root = doc.LastChild; // FirstChild is decl

                var blockedModuleNodes = root["BlockedModules"];
                if (blockedModuleNodes != null)
                {
                    foreach (XmlElement node in blockedModuleNodes.OfType <XmlElement>())
                    {
                        BlockedModules.Add(node.InnerText);
                    }
                }
                CommandSymbol     = root["CommandSymbol"].InnerText;
                JoinQuitChannelId = (root["JoinQuitChannelId"].InnerText);
                var joinServerMessageNodes = root["JoinServerMessages"];
                if (joinServerMessageNodes != null)
                {
                    foreach (XmlElement node in joinServerMessageNodes.OfType <XmlElement>())
                    {
                        JoinServerMessages.Add(node.InnerText);
                    }
                }
                Language = root["Language"].InnerText;
                var quitServerMessageNodes = root["QuitServerMessages"];
                if (quitServerMessageNodes != null)
                {
                    foreach (XmlElement node in quitServerMessageNodes.OfType <XmlElement>())
                    {
                        QuitServerMessages.Add(node.InnerText);
                    }
                }
                var rateChannelNodes = root["RateChannels"];
                if (rateChannelNodes != null)
                {
                    foreach (XmlElement node in rateChannelNodes.OfType <XmlElement>())
                    {
                        RateChannels.Add(node.InnerText);
                    }
                }
                var scheduledMessagesNode = root["ScheduledMessages"];
                if (scheduledMessagesNode != null)
                {
                    foreach (XmlElement node in scheduledMessagesNode.OfType <XmlElement>())
                    {
                        ulong  channelId = ulong.Parse(node.GetElementsByTagName("Channel")[0].InnerText);
                        ushort id        = ushort.Parse(node.GetElementsByTagName("Id")[0].InnerText);
                        ScheduledMessages.Add(
                            new ScheduledMessageData(channelId, id)
                        {
                            enabled            = bool.Parse(node.GetElementsByTagName("Enabled")[0].InnerText),
                            message            = node.GetElementsByTagName("Message")[0].InnerText,
                            nextDue            = new DateTime(long.Parse(node.GetElementsByTagName("NextDueTicks")[0].InnerText)),
                            repetitionTimeSpan = new TimeSpan(long.Parse(node.GetElementsByTagName("RepetitionTicks")[0].InnerText)),
                        }
                            );
                    }
                }
                var splatoon2RotationChannelNodes = root["Splatoon2RotationChannels"];
                if (splatoon2RotationChannelNodes != null)
                {
                    foreach (XmlElement node in splatoon2RotationChannelNodes.OfType <XmlElement>())
                    {
                        Splatoon2RotationChannels.Add(node.InnerText);
                    }
                }
                ServerId             = (root["ServerId"].InnerText);
                TrackDeletedMessages = bool.Parse(root["TrackDeletedMessages"]?.InnerText ?? "false");
            }
            catch (Exception ex)
            {
                retVal = false;
                errorLogger.LogException(ex, ErrorSeverity.Error);
            }

            return(retVal);
        }
Esempio n. 9
0
        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);
            }
        }
Esempio n. 10
0
        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));
        }