2020-02-27 08:44:03 +01:00
//META{"name":"CustomQuoter","authorId":"278543574059057154","invite":"Jx3TjNS","donate":"https://www.paypal.me/MircoWittrien","patreon":"https://www.patreon.com/MircoWittrien","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/CustomQuoter","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/CustomQuoter/CustomQuoter.plugin.js"}*//
2020-02-23 18:55:20 +01:00
var CustomQuoter = ( _ => {
2020-02-23 19:40:36 +01:00
const PreviewMessage = class PreviewMessage extends BdApi . React . Component {
render ( ) {
let spoofChannel = new BDFDB . DiscordObjects . Channel ( {
id : "126223823845647771" ,
2020-02-23 20:29:09 +01:00
guild _id : "850725684241078788" ,
2020-02-23 19:40:36 +01:00
name : "Test Channel"
} ) ;
let spoofQuotedMessage = new BDFDB . DiscordObjects . Message ( {
2020-03-05 20:37:34 +01:00
id : "562432230424221059" ,
2020-02-23 19:40:36 +01:00
author : new BDFDB . DiscordObjects . User ( {
id : "230422432565221049" ,
username : "Quoted User"
} ) ,
channel _id : spoofChannel . id ,
content : "This is a test message\nto showcase what the quote would look like"
} ) ;
let spoofMessage = new BDFDB . DiscordObjects . Message ( {
author : new BDFDB . DiscordObjects . User ( {
id : "222242304256531049" ,
username : "Test User"
} ) ,
channel _id : spoofChannel . id ,
content : this . props . plugin . parseQuote ( spoofQuotedMessage , spoofChannel )
} ) ;
return BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . MessageGroup , {
className : BDFDB . disCNS . message + BDFDB . disCN . messagecozymessage ,
message : spoofMessage ,
channel : spoofChannel
} ) ;
}
} ;
2020-02-23 18:55:20 +01:00
return class CustomQuoter {
getName ( ) { return "CustomQuoter" ; }
2020-03-23 18:19:39 +01:00
getVersion ( ) { return "1.0.7" ; }
2020-02-23 18:55:20 +01:00
getAuthor ( ) { return "DevilBro" ; }
2020-02-23 19:40:36 +01:00
getDescription ( ) { return "Let's you customize the output of the native quote feature of Discord" ; }
2020-02-23 18:55:20 +01:00
2020-02-23 19:40:36 +01:00
constructor ( ) {
this . changelog = {
2020-03-23 18:19:39 +01:00
"improved" : [ [ "Placeholders" , "$authorName will now use the server nickname of a user if one is set, $authorAccount was added which gets replaced by ACCOUNTNAME#DISCRIMINATOR (User#1234)" ] ] ,
"fixed" : [ [ "$authorAccount" , "$authorAccount works properly now" ] ]
2020-02-23 19:40:36 +01:00
} ;
}
2020-02-23 18:55:20 +01:00
initConstructor ( ) {
this . defaults = {
settings : {
ignoreMentionInDM : { value : true , description : "Do not add a mention in DM channels" } ,
forceZeros : { value : false , description : "Force leading Zeros" }
} ,
formats : {
customQuote : { value : "$quote $mention" , description : "Custom Format:" }
}
} ;
}
getSettingsPanel ( collapseStates = { } ) {
if ( ! window . BDFDB || typeof BDFDB != "object" || ! BDFDB . loaded || ! this . started ) return ;
let settings = BDFDB . DataUtils . get ( this , "settings" ) ;
let formats = BDFDB . DataUtils . get ( this , "formats" ) ;
2020-03-28 07:55:39 +01:00
let settingsPanel , settingsItems = [ ] , innerItems = [ ] ;
2020-02-23 18:55:20 +01:00
2020-03-28 07:55:39 +01:00
for ( let key in settings ) innerItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsSaveItem , {
2020-02-23 18:55:20 +01:00
className : BDFDB . disCN . marginbottom8 ,
type : "Switch" ,
plugin : this ,
keys : [ "settings" , key ] ,
label : this . defaults . settings [ key ] . description ,
value : settings [ key ] ,
onChange : ( e , instance ) => {
BDFDB . ReactUtils . forceUpdate ( BDFDB . ReactUtils . findOwner ( BDFDB . ReactUtils . findOwner ( instance , { name : "BDFDB_SettingsPanel" , up : true } ) , { name : "BDFDB_Select" , all : true , noCopies : true } ) ) ;
}
} ) ) ;
2020-03-28 07:55:39 +01:00
settingsItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . CollapseContainer , {
2020-02-23 18:55:20 +01:00
title : "Settings" ,
collapseStates : collapseStates ,
2020-03-28 07:55:39 +01:00
children : innerItems
2020-02-23 18:55:20 +01:00
} ) ) ;
2020-03-28 07:55:39 +01:00
innerItems = [ ] ;
2020-02-23 18:55:20 +01:00
2020-03-28 07:55:39 +01:00
for ( let key in formats ) innerItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsSaveItem , {
2020-02-23 18:55:20 +01:00
className : BDFDB . disCN . marginbottom8 ,
type : "TextInput" ,
plugin : this ,
keys : [ "formats" , key ] ,
label : this . defaults . formats [ key ] . description ,
basis : "70%" ,
value : formats [ key ] ,
onChange : ( e , instance ) => {
2020-02-23 19:40:36 +01:00
BDFDB . ReactUtils . forceUpdate ( BDFDB . ReactUtils . findOwner ( instance . _reactInternalFiber . return , { key : "PREVIEW_MESSAGE" } ) ) ;
2020-02-23 18:55:20 +01:00
}
} ) ) ;
2020-03-28 07:55:39 +01:00
innerItems . push ( BDFDB . ReactUtils . createElement ( "div" , {
2020-02-23 19:40:36 +01:00
className : BDFDB . disCN . marginbottom8 ,
children : BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsLabel , {
label : "Preview:"
} )
} ) ) ;
2020-03-28 07:55:39 +01:00
innerItems . push ( BDFDB . ReactUtils . createElement ( PreviewMessage , {
2020-02-23 19:40:36 +01:00
plugin : this ,
key : "PREVIEW_MESSAGE" ,
} ) ) ;
2020-02-23 18:55:20 +01:00
2020-03-28 07:55:39 +01:00
settingsItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . CollapseContainer , {
2020-02-23 18:55:20 +01:00
title : "Format" ,
collapseStates : collapseStates ,
dividertop : true ,
2020-03-28 07:55:39 +01:00
children : innerItems
2020-02-23 18:55:20 +01:00
} ) ) ;
2020-03-28 07:55:39 +01:00
settingsItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . CollapseContainer , {
2020-02-23 18:55:20 +01:00
title : "Placeholder Guide" ,
collapseStates : collapseStates ,
dividertop : true ,
children : [
"$quote will be replaced with the quoted message content" ,
"$mention will be replaced with a mention of the message author" ,
2020-03-05 20:37:34 +01:00
"$link will be replaced with a discord direct link pointing to the message" ,
2020-02-23 18:55:20 +01:00
"$authorId will be replaced with the ID of the message author" ,
2020-03-21 10:23:14 +01:00
"$authorName will be replaced with the username of the message author" ,
"$authorAccount will be replaced with the accountname of the message author + discriminator" ,
2020-02-23 18:55:20 +01:00
"$channel will be replaced with a mention of the channel (ignored for DMs)" ,
"$channelId will be replaced with the ID of the channel" ,
"$channelName will be replaced with the Name of the channel" ,
"$serverId will be replaced with the ID of the server" ,
"$serverName will be replaced with the name of the server" ,
"$hour will be replaced with the quote hour" ,
"$minute will be replaced with the quote minutes" ,
"$second will be replaced with the quote seconds" ,
"$msecond will be replaced with the quote milliseconds" ,
"$timemode will change $hour to a 12h format and will be replaced with AM/PM" ,
"$year will be replaced with the quote year" ,
"$month will be replaced with the quote month" ,
"$day will be replaced with the quote day" ,
"$monthnameL will be replaced with the monthname in long format based on the Discord Language" ,
"$monthnameS will be replaced with the monthname in short format based on the Discord Language" ,
"$weekdayL will be replaced with the weekday in long format based on the Discord Language" ,
"$weekdayS will be replaced with the weekday in short format based on the Discord Language"
] . map ( string => BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . FormComponents . FormText , {
type : BDFDB . LibraryComponents . FormComponents . FormTextTypes . DESCRIPTION ,
children : string
} ) )
} ) ) ;
2020-03-28 07:55:39 +01:00
return settingsPanel = BDFDB . PluginUtils . createSettingsPanel ( this , settingsItems ) ;
2020-02-23 18:55:20 +01:00
}
//legacy
load ( ) { }
start ( ) {
if ( ! window . BDFDB ) window . BDFDB = { myPlugins : { } } ;
if ( window . BDFDB && window . BDFDB . myPlugins && typeof window . BDFDB . myPlugins == "object" ) window . BDFDB . myPlugins [ this . getName ( ) ] = this ;
let libraryScript = document . querySelector ( "head script#BDFDBLibraryScript" ) ;
if ( ! libraryScript || ( performance . now ( ) - libraryScript . getAttribute ( "date" ) ) > 600000 ) {
if ( libraryScript ) libraryScript . remove ( ) ;
libraryScript = document . createElement ( "script" ) ;
libraryScript . setAttribute ( "id" , "BDFDBLibraryScript" ) ;
libraryScript . setAttribute ( "type" , "text/javascript" ) ;
libraryScript . setAttribute ( "src" , "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.min.js" ) ;
libraryScript . setAttribute ( "date" , performance . now ( ) ) ;
libraryScript . addEventListener ( "load" , _ => { this . initialize ( ) ; } ) ;
document . head . appendChild ( libraryScript ) ;
}
else if ( window . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) this . initialize ( ) ;
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 ) ;
}
initialize ( ) {
if ( window . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) {
if ( this . started ) return ;
BDFDB . PluginUtils . init ( this ) ;
BDFDB . ModuleUtils . patch ( this , BDFDB . LibraryModules . QuoteUtils , "createQuotedText" , { instead : e => {
return this . parseQuote ( e . methodArguments [ 0 ] , e . methodArguments [ 1 ] ) ;
} } ) ;
}
else console . error ( ` %c[ ${ this . getName ( ) } ]%c ` , "color: #3a71c1; font-weight: 700;" , "" , "Fatal Error: Could not load BD functions!" ) ;
}
stop ( ) {
if ( window . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) {
this . stopping = true ;
BDFDB . PluginUtils . clear ( this ) ;
}
}
// begin of own functions
onSettingsClosed ( ) {
if ( this . SettingsUpdated ) {
delete this . SettingsUpdated ;
this . forceUpdateAll ( ) ;
}
}
parseQuote ( message , channel ) {
let settings = BDFDB . DataUtils . get ( this , "settings" ) ;
let customQuote = BDFDB . DataUtils . get ( this , "formats" , "customQuote" ) ;
let languageId = BDFDB . LanguageUtils . getLanguage ( ) . id ;
let timestamp = new Date ( message . editedTimestamp || message . timestamp ) ;
let hour = timestamp . getHours ( ) , minute = timestamp . getMinutes ( ) , second = timestamp . getSeconds ( ) , msecond = timestamp . getMilliseconds ( ) , day = timestamp . getDate ( ) , month = timestamp . getMonth ( ) + 1 , timemode = "" ;
if ( customQuote . indexOf ( "$timemode" ) > - 1 ) {
timemode = hour >= 12 ? "PM" : "AM" ;
hour = hour % 12 ;
hour = hour ? hour : 12 ;
}
let unquotedLines = message . content . split ( "\n" ) . filter ( line => ! line . startsWith ( "> " ) ) ;
unquotedLines = unquotedLines . slice ( unquotedLines . findIndex ( line => line . trim ( ) . length > 0 ) ) . join ( "\n" ) ;
2020-02-27 11:53:07 +01:00
let guild = channel . guild _id ? ( BDFDB . LibraryModules . GuildStore . getGuild ( channel . guild _id ) || { id : channel . guild _id , name : "Test Server" } ) : { id : BDFDB . DiscordConstants . ME , name : BDFDB . LanguageUtils . LanguageStrings . DIRECT _MESSAGES } ;
2020-02-23 18:55:20 +01:00
2020-03-21 10:23:14 +01:00
let member = BDFDB . LibraryModules . MemberStore . getMember ( guild && guild . id , message . author . id ) ;
2020-02-23 20:24:40 +01:00
return BDFDB . StringUtils . insertNRST ( customQuote )
2020-02-23 18:55:20 +01:00
. replace ( "$mention" , settings . ignoreMentionInDM && channel . isDM ( ) ? "" : ` <@! ${ message . author . id } > ` )
2020-03-05 20:37:34 +01:00
. replace ( "$link" , ` https://discordapp.com/channels/ ${ guild . id } / ${ channel . id } / ${ message . id } ` )
2020-03-21 10:23:14 +01:00
. replace ( "$authorName" , member && member . nick || message . author . username || "" )
2020-03-23 18:19:39 +01:00
. replace ( "$authorAccount" , ` ${ message . author . username } # ${ message . author . discriminator } ` )
2020-02-23 19:44:50 +01:00
. replace ( "$authorId" , message . author . id || "" )
2020-02-23 19:40:36 +01:00
. replace ( "$channelName" , channel . name || "" )
2020-02-23 19:44:50 +01:00
. replace ( "$channelId" , channel . id || "" )
. replace ( "$channel" , channel . isDM ( ) ? "" : ` <# ${ channel . id } > ` )
2020-02-23 19:40:36 +01:00
. replace ( "$serverId" , guild . id || "" )
. replace ( "$serverName" , guild . name || "" )
2020-02-23 18:55:20 +01:00
. replace ( "$hour" , settings . forceZeros && hour < 10 ? "0" + hour : hour )
. replace ( "$minute" , minute < 10 ? "0" + minute : minute )
. replace ( "$second" , second < 10 ? "0" + second : second )
. replace ( "$msecond" , settings . forceZeros ? ( msecond < 10 ? "00" + msecond : ( msecond < 100 ? "0" + msecond : msecond ) ) : msecond )
. replace ( "$timemode" , timemode )
. replace ( "$weekdayL" , timestamp . toLocaleDateString ( languageId , { weekday : "long" } ) )
. replace ( "$weekdayS" , timestamp . toLocaleDateString ( languageId , { weekday : "short" } ) )
. replace ( "$monthnameL" , timestamp . toLocaleDateString ( languageId , { month : "long" } ) )
. replace ( "$monthnameS" , timestamp . toLocaleDateString ( languageId , { month : "short" } ) )
. replace ( "$day" , settings . forceZeros && day < 10 ? "0" + day : day )
. replace ( "$month" , settings . forceZeros && month < 10 ? "0" + month : month )
. replace ( "$year" , timestamp . getFullYear ( ) )
2020-02-23 19:44:50 +01:00
. replace ( "$quote" , unquotedLines . split ( "\n" ) . map ( line => "> " + line + "\n" ) . join ( "" ) || "" )
2020-02-23 20:24:40 +01:00
. split ( " " ) . filter ( n => n ) . join ( " " ) ;
2020-02-23 18:55:20 +01:00
}
addLeadingZeros ( timestring ) {
let chararray = timestring . split ( "" ) ;
let numreg = /[0-9]/ ;
for ( let i = 0 ; i < chararray . length ; i ++ ) if ( ! numreg . test ( chararray [ i - 1 ] ) && numreg . test ( chararray [ i ] ) && ! numreg . test ( chararray [ i + 1 ] ) ) chararray [ i ] = "0" + chararray [ i ] ;
return chararray . join ( "" ) ;
}
forceUpdateAll ( ) {
BDFDB . ModuleUtils . forceAllUpdates ( this ) ;
BDFDB . MessageUtils . rerenderAll ( ) ;
}
}
} ) ( ) ;