From 853381b6f7a674f5b54060056a2245655566c904 Mon Sep 17 00:00:00 2001 From: Ruthenic Date: Fri, 15 Jul 2022 10:29:19 -0400 Subject: [PATCH] early modal api --- dist/build.js | 2 +- src/api/utils/index.js | 4 ++- src/api/utils/modals.js | 77 +++++++++++++++++++++++++++++++++++++++++ src/api/webpack.js | 5 ++- 4 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/api/utils/modals.js diff --git a/dist/build.js b/dist/build.js index 5dca4f5..1cb800f 100644 --- a/dist/build.js +++ b/dist/build.js @@ -1 +1 @@ -!function(){"use strict";function getModules(){let a={};return window.webpackChunkdiscord_app?window.webpackChunkdiscord_app.push([[Math.random().toString(36)],{},b=>{a=b}]):a=webpackJsonp([],[(a,b,c)=>{a.exports=c}]),a.c}let webpack={modules:getModules(),filter:function(a,b){let c=[];for(let d in b){let e=b[d].exports;e&&(e.default&&e.__esModule&&a(e.default)?c.push(e.default):a(e)&&c.push(e))}return c},find:a=>webpack.filter(a,webpack.modules)[0],findAll:a=>webpack.filter(a,webpack.modules),findByProps:(...a)=>webpack.find(b=>a.every(a=>void 0!==b[a])),findByPropsAll:(...a)=>webpack.findAll(b=>a.every(a=>void 0!==b[a])),findByDisplayName:a=>webpack.find(b=>b?.displayName===a),findByStrings:(...a)=>webpack.find(b=>a.every(a=>b.toString().contains(a))),reloadModules(){webpack.modules=getModules()}};function promisifyRequest(a){return new Promise((b,c)=>{a.oncomplete=a.onsuccess=()=>b(a.result),a.onabort=a.onerror=()=>c(a.error)})}function createStore(a,b){var c;let d=(!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise(function(a){var b=function(){return indexedDB.databases().finally(a)};c=setInterval(b,100),b()}).finally(function(){return clearInterval(c)}):Promise.resolve()).then(()=>{let c=indexedDB.open(a);return c.onupgradeneeded=()=>c.result.createObjectStore(b),promisifyRequest(c)});return(a,c)=>d.then(d=>c(d.transaction(b,a).objectStore(b)))}let defaultGetStoreFunc;function defaultGetStore(){return defaultGetStoreFunc||(defaultGetStoreFunc=createStore("keyval-store","keyval")),defaultGetStoreFunc}function get(a,b=defaultGetStore()){return b("readonly",b=>promisifyRequest(b.get(a)))}function set(a,b,c=defaultGetStore()){return c("readwrite",c=>(c.put(b,a),promisifyRequest(c.transaction)))}function eachCursor(a,b){return a.openCursor().onsuccess=function(){this.result&&(b(this.result),this.result.continue())},promisifyRequest(a.transaction)}var idb=Object.freeze({__proto__:null,clear:function(a=defaultGetStore()){return a("readwrite",a=>(a.clear(),promisifyRequest(a.transaction)))},createStore:createStore,del:function(a,b=defaultGetStore()){return b("readwrite",b=>(b.delete(a),promisifyRequest(b.transaction)))},delMany:function(a,b=defaultGetStore()){return b("readwrite",b=>(a.forEach(a=>b.delete(a)),promisifyRequest(b.transaction)))},entries:function(a=defaultGetStore()){return a("readonly",b=>{if(b.getAll&&b.getAllKeys)return Promise.all([promisifyRequest(b.getAllKeys()),promisifyRequest(b.getAll()),]).then(([a,b])=>a.map((a,c)=>[a,b[c]]));let c=[];return a("readonly",a=>eachCursor(a,a=>c.push([a.key,a.value])).then(()=>c))})},get:get,getMany:function(a,b=defaultGetStore()){return b("readonly",b=>Promise.all(a.map(a=>promisifyRequest(b.get(a)))))},keys:function(a=defaultGetStore()){return a("readonly",a=>{if(a.getAllKeys)return promisifyRequest(a.getAllKeys());let b=[];return eachCursor(a,a=>b.push(a.key)).then(()=>b)})},promisifyRequest:promisifyRequest,set:set,setMany:function(a,b=defaultGetStore()){return b("readwrite",b=>(a.forEach(a=>b.put(a[1],a[0])),promisifyRequest(b.transaction)))},update:function(a,b,c=defaultGetStore()){return c("readwrite",c=>new Promise((d,e)=>{c.get(a).onsuccess=function(){try{c.put(b(this.result),a),d(promisifyRequest(c.transaction))}catch(f){e(f)}}}))},values:function(a=defaultGetStore()){return a("readonly",a=>{if(a.getAll)return promisifyRequest(a.getAll());let b=[];return eachCursor(a,a=>b.push(a.value)).then(()=>b)})}}),Events=Object.freeze({GET:"GET",SET:"SET",DELETE:"DELETE",UPDATE:"UPDATE"});class EventEmitter{constructor(){for(let a of(this.listeners=Object.values(Events).reduce((a,b)=>(a[b]=new Set,a),{}),this.on=function(a,b){if(this.listeners[a].has(b))throw Error(`This listener on ${a} already exists.`);this.listeners[a].add(b)},this.once=function(a,b){let c=(a,d)=>{this.off(a,c),b(a,d)};this.on(a,c)},this.off=function(a,b){this.listeners[a].delete(b)},this.emit=function(a,b){for(let c of this.listeners[a])c(a,b)},Object.values(Events)))this[a.toLowerCase()]=b=>{this.emit(a,b)}}}function make(a={},{nestArrays:b=!0}={}){let c=new EventEmitter;function d(a,e,f){return new Proxy(a,{get(a,g){let h=[...f,g],i=a[g];return null!=i?(c.get({path:h,value:i}),!b&&Array.isArray(i))?i:"object"==typeof i?d(i,e,h):i:d(a[g]={},e,h)},set:(a,b,d)=>(a[b]=d,c.set({path:[...f,b],value:d}),!0),deleteProperty:(a,b)=>!!delete a[b]&&(c.delete({path:[...f,b]}),!0),has:(a,b)=>("object"!=typeof a[b]||0!==Object.keys(a[b]).length)&&b in a})}return Object.assign({store:d(a,a,[]),ghost:a},c)}var nests=Object.freeze({__proto__:null,Events:Events,make:make});let React$1=webpack.findByProps("createElement"),{useRef,useReducer,useEffect}=React$1;function useNest(a,b=!1,c=()=>!0){useRef(a.ghost);let[,d]=useReducer(a=>~a,0);return useEffect(()=>{function e(a,b){c(a,b)&&d()}return a.on(Events.UPDATE,e),b||(a.on(Events.SET,e),a.on(Events.DELETE,e)),()=>{a.off(Events.UPDATE,e),b||(a.off(Events.SET,e),a.off(Events.DELETE,e))}},[]),a.ghost}let{findByProps}=webpack,React=findByProps("createElement");var common={React,ReactDOM:findByProps("hydrate"),dispatch:findByProps("dirtyDispatch").__proto__,idb,nests};let styleBase="@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@700&display=swap'); font-family: 'IBM Plex Mono', monospace;",styleBg=`${styleBase} color: #1d1131; background-color: #aa8dd8; font-weight: 600; font-size: 0.9em; padding: 0px 5px 1px 5px; border-radius: 5px;`,styleTxt=`${styleBase} color: #E2EECE; font-weight: 500; font-size: 0.9em;`;function makeLogger(a,b=!1){return function(c,...d){d=d.join(""),void 0===c&&(c=["Default"],makeLogger("warn")("Requested hierarchy has not been passed to logger function, defaulting to default string",["Logger"])),"string"==typeof c&&(d=c,c=["Default"]);let e=["Demoncord",...c,d],f=[],g="";b&&e.splice(0,1);for(let h=0;h{let plug=currdemon.plugins[key],exports=(0,eval)(plug.initialize),ret=exports.onStart();nest.store[plug.meta.name].ctx=ret,currdemon.status[plug.meta.name]={running:!0}}),extNest.store.pluginsList=currdemon.plugins,extNest.store.pluginsStatus=currdemon.status,await set("demon",currdemon)}async function add(iife,meta){let extNest=demon.summon("internal/nest"),currdemon=await get("demon"),exports=(0,eval)(iife);exports.meta&&(meta=exports.meta),currdemon.plugins[meta.name]={initialize:iife,meta:meta},extNest.store.pluginsList=currdemon.plugins,extNest.store.pluginsStatus=currdemon.status,await set("demon",currdemon)}async function del(name){let extNest=demon.summon("internal/nest"),currdemon=await get("demon");if(currdemon.plugins[name]&&currdemon.status[name].running){let ctx=nest.store[name].ctx;(0,eval)(currdemon.plugins[name].initialize).onStop(ctx)}delete currdemon.status[name],delete currdemon.plugins[name],extNest.store.pluginsList=currdemon.plugins,extNest.store.pluginsStatus=currdemon.status,await set("demon",currdemon)}async function toggle(name){let extNest=demon.summon("internal/nest"),currdemon=await get("demon");if(currdemon.plugins[name]){if(currdemon.status[name]?.running){console.log(currdemon.status[name].ctx);let ctx=nest.store[name].ctx;(0,eval)(currdemon.plugins[name].initialize).onStop(ctx),currdemon.status[name].running=!1}else{let ret=(0,eval)(currdemon.plugins[name].initialize).onStart();nest.store[name].ctx=ret,currdemon.status[name]={running:!0}}}extNest.store.pluginsList=currdemon.plugins,extNest.store.pluginsStatus=currdemon.status,await set("demon",currdemon)}var plugins$1={init:init$1,add,del,toggle};let patchTypes=["a","b","i"],patchedObjects=new Map;function unpatch(a,b,c,d){let e=patchedObjects.get(a),f=e?.[b];if(!f?.[d].has(c))return!1;if(f[d].delete(c),patchTypes.every(a=>0===f[a].size)){let g=Reflect.defineProperty(a,b,{value:f.o,writable:!0,configurable:!0});g||(a[b]=f.o),delete e[b]}return 0==Object.keys(e).length&&patchedObjects.delete(a),!0}var getPatchFunc=a=>(b,c,d,e=!1)=>{if("function"!=typeof c[b])throw Error(`${b} is not a function in ${c.constructor.name}`);patchedObjects.has(c)||patchedObjects.set(c,{});let f=patchedObjects.get(c);if(!f[b]){let g=c[b];f[b]={o:g,b:new Map,i:new Map,a:new Map};let h=(a,d,f)=>{let g=function(a,b,c,d,e){let f=patchedObjects.get(b)?.[a];if(!f)return e?Reflect.construct(b[a],c,d):b[a].apply(d,c);for(let g of f.b.values()){let h=g.call(d,c);Array.isArray(h)&&(c=h)}let i=(...a)=>e?Reflect.construct(f.o,a,d):f.o.apply(d,a);for(let j of f.i.values()){let k=i;i=(...a)=>j.call(d,a,k)}let l=i(...c);for(let m of f.a.values())l=m.call(d,c,l)??l;return l}(b,c,d,a,f);return e&&l(),g},i=new Proxy(g,{apply:(a,b,c)=>h(b,c,!1),construct:(a,b)=>h(g,b,!0),get:(a,b,c)=>"toString"==b?g.toString.bind(g):Reflect.get(a,b,c)}),j=Reflect.defineProperty(c,b,{value:i,configurable:!0,writable:!0});j||(c[b]=i)}let k=Symbol(),l=()=>unpatch(c,b,k,a);return f[b][a].set(k,d),l};let before=getPatchFunc("b"),instead=getPatchFunc("i"),after=getPatchFunc("a");var spitroast=Object.freeze({__proto__:null,instead:instead,before:before,after:after,unpatchAll:function(){for(let[a,b]of patchedObjects.entries())for(let c in b)for(let d of patchTypes)for(let e of b[c]?.[d].keys()??[])unpatch(a,c,e,d)}});let Header$1=webpack.findByProps("Sizes","Tags"),Card=webpack.findByDisplayName("Card");webpack.findByDisplayName("Flex");let FormText=webpack.findByDisplayName("FormText");webpack.findByProps("BorderColors","Colors"),webpack.findByDisplayName("FormDivider");let Switch=webpack.findByDisplayName("Switch");var PlugCard=a=>(useNest(a.nest),a.nest.ghost.pluginsList[a.name]&&a.nest.ghost.pluginsStatus[a.name])?React.createElement(React.Fragment,null,React.createElement(Card,{type:"cardPrimary",className:"demon-settings-card-base",outline:!1,editable:!1},React.createElement(Header$1,{className:"demon-settings-card-header",size:Header$1.Sizes.SIZE_20},a.name),React.createElement("hr",{className:"demon-settings-card-divider"}),React.createElement(FormText,{className:"demon-settings-card-desc"},a.nest.ghost.pluginsList[a.name].meta.desc),React.createElement("svg",{position:"top",async onClick(){del(a.name)},className:"demon-settings-card-delete",viewBox:"0 0 24 24"},React.createElement("path",{fill:"var(--text-muted)",d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12 1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z"})),React.createElement(Switch,{className:"demon-settings-card-switch",checked:a.nest.ghost.pluginsStatus[a.name].running,async onChange(){toggle(a.name)}}))):null;let Header=webpack.findByProps("Sizes","Tags");webpack.findByDisplayName("FormTitle"),webpack.findByDisplayName("FormSection");let FormDivider=webpack.findByDisplayName("FormDivider");var plugins=()=>{let a=demon.summon("internal/nest");return useNest(a),React.createElement(React.Fragment,null,React.createElement(Header,{size:"demon-settings-header-size30"},"Plugins"),React.createElement(FormDivider,{className:"demon-settings-divider"}),Object.keys(a.ghost.pluginsList).map(b=>React.createElement(React.Fragment,null,React.createElement(PlugCard,{name:b,nest:a}))))};let Checkbox=webpack.findByDisplayName("Checkbox");class HummusUI extends React.Component{constructor(a){super(a),this.state={tg:0}}render(){let a=demon.summon("internal/nest");return React.createElement("div",{className:"control-group demon-settings-card-header"},React.createElement("label",{className:"demon-settings-header-size30 "},"Plugins"),Object.keys(a.ghost.pluginsList).map(b=>React.createElement("div",{className:"demon-settings-card-base"},React.createElement("span",null,React.createElement(Checkbox,{className:`demon-stub-plugin-checkbox-${b}`,checked:a.ghost.pluginsStatus[b].running,onChange:async()=>{toggle(b);let c=document.getElementsByClassName(`demon-stub-plugin-checkbox-${b}`)[0];a.ghost.pluginsStatus[b].running?c.value="off":c.value="on",this.setState({tg:!this.state.tg})}},b)))))}}function injectCSS(a){let b=document.createElement("style");b.className="demon-element-css",b.innerHTML=a,document.head.appendChild(b)}var css={injectCSS,createClass:function(a,b){let c=Object.entries(b).map(([a,b])=>`${a}:${b}`).join(";");injectCSS(`.${a} {${c}}`)}};let SettingsView=webpack.findByDisplayName("SettingsView"),demon$1={modules:{webpack,common},utils:{logger:{log,warn,error,trace,makeLogger}},plugins:plugins$1,internal:{nest:common.nests.make()},css,patcher:spitroast,stolas:{monologue(){let a=webpack.findByProps("getCurrentUser").getCurrentUser().username;return _.sample([`${a}, you know that when I'm lonely, I become hungry. And when I become hungry, I want to choke on that red **** of yours... **** your ***** and lick all of your *****, before taking out your *****, and **** with more teeth until you're screaming ********** like a FUCKING baby--!`,`Ohhh, ${a}! I'm so excited! I cannot wait to feel your slimy c**k inside of my ****. To ***** the— ...**** use while you and I and **** and jelly sandwiches all night...!`])}}};window.demon={summon:function(a){let b=a.split("/"),c=demon$1;return b.forEach(a=>{if(a in c)c=c[a];else throw Error("Module does not exist!")}),c}},plugins$1.init(),({init:function(){if(css.createClass("demon-settings-divider",{"margin-top":"10px","margin-bottom":"10px",height:"1px"}),css.createClass("demon-settings-card-divider",{"margin-top":"5px","margin-bottom":"5px","margin-left":"10px","margin-right":"10px",height:"1px",border:"thin solid var(--background-modifier-accent)"}),css.createClass("demon-settings-card-base",{"margin-bottom":"10px"}),css.createClass("demon-settings-card-header",{"margin-left":"10px","margin-top":"10px"}),css.createClass("demon-settings-card-desc",{color:"var(--header-secondary)",display:"inline-block","font-size":"15px","line-height":"15px","margin-left":"10px","margin-top":"5px","margin-bottom":"10px"}),css.createClass("demon-settings-card-switch",{"margin-right":"10px","margin-top":"0px","margin-bottom":"10px",float:"right"}),css.createClass("demon-settings-card-delete",{"margin-right":"5px",float:"right",width:"24px",cursor:"pointer"}),css.createClass("demon-settings-header-size30",{"font-size":"30px","line-height":"34px"}),window.webpackChunkdiscord_app)after("getPredicateSections",SettingsView.prototype,(a,b)=>(b.unshift({section:"HEADER",label:"Demoncord"},{section:"demoncord",label:"Plugins",element:plugins},{section:"DIVIDER"}),b));else{let a=webpack.findByProps("getUserSettingsModalSections"),b=webpack.findByProps("TabBarItem");after("render",a.default.prototype,(a,c)=>{c.props.children[0].props.children.props.children[1].push(React.createElement(b.TabBarItem,{key:"demoncord"},"Plugins")),"demoncord"===c.props.children[0].props.children.props.selectedItem&&(c.props.children[1].props.children[0].props.children=React.createElement(HummusUI,{},""))})}}}).init()}() +!function(){"use strict";function getModules(){let a={};return window.webpackChunkdiscord_app?window.webpackChunkdiscord_app.push([[Math.random().toString(36)],{},b=>{a=b}]):a=webpackJsonp([],[(a,b,c)=>{a.exports=c}]),a.c}let webpack={modules:getModules(),filter:function(a,b){let c=[];for(let d in b){let e=b[d].exports;e&&(e.default&&e.__esModule&&a(e.default)?c.push(e.default):a(e)&&c.push(e))}return c},find:a=>webpack.filter(a,webpack.modules)[0],findAll:a=>webpack.filter(a,webpack.modules),findByProps:(...a)=>webpack.find(b=>a.every(a=>void 0!==b[a])),findByPropsAll:(...a)=>webpack.findAll(b=>a.every(a=>void 0!==b[a])),findByDisplayName:a=>webpack.find(b=>b?.displayName===a),findByDisplayNameAll:a=>webpack.findAll(b=>b?.displayName===a),findByStrings:(...a)=>webpack.find(b=>a.every(a=>b.toString().contains(a))),reloadModules(){webpack.modules=getModules()}};function promisifyRequest(a){return new Promise((b,c)=>{a.oncomplete=a.onsuccess=()=>b(a.result),a.onabort=a.onerror=()=>c(a.error)})}function createStore(a,b){var c;let d=(!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise(function(a){var b=function(){return indexedDB.databases().finally(a)};c=setInterval(b,100),b()}).finally(function(){return clearInterval(c)}):Promise.resolve()).then(()=>{let c=indexedDB.open(a);return c.onupgradeneeded=()=>c.result.createObjectStore(b),promisifyRequest(c)});return(a,c)=>d.then(d=>c(d.transaction(b,a).objectStore(b)))}let defaultGetStoreFunc;function defaultGetStore(){return defaultGetStoreFunc||(defaultGetStoreFunc=createStore("keyval-store","keyval")),defaultGetStoreFunc}function get(a,b=defaultGetStore()){return b("readonly",b=>promisifyRequest(b.get(a)))}function set(a,b,c=defaultGetStore()){return c("readwrite",c=>(c.put(b,a),promisifyRequest(c.transaction)))}function eachCursor(a,b){return a.openCursor().onsuccess=function(){this.result&&(b(this.result),this.result.continue())},promisifyRequest(a.transaction)}var idb=Object.freeze({__proto__:null,clear:function(a=defaultGetStore()){return a("readwrite",a=>(a.clear(),promisifyRequest(a.transaction)))},createStore:createStore,del:function(a,b=defaultGetStore()){return b("readwrite",b=>(b.delete(a),promisifyRequest(b.transaction)))},delMany:function(a,b=defaultGetStore()){return b("readwrite",b=>(a.forEach(a=>b.delete(a)),promisifyRequest(b.transaction)))},entries:function(a=defaultGetStore()){return a("readonly",b=>{if(b.getAll&&b.getAllKeys)return Promise.all([promisifyRequest(b.getAllKeys()),promisifyRequest(b.getAll()),]).then(([a,b])=>a.map((a,c)=>[a,b[c]]));let c=[];return a("readonly",a=>eachCursor(a,a=>c.push([a.key,a.value])).then(()=>c))})},get:get,getMany:function(a,b=defaultGetStore()){return b("readonly",b=>Promise.all(a.map(a=>promisifyRequest(b.get(a)))))},keys:function(a=defaultGetStore()){return a("readonly",a=>{if(a.getAllKeys)return promisifyRequest(a.getAllKeys());let b=[];return eachCursor(a,a=>b.push(a.key)).then(()=>b)})},promisifyRequest:promisifyRequest,set:set,setMany:function(a,b=defaultGetStore()){return b("readwrite",b=>(a.forEach(a=>b.put(a[1],a[0])),promisifyRequest(b.transaction)))},update:function(a,b,c=defaultGetStore()){return c("readwrite",c=>new Promise((d,e)=>{c.get(a).onsuccess=function(){try{c.put(b(this.result),a),d(promisifyRequest(c.transaction))}catch(f){e(f)}}}))},values:function(a=defaultGetStore()){return a("readonly",a=>{if(a.getAll)return promisifyRequest(a.getAll());let b=[];return eachCursor(a,a=>b.push(a.value)).then(()=>b)})}}),Events=Object.freeze({GET:"GET",SET:"SET",DELETE:"DELETE",UPDATE:"UPDATE"});class EventEmitter{constructor(){for(let a of(this.listeners=Object.values(Events).reduce((a,b)=>(a[b]=new Set,a),{}),this.on=function(a,b){if(this.listeners[a].has(b))throw Error(`This listener on ${a} already exists.`);this.listeners[a].add(b)},this.once=function(a,b){let c=(a,d)=>{this.off(a,c),b(a,d)};this.on(a,c)},this.off=function(a,b){this.listeners[a].delete(b)},this.emit=function(a,b){for(let c of this.listeners[a])c(a,b)},Object.values(Events)))this[a.toLowerCase()]=b=>{this.emit(a,b)}}}function make(a={},{nestArrays:b=!0}={}){let c=new EventEmitter;function d(a,e,f){return new Proxy(a,{get(a,g){let h=[...f,g],i=a[g];return null!=i?(c.get({path:h,value:i}),!b&&Array.isArray(i))?i:"object"==typeof i?d(i,e,h):i:d(a[g]={},e,h)},set:(a,b,d)=>(a[b]=d,c.set({path:[...f,b],value:d}),!0),deleteProperty:(a,b)=>!!delete a[b]&&(c.delete({path:[...f,b]}),!0),has:(a,b)=>("object"!=typeof a[b]||0!==Object.keys(a[b]).length)&&b in a})}return Object.assign({store:d(a,a,[]),ghost:a},c)}var nests=Object.freeze({__proto__:null,Events:Events,make:make});let React$1=webpack.findByProps("createElement"),{useRef,useReducer,useEffect}=React$1;function useNest(a,b=!1,c=()=>!0){useRef(a.ghost);let[,d]=useReducer(a=>~a,0);return useEffect(()=>{function e(a,b){c(a,b)&&d()}return a.on(Events.UPDATE,e),b||(a.on(Events.SET,e),a.on(Events.DELETE,e)),()=>{a.off(Events.UPDATE,e),b||(a.off(Events.SET,e),a.off(Events.DELETE,e))}},[]),a.ghost}let{findByProps:findByProps$1}=webpack,React=findByProps$1("createElement");var common={React,ReactDOM:findByProps$1("hydrate"),dispatch:findByProps$1("dirtyDispatch").__proto__,idb,nests};let styleBase="@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@700&display=swap'); font-family: 'IBM Plex Mono', monospace;",styleBg=`${styleBase} color: #1d1131; background-color: #aa8dd8; font-weight: 600; font-size: 0.9em; padding: 0px 5px 1px 5px; border-radius: 5px;`,styleTxt=`${styleBase} color: #E2EECE; font-weight: 500; font-size: 0.9em;`;function makeLogger(a,b=!1){return function(c,...d){d=d.join(""),void 0===c&&(c=["Default"],makeLogger("warn")("Requested hierarchy has not been passed to logger function, defaulting to default string",["Logger"])),"string"==typeof c&&(d=c,c=["Default"]);let e=["Demoncord",...c,d],f=[],g="";b&&e.splice(0,1);for(let h=0;h3!==a.transitionState&&React.createElement(ConfirmModal,_extends({transitionState:a.transitionState,onClose:()=>e=!1,onCancel:()=>e=!1&a.onClose(),onConfirm:()=>e=!0&a.onClose()},b),React.createElement("component",_extends({},c),d))),e}let nest=make();async function init$1(){let extNest=demon.summon("internal/nest");window.__demon||(window.__demon={}),await get("demon")||await set("demon",{status:{},plugins:{}});let currdemon=await get("demon");currdemon.status={},Object.keys(currdemon.plugins).forEach(key=>{let plug=currdemon.plugins[key],exports=(0,eval)(plug.initialize),ret=exports.onStart();nest.store[plug.meta.name].ctx=ret,currdemon.status[plug.meta.name]={running:!0}}),extNest.store.pluginsList=currdemon.plugins,extNest.store.pluginsStatus=currdemon.status,await set("demon",currdemon)}async function add(iife,meta){let extNest=demon.summon("internal/nest"),currdemon=await get("demon"),exports=(0,eval)(iife);exports.meta&&(meta=exports.meta),currdemon.plugins[meta.name]={initialize:iife,meta:meta},extNest.store.pluginsList=currdemon.plugins,extNest.store.pluginsStatus=currdemon.status,await set("demon",currdemon)}async function del(name){let extNest=demon.summon("internal/nest"),currdemon=await get("demon");if(currdemon.plugins[name]&&currdemon.status[name].running){let ctx=nest.store[name].ctx;(0,eval)(currdemon.plugins[name].initialize).onStop(ctx)}delete currdemon.status[name],delete currdemon.plugins[name],extNest.store.pluginsList=currdemon.plugins,extNest.store.pluginsStatus=currdemon.status,await set("demon",currdemon)}async function toggle(name){let extNest=demon.summon("internal/nest"),currdemon=await get("demon");if(currdemon.plugins[name]){if(currdemon.status[name]?.running){console.log(currdemon.status[name].ctx);let ctx=nest.store[name].ctx;(0,eval)(currdemon.plugins[name].initialize).onStop(ctx),currdemon.status[name].running=!1}else{let ret=(0,eval)(currdemon.plugins[name].initialize).onStart();nest.store[name].ctx=ret,currdemon.status[name]={running:!0}}}extNest.store.pluginsList=currdemon.plugins,extNest.store.pluginsStatus=currdemon.status,await set("demon",currdemon)}var plugins$1={init:init$1,add,del,toggle};let patchTypes=["a","b","i"],patchedObjects=new Map;function unpatch(a,b,c,d){let e=patchedObjects.get(a),f=e?.[b];if(!f?.[d].has(c))return!1;if(f[d].delete(c),patchTypes.every(a=>0===f[a].size)){let g=Reflect.defineProperty(a,b,{value:f.o,writable:!0,configurable:!0});g||(a[b]=f.o),delete e[b]}return 0==Object.keys(e).length&&patchedObjects.delete(a),!0}var getPatchFunc=a=>(b,c,d,e=!1)=>{if("function"!=typeof c[b])throw Error(`${b} is not a function in ${c.constructor.name}`);patchedObjects.has(c)||patchedObjects.set(c,{});let f=patchedObjects.get(c);if(!f[b]){let g=c[b];f[b]={o:g,b:new Map,i:new Map,a:new Map};let h=(a,d,f)=>{let g=function(a,b,c,d,e){let f=patchedObjects.get(b)?.[a];if(!f)return e?Reflect.construct(b[a],c,d):b[a].apply(d,c);for(let g of f.b.values()){let h=g.call(d,c);Array.isArray(h)&&(c=h)}let i=(...a)=>e?Reflect.construct(f.o,a,d):f.o.apply(d,a);for(let j of f.i.values()){let k=i;i=(...a)=>j.call(d,a,k)}let l=i(...c);for(let m of f.a.values())l=m.call(d,c,l)??l;return l}(b,c,d,a,f);return e&&l(),g},i=new Proxy(g,{apply:(a,b,c)=>h(b,c,!1),construct:(a,b)=>h(g,b,!0),get:(a,b,c)=>"toString"==b?g.toString.bind(g):Reflect.get(a,b,c)}),j=Reflect.defineProperty(c,b,{value:i,configurable:!0,writable:!0});j||(c[b]=i)}let k=Symbol(),l=()=>unpatch(c,b,k,a);return f[b][a].set(k,d),l};let before=getPatchFunc("b"),instead=getPatchFunc("i"),after=getPatchFunc("a");var spitroast=Object.freeze({__proto__:null,instead:instead,before:before,after:after,unpatchAll:function(){for(let[a,b]of patchedObjects.entries())for(let c in b)for(let d of patchTypes)for(let e of b[c]?.[d].keys()??[])unpatch(a,c,e,d)}});let Header$1=webpack.findByProps("Sizes","Tags"),Card=webpack.findByDisplayName("Card");webpack.findByDisplayName("Flex");let FormText=webpack.findByDisplayName("FormText");webpack.findByProps("BorderColors","Colors"),webpack.findByDisplayName("FormDivider");let Switch=webpack.findByDisplayName("Switch");var PlugCard=a=>(useNest(a.nest),a.nest.ghost.pluginsList[a.name]&&a.nest.ghost.pluginsStatus[a.name])?React.createElement(React.Fragment,null,React.createElement(Card,{type:"cardPrimary",className:"demon-settings-card-base",outline:!1,editable:!1},React.createElement(Header$1,{className:"demon-settings-card-header",size:Header$1.Sizes.SIZE_20},a.name),React.createElement("hr",{className:"demon-settings-card-divider"}),React.createElement(FormText,{className:"demon-settings-card-desc"},a.nest.ghost.pluginsList[a.name].meta.desc),React.createElement("svg",{position:"top",async onClick(){del(a.name)},className:"demon-settings-card-delete",viewBox:"0 0 24 24"},React.createElement("path",{fill:"var(--text-muted)",d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12 1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z"})),React.createElement(Switch,{className:"demon-settings-card-switch",checked:a.nest.ghost.pluginsStatus[a.name].running,async onChange(){toggle(a.name)}}))):null;let Header=webpack.findByProps("Sizes","Tags");webpack.findByDisplayName("FormTitle"),webpack.findByDisplayName("FormSection");let FormDivider=webpack.findByDisplayName("FormDivider");var plugins=()=>{let a=demon.summon("internal/nest");return useNest(a),React.createElement(React.Fragment,null,React.createElement(Header,{size:"demon-settings-header-size30"},"Plugins"),React.createElement(FormDivider,{className:"demon-settings-divider"}),Object.keys(a.ghost.pluginsList).map(b=>React.createElement(React.Fragment,null,React.createElement(PlugCard,{name:b,nest:a}))))};let Checkbox=webpack.findByDisplayName("Checkbox");class HummusUI extends React.Component{constructor(a){super(a),this.state={tg:0}}render(){let a=demon.summon("internal/nest");return React.createElement("div",{className:"control-group demon-settings-card-header"},React.createElement("label",{className:"demon-settings-header-size30 "},"Plugins"),Object.keys(a.ghost.pluginsList).map(b=>React.createElement("div",{className:"demon-settings-card-base"},React.createElement("span",null,React.createElement(Checkbox,{className:`demon-stub-plugin-checkbox-${b}`,checked:a.ghost.pluginsStatus[b].running,onChange:async()=>{toggle(b);let c=document.getElementsByClassName(`demon-stub-plugin-checkbox-${b}`)[0];a.ghost.pluginsStatus[b].running?c.value="off":c.value="on",this.setState({tg:!this.state.tg})}},b)))))}}function injectCSS(a){let b=document.createElement("style");b.className="demon-element-css",b.innerHTML=a,document.head.appendChild(b)}var css={injectCSS,createClass:function(a,b){let c=Object.entries(b).map(([a,b])=>`${a}:${b}`).join(";");injectCSS(`.${a} {${c}}`)}};let SettingsView=webpack.findByDisplayName("SettingsView"),demon$1={modules:{webpack,common},utils:{logger:{log,warn,error,trace,makeLogger},modals:{rawOpenConfirmModal,openConfirmModal:function(a,b,c){let d;if(c.color)d=c.color;else switch(b){case"danger":d=Colors.colorRed;break;case"confirm":d=Colors.colorGreen;break;default:d=Colors.colorBrandNew}return rawOpenConfirmModal(Markdown,{header:c.header??"Default Modal Header",confirmText:c.confirmText??"Confirm",cancelText:c.cancelText??"Cancel",confirmButtonColor:d},{editable:!1},a??"Default modal content")}}},plugins:plugins$1,internal:{nest:common.nests.make()},css,patcher:spitroast,stolas:{monologue(){let a=webpack.findByProps("getCurrentUser").getCurrentUser().username;return _.sample([`${a}, you know that when I'm lonely, I become hungry. And when I become hungry, I want to choke on that red **** of yours... **** your ***** and lick all of your *****, before taking out your *****, and **** with more teeth until you're screaming ********** like a FUCKING baby--!`,`Ohhh, ${a}! I'm so excited! I cannot wait to feel your slimy c**k inside of my ****. To ***** the— ...**** use while you and I and **** and jelly sandwiches all night...!`])}}};window.demon={summon:function(a){let b=a.split("/"),c=demon$1;return b.forEach(a=>{if(a in c)c=c[a];else throw Error("Module does not exist!")}),c}},plugins$1.init(),({init:function(){if(css.createClass("demon-settings-divider",{"margin-top":"10px","margin-bottom":"10px",height:"1px"}),css.createClass("demon-settings-card-divider",{"margin-top":"5px","margin-bottom":"5px","margin-left":"10px","margin-right":"10px",height:"1px",border:"thin solid var(--background-modifier-accent)"}),css.createClass("demon-settings-card-base",{"margin-bottom":"10px"}),css.createClass("demon-settings-card-header",{"margin-left":"10px","margin-top":"10px"}),css.createClass("demon-settings-card-desc",{color:"var(--header-secondary)",display:"inline-block","font-size":"15px","line-height":"15px","margin-left":"10px","margin-top":"5px","margin-bottom":"10px"}),css.createClass("demon-settings-card-switch",{"margin-right":"10px","margin-top":"0px","margin-bottom":"10px",float:"right"}),css.createClass("demon-settings-card-delete",{"margin-right":"5px",float:"right",width:"24px",cursor:"pointer"}),css.createClass("demon-settings-header-size30",{"font-size":"30px","line-height":"34px"}),window.webpackChunkdiscord_app)after("getPredicateSections",SettingsView.prototype,(a,b)=>(b.unshift({section:"HEADER",label:"Demoncord"},{section:"demoncord",label:"Plugins",element:plugins},{section:"DIVIDER"}),b));else{let a=webpack.findByProps("getUserSettingsModalSections"),b=webpack.findByProps("TabBarItem");after("render",a.default.prototype,(a,c)=>{c.props.children[0].props.children.props.children[1].push(React.createElement(b.TabBarItem,{key:"demoncord"},"Plugins")),"demoncord"===c.props.children[0].props.children.props.selectedItem&&(c.props.children[1].props.children[0].props.children=React.createElement(HummusUI,{},""))})}}}).init()}() diff --git a/src/api/utils/index.js b/src/api/utils/index.js index 5b9ceea..61341bf 100644 --- a/src/api/utils/index.js +++ b/src/api/utils/index.js @@ -1,5 +1,7 @@ import logger from "./logger"; +import modals from "./modals"; export default { - logger + logger, + modals }; diff --git a/src/api/utils/modals.js b/src/api/utils/modals.js new file mode 100644 index 0000000..4e2ff96 --- /dev/null +++ b/src/api/utils/modals.js @@ -0,0 +1,77 @@ +import webpack from "../webpack" +import { React } from "../common" + +const { findByProps, findByDisplayName, findByDisplayNameAll } = webpack + +const { openModal } = findByProps("openModalLazy") +const Colors = findByProps("button", "colorRed") +const ConfirmModal = findByDisplayName("ConfirmModal") +const Markdown = findByDisplayNameAll("Markdown")[1] + +function rawOpenConfirmModal(component, props, insideProps, insideContent) { + if (insideProps === undefined) { + insideProps = {} + } + if (insideContent === undefined) { + insideContent = "" + } + let confirmed; + openModal((e) => { + if (e.transitionState === 3) { + return false //TODO: the fuck does this do? + } + + return ( + confirmed = false} + onCancel = {() => confirmed = false & e.onClose()} + onConfirm = {() => confirmed = true & e.onClose()} + {...props} + > + {insideContent} + + ) + }) + while (confirmed === undefined) { + + } + return confirmed +} + +function openConfirmModal(content, type, opts) { + let buttonColor; + if (!!opts.color) { + buttonColor = opts.color + } else { + switch (type) { + case "danger": + buttonColor = Colors.colorRed + break + case "confirm": + buttonColor = Colors.colorGreen + break + default: + buttonColor = Colors.colorBrandNew + break + } + } + return rawOpenConfirmModal( + Markdown, + { + header: opts.header ?? "Default Modal Header", + confirmText: opts.confirmText ?? "Confirm", + cancelText: opts.cancelText ?? "Cancel", + confirmButtonColor: buttonColor + }, + { + editable: false + }, + content ?? "Default modal content" + ) +} + +export default { + rawOpenConfirmModal, + openConfirmModal +} \ No newline at end of file diff --git a/src/api/webpack.js b/src/api/webpack.js index 9919993..fad81b1 100644 --- a/src/api/webpack.js +++ b/src/api/webpack.js @@ -57,6 +57,9 @@ let webpack = { findByDisplayName: (prop) => { return webpack.find((m) => m?.displayName === prop); }, + findByDisplayNameAll: (prop) => { + return webpack.findAll((m) => m?.displayName === prop) + }, findByStrings: (...props) => { return webpack.find((module) => props.every((prop) => module.toString().contains(prop)) @@ -68,4 +71,4 @@ let webpack = { } }; -export default webpack; +export default webpack; \ No newline at end of file