From 895e8f873ca1c00880b300e696ce0aca0a437a29 Mon Sep 17 00:00:00 2001 From: Mirco Wittrien Date: Tue, 27 Aug 2019 13:07:48 +0200 Subject: [PATCH] Update FriendNotifications.plugin.js --- .../FriendNotifications.plugin.js | 129 +++++++++++------- 1 file changed, 76 insertions(+), 53 deletions(-) diff --git a/Plugins/FriendNotifications/FriendNotifications.plugin.js b/Plugins/FriendNotifications/FriendNotifications.plugin.js index a409538b97..13fb64e1e5 100644 --- a/Plugins/FriendNotifications/FriendNotifications.plugin.js +++ b/Plugins/FriendNotifications/FriendNotifications.plugin.js @@ -3,7 +3,7 @@ class FriendNotifications { getName () {return "FriendNotifications";} - getVersion () {return "1.2.4";} + getVersion () {return "1.2.5";} getAuthor () {return "DevilBro";} @@ -11,7 +11,7 @@ class FriendNotifications { initConstructor () { this.changelog = { - "improved":[["New Settings Interface","Completely new settings interface to more easily customize your notifications"],["New Options","You can now observe users for any kind of status changes (online, mobile, idle, dnd, streaming, offline)"],["Merged FriendNotifications and StalkerNotifications","Since both of these plugins now work the same, I decided to merge them. FriendNotifications will be continued and StalkerNotifications will be disconntinued. You can find the old StalkerNotifications settings in the FriendNotifications settings. All old configurations of FriendNotifications and StalkerNotifications should have been merged"]], + "improved":[["Notification Message","You can now customize the message depending on the status"]], "fixed":[["Settings Bug","Fixed the bug where disabling/changing settings for users would not work, unless the plugin was restarted"],["Log Bug","Fixed the bug where the time log would display weirdly"]] }; @@ -118,18 +118,18 @@ class FriendNotifications { }`; this.defaults = { - configs: { - online: {value:true, toasttext:"STATUS_ONLINE"}, - mobile: {value:true, toasttext:"STATUS_ONLINE_MOBILE"}, - idle: {value:false, toasttext:"STATUS_IDLE"}, - dnd: {value:false, toasttext:"STATUS_DND"}, - streaming: {value:false, toasttext:"STATUS_STREAMING"}, - offline: {value:true, toasttext:"STATUS_OFFLINE"} - }, settings: { muteOnDND: {value:false, description:"Do not notify me when I am DnD:"}, openOnClick: {value:false, description:"Open the DM when you click a Notification:"} }, + notificationstrings: { + online: {value:"$user changed status to '$status'", libstring:"STATUS_ONLINE", init:true}, + mobile: {value:"$user changed status to '$status'", libstring:"STATUS_ONLINE_MOBILE", init:true}, + idle: {value:"$user changed status to '$status'", libstring:"STATUS_IDLE", init:false}, + dnd: {value:"$user changed status to '$status'", libstring:"STATUS_DND", init:false}, + streaming: {value:"$user changed status to '$status'", libstring:"STATUS_STREAMING", init:false}, + offline: {value:"$user changed status to '$status'", libstring:"STATUS_OFFLINE", init:true} + }, notificationsounds: { toastonline: {value:{url:null,song:null,mute:false}}, toastmobile: {value:{url:null,song:null,mute:false}}, @@ -154,6 +154,7 @@ class FriendNotifications { if (!global.BDFDB || typeof BDFDB != "object" || !BDFDB.loaded || !this.started) return; let settings = BDFDB.getAllData(this, "settings"); + let notificationstrings = BDFDB.getAllData(this, "notificationstrings"); let notificationsounds = BDFDB.getAllData(this, "notificationsounds"); let amounts = BDFDB.getAllData(this, "amounts"); @@ -171,7 +172,7 @@ class FriendNotifications { if ("Notification" in window) settingshtml += `

Rightclick on an Icon to toggle Notifications for that User:

`; settingshtml += `

Click/Rightclick on the table headers to batch set all Friends

`; settingshtml += `

TYPE
DISABLE

`; - for (let config in this.defaults.configs) settingshtml += `
${config.toUpperCase()}
`; + for (let config in this.defaults.notificationstrings) settingshtml += `
${config.toUpperCase()}
`; settingshtml += `
`; for (let id of friendIDs) { let user = this.UserUtils.getUser(id); @@ -188,7 +189,7 @@ class FriendNotifications { settingshtml += `

Click/Rightclick on the table headers to batch set all Non-Friends

`; settingshtml += `

Add Non-Friend:

`; settingshtml += `

TYPE
DISABLE

`; - for (let config in this.defaults.configs) settingshtml += `
${config.toUpperCase()}
`; + for (let config in this.defaults.notificationstrings) settingshtml += `
${config.toUpperCase()}
`; settingshtml += `
`; for (let id in nonfriends) if (!friendIDs.includes(id)) { let user = this.UserUtils.getUser(id); @@ -202,8 +203,14 @@ class FriendNotifications { settingshtml += `
Timelog
`; settingshtml += `

Timelog of LogIns/-Outs:

`; settingshtml += `
`; - settingshtml += `
Sound Settings
`; - for (let key in notificationsounds) if (key.indexOf("desktop") == -1 || "Notification" in window) settingshtml += `
${key} notification sound:
Mute:
`; + settingshtml += `
Notification Message Settings
`; + settingshtml += `

Allows you to configure your own message strings for the different statuses. $user is the placeholder for the username and $status for the statusname.

`; + for (let config in notificationstrings) { + settingshtml += `

${config.charAt(0).toUpperCase() + config.slice(1)} Message:

`; + } + settingshtml += `
`; + settingshtml += `
Notification Sound Settings
`; + for (let config in notificationsounds) if (config.indexOf("desktop") == -1 || "Notification" in window) settingshtml += `
${config} notification sound:
Mute:
`; settingshtml += `
`; settingshtml += `
`; @@ -213,7 +220,8 @@ class FriendNotifications { BDFDB.initElements(settingspanel, this); - BDFDB.addEventListener(this, settingspanel, "click", ".btn-savesong", e => {this.saveAudio(settingspanel, e.currentTarget.getAttribute("option"));}); + BDFDB.addEventListener(this, settingspanel, "keyup", ".input-notificationstring", e => {this.saveNotificationString(e.currentTarget);}); + BDFDB.addEventListener(this, settingspanel, "click", ".btn-savesong", e => {this.saveNotificationSound(e.currentTarget.parentElement.querySelector(BDFDB.dotCN.input));}); BDFDB.addEventListener(this, settingspanel, "click", ".mute-checkbox", e => { let option = e.currentTarget.getAttribute("option"); let notificationsound = BDFDB.getData(option, this, "notificationsounds"); @@ -367,7 +375,7 @@ class FriendNotifications { createHoverCard (user, data, group) { let EUdata = BDFDB.loadData(user.id, "EditUsers", "users") || {}; var hovercardhtml = `
${BDFDB.encodeToHTML(EUdata.name || user.username)}
`; - for (let config in this.defaults.configs) { + for (let config in this.defaults.notificationstrings) { hovercardhtml += `
`; } return hovercardhtml + `
${group == "nonfriends" ? `
` : ''}
` @@ -432,40 +440,52 @@ class FriendNotifications { } createDefaultConfig () { - return Object.assign({desktop: false, disabled: false}, BDFDB.mapObject(this.defaults.configs, "value")); + return Object.assign({desktop: false, disabled: false}, BDFDB.mapObject(this.defaults.notificationstrings, "init")); + } + + saveNotificationString (input) { + let config = input.getAttribute("config"); + if (config) { + BDFDB.saveData(config, input.value, this, "notificationstrings"); + this.SettingsUpdated = true; + } } - saveAudio (settingspanel, option) { - let successSavedAudio = (parsedurl, parseddata) => { - if (parsedurl && parseddata) BDFDB.showToast(`Sound was saved successfully.`, {type:"success"}); - let notificationsound = BDFDB.getData(option, this, "notificationsounds"); - notificationsound.url = parsedurl; - notificationsound.song = parseddata; - BDFDB.saveData(option, notificationsound, this, "notificationsounds"); - }; + saveNotificationSound (input) { + let config = input.getAttribute("config"); + if (config) { + let successSavedAudio = (parsedurl, parseddata) => { + if (parsedurl && parseddata) BDFDB.showToast(`Sound was saved successfully.`, {type:"success"}); + let notificationsound = BDFDB.getData(config, this, "notificationsounds"); + notificationsound.url = parsedurl; + notificationsound.song = parseddata; + BDFDB.saveData(config, notificationsound, this, "notificationsounds"); + this.SettingsUpdated = true; + }; - let url = settingspanel.querySelector(`.songInput[option="${option}"]`).value; - if (url.length == 0) { - BDFDB.showToast(`Sound file was removed.`, {type:"warn"}); - successSavedAudio(url, url); - } - else if (url.indexOf("http") == 0) { - require("request")(url, (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(url, url); - return; + let url = input.value; + if (url.length == 0) { + BDFDB.showToast(`Sound file was removed.`, {type:"warn"}); + successSavedAudio(url, url); + } + else if (url.indexOf("http") == 0) { + require("request")(url, (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(url, url); + return; + } } - } - BDFDB.showToast("Use a valid direct link to a video or audio source. They usually end on something like .mp3, .mp4 or .wav.", {type:"danger"}); - }); - } - else { - require("fs").readFile(url, (error, response) => { - if (error) BDFDB.showToast("Could not fetch file. Please make sure the file exists.", {type:"danger"}); - else successSavedAudio(url, `data:audio/mpeg;base64,${response.toString("base64")}`); - }); + BDFDB.showToast("Use a valid direct link to a video or audio source. They usually end on something like .mp3, .mp4 or .wav.", {type:"danger"}); + }); + } + else { + require("fs").readFile(url, (error, response) => { + if (error) BDFDB.showToast("Could not fetch file. Please make sure the file exists.", {type:"danger"}); + else successSavedAudio(url, `data:audio/mpeg;base64,${response.toString("base64")}`); + }); + } } } @@ -489,6 +509,8 @@ class FriendNotifications { startInterval () { clearInterval(this.checkInterval); let settings = BDFDB.getAllData(this, "settings"); + let notificationstrings = BDFDB.getAllData(this, "notificationstrings"); + let notificationsounds = BDFDB.getAllData(this, "notificationsounds"); let users = Object.assign(BDFDB.loadAllData(this, "nonfriends"), BDFDB.loadAllData(this, "friends")); for (let id in users) this.userStatusStore[id] = this.getStatusWithMobile(id); this.checkInterval = setInterval(() => { @@ -497,10 +519,11 @@ class FriendNotifications { let status = this.getStatusWithMobile(id); if (user && this.userStatusStore[id] != status && users[id][status]) { let EUdata = BDFDB.loadData(user.id, "EditUsers", "users") || {}; - let toaststring = BDFDB.LanguageStrings[this.defaults.configs[status].toasttext]; - let string = `${BDFDB.encodeToHTML(EUdata.name || user.username)} changed status to  '${toaststring}'`; + let libstring = (BDFDB.LanguageStrings[this.defaults.notificationstrings[status].libstring] || "").toLowerCase(); + let string = notificationstrings[status] || "$user changed status to $status"; + let toaststring = BDFDB.encodeToHTML(string).replace(/\$user/g, `${BDFDB.encodeToHTML(EUdata.name || user.username)}`).replace(/\$status/g, `${libstring}`); let avatar = EUdata.removeIcon ? "" : (EUdata.url ? EUdata.url : BDFDB.getUserAvatar(user.id)); - this.timeLog.push({string, avatar, time: new Date()}); + this.timeLog.push({string:toaststring, avatar, time: new Date()}); if (!(settings.muteOnDND && BDFDB.getUserStatus() == "dnd")) { let openChannel = () => { if (settings.openOnClick) { @@ -511,9 +534,9 @@ class FriendNotifications { } }; if (!users[id].desktop) { - let toast = BDFDB.showToast(`
${string}
`, {html:true, timeout:5000, color:BDFDB.getUserStatusColor(status), icon:false, selector:`friendnotifications-${status}-toast`}); + let toast = BDFDB.showToast(`
${toaststring}
`, {html:true, timeout:5000, color:BDFDB.getUserStatusColor(status), icon:false, selector:`friendnotifications-${status}-toast`}); toast.addEventListener("click", openChannel); - let notificationsound = BDFDB.getData("toast" + status, this, "notificationsounds"); + let notificationsound = notificationsounds["toast" + status] || {}; if (!notificationsound.mute && notificationsound.song) { let audio = new Audio(); audio.src = notificationsound.song; @@ -521,8 +544,8 @@ class FriendNotifications { } } else { - let desktopstring = `${EUdata.name || user.username} changed status to '${toaststring}'`; - let notificationsound = BDFDB.getData("desktop" + status, this, "notificationsounds"); + let desktopstring = string.replace(/\$user/g, EUdata.name || user.username).replace(/\$status/g, libstring); + let notificationsound = notificationsounds["desktop" + status] || {}; BDFDB.showDesktopNotification(desktopstring, {icon:avatar, timeout:5000, click:openChannel, silent:notificationsound.mute, sound:notificationsound.song}); } }