2019-02-20 10:19:22 +01:00
//META{"name":"LastMessageDate","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/LastMessageDate","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/LastMessageDate/LastMessageDate.plugin.js"}*//
class LastMessageDate {
getName ( ) { return "LastMessageDate" ; }
2019-02-22 21:39:10 +01:00
getVersion ( ) { return "1.0.3" ; }
2019-02-20 10:19:22 +01:00
getAuthor ( ) { return "DevilBro" ; }
2019-02-20 14:07:06 +01:00
getDescription ( ) { return "Displays the Date of the last sent Message of a Member for the current Server/DM in the UserPopout and UserModal." ; }
2019-02-20 10:19:22 +01:00
initConstructor ( ) {
2019-02-20 14:07:06 +01:00
this . changelog = {
2019-02-22 21:39:10 +01:00
"improved" : [ [ "Settings" , "Added new settings to allow better timestamp customization" ] ]
2019-02-20 14:07:06 +01:00
} ;
2019-02-20 10:19:22 +01:00
this . labels = { } ;
this . patchModules = {
"UserPopout" : "componentDidMount" ,
"UserProfile" : "componentDidMount"
} ;
this . languages ;
this . loadedusers = { } ;
this . css = `
$ { BDFDB . dotCNS . userpopout + BDFDB . dotCN . nametag } {
margin - bottom : 4 px ;
}
$ { BDFDB . dotCN . userprofile } . lastMessageDate {
margin - right : 20 px ;
}
$ { BDFDB . dotCNS . themelight + BDFDB . dotCN . userpopoutheadernormal } . lastMessageDate {
color : # b9bbbe ;
}
$ { BDFDB . dotCNS . themelight + BDFDB . dotCN . userpopoutheader + BDFDB . notCN . userpopoutheadernormal } . lastMessageDate ,
$ { BDFDB . dotCNS . themedark + BDFDB . dotCN . userpopoutheader } . lastMessageDate {
color : hsla ( 0 , 0 % , 100 % , . 6 ) ;
}
$ { BDFDB . dotCNS . themelight + BDFDB . dotCN . userprofiletopsectionnormal } . lastMessageDate {
color : hsla ( 216 , 4 % , 74 % , . 6 ) ;
}
$ { BDFDB . dotCN . themelight } [ class *= 'topSection' ] $ { BDFDB . notCN . userprofiletopsectionnormal } . lastMessageDate ,
$ { BDFDB . dotCN . themedark } [ class *= 'topSection' ] . lastMessageDate {
color : hsla ( 0 , 0 % , 100 % , . 6 ) ;
} ` ;
this . defaults = {
settings : {
addInUserPopout : { value : true , description : "Add in User Popouts:" } ,
2019-03-31 09:54:48 +02:00
addInUserProfil : { value : true , description : "Add in User Profile Modal:" } ,
2019-02-22 21:39:10 +01:00
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:" }
2019-02-20 10:19:22 +01:00
} ,
choices : {
2019-02-22 21:39:10 +01:00
lastMessageDateLang : { value : "$discord" , description : "Last Message Date Format:" }
} ,
formats : {
ownFormat : { value : "$hour:$minute:$second, $day.$month.$year" , description : "Own Format:" }
2019-02-20 10:19:22 +01:00
}
} ;
}
getSettingsPanel ( ) {
if ( ! global . BDFDB || typeof BDFDB != "object" || ! BDFDB . loaded || ! this . started ) return ;
let settings = BDFDB . getAllData ( this , "settings" ) ;
let choices = BDFDB . getAllData ( this , "choices" ) ;
2019-02-22 21:39:10 +01:00
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"> ` ;
2019-02-20 10:19:22 +01:00
for ( let key in settings ) {
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> ` ;
}
for ( let key in choices ) {
2019-02-22 21:39:10 +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 } " type=" ${ 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> ` ;
}
for ( let key in formats ) {
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> ` ;
2019-02-20 10:19:22 +01:00
}
2019-02-22 21:39:10 +01:00
let infoHidden = BDFDB . loadData ( "hideInfo" , this , "hideInfo" ) ;
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;'" : "" } > ` ;
2019-02-22 21:39:10 +01: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> ` ;
2019-02-20 10:19:22 +01:00
settingshtml += ` </div></div> ` ;
let settingspanel = BDFDB . htmlToElement ( settingshtml ) ;
BDFDB . initElements ( settingspanel , this ) ;
2019-02-22 21:39:10 +01:00
BDFDB . addEventListener ( this , settingspanel , "click" , ".settings-switch" , ( ) => { setImmediate ( ( ) => { this . updateSettingsPanel ( settingspanel ) ; } ) } ) ;
BDFDB . addEventListener ( this , settingspanel , "keyup" , BDFDB . dotCN . input , ( ) => { this . saveInputs ( settingspanel ) ; } ) ;
2019-02-20 10:19:22 +01:00
BDFDB . addEventListener ( this , settingspanel , "click" , BDFDB . dotCN . selectcontrol , e => { this . openDropdownMenu ( e ) ; } ) ;
2019-02-22 21:39:10 +01:00
BDFDB . addEventListener ( this , settingspanel , "click" , ".toggle-info" , e => { this . toggleInfo ( e . currentTarget ) ; } ) ;
2019-02-20 10:19:22 +01:00
return settingspanel ;
}
//legacy
load ( ) { }
start ( ) {
if ( ! global . BDFDB ) global . BDFDB = { myPlugins : { } } ;
if ( global . BDFDB && global . BDFDB . myPlugins && typeof global . BDFDB . myPlugins == "object" ) global . BDFDB . myPlugins [ this . getName ( ) ] = this ;
var libraryScript = document . querySelector ( 'head script[src="https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"]' ) ;
if ( ! libraryScript || performance . now ( ) - libraryScript . getAttribute ( "date" ) > 600000 ) {
if ( libraryScript ) libraryScript . remove ( ) ;
libraryScript = document . createElement ( "script" ) ;
libraryScript . setAttribute ( "type" , "text/javascript" ) ;
libraryScript . setAttribute ( "src" , "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js" ) ;
libraryScript . setAttribute ( "date" , performance . now ( ) ) ;
libraryScript . addEventListener ( "load" , ( ) => { if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) this . initialize ( ) ; } ) ;
document . head . appendChild ( libraryScript ) ;
}
else if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) this . initialize ( ) ;
this . startTimeout = setTimeout ( ( ) => { this . initialize ( ) ; } , 30000 ) ;
}
initialize ( ) {
if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) {
if ( this . started ) return ;
BDFDB . loadMessage ( this ) ;
this . CurrentGuildStore = BDFDB . WebModules . findByProperties ( "getLastSelectedGuildId" ) ;
2019-02-20 14:07:06 +01:00
this . CurrentChannelStore = BDFDB . WebModules . findByProperties ( "getLastSelectedChannelId" ) ;
2019-02-20 10:19:22 +01:00
this . APIModule = BDFDB . WebModules . findByProperties ( "getAPIBaseURL" ) ;
this . DiscordConstants = BDFDB . WebModules . findByProperties ( "Permissions" , "ActivityTypes" , "StatusTypes" ) ;
2019-02-22 21:39:10 +01:00
this . languages = Object . assign ( { "own" : { name : "Own" , id : "own" , integrated : false , dic : false } } , BDFDB . languages ) ;
2019-02-20 10:47:10 +01:00
BDFDB . WebModules . patch ( BDFDB . WebModules . findByProperties ( "receiveMessage" ) , "receiveMessage" , this , { after : e => {
let message = e . methodArguments [ 1 ] ;
2019-02-20 14:07:06 +01:00
let guildid = message . guild _id || message . channel _id ;
if ( guildid && this . loadedusers [ guildid ] && this . loadedusers [ guildid ] [ message . author . id ] ) this . loadedusers [ guildid ] [ message . author . id ] = new Date ( message . timestamp ) ;
2019-02-20 10:47:10 +01:00
} } ) ;
2019-02-20 10:19:22 +01:00
BDFDB . WebModules . forceAllUpdates ( this ) ;
}
else {
console . error ( ` %c[ ${ this . getName ( ) } ]%c ` , 'color: #3a71c1; font-weight: 700;' , '' , 'Fatal Error: Could not load BD functions!' ) ;
}
}
stop ( ) {
if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) {
BDFDB . removeEles ( ".lastMessageDate" ) ;
BDFDB . unloadMessage ( this ) ;
}
}
// begin of own functions
2019-02-22 21:39:10 +01:00
saveInputs ( settingspanel ) {
let formats = { } ;
for ( let input of settingspanel . querySelectorAll ( BDFDB . dotCN . input ) ) {
formats [ input . getAttribute ( "option" ) ] = input . value ;
}
BDFDB . saveAllData ( formats , this , "formats" ) ;
this . updateSettingsPanel ( settingspanel ) ;
}
updateSettingsPanel ( settingspanel ) {
let choices = BDFDB . getAllData ( this , "choices" ) ;
for ( let key in choices ) {
settingspanel . querySelector ( ` ${ BDFDB . dotCN . select } [type=' ${ key } '] .languageTimestamp ` ) . innerText = this . getTimestamp ( this . languages [ choices [ key ] ] . id ) ;
}
}
toggleInfo ( ele ) {
BDFDB . toggleClass ( ele , BDFDB . disCN . categorywrappercollapsed ) ;
BDFDB . toggleClass ( ele , BDFDB . disCN . categorywrapperdefault ) ;
var svg = ele . querySelector ( BDFDB . dotCN . categoryicontransition ) ;
BDFDB . toggleClass ( svg , BDFDB . disCN . directionright ) ;
BDFDB . toggleClass ( svg , BDFDB . disCN . categoryiconcollapsed ) ;
BDFDB . toggleClass ( svg , BDFDB . disCN . categoryicondefault ) ;
BDFDB . toggleEles ( ele . nextElementSibling ) ;
BDFDB . saveData ( "hideInfo" , BDFDB . isEleHidden ( ele . nextElementSibling ) , this , "hideInfo" ) ;
}
2019-02-20 10:19:22 +01:00
openDropdownMenu ( e ) {
let selectControl = e . currentTarget ;
let selectWrap = selectControl . parentElement ;
let plugincard = BDFDB . getParentEle ( "li" , selectWrap ) ;
if ( ! plugincard || BDFDB . containsClass ( selectWrap , BDFDB . disCN . selectisopen ) ) return ;
BDFDB . addClass ( selectWrap , BDFDB . disCN . selectisopen ) ;
plugincard . style . setProperty ( "overflow" , "visible" , "important" ) ;
let type = selectWrap . getAttribute ( "type" ) ;
let selectMenu = this . createDropdownMenu ( selectWrap . getAttribute ( "value" ) , type ) ;
selectWrap . appendChild ( selectMenu ) ;
BDFDB . addChildEventListener ( selectMenu , "mousedown" , BDFDB . dotCN . selectoption , e2 => {
let language = e2 . currentTarget . getAttribute ( "value" ) ;
selectWrap . setAttribute ( "value" , language ) ;
selectControl . querySelector ( ".languageName" ) . innerText = this . languages [ language ] . name ;
2019-02-22 21:39:10 +01:00
selectControl . querySelector ( ".languageTimestamp" ) . innerText = this . getTimestamp ( language ) ;
2019-02-20 10:19:22 +01:00
BDFDB . saveData ( type , language , this , "choices" ) ;
} ) ;
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 ) ;
}
createDropdownMenu ( choice , type ) {
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 } ` : ` ` ;
2019-02-22 21:39:10 +01: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> `
2019-02-20 10:19:22 +01:00
}
menuhtml += ` </div></div> ` ;
return BDFDB . htmlToElement ( menuhtml ) ;
}
processUserPopout ( instance , wrapper ) {
if ( instance . props && instance . props . user && BDFDB . getData ( "addInUserPopout" , this , "settings" ) ) {
this . addLastMessageDate ( instance . props . user , wrapper . querySelector ( BDFDB . dotCN . userpopoutheadertext ) , wrapper . parentElement ) ;
}
}
processUserProfile ( instance , wrapper ) {
if ( instance . props && instance . props . user && BDFDB . getData ( "addInUserProfil" , this , "settings" ) ) {
this . addLastMessageDate ( instance . props . user , wrapper . querySelector ( BDFDB . dotCN . userprofileheaderinfo ) , null ) ;
}
}
addLastMessageDate ( info , container , popout ) {
2019-02-20 14:07:06 +01:00
if ( ! info || info . isLocalBot ( ) || ! container || container . querySelector ( ".lastMessageDate" ) ) return ;
2019-02-20 10:19:22 +01:00
let guildid = this . CurrentGuildStore . getGuildId ( ) ;
2019-02-20 14:07:06 +01:00
let isguild = ! ! guildid ;
guildid = guildid || this . CurrentChannelStore . getChannelId ( ) ;
2019-02-20 10:19:22 +01:00
if ( guildid ) {
if ( ! this . loadedusers [ guildid ] ) this . loadedusers [ guildid ] = { } ;
2019-02-20 10:47:10 +01:00
let addTimestamp = ( timestamp ) => {
2019-02-20 10:19:22 +01:00
if ( document . contains ( container ) ) {
let choice = BDFDB . getData ( "lastMessageDateLang" , this , "choices" ) ;
let nametag = container . querySelector ( BDFDB . dotCN . nametag ) ;
let joinedAtDate = container . querySelector ( ".joinedAtDate" ) ;
2019-04-18 09:28:20 +02:00
container . insertBefore ( BDFDB . htmlToElement ( ` <div class="lastMessageDate BDFDB-textscrollwrapper ${ BDFDB . disCN . textrow } " style="max-width: ${ BDFDB . getRects ( BDFDB . getParentEle ( popout ? BDFDB . dotCN . userpopoutheader : BDFDB . dotCN . userprofileheaderinfo , container ) ) . width - 20 } px !important;"><div class="BDFDB-textscroll"> ${ this . labels . lastmessage _text . replace ( "{{time}}" , timestamp == "never" ? "---" : this . getTimestamp ( this . languages [ choice ] . id , timestamp ) ) } </div></div> ` ) , joinedAtDate ? joinedAtDate . nextSibling : ( nametag ? nametag . nextSibling : null ) ) ;
2019-02-20 10:19:22 +01:00
BDFDB . initElements ( container . parentElement , this ) ;
if ( popout && popout . style . transform . indexOf ( "translateY(-1" ) == - 1 ) {
let arect = BDFDB . getRects ( document . querySelector ( BDFDB . dotCN . appmount ) ) ;
let prect = BDFDB . getRects ( popout ) ;
popout . style . setProperty ( "top" , ( prect . y + prect . height > arect . height ? ( arect . height - prect . height ) : prect . y ) + "px" ) ;
}
}
} ;
if ( this . loadedusers [ guildid ] [ info . id ] ) addTimestamp ( this . loadedusers [ guildid ] [ info . id ] ) ;
2019-02-20 14:07:06 +01:00
else this . APIModule . get ( ( isguild ? this . DiscordConstants . Endpoints . SEARCH _GUILD ( guildid ) : this . DiscordConstants . Endpoints . SEARCH _CHANNEL ( guildid ) ) + "?author_id=" + info . id ) . then ( result => {
2019-02-20 10:47:10 +01:00
if ( result && result . body && Array . isArray ( result . body . messages [ 0 ] ) ) {
for ( let message of result . body . messages [ 0 ] ) if ( message . hit && message . author . id == info . id ) {
let timestamp = new Date ( message . timestamp ) ;
this . loadedusers [ guildid ] [ info . id ] = timestamp ;
addTimestamp ( timestamp ) ;
}
}
else {
let timestamp = "never" ;
2019-02-20 10:19:22 +01:00
this . loadedusers [ guildid ] [ info . id ] = timestamp ;
addTimestamp ( timestamp ) ;
}
} ) ;
}
}
2019-02-22 21:39:10 +01: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 ;
let settings = BDFDB . getAllData ( this , "settings" ) , timestring = "" ;
if ( languageid != "own" ) {
let timestamp = [ ] ;
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 {
let ownformat = BDFDB . getData ( "ownFormat" , this , "formats" ) ;
languageid = BDFDB . getDiscordLanguage ( ) . id ;
let hour = timeobj . getHours ( ) , minute = timeobj . getMinutes ( ) , second = timeobj . getSeconds ( ) , msecond = timeobj . getMilliseconds ( ) , day = timeobj . getDate ( ) , month = timeobj . getMonth ( ) + 1 , timemode = "" ;
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 ( ) ) ;
}
2019-02-20 10:19:22 +01:00
return timestring ;
}
2019-02-22 21:39:10 +01:00
cutOffSeconds ( timestring ) {
return timestring . replace ( /(.*):(.*):(.{2})(.*)/ , "$1:$2$4" ) ;
}
2019-02-20 10:19:22 +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 ( "" ) ;
}
setLabelsByLanguage ( ) {
switch ( BDFDB . getDiscordLanguage ( ) . id ) {
case "hr" : //croatian
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Posljednja poruka dana {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "da" : //danish
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Sidste besked den {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "de" : //german
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Letzte Nachricht am {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "es" : //spanish
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Último mensaje el {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "fr" : //french
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Dernier message le {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "it" : //italian
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Ultimo messaggio il {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "nl" : //dutch
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Laatste bericht op {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "no" : //norwegian
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Siste melding på {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "pl" : //polish
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Ostatnia wiadomość z {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "pt-BR" : //portuguese (brazil)
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Última mensagem em {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "fi" : //finnish
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Viimeisin viesti {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "sv" : //swedish
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Senaste meddelandet den {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "tr" : //turkish
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Son mesajı {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "cs" : //czech
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Poslední zpráva dne {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "bg" : //bulgarian
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Последно съобщение на {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "ru" : //russian
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Последнее сообщение {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "uk" : //ukrainian
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Останнє повідомлення {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "ja" : //japanese
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "{{time}} 最後のメッセージ"
2019-02-20 10:19:22 +01:00
} ;
case "zh-TW" : //chinese (traditional)
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "最後消息於 {{time}}"
2019-02-20 10:19:22 +01:00
} ;
case "ko" : //korean
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "{{time}} 마지막 메시지"
2019-02-20 10:19:22 +01:00
} ;
default : //default: english
return {
2019-04-04 21:16:49 +02:00
lastmessage _text : "Last message on {{time}}"
2019-02-20 10:19:22 +01:00
} ;
}
}
}