2018-10-11 10:21:26 +02:00
//META{"name":"ShowImageDetails"}*//
class ShowImageDetails {
initConstructor ( ) {
this . css = `
. image - details . image - details - size {
margin : 0 10 px ;
}
. image - details - tooltip {
max - width : 500 px ;
}
. image - details - tooltip . image - details - tooltip - size {
margin : 10 px 0 ;
}
` ;
this . updateDetails = false ;
this . defaults = {
settings : {
showOnHover : { value : false , description : "Show the details as Tooltip instead:" }
2018-11-25 11:14:48 +01:00
} ,
amounts : {
hoverDelay : { value : 0 , description : "Tooltip delay in millisec:" }
2018-10-11 10:21:26 +02:00
}
} ;
}
getName ( ) { return "ShowImageDetails" ; }
getDescription ( ) { return "Display the name, size and dimensions of uploaded images (does not include embed images) in the chat as an header or as a tooltip." ; }
2018-11-25 11:14:48 +01:00
getVersion ( ) { return "1.0.9" ; }
2018-10-11 10:21:26 +02:00
getAuthor ( ) { return "DevilBro" ; }
getSettingsPanel ( ) {
if ( ! this . started || typeof BDFDB !== "object" ) return ;
2018-11-25 11:14:48 +01:00
var settings = BDFDB . getAllData ( this , "settings" ) ;
var amounts = BDFDB . getAllData ( this , "amounts" ) ;
2018-10-11 10:21:26 +02:00
var settingshtml = ` <div class=" ${ this . getName ( ) } -settings DevilBro-settings"><div class=" ${ BDFDB . disCNS . titledefault + BDFDB . disCNS . title + BDFDB . disCNS . size18 + BDFDB . disCNS . height24 + BDFDB . disCNS . weightnormal + BDFDB . disCN . marginbottom8 } "> ${ this . getName ( ) } </div><div class="DevilBro-settings-inner"> ` ;
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=" ${ key } " class=" ${ BDFDB . disCNS . switchinnerenabled + BDFDB . disCN . switchinner } " ${ settings [ key ] ? " checked" : "" } ></div></div> ` ;
}
2018-11-25 11:14:48 +01:00
for ( let key in amounts ) {
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 50%; line-height: 38px;"> ${ this . defaults . amounts [ key ] . description } </h3><div class=" ${ BDFDB . disCN . inputwrapper } inputNumberWrapper ${ BDFDB . disCNS . vertical + BDFDB . disCNS . flex + BDFDB . disCNS . directioncolumn } " style="flex: 1 1 auto;"><span class="numberinput-buttons-zone"><span class="numberinput-button-up"></span><span class="numberinput-button-down"></span></span><input type="number" min="0" option=" ${ key } " value=" ${ amounts [ key ] } " class=" ${ BDFDB . disCNS . inputdefault + BDFDB . disCNS . input + BDFDB . disCN . size16 } amountInput"></div></div> ` ;
}
2018-10-11 10:21:26 +02:00
settingshtml += ` </div></div> ` ;
var settingspanel = $ ( settingshtml ) [ 0 ] ;
BDFDB . initElements ( settingspanel ) ;
$ ( settingspanel )
2018-11-25 11:14:48 +01:00
. on ( "click" , BDFDB . dotCN . switchinner , ( ) => { this . updateSettings ( settingspanel ) ; } )
. on ( "input" , ".amountInput" , ( e ) => {
var input = parseInt ( e . currentTarget . value ) ;
if ( ! isNaN ( input ) && input > - 1 ) BDFDB . saveData ( e . currentTarget . getAttribute ( "option" ) , input , this , "amounts" ) ;
} ) ;
2018-10-11 10:21:26 +02:00
return settingspanel ;
}
//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 ) ;
var observer = null ;
observer = new MutationObserver ( ( changes , _ ) => {
changes . forEach (
( change , i ) => {
if ( change . addedNodes ) {
change . addedNodes . forEach ( ( node ) => {
2018-11-08 18:51:41 +01:00
if ( node . tagName && ( node . querySelector ( BDFDB . dotCN . message ) || node . classList . contains ( BDFDB . disCN . message ) ) ) {
2018-10-11 10:21:26 +02:00
this . addDetails ( node ) ;
}
} ) ;
}
}
) ;
} ) ;
BDFDB . addObserver ( this , BDFDB . dotCN . messages , { name : "chatWindowObserver" , instance : observer } , { childList : true , subtree : true } ) ;
observer = new MutationObserver ( ( changes , _ ) => {
changes . forEach (
( change , i ) => {
if ( change . removedNodes ) {
change . removedNodes . forEach ( ( node ) => {
if ( node && $ ( node ) . attr ( "layer-id" ) == "user-settings" && this . updateDetails ) {
document . querySelectorAll ( ".image-details-added" ) . forEach ( image => { this . resetImage ( image ) ; } ) ;
this . addDetails ( document ) ;
this . updateDetails = false ;
}
} ) ;
}
}
) ;
} ) ;
BDFDB . addObserver ( this , BDFDB . dotCN . layers , { name : "settingsWindowObserver" , instance : observer } , { childList : true } ) ;
this . addDetails ( document ) ;
}
else {
console . error ( this . getName ( ) + ": Fatal Error: Could not load BD functions!" ) ;
}
}
stop ( ) {
if ( typeof BDFDB === "object" ) {
document . querySelectorAll ( ".image-details-added" ) . forEach ( image => { this . resetImage ( image ) ; } ) ;
BDFDB . unloadMessage ( this ) ;
}
}
onSwitch ( ) {
if ( typeof BDFDB === "object" ) {
this . addDetails ( document ) ;
BDFDB . addObserver ( this , BDFDB . dotCN . messages , { name : "chatWindowObserver" } , { childList : true , subtree : true } ) ;
}
}
// begin of own functions
updateSettings ( settingspanel ) {
var settings = { } ;
for ( var input of settingspanel . querySelectorAll ( BDFDB . dotCN . switchinner ) ) {
settings [ input . value ] = input . checked ;
}
BDFDB . saveAllData ( settings , this , "settings" ) ;
this . updateDetails = true ;
}
addDetails ( container ) {
let scroller = document . querySelector ( BDFDB . dotCNS . chat + BDFDB . dotCN . messages ) ;
if ( ! container || typeof container . querySelectorAll != "function" || ! scroller ) return ;
var settings = BDFDB . getAllData ( this , "settings" ) ;
container . querySelectorAll ( BDFDB . dotCN . messageaccessory + " > " + BDFDB . dotCN . imagewrapper ) . forEach ( image => {
var data = this . getImageData ( image ) ;
if ( data ) {
image . classList . add ( "image-details-added" ) ;
if ( ! settings . showOnHover ) {
2018-11-08 18:51:41 +01:00
$ ( ` <div class="image-details-wrapper"><div class="image-details"><a class=" ${ BDFDB . disCNS . anchor + BDFDB . disCN . anchorunderlineonhover } image-details-link" title=" ${ data . url } " href=" ${ data . url } " target="_blank" rel="noreferrer noopener"> ${ data . filename } </a><label class="image-details-size ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> ${ BDFDB . formatBytes ( data . size ) } </label><label class="image-details-dimensions ${ BDFDB . disCNS . description + BDFDB . disCNS . formtext + BDFDB . disCNS . note + BDFDB . disCNS . modedefault + BDFDB . disCN . primary } "> ${ data . width } x ${ data . height } px</label></div></div> ` ) . insertBefore ( image ) . append ( image ) ;
2018-10-11 10:21:26 +02:00
scroller . scrollTop += image . parentElement . getBoundingClientRect ( ) . height - image . getBoundingClientRect ( ) . height ;
}
else {
$ ( image ) . on ( "mouseenter." + this . getName ( ) , ( ) => {
2018-11-25 11:14:48 +01:00
BDFDB . createTooltip ( ` <div class="image-details-tooltip-name"> ${ data . filename } </div><div class="image-details-tooltip-size"> ${ BDFDB . formatBytes ( data . size ) } </div><div class="image-details-tooltip-dimensions"> ${ data . width } x ${ data . height } px</div> ` , image , { type : "right" , html : true , selector : "image-details-tooltip" , delay : BDFDB . getData ( "hoverDelay" , this , "amounts" ) } ) ;
2018-10-11 10:21:26 +02:00
} ) ;
}
}
} ) ;
}
resetImage ( image ) {
image . classList . remove ( "image-details-added" ) ;
$ ( image ) . off ( "." + this . getName ( ) ) ;
var wrapper = image . parentElement ;
if ( wrapper . classList . contains ( "image-details-wrapper" ) ) {
wrapper . parentElement . insertBefore ( image , wrapper ) ;
wrapper . remove ( ) ;
}
}
getImageData ( attachment ) {
var messageInfo = BDFDB . getKeyInformation ( { "node" : attachment , "key" : "message" , "up" : true , "time" : 1000 } ) ;
if ( messageInfo ) {
var message = null , temp = attachment ;
while ( message == null || temp . parentElement ) {
temp = temp . parentElement ;
if ( temp . classList && temp . classList . contains ( BDFDB . disCN . message ) ) message = temp ;
}
if ( message ) {
var pos = $ ( message ) . find ( BDFDB . dotCN . imagewrapper ) . index ( attachment ) ;
var info = messageInfo . attachments ;
if ( info && pos > - 1 ) info = info [ pos ] ;
return info ;
}
}
}
}