This commit is contained in:
Mirco Wittrien 2021-01-02 12:51:18 +01:00
parent 5f8fc040dd
commit 93503a305f
4 changed files with 193 additions and 81 deletions

View File

@ -16,15 +16,10 @@ module.exports = (_ => {
"info": {
"name": "BDFDB",
"author": "DevilBro",
"version": "1.2.5",
"version": "1.2.6",
"description": "Give other plugins utility functions"
},
"rawUrl": "https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js",
"changeLog": {
"improved": {
"Languages": "Added support for all languages used by discord"
}
}
"rawUrl": "https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js"
};
const DiscordObjects = {};
@ -265,11 +260,11 @@ module.exports = (_ => {
return value;
}
};
BDFDB.ObjectUtils.map = function (obj, mapfunc) {
BDFDB.ObjectUtils.map = function (obj, mapFunc) {
if (!BDFDB.ObjectUtils.is(obj)) return {};
if (typeof mapfunc != "string" && typeof mapfunc != "function") return obj;
if (typeof mapFunc != "string" && typeof mapFunc != "function") return obj;
let newObj = {};
for (let key in obj) if (BDFDB.ObjectUtils.is(obj[key])) newObj[key] = typeof mapfunc == "string" ? obj[key][mapfunc] : mapfunc(obj[key], key);
for (let key in obj) if (BDFDB.ObjectUtils.is(obj[key])) newObj[key] = typeof mapFunc == "string" ? obj[key][mapFunc] : mapFunc(obj[key], key);
return newObj;
};
BDFDB.ObjectUtils.toArray = function (obj) {
@ -3132,12 +3127,12 @@ module.exports = (_ => {
};
BDFDB.ColorUtils.setAlpha = function (color, a, conv) {
if (BDFDB.ObjectUtils.is(color)) {
var newcolor = {};
let newcolor = {};
for (let pos in color) newcolor[pos] = BDFDB.ColorUtils.setAlpha(color[pos], a, conv);
return newcolor;
}
else {
var comp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
let comp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
if (comp) {
a = a.toString();
a = (a.indexOf("%") > -1 ? 0.01 : 1) * parseFloat(a.replace(/[^0-9\.\-]/g, ""));
@ -3151,7 +3146,7 @@ module.exports = (_ => {
return null;
};
BDFDB.ColorUtils.getAlpha = function (color) {
var comp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
let comp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
if (comp) {
if (comp.length == 3) return 1;
else if (comp.length == 4) {
@ -3166,12 +3161,12 @@ module.exports = (_ => {
value = parseFloat(value);
if (color != null && typeof value == "number" && !isNaN(value)) {
if (BDFDB.ObjectUtils.is(color)) {
var newcolor = {};
for (let pos in color) newcolor[pos] = BDFDB.ColorUtils.change(color[pos], value, conv);
return newcolor;
let newColor = {};
for (let pos in color) newColor[pos] = BDFDB.ColorUtils.change(color[pos], value, conv);
return newColor;
}
else {
var comp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
let comp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
if (comp) {
if (parseInt(value) !== value) {
value = value.toString();
@ -3187,12 +3182,12 @@ module.exports = (_ => {
};
BDFDB.ColorUtils.invert = function (color, conv) {
if (BDFDB.ObjectUtils.is(color)) {
var newcolor = {};
for (let pos in color) newcolor[pos] = BDFDB.ColorUtils.invert(color[pos], conv);
return newcolor;
let newColor = {};
for (let pos in color) newColor[pos] = BDFDB.ColorUtils.invert(color[pos], conv);
return newColor;
}
else {
var comp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
let comp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
if (comp) return BDFDB.ColorUtils.convert([255 - comp[0], 255 - comp[1], 255 - comp[2]], conv || BDFDB.ColorUtils.getType(color));
}
return null;
@ -3221,7 +3216,7 @@ module.exports = (_ => {
else if (/^#[a-f\d]{4}$|^#[a-f\d]{8}$/i.test(color)) return "HEXA";
else {
color = color.toUpperCase();
var comp = color.replace(/[^0-9\.\-\,\%]/g, "").split(",");
let comp = color.replace(/[^0-9\.\-\,\%]/g, "").split(",");
if (color.indexOf("RGB(") == 0 && comp.length == 3 && isRGB(comp)) return "RGB";
else if (color.indexOf("RGBA(") == 0 && comp.length == 4 && isRGB(comp)) return "RGBA";
else if (color.indexOf("HSL(") == 0 && comp.length == 3 && isHSL(comp)) return "HSL";
@ -4878,13 +4873,85 @@ module.exports = (_ => {
};
InternalComponents.LibraryComponents.Checkbox = reactInitialized && class BDFDB_Checkbox extends LibraryModules.React.Component {
handleChange() {
this.props.value = !this.props.value;
handleClick(e) {if (typeof this.props.onClick == "function") this.props.onClick(e, this);}
handleContextMenu(e) {if (typeof this.props.onContextMenu == "function") this.props.onContextMenu(e, this);}
handleMouseDown(e) {if (typeof this.props.onMouseDown == "function") this.props.onMouseDown(e, this);}
handleMouseUp(e) {if (typeof this.props.onMouseUp == "function") this.props.onMouseUp(e, this);}
handleMouseEnter(e) {if (typeof this.props.onMouseEnter == "function") this.props.onMouseEnter(e, this);}
handleMouseLeave(e) {if (typeof this.props.onMouseLeave == "function") this.props.onMouseLeave(e, this);}
getInputMode() {
return this.props.disabled ? "disabled" : this.props.readOnly ? "readonly" : "default";
}
getStyle() {
let style = this.props.style || {};
if (!this.props.value) return style;
style = Object.assign({}, style);
this.props.color = typeof this.props.getColor == "function" ? this.props.getColor(this.props.value) : this.props.color;
switch (this.props.type) {
case InternalComponents.NativeSubComponents.Checkbox.Types.DEFAULT:
style.borderColor = this.props.color;
break;
case InternalComponents.NativeSubComponents.Checkbox.Types.GHOST:
let color = BDFDB.ColorUtils.setAlpha(this.props.color, 0.15, "RGB");
style.borderColor = color;
style.backgroundColor = color;
break;
case InternalComponents.NativeSubComponents.Checkbox.Types.INVERTED:
style.backgroundColor = this.props.color;
style.borderColor = this.props.color;
}
return style;
}
getColor() {
return this.props.value ? (this.props.type === InternalComponents.NativeSubComponents.Checkbox.Types.INVERTED ? BDFDB.DiscordConstants.Colors.WHITE : this.props.color) : "transparent";
}
handleChange(e) {
this.props.value = typeof this.props.getValue == "function" ? this.props.getValue(this.props.value, e) : !this.props.value;
if (typeof this.props.onChange == "function") this.props.onChange(this.props.value, this);
BDFDB.ReactUtils.forceUpdate(this);
}
render() {
return BDFDB.ReactUtils.createElement(InternalComponents.NativeSubComponents.Checkbox, Object.assign({}, this.props, {onChange: this.handleChange.bind(this)}));
let label = this.props.children ? BDFDB.ReactUtils.createElement("div", {
className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.checkboxlabel, this.props.disabled ? BDFDB.disCN.checkboxlabeldisabled : BDFDB.disCN.checkboxlabelclickable, this.props.reverse ? BDFDB.disCN.checkboxlabelreversed : BDFDB.disCN.checkboxlabelforward),
style: {
lineHeight: this.props.size + "px"
},
children: this.props.children
}) : null;
return BDFDB.ReactUtils.createElement("label", {
className: BDFDB.DOMUtils.formatClassName(this.props.disabled ? BDFDB.disCN.checkboxwrapperdisabled : BDFDB.disCN.checkboxwrapper, this.props.align, this.props.className),
children: [
this.props.reverse && label,
!this.props.displayOnly && BDFDB.ReactUtils.createElement(InternalComponents.LibraryComponents.FocusRingScope, {
children: BDFDB.ReactUtils.createElement("input", {
className: BDFDB.disCN["checkboxinput" + this.getInputMode()],
type: "checkbox",
onClick: this.props.disabled || this.props.readOnly ? (_ => {}) : this.handleChange.bind(this),
onContextMenu: this.props.disabled || this.props.readOnly ? (_ => {}) : this.handleChange.bind(this),
checked: this.props.value,
style: {
width: this.props.size,
height: this.props.size
}
})
}),
BDFDB.ReactUtils.createElement("div", {
className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.checkbox, this.props.shape, this.props.value && BDFDB.disCN.checkboxchecked),
style: Object.assign({
width: this.props.size,
height: this.props.size,
borderColor: this.props.checkboxColor
}, this.getStyle()),
children: BDFDB.ReactUtils.createElement(InternalComponents.LibraryComponents.Checkmark, {
width: 18,
height: 18,
color: this.getColor(),
"aria-hidden": true
})
}),
!this.props.reverse && label
].filter(n => n)
});
}
};
@ -6574,13 +6641,15 @@ module.exports = (_ => {
shape: InternalComponents.LibraryComponents.Checkbox.Shapes.ROUND,
type: InternalComponents.LibraryComponents.Checkbox.Types.INVERTED,
color: this.props.checkboxColor,
getColor: this.props.getCheckboxColor,
value: props[setting],
getValue: this.props.getCheckboxValue,
onChange: this.props.onCheckboxChange
})
})).flat(10).filter(n => n)
})
]
}), "title", "data", "settings", "renderLabel", "cardClassName", "cardStyle", "checkboxColor", "onCheckboxChange", "maxWidth", "fullWidth", "biggestWidth", "pagination"));
}), "title", "data", "settings", "renderLabel", "cardClassName", "cardStyle", "checkboxColor", "getCheckboxColor", "getCheckboxValue", "onCheckboxChange", "configWidth", "pagination"));
}
render() {
this.props.settings = BDFDB.ArrayUtils.is(this.props.settings) ? this.props.settings : [];

View File

@ -488,6 +488,7 @@
"bdRepoHeaderControls": "controls-18FQsW",
"bdRepoListHeader": "repoHeader-2KfNvH",
"bdRepoListWrapper": "repoList-9JnAPs",
"cardDisabled": "cardDisabled-wnh5ZW",
"cardHorizontal": "horizontal-0ffRsT",
"cardInner": "inner-OP_8zd",
"cardWrapper": "card-rT4Wbb",
@ -1888,6 +1889,7 @@
"hotkeywrapper": ["BDFDB", "hotkeyWrapper"],
"hovercard": ["HoverCard", "card"],
"hovercardbutton": ["NotFound", "hoverCardButton"],
"hovercarddisabled": ["BDFDB", "cardDisabled"],
"hovercardhorizontal": ["BDFDB", "cardHorizontal"],
"hovercardinner": ["BDFDB", "cardInner"],
"hovercardwrapper": ["BDFDB", "cardWrapper"],

View File

@ -364,9 +364,13 @@ img:not([src]), img[src=""], img[src="null"] {
flex-direction: column;
align-items: center;
}
[REPLACE_CLASS_hovercardwrapper][REPLACE_CLASS_hovercardhorizontal] {
[REPLACE_CLASS_hovercardhorizontal] {
flex-direction: row;
}
[REPLACE_CLASS_hovercarddisabled] {
opacity: 0.7;
filter: grayscale(0.2);
}
[REPLACE_CLASS_settingspanel] [REPLACE_CLASS_hovercardwrapper] {
width: calc(100% - 22px);
}

View File

@ -14,12 +14,12 @@ module.exports = (_ => {
"info": {
"name": "FriendNotifications",
"author": "DevilBro",
"version": "1.5.5",
"version": "1.5.6",
"description": "Get a notification when a Friend or a User you choose to observe changes their online status, can be configured individually in the settings"
},
"changeLog": {
"added": {
"Search": "You can now search for a username in the time log modal"
"improved": {
"Toast/Desktop": "You can now set toast/desktop notifications for single status options instead of the whole user"
}
}
};
@ -68,6 +68,24 @@ module.exports = (_ => {
var friendCounter, timeLogList;
var settings = {}, amounts = {}, notificationStrings = {}, notificationSounds = {}, observedUsers = {};
const notificationTypes = {
DISABLED: {
button: null,
value: 0,
color: ""
},
TOAST: {
button: 0,
value: 1,
color: "var(--bdfdb-blurple)"
},
DESKTOP: {
button: 2,
value: 2,
color: "STATUS_GREEN"
}
};
const FriendOnlineCounterComponent = class FriendOnlineCounter extends BdApi.React.Component {
componentDidMount() {
friendCounter = this;
@ -140,27 +158,27 @@ module.exports = (_ => {
this.defaults = {
settings: {
addOnlineCount: {value: true, description: "Add an online friend counter to the server list (click to open logs)"},
showDiscriminator: {value: false, description: "Add the user discriminator"},
addOnlineCount: {value: true, description: "Add an Online friend Counter to the Server List (click to open logs)"},
showDiscriminator: {value: false, description: "Add the User Discriminator"},
disableForNew: {value: false, description: "Disable Notifications for newly added Friends: "},
muteOnDND: {value: false, description: "Do not notify me when I am DnD"},
muteOnDND: {value: false, description: "Do not notify me when I am in 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},
dnd: {value: "$user changed status to '$status'", libString: "STATUS_DND", init: false},
playing: {value: "$user started playing '$game'", statusName: "Playing", init: false},
listening: {value: "$user started listening to '$song'", statusName: "Listening", init: false},
streaming: {value: "$user started streaming '$game'", libString: "STATUS_STREAMING", init: false},
offline: {value: "$user changed status to '$status'", libString: "STATUS_OFFLINE", init: true}
listening: {value: "$user started listening to '$song'", statusName: "Listening", init: false},
streaming: {value: "$user started streaming '$game'", libString: "STATUS_STREAMING", init: false},
offline: {value: "$user changed status to '$status'", libString: "STATUS_OFFLINE", init: true}
},
notificationsounds: {},
amounts: {
toastTime: {value: 5, min: 1, description: "Amount of seconds a toast notification stays on screen: "},
desktopTime: {value: 5, min: 1, description: "Amount of seconds a desktop notification stays on screen: "},
checkInterval: {value: 10, min: 5, description: "Check Users every X seconds: "}
toastTime: {value: 5, min: 1, description: "Amount of Seconds a Toast Notification stays on Screen: "},
desktopTime: {value: 5, min: 1, description: "Amount of Seconds a Desktop Notification stays on Screen: "},
checkInterval: {value: 10, min: 5, description: "Check Users every X Seconds: "}
}
};
@ -202,6 +220,20 @@ module.exports = (_ => {
}
onStart() {
// REMOVE 1.1.2021
let convert = type => {
let data = BDFDB.DataUtils.load(this, type);
if (Object.keys(data).length) {
for (let id in data) if (data[id].desktop != undefined) {
for (let key of Object.keys(this.defaults.notificationstrings)) data[id][key] = notificationTypes[!data[id][key] ? "DISABLED" : (data[id].desktop ? "DESKTOP" : "TOAST")].value;
delete data[id].desktop;
}
BDFDB.DataUtils.save(data, this, type);
}
};
convert("friends");
convert("nonfriends");
this.startInterval();
BDFDB.PatchUtils.forceAllUpdates(this);
@ -214,23 +246,16 @@ module.exports = (_ => {
}
getSettingsPanel (collapseStates = {}) {
let changeNotificationType = (type, userId, desktopOn, disableOn) => {
let data = BDFDB.DataUtils.load(this, type, userId) || this.createDefaultConfig();
data.desktop = desktopOn;
data.disabled = disableOn;
BDFDB.DataUtils.save(data, this, type, userId);
this.SettingsUpdated = true;
BDFDB.PluginUtils.refreshSettingsPanel(this, settingsPanel, collapseStates);
};
let changeAllConfigs = (type, config, enable) => {
let changeAllConfigs = (type, config, notificationType) => {
let allData = BDFDB.DataUtils.load(this, type);
if (config == "type") {
config = "desktop";
enable = !enable;
let disabled = BDFDB.ObjectUtils.toArray(allData).every(d => !d.disabled && d[config] == enable);
for (let id in allData) allData[id].disabled = disabled;
if (config == "all") {
config = "disabled";
for (let id in allData) allData[id][config] = notificationTypes[notificationType].button == 0 ? false : true;
}
else {
let disabled = BDFDB.ObjectUtils.toArray(allData).every(d => !d.disabled && d[config] == notificationTypes[notificationType].value);
for (let id in allData) allData[id][config] = notificationTypes[disabled ? "DISABLED" : notificationType].value;
}
for (let id in allData) allData[id][config] = enable;
BDFDB.DataUtils.save(allData, this, type);
this.SettingsUpdated = true;
BDFDB.PluginUtils.refreshSettingsPanel(this, settingsPanel, collapseStates);
@ -247,7 +272,7 @@ module.exports = (_ => {
items.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, {
className: BDFDB.disCNS.settingsrowtitle + BDFDB.disCNS.settingsrowtitledefault + BDFDB.disCN.cursordefault,
children: [
"Click on an Icon to toggle",
"Click on an Option to toggle",
BDFDB.ReactUtils.createElement("span", {
className: BDFDB.disCN._friendnotificationstypelabel,
style: {backgroundColor: "var(--bdfdb-blurple)"},
@ -259,7 +284,7 @@ module.exports = (_ => {
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 Icon to toggle",
"Right-Click on an Option to toggle",
BDFDB.ReactUtils.createElement("span", {
className: BDFDB.disCN._friendnotificationstypelabel,
style: {backgroundColor: BDFDB.DiscordConstants.Colors.STATUS_GREEN},
@ -270,7 +295,7 @@ module.exports = (_ => {
}));
items.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsList, {
className: BDFDB.disCN.margintop20,
title: "type",
title: "all",
settings: Object.keys(this.defaults.notificationstrings),
data: users,
pagination: {
@ -279,6 +304,14 @@ module.exports = (_ => {
offset: paginationOffset[title] || 0,
onJump: offset => {paginationOffset[title] = offset;}
},
getCheckboxColor: value => {
let color = (BDFDB.ObjectUtils.toArray(notificationTypes).find(n => n.value == value) || {}).color;
return BDFDB.DiscordConstants.Colors[color] || color;
},
getCheckboxValue: (value, event) => {
let eventValue = (BDFDB.ObjectUtils.toArray(notificationTypes).find(n => n.button == event.button) || {}).value;
return eventValue == value ? 0 : eventValue;
},
renderLabel: data => [
BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.AvatarComponents.default, {
className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.listavatar, data.disabled && BDFDB.disCN.avatardisabled),
@ -286,10 +319,11 @@ module.exports = (_ => {
status: BDFDB.UserUtils.getStatus(data.id),
size: BDFDB.LibraryComponents.AvatarComponents.Sizes.SIZE_40,
onClick: (e, instance) => {
changeNotificationType(type, data.id, false, !(data.disabled || data.desktop));
},
onContextMenu: (e, instance) => {
changeNotificationType(type, data.id, true, !(data.disabled || !data.desktop));
let saveData = BDFDB.DataUtils.load(this, type, data.id) || this.createDefaultConfig();
saveData.disabled = !saveData.disabled;
BDFDB.DataUtils.save(saveData, this, type, data.id);
this.SettingsUpdated = true;
BDFDB.PluginUtils.refreshSettingsPanel(this, settingsPanel, collapseStates);
}
}),
BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextScroller, {
@ -297,10 +331,10 @@ module.exports = (_ => {
})
],
onHeaderClick: (config, instance) => {
changeAllConfigs(type, config, true);
changeAllConfigs(type, config, "TOAST");
},
onHeaderContextMenu: (config, instance) => {
changeAllConfigs(type, config, false);
changeAllConfigs(type, config, "DESKTOP");
},
onCheckboxChange: (value, instance) => {
let data = BDFDB.DataUtils.load(this, type, instance.props.cardId) || this.createDefaultConfig();
@ -352,12 +386,18 @@ module.exports = (_ => {
nonFriendsData[id] = Object.assign({}, friendsData[id]);
delete friendsData[id];
}
else if (id != BDFDB.UserUtils.me.id) friends.push(Object.assign({}, user, friendsData[id], {key: id, className: friendsData[id].disabled ? "" : (friendsData[id].desktop ? BDFDB.disCN.cardsuccessoutline : BDFDB.disCN.cardbrandoutline)}));
else if (id != BDFDB.UserUtils.me.id) friends.push(Object.assign({}, user, friendsData[id], {
key: id,
className: friendsData[id].disabled ? "" : BDFDB.disCN.hovercarddisabled
}));
}
}
for (let id in nonFriendsData) {
let user = BDFDB.LibraryModules.UserStore.getUser(id);
if (user && id != BDFDB.UserUtils.me.id) nonFriends.push(Object.assign({}, user, nonFriendsData[id], {key: id, className: nonFriendsData[id].disabled ? "" : (nonFriendsData[id].desktop ? BDFDB.disCN.cardsuccessoutline : BDFDB.disCN.cardbrandoutline)}));
if (user && id != BDFDB.UserUtils.me.id) nonFriends.push(Object.assign({}, user, nonFriendsData[id], {
key: id,
className: nonFriendsData[id].disabled ? "" : BDFDB.disCN.hovercarddisabled
}));
}
BDFDB.DataUtils.save(friendsData, this, "friends");
@ -595,9 +635,8 @@ module.exports = (_ => {
createDefaultConfig () {
return Object.assign({
desktop: false,
disabled: settings.disableForNew
}, BDFDB.ObjectUtils.map(this.defaults.notificationstrings, "init"));
}, BDFDB.ObjectUtils.map(this.defaults.notificationstrings, data => notificationTypes[data.init ? "TOAST" : "DISABLED"].value));
}
getStatusWithMobileAndActivity (id, config) {
@ -669,24 +708,22 @@ module.exports = (_ => {
BDFDB.LibraryRequires.electron.remote.getCurrentWindow().focus();
}
};
if (!observedUsers[id].desktop) {
if (!document.querySelector(`.friendnotifications-${id}-toast`)) {
let toast = BDFDB.NotificationUtils.toast(`<div class="${BDFDB.disCN.toastinner}"><div class="${BDFDB.disCN.toastavatar}" style="background-image: url(${avatar});"></div><div>${toastString}</div></div>`, {html: true, timeout: toastTime, color: BDFDB.UserUtils.getStatusColor(status.statusName), icon: false, selector: `friendnotifications-${status.statusName}-toast friendnotifications-${id}-toast`});
toast.addEventListener("click", openChannel);
let notificationsound = notificationSounds["toast" + status.statusName] || {};
if (!notificationsound.mute && notificationsound.song) {
let audio = new Audio();
audio.src = notificationsound.song;
audio.play();
}
}
}
else {
if (observedUsers[id][status.statusName] == notificationTypes.DESKTOP.value) {
let desktopString = string.replace(/\$user/g, `${name}${settings.showDiscriminator ? ("#" + user.discriminator) : ""}`).replace(/\$status/g, libString);
if (status.isActivity) desktopString = desktopString.replace(/\$song|\$game/g, status.name || status.details).replace(/\$artist/g, status.state);
let notificationsound = notificationSounds["desktop" + status.statusName] || {};
BDFDB.NotificationUtils.desktop(desktopString, {icon: avatar, timeout: desktopTime, click: openChannel, silent: notificationsound.mute, sound: notificationsound.song});
}
else if (!document.querySelector(`.friendnotifications-${id}-toast`)) {
let toast = BDFDB.NotificationUtils.toast(`<div class="${BDFDB.disCN.toastinner}"><div class="${BDFDB.disCN.toastavatar}" style="background-image: url(${avatar});"></div><div>${toastString}</div></div>`, {html: true, timeout: toastTime, color: BDFDB.UserUtils.getStatusColor(status.statusName), icon: false, selector: `friendnotifications-${status.statusName}-toast friendnotifications-${id}-toast`});
toast.addEventListener("click", openChannel);
let notificationsound = notificationSounds["toast" + status.statusName] || {};
if (!notificationsound.mute && notificationsound.song) {
let audio = new Audio();
audio.src = notificationsound.song;
audio.play();
}
}
}
}
userStatusStore[id] = status.statusName;