2020-10-20 23:25:34 +02:00
/ * *
* @ name FriendNotifications
2021-03-05 14:15:25 +01:00
* @ author DevilBro
2020-10-20 23:25:34 +02:00
* @ authorId 278543574059057154
2021-08-12 18:52:55 +02:00
* @ version 1.7 . 7
2021-03-05 14:15:25 +01:00
* @ description Shows a Notification when a Friend or a User , you choose to observe , changes their Status
2020-10-20 23:25:34 +02:00
* @ invite Jx3TjNS
2020-11-19 16:45:36 +01:00
* @ donate https : //www.paypal.me/MircoWittrien
* @ patreon https : //www.patreon.com/MircoWittrien
2021-03-09 15:10:55 +01:00
* @ website https : //mwittrien.github.io/
* @ source https : //github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/FriendNotifications/
2021-03-10 09:17:37 +01:00
* @ updateUrl https : //mwittrien.github.io/BetterDiscordAddons/Plugins/FriendNotifications/FriendNotifications.plugin.js
2020-10-20 23:25:34 +02:00
* /
2018-10-11 10:21:26 +02:00
2020-09-19 20:49:33 +02:00
module . exports = ( _ => {
2020-10-09 21:09:35 +02:00
const config = {
2020-09-19 20:49:33 +02:00
"info" : {
"name" : "FriendNotifications" ,
"author" : "DevilBro" ,
2021-08-12 18:52:55 +02:00
"version" : "1.7.7" ,
2021-03-04 12:15:46 +01:00
"description" : "Shows a Notification when a Friend or a User, you choose to observe, changes their Status"
2020-10-30 16:16:10 +01:00
} ,
2020-10-30 16:15:43 +01:00
"changeLog" : {
2021-08-12 18:52:55 +02:00
"added" : {
"Time Log Option" : "You can now disable the time log for users, in case you only want the time log for your important friends" ,
"Log In Option" : "You can now enable the login option, this will notify you in case a user changed his status from offline to any other status (so enabling only offline and login will only notify you about logout and logins, no notifications about status changes from example online to dnd)"
2021-05-26 23:00:39 +02:00
}
2020-10-30 16:15:43 +01:00
}
2020-02-20 23:12:40 +01:00
} ;
2020-11-13 19:47:44 +01:00
2021-08-11 17:33:29 +02:00
return ( window . Lightcord && ! Node . prototype . isPrototypeOf ( window . Lightcord ) || window . LightCord && ! Node . prototype . isPrototypeOf ( window . LightCord ) ) ? class {
2021-06-15 13:42:02 +02:00
getName ( ) { return config . info . name ; }
getAuthor ( ) { return config . info . author ; }
getVersion ( ) { return config . info . version ; }
getDescription ( ) { return "Do not use LightCord!" ; }
load ( ) { BdApi . alert ( "Attention!" , "By using LightCord you are risking your Discord Account, due to using a 3rd Party Client. Switch to an official Discord Client (https://discord.com/) with the proper BD Injection (https://betterdiscord.app/)" ) ; }
start ( ) { }
stop ( ) { }
} : ! window . BDFDB _Global || ( ! window . BDFDB _Global . loaded && ! window . BDFDB _Global . started ) ? class {
2021-01-06 12:38:36 +01:00
getName ( ) { return config . info . name ; }
getAuthor ( ) { return config . info . author ; }
getVersion ( ) { return config . info . version ; }
2021-02-01 17:13:13 +01:00
getDescription ( ) { return ` The Library Plugin needed for ${ config . info . name } is missing. Open the Plugin Settings to download it. \n \n ${ config . info . description } ` ; }
downloadLibrary ( ) {
require ( "request" ) . get ( "https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js" , ( e , r , b ) => {
2021-03-05 14:15:25 +01:00
if ( ! e && b && r . statusCode == 200 ) require ( "fs" ) . writeFile ( require ( "path" ) . join ( BdApi . Plugins . folder , "0BDFDB.plugin.js" ) , b , _ => BdApi . showToast ( "Finished downloading BDFDB Library" , { type : "success" } ) ) ;
2021-03-06 14:59:48 +01:00
else BdApi . alert ( "Error" , "Could not download BDFDB Library Plugin. Try again later or download it manually from GitHub: https://mwittrien.github.io/downloader/?library" ) ;
2021-02-01 17:13:13 +01:00
} ) ;
}
2020-02-09 14:51:48 +01:00
2021-01-06 12:38:36 +01:00
load ( ) {
2020-11-19 16:51:14 +01:00
if ( ! window . BDFDB _Global || ! Array . isArray ( window . BDFDB _Global . pluginQueue ) ) window . BDFDB _Global = Object . assign ( { } , window . BDFDB _Global , { pluginQueue : [ ] } ) ;
2020-09-19 20:49:33 +02:00
if ( ! window . BDFDB _Global . downloadModal ) {
window . BDFDB _Global . downloadModal = true ;
2021-01-14 16:14:44 +01:00
BdApi . showConfirmationModal ( "Library Missing" , ` The Library Plugin needed for ${ config . info . name } is missing. Please click "Download Now" to install it. ` , {
2020-09-19 20:49:33 +02:00
confirmText : "Download Now" ,
cancelText : "Cancel" ,
onCancel : _ => { delete window . BDFDB _Global . downloadModal ; } ,
2020-09-20 08:15:13 +02:00
onConfirm : _ => {
delete window . BDFDB _Global . downloadModal ;
2021-02-01 17:13:13 +01:00
this . downloadLibrary ( ) ;
2020-09-20 08:15:13 +02:00
}
2020-09-19 20:49:33 +02:00
} ) ;
}
if ( ! window . BDFDB _Global . pluginQueue . includes ( config . info . name ) ) window . BDFDB _Global . pluginQueue . push ( config . info . name ) ;
2020-10-09 21:09:35 +02:00
}
2021-01-06 12:38:36 +01:00
start ( ) { this . load ( ) ; }
stop ( ) { }
getSettingsPanel ( ) {
2020-11-28 23:12:09 +01:00
let template = document . createElement ( "template" ) ;
2021-01-14 16:14:44 +01:00
template . innerHTML = ` <div style="color: var(--header-primary); font-size: 16px; font-weight: 300; white-space: pre; line-height: 22px;">The Library Plugin needed for ${ config . info . name } is missing. \n Please click <a style="font-weight: 500;">Download Now</a> to install it.</div> ` ;
2021-02-01 17:13:13 +01:00
template . content . firstElementChild . querySelector ( "a" ) . addEventListener ( "click" , this . downloadLibrary ) ;
2020-11-28 23:12:09 +01:00
return template . content . firstElementChild ;
}
2020-10-09 21:09:35 +02:00
} : ( ( [ Plugin , BDFDB ] ) => {
2020-09-19 20:49:33 +02:00
var _this ;
2021-04-24 12:50:06 +02:00
var userStatusStore , timeLog , lastTimes , checkInterval ;
2020-12-22 18:45:40 +01:00
var friendCounter , timeLogList ;
2021-06-30 15:38:41 +02:00
var defaultSettings = { } ;
2021-04-24 12:50:06 +02:00
var observedUsers = { } ;
var paginationOffset = { } ;
2020-01-22 13:54:03 +01:00
2021-01-15 21:21:24 +01:00
const statuses = {
online : {
value : true ,
name : "STATUS_ONLINE" ,
sound : true
} ,
idle : {
value : false ,
name : "STATUS_IDLE" ,
sound : true
} ,
dnd : {
value : false ,
name : "STATUS_DND" ,
sound : true
} ,
playing : {
value : false ,
2021-01-20 14:50:09 +01:00
checkActivity : true ,
2021-01-15 21:21:24 +01:00
sound : true
} ,
listening : {
value : false ,
2021-01-20 14:50:09 +01:00
checkActivity : true ,
2021-01-15 21:21:24 +01:00
sound : true
} ,
streaming : {
value : false ,
2021-01-20 14:50:09 +01:00
checkActivity : true ,
2021-01-15 21:21:24 +01:00
sound : true
} ,
offline : {
value : true ,
name : "STATUS_OFFLINE" ,
sound : true
} ,
2021-08-12 18:52:55 +02:00
login : {
value : false
} ,
2021-01-15 21:21:24 +01:00
mobile : {
value : false
} ,
custom : {
value : false
}
} ;
2021-01-02 12:51:18 +01:00
const notificationTypes = {
DISABLED : {
button : null ,
value : 0 ,
color : ""
} ,
TOAST : {
button : 0 ,
value : 1 ,
color : "var(--bdfdb-blurple)"
} ,
DESKTOP : {
button : 2 ,
value : 2 ,
2021-05-17 11:34:32 +02:00
color : "var(--bdfdb-green)"
2021-01-02 12:51:18 +01:00
}
} ;
2020-09-19 20:49:33 +02:00
const FriendOnlineCounterComponent = class FriendOnlineCounter extends BdApi . React . Component {
2021-01-20 16:00:29 +01:00
componentDidMount ( ) {
2020-09-19 20:49:33 +02:00
friendCounter = this ;
2019-12-17 11:15:02 +01:00
}
2021-01-20 16:00:29 +01:00
render ( ) {
2020-09-19 20:49:33 +02:00
return BDFDB . ReactUtils . createElement ( "div" , {
2021-03-30 11:18:14 +02:00
className : BDFDB . disCNS . guildouter + BDFDB . disCN . _friendnotificationsfriendsonlinewrap ,
2020-09-19 20:49:33 +02:00
children : BDFDB . ReactUtils . createElement ( "div" , {
className : BDFDB . disCNS . guildslabel + BDFDB . disCN . _friendnotificationsfriendsonline ,
children : BDFDB . LanguageUtils . LanguageStringsFormat ( "FRIENDS_ONLINE_HEADER" , this . props . amount ) ,
2021-03-16 15:16:36 +01:00
onClick : _ => _this . showTimeLog ( )
2020-09-19 20:49:33 +02:00
} )
} ) ;
}
} ;
2020-12-22 18:45:40 +01:00
const TimeLogComponent = class TimeLog extends BdApi . React . Component {
2021-01-20 16:00:29 +01:00
componentDidMount ( ) {
2020-12-22 18:45:40 +01:00
timeLogList = this ;
}
2021-01-20 16:00:29 +01:00
render ( ) {
2020-12-22 18:45:40 +01:00
return this . props . entries . length ? BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . PaginatedList , {
items : this . props . entries ,
2021-03-17 09:36:59 +01:00
amount : 50 ,
2020-12-22 18:45:40 +01:00
copyToBottom : true ,
renderItem : ( log , i ) => [
i > 0 ? BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . FormComponents . FormDivider , {
className : BDFDB . disCNS . margintop8 + BDFDB . disCN . marginbottom8
} ) : null ,
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
align : BDFDB . LibraryComponents . Flex . Align . CENTER ,
children : [
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . TextElement , {
className : BDFDB . disCN . _friendnotificationslogtime ,
2021-04-24 15:13:50 +02:00
children : BDFDB . LibraryComponents . DateInput . format ( _this . settings . dates . logDate , log . timestamp )
2020-12-22 18:45:40 +01:00
} ) ,
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . AvatarComponents . default , {
className : BDFDB . disCN . _friendnotificationslogavatar ,
src : log . avatar ,
size : BDFDB . LibraryComponents . AvatarComponents . Sizes . SIZE _40
} ) ,
2021-04-14 16:44:59 +02:00
_this . createStatusDot ( log . status , log . mobile , { marginRight : 6 } ) ,
2021-05-19 17:18:28 +02:00
BDFDB . ReactUtils . createElement ( "div" , {
2020-12-22 18:45:40 +01:00
className : BDFDB . disCN . _friendnotificationslogcontent ,
2021-05-19 17:18:28 +02:00
children : BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . TextElement , {
children : BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . TextScroller , {
speed : 1 ,
2021-04-13 18:25:20 +02:00
children : BDFDB . ReactUtils . elementToReact ( BDFDB . DOMUtils . create ( log . string ) )
} )
2020-12-22 18:45:40 +01:00
} )
2021-04-14 16:28:46 +02:00
} )
2020-12-22 18:45:40 +01:00
]
} )
]
} ) : BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . MessagesPopoutComponents . EmptyStateBottom , {
msg : BDFDB . LanguageUtils . LanguageStrings . AUTOCOMPLETE _NO _RESULTS _HEADER ,
image : BDFDB . DiscordUtils . getTheme ( ) == BDFDB . disCN . themelight ? "/assets/9b0d90147f7fab54f00dd193fe7f85cd.svg" : "/assets/308e587f3a68412f137f7317206e92c2.svg"
2021-05-19 17:18:28 +02:00
} ) ;
2020-12-22 18:45:40 +01:00
}
} ;
2020-09-19 20:49:33 +02:00
2020-10-09 21:09:35 +02:00
return class FriendNotifications extends Plugin {
2021-01-06 12:38:36 +01:00
onLoad ( ) {
2020-09-19 20:49:33 +02:00
_this = this ;
userStatusStore = { } ;
timeLog = [ ] ;
lastTimes = { } ;
friendCounter = null ;
2019-09-04 12:34:02 +02:00
2020-09-19 20:49:33 +02:00
this . defaults = {
2021-04-24 12:50:06 +02:00
general : {
addOnlineCount : { value : true , description : "Add an Online Friend Counter to the Server List (Click to open Time Log)" } ,
2021-01-02 12:51:18 +01:00
showDiscriminator : { value : false , description : "Add the User Discriminator" } ,
2021-04-24 12:50:06 +02:00
muteOnDND : { value : false , description : "Do not notify me when I am in DnD Status" } ,
2020-11-19 16:51:14 +01:00
openOnClick : { value : false , description : "Open the DM when you click a Notification" }
2020-07-06 13:34:43 +02:00
} ,
2021-04-24 12:50:06 +02:00
notificationStrings : {
2021-01-15 21:21:24 +01:00
online : { value : "$user changed status to '$status'" } ,
idle : { value : "$user changed status to '$status'" } ,
dnd : { value : "$user changed status to '$status'" } ,
playing : { value : "$user started playing '$game'" } ,
listening : { value : "$user started listening to '$song'" } ,
streaming : { value : "$user started streaming '$game'" } ,
offline : { value : "$user changed status to '$status'" } ,
2021-08-12 18:52:55 +02:00
login : { value : "$user just logged in '$status'" } ,
2021-01-15 21:21:24 +01:00
custom : { value : "$user changed status to '$custom'" }
2020-02-09 14:51:48 +01:00
} ,
2021-04-24 12:50:06 +02:00
notificationSounds : { } ,
2021-03-16 15:16:36 +01:00
dates : {
logDate : { value : { } , description : "Log Timestamp" } ,
} ,
2020-09-19 20:49:33 +02:00
amounts : {
2021-01-02 12:51:18 +01:00
toastTime : { value : 5 , min : 1 , description : "Amount of Seconds a Toast Notification stays on Screen: " } ,
checkInterval : { value : 10 , min : 5 , description : "Check Users every X Seconds: " }
2020-02-09 14:51:48 +01:00
}
2020-09-19 20:49:33 +02:00
} ;
2020-02-09 14:51:48 +01:00
2020-09-19 20:49:33 +02:00
this . patchedModules = {
after : {
Guilds : "render"
}
} ;
this . css = `
$ { BDFDB . dotCN . _friendnotificationslogtime } {
2021-03-16 15:16:36 +01:00
flex : 0 1 auto ;
min - width : 160 px ;
2020-09-19 20:49:33 +02:00
}
$ { BDFDB . dotCN . _friendnotificationslogavatar } {
margin : 0 10 px ;
}
$ { BDFDB . dotCN . _friendnotificationslogcontent } {
max - width : 600 px ;
2021-04-13 18:25:20 +02:00
overflow : hidden ;
2020-09-19 20:49:33 +02:00
}
$ { BDFDB . dotCN . _friendnotificationstypelabel } {
border - radius : 3 px ;
padding : 0 3 px ;
margin : 0 6 px ;
}
$ { BDFDB . dotCN . _friendnotificationsfriendsonline } {
cursor : pointer ;
2020-02-09 14:51:48 +01:00
}
2020-12-22 18:45:40 +01:00
$ { BDFDB . dotCNS . _friendnotificationstimelogmodal + BDFDB . dotCN . messagespopoutemptyplaceholder } {
position : absolute ;
bottom : 0 ;
width : 100 % ;
}
2020-09-19 20:49:33 +02:00
` ;
2021-01-15 21:21:24 +01:00
for ( let type in statuses ) if ( statuses [ type ] . sound ) {
2021-04-24 12:50:06 +02:00
this . defaults . notificationSounds [ "toast" + type ] = { value : { url : null , song : null , mute : false } } ;
this . defaults . notificationSounds [ "desktop" + type ] = { value : { url : null , song : null , mute : false } } ;
2020-02-09 14:51:48 +01:00
}
}
2021-06-30 15:38:41 +02:00
onStart ( ) {
2020-09-19 20:49:33 +02:00
this . startInterval ( ) ;
2021-06-30 15:38:41 +02:00
this . forceUpdateAll ( ) ;
2020-09-19 20:49:33 +02:00
}
2020-02-09 14:51:48 +01:00
2021-01-06 12:38:36 +01:00
onStop ( ) {
2020-09-19 20:49:33 +02:00
BDFDB . TimeUtils . clear ( checkInterval ) ;
2021-06-30 15:38:41 +02:00
this . forceUpdateAll ( ) ;
}
forceUpdateAll ( ) {
2021-08-12 18:52:55 +02:00
defaultSettings = Object . assign ( BDFDB . ObjectUtils . map ( statuses , status => notificationTypes [ status . value ? "TOAST" : "DISABLED" ] . value ) , { timelog : true } , BDFDB . DataUtils . load ( this , "defaultSettings" ) ) ;
2020-09-19 20:49:33 +02:00
BDFDB . PatchUtils . forceAllUpdates ( this ) ;
}
2020-11-23 20:56:13 +01:00
getSettingsPanel ( collapseStates = { } ) {
2021-01-02 12:51:18 +01:00
let changeAllConfigs = ( type , config , notificationType ) => {
2021-04-24 12:50:06 +02:00
let observed = this . getObservedData ( ) ;
let specificObserved = observed [ type ] || { } ;
2021-01-02 12:51:18 +01:00
if ( config == "all" ) {
config = "disabled" ;
2021-08-12 18:52:55 +02:00
const value = notificationTypes [ notificationType ] . button == 0 ? false : true ;
for ( let id in specificObserved ) specificObserved [ id ] [ config ] = value ;
}
else if ( config == "timelog" ) {
const value = notificationType == "TOAST" ? notificationTypes . TOAST . value : notificationTypes . DISABLED . value ;
for ( let id in specificObserved ) specificObserved [ id ] [ config ] = value ;
2021-01-02 12:51:18 +01:00
}
else {
2021-04-24 12:50:06 +02:00
let disabled = BDFDB . ObjectUtils . toArray ( specificObserved ) . every ( d => ! d . disabled && d [ config ] == notificationTypes [ notificationType ] . value ) ;
for ( let id in specificObserved ) specificObserved [ id ] [ config ] = notificationTypes [ disabled ? "DISABLED" : notificationType ] . value ;
2020-09-19 20:49:33 +02:00
}
2021-04-24 12:50:06 +02:00
observed [ type ] = specificObserved
BDFDB . DataUtils . save ( observed , this , "observed" , BDFDB . UserUtils . me . id ) ;
2020-09-19 20:49:33 +02:00
this . SettingsUpdated = true ;
BDFDB . PluginUtils . refreshSettingsPanel ( this , settingsPanel , collapseStates ) ;
} ;
let successSavedAudio = ( type , parsedUrl , parsedData ) => {
2020-11-19 16:51:14 +01:00
if ( parsedUrl && parsedData ) BDFDB . NotificationUtils . toast ( ` Sound was saved successfully. ` , { type : "success" } ) ;
2021-04-24 12:50:06 +02:00
this . settings . notificationSounds [ type ] . url = parsedUrl ;
this . settings . notificationSounds [ type ] . song = parsedData ;
BDFDB . DataUtils . save ( this . settings . notificationSounds , this , "notificationSounds" ) ;
2020-09-19 20:49:33 +02:00
this . SettingsUpdated = true ;
} ;
let createUserList = ( users , type , title ) => {
let items = [ ] ;
items . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
2020-11-25 17:37:22 +01:00
className : BDFDB . disCNS . settingsrowtitle + BDFDB . disCNS . settingsrowtitledefault + BDFDB . disCN . cursordefault ,
2020-02-09 14:51:48 +01:00
children : [
2021-01-02 12:51:18 +01:00
"Click on an Option to toggle" ,
2020-09-19 20:49:33 +02:00
BDFDB . ReactUtils . createElement ( "span" , {
className : BDFDB . disCN . _friendnotificationstypelabel ,
2020-12-16 16:35:56 +01:00
style : { backgroundColor : "var(--bdfdb-blurple)" } ,
2020-09-19 20:49:33 +02:00
children : "Toast"
} ) ,
2021-05-26 14:09:31 +02:00
"Notifications for that User"
2020-02-09 14:51:48 +01:00
]
2020-09-19 20:49:33 +02:00
} ) ) ;
if ( "Notification" in window ) items . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
2020-11-25 17:37:22 +01:00
className : BDFDB . disCNS . settingsrowtitle + BDFDB . disCNS . settingsrowtitledefault + BDFDB . disCN . cursordefault ,
2020-02-09 14:51:48 +01:00
children : [
2021-01-02 12:51:18 +01:00
"Right-Click on an Option to toggle" ,
2020-09-19 20:49:33 +02:00
BDFDB . ReactUtils . createElement ( "span" , {
className : BDFDB . disCN . _friendnotificationstypelabel ,
2021-05-26 14:09:31 +02:00
style : { backgroundColor : "var(--bdfdb-green)" } ,
2020-09-19 20:49:33 +02:00
children : "Desktop"
2020-02-09 14:51:48 +01:00
} ) ,
2021-05-26 14:09:31 +02:00
"Notifications for that User"
]
} ) ) ;
items . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
className : BDFDB . disCNS . settingsrowtitle + BDFDB . disCNS . settingsrowtitledefault + BDFDB . disCN . cursordefault ,
style : { marginTop : 6 } ,
children : [
"Click on an Option Header to toggle" ,
BDFDB . ReactUtils . createElement ( "span" , {
className : BDFDB . disCN . _friendnotificationstypelabel ,
style : { backgroundColor : "var(--bdfdb-blurple)" } ,
children : "Toast"
} ) ,
"Notifications for all Users"
]
} ) ) ;
if ( "Notification" in window ) items . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
className : BDFDB . disCNS . settingsrowtitle + BDFDB . disCNS . settingsrowtitledefault + BDFDB . disCN . cursordefault ,
children : [
"Right-Click on an Option Header to toggle" ,
BDFDB . ReactUtils . createElement ( "span" , {
className : BDFDB . disCN . _friendnotificationstypelabel ,
style : { backgroundColor : "var(--bdfdb-green)" } ,
children : "Desktop"
} ) ,
"Notifications for all Users"
]
} ) ) ;
items . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
className : BDFDB . disCNS . settingsrowtitle + BDFDB . disCNS . settingsrowtitledefault + BDFDB . disCN . cursordefault ,
style : { marginTop : 6 } ,
children : "Click on an Avatar to toggle between enabled/disabled"
} ) ) ;
if ( "Notification" in window ) items . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
className : BDFDB . disCNS . settingsrowtitle + BDFDB . disCNS . settingsrowtitledefault + BDFDB . disCN . cursordefault ,
children : [
"Right-Click on an Avatar to toggle all Options between" ,
BDFDB . ReactUtils . createElement ( "span" , {
className : BDFDB . disCN . _friendnotificationstypelabel ,
style : { backgroundColor : "var(--bdfdb-blurple)" } ,
children : "Toast"
} ) ,
"/" ,
BDFDB . ReactUtils . createElement ( "span" , {
className : BDFDB . disCN . _friendnotificationstypelabel ,
style : { backgroundColor : "var(--bdfdb-green)" } ,
children : "Desktop"
} )
2020-09-19 20:49:33 +02:00
]
} ) ) ;
items . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsList , {
className : BDFDB . disCN . margintop20 ,
2021-01-02 12:51:18 +01:00
title : "all" ,
2021-08-12 18:52:55 +02:00
settings : Object . keys ( statuses ) . concat ( "timelog" ) ,
2020-09-19 20:49:33 +02:00
data : users ,
pagination : {
alphabetKey : "username" ,
amount : 50 ,
offset : paginationOffset [ title ] || 0 ,
2021-08-12 18:52:55 +02:00
onJump : offset => paginationOffset [ title ] = offset
2020-09-19 20:49:33 +02:00
} ,
2021-01-02 12:51:18 +01:00
getCheckboxColor : value => {
let color = ( BDFDB . ObjectUtils . toArray ( notificationTypes ) . find ( n => n . value == value ) || { } ) . color ;
return BDFDB . DiscordConstants . Colors [ color ] || color ;
} ,
2021-08-12 18:52:55 +02:00
getCheckboxValue : ( value , event , instance ) => {
if ( instance && instance . props . settingId == "timelog" ) {
return value == notificationTypes . DISABLED . value ? notificationTypes . TOAST . value : notificationTypes . DISABLED . value ;
}
else {
let eventValue = ( BDFDB . ObjectUtils . toArray ( notificationTypes ) . find ( n => n . button == event . button ) || { } ) . value ;
return eventValue == value ? 0 : eventValue ;
}
2021-01-02 12:51:18 +01:00
} ,
2021-04-24 12:50:06 +02:00
renderLabel : cardData => [
2020-09-19 20:49:33 +02:00
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . AvatarComponents . default , {
2021-04-24 12:50:06 +02:00
className : BDFDB . DOMUtils . formatClassName ( BDFDB . disCN . listavatar , cardData . disabled && BDFDB . disCN . avatardisabled ) ,
src : BDFDB . UserUtils . getAvatar ( cardData . id ) ,
status : BDFDB . UserUtils . getStatus ( cardData . id ) ,
2020-09-19 20:49:33 +02:00
size : BDFDB . LibraryComponents . AvatarComponents . Sizes . SIZE _40 ,
2021-04-24 12:50:06 +02:00
onClick : _ => {
let observed = this . getObservedData ( ) ;
2021-06-30 15:38:41 +02:00
let data = observed [ type ] [ cardData . id ] || Object . assign ( { } , defaultSettings ) ;
2021-04-24 12:50:06 +02:00
data . disabled = ! data . disabled ;
observed [ type ] [ data . id ] = data ;
BDFDB . DataUtils . save ( observed , this , "observed" , BDFDB . UserUtils . me . id ) ;
2021-01-02 12:51:18 +01:00
this . SettingsUpdated = true ;
2021-05-26 14:09:31 +02:00
BDFDB . PluginUtils . refreshSettingsPanel ( this , settingsPanel , collapseStates ) ;
} ,
onContextMenu : _ => {
let observed = this . getObservedData ( ) ;
2021-06-30 15:38:41 +02:00
let data = observed [ type ] [ cardData . id ] || Object . assign ( { } , defaultSettings ) ;
2021-05-26 14:09:31 +02:00
let batchType ;
for ( let config in statuses ) {
if ( data [ config ] == notificationTypes . TOAST . value ) batchType = notificationTypes . DESKTOP . value ;
else if ( data [ config ] == notificationTypes . DESKTOP . value ) batchType = notificationTypes . TOAST . value ;
if ( batchType != undefined ) break ;
}
for ( let config in statuses ) if ( data [ config ] != notificationTypes . DISABLED . value ) data [ config ] = batchType ;
observed [ type ] [ data . id ] = data ;
BDFDB . DataUtils . save ( observed , this , "observed" , BDFDB . UserUtils . me . id ) ;
this . SettingsUpdated = true ;
2021-01-02 12:51:18 +01:00
BDFDB . PluginUtils . refreshSettingsPanel ( this , settingsPanel , collapseStates ) ;
2020-02-09 14:51:48 +01:00
}
2020-09-19 20:49:33 +02:00
} ) ,
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . TextScroller , {
2021-04-24 12:50:06 +02:00
children : cardData . username
2020-02-09 14:51:48 +01:00
} )
2020-09-19 20:49:33 +02:00
] ,
2021-04-24 12:50:06 +02:00
onHeaderClick : config => {
2021-01-02 12:51:18 +01:00
changeAllConfigs ( type , config , "TOAST" ) ;
2020-09-19 20:49:33 +02:00
} ,
2021-04-24 12:50:06 +02:00
onHeaderContextMenu : config => {
2021-01-02 12:51:18 +01:00
changeAllConfigs ( type , config , "DESKTOP" ) ;
2020-09-19 20:49:33 +02:00
} ,
onCheckboxChange : ( value , instance ) => {
2021-04-24 12:50:06 +02:00
let observed = this . getObservedData ( ) ;
2021-06-30 15:38:41 +02:00
let data = observed [ type ] [ instance . props . cardId ] || Object . assign ( { } , defaultSettings ) ;
2020-09-19 20:49:33 +02:00
data [ instance . props . settingId ] = value ;
2021-04-24 12:50:06 +02:00
observed [ type ] [ instance . props . cardId ] = data ;
BDFDB . DataUtils . save ( observed , this , "observed" , BDFDB . UserUtils . me . id ) ;
2020-09-19 20:49:33 +02:00
this . SettingsUpdated = true ;
} ,
noRemove : type == "friends" ,
onRemove : ( e , instance ) => {
2021-04-24 12:50:06 +02:00
let observed = this . getObservedData ( ) ;
delete observed [ type ] [ instance . props . cardId ] ;
BDFDB . DataUtils . save ( observed , this , "observed" , BDFDB . UserUtils . me . id ) ;
2020-09-19 20:49:33 +02:00
BDFDB . PluginUtils . refreshSettingsPanel ( this , settingsPanel , collapseStates ) ;
this . SettingsUpdated = true ;
}
} ) ) ;
return BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . CollapseContainer , {
title : title ,
collapseStates : collapseStates ,
2020-10-30 16:15:43 +01:00
dividerTop : true ,
2020-09-19 20:49:33 +02:00
children : items
} ) ;
} ;
2020-11-23 20:56:13 +01:00
let settingsPanel ;
return settingsPanel = BDFDB . PluginUtils . createSettingsPanel ( this , {
collapseStates : collapseStates ,
children : _ => {
2021-04-24 12:50:06 +02:00
let settingsItems = [ ] ;
2020-11-23 20:56:13 +01:00
2021-04-24 12:50:06 +02:00
let observed = this . getObservedData ( ) ;
let friendIds = BDFDB . LibraryModules . RelationshipStore . getFriendIDs ( ) ;
2020-11-23 20:58:41 +01:00
2020-11-23 20:56:13 +01:00
settingsItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . CollapseContainer , {
title : "Settings" ,
collapseStates : collapseStates ,
2021-04-24 12:50:06 +02:00
children : [
Object . keys ( this . defaults . general ) . map ( key => BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsSaveItem , {
type : "Switch" ,
plugin : this ,
keys : [ "general" , key ] ,
label : this . defaults . general [ key ] . description ,
value : this . settings . general [ key ]
} ) ) ,
Object . keys ( this . defaults . dates ) . map ( key => BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . DateInput , {
... ( this . settings . dates [ key ] || { } ) ,
label : this . defaults . dates [ key ] . description ,
onChange : valueObj => {
this . SettingsUpdated = true ;
this . settings . dates [ key ] = valueObj ;
BDFDB . DataUtils . save ( this . settings . dates , this , "dates" ) ;
}
} ) ) ,
Object . keys ( this . defaults . amounts ) . map ( key => ( key . indexOf ( "desktop" ) == - 1 || "Notification" in window ) && BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsSaveItem , {
type : "TextInput" ,
childProps : {
type : "number"
} ,
plugin : this ,
keys : [ "amounts" , key ] ,
label : this . defaults . amounts [ key ] . description ,
basis : "20%" ,
min : this . defaults . amounts [ key ] . min ,
max : this . defaults . amounts [ key ] . max ,
value : this . settings . amounts [ key ]
} ) )
]
2020-11-23 20:56:13 +01:00
} ) ) ;
2021-06-30 15:38:41 +02:00
settingsItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . CollapseContainer , {
title : "Default Settings for new Users" ,
collapseStates : collapseStates ,
children : [ "disabled" ] . concat ( Object . keys ( defaultSettings ) ) . map ( key => BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsItem , {
type : "Switch" ,
label : BDFDB . LibraryModules . StringUtils . upperCaseFirstChar ( key ) ,
value : ! ! defaultSettings [ key ] ,
onChange : value => {
defaultSettings [ key ] = ! ! statuses [ key ] ? notificationTypes [ value ? "TOAST" : "DISABLED" ] . value : value ;
BDFDB . DataUtils . save ( defaultSettings , this , "defaultSettings" ) ;
}
} ) )
} ) ) ;
2021-04-24 12:50:06 +02:00
let friendCards = Object . keys ( observed . friends ) . map ( BDFDB . LibraryModules . UserStore . getUser ) . filter ( n => n ) ;
let strangerCards = Object . keys ( observed . strangers ) . map ( BDFDB . LibraryModules . UserStore . getUser ) . filter ( n => n ) ;
if ( friendCards . length ) settingsItems . push ( createUserList ( friendCards . map ( user => Object . assign ( { } , user , observed . friends [ user . id ] , {
key : user . id ,
className : observed . friends [ user . id ] . disabled ? BDFDB . disCN . hovercarddisabled : ""
} ) ) , "friends" , "Friend-List" ) ) ;
2020-11-23 20:58:41 +01:00
2021-02-15 15:28:41 +01:00
let strangerId = "" ;
2020-11-23 20:56:13 +01:00
settingsItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . CollapseContainer , {
title : "Add new Stranger" ,
collapseStates : collapseStates ,
children : BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
className : BDFDB . disCN . margintop8 ,
align : BDFDB . LibraryComponents . Flex . Align . CENTER ,
children : [
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex . Child , {
children : BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . TextInput , {
placeholder : "user (id or name#discriminator)" ,
2021-02-15 15:28:41 +01:00
value : "" ,
onChange : value => strangerId = value
2020-11-23 20:56:13 +01:00
} )
} ) ,
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Button , {
onClick : _ => {
2021-02-15 15:28:41 +01:00
let userId = strangerId . trim ( ) ;
2021-01-24 13:27:39 +01:00
if ( userId == BDFDB . UserUtils . me . id ) BDFDB . NotificationUtils . toast ( "Are you seriously trying to stalk yourself?" , { type : "danger" } ) ;
2021-04-24 12:50:06 +02:00
else if ( friendIds . includes ( userId ) ) BDFDB . NotificationUtils . toast ( "User is already a Friend of yours, please use the 'Friend-List' Area to configure them" , { type : "danger" } ) ;
else if ( observed . strangers [ userId ] ) BDFDB . NotificationUtils . toast ( "User is already being observed as a 'Stranger'" , { type : "danger" } ) ;
2020-11-23 20:56:13 +01:00
else {
let user = /.+#[0-9]{4}/ . test ( userId ) ? BDFDB . LibraryModules . UserStore . findByTag ( userId . split ( "#" ) . slice ( 0 , - 1 ) . join ( "#" ) , userId . split ( "#" ) . pop ( ) ) : BDFDB . LibraryModules . UserStore . getUser ( userId ) ;
if ( user ) {
2021-06-30 15:38:41 +02:00
observed . strangers [ user . id || userId ] = Object . assign ( { } , defaultSettings ) ;
2021-04-24 12:50:06 +02:00
BDFDB . DataUtils . save ( observed , this , "observed" , BDFDB . UserUtils . me . id ) ;
2020-11-23 20:56:13 +01:00
BDFDB . PluginUtils . refreshSettingsPanel ( this , settingsPanel , collapseStates ) ;
this . SettingsUpdated = true ;
}
2021-04-24 12:50:06 +02:00
else BDFDB . NotificationUtils . toast ( "Please enter a valid ID of a User that has been loaded in your Client" , { type : "danger" } ) ;
2020-11-23 20:56:13 +01:00
}
} ,
children : BDFDB . LanguageUtils . LanguageStrings . ADD
} )
]
2020-02-09 14:51:48 +01:00
} )
2020-11-23 20:56:13 +01:00
} ) ) ;
2020-11-23 20:58:41 +01:00
2021-04-24 12:50:06 +02:00
if ( strangerCards . length ) settingsItems . push ( createUserList ( strangerCards . map ( user => Object . assign ( { } , user , observed . strangers [ user . id ] , {
key : user . id ,
className : observed . strangers [ user . id ] . disabled ? BDFDB . disCN . hovercarddisabled : ""
} ) ) , "strangers" , "Stranger-List" ) ) ;
2020-11-23 20:58:41 +01:00
2020-11-23 20:56:13 +01:00
settingsItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . CollapseContainer , {
title : "Notification Messages" ,
collapseStates : collapseStates ,
children : [ BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
className : BDFDB . disCN . marginbottom8 ,
children : BDFDB . ReactUtils . createElement ( "div" , {
2020-12-22 18:45:40 +01:00
className : BDFDB . disCNS . settingsrowtitle + BDFDB . disCNS . settingsrowtitle + BDFDB . disCNS . settingsrowtitledefault + BDFDB . disCN . cursordefault ,
2020-11-23 20:56:13 +01:00
children : [
2021-02-09 17:03:52 +01:00
"Allows you to configure your own Message Strings for the different Statuses. " ,
2020-11-23 20:56:13 +01:00
BDFDB . ReactUtils . createElement ( "strong" , { children : "$user" } ) ,
2021-02-09 17:03:52 +01:00
" is the Placeholder for the User Name, " ,
2020-11-23 20:56:13 +01:00
BDFDB . ReactUtils . createElement ( "strong" , { children : "$status" } ) ,
2021-02-09 17:03:52 +01:00
" for the Status Name, " ,
BDFDB . ReactUtils . createElement ( "strong" , { children : "$statusOld" } ) ,
" for the previous Status Name, " ,
2021-01-15 21:21:24 +01:00
BDFDB . ReactUtils . createElement ( "strong" , { children : "$custom" } ) ,
2021-02-09 17:03:52 +01:00
" for the Custom Status, " ,
2020-11-23 20:56:13 +01:00
BDFDB . ReactUtils . createElement ( "strong" , { children : "$game" } ) ,
2021-02-09 17:03:52 +01:00
" for the Game Name, " ,
2020-11-23 20:56:13 +01:00
BDFDB . ReactUtils . createElement ( "strong" , { children : "$song" } ) ,
2021-02-09 17:03:52 +01:00
" for the Song Name and " ,
2020-11-23 20:56:13 +01:00
BDFDB . ReactUtils . createElement ( "strong" , { children : "$artist" } ) ,
2021-02-09 17:03:52 +01:00
" for the Song Artist."
2020-11-23 20:56:13 +01:00
]
2020-09-19 20:49:33 +02:00
} )
2021-04-24 12:50:06 +02:00
} ) ] . concat ( Object . keys ( this . defaults . notificationStrings ) . map ( key => BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsSaveItem , {
2020-11-23 20:56:13 +01:00
type : "TextInput" ,
plugin : this ,
2021-04-24 12:50:06 +02:00
keys : [ "notificationStrings" , key ] ,
placeholder : this . defaults . notificationStrings [ key ] . value ,
label : BDFDB . LibraryModules . StringUtils . upperCaseFirstChar ( key ) ,
2021-01-15 21:21:24 +01:00
basis : "80%" ,
2021-04-24 12:50:06 +02:00
value : this . settings . notificationStrings [ key ]
2020-11-23 20:56:13 +01:00
} ) ) )
} ) ) ;
2020-11-23 20:58:41 +01:00
2020-11-23 20:56:13 +01:00
settingsItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . CollapseContainer , {
title : "Notification Sounds" ,
collapseStates : collapseStates ,
2021-04-24 12:50:06 +02:00
children : Object . keys ( this . defaults . notificationSounds ) . map ( ( key , i ) => ( key . indexOf ( "desktop" ) == - 1 || "Notification" in window ) && [
2020-11-23 20:56:13 +01:00
i != 0 && key . indexOf ( "toast" ) == 0 && BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . FormComponents . FormDivider , {
className : BDFDB . disCN . marginbottom8
} ) ,
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
className : BDFDB . disCN . marginbottom8 ,
align : BDFDB . LibraryComponents . Flex . Align . CENTER ,
direction : BDFDB . LibraryComponents . Flex . Direction . HORIZONTAL ,
children : [
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsLabel , {
2021-04-24 12:50:06 +02:00
label : ` ${ key . split ( /(desktop)|(toast)/ ) . filter ( n => n ) . map ( n => BDFDB . LibraryModules . StringUtils . upperCaseFirstChar ( n ) ) . join ( "-" ) } Notification Sound ` ,
2020-11-23 20:56:13 +01:00
} ) ,
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsItem , {
type : "Switch" ,
mini : true ,
grow : 0 ,
label : "Mute:" ,
2021-04-24 12:50:06 +02:00
value : this . settings . notificationSounds [ key ] . mute ,
2020-11-23 20:56:13 +01:00
onChange : value => {
2021-04-24 12:50:06 +02:00
this . settings . notificationSounds [ key ] . mute = value ;
BDFDB . DataUtils . save ( this . settings . notificationSounds , this , "notificationSounds" ) ;
2020-11-23 20:56:13 +01:00
}
} )
] . filter ( n => n )
2020-09-19 20:49:33 +02:00
} ) ,
2020-11-23 20:56:13 +01:00
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
className : BDFDB . disCN . marginbottom8 ,
align : BDFDB . LibraryComponents . Flex . Align . CENTER ,
children : [
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex . Child , {
children : BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . TextInput , {
className : ` input- ${ key } src ` ,
type : "file" ,
filter : [ "audio" , "video" ] ,
useFilePath : true ,
2021-04-24 12:50:06 +02:00
placeholder : "Url or File Path" ,
value : this . settings . notificationSounds [ key ] . url
2020-11-23 20:56:13 +01:00
} )
} ) ,
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Button , {
onClick : _ => {
let source = settingsPanel . props . _node . querySelector ( ` .input- ${ key } src ` + BDFDB . dotCN . input ) . value . trim ( ) ;
if ( ! source . length ) {
2021-04-24 12:50:06 +02:00
BDFDB . NotificationUtils . toast ( ` Sound File was removed. ` , { type : "warning" } ) ;
2020-09-19 20:49:33 +02:00
successSavedAudio ( key , source , source ) ;
}
2020-11-23 20:56:13 +01:00
else if ( source . indexOf ( "http" ) == 0 ) BDFDB . LibraryRequires . request ( source , ( error , response , result ) => {
if ( response ) {
let type = response . headers [ "content-type" ] ;
if ( type && ( type . indexOf ( "octet-stream" ) > - 1 || type . indexOf ( "audio" ) > - 1 || type . indexOf ( "video" ) > - 1 ) ) {
successSavedAudio ( key , source , source ) ;
return ;
}
}
2021-04-24 12:50:06 +02:00
BDFDB . NotificationUtils . toast ( "Use a valid direct Link to a Video or Audio Source, they usually end on something like .mp3, .mp4 or .wav" , { type : "danger" } ) ;
2020-11-23 20:56:13 +01:00
} ) ;
else BDFDB . LibraryRequires . fs . readFile ( source , ( error , response ) => {
2021-04-24 12:50:06 +02:00
if ( error ) BDFDB . NotificationUtils . toast ( "Could not fetch File, please make sure the File exists" , { type : "danger" } ) ;
2020-11-23 20:56:13 +01:00
else successSavedAudio ( key , source , ` data:audio/mpeg;base64, ${ response . toString ( "base64" ) } ` ) ;
} ) ;
} ,
children : BDFDB . LanguageUtils . LanguageStrings . SAVE
} )
]
2020-09-19 20:49:33 +02:00
} )
2020-11-23 20:56:13 +01:00
] ) . flat ( 10 ) . filter ( n => n )
} ) ) ;
2021-04-24 12:50:06 +02:00
settingsItems . push ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . CollapseContainer , {
title : "LogIn/-Out Timelog" ,
collapseStates : collapseStates ,
children : BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SettingsItem , {
type : "Button" ,
label : "Overview of LogIns/-Outs of current Session" ,
2021-08-12 18:52:55 +02:00
onClick : _ => this . showTimeLog ( ) ,
2021-04-24 12:50:06 +02:00
children : "Timelog"
} )
} ) ) ;
2020-11-23 20:56:13 +01:00
return settingsItems ;
}
} ) ;
2020-02-09 14:51:48 +01:00
}
2019-01-26 22:45:19 +01:00
2021-01-06 12:38:36 +01:00
onSettingsClosed ( ) {
2020-09-19 20:49:33 +02:00
if ( this . SettingsUpdated ) {
delete this . SettingsUpdated ;
this . startInterval ( ) ;
2021-06-30 15:38:41 +02:00
this . forceUpdateAll ( ) ;
2020-09-19 20:49:33 +02:00
}
2020-02-09 14:51:48 +01:00
}
2021-04-13 18:25:20 +02:00
2020-09-19 20:49:33 +02:00
processGuilds ( e ) {
2021-04-24 12:50:06 +02:00
if ( this . settings . general . addOnlineCount ) {
2020-10-30 16:15:43 +01:00
if ( typeof e . returnvalue . props . children == "function" ) {
let childrenRender = e . returnvalue . props . children ;
2021-07-05 16:33:10 +02:00
e . returnvalue . props . children = BDFDB . TimeUtils . suppress ( ( ... args ) => {
2020-10-30 16:15:43 +01:00
let children = childrenRender ( ... args ) ;
2020-11-16 10:00:48 +01:00
this . checkTree ( children ) ;
2020-10-30 16:15:43 +01:00
return children ;
2021-07-05 16:33:10 +02:00
} , "" , this ) ;
2020-10-30 16:15:43 +01:00
}
2020-11-16 10:00:48 +01:00
else this . checkTree ( e . returnvalue ) ;
2020-09-19 20:49:33 +02:00
}
2020-02-20 23:12:40 +01:00
}
2020-11-16 10:00:48 +01:00
checkTree ( returnvalue ) {
let tree = BDFDB . ReactUtils . findChild ( returnvalue , { filter : n => n && n . props && typeof n . props . children == "function" } ) ;
if ( tree ) {
let childrenRender = tree . props . children ;
2021-07-05 16:33:10 +02:00
tree . props . children = BDFDB . TimeUtils . suppress ( ( ... args ) => {
2020-11-16 10:00:48 +01:00
let children = childrenRender ( ... args ) ;
this . injectCounter ( children ) ;
return children ;
2021-07-05 16:33:10 +02:00
} , "" , this ) ;
2020-11-16 10:00:48 +01:00
}
else this . injectCounter ( returnvalue ) ;
}
2020-10-30 16:15:43 +01:00
injectCounter ( returnvalue ) {
let [ children , index ] = BDFDB . ReactUtils . findParent ( returnvalue , { name : "ConnectedUnreadDMs" } ) ;
if ( index > - 1 ) children . splice ( index , 0 , BDFDB . ReactUtils . createElement ( FriendOnlineCounterComponent , {
2021-08-02 21:07:53 +02:00
amount : this . getOnlineCount ( )
2020-10-30 16:15:43 +01:00
} ) ) ;
}
2021-03-16 15:16:36 +01:00
2021-04-24 12:50:06 +02:00
getObservedData ( ) {
let observed = Object . assign ( { friends : { } , strangers : { } } , BDFDB . DataUtils . load ( this , "observed" , BDFDB . UserUtils . me . id ) ) ;
2021-03-16 15:16:36 +01:00
let friendIds = BDFDB . LibraryModules . RelationshipStore . getFriendIDs ( ) ;
for ( let id of friendIds ) {
let user = BDFDB . LibraryModules . UserStore . getUser ( id ) ;
if ( user ) {
2021-08-12 18:52:55 +02:00
observed . friends [ id ] = Object . assign ( { } , defaultSettings , observed . friends [ id ] || observed . strangers [ id ] ) ;
2021-04-24 12:50:06 +02:00
delete observed . strangers [ id ] ;
2021-03-16 15:16:36 +01:00
}
}
2021-04-24 12:50:06 +02:00
for ( let id in observed . friends ) if ( ! friendIds . includes ( id ) ) {
observed . strangers [ id ] = Object . assign ( { } , observed . friends [ id ] ) ;
delete observed . friends [ id ] ;
2021-03-16 15:16:36 +01:00
}
2021-04-24 12:50:06 +02:00
delete observed . friends [ BDFDB . UserUtils . me . id ] ;
delete observed . strangers [ BDFDB . UserUtils . me . id ] ;
BDFDB . DataUtils . save ( observed , this , "observed" , BDFDB . UserUtils . me . id ) ;
return observed ;
2021-03-16 15:16:36 +01:00
}
2019-09-04 12:34:02 +02:00
2021-04-13 18:25:20 +02:00
getStatusWithMobileAndActivity ( id , config , clientStatuses ) {
2021-04-15 14:30:17 +02:00
let status = {
name : BDFDB . UserUtils . getStatus ( id ) ,
activity : null ,
custom : false ,
mobile : clientStatuses && clientStatuses [ id ] && Object . keys ( clientStatuses [ id ] ) . length == 1 && ! ! clientStatuses [ id ] . mobile
} ;
2021-01-15 21:21:24 +01:00
let activity = BDFDB . UserUtils . getActivity ( id ) || BDFDB . UserUtils . getCustomStatus ( id ) ;
2020-09-19 20:49:33 +02:00
if ( activity && BDFDB . DiscordConstants . ActivityTypes [ activity . type ] ) {
2021-01-15 21:21:24 +01:00
let isCustom = activity . type == BDFDB . DiscordConstants . ActivityTypes . CUSTOM _STATUS ;
let activityName = isCustom ? "custom" : BDFDB . DiscordConstants . ActivityTypes [ activity . type ] . toLowerCase ( ) ;
if ( statuses [ activityName ] && config [ activityName ] ) {
Object . assign ( status , { name : isCustom ? status . name : activityName , activity : Object . assign ( { } , activity ) , custom : isCustom } ) ;
2021-01-21 13:49:31 +01:00
if ( activity . type == BDFDB . DiscordConstants . ActivityTypes . STREAMING || activity . type == BDFDB . DiscordConstants . ActivityTypes . LISTENING ) delete status . activity . name ;
else if ( activity . type == BDFDB . DiscordConstants . ActivityTypes . PLAYING ) {
delete status . activity . details ;
delete status . activity . state ;
}
2020-09-19 20:49:33 +02:00
}
2020-02-09 14:51:48 +01:00
}
2020-09-19 20:49:33 +02:00
return status ;
2019-09-19 16:02:12 +02:00
}
2021-01-20 14:50:09 +01:00
2021-02-09 17:03:52 +01:00
getStatusName ( id , status ) {
if ( ! status ) return "" ;
let statusName = ( BDFDB . LanguageUtils . LanguageStringsCheck [ statuses [ status . name ] . name ] && BDFDB . LanguageUtils . LanguageStrings [ statuses [ status . name ] . name ] || this . labels [ "status_" + status . name ] || statuses [ status . name ] . name || "" ) . toLowerCase ( ) ;
2021-02-09 18:36:43 +01:00
return statusName ;
2021-02-09 17:03:52 +01:00
}
2021-04-14 14:37:19 +02:00
activityIsSame ( id , status ) {
2021-01-20 14:50:09 +01:00
return BDFDB . equals ( BDFDB . ObjectUtils . extract ( userStatusStore [ id ] . activity , "name" , "details" , "state" , "emoji" ) , status && BDFDB . ObjectUtils . extract ( status . activity , "name" , "details" , "state" , "emoji" ) ) ;
}
2021-08-02 21:07:53 +02:00
getOnlineCount ( ) {
return Object . entries ( BDFDB . LibraryModules . RelationshipStore . getRelationships ( ) ) . filter ( n => n [ 1 ] == BDFDB . DiscordConstants . RelationshipTypes . FRIEND && BDFDB . LibraryModules . StatusMetaUtils . getStatus ( n [ 0 ] ) != BDFDB . DiscordConstants . StatusTypes . OFFLINE ) . length ;
}
2019-01-26 22:45:19 +01:00
2021-01-06 12:38:36 +01:00
startInterval ( ) {
2020-09-19 20:49:33 +02:00
BDFDB . TimeUtils . clear ( checkInterval ) ;
2021-04-24 12:50:06 +02:00
let data = this . getObservedData ( ) ;
observedUsers = Object . assign ( { } , data . strangers , data . friends ) ;
2021-03-05 14:15:25 +01:00
delete observedUsers [ BDFDB . UserUtils . me . id ] ;
2020-09-19 20:49:33 +02:00
2021-04-13 18:25:20 +02:00
let clientStatuses = BDFDB . LibraryModules . StatusMetaUtils . getState ( ) . clientStatuses ;
for ( let id in observedUsers ) userStatusStore [ id ] = this . getStatusWithMobileAndActivity ( id , observedUsers [ id ] , clientStatuses ) ;
2020-09-19 20:49:33 +02:00
checkInterval = BDFDB . TimeUtils . interval ( _ => {
2021-08-02 21:07:53 +02:00
let amount = this . getOnlineCount ( ) ;
2020-09-19 20:49:33 +02:00
if ( friendCounter && friendCounter . props . amount != amount ) {
friendCounter . props . amount = amount ;
BDFDB . ReactUtils . forceUpdate ( friendCounter ) ;
}
2021-04-13 18:25:20 +02:00
clientStatuses = BDFDB . LibraryModules . StatusMetaUtils . getState ( ) . clientStatuses ;
2020-09-19 20:49:33 +02:00
for ( let id in observedUsers ) if ( ! observedUsers [ id ] . disabled ) {
let user = BDFDB . LibraryModules . UserStore . getUser ( id ) ;
2021-04-13 18:25:20 +02:00
let status = this . getStatusWithMobileAndActivity ( id , observedUsers [ id ] , clientStatuses ) ;
2021-08-12 18:52:55 +02:00
let customChanged = false , loginNotice = false ;
if ( user && ( ! observedUsers [ id ] [ status . name ] && observedUsers [ id ] . login && status . name != "offline" && userStatusStore [ id ] . name == "offline" && ( loginNotice = true ) || observedUsers [ id ] [ status . name ] && (
2021-01-15 21:21:24 +01:00
observedUsers [ id ] . custom && (
2021-04-14 14:37:19 +02:00
userStatusStore [ id ] . custom != status . custom && ( ( customChanged = status . custom ) || true ) ||
( customChanged = status . custom && ! this . activityIsSame ( id , status ) )
2021-01-15 21:21:24 +01:00
) ||
2021-04-14 14:37:19 +02:00
observedUsers [ id ] . mobile && userStatusStore [ id ] . mobile != status . mobile ||
statuses [ status . name ] . checkActivity && ! this . activityIsSame ( id , status ) ||
userStatusStore [ id ] . name != status . name
2021-08-12 18:52:55 +02:00
) ) ) {
2020-09-19 20:49:33 +02:00
let EUdata = BDFDB . BDUtils . isPluginEnabled ( "EditUsers" ) && BDFDB . DataUtils . load ( "EditUsers" , "users" , user . id ) || { } ;
let name = EUdata . name || user . username ;
let avatar = EUdata . removeIcon ? "" : ( EUdata . url || BDFDB . UserUtils . getAvatar ( user . id ) ) ;
2021-03-16 15:16:36 +01:00
let timestamp = new Date ( ) . getTime ( ) ;
2020-04-13 19:58:49 +02:00
2021-02-09 17:03:52 +01:00
let statusName = this . getStatusName ( id , status ) ;
let oldStatusName = this . getStatusName ( id , userStatusStore [ id ] ) ;
2021-01-15 21:21:24 +01:00
2021-08-12 18:52:55 +02:00
let string = this . settings . notificationStrings [ customChanged ? "custom" : loginNotice ? "login" : status . name ] || "'$user' changed status to '$status'" ;
2021-04-24 12:50:06 +02:00
let toastString = BDFDB . StringUtils . htmlEscape ( string ) . replace ( /'{0,1}\$user'{0,1}/g , ` <strong> ${ BDFDB . StringUtils . htmlEscape ( name ) } </strong> ${ this . settings . general . showDiscriminator ? ( "#" + user . discriminator ) : "" } ` ) . replace ( /'{0,1}\$statusOld'{0,1}/g , ` <strong> ${ oldStatusName } </strong> ` ) . replace ( /'{0,1}\$status'{0,1}/g , ` <strong> ${ statusName } </strong> ` ) ;
2021-01-20 14:50:09 +01:00
if ( status . activity ) toastString = toastString . replace ( /'{0,1}\$song'{0,1}|'{0,1}\$game'{0,1}/g , ` <strong> ${ status . activity . name || status . activity . details || "" } </strong> ` ) . replace ( /'{0,1}\$artist'{0,1}|'{0,1}\$custom'{0,1}/g , ` <strong> ${ [ status . activity . emoji && status . activity . emoji . name , status . activity . state ] . filter ( n => n ) . join ( " " ) || "" } </strong> ` ) ;
2020-09-19 20:49:33 +02:00
2021-04-13 18:25:20 +02:00
let statusType = BDFDB . UserUtils . getStatus ( user . id ) ;
2021-08-12 18:52:55 +02:00
if ( observedUsers [ id ] . timelog == undefined || observedUsers [ id ] . timelog ) timeLog . unshift ( {
2020-09-19 20:49:33 +02:00
string : toastString ,
avatar : avatar ,
name : name ,
2021-04-13 18:25:20 +02:00
status : statusType ,
mobile : status . mobile ,
2021-03-16 15:16:36 +01:00
timestamp : timestamp
2020-09-19 20:49:33 +02:00
} ) ;
2021-04-24 12:50:06 +02:00
if ( ! ( this . settings . general . muteOnDND && BDFDB . UserUtils . getStatus ( ) == BDFDB . DiscordConstants . StatusTypes . DND ) && ( ! lastTimes [ user . id ] || lastTimes [ user . id ] != timestamp ) ) {
2021-03-16 15:16:36 +01:00
lastTimes [ user . id ] = timestamp ;
2020-09-19 20:49:33 +02:00
let openChannel = _ => {
2021-04-24 12:50:06 +02:00
if ( this . settings . general . openOnClick ) {
2020-09-19 20:49:33 +02:00
let DMid = BDFDB . LibraryModules . ChannelStore . getDMFromUserId ( user . id )
2021-03-05 17:43:06 +01:00
if ( DMid ) BDFDB . LibraryModules . ChannelUtils . selectPrivateChannel ( DMid ) ;
2020-09-19 20:49:33 +02:00
else BDFDB . LibraryModules . DirectMessageUtils . openPrivateChannel ( BDFDB . UserUtils . me . id , user . id ) ;
2021-02-02 12:45:38 +01:00
BDFDB . LibraryModules . WindowUtils . focus ( ) ;
2020-09-19 20:49:33 +02:00
}
} ;
2021-01-15 21:21:24 +01:00
if ( observedUsers [ id ] [ status . name ] == notificationTypes . DESKTOP . value ) {
2021-06-30 23:30:58 +02:00
let desktopString = string . replace ( /\$user/g , ` ${ name } ${ this . settings . general . showDiscriminator ? ( "#" + user . discriminator ) : "" } ` ) . replace ( /\$statusOld/g , oldStatusName ) . replace ( /\$status/g , statusName ) ;
2021-01-20 14:50:09 +01:00
if ( status . activity ) desktopString = desktopString . replace ( /\$song|\$game/g , status . activity . name || status . activity . details || "" ) . replace ( /\$artist|\$custom/g , [ status . activity . emoji && status . activity . emoji . name , status . activity . state ] . filter ( n => n ) . join ( " " ) || "" ) ;
2021-04-13 18:25:20 +02:00
if ( status . mobile ) desktopString += " (mobile)" ;
2021-04-24 12:50:06 +02:00
let notificationSound = this . settings . notificationSounds [ "desktop" + status . name ] || { } ;
2021-01-25 14:10:20 +01:00
BDFDB . NotificationUtils . desktop ( desktopString , {
icon : avatar ,
silent : notificationSound . mute ,
sound : notificationSound . song ,
onClick : openChannel
} ) ;
2020-09-19 20:49:33 +02:00
}
2021-04-13 18:25:20 +02:00
else BDFDB . NotificationUtils . toast ( BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Flex , {
align : BDFDB . LibraryComponents . Flex . Align . CENTER ,
children : [
BDFDB . ReactUtils . elementToReact ( BDFDB . DOMUtils . create ( toastString ) ) ,
2021-04-14 16:44:59 +02:00
this . createStatusDot ( statusType , status . mobile , { marginLeft : 6 } )
2021-04-13 18:25:20 +02:00
]
} ) , {
2021-04-24 12:50:06 +02:00
timeout : this . settings . amounts . toastTime * 1000 ,
2021-02-12 17:07:48 +01:00
avatar : avatar ,
barColor : BDFDB . UserUtils . getStatusColor ( status . name , true ) ,
onClick : openChannel ,
onShow : _ => {
2021-04-24 12:50:06 +02:00
let notificationSound = this . settings . notificationSounds [ "toast" + status . name ] || { } ;
2021-02-12 17:07:48 +01:00
if ( ! notificationSound . mute && notificationSound . song ) {
let audio = new Audio ( ) ;
audio . src = notificationSound . song ;
audio . play ( ) ;
2021-01-26 21:14:48 +01:00
}
2021-02-12 17:07:48 +01:00
}
} ) ;
2020-02-09 14:51:48 +01:00
}
2019-08-22 16:17:21 +02:00
}
2021-01-15 21:21:24 +01:00
userStatusStore [ id ] = status ;
2019-08-22 16:17:21 +02:00
}
2021-04-24 12:50:06 +02:00
} , this . settings . amounts . checkInterval * 1000 ) ;
2021-04-13 18:25:20 +02:00
}
2021-04-14 16:44:59 +02:00
createStatusDot ( status , isMobile , style = { } ) {
2021-04-13 18:25:20 +02:00
return BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Status , {
2021-04-14 16:44:59 +02:00
style : Object . assign ( { } , style ) ,
2021-04-13 18:25:20 +02:00
size : 12 ,
color : isMobile ? BDFDB . UserUtils . getStatusColor ( status , true ) : null ,
isMobile : isMobile ,
status : isMobile ? BDFDB . DiscordConstants . StatusTypes . ONLINE : status
} ) ;
}
2019-05-01 21:02:25 +02:00
2021-01-06 12:38:36 +01:00
showTimeLog ( ) {
2020-12-22 18:45:40 +01:00
let searchTimeout ;
BDFDB . ModalUtils . open ( this , {
2020-09-19 20:49:33 +02:00
size : "MEDIUM" ,
header : "LogIn/-Out Timelog" ,
2021-01-23 18:50:24 +01:00
subHeader : "" ,
2020-12-22 18:45:40 +01:00
className : BDFDB . disCN . _friendnotificationstimelogmodal ,
2021-04-15 14:30:17 +02:00
titleChildren : [
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . Button , {
color : BDFDB . LibraryComponents . Button . Colors . RED ,
size : BDFDB . LibraryComponents . Button . Sizes . TINY ,
2021-05-27 15:59:45 +02:00
look : BDFDB . LibraryComponents . Button . Looks . OUTLINE ,
2021-04-15 14:30:17 +02:00
style : { marginLeft : 6 , marginRight : 12 } ,
children : BDFDB . LanguageUtils . LanguageStrings . BUILD _OVERRIDE _CLEAR ,
onClick : _ => BDFDB . ModalUtils . confirm ( this , this . labels . clear _log , _ => {
timeLog = [ ] ;
timeLogList . props . entries = timeLog ;
2020-12-22 18:45:40 +01:00
BDFDB . ReactUtils . forceUpdate ( timeLogList ) ;
2021-04-15 14:30:17 +02:00
} )
} ) ,
BDFDB . ReactUtils . createElement ( BDFDB . LibraryComponents . SearchBar , {
autoFocus : true ,
query : "" ,
onChange : ( value , instance ) => {
BDFDB . TimeUtils . clear ( searchTimeout ) ;
searchTimeout = BDFDB . TimeUtils . timeout ( _ => {
let searchString = value . toUpperCase ( ) ;
timeLogList . props . entries = timeLog . filter ( n => n && n . name && n . name . toUpperCase ( ) . indexOf ( searchString ) > - 1 ) ;
BDFDB . ReactUtils . forceUpdate ( timeLogList ) ;
} , 1000 ) ;
} ,
onClear : instance => {
timeLogList . props . entries = timeLog ;
BDFDB . ReactUtils . forceUpdate ( timeLogList ) ;
}
} )
] ,
2020-12-22 18:45:40 +01:00
children : BDFDB . ReactUtils . createElement ( TimeLogComponent , {
entries : timeLog
2020-09-19 20:49:33 +02:00
} )
} ) ;
}
2021-01-15 21:21:24 +01:00
setLabelsByLanguage ( ) {
switch ( BDFDB . LanguageUtils . getLanguage ( ) . id ) {
case "bg" : // Bulgarian
return {
2021-04-15 14:30:17 +02:00
clear _log : "Наистина ли искате да изчистите дневника на времето?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Слушане" ,
status _playing : "Играе"
} ;
case "da" : // Danish
return {
2021-04-15 14:30:17 +02:00
clear _log : "Er du sikker på, at du vil rydde tidsloggen?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Hører efter" ,
status _playing : "Spiller"
} ;
case "de" : // German
return {
2021-04-15 14:30:17 +02:00
clear _log : "Möchtest du das Zeitprotokoll wirklich löschen?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Hören" ,
status _playing : "Spielen"
} ;
case "el" : // Greek
return {
2021-04-15 14:30:17 +02:00
clear _log : "Είστε βέβαιοι ότι θέλετε ν α διαγράψετε το ημερολόγιο ώρας;" ,
2021-01-15 21:21:24 +01:00
status _listening : "Ακούγοντας" ,
status _playing : "Παιχνίδι"
} ;
case "es" : // Spanish
return {
2021-04-15 14:30:17 +02:00
clear _log : "¿Está seguro de que desea borrar el registro de tiempo?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Escuchando" ,
status _playing : "Jugando"
} ;
case "fi" : // Finnish
return {
2021-04-15 14:30:17 +02:00
clear _log : "Haluatko varmasti tyhjentää aikalokin?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Kuunteleminen" ,
status _playing : "Pelataan"
} ;
case "fr" : // French
return {
2021-04-15 14:30:17 +02:00
clear _log : "Voulez-vous vraiment effacer le journal de temps?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Écoute" ,
status _playing : "En jouant"
} ;
case "hr" : // Croatian
return {
2021-04-15 14:30:17 +02:00
clear _log : "Jeste li sigurni da želite očistiti vremenski zapisnik?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Slušanje" ,
status _playing : "Sviranje"
} ;
case "hu" : // Hungarian
return {
2021-04-15 14:30:17 +02:00
clear _log : "Biztosan törli az időnaplót?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Hallgatás" ,
status _playing : "Játék"
} ;
case "it" : // Italian
return {
2021-04-15 14:30:17 +02:00
clear _log : "Sei sicuro di voler cancellare il registro del tempo?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Ascoltando" ,
status _playing : "Giocando"
} ;
case "ja" : // Japanese
return {
2021-04-15 14:30:17 +02:00
clear _log : "タイムログをクリアしてもよろしいですか?" ,
2021-01-15 21:21:24 +01:00
status _listening : "聞いている" ,
status _playing : "遊ぶ"
} ;
case "ko" : // Korean
return {
2021-04-15 14:30:17 +02:00
clear _log : "시간 로그를 지우시겠습니까?" ,
2021-01-15 21:21:24 +01:00
status _listening : "청취" ,
status _playing : "놀이"
} ;
case "lt" : // Lithuanian
return {
2021-04-15 14:30:17 +02:00
clear _log : "Ar tikrai norite išvalyti laiko žurnalą?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Klausymas" ,
status _playing : "Žaidžia"
} ;
case "nl" : // Dutch
return {
2021-04-15 14:30:17 +02:00
clear _log : "Weet u zeker dat u het tijdlogboek wilt wissen?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Luisteren" ,
status _playing : "Spelen"
} ;
case "no" : // Norwegian
return {
2021-04-15 14:30:17 +02:00
clear _log : "Er du sikker på at du vil slette tidsloggen?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Lytte" ,
status _playing : "Spiller"
} ;
case "pl" : // Polish
return {
2021-04-15 14:30:17 +02:00
clear _log : "Czy na pewno chcesz wyczyścić dziennik czasu?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Słuchający" ,
status _playing : "Gra"
} ;
case "pt-BR" : // Portuguese (Brazil)
return {
2021-04-15 14:30:17 +02:00
clear _log : "Tem certeza de que deseja limpar o registro de horas?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Ouvindo" ,
status _playing : "Jogando"
} ;
case "ro" : // Romanian
return {
2021-04-15 14:30:17 +02:00
clear _log : "Sigur doriți să ștergeți jurnalul de timp?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Ascultare" ,
status _playing : "Joc"
} ;
case "ru" : // Russian
return {
2021-04-15 14:30:17 +02:00
clear _log : "Вы уверены, что хотите очистить журнал времени?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Прослушивание" ,
status _playing : "Играет"
} ;
case "sv" : // Swedish
return {
2021-04-15 14:30:17 +02:00
clear _log : "Är du säker på att du vill rensa tidsloggen?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Lyssnande" ,
status _playing : "Spelar"
} ;
case "th" : // Thai
return {
2021-04-15 14:30:17 +02:00
clear _log : "แน่ใจไหมว่าต้องการล้างบันทึกเวลา" ,
2021-01-15 21:21:24 +01:00
status _listening : "การฟัง" ,
status _playing : "กำลังเล่น"
} ;
case "tr" : // Turkish
return {
2021-04-15 14:30:17 +02:00
clear _log : "Zaman kaydı nı temizlemek istediğinizden emin misiniz?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Dinleme" ,
status _playing : "Çalma"
} ;
case "uk" : // Ukrainian
return {
2021-04-15 14:30:17 +02:00
clear _log : "Ви впевнені, що хочете очистити журнал часу?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Слухання" ,
status _playing : "Гра"
} ;
case "vi" : // Vietnamese
return {
2021-04-15 14:30:17 +02:00
clear _log : "Bạn có chắc chắn muốn xóa nhật ký thời gian không?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Lắng nghe" ,
status _playing : "Đang chơi"
} ;
case "zh-CN" : // Chinese (China)
return {
2021-04-15 14:30:17 +02:00
clear _log : "您确定要清除时间记录吗?" ,
2021-01-15 21:21:24 +01:00
status _listening : "倾听" ,
status _playing : "玩"
} ;
case "zh-TW" : // Chinese (Taiwan)
return {
2021-04-15 14:30:17 +02:00
clear _log : "您確定要清除時間記錄嗎?" ,
2021-01-15 21:21:24 +01:00
status _listening : "傾聽" ,
status _playing : "玩"
} ;
default : // English
return {
2021-04-15 14:30:17 +02:00
clear _log : "Are you sure you want to clear the timelog?" ,
2021-01-15 21:21:24 +01:00
status _listening : "Listening" ,
status _playing : "Playing"
} ;
}
}
2020-09-19 20:49:33 +02:00
} ;
2020-10-09 21:09:35 +02:00
} ) ( window . BDFDB _Global . PluginUtils . buildPlugin ( config ) ) ;
2021-03-30 11:18:14 +02:00
} ) ( ) ;