//META{"name":"SendLargeMessages"}*// class SendLargeMessages { initConstructor () { this.labels = {}; this.patchModules = { "ChannelTextArea":"componentDidMount" }; this.messageDelay = 1000; //changing at own risk, might result in bans or mutes this.css = ` .${this.getName()}-modal textarea { rows: 0; cols: 0; height: 100vw; resize: none; } .${this.getName()}-modal #warning-message { color: red; } .${this.getName()}-modal #character-counter { float: right; color: white; opacity: .5; }`; this.sendMessageModalMarkup = `

REPLACE_modal_header_text

`; } getName () {return "SendLargeMessages";} getDescription () {return "Opens a popout when your message is too large, which allows you to automatically send the message in several smaller messages.";} getVersion () {return "1.5.1";} getAuthor () {return "DevilBro";} //legacy load () {} start () { var libraryScript = null; if (typeof BDFDB !== "object" || typeof BDFDB.isLibraryOutdated !== "function" || BDFDB.isLibraryOutdated()) { libraryScript = document.querySelector('head script[src="https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"]'); if (libraryScript) libraryScript.remove(); libraryScript = document.createElement("script"); libraryScript.setAttribute("type", "text/javascript"); libraryScript.setAttribute("src", "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"); document.head.appendChild(libraryScript); } this.startTimeout = setTimeout(() => {this.initialize();}, 30000); if (typeof BDFDB === "object" && typeof BDFDB.isLibraryOutdated === "function") this.initialize(); else libraryScript.addEventListener("load", () => {this.initialize();}); } initialize () { if (typeof BDFDB === "object") { BDFDB.loadMessage(this); this.clipboard = require("electron").clipboard; BDFDB.WebModules.forceAllUpdates(this); } else { console.error(this.getName() + ": Fatal Error: Could not load BD functions!"); } } stop () { if (typeof BDFDB === "object") { BDFDB.unloadMessage(this); } } // begin of own functions changeLanguageStrings () { this.sendMessageModalMarkup = this.sendMessageModalMarkup.replace("REPLACE_modal_header_text", this.labels.modal_header_text); this.sendMessageModalMarkup = this.sendMessageModalMarkup.replace("REPLACE_btn_cancel_text", this.labels.btn_cancel_text); this.sendMessageModalMarkup = this.sendMessageModalMarkup.replace("REPLACE_btn_send_text", this.labels.btn_send_text); } processChannelTextArea (instance, wrapper) { if (instance.props && instance.props.type && instance.props.type == "normal") { let textarea = wrapper.querySelector("textarea"); if (textarea) { let modaltext, checkTextarea = () => { if (BDFDB.getParsedLength(textarea.value) > 1950) { textarea.selectionStart = 0; textarea.selectionEnd = textarea.value.length; document.execCommand("insertText", false, ""); this.showSendModal(modaltext); } }; $(textarea) .off("input." + this.getName()) .on("input." + this.getName(), e => { clearTimeout(textarea.sendlargemessagestimeout); textarea.sendlargemessagestimeout = setTimeout(() => { modaltext = textarea.value; checkTextarea(); },100); }) .off("paste." + this.getName()) .on("paste." + this.getName(), e => { modaltext = textarea.value.slice(0, textarea.selectionStart) + this.clipboard.readText() + textarea.value.slice(textarea.selectionEnd); setImmediate(() => {checkTextarea(textarea);}); }); } } } showSendModal (text) { let sendMessageModal = $(this.sendMessageModalMarkup); let textinput = sendMessageModal.find("#modal-inputtext"); let warning = sendMessageModal.find("#warning-message"); let counter = sendMessageModal.find("#character-counter"); let updateCounter = () => { let parsedlength = BDFDB.getParsedLength(textinput.val()); let messageAmount = Math.ceil(parsedlength/1900); warning.text(messageAmount > 15 ? this.labels.modal_messages_warning : ""); counter.text(parsedlength + " (" + (textinput[0].selectionEnd - textinput[0].selectionStart) + ") => " + this.labels.modal_messages_translation + ": " + messageAmount); }; BDFDB.appendModal(sendMessageModal); sendMessageModal .on("click", ".btn-send", (e) => { e.preventDefault(); let messages = this.formatText(textinput.val()); messages.forEach((message,i) => { setTimeout(() => { this.sendMessage(message); if (i >= messages.length-1) BDFDB.showToast(this.labels.toast_allsent_text, {type:"success"}); },this.messageDelay * i); }); }); textinput .val(text) .focus() .off("keydown." + this.getName() + " click." + this.getName()) .on("keydown." + this.getName() + " click." + this.getName(), () => { setTimeout(() => { updateCounter(); },10); }) .off("mousedown." + this.getName()) .on("mousedown." + this.getName(), () => { $(document) .off("mouseup." + this.getName()) .on("mouseup." + this.getName(), () => { $(document) .off("mouseup." + this.getName()) .off("mousemove." + this.getName()); }) .off("mousemove." + this.getName()) .on("mousemove." + this.getName(), () => { setTimeout(() => { updateCounter(); },10); }); }); updateCounter(); } formatText (text) { text = text.replace(new RegExp("\t", 'g'), " "); let longwords = text.match(/[\S]{1800,}/gm); for (let i in longwords) { let longword = longwords[i]; let count1 = 0; let shortwords = []; longword.split("").forEach((char) => { if (shortwords[count1] && BDFDB.getParsedLength(shortwords[count1]) >= 1800) count1++; shortwords[count1] = shortwords[count1] ? shortwords[count1] + char : char; }); text = text.replace(longword, shortwords.join(" ")); } let messages = []; let count2 = 0; text.split(" ").forEach((word) => { if (messages[count2] && BDFDB.getParsedLength(messages[count2] + "" + word) > 1900) count2++; messages[count2] = messages[count2] ? messages[count2] + " " + word : word; }); let insertCodeBlock = null, insertCodeLine = null; for (let j = 0; j < messages.length; j++) { if (insertCodeBlock) { messages[j] = insertCodeBlock + messages[j]; insertCodeBlock = null; } else if (insertCodeLine) { messages[j] = insertCodeLine + messages[j]; insertCodeLine = null; } let codeBlocks = messages[j].match(/`{3,}[\S]*\n|`{3,}/gm); let codeLines = messages[j].match(/[^`]{0,1}`{1,2}[^`]|[^`]`{1,2}[^`]{0,1}/gm); if (codeBlocks && codeBlocks.length % 2 == 1) { messages[j] = messages[j] + "```"; insertCodeBlock = codeBlocks[codeBlocks.length-1] + "\n"; } else if (codeLines && codeLines.length % 2 == 1) { insertCodeLine = codeLines[codeLines.length-1].replace(/[^`]/g, ""); messages[j] = messages[j] + insertCodeLine; } } return messages; } sendMessage (text) { let textarea = document.querySelector(BDFDB.dotCNS.textareawrapchat + "textarea"); if (textarea) { let instance = BDFDB.getOwnerInstance({"node":textarea.parentElement, "name":"ChannelTextAreaForm", "up":true}); if (instance) { instance.setState({textValue:text}); BDFDB.triggerSend(textarea); } } } setLabelsByLanguage () { switch (BDFDB.getDiscordLanguage().id) { case "hr": //croatian return { toast_allsent_text: "Sve veliku poslane.", modal_messages_translation: "Vijesti", modal_messages_warning: "Nemojte slati previše veliku!", modal_header_text: "Pošalji veliku poruku:", btn_cancel_text: "Prekid", btn_send_text: "Poslati" }; case "da": //danish return { toast_allsent_text: "Alle beskeder sendes.", modal_messages_translation: "Beskeder", modal_messages_warning: "Send ikke for mange beskeder!", modal_header_text: "Send stor besked:", btn_cancel_text: "Afbryde", btn_send_text: "Sende" }; case "de": //german return { toast_allsent_text: "Alle Nachrichten versendet.", modal_messages_translation: "Nachrichten", modal_messages_warning: "Schicke nicht zu viele Nachrichten!", modal_header_text: "Große Nachricht senden:", btn_cancel_text: "Abbrechen", btn_send_text: "Senden" }; case "es": //spanish return { toast_allsent_text: "Todos los mensajes enviados.", modal_messages_translation: "Mensajes", modal_messages_warning: "¡No envíe demasiados mensajes!", modal_header_text: "Enviar mensaje grande:", btn_cancel_text: "Cancelar", btn_send_text: "Enviar" }; case "fr": //french return { toast_allsent_text: "Tous les messages envoyés", modal_messages_translation: "Messages", modal_messages_warning: "N'envoyez pas trop de messages!", modal_header_text: "Envoyer un gros message:", btn_cancel_text: "Abandonner", btn_send_text: "Envoyer" }; case "it": //italian return { toast_allsent_text: "Tutti i messaggi inviati.", modal_messages_translation: "Messaggi", modal_messages_warning: "Non inviare troppi messaggi!", modal_header_text: "Invia grande messaggio:", btn_cancel_text: "Cancellare", btn_send_text: "Inviare" }; case "nl": //dutch return { toast_allsent_text: "Alle berichten verzonden.", modal_messages_translation: "Berichten", modal_messages_warning: "Stuur niet te veel berichten!", modal_header_text: "Stuur een groot bericht:", btn_cancel_text: "Afbreken", btn_send_text: "Sturen" }; case "no": //norwegian return { toast_allsent_text: "Alle meldinger sendt.", modal_messages_translation: "Meldinger", modal_messages_warning: "Ikke send for mange meldinger!", modal_header_text: "Send stor melding:", btn_cancel_text: "Avbryte", btn_send_text: "Sende" }; case "pl": //polish return { toast_allsent_text: "Wszystkie wiadomości zostały wysłane.", modal_messages_translation: "Wiadomości", modal_messages_warning: "Nie wysyłaj zbyt wielu wiadomości!", modal_header_text: "Wyślij dużą wiadomość:", btn_cancel_text: "Anuluj", btn_send_text: "Wyślij" }; case "pt-BR": //portuguese (brazil) return { toast_allsent_text: "Todas as mensagens enviadas.", modal_messages_translation: "Mensagens", modal_messages_warning: "Não envie muitas mensagens!", modal_header_text: "Enviar mensagem grande:", btn_cancel_text: "Cancelar", btn_send_text: "Enviar" }; case "fi": //finnish return { toast_allsent_text: "Kaikki lähetetyt viestit.", modal_messages_translation: "Viestien", modal_messages_warning: "Älä lähetä liian monta viestiä!", modal_header_text: "Lähetä suuri viesti:", btn_cancel_text: "Peruuttaa", btn_send_text: "Lähettää" }; case "sv": //swedish return { toast_allsent_text: "Alla meddelanden skickade.", modal_messages_translation: "Meddelanden", modal_messages_warning: "Skicka inte för många meddelanden!", modal_header_text: "Skicka stort meddelande:", btn_cancel_text: "Avbryta", btn_send_text: "Skicka" }; case "tr": //turkish return { toast_allsent_text: "Tüm mesajlar gönderildi.", modal_messages_translation: "Mesajları", modal_messages_warning: "Çok fazla mesaj göndermeyin!", modal_header_text: "Büyük mesaj gönder:", btn_cancel_text: "Iptal", btn_send_text: "Göndermek" }; case "cs": //czech return { toast_allsent_text: "Všechny zprávy byly odeslány.", modal_messages_translation: "Zpráv", modal_messages_warning: "Neposílejte příliš mnoho zpráv!", modal_header_text: "Odeslat velkou zprávu:", btn_cancel_text: "Zrušení", btn_send_text: "Poslat" }; case "bg": //bulgarian return { toast_allsent_text: "Всички изпратени съобщения.", modal_messages_translation: "Съобщения", modal_messages_warning: "Не изпращайте твърде много съобщения!", modal_header_text: "Изпратете голямо съобщение:", btn_cancel_text: "Зъбести", btn_send_text: "изпращам" }; case "ru": //russian return { toast_allsent_text: "Все отправленные сообщения.", modal_messages_translation: "Сообщения", modal_messages_warning: "Не отправляйте слишком много сообщений!", modal_header_text: "Отправить сообщение:", btn_cancel_text: "Отмена", btn_send_text: "Послать" }; case "uk": //ukrainian return { toast_allsent_text: "Всі повідомлення надіслано.", modal_messages_translation: "Повідомлення", modal_messages_warning: "Не надсилайте надто багато повідомлень!", modal_header_text: "Надіслати велике повідомлення:", btn_cancel_text: "Скасувати", btn_send_text: "Відправити" }; case "ja": //japanese return { toast_allsent_text: "すべてのメッセージが送信されました。", modal_messages_translation: "メッセージ", modal_messages_warning: "あまりにも多くのメッセージを送信しないでください!", modal_header_text: "大きなメッセージを送信する:", btn_cancel_text: "キャンセル", btn_send_text: "送信" }; case "zh-TW": //chinese (traditional) return { toast_allsent_text: "發送的所有消息。", modal_messages_translation: "消息", modal_messages_warning: "不要發送太多信息!", modal_header_text: "發送大信息:", btn_cancel_text: "取消", btn_send_text: "發送" }; case "ko": //korean return { toast_allsent_text: "모든 메시지가 전송되었습니다.", modal_messages_translation: "메시지", modal_messages_warning: "너무 많은 메시지를 보내지 마십시오!", modal_header_text: "큰 메시지 보내기:", btn_cancel_text: "취소", btn_send_text: "보내다" }; default: //default: english return { toast_allsent_text: "All messages sent.", modal_messages_translation: "Messages", modal_messages_warning: "Do not send too many messages!", modal_header_text: "Send large message:", btn_cancel_text: "Cancel", btn_send_text: "Send" }; } } }