From d4a85b3a67ad4f44bb40bd068abcdfb8884dc832 Mon Sep 17 00:00:00 2001 From: Mirco Wittrien Date: Sat, 20 Mar 2021 14:31:24 +0100 Subject: [PATCH] new plugin --- .../GameActivityToggle.plugin.js | 297 ++++++++++++++++++ Plugins/GameActivityToggle/README.md | 12 + Plugins/GameActivityToggle/_res/cover.png | Bin 0 -> 18406 bytes Plugins/PluginRepo/_res/PluginList.txt | 2 +- Plugins/README.md | 1 + 5 files changed, 311 insertions(+), 1 deletion(-) create mode 100644 Plugins/GameActivityToggle/GameActivityToggle.plugin.js create mode 100644 Plugins/GameActivityToggle/README.md create mode 100644 Plugins/GameActivityToggle/_res/cover.png diff --git a/Plugins/GameActivityToggle/GameActivityToggle.plugin.js b/Plugins/GameActivityToggle/GameActivityToggle.plugin.js new file mode 100644 index 0000000000..5d204d9bc9 --- /dev/null +++ b/Plugins/GameActivityToggle/GameActivityToggle.plugin.js @@ -0,0 +1,297 @@ +/** + * @name GameActivityToggle + * @author DevilBro + * @authorId 278543574059057154 + * @version 1.0.0 + * @description Adds a Quick-Toggle Game Activity Button + * @invite Jx3TjNS + * @donate https://www.paypal.me/MircoWittrien + * @patreon https://www.patreon.com/MircoWittrien + * @website https://mwittrien.github.io/ + * @source https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/GameActivityToggle/ + * @updateUrl https://mwittrien.github.io/BetterDiscordAddons/Plugins/GameActivityToggle/GameActivityToggle.plugin.js + */ + +module.exports = (_ => { + const config = { + "info": { + "name": "GameActivityToggle", + "author": "DevilBro", + "version": "1.0.0", + "description": "Adds a Quick-Toggle Game Activity Button" + } + }; + + return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class { + getName () {return config.info.name;} + getAuthor () {return config.info.author;} + getVersion () {return config.info.version;} + 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) => { + 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"})); + 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"); + }); + } + + load () { + if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue: []}); + if (!window.BDFDB_Global.downloadModal) { + window.BDFDB_Global.downloadModal = true; + BdApi.showConfirmationModal("Library Missing", `The Library Plugin needed for ${config.info.name} is missing. Please click "Download Now" to install it.`, { + confirmText: "Download Now", + cancelText: "Cancel", + onCancel: _ => {delete window.BDFDB_Global.downloadModal;}, + onConfirm: _ => { + delete window.BDFDB_Global.downloadModal; + this.downloadLibrary(); + } + }); + } + if (!window.BDFDB_Global.pluginQueue.includes(config.info.name)) window.BDFDB_Global.pluginQueue.push(config.info.name); + } + start () {this.load();} + stop () {} + getSettingsPanel () { + let template = document.createElement("template"); + template.innerHTML = `
The Library Plugin needed for ${config.info.name} is missing.\nPlease click Download Now to install it.
`; + template.content.firstElementChild.querySelector("a").addEventListener("click", this.downloadLibrary); + return template.content.firstElementChild; + } + } : (([Plugin, BDFDB]) => { + var _this; + var toggleButton; + + const ActivityToggleComponent = class ActivityToggle extends BdApi.React.Component { + componentDidMount() { + toggleButton = this; + } + render() { + return BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.PanelButton, Object.assign({}, this.props, { + tooltipText: BDFDB.LibraryModules.SettingsStore.showCurrentGame ? _this.labels.disable_activity : _this.labels.enable_activity, + icon: iconProps => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, Object.assign({}, iconProps, { + nativeClass: true, + iconSVG: BDFDB.LibraryModules.SettingsStore.showCurrentGame ? `` : `` + })), + onClick: _ => { + _this.settings.general[!BDFDB.LibraryModules.SettingsStore.showCurrentGame ? "playEnable" : "playDisable"] && BDFDB.LibraryModules.SoundUtils.playSound(_this.settings.selections[!BDFDB.LibraryModules.SettingsStore.showCurrentGame ? "enableSound" : "disableSound"]); + BDFDB.LibraryModules.SettingsUtils.updateRemoteSettings({showCurrentGame: !BDFDB.LibraryModules.SettingsStore.showCurrentGame}) + } + })); + } + }; + + var sounds = []; + + return class GameActivityToggle extends Plugin { + onLoad () { + _this = this; + + sounds = [(BDFDB.ModuleUtils.findByString("undeafen", "deafen", "robot_man", "mute", false) || {exports: {keys: (_ => [])}}).exports.keys()].flat(10).filter(n => n).map(s => s.replace("./", "").split(".")[0]).sort(); + + this.defaults = { + general: { + playEnable: {value: true, description: "Play Enable Sound"}, + playDisable: {value: true, description: "Play Disable Sound"} + }, + selections: { + enableSound: {value: "stream_started", description: "Enable Sound"}, + disableSound: {value: "stream_ended", description: "Disable Sound"} + } + }; + + this.patchedModules = { + after: { + Account: "render" + } + }; + } + + onStart () { + BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.SettingsUtils, "updateLocalSettings", {after: e => BDFDB.ReactUtils.forceUpdate(toggleButton)}); + + BDFDB.PatchUtils.forceAllUpdates(this); + } + + onStop () { + BDFDB.PatchUtils.forceAllUpdates(this); + } + + getSettingsPanel (collapseStates = {}) { + let settingsPanel; + return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, { + collapseStates: collapseStates, + children: _ => { + let settingsItems = []; + + for (let key in this.defaults.general) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { + type: "Switch", + plugin: this, + keys: ["general", key], + label: this.defaults.general[key].description, + value: this.settings.general[key] + })); + + for (let key in this.defaults.selections) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { + type: "Select", + plugin: this, + keys: ["selections", key], + label: this.defaults.selections[key].description, + basis: "50%", + options: sounds.map(o => ({value: o, label: o.split(/[-_]/g).map(BDFDB.LibraryModules.StringUtils.upperCaseFirstChar).join(" ")})), + value: this.settings.selections[key] + })); + + return settingsItems; + } + }); + } + + processAccount (e) { + let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name: "PanelButton"}); + if (index > -1) children.unshift(BDFDB.ReactUtils.createElement(ActivityToggleComponent, {})); + } + + setLabelsByLanguage () { + switch (BDFDB.LanguageUtils.getLanguage().id) { + case "bg": // Bulgarian + return { + disable_activity: "Деактивирайте активността в играта", + enable_activity: "Активирайте Game Activity" + }; + case "da": // Danish + return { + disable_activity: "Deaktiver spilaktivitet", + enable_activity: "Aktivér spilaktivitet" + }; + case "de": // German + return { + disable_activity: "Spieleaktivität deaktivieren", + enable_activity: "Spieleaktivität aktivieren" + }; + case "el": // Greek + return { + disable_activity: "Απενεργοποίηση δραστηριότητας παιχνιδιού", + enable_activity: "Ενεργοποίηση δραστηριότητας παιχνιδιού" + }; + case "es": // Spanish + return { + disable_activity: "Deshabilitar la actividad del juego", + enable_activity: "Habilitar la actividad del juego" + }; + case "fi": // Finnish + return { + disable_activity: "Poista pelitoiminto käytöstä", + enable_activity: "Ota pelitoiminta käyttöön" + }; + case "fr": // French + return { + disable_activity: "Désactiver l'activité de jeu", + enable_activity: "Activer l'activité de jeu" + }; + case "hr": // Croatian + return { + disable_activity: "Onemogući aktivnost igre", + enable_activity: "Omogući aktivnost u igrama" + }; + case "hu": // Hungarian + return { + disable_activity: "Tiltsa le a játéktevékenységet", + enable_activity: "Engedélyezze a játéktevékenységet" + }; + case "it": // Italian + return { + disable_activity: "Disabilita l'attività di gioco", + enable_activity: "Abilita attività di gioco" + }; + case "ja": // Japanese + return { + disable_activity: "ゲームアクティビティを無効にする", + enable_activity: "ゲームアクティビティを有効にする" + }; + case "ko": // Korean + return { + disable_activity: "게임 활동 비활성화", + enable_activity: "게임 활동 활성화" + }; + case "lt": // Lithuanian + return { + disable_activity: "Išjungti žaidimų veiklą", + enable_activity: "Įgalinti žaidimų veiklą" + }; + case "nl": // Dutch + return { + disable_activity: "Schakel spelactiviteit uit", + enable_activity: "Schakel spelactiviteit in" + }; + case "no": // Norwegian + return { + disable_activity: "Deaktiver spillaktivitet", + enable_activity: "Aktiver spillaktivitet" + }; + case "pl": // Polish + return { + disable_activity: "Wyłącz aktywność w grach", + enable_activity: "Włącz aktywność w grach" + }; + case "pt-BR": // Portuguese (Brazil) + return { + disable_activity: "Desativar atividade de jogo", + enable_activity: "Habilitar atividade de jogo" + }; + case "ro": // Romanian + return { + disable_activity: "Dezactivați Activitatea jocului", + enable_activity: "Activați Activitatea jocului" + }; + case "ru": // Russian + return { + disable_activity: "Отключить игровую активность", + enable_activity: "Включить игровую активность" + }; + case "sv": // Swedish + return { + disable_activity: "Inaktivera spelaktivitet", + enable_activity: "Aktivera spelaktivitet" + }; + case "th": // Thai + return { + disable_activity: "ปิดการใช้งานกิจกรรมของเกม", + enable_activity: "เปิดใช้งานกิจกรรมเกม" + }; + case "tr": // Turkish + return { + disable_activity: "Oyun Etkinliğini Devre Dışı Bırak", + enable_activity: "Oyun Etkinliğini Etkinleştir" + }; + case "uk": // Ukrainian + return { + disable_activity: "Вимкнути ігрову активність", + enable_activity: "Увімкнути ігрову активність" + }; + case "vi": // Vietnamese + return { + disable_activity: "Tắt hoạt động trò chơi", + enable_activity: "Bật hoạt động trò chơi" + }; + case "zh-CN": // Chinese (China) + return { + disable_activity: "禁用游戏活动", + enable_activity: "启用游戏活动" + }; + case "zh-TW": // Chinese (Taiwan) + return { + disable_activity: "禁用遊戲活動", + enable_activity: "啟用遊戲活動" + }; + default: // English + return { + disable_activity: "Disable Game Activity", + enable_activity: "Enable Game Activity" + }; + } + } + }; + })(window.BDFDB_Global.PluginUtils.buildPlugin(config)); +})(); \ No newline at end of file diff --git a/Plugins/GameActivityToggle/README.md b/Plugins/GameActivityToggle/README.md new file mode 100644 index 0000000000..f28dbe2e3d --- /dev/null +++ b/Plugins/GameActivityToggle/README.md @@ -0,0 +1,12 @@ +# Game Activity Toggle - [![Downlad][download-badge]][download-link] [![Paypal][paypal-badge]][paypal-link] [![Patreon][patreon-badge]][patreon-link] + +[download-badge]: https://img.shields.io/badge/Download-Plugin-brightgreen.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADGGlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjaY2BgnuDo4uTKJMDAUFBUUuQe5BgZERmlwH6egY2BmYGBgYGBITG5uMAxIMCHgYGBIS8/L5UBFTAyMHy7xsDIwMDAcFnX0cXJlYE0wJpcUFTCwMBwgIGBwSgltTiZgYHhCwMDQ3p5SUEJAwNjDAMDg0hSdkEJAwNjAQMDg0h2SJAzAwNjCwMDE09JakUJAwMDg3N+QWVRZnpGiYKhpaWlgmNKflKqQnBlcUlqbrGCZ15yflFBflFiSWoKAwMD1A4GBgYGXpf8EgX3xMw8BSMDVQYqg4jIKAUICxE+CDEESC4tKoMHJQODAIMCgwGDA0MAQyJDPcMChqMMbxjFGV0YSxlXMN5jEmMKYprAdIFZmDmSeSHzGxZLlg6WW6x6rK2s99gs2aaxfWMPZ9/NocTRxfGFM5HzApcj1xZuTe4FPFI8U3mFeCfxCfNN45fhXyygI7BD0FXwilCq0A/hXhEVkb2i4aJfxCaJG4lfkaiQlJM8JpUvLS19QqZMVl32llyfvIv8H4WtioVKekpvldeqFKiaqP5UO6jepRGqqaT5QeuA9iSdVF0rPUG9V/pHDBYY1hrFGNuayJsym740u2C+02KJ5QSrOutcmzjbQDtXe2sHY0cdJzVnJRcFV3k3BXdlD3VPXS8Tbxsfd99gvwT//ID6wIlBS4N3hVwMfRnOFCEXaRUVEV0RMzN2T9yDBLZE3aSw5IaUNak30zkyLDIzs+ZmX8xlz7PPryjYVPiuWLskq3RV2ZsK/cqSql01jLVedVPrHzbqNdU0n22VaytsP9op3VXUfbpXta+x/+5Em0mzJ/+dGj/t8AyNmf2zvs9JmHt6vvmCpYtEFrcu+bYsc/m9lSGrTq9xWbtvveWGbZtMNm/ZarJt+w6rnft3u+45uy9s/4ODOYd+Hmk/Jn58xUnrU+fOJJ/9dX7SRe1LR68kXv13fc5Nm1t379TfU75/4mHeY7En+59lvhB5efB1/lv5dxc+NH0y/fzq64Lv4T8Ffp360/rP8f9/AA0ADzT6lvFdAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAF1SURBVHja7JihTgNBEIb/K1WkBtEEAsESBKEvgEKRAhLHOxAMfQ9cHwEMBoFA1/ACBEGgzbkmUAwI+BENubTs9WZmLz1CZtZd9v7/u9vMZGdAGFabA05Hn3sWrYQwRB9rwafreikbQN5LiV6qhorDARzAARzAARzAARzAARzAARygGOAQ6a+GLr9jmlwpDuJbsxQrER+YYrXaI2D8EZyAEfangj2Fq0NrnBWry8YI5yb7rkRbBrDAK7X9NevlAYCL7Kns79iQKcunOU0+iO0fuSzV1QyUNjkU2b9wS66qm2nt8L3Q/oO7Gk3tWO2InzPtv3isU9RP9jqxmR8LMKsqdPVqFoC8qiDM/HiAcFUQZ34IYDr0VUGW+QEfK8BkVZBmfqkAWVWQZ37JAOA+n/nEtnh/wGd8JWP81Nt0P0r8Wu4ADvAHAOq2fsaP4N8BvFXi/ZoB3FYCcJMNKDbQw9Kc7YdoYfDzB+6xjUuM5mY+wsXYHvgeABIzsPkSOM/lAAAAAElFTkSuQmCC&style=flat +[download-link]: https://mwittrien.github.io/downloader/?plugin=GameActivityToggle + +[paypal-badge]: https://img.shields.io/badge/Paypal-Donate!-%23003087.svg?logo=paypal&style=flat +[paypal-link]: https://paypal.me/MircoWittrien + +[patreon-badge]: https://img.shields.io/badge/Patreon-Support!-%23F96854.svg?logo=patreon&style=flat +[patreon-link]: https://patreon.com/MircoWittrien + +Adds a Quick-Toggle Game Activity Button diff --git a/Plugins/GameActivityToggle/_res/cover.png b/Plugins/GameActivityToggle/_res/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..aff0983f6863bdc2d545cae3ebe8d9b41707ae90 GIT binary patch literal 18406 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