2019-09-20 22:32:52 +02:00
//META{"name":"SendLargeMessages","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/SendLargeMessages","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/SendLargeMessages/SendLargeMessages.plugin.js"}*//
2018-10-11 10:21:26 +02:00
class SendLargeMessages {
2019-01-17 23:48:29 +01:00
getName ( ) { return "SendLargeMessages" ; }
2019-12-28 17:39:14 +01:00
getVersion ( ) { return "1.6.0" ; }
2019-01-17 23:48:29 +01:00
getAuthor ( ) { return "DevilBro" ; }
getDescription ( ) { return "Opens a popout when your message is too large, which allows you to automatically send the message in several smaller messages." ; }
2019-01-26 22:45:19 +01:00
2019-09-04 12:34:02 +02:00
constructor ( ) {
2019-02-28 20:09:44 +01:00
this . changelog = {
2019-12-18 11:49:24 +01:00
"fixed" : [ [ "Switching" , "Plugin acting weird after switching channels" ] , [ "New WYSIWYG Textarea" , "Fixed for the new WYSIWYG Textarea that is hidden by experiments" ] ] ,
2019-12-28 17:39:14 +01:00
"improved" : [ [ "Message Amount" , "Hovering over the red character counter when the character limit exceeds 2000 characters will now again display the amount of messages that is being sent by the plugin" ] , [ "Sending Messages" , "The plugin no longer needs the modal to send multiple messages, you can just write larger messages in the channel textarea and it will automatically split it up before sending it" ] ]
2019-02-28 20:09:44 +01:00
} ;
2019-09-04 12:34:02 +02:00
2019-11-14 17:56:26 +01:00
this . patchedModules = {
2019-12-17 14:51:58 +01:00
before : {
2019-12-21 11:25:13 +01:00
ChannelTextAreaForm : "render" ,
ChannelEditorContainer : "render"
2019-12-28 17:39:14 +01:00
} ,
after : {
ChannelTextAreaContainer : "render" ,
2019-11-14 17:56:26 +01:00
}
2018-12-27 08:57:16 +01:00
} ;
2019-09-04 12:34:02 +02:00
}
2019-01-26 22:45:19 +01:00
2019-09-04 12:34:02 +02:00
initConstructor ( ) {
2018-10-11 10:21:26 +02:00
this . messageDelay = 1000 ; //changing at own risk, might result in bans or mutes
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
this . css = `
2019-01-24 13:37:08 +01:00
. $ { this . name } - modal textarea {
2019-11-11 11:11:33 +01:00
height : 50 vh ;
2018-10-11 10:21:26 +02:00
} ` ;
}
//legacy
load ( ) { }
start ( ) {
2019-02-04 09:13:15 +01:00
if ( ! global . BDFDB ) global . BDFDB = { myPlugins : { } } ;
if ( global . BDFDB && global . BDFDB . myPlugins && typeof global . BDFDB . myPlugins == "object" ) global . BDFDB . myPlugins [ this . getName ( ) ] = this ;
2019-05-26 13:55:26 +02:00
var libraryScript = document . querySelector ( 'head script#BDFDBLibraryScript' ) ;
if ( ! libraryScript || ( performance . now ( ) - libraryScript . getAttribute ( "date" ) ) > 600000 ) {
2018-10-11 10:21:26 +02:00
if ( libraryScript ) libraryScript . remove ( ) ;
libraryScript = document . createElement ( "script" ) ;
2019-05-26 13:55:26 +02:00
libraryScript . setAttribute ( "id" , "BDFDBLibraryScript" ) ;
2018-10-11 10:21:26 +02:00
libraryScript . setAttribute ( "type" , "text/javascript" ) ;
2019-10-18 10:56:41 +02:00
libraryScript . setAttribute ( "src" , "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.min.js" ) ;
2019-01-17 23:48:29 +01:00
libraryScript . setAttribute ( "date" , performance . now ( ) ) ;
2019-05-26 13:55:26 +02:00
libraryScript . addEventListener ( "load" , ( ) => { this . initialize ( ) ; } ) ;
2018-10-11 10:21:26 +02:00
document . head . appendChild ( libraryScript ) ;
2019-05-26 13:55:26 +02:00
}
else if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) this . initialize ( ) ;
2019-11-01 10:27:07 +01:00
this . startTimeout = setTimeout ( ( ) => {
try { return this . initialize ( ) ; }
catch ( err ) { console . error ( ` %c[ ${ this . getName ( ) } ]%c ` , "color: #3a71c1; font-weight: 700;" , "" , "Fatal Error: Could not initiate plugin! " + err ) ; }
} , 30000 ) ;
2018-10-11 10:21:26 +02:00
}
initialize ( ) {
2019-01-17 23:48:29 +01:00
if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) {
2019-01-22 11:05:54 +01:00
if ( this . started ) return ;
2019-10-22 18:55:25 +02:00
BDFDB . PluginUtils . init ( this ) ;
2019-11-11 11:11:33 +01:00
2019-10-22 18:55:25 +02:00
BDFDB . ModuleUtils . forceAllUpdates ( this ) ;
2018-10-11 10:21:26 +02:00
}
2019-11-01 10:14:50 +01:00
else console . error ( ` %c[ ${ this . getName ( ) } ]%c ` , "color: #3a71c1; font-weight: 700;" , "" , "Fatal Error: Could not load BD functions!" ) ;
2018-10-11 10:21:26 +02:00
}
stop ( ) {
2019-01-26 22:45:19 +01:00
if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) {
2019-10-22 11:37:23 +02:00
this . stopping = true ;
2019-11-11 11:11:33 +01:00
BDFDB . ModuleUtils . forceAllUpdates ( this ) ;
2019-10-22 18:55:25 +02:00
BDFDB . PluginUtils . clear ( this ) ;
2018-10-11 10:21:26 +02:00
}
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
// begin of own functions
2019-12-21 11:25:13 +01:00
processChannelTextAreaForm ( e ) {
if ( ! BDFDB . ModuleUtils . isPatched ( this , e . instance , "handleSendMessage" ) ) BDFDB . ModuleUtils . patch ( this , e . instance , "handleSendMessage" , { instead : e2 => {
let parsedLength = BDFDB . StringUtils . getParsedLength ( e2 . methodArguments [ 0 ] ) ;
if ( parsedLength > 2000 ) {
e2 . stopOriginalMethodCall ( ) ;
let messages = this . formatText ( e2 . methodArguments [ 0 ] , Math . sqrt ( Math . pow ( parsedLength - e2 . methodArguments [ 0 ] . length , 2 ) ) > Math . max ( parsedLength , e2 . methodArguments [ 0 ] . length ) / 20 ) ;
messages . filter ( n => n ) . forEach ( ( message , i ) => {
BDFDB . TimeUtils . timeout ( _ => {
e2 . originalMethod ( message ) ;
if ( i >= messages . length - 1 ) BDFDB . NotificationUtils . toast ( this . labels . toast _allsent _text , { type : "success" } ) ;
} , this . messageDelay * i ) ;
} ) ;
return Promise . resolve ( {
shouldClear : true ,
shouldRefocus : true
} ) ;
}
else return e2 . callOriginalMethodAfterwards ( ) ;
} } , true ) ;
}
2019-12-28 17:39:14 +01:00
processChannelTextAreaContainer ( e ) {
if ( e . returnvalue . ref && e . returnvalue . ref . current && BDFDB . DOMUtils . getParent ( BDFDB . dotCN . chatform , e . returnvalue . ref . current ) ) {
let [ children , index ] = BDFDB . ReactUtils . findChildren ( e . returnvalue , { name : "SlateCharacterCount" } ) ;
if ( index > - 1 ) {
let text = BDFDB . LibraryModules . SlateSelectionUtils . serialize ( children [ index ] . props . document ) ;
if ( text . length > 1000 ) {
let parsedLength = BDFDB . StringUtils . getParsedLength ( text ) ;
if ( parsedLength > 2000 ) children [ index ] = BDFDB . ReactUtils . createElement ( "div" , {
className : BDFDB . disCNS . textareacharcounter + BDFDB . disCN . textareacharcountererror ,
children : BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . TooltipContainer , {
text : Math . ceil ( parsedLength / 1900 ) + " " + BDFDB . LanguageUtils . LanguageStrings . MESSAGES ,
children : BDFDB . ReactUtils . createElement ( "span" , {
children : 2000 - parsedLength
} )
} )
} ) ;
}
}
}
} BDFDB . DataUtils . get ( this , "settings" , "changeInAutoComplete" )
2019-12-21 11:25:13 +01:00
processChannelEditorContainer ( e ) {
if ( e . instance . props . type && e . instance . props . type == BDFDB . DiscordConstants . TextareaTypes . NORMAL ) e . instance . props . shouldUploadLongMessages = false ;
2018-10-11 10:21:26 +02:00
}
2019-01-26 22:45:19 +01:00
2019-12-17 14:51:58 +01:00
formatText ( text , parse ) {
2019-06-20 10:07:17 +02:00
text = text . replace ( /\t/g , " " ) ;
2018-12-27 08:57:16 +01:00
let longwords = text . match ( /[\S]{1800,}/gm ) ;
2019-12-17 14:51:58 +01:00
if ( longwords ) for ( let longword of longwords ) {
2018-10-11 10:21:26 +02:00
let count1 = 0 ;
let shortwords = [ ] ;
2019-12-17 14:51:58 +01:00
longword . split ( "" ) . forEach ( c => {
if ( shortwords [ count1 ] && shortwords [ count1 ] . length >= 1800 ) count1 ++ ;
shortwords [ count1 ] = shortwords [ count1 ] ? shortwords [ count1 ] + c : c ;
2018-10-11 10:21:26 +02:00
} ) ;
text = text . replace ( longword , shortwords . join ( " " ) ) ;
}
2018-12-27 08:57:16 +01:00
let messages = [ ] ;
let count2 = 0 ;
2018-10-11 10:21:26 +02:00
text . split ( " " ) . forEach ( ( word ) => {
2019-12-17 14:51:58 +01:00
if ( messages [ count2 ] && ( parse ? BDFDB . StringUtils . getParsedLength ( messages [ count2 ] + "" + word ) : ( messages [ count2 ] + "" + word ) . length ) > 1900 ) count2 ++ ;
2018-10-11 10:21:26 +02:00
messages [ count2 ] = messages [ count2 ] ? messages [ count2 ] + " " + word : word ;
} ) ;
2019-01-26 22:45:19 +01:00
2018-12-27 08:57:16 +01:00
let insertCodeBlock = null , insertCodeLine = null ;
for ( let j = 0 ; j < messages . length ; j ++ ) {
2018-10-11 10:21:26 +02:00
if ( insertCodeBlock ) {
messages [ j ] = insertCodeBlock + messages [ j ] ;
insertCodeBlock = null ;
}
else if ( insertCodeLine ) {
messages [ j ] = insertCodeLine + messages [ j ] ;
insertCodeLine = null ;
}
2019-01-26 22:45:19 +01:00
2018-12-27 08:57:16 +01:00
let codeBlocks = messages [ j ] . match ( /`{3,}[\S]*\n|`{3,}/gm ) ;
let codeLines = messages [ j ] . match ( /[^`]{0,1}`{1,2}[^`]|[^`]`{1,2}[^`]{0,1}/gm ) ;
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
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 ;
}
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
return messages ;
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
setLabelsByLanguage ( ) {
2019-10-22 19:38:25 +02:00
switch ( BDFDB . LanguageUtils . getLanguage ( ) . id ) {
2018-10-11 10:21:26 +02:00
case "hr" : //croatian
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Sve veliku poslane."
2018-10-11 10:21:26 +02:00
} ;
case "da" : //danish
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Alle beskeder sendes."
2018-10-11 10:21:26 +02:00
} ;
case "de" : //german
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Alle Nachrichten versendet."
2018-10-11 10:21:26 +02:00
} ;
case "es" : //spanish
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Todos los mensajes enviados."
2018-10-11 10:21:26 +02:00
} ;
case "fr" : //french
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Tous les messages envoyés"
2018-10-11 10:21:26 +02:00
} ;
case "it" : //italian
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Tutti i messaggi inviati."
2018-10-11 10:21:26 +02:00
} ;
case "nl" : //dutch
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Alle berichten verzonden."
2018-10-11 10:21:26 +02:00
} ;
case "no" : //norwegian
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Alle meldinger sendt."
2018-10-11 10:21:26 +02:00
} ;
case "pl" : //polish
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Wszystkie wiadomości zostały wysłane."
2018-10-11 10:21:26 +02:00
} ;
case "pt-BR" : //portuguese (brazil)
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Todas as mensagens enviadas."
2018-10-11 10:21:26 +02:00
} ;
case "fi" : //finnish
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Kaikki lähetetyt viestit."
2018-10-11 10:21:26 +02:00
} ;
case "sv" : //swedish
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Alla meddelanden skickade."
2018-10-11 10:21:26 +02:00
} ;
case "tr" : //turkish
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Tüm mesajlar gönderildi."
2018-10-11 10:21:26 +02:00
} ;
case "cs" : //czech
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Všechny zprávy byly odeslány."
2018-10-11 10:21:26 +02:00
} ;
case "bg" : //bulgarian
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "Всички изпратени съобщения."
2018-10-11 10:21:26 +02:00
} ;
case "ru" : //russian
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "В с е отправленные сообщения."
2018-10-11 10:21:26 +02:00
} ;
case "uk" : //ukrainian
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "В с і повідомлення надіслано."
2018-10-11 10:21:26 +02:00
} ;
case "ja" : //japanese
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "すべてのメッセージが送信されました。"
2018-10-11 10:21:26 +02:00
} ;
case "zh-TW" : //chinese (traditional)
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "發送的所有消息。"
2018-10-11 10:21:26 +02:00
} ;
case "ko" : //korean
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "모든 메시지가 전송되었습니다."
2018-10-11 10:21:26 +02:00
} ;
default : //default: english
return {
2019-12-28 17:39:14 +01:00
toast _allsent _text : "All messages sent."
2018-10-11 10:21:26 +02:00
} ;
}
}
}