2019-01-31 17:06:48 +01:00
//META{"name":"CompleteTimestamps","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/CompleteTimestamps","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/CompleteTimestamps/CompleteTimestamps.plugin.js"}*//
2018-10-11 10:21:26 +02:00
class CompleteTimestamps {
2019-01-17 23:48:29 +01:00
getName ( ) { return "CompleteTimestamps" ; }
2019-04-07 21:33:13 +02:00
getVersion ( ) { return "1.3.2" ; }
2019-01-17 23:48:29 +01:00
getAuthor ( ) { return "DevilBro" ; }
getDescription ( ) { return "Replace all timestamps with complete timestamps." ; }
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
initConstructor ( ) {
2019-02-03 18:03:02 +01:00
this . changelog = {
2019-04-07 21:33:13 +02:00
"added" : [ [ "Embed Timestamp" , "Added the option to also change timestamps in embed timestamps (for Example Quotes)" ] ]
2019-02-03 18:03:02 +01:00
} ;
2019-01-17 23:48:29 +01:00
this . patchModules = {
"MessageGroup" : [ "componentDidMount" , "componentDidUpdate" ] ,
2019-04-07 21:33:13 +02:00
"Embed" : [ "componentDidMount" , "componentDidUpdate" ] ,
2019-01-17 23:48:29 +01:00
"StandardSidebarView" : "componentWillUnmount"
} ;
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
this . languages ;
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
this . defaults = {
settings : {
showInChat : { value : true , description : "Replace Chat Timestamp with Complete Timestamp:" } ,
2019-04-07 21:33:13 +02:00
showInEmbed : { value : true , description : "Replace Embed Timestamp with Complete Timestamp:" } ,
2018-10-11 10:21:26 +02:00
showOnHover : { value : false , description : "Also show Timestamp when you hover over a message:" } ,
changeForEdit : { value : false , description : "Change the Time for the Edited Time Tooltips:" } ,
displayTime : { value : true , description : "Display the Time in the Timestamp:" } ,
displayDate : { value : true , description : "Display the Date in the Timestamp:" } ,
cutSeconds : { value : false , description : "Cut off Seconds of the Time:" } ,
forceZeros : { value : false , description : "Force leading Zeros:" } ,
otherOrder : { value : false , description : "Show the Time before the Date:" }
} ,
choices : {
creationDateLang : { value : "$discord" , description : "Timestamp Format:" }
} ,
formats : {
ownFormat : { value : "$hour:$minute:$second, $day.$month.$year" , description : "Own Format:" }
}
} ;
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
getSettingsPanel ( ) {
2019-01-22 11:28:32 +01:00
if ( ! global . BDFDB || typeof BDFDB != "object" || ! BDFDB . loaded || ! this . started ) return ;
2019-01-17 23:48:29 +01:00
let settings = BDFDB . getAllData ( this , "settings" ) ;
let choices = BDFDB . getAllData ( this , "choices" ) ;
let formats = BDFDB . getAllData ( this , "formats" ) ;
2019-04-18 09:28:20 +02:00
let settingshtml = ` <div class=" ${ this . name } -settings BDFDB-settings"><div class=" ${ BDFDB . disCNS . titledefault + BDFDB . disCNS . title + BDFDB . disCNS . size18 + BDFDB . disCNS . height24 + BDFDB . disCNS . weightnormal + BDFDB . disCN . marginbottom8 } "> ${ this . name } </div><div class="BDFDB-settings-inner"> ` ;
2018-10-11 10:21:26 +02:00
for ( let key in settings ) {
2019-01-17 23:48:29 +01:00
settingshtml += ` <div class=" ${ BDFDB . disCNS . flex + BDFDB . disCNS . flex2 + BDFDB . disCNS . horizontal + BDFDB . disCNS . horizontal2 + BDFDB . disCNS . directionrow + BDFDB . disCNS . justifystart + BDFDB . disCNS . aligncenter + BDFDB . disCNS . nowrap + BDFDB . disCN . marginbottom8 } " style="flex: 1 1 auto;"><h3 class=" ${ BDFDB . disCNS . titledefault + BDFDB . disCNS . title + BDFDB . disCNS . marginreset + BDFDB . disCNS . weightmedium + BDFDB . disCNS . size16 + BDFDB . disCNS . height24 + BDFDB . disCN . flexchild } " style="flex: 1 1 auto;"> ${ this . defaults . settings [ key ] . description } </h3><div class=" ${ BDFDB . disCNS . flexchild + BDFDB . disCNS . switchenabled + BDFDB . disCNS . switch + BDFDB . disCNS . switchvalue + BDFDB . disCNS . switchsizedefault + BDFDB . disCNS . switchsize + BDFDB . disCN . switchthemedefault } " style="flex: 0 0 auto;"><input type="checkbox" value="settings ${ key } " class=" ${ BDFDB . disCNS . switchinnerenabled + BDFDB . disCN . switchinner } settings-switch" ${ settings [ key ] ? " checked" : "" } ></div></div> ` ;
2018-10-11 10:21:26 +02:00
}
for ( let key in choices ) {
2019-01-09 14:09:26 +01:00
settingshtml += ` <div class=" ${ BDFDB . disCNS . flex + BDFDB . disCNS . flex2 + BDFDB . disCNS . horizontal + BDFDB . disCNS . horizontal2 + BDFDB . disCNS . directionrow + BDFDB . disCNS . justifystart + BDFDB . disCNS . aligncenter + BDFDB . disCNS . nowrap + BDFDB . disCN . marginbottom8 } " style="flex: 1 1 auto;"><h3 class=" ${ BDFDB . disCNS . titledefault + BDFDB . disCNS . title + BDFDB . disCNS . weightmedium + BDFDB . disCNS . size16 + BDFDB . disCN . flexchild } " style="flex: 0 0 30%;"> ${ this . defaults . choices [ key ] . description } </h3><div class=" ${ BDFDB . disCN . selectwrap } " style="flex: 1 1 70%;"><div class=" ${ BDFDB . disCNS . select + BDFDB . disCNS . selectsingle + BDFDB . disCN . selecthasvalue } " option=" ${ key } " value=" ${ choices [ key ] } "><div class=" ${ BDFDB . disCN . selectcontrol } "><div class=" ${ BDFDB . disCNS . flex + BDFDB . disCNS . flex2 + BDFDB . disCNS . horizontal + BDFDB . disCNS . horizontal2 + BDFDB . disCNS . directionrow + BDFDB . disCNS . justifystart + BDFDB . disCNS . alignbaseline + BDFDB . disCNS . nowrap + BDFDB . disCN . selectvalue } " style="flex: 1 1 auto;"><div class=" ${ BDFDB . disCNS . title + BDFDB . disCNS . medium + BDFDB . disCNS . size16 + BDFDB . disCNS . height20 + BDFDB . disCNS . primary + BDFDB . disCN . weightnormal } languageName" style="flex: 1 1 42%; padding:0;"> ${ this . languages [ choices [ key ] ] . name } </div><div class=" ${ BDFDB . disCNS . title + BDFDB . disCNS . medium + BDFDB . disCNS . size16 + BDFDB . disCNS . height20 + BDFDB . disCNS . primary + BDFDB . disCN . weightnormal } languageTimestamp" style="flex: 1 1 58%; padding:0;"> ${ this . getTimestamp ( this . languages [ choices [ key ] ] . id ) } </div></div><span class=" ${ BDFDB . disCN . selectarrowzone } "><span class=" ${ BDFDB . disCN . selectarrow } "></span></span></div></div></div></div> ` ;
2018-10-11 10:21:26 +02:00
}
for ( let key in formats ) {
2019-01-09 14:09:26 +01:00
settingshtml += ` <div class=" ${ BDFDB . disCNS . flex + BDFDB . disCNS . flex2 + BDFDB . disCNS . horizontal + BDFDB . disCNS . horizontal2 + BDFDB . disCNS . directionrow + BDFDB . disCNS . justifystart + BDFDB . disCNS . aligncenter + BDFDB . disCNS . nowrap + BDFDB . disCN . marginbottom8 } " style="flex: 1 1 auto;"><h3 class=" ${ BDFDB . disCNS . titledefault + BDFDB . disCNS . title + BDFDB . disCNS . weightmedium + BDFDB . disCNS . size16 + BDFDB . disCN . flexchild } " style="flex: 0 0 30%;"> ${ this . defaults . formats [ key ] . description } </h3><div class=" ${ BDFDB . disCNS . inputwrapper + BDFDB . disCNS . vertical + BDFDB . disCNS . flex + BDFDB . disCN . directioncolumn } " style="flex: 1 1 auto;"><input type="text" option=" ${ key } " value=" ${ formats [ key ] } " placeholder=" ${ this . defaults . formats [ key ] . value } " class=" ${ BDFDB . disCNS . inputdefault + BDFDB . disCNS . input + BDFDB . disCN . size16 } "></div></div> ` ;
2018-10-11 10:21:26 +02:00
}
2019-01-17 23:48:29 +01:00
let infoHidden = BDFDB . loadData ( "hideInfo" , this , "hideInfo" ) ;
2019-02-03 18:03:02 +01:00
settingshtml += ` <div class=" ${ BDFDB . disCNS . flex + BDFDB . disCNS . flex2 + BDFDB . disCNS . horizontal + BDFDB . disCNS . horizontal2 + BDFDB . disCNS . directionrow + BDFDB . disCNS . justifystart + BDFDB . disCNS . aligncenter + BDFDB . disCNS . nowrap + BDFDB . disCNS . cursorpointer + ( infoHidden ? BDFDB . disCN . categorywrappercollapsed : BDFDB . disCN . categorywrapperdefault ) } toggle-info" style="flex: 1 1 auto;"><svg class=" ${ BDFDB . disCNS . categoryicontransition + BDFDB . disCNS . directionright + ( infoHidden ? BDFDB . disCN . categoryiconcollapsed : BDFDB . disCN . categoryicondefault ) } " width="12" height="12" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M7 10L12 15 17 10"></path></svg><div class=" ${ BDFDB . disCNS . categorycolortransition + BDFDB . disCNS . categoryoverflowellipsis + BDFDB . disCN . categorynamecollapsed } " style="flex: 1 1 auto;">Information</div></div> ` ;
2019-04-18 09:28:20 +02:00
settingshtml += ` <div class="BDFDB-settings-inner-list info-container" ${ infoHidden ? "style='display:none;'" : "" } > ` ;
2018-10-11 10:21:26 +02:00
settingshtml += ` <div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ hour will be replaced with the current hour</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ minute will be replaced with the current minutes</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ second will be replaced with the current seconds</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ msecond will be replaced with the current milliseconds</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ timemode will change $ hour to a 12h format and will be replaced with AM/PM</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ year will be replaced with the current year</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ month will be replaced with the current month</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ day will be replaced with the current day</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ monthnameL will be replaced with the monthname in long format based on the Discord Language</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ monthnameS will be replaced with the monthname in short format based on the Discord Language</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ weekdayL will be replaced with the weekday in long format based on the Discord Language</div><div class=" ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> $ weekdayS will be replaced with the weekday in short format based on the Discord Language</div> ` ;
settingshtml += ` </div></div> ` ;
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
let settingspanel = BDFDB . htmlToElement ( settingshtml ) ;
2018-10-11 10:21:26 +02:00
2019-01-17 23:48:29 +01:00
BDFDB . initElements ( settingspanel , this ) ;
2018-10-11 10:21:26 +02:00
2019-02-22 21:39:10 +01:00
BDFDB . addEventListener ( this , settingspanel , "click" , ".settings-switch" , ( ) => { setImmediate ( ( ) => { this . updateSettingsPanel ( settingspanel ) ; } ) } ) ;
2019-01-17 23:48:29 +01:00
BDFDB . addEventListener ( this , settingspanel , "keyup" , BDFDB . dotCN . input , ( ) => { this . saveInputs ( settingspanel ) ; } ) ;
BDFDB . addEventListener ( this , settingspanel , "click" , BDFDB . dotCN . selectcontrol , e => { this . openDropdownMenu ( e ) ; } ) ;
BDFDB . addEventListener ( this , settingspanel , "click" , ".toggle-info" , e => { this . toggleInfo ( e . currentTarget ) ; } ) ;
2018-10-11 10:21:26 +02:00
return settingspanel ;
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
//legacy
load ( ) { }
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
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-01-17 23:48:29 +01:00
var libraryScript = document . querySelector ( 'head script[src="https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"]' ) ;
if ( ! libraryScript || performance . now ( ) - libraryScript . getAttribute ( "date" ) > 600000 ) {
2018-10-11 10:21:26 +02:00
if ( libraryScript ) libraryScript . remove ( ) ;
libraryScript = document . createElement ( "script" ) ;
libraryScript . setAttribute ( "type" , "text/javascript" ) ;
libraryScript . setAttribute ( "src" , "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js" ) ;
2019-01-17 23:48:29 +01:00
libraryScript . setAttribute ( "date" , performance . now ( ) ) ;
2019-01-30 21:23:49 +01:00
libraryScript . addEventListener ( "load" , ( ) => { if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) this . initialize ( ) ; } ) ;
2018-10-11 10:21:26 +02:00
document . head . appendChild ( libraryScript ) ;
}
2019-01-17 23:48:29 +01:00
else if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) this . initialize ( ) ;
2018-10-11 10:21:26 +02:00
this . startTimeout = setTimeout ( ( ) => { this . initialize ( ) ; } , 30000 ) ;
}
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 ;
2018-10-11 10:21:26 +02:00
BDFDB . loadMessage ( this ) ;
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
this . languages = Object . assign ( { "own" : { name : "Own" , id : "own" , integrated : false , dic : false } } , BDFDB . languages ) ;
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
BDFDB . addEventListener ( this , document , "mouseenter" , BDFDB . dotCNS . message + BDFDB . dotCN . messagecontent , e => {
if ( BDFDB . getData ( "showOnHover" , this , "settings" ) ) {
let message = e . currentTarget ;
let messagegroup = BDFDB . getParentEle ( BDFDB . dotCN . messagegroup , message ) ;
if ( ! messagegroup || ! messagegroup . tagName ) return ;
let info = this . getMessageData ( message , messagegroup ) ;
if ( ! info || ! info . timestamp || ! info . timestamp . _i ) return ;
let choice = BDFDB . getData ( "creationDateLang" , this , "choices" ) ;
BDFDB . createTooltip ( this . getTimestamp ( this . languages [ choice ] . id , info . timestamp . _i ) , message , { type : "left" , selector : "completetimestamp-tooltip" } ) ;
}
} ) ;
BDFDB . addEventListener ( this , document , "mouseenter" , BDFDB . dotCNS . message + BDFDB . dotCN . messageedited , e => {
if ( BDFDB . getData ( "changeForEdit" , this , "settings" ) ) {
let marker = e . currentTarget ;
let time = marker . getAttribute ( "datetime" ) ;
if ( ! time ) return ;
let choice = BDFDB . getData ( "creationDateLang" , this , "choices" ) ;
2019-02-03 18:03:02 +01:00
BDFDB . createTooltip ( this . getTimestamp ( this . languages [ choice ] . id , time ) , marker , { type : "top" , selector : "completetimestampedit-tooltip" , css : ` body ${ BDFDB . dotCN . tooltip } :not(.completetimestampedit-tooltip) {display: none !important;} ` } ) ;
2019-01-17 23:48:29 +01:00
}
2018-10-11 10:21:26 +02:00
} ) ;
2019-01-26 22:45:19 +01:00
2019-02-03 18:03:02 +01:00
BDFDB . WebModules . forceAllUpdates ( this ) ;
2018-10-11 10:21:26 +02:00
}
else {
2019-02-12 21:56:34 +01:00
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-17 23:48:29 +01:00
if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) {
BDFDB . removeEles ( ".complete-timestamp-divider" ) ;
BDFDB . removeClasses ( "complete-timestamp" ) ;
2019-01-26 22:45:19 +01:00
2019-01-24 13:37:08 +01:00
BDFDB . removeLocalStyle ( this . name + "CompactCorrection" ) ;
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
BDFDB . unloadMessage ( this ) ;
}
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
// begin of own functions
saveInputs ( settingspanel ) {
2019-01-17 23:48:29 +01:00
let formats = { } ;
for ( let input of settingspanel . querySelectorAll ( BDFDB . dotCN . input ) ) {
2018-10-11 10:21:26 +02:00
formats [ input . getAttribute ( "option" ) ] = input . value ;
}
BDFDB . saveAllData ( formats , this , "formats" ) ;
this . updateSettingsPanel ( settingspanel ) ;
}
updateSettingsPanel ( settingspanel ) {
2019-01-17 23:48:29 +01:00
let choices = BDFDB . getAllData ( this , "choices" ) ;
2018-10-11 10:21:26 +02:00
for ( let key in choices ) {
settingspanel . querySelector ( ` ${ BDFDB . dotCN . select } [option=' ${ key } '] .languageTimestamp ` ) . innerText = this . getTimestamp ( this . languages [ choices [ key ] ] . id ) ;
}
2019-01-17 23:48:29 +01:00
this . SettingsUpdated = true ;
2018-10-11 10:21:26 +02:00
}
2019-01-17 23:48:29 +01:00
toggleInfo ( ele ) {
BDFDB . toggleClass ( ele , BDFDB . disCN . categorywrappercollapsed ) ;
BDFDB . toggleClass ( ele , BDFDB . disCN . categorywrapperdefault ) ;
2018-10-11 10:21:26 +02:00
var svg = ele . querySelector ( BDFDB . dotCN . categoryicontransition ) ;
2019-01-17 23:48:29 +01:00
BDFDB . toggleClass ( svg , BDFDB . disCN . directionright ) ;
BDFDB . toggleClass ( svg , BDFDB . disCN . categoryiconcollapsed ) ;
BDFDB . toggleClass ( svg , BDFDB . disCN . categoryicondefault ) ;
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
BDFDB . toggleEles ( ele . nextElementSibling ) ;
BDFDB . saveData ( "hideInfo" , BDFDB . isEleHidden ( ele . nextElementSibling ) , this , "hideInfo" ) ;
2018-10-11 10:21:26 +02:00
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
openDropdownMenu ( e ) {
2019-01-17 23:48:29 +01:00
let selectControl = e . currentTarget ;
let selectWrap = selectControl . parentElement ;
let plugincard = BDFDB . getParentEle ( "li" , selectWrap ) ;
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
if ( ! plugincard || BDFDB . containsClass ( selectWrap , BDFDB . disCN . selectisopen ) ) return ;
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
BDFDB . addClass ( selectWrap , BDFDB . disCN . selectisopen ) ;
plugincard . style . setProperty ( "overflow" , "visible" , "important" ) ;
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
let selectMenu = this . createDropdownMenu ( selectWrap . getAttribute ( "value" ) ) ;
2018-10-11 10:21:26 +02:00
selectWrap . appendChild ( selectMenu ) ;
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
BDFDB . addChildEventListener ( selectMenu , "mousedown" , BDFDB . dotCN . selectoption , e2 => {
let language = e2 . currentTarget . getAttribute ( "value" ) ;
2018-10-11 10:21:26 +02:00
selectWrap . setAttribute ( "value" , language ) ;
selectControl . querySelector ( ".languageName" ) . innerText = this . languages [ language ] . name ;
selectControl . querySelector ( ".languageTimestamp" ) . innerText = this . getTimestamp ( this . languages [ language ] . id ) ;
BDFDB . saveData ( selectWrap . getAttribute ( "option" ) , language , this , "choices" ) ;
} ) ;
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
var removeMenu = e2 => {
if ( e2 . target . parentElement != selectMenu ) {
document . removeEventListener ( "mousedown" , removeMenu ) ;
selectMenu . remove ( ) ;
plugincard . style . removeProperty ( "overflow" ) ;
setTimeout ( ( ) => { BDFDB . removeClass ( selectWrap , BDFDB . disCN . selectisopen ) ; } , 100 ) ;
}
} ;
document . addEventListener ( "mousedown" , removeMenu ) ;
2018-10-11 10:21:26 +02:00
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
createDropdownMenu ( choice ) {
2019-01-17 23:48:29 +01:00
let menuhtml = ` <div class=" ${ BDFDB . disCN . selectmenuouter } "><div class=" ${ BDFDB . disCN . selectmenu } "> ` ;
for ( let key in this . languages ) {
let isSelected = key == choice ? ` ${ BDFDB . disCN . selectselected } ` : ` ` ;
2018-10-11 10:21:26 +02:00
menuhtml += ` <div value=" ${ key } " class=" ${ BDFDB . disCNS . flex + BDFDB . disCNS . flex2 + BDFDB . disCNS . horizontal + BDFDB . disCNS . horizontal2 + BDFDB . disCNS . directionrow + BDFDB . disCNS . justifystart + BDFDB . disCNS . alignbaseline + BDFDB . disCNS . nowrap + BDFDB . disCN . selectoption + isSelected } " style="flex: 1 1 auto; display:flex;"><div class=" ${ BDFDB . disCNS . title + BDFDB . disCNS . medium + BDFDB . disCNS . size16 + BDFDB . disCNS . height20 + BDFDB . disCNS . primary + BDFDB . disCN . weightnormal } " style="flex: 1 1 42%;"> ${ this . languages [ key ] . name } </div><div class=" ${ BDFDB . disCNS . title + BDFDB . disCNS . medium + BDFDB . disCNS . size16 + BDFDB . disCNS . height20 + BDFDB . disCNS . primary + BDFDB . disCN . weightnormal } " style="flex: 1 1 58%;"> ${ this . getTimestamp ( this . languages [ key ] . id ) } </div></div> `
}
menuhtml += ` </div></div> ` ;
2019-01-17 23:48:29 +01:00
return BDFDB . htmlToElement ( menuhtml ) ;
}
2019-01-26 22:45:19 +01:00
2019-01-17 23:48:29 +01:00
processMessageGroup ( instance , wrapper ) {
2019-02-03 18:03:02 +01:00
if ( BDFDB . getData ( "showInChat" , this , "settings" ) ) for ( let stamp of wrapper . querySelectorAll ( "time[datetime]" ) ) this . changeTimestamp ( stamp ) ;
2019-01-17 23:48:29 +01:00
}
2019-01-26 22:45:19 +01:00
2019-04-07 21:33:13 +02:00
processEmbed ( instance , wrapper ) {
let embed = BDFDB . getReactValue ( instance , "props.embed" ) ;
let footer = wrapper . querySelector ( BDFDB . dotCN . embedfootertext ) ;
if ( footer && embed && embed . footer && embed . timestamp && BDFDB . getData ( "showInEmbed" , this , "settings" ) ) {
footer . lastChild . textContent = this . getTimestamp ( this . languages [ BDFDB . getData ( "creationDateLang" , this , "choices" ) ] . id , embed . timestamp . _i ) ;
}
}
2019-01-17 23:48:29 +01:00
processStandardSidebarView ( instance , wrapper ) {
if ( this . SettingsUpdated ) {
delete this . SettingsUpdated ;
BDFDB . WebModules . forceAllUpdates ( 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
changeTimestamp ( stamp ) {
2019-01-17 23:48:29 +01:00
if ( ! stamp . className || stamp . className . toLowerCase ( ) . indexOf ( "timestamp" ) == - 1 || BDFDB . containsClass ( stamp , "complete-timestamp" ) ) return ;
2018-10-11 10:21:26 +02:00
let time = stamp . getAttribute ( "datetime" ) ;
2018-12-14 12:02:08 +01:00
if ( time ) {
2018-12-14 12:08:12 +01:00
this . setMaxWidth ( ) ;
2019-01-17 23:48:29 +01:00
BDFDB . addClass ( stamp , "complete-timestamp" ) ;
2019-02-18 09:27:40 +01:00
stamp . parentElement . insertBefore ( BDFDB . htmlToElement ( ` <span class="complete-timestamp-divider arabic-fix" style="display: inline !important; height: 0 !important; width: 0 !important; font-size: 0 !important; user-select: none !important;">ARABIC FIX</span> ` ) , stamp ) ;
2019-01-17 23:48:29 +01:00
BDFDB . setInnerText ( stamp , this . getTimestamp ( this . languages [ BDFDB . getData ( "creationDateLang" , this , "choices" ) ] . id , time ) ) ;
2018-12-14 12:02:08 +01:00
}
2018-10-11 10:21:26 +02:00
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
getMessageData ( div , messagegroup ) {
2019-01-17 23:48:29 +01:00
let pos = Array . from ( messagegroup . querySelectorAll ( "." + div . className . replace ( / /g , "." ) ) ) . indexOf ( div ) ;
let instance = BDFDB . getReactInstance ( messagegroup ) ;
2018-10-11 10:21:26 +02:00
if ( ! instance ) return ;
2019-01-17 23:48:29 +01:00
let info = instance . return . stateNode . props . messages ;
2018-10-11 10:21:26 +02:00
return info && pos > - 1 ? info [ pos ] : null ;
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
getTimestamp ( languageid , time ) {
let timeobj = time ? time : new Date ( ) ;
if ( typeof time == "string" ) timeobj = new Date ( time ) ;
if ( timeobj . toString ( ) == "Invalid Date" ) timeobj = new Date ( parseInt ( time ) ) ;
if ( timeobj . toString ( ) == "Invalid Date" ) return ;
2019-01-17 23:48:29 +01:00
let settings = BDFDB . getAllData ( this , "settings" ) , timestring = "" ;
2018-10-11 10:21:26 +02:00
if ( languageid != "own" ) {
2019-01-17 23:48:29 +01:00
let timestamp = [ ] ;
2018-10-11 10:21:26 +02:00
if ( settings . displayDate ) timestamp . push ( timeobj . toLocaleDateString ( languageid ) ) ;
if ( settings . displayTime ) timestamp . push ( settings . cutSeconds ? this . cutOffSeconds ( timeobj . toLocaleTimeString ( languageid ) ) : timeobj . toLocaleTimeString ( languageid ) ) ;
if ( settings . otherOrder ) timestamp . reverse ( ) ;
timestring = timestamp . length > 1 ? timestamp . join ( ", " ) : ( timestamp . length > 0 ? timestamp [ 0 ] : "" ) ;
if ( timestring && settings . forceZeros ) timestring = this . addLeadingZeros ( timestring ) ;
}
else {
2019-01-17 23:48:29 +01:00
let ownformat = BDFDB . getData ( "ownFormat" , this , "formats" ) ;
2018-10-11 10:21:26 +02:00
languageid = BDFDB . getDiscordLanguage ( ) . id ;
2019-01-17 23:48:29 +01:00
let hour = timeobj . getHours ( ) , minute = timeobj . getMinutes ( ) , second = timeobj . getSeconds ( ) , msecond = timeobj . getMilliseconds ( ) , day = timeobj . getDate ( ) , month = timeobj . getMonth ( ) + 1 , timemode = "" ;
2018-10-11 10:21:26 +02:00
if ( ownformat . indexOf ( "$timemode" ) > - 1 ) {
timemode = hour >= 12 ? "PM" : "AM" ;
hour = hour % 12 ;
hour = hour ? hour : 12 ;
}
timestring = ownformat
. 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" , msecond )
. replace ( "$timemode" , timemode )
. replace ( "$weekdayL" , timeobj . toLocaleDateString ( languageid , { weekday : "long" } ) )
. replace ( "$weekdayS" , timeobj . toLocaleDateString ( languageid , { weekday : "short" } ) )
. replace ( "$monthnameL" , timeobj . toLocaleDateString ( languageid , { month : "long" } ) )
. replace ( "$monthnameS" , timeobj . toLocaleDateString ( languageid , { month : "short" } ) )
. replace ( "$day" , settings . forceZeros && day < 10 ? "0" + day : day )
. replace ( "$month" , settings . forceZeros && month < 10 ? "0" + month : month )
. replace ( "$year" , timeobj . getFullYear ( ) ) ;
}
return timestring ;
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
cutOffSeconds ( timestring ) {
return timestring . replace ( /(.*):(.*):(.{2})(.*)/ , "$1:$2$4" ) ;
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
addLeadingZeros ( timestring ) {
2019-01-17 23:48:29 +01:00
let chararray = timestring . split ( "" ) ;
let numreg = /[0-9]/ ;
for ( let i = 0 ; i < chararray . length ; i ++ ) {
2018-10-11 10:21:26 +02:00
if ( ! numreg . test ( chararray [ i - 1 ] ) && numreg . test ( chararray [ i ] ) && ! numreg . test ( chararray [ i + 1 ] ) ) chararray [ i ] = "0" + chararray [ i ] ;
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
return chararray . join ( "" ) ;
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
setMaxWidth ( ) {
2018-12-14 12:08:12 +01:00
if ( this . currentMode != BDFDB . getDiscordMode ( ) ) {
this . currentMode = BDFDB . getDiscordMode ( ) ;
2019-01-17 23:48:29 +01:00
let timestamp = document . querySelector ( BDFDB . dotCN . messagetimestampcompact ) ;
2018-12-14 12:08:12 +01:00
if ( timestamp ) {
2019-01-17 23:48:29 +01:00
let choice = BDFDB . getData ( "creationDateLang" , this , "choices" ) ;
let testtimestamp = BDFDB . htmlToElement ( ` <time class=" ${ timestamp . className } " style="width: auto !important;"> ${ this . getTimestamp ( this . languages [ choice ] . id , new Date ( 253402124399995 ) ) } </time> ` ) ;
document . body . appendChild ( testtimestamp ) ;
let width = BDFDB . getRects ( testtimestamp ) . width + 5 ;
2018-12-14 12:08:12 +01:00
testtimestamp . remove ( ) ;
2019-01-24 13:37:08 +01:00
BDFDB . appendLocalStyle ( this . name + "CompactCorrection" , `
2018-12-14 12:08:12 +01:00
$ { BDFDB . dotCN . messagetimestampcompact } {
width : $ { width } px ! important ;
}
$ { BDFDB . dotCN . messagetimestampcompactismentioned } {
width : $ { width + 2 } px ! important ;
}
$ { BDFDB . dotCN . messagemarkupiscompact } {
margin - left : $ { width } px ! important ;
text - indent : - $ { width } px ! important ;
}
$ { BDFDB . dotCN . messageaccessorycompact } {
padding - left : $ { width } px ! important ;
}
` );
}
2019-01-24 13:37:08 +01:00
else BDFDB . removeLocalStyle ( this . name + "CompactCorrection" ) ;
2018-10-11 10:21:26 +02:00
}
}
}