//Encapsulates Discord Message formatting for Warframe Event messages
        public static StringBuilder FormatMessage(string content, MessageMarkdownLanguageIdPreset preset, string customLanguageIdentifier = "xl", MessageFormat formatType = MessageFormat.CodeBlocks)
        {
            var formatString = string.Empty;
            var markdownLanguageIdentifier = string.Empty;

            switch (preset)
            {
            case MessageMarkdownLanguageIdPreset.ExpiredEvent:
                markdownLanguageIdentifier = ConfigurationManager.AppSettings["WarframeMessageMarkdown.ExpiredEvent"];
                break;

            case MessageMarkdownLanguageIdPreset.NewEvent:
                markdownLanguageIdentifier = ConfigurationManager.AppSettings["WarframeMessageMarkdown.NewEvent"];
                break;

            case MessageMarkdownLanguageIdPreset.Custom:
                markdownLanguageIdentifier = customLanguageIdentifier;
                break;

            default:
                markdownLanguageIdentifier = ConfigurationManager.AppSettings["WarframeMessageMarkdown.ActiveEvent"];
                break;
            }

            switch (formatType)
            {
            case MessageFormat.CodeBlocks:
                formatString = "```";
                break;

            case MessageFormat.Bold:
                formatString = "**";
                break;

            case MessageFormat.Italics:
                formatString = "*";
                break;

            case MessageFormat.BoldItalics:
                formatString = "***";
                break;

            case MessageFormat.Underline:
                formatString = "__";
                break;

            case MessageFormat.Strikeout:
                formatString = "~~";
                break;

            case MessageFormat.UnderlineItalics:
                formatString = "__*";
                break;

            case MessageFormat.UnderlineBold:
                formatString = "__**";
                break;

            case MessageFormat.UnderlineBoldItalics:
                formatString = "__***";
                break;

            case MessageFormat.None:
                formatString = string.Empty;
                break;
            }

            //Only CodeBlocks and CodeLine format modes support a markdown language identifier
            if ((formatType != MessageFormat.CodeBlocks) && (formatType != MessageFormat.CodeLine))
            {
                markdownLanguageIdentifier = string.Empty;
            }

            var result = new StringBuilder();

            result.AppendLine($"{formatString}{(string.IsNullOrEmpty(markdownLanguageIdentifier) ? string.Empty : markdownLanguageIdentifier)}");
            result.AppendLine(content);
            result.AppendLine($"{formatString.Reverse()}");

            return(result);
        }
Example #2
0
        /// <summary>
        /// Build and post the Discord message for invasions
        /// </summary>
        private void PostInvasionMessage()
        {
            var finalMessagesToPost = new List <StringBuilder>();
            var messagesToNotify    = new List <string>();

            //Messages will append to this builder until the length reaches the MESSAGE_CHAR_LIMIT value
            //Due to the potential length of an invasion message, it may need to be broken down into smaller messages. Hence - entryForFinalMessage
            var entryForFinalMessage = new StringBuilder();

            finalMessagesToPost.Add(entryForFinalMessage);

            if (_invasionMessagePostQueue.Count == 0)
            {
                entryForFinalMessage.Append(WarframeEventExtensions.FormatMessage("NO ACTIVE INVASIONS", preset: MessageMarkdownLanguageIdPreset.ActiveEvent, formatType: MessageFormat.CodeBlocks));
            }

            _invasionMessagePostQueue = _invasionMessagePostQueue
                                        .OrderByDescending(s => Math.Abs(s.WarframeEvent.Progress)).ToList();

            foreach (var message in _invasionMessagePostQueue)
            {
                //Core content of the Discord message without any formatting
                var coreMessageContentEntry = new StringBuilder();
                coreMessageContentEntry.AppendLine(WarframeEventExtensions.DiscordMessage(message.WarframeEvent as dynamic, false));

                MessageMarkdownLanguageIdPreset markdownPreset = MessageMarkdownLanguageIdPreset.ActiveEvent;

                if (message.NotifyClient)
                {
                    messagesToNotify.Add(WarframeEventExtensions.DiscordMessage(message.WarframeEvent as dynamic, true));
                    coreMessageContentEntry.Append("( new )");
                    markdownPreset = MessageMarkdownLanguageIdPreset.NewEvent;
                }

                //Create a new entry in the post queue if the character length of the current message hits the character limit
                if (entryForFinalMessage.Length + coreMessageContentEntry.Length < MESSAGE_CHAR_LIMIT)
                {
                    entryForFinalMessage.Append(WarframeEventExtensions.FormatMessage(coreMessageContentEntry.ToString(), preset: markdownPreset, formatType: MessageFormat.CodeBlocks));
                }
                else
                {
                    entryForFinalMessage.Append(coreMessageContentEntry.ToString());
                    finalMessagesToPost.Add(entryForFinalMessage);
                }
            }

            //Project Construction Information
            var constructionMessage = new StringBuilder();

            if (_invasionConstructionMessagePostQueue.Count > 0)
            {
                foreach (var message in _invasionConstructionMessagePostQueue)
                {
                    constructionMessage.Append(WarframeEventExtensions.DiscordMessage(message.WarframeEvent as dynamic, false));
                }

                entryForFinalMessage.Append(WarframeEventExtensions.FormatMessage(constructionMessage.ToString(), preset: MessageMarkdownLanguageIdPreset.ActiveEvent, formatType: MessageFormat.CodeBlocks));
            }

            if (_invasionMessages.Count > 0)
            {
                foreach (var item in messagesToNotify)
                {
                    NotifyClient(item, _invasionChannelId);
                }
            }

            for (var i = 0; i < finalMessagesToPost.Count; ++i)
            {
                //If invasion messages already exist
                if (i < _invasionMessages.Count)
                {
                    EditEventMessage(finalMessagesToPost.ElementAt(i).ToString(), _invasionMessages.ElementAt(i));
                }
                else //When we run out of available invasion messages to edit
                {
                    _invasionMessages.Add(SendMessageToChannel(finalMessagesToPost.ElementAt(i).ToString(), _invasionChannelId));
                }
            }

            //Get rid of any extra messages which have been created as a result of long character counts in Discord messages
            if (_invasionMessages.Count > finalMessagesToPost.Count)
            {
                var range = _invasionMessages.GetRange(finalMessagesToPost.Count, _invasionMessages.Count - finalMessagesToPost.Count);
                range.ForEach(msg => DeleteMessage(msg));

                _invasionMessages.RemoveRange(finalMessagesToPost.Count, _invasionMessages.Count - finalMessagesToPost.Count);
            }
#if DEBUG
            foreach (var i in finalMessagesToPost)
            {
                Log(i.Length + " characters long");
            }
#endif
            _invasionMessagePostQueue.Clear();
            _invasionConstructionMessagePostQueue.Clear();
        }