Ejemplo n.º 1
0
        public virtual InlineKeyboardMarkup RenderModerationInlineKeyboard(Strings strings)
        {
            InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup {
                InlineKeyboard = new List <List <InlineKeyboardButton> >
                {
                    new List <InlineKeyboardButton> {
                        InlineKeyboardButton.Create(EmojiStore.Done + " " + strings.GetString(Strings.StringsList.done), callbackData: "comm:options:" + this.ChatId + ":" + this.PollId)
                    }
                }
            };

            return(inlineKeyboard);
        }
Ejemplo n.º 2
0
        protected virtual InlineKeyboardMarkup GenerateUserMarkup(Strings strings, string apikey)
        {
            string botname = Globals.Botname;

            if (delete)
            {
                return(null);
            }
            InlineKeyboardMarkup inline = new InlineKeyboardMarkup {
                InlineKeyboard = new List <List <InlineKeyboardButton> >()
            };

            if (!closed)
            {
                inline.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                    InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.publish), switchInlineQuery: pollText)
                });
                if (pollType != EPolls.board)
                {
                    inline.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                        InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.publishWithLink), switchInlineQuery: "$c:" + pollText)
                    });
                    inline.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                        InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.buttonVote), callbackData: "comm:iwannavote:" + Cryptography.Encrypt(chatId + ":" + pollId, apikey)),
                        InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.commPageRefresh), callbackData: "comm:update:" + chatId + ":" + pollId)
                    });
                }
                else
                {
                    inline.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                        InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.buttonVote), url: "https://telegram.me/" + Globals.Botname + "bot?start=" + Cryptography.Encrypt("board:" + chatId + ":" + pollId, apikey)),
                        InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.commPageRefresh), callbackData: "comm:update:" + chatId + ":" + pollId)
                    });
                }
            }
            inline.InlineKeyboard.Add(new List <InlineKeyboardButton>()
            {
                InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.commPageOptions), callbackData: "comm:options:" + chatId + ":" + pollId),
                InlineKeyboardButton.Create((closed ? strings.GetString(Strings.stringsList.commPageReopen) : strings.GetString(Strings.stringsList.commPageClose)), callbackData: "comm:" + (closed ? "reopen:" : "close:") + chatId + ":" + pollId),
                InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.commPageDelete), callbackData: "comm:delete:" + chatId + ":" + pollId),
            });
            return(inline);
        }
Ejemplo n.º 3
0
        public override InlineKeyboardMarkup RenderInlineKeyboard(List <int> pollVotesCount, Strings strings, bool noApproximation, bool channel = false)
        {
            InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup();

            inlineKeyboard.InlineKeyboard = new List <List <InlineKeyboardButton> >();
            if (!closed && !delete)
            {
                inlineKeyboard.InlineKeyboard.Add(new List <InlineKeyboardButton>()
                {
                    InlineKeyboardButton.Create(strings.GetString(Strings.StringsList.buttonVote), url: $"https://telegram.me/{ Globals.GlobalOptions.Botname }?start={ Cryptography.Encrypt($"board:{ ChatId.ToString() }:{ PollId.ToString() }") }")
                });
            }
            return(inlineKeyboard);
        }
Ejemplo n.º 4
0
        private static ContentParts prepare(Strings strings, Pointer pointer)
        {
            string text = strings.GetString(Strings.stringsList.setLanguage);
            InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup();

            inlineKeyboard.InlineKeyboard = new List <List <InlineKeyboardButton> >();
            var values = Enum.GetValues(typeof(Strings.langs));
            int j      = -1;

            for (int i = 1; i < values.Length; i++)
            {
                int wI = i - 1;
                if (wI % 2 == 0)
                {
                    inlineKeyboard.InlineKeyboard.Add(new List <InlineKeyboardButton>());
                    j++;
                }
                inlineKeyboard.InlineKeyboard[j].Add(InlineKeyboardButton.Create(strings.GetLangName((Strings.langs)values.GetValue(i)) + (values.GetValue(i).Equals(pointer.Lang) ? " ✅" : ""), callbackData: ("comm:lang:" + values.GetValue(i))));
            }
            inlineKeyboard.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                InlineKeyboardButton.Create("\ud83d\udcbe " + strings.GetString(Strings.stringsList.done), callbackData: "comm:showWelcome")
            });
            return(new ContentParts(text, inlineKeyboard, null));
        }
Ejemplo n.º 5
0
        ReplyMarkup GenerateOptionsMarkup(Strings strings)
        {
            InlineKeyboardMarkup inline = new InlineKeyboardMarkup {
                InlineKeyboard = new List <List <InlineKeyboardButton> >()
            };
            bool moderate = Appendable;

            if (this.pollType != EPolls.board)
            {
                inline.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                    InlineKeyboardButton.Create(String.Format(strings.GetString(Strings.stringsList.optionsPercentageNone), (PercentageBar == PercentageBars.Bars.none).ToCheck()), callbackData: "comm:percentage:none:" + chatId + ":" + pollId),
                    InlineKeyboardButton.Create(PercentageBars.GetIconArray(PercentageBars.Bars.dots).Implode() + " " + (PercentageBar == PercentageBars.Bars.dots).ToCheck(), callbackData: "comm:percentage:dots:" + chatId + ":" + pollId),
                    InlineKeyboardButton.Create(PercentageBars.GetIconArray(PercentageBars.Bars.thumbs).Implode() + " " + (PercentageBar == PercentageBars.Bars.thumbs).ToCheck(), callbackData: "comm:percentage:thumbs:" + chatId + ":" + pollId),
                });
                inline.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                    InlineKeyboardButton.Create(String.Format(strings.GetString(Strings.stringsList.optionsSorted), Sorted.ToCheck()), callbackData: "comm:sorted:" + chatId + ":" + pollId),
                });
                inline.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                    InlineKeyboardButton.Create(String.Format(strings.GetString(Strings.stringsList.optionsAppendable), Appendable.ToCheck()), callbackData: "comm:appendable:" + chatId + ":" + pollId),
                });
            }
            else
            {
                moderate = true;
            }
            if (moderate)
            {
                inline.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                    InlineKeyboardButton.Create("\ud83d\udd0d " + strings.GetString(Strings.stringsList.moderate), callbackData: "comm:moderate:" + chatId + ":" + pollId),
                });
            }
            inline.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                InlineKeyboardButton.Create("\ud83d\udcbe " + strings.GetString(Strings.stringsList.done), callbackData: "comm:update:" + chatId + ":" + pollId)
            });
            return(inline);
        }
Ejemplo n.º 6
0
        public async Task Update(List <Instance> instances, long currentBotChatID, Strings strings, bool noApproximation, string currentInlineMessageID = null, int?messageId = null, string currentText = null, long?newChatId = null, bool voteButtonPressed = false)
        {
            //If a user pressed the update button, the messageId is not null (so nobody voted)
            bool     getsAVote       = messageId == null;
            Instance currentInstance = instances.Find(x => x.chatID == currentBotChatID);
            string   apikey          = currentInstance.apikey;
            //Fully fledged poll
            ContentParts content = GetContent(strings, apikey, noApproximation: noApproximation);
            //Has only link buttons
            ContentParts contentChannel = GetContent(strings, apikey, noApproximation: noApproximation, channel: true);
            //Filters HTML-Tags from the new message to compare with the old message text (to reduce unecessary updates)
            Regex regex = new Regex("<[^>]*>");

            if (currentText == null || regex.Replace(content.Text, "") != regex.Replace(currentText, "") || voteButtonPressed)
            {
                if (messageId != null)
                {
                    //User voted in private chat and is not the poll owner
                    if (newChatId != null && newChatId != this.chatId)
                    {
                        await Api.EditMessageTextAsync(apikey, strings.GetString(Strings.StringsList.votedSuccessfully), null, newChatId, messageId);

                        getsAVote = true;
                        //User requests to vote on his own poll
                    }
                    else if (voteButtonPressed)
                    {
                        await Api.EditMessageTextAsync(apikey, content.Text, content.InlineKeyboard, this.chatId, messageId);

                        //Poll owner voted in private chat
                    }
                    else
                    {
                        await Api.EditMessageTextAsync(apikey, content.Text, GenerateUserMarkup(strings, apikey), this.chatId, messageId);

                        getsAVote = true;
                    }
                }
                //Refreshes all messages shared via inline mode
                if (getsAVote)
                {
                    await RefreshInlineMessage(instances, currentBotChatID, content, contentChannel, currentInlineMessageID);
                }
            }
        }
Ejemplo n.º 7
0
        public void Update(string apikey, Strings strings, int?messageId = null, string currentText = null, long?newChatId = null, bool vote = false)
        {
            bool         getsAVote      = messageId == null;
            ContentParts content        = GetContent(strings, apikey);
            ContentParts contentChannel = GetContent(strings, apikey, true);
            Regex        regex          = new Regex("<[^>]*>");

            if (currentText == null || regex.Replace(content.Text, "") != regex.Replace(currentText, "") || vote)
            {
                if (messageId != null)
                {
                    if (newChatId != null && newChatId != chatId)
                    {
                        Api.EditMessageText(apikey, strings.GetString(Strings.stringsList.votedSuccessfully), null, newChatId, messageId);
                        getsAVote = true;
                    }
                    else if (vote)
                    {
                        Api.EditMessageText(apikey, content.Text, content.InlineKeyboard, chatId, messageId);
                    }
                    else
                    {
                        Api.EditMessageText(apikey, content.Text, GenerateUserMarkup(strings, apikey), chatId, messageId);
                        getsAVote = true;
                    }
                }
                if (getsAVote)
                {
                    foreach (MessageID messageID in messageIds)
                    {
                        if (messageID.channel)
                        {
                            Api.EditMessageText(apikey, contentChannel.Text, contentChannel.InlineKeyboard, inlineMessageId: messageID.inlineMessageId);
                        }
                        else
                        {
                            Api.EditMessageText(apikey, content.Text, content.InlineKeyboard, inlineMessageId: messageID.inlineMessageId);
                        }
                    }
                }
            }
        }
Ejemplo n.º 8
0
        protected ContentParts GetPollOutputOld(Strings strings, int peopleCount, List <int> pollVotesCount, bool noApproximation, bool channel = false)
        {
            Strings.Langs oldLang = strings.CurrentLang;
            strings.SetLanguage(lang);
            string text;
            string inlineTitle = this.pollText;
            //TODO Make this pretty
            string inlineDescription;
            InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup();

            inlineKeyboard.InlineKeyboard = new List <List <InlineKeyboardButton> >();
            //if (offset == null) {
            if (!closed)
            {
                inlineKeyboard.InlineKeyboard.Add(new List <InlineKeyboardButton>()
                {
                    InlineKeyboardButton.Create(strings.GetString(Strings.StringsList.buttonVote), url: $"https://telegram.me/{ Globals.GlobalOptions.Botname }?start={ Cryptography.Encrypt($"board:{ ChatId.ToString() }:{ PollId.ToString() }") }")
                });
            }
            inlineDescription = StringEdit.CurrentCulture.TextInfo.ToTitleCase(anony.ToString()) + " " + pollType + ": " + pollText + ": ";
            text = "\ud83d\udcdd <b>" + HtmlSpecialChars.Encode(pollText).UnmarkupUsernames() + "</b>" + (!string.IsNullOrEmpty(pollDescription) ? ("\n" + HtmlSpecialChars.Encode(pollDescription) + "\n") : "\n");
            foreach (KeyValuePair <int, BoardVote> x in pollVotes)
            {
                string toAdd = (anony == EAnony.personal ? "\n\u200E<b>" + HtmlSpecialChars.Encode(x.Value.Name.Replace("\u200F", "").Replace("\u202B", "").Replace("\u202E", "").Truncate(25)) + ": </b>" : "\n\ud83d\udc64 ") + HtmlSpecialChars.Encode(x.Value.Text) + "\n";
                if (text.Length + toAdd.Length <= 4000)
                {
                    text += toAdd;
                    inlineDescription += x.Value.Text + ", ";
                }
                else
                {
                    text += "\n▶️ <a href=\"https://telegram.me/" + Globals.GlobalOptions.Botname + "?start=" + Cryptography.Encrypt("pag:" + chatId + ":" + pollId + ":0") + "\">" + strings.GetString(Strings.StringsList.boardShowMore) + "</a>\n";
                    break;
                }
            }
            if (delete || closed)
            {
                inlineKeyboard = null;
            }
            inlineDescription = inlineDescription.Substring(0, inlineDescription.Length - 2);
            text += "\n" + string.Format(strings.GetString(pollVotes.Count == 0 ? Strings.StringsList.rendererZeroVotedSoFar : (pollVotes.Count == 1 ? Strings.StringsList.rendererSingleVotedSoFar : Strings.StringsList.rendererMultiVotedSoFar)), pollVotes.Count);
            if (closed)
            {
                text += "\n" + strings.GetString(Strings.StringsList.pollClosed);
            }

            /*} else {
             *      inlineDescription = "";
             *      if (offset < pollVotes.Count) {
             *              int difference = (int)offset - (pollVotes.Count - 1);
             *              text = "";
             *              for (int i = (int)offset; i < offset + 5; i++) {
             *                      try {
             *                              var x = pollVotes.ElementAt(i);
             *                              text += (anony == EAnony.personal ? "\u200E<b>" + HtmlSpecialChars.Encode(x.Value.Name.Replace("\u200F", "").Replace("\u202B", "").Replace("\u202E", "").Truncate(25)) + ": </b>" : "\ud83d\udc64 ") + HtmlSpecialChars.Encode(x.Value.Text) + "\n\n";
             *                      } catch (ArgumentOutOfRangeException){
             *                              break;
             *                      }
             *              }
             *              inlineKeyboard.InlineKeyboard.Add(new List<InlineKeyboardButton> {
             *                              InlineKeyboardButton.Create("<<", callbackData:"comm:pag:" + chatId + ":" + pollId + ":" + (offset - 5 >= 0 ? (offset - 5) : 0)),
             *                              InlineKeyboardButton.Create(">>", callbackData:"comm:pag:" + chatId + ":" + pollId + ":" + (offset + 5 < pollVotes.Count ? (offset + 5) : pollVotes.Count - 1))
             *                      });
             *              text += string.Format(strings.GetString(Strings.StringsList.boardPagBottomLine), (offset + 1), (pollVotes.Count - offset < 5 ? pollVotes.Count - (offset - 5) : (offset + 5)),pollVotes.Count);
             *      } else {
             *              text = strings.GetString(Strings.StringsList.boardPagCantFind);
             *      }
             * }*/
            strings.SetLanguage(oldLang);
            return(new ContentParts(text, inlineKeyboard, inlineTitle, inlineDescription));
        }
Ejemplo n.º 9
0
        protected override ContentParts GetContent(Strings strings, string apikey, bool channel = false, int?offset = null, bool moderatePane = true)
        {
            Strings.langs oldLang = strings.CurrentLang;
            strings.SetLanguage(lang);
            string text;
            InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup();

            inlineKeyboard.InlineKeyboard = new List <List <InlineKeyboardButton> >();
            string description = "";

            {
                int userCount           = 0;
                int optionCount         = 0;
                int percentageUserCount = 0;
                text = "\ud83d\udcca <b>" + HtmlSpecialChars.Encode(pollText).UnmarkupUsernames() + "</b>" + (!string.IsNullOrEmpty(pollDescription) ? ("\n" + HtmlSpecialChars.Encode(pollDescription) + "\n") : "\n");
                Dictionary <string, List <User> > newVotes;
                if (this.Sorted)
                {
                    newVotes = pollVotes.CloneDictionary();
                    newVotes = newVotes.Sort();
                }
                else
                {
                    newVotes = pollVotes;
                }
                if (this.PercentageBar != PercentageBars.Bars.none)
                {
                    foreach (KeyValuePair <string, List <User> > x in pollVotes)
                    {
                        percentageUserCount += x.Value.Count;
                    }
                }
                bool descTooLong = false;
                foreach (KeyValuePair <string, List <User> > x in newVotes)
                {
                    int votingUserCount = x.Value.Count;
                    text += String.Format("\n<b>{0}</b> [{1}]\n", HtmlSpecialChars.Encode(x.Key).UnmarkupUsernames(), votingUserCount);
                    if (anony == EAnony.personal)
                    {
                        if (x.Value.Count > 0)
                        {
                            if (PercentageBar != PercentageBars.Bars.none)
                            {
                                text += PercentageBars.RenderPercentage((double)x.Value.Count / percentageUserCount, this.PercentageBar, true);
                            }
                            User last = x.Value.Last();
                            foreach (User user in x.Value)
                            {
                                text += "\u200E" + (user == last ? "└" : "├") + " " + HtmlSpecialChars.Encode((user.FirstName + (user.LastName != null ? " " + user.LastName : "")).Replace("\u200F", "").Replace("\u202B", "").Replace("\u202E", "").Truncate(25)) + "\n";
                                userCount++;
                            }
                        }
                        else
                        {
                            if (PercentageBar != PercentageBars.Bars.none)
                            {
                                text += PercentageBars.RenderPercentage((double)x.Value.Count / percentageUserCount, this.PercentageBar);
                            }
                        }
                    }
                    else
                    {
                        if (PercentageBar != PercentageBars.Bars.none)
                        {
                            text += PercentageBars.RenderPercentage((double)x.Value.Count / percentageUserCount, this.PercentageBar);
                        }
                        userCount += x.Value.Count;
                    }
                    string unsortedKey = pollVotes.Keys.ElementAt(optionCount);
                    if (!closed && !channel)
                    {
                        List <InlineKeyboardButton> thisRow = new List <InlineKeyboardButton>(1);
                        thisRow.Add((InlineKeyboardButton)InlineKeyboardButton.Create(unsortedKey + " - " + pollVotes.Values.ElementAt(optionCount).Count, callbackData: Cryptography.Encrypt(chatId + ":" + pollId + ":" + optionCount, apikey)));
                        inlineKeyboard.InlineKeyboard.Add(thisRow);
                    }
                    if (description.Length < 150)
                    {
                        description += unsortedKey.Truncate(15) + " | ";
                    }
                    else
                    {
                        descTooLong = true;
                    }
                    optionCount++;
                }
                if (descTooLong)
                {
                    description += " | ...";
                }
                description = "Personal vote - " + userCount + " participants\n" + description;
                if (!closed && channel)
                {
                    inlineKeyboard.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                        InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.buttonVote), url: "https://telegram.me/" + Globals.Botname + "bot?start=" + Cryptography.Encrypt("vote:" + ChatId + ":" + PollId, apikey))
                    });
                }
                if (!closed && Appendable)
                {
                    inlineKeyboard.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                        InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.buttonAppend), url: "https://telegram.me/" + Globals.Botname + "bot?start=" + Cryptography.Encrypt("append:" + ChatId + ":" + PollId, apikey))
                    });
                }
                if (delete)
                {
                    inlineKeyboard = null;
                }
                description = description.Substring(0, description.Length - 3);
                text       += "\n" + string.Format(strings.GetString(userCount == 0 ? Strings.stringsList.rendererZeroVotedSoFar : (userCount == 1 ? Strings.stringsList.rendererSingleVotedSoFar : Strings.stringsList.rendererMultiVotedSoFar)), userCount);
                if (closed)
                {
                    text += "\n" + strings.GetString(Strings.stringsList.pollClosed);
                }
            }
            strings.SetLanguage(oldLang);
            return(new ContentParts(text, inlineKeyboard, description));
        }
Ejemplo n.º 10
0
 public static InlineKeyboardMarkup GetTheModerationKeyboard(Strings strings, long chatID, int pollID)
 {
     return(GetOneButtonMarkup(InlineKeyboardButton.Create(strings.GetString(Strings.StringsList.moderate), callbackData: String.Format("comm:moderate:{0}:{1}", chatID, pollID))));
 }
Ejemplo n.º 11
0
 internal async Task UpdateWithOptionsPane(string apikey, Strings strings, int messageID, string text)
 {
     ContentParts content = GetContent(strings, apikey, noApproximation: true);
     await Api.EditMessageTextAsync(apikey, "<b>" + HtmlSpecialChars.Encode(strings.GetString(Strings.StringsList.optionsForPoll)) + "</b>\n\n" + content.Text, this.GenerateOptionsMarkup(strings), chatId, messageID);
 }
Ejemplo n.º 12
0
 public virtual string RenderExpansion(Strings strings)
 {
     return("<a href=\"" + "https://hamilton.wjclub.tk/" + Globals.GlobalOptions.Botname + "/" + Cryptography.Encrypt("lookup:" + this.ChatId + ":" + this.PollId, Globals.GlobalOptions.Apikey) + "\">\ud83c\udf0e " + strings.GetString(Strings.StringsList.viewInBrowserExpansion) + "</a>");
 }
Ejemplo n.º 13
0
 public virtual string RenderPeopleCount(Strings strings, int peopleCount, bool noApproximation)
 {
     return(string.Format(strings.GetString(peopleCount == 0 ? Strings.StringsList.rendererZeroVotedSoFar : (peopleCount == 1 ? Strings.StringsList.rendererSingleVotedSoFar : Strings.StringsList.rendererMultiVotedSoFar)), RenderNumberUpdateFriendly(peopleCount, noApproximation)));
 }
Ejemplo n.º 14
0
 public override string RenderOptionalInsert(Strings strings)
 {
     return("ℹ️ " + string.Format(strings.GetString(Strings.StringsList.limitedDoodleYouCanChooseSoMany), MaxVotes, pollVotes.Count) + "\n");
 }
Ejemplo n.º 15
0
        internal void UpdateWithOptionsPane(string apikey, Strings strings, int messageID, string text)
        {
            ContentParts content = GetContent(strings, apikey);

            Api.EditMessageText(apikey, "<b>" + HtmlSpecialChars.Encode(strings.GetString(Strings.stringsList.optionsForPoll)) + "</b>\n\n" + content.Text, this.GenerateOptionsMarkup(strings), chatId, messageID);
        }
Ejemplo n.º 16
0
        protected override ContentParts GetContent(Strings strings, string apikey, bool channel = false, int?offset = null, bool moderatePane = true)
        {
            Strings.langs oldLang = strings.CurrentLang;
            strings.SetLanguage(lang);
            string text;
            string description;
            InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup();

            inlineKeyboard.InlineKeyboard = new List <List <InlineKeyboardButton> >();
            if (offset == null)
            {
                if (!closed)
                {
                    inlineKeyboard.InlineKeyboard.Add(new List <InlineKeyboardButton>()
                    {
                        InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.buttonVote), url: "https://telegram.me/" + Globals.Botname + "bot?start=" + Cryptography.Encrypt("board:" + ChatId.ToString() + ":" + PollId.ToString(), apikey))
                    });
                }
                //inlineKeyboard.InlineKeyboard.Add(new List<InlineKeyboardButton>() { InlineKeyboardButton.Create(strings.GetString(Strings.stringsList.buttonVote), url: "https://telegram.me/" + Globals.Botname + "bot?start=" + "board:" + ChatId + ":" + PollId) });
                description = StringEdit.CurrentCulture.TextInfo.ToTitleCase(anony.ToString()) + " " + pollType + ": " + pollText + ": ";
                text        = "\ud83d\udcdd <b>" + HtmlSpecialChars.Encode(pollText).UnmarkupUsernames() + "</b>" + (!string.IsNullOrEmpty(pollDescription) ? ("\n" + HtmlSpecialChars.Encode(pollDescription) + "\n") : "\n");
                foreach (KeyValuePair <int, BoardVote> x in pollVotes)
                {
                    string toAdd = (anony == EAnony.personal ? "\n\u200E<b>" + HtmlSpecialChars.Encode(x.Value.Name.Replace("\u200F", "").Replace("\u202B", "").Replace("\u202E", "").Truncate(25)) + ": </b>" : "\n\ud83d\udc64 ") + HtmlSpecialChars.Encode(x.Value.Text) + "\n";
                    if (text.Length + toAdd.Length <= 4000)
                    {
                        text        += toAdd;
                        description += x.Value.Text + ", ";
                    }
                    else
                    {
                        text += "\n▶️ <a href=\"https://telegram.me/" + Globals.Botname + "bot?start=" + Cryptography.Encrypt("pag:" + chatId + ":" + pollId + ":0", apikey) + "\">" + strings.GetString(Strings.stringsList.boardShowMore) + "</a>\n";
                        break;
                    }
                }
                if (delete || closed)
                {
                    inlineKeyboard = null;
                }
                description = description.Substring(0, description.Length - 2);
                text       += "\n" + string.Format(strings.GetString(pollVotes.Count == 0 ? Strings.stringsList.rendererZeroVotedSoFar : (pollVotes.Count == 1 ? Strings.stringsList.rendererSingleVotedSoFar : Strings.stringsList.rendererMultiVotedSoFar)), pollVotes.Count);
                if (closed)
                {
                    text += "\n" + strings.GetString(Strings.stringsList.pollClosed);
                }
            }
            else
            {
                description = "";
                if (offset < pollVotes.Count)
                {
                    int difference = (int)offset - (pollVotes.Count - 1);
                    text = "";
                    for (int i = (int)offset; i < offset + 5; i++)
                    {
                        try {
                            var x = pollVotes.ElementAt(i);
                            text += (anony == EAnony.personal ? "\u200E<b>" + HtmlSpecialChars.Encode(x.Value.Name.Replace("\u200F", "").Replace("\u202B", "").Replace("\u202E", "").Truncate(25)) + ": </b>" : "\ud83d\udc64 ") + HtmlSpecialChars.Encode(x.Value.Text) + "\n\n";
                        } catch (ArgumentOutOfRangeException) {
                            break;
                        }
                    }
                    inlineKeyboard.InlineKeyboard.Add(new List <InlineKeyboardButton> {
                        InlineKeyboardButton.Create("<<", callbackData: "comm:pag:" + chatId + ":" + pollId + ":" + (offset - 5 >= 0 ? (offset - 5) : 0)),
                        InlineKeyboardButton.Create(">>", callbackData: "comm:pag:" + chatId + ":" + pollId + ":" + (offset + 5 < pollVotes.Count ? (offset + 5) : pollVotes.Count - 1))
                    });
                    text += string.Format(strings.GetString(Strings.stringsList.boardPagBottomLine), (offset + 1), (pollVotes.Count - offset < 5 ? pollVotes.Count - (offset - 5) : (offset + 5)), pollVotes.Count);
                }
                else
                {
                    text = strings.GetString(Strings.stringsList.boardPagCantFind);
                }
            }
            strings.SetLanguage(oldLang);
            return(new ContentParts(text, inlineKeyboard, description));
        }