From 22eec8797f186174439d483ee2b8ed31ed709332 Mon Sep 17 00:00:00 2001 From: Ruthenic Date: Fri, 26 Aug 2022 00:06:27 -0400 Subject: [PATCH] typescriptification finalization --- dist/build.js | 2 +- package.json | 2 +- rollup.config.js | 2 +- src/api/ritual.ts | 8 +++----- src/api/ui/settings/settings.ts | 4 ++-- src/global.d.ts | 9 +++++++-- src/{index.js => index.ts} | 4 ++-- src/{shim_react.js => shim_react.ts} | 0 8 files changed, 17 insertions(+), 14 deletions(-) rename src/{index.js => index.ts} (95%) rename src/{shim_react.js => shim_react.ts} (100%) diff --git a/dist/build.js b/dist/build.js index 7d7536f..05f13e3 100644 --- a/dist/build.js +++ b/dist/build.js @@ -1 +1 @@ -!function(){"use strict";let getModules;if(window.webpackChunkdiscord_app){let modules1={};window.webpackChunkdiscord_app.push([[Math.random().toString(36)],{},a=>{modules1=a}]),getModules=()=>modules1.c}else{let modules=webpackJsonp([],[(a,b,c)=>{a.exports=c}]);getModules=()=>modules.c}let webpack={modules:getModules(),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){let c=indexedDB.open(a);c.onupgradeneeded=()=>c.result.createObjectStore(b);let d=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"),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){let e=d.join("");void 0===c&&(c=["Default"],makeLogger(console.warn)(["Logger"],"Requested hierarchy has not been passed to logger function, defaulting to default string")),"string"==typeof c&&(e=c,c=["Default"]);let f=["Demoncord",...c,e],g=[],h="";b&&f.splice(0,1);for(let i=0;i{console.log(...a)});var logger={log,warn,error,trace,debug,makeLogger};function _extends(){return(_extends=Object.assign||function(a){for(var b=1;b3!==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}function leak(a){window.beelzejuice||(window.beelzejuice=[]),Math.random().toString(36).slice(2),window.beelzejuice.push(new Uint8Array(Math.floor(1048576*a)).fill(666))}let ctxNest=make(),pluginNest,pluginEval=iife=>(0,eval)(iife);async function savePlugin(a,{path:b,value:c}){logger.debug(["Plugins"],`Got ${a} event for plugin manager's nest with path ${b} and val ${c}`),await set("demon",{plugins:pluginNest.ghost.plugins})}async function init$1(){pluginNest=demon.summon("internal/nest"),await get("demon")||await set("demon",{plugins:{}}),pluginNest.store.plugins=(await get("demon")).plugins,pluginNest.on(Events.SET,savePlugin),pluginNest.on(Events.DELETE,savePlugin),Object.keys(pluginNest.ghost.plugins).forEach(a=>{if(pluginNest.ghost.plugins[a].enabled){let b=pluginEval(pluginNest.ghost.plugins[a].iife),c=b.onStart();ctxNest.store[a]=c,pluginNest.store.plugins[a].enabled=!0}else pluginNest.store.plugins[a].enabled=!1})}function add$1(a){let b=pluginEval(a);logger.debug(["Plugins"],`Adding ${b.meta.name}`),pluginNest.store.plugins[b.meta.name]={iife:a,enabled:!1,desc:b.meta.desc}}function del(a){if(pluginNest.ghost.plugins[a])logger.debug(["Plugins"],`Removing ${a}`),delete pluginNest.store.plugins[a];else throw Error("Can't delete plugin that doesn't exist. lol")}function toggle(a){if(pluginNest.ghost.plugins[a]){if(pluginNest.ghost.plugins[a].enabled){logger.debug(["Plugins"],`Disabling ${a}`);let b=pluginEval(pluginNest.ghost.plugins[a].iife);b.onStop(ctxNest.store[a]),pluginNest.store.plugins[a].enabled=!1}else{logger.debug(["Plugins"],`Enabling ${a}`);let c=pluginEval(pluginNest.ghost.plugins[a].iife),d=c.onStart();ctxNest.store[a]=d,pluginNest.store.plugins[a].enabled=!0}}}var plugins$1={init:init$1,add:add$1,del,toggle};function wackyPatch(a,b,c){if("string"==typeof a){let d=a;a=b,b=d}let e=Symbol(),f=c.before,g=c.instead,h=c.after,i={apply(a,b,[d,e]){void 0!==f&&f.apply(d,[e]);let i=void 0!==c.instead?g.apply(d,[e,a.bind(d)]):a.apply(d,e);return void 0===h?i:h.apply(d,[e,i])}},j=new Proxy(a[b],i),k=a[b];a[b]=function(){return j(this,arguments)};let l=()=>{a[b]=k};return a[e]={name:b,orig:k,unpatch:l},l}function instead(a,b,c){return wackyPatch(a,b,{instead:c})}function after(a,b,c){return wackyPatch(a,b,{after:c})}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.plugins[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.plugins[a.name].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.plugins[a.name].enabled,async onChange(){toggle(a.name)}}))):null;let Header=webpack.findByProps("Sizes","Tags"),FormDivider=webpack.findByDisplayName("FormDivider"),Flex=webpack.findByDisplayName("Flex"),TextInput=webpack.findByDisplayName("TextInput");webpack.findByProps("BorderColors","Colors");var plugins=()=>{let a=demon.summon("internal/nest"),[b,c]=React.useState("");return useNest(a),React.createElement(React.Fragment,null,React.createElement(Header,{size:"demon-settings-header-size30"},"Plugins"),React.createElement(Flex,{basis:"auto",grow:1,shrink:1},React.createElement(TextInput,{className:"demon-settings-url",placeholder:"https://git.ruthenic.com/ruthenic/demoncord-noReplyMention/raw/branch/master/dist/plugin.js",type:"text",value:b,onChange:c,async onKeyDown(a){if("Enter"===a.key){let d=await (await fetch("https://cors.ruthenic.com/"+b)).text();add$1(d),c("")}}})),React.createElement(FormDivider,{className:"demon-settings-divider"}),Object.keys(a.ghost.plugins).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.plugins).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.plugins[b].enabled,onChange:async()=>{toggle(b);let c=document.getElementsByClassName(`demon-stub-plugin-checkbox-${b}`)[0];a.ghost.plugins[b].enabled?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"),pluginSettings=[{section:"HEADER",label:"Demoncord"},{section:"demoncord",label:"Plugins",element:plugins},{section:"DIVIDER"}];var settings={init:function(){if(css.createClass("demon-settings-url",{"margin-top":"10px",width:"100%"}),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(SettingsView.prototype,"getPredicateSections",(a,b)=>(b.unshift(...pluginSettings),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,{},""))})}},add:function(a,b){let c=pluginSettings.push({section:"demoncord-plugins",label:a,element:b})-1;return()=>{delete pluginSettings[c]}}};let sins={Lust:null,Pride:null,Greed:null,Wrath:null,Envy:null,Gluttony(){setInterval(()=>{leak(6.66)},500)},Sloth(){instead(webpack.findByProps("_actionHandlers").__proto__,"dispatch",(a,b)=>{let c;return setTimeout(()=>{c=b(...a)},500),c})}},rulers={Asmodeus:"Lust",Lucifer:"Pride",Mammon:"Greed",Satan:"Wrath",Leviathan:"Envy",Beelzebub:"Gluttony",Belphegor:"Sloth"};function ritualFail(a){if(Math.random()>.5)throw"Illegal Invocation of a sin!";if(a in sins){if(sins[a])sins[a]();else throw"Illegal Invocation of a sin!"}else console.log("WTF did you do"),console.log(a)}Object.assign(webpack,{findByRitual:function(a){let b=a.split(" ");if("I"!==b.shift()||"call"!==b.shift()||"upon"!==b.shift()||"the"!==b.shift()){ritualFail(sins[Math.floor(Math.random()*sins.length)]);return}let c=b.shift();if(!("embodiment"===c||"king"===c&&"sin"===b.shift())){ritualFail(sins[Math.floor(Math.random()*sins.length)]);return}"of"!==b.shift()&&ritualFail(d);let d=b.shift().replace(",","");if(!(d in sins)){ritualFail(sins[Math.floor(Math.random()*sins.length)]);return}let e=b.shift().replace(",","");e in rulers||ritualFail(d),rulers[e]!==d&&ritualFail(rulers[e]),"to"!==b.shift()&&ritualFail(d),"summon"!==b.shift()&&ritualFail(d),"the"!==b.shift()&&ritualFail(d);let f=b.shift();"imposing"!==f&&"foreboding"!==f&&ritualFail(d);let g=b.shift();"object"!==g&&"element"!==g&&ritualFail(d),("with"!==b.shift()||"a"!==b.shift())&&ritualFail(d);let h=b.shift();"display"!==h&&"property"!==h&&ritualFail(d),("of"!==b.shift()||"name"!==b.shift())&&ritualFail(d);let i=b.shift().slice(0,-1);switch(h){case"display":return webpack.findByDisplayName(i);case"property":return webpack.findByProps(i);default:ritualFail(d)}}});let demon$1={modules:{webpack,common},utils:{logger,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")}},memory:{leak}},plugins:plugins$1,internal:{nest:common.nests.make()},css,patcher:{instead,before:function(a,b,c){return wackyPatch(a,b,{before:c})},after},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...!`])}},settings};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(),settings.init()}() +!function(){"use strict";let getModules;if(window.webpackChunkdiscord_app){let modules1;window.webpackChunkdiscord_app.push([[Math.random().toString(36)],{},a=>{modules1=a}]),getModules=()=>modules1.c}else{let modules=window.webpackJsonp([],[(a,b,c)=>{a.exports=c}]);getModules=()=>modules.c}let webpack={modules:getModules(),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){let c=indexedDB.open(a);c.onupgradeneeded=()=>c.result.createObjectStore(b);let d=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"),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){let e=d.join("");void 0===c&&(c=["Default"],makeLogger(console.warn)(["Logger"],"Requested hierarchy has not been passed to logger function, defaulting to default string")),"string"==typeof c&&(e=c,c=["Default"]);let f=["Demoncord",...c,e],g=[],h="";b&&f.splice(0,1);for(let i=0;i{console.log(...a)});var logger={log,warn,error,trace,debug,makeLogger};function _extends(){return(_extends=Object.assign||function(a){for(var b=1;b3!==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}function leak(a){window.beelzejuice||(window.beelzejuice=[]),Math.random().toString(36).slice(2),window.beelzejuice.push(new Uint8Array(Math.floor(1048576*a)).fill(666))}let ctxNest=make(),pluginNest,pluginEval=iife=>(0,eval)(iife);async function savePlugin(a,{path:b,value:c}){logger.debug(["Plugins"],`Got ${a} event for plugin manager's nest with path ${b} and val ${c}`),await set("demon",{plugins:pluginNest.ghost.plugins})}async function init$1(){pluginNest=demon.summon("internal/nest"),await get("demon")||await set("demon",{plugins:{}}),pluginNest.store.plugins=(await get("demon")).plugins,pluginNest.on(Events.SET,savePlugin),pluginNest.on(Events.DELETE,savePlugin),Object.keys(pluginNest.ghost.plugins).forEach(a=>{if(pluginNest.ghost.plugins[a].enabled){let b=pluginEval(pluginNest.ghost.plugins[a].iife),c=b.onStart();ctxNest.store[a]=c,pluginNest.store.plugins[a].enabled=!0}else pluginNest.store.plugins[a].enabled=!1})}function add$1(a){let b=pluginEval(a);logger.debug(["Plugins"],`Adding ${b.meta.name}`),pluginNest.store.plugins[b.meta.name]={iife:a,enabled:!1,desc:b.meta.desc}}function del(a){if(pluginNest.ghost.plugins[a])logger.debug(["Plugins"],`Removing ${a}`),delete pluginNest.store.plugins[a];else throw Error("Can't delete plugin that doesn't exist. lol")}function toggle(a){if(pluginNest.ghost.plugins[a]){if(pluginNest.ghost.plugins[a].enabled){logger.debug(["Plugins"],`Disabling ${a}`);let b=pluginEval(pluginNest.ghost.plugins[a].iife);b.onStop(ctxNest.store[a]),pluginNest.store.plugins[a].enabled=!1}else{logger.debug(["Plugins"],`Enabling ${a}`);let c=pluginEval(pluginNest.ghost.plugins[a].iife),d=c.onStart();ctxNest.store[a]=d,pluginNest.store.plugins[a].enabled=!0}}}var plugins$1={init:init$1,add:add$1,del,toggle};function wackyPatch(a,b,c){if("string"==typeof a){let d=a;a=b,b=d}let e=Symbol(),f=c.before,g=c.instead,h=c.after,i={apply(a,b,[d,e]){void 0!==f&&f.apply(d,[e]);let i=void 0!==c.instead?g.apply(d,[e,a.bind(d)]):a.apply(d,e);return void 0===h?i:h.apply(d,[e,i])}},j=new Proxy(a[b],i),k=a[b];a[b]=function(){return j(this,arguments)};let l=()=>{a[b]=k};return a[e]={name:b,orig:k,unpatch:l},l}function instead(a,b,c){return wackyPatch(a,b,{instead:c})}function after(a,b,c){return wackyPatch(a,b,{after:c})}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.plugins[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.plugins[a.name].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.plugins[a.name].enabled,async onChange(){toggle(a.name)}}))):null;let Header=webpack.findByProps("Sizes","Tags"),FormDivider=webpack.findByDisplayName("FormDivider"),Flex=webpack.findByDisplayName("Flex"),TextInput=webpack.findByDisplayName("TextInput");webpack.findByProps("BorderColors","Colors");var plugins=()=>{let a=demon.summon("internal/nest"),[b,c]=React.useState("");return useNest(a),React.createElement(React.Fragment,null,React.createElement(Header,{size:"demon-settings-header-size30"},"Plugins"),React.createElement(Flex,{basis:"auto",grow:1,shrink:1},React.createElement(TextInput,{className:"demon-settings-url",placeholder:"https://git.ruthenic.com/ruthenic/demoncord-noReplyMention/raw/branch/master/dist/plugin.js",type:"text",value:b,onChange:c,async onKeyDown(a){if("Enter"===a.key){let d=await (await fetch("https://cors.ruthenic.com/"+b)).text();add$1(d),c("")}}})),React.createElement(FormDivider,{className:"demon-settings-divider"}),Object.keys(a.ghost.plugins).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.plugins).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.plugins[b].enabled,onChange:async()=>{toggle(b);let c=document.getElementsByClassName(`demon-stub-plugin-checkbox-${b}`)[0];a.ghost.plugins[b].enabled?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"),pluginSettings=[{section:"HEADER",label:"Demoncord"},{section:"demoncord",label:"Plugins",element:plugins},{section:"DIVIDER"}];var settings={init:function(){if(css.createClass("demon-settings-url",{"margin-top":"10px",width:"100%"}),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(SettingsView.prototype,"getPredicateSections",(a,b)=>(b.unshift(...pluginSettings),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,{},""))})}},add:function(a,b){let c=pluginSettings.push({section:"demoncord-plugins",label:a,element:b})-1;return()=>{delete pluginSettings[c]}}};let sins={Lust:null,Pride:null,Greed:null,Wrath:null,Envy:null,Gluttony(){setInterval(()=>{leak(6.66)},500)},Sloth(){instead(webpack.findByProps("_actionHandlers").__proto__,"dispatch",(a,b)=>{let c;return setTimeout(()=>{c=b(...a)},500),c})}},rulers={Asmodeus:"Lust",Lucifer:"Pride",Mammon:"Greed",Satan:"Wrath",Leviathan:"Envy",Beelzebub:"Gluttony",Belphegor:"Sloth"};function ritualFail(a){if(Math.random()>.5)throw"Illegal Invocation of a sin!";if(a in sins){if(sins[a])sins[a]();else throw"Illegal Invocation of a sin!"}else console.log("WTF did you do"),console.log(a)}Object.assign(webpack,{findByRitual:function(a){let b=a.split(" ");if("I"!==b.shift()||"call"!==b.shift()||"upon"!==b.shift()||"the"!==b.shift()){ritualFail(Object.keys(sins)[Math.floor(Math.random()*Object.keys(sins).length)]);return}let c=b.shift();if(!("embodiment"===c||"king"===c&&"sin"===b.shift())){ritualFail(Object.keys(sins)[Math.floor(Math.random()*Object.keys(sins).length)]);return}"of"!==b.shift()&&ritualFail(Object.keys(sins)[Math.floor(Math.random()*Object.keys(sins).length)]);let d=b.shift().replace(",","");if(!(d in sins)){ritualFail(Object.keys(sins)[Math.floor(Math.random()*Object.keys(sins).length)]);return}let e=b.shift().replace(",","");e in rulers||ritualFail(d),rulers[e]!==d&&ritualFail(rulers[e]),"to"!==b.shift()&&ritualFail(d),"summon"!==b.shift()&&ritualFail(d),"the"!==b.shift()&&ritualFail(d);let f=b.shift();"imposing"!==f&&"foreboding"!==f&&ritualFail(d);let g=b.shift();"object"!==g&&"element"!==g&&ritualFail(d),("with"!==b.shift()||"a"!==b.shift())&&ritualFail(d);let h=b.shift();"display"!==h&&"property"!==h&&ritualFail(d),("of"!==b.shift()||"name"!==b.shift())&&ritualFail(d);let i=b.shift().slice(0,-1);switch(h){case"display":return webpack.findByDisplayName(i);case"property":return webpack.findByProps(i);default:ritualFail(d)}}});let demon$1={modules:{webpack,common},utils:{logger,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")}},memory:{leak}},plugins:plugins$1,internal:{nest:common.nests.make()},css,patcher:{instead,before:function(a,b,c){return wackyPatch(a,b,{before:c})},after},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...!`])}},settings};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(),settings.init()}() diff --git a/package.json b/package.json index f209d45..b66c059 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "demoncord-rewrite", "version": "0.0.1", "description": "A client mod for sinners.", - "main": "src/index.js", + "main": "src/index.ts", "scripts": { "build": "rollup --config rollup.config.js", "watch": "node watchbuild" diff --git a/rollup.config.js b/rollup.config.js index 99a7b19..2f2ceb9 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -44,7 +44,7 @@ export default defineConfig({ find: "react", replacement: resolvePath( projectRootDir, - "src/shim_react.js" + "src/shim_react.ts" ) } ] diff --git a/src/api/ritual.ts b/src/api/ritual.ts index ca120a0..2a28674 100644 --- a/src/api/ritual.ts +++ b/src/api/ritual.ts @@ -1,8 +1,6 @@ - - -import webpack from "./webpack.js"; -import { instead } from "./patcher.js"; -import { leak } from "./utils/memory.js"; +import webpack from "./webpack"; +import { instead } from "./patcher"; +import { leak } from "./utils/memory"; type Sins = Record void) | null> diff --git a/src/api/ui/settings/settings.ts b/src/api/ui/settings/settings.ts index 056ff1d..46ea14b 100644 --- a/src/api/ui/settings/settings.ts +++ b/src/api/ui/settings/settings.ts @@ -1,7 +1,7 @@ import webpack from "../../webpack"; import { after } from "../../patcher"; -import plugins from "./plugins.js"; -import hummus from "./hummus.js"; +import plugins from "./plugins"; +import hummus from "./hummus"; import css from "../../css"; import { React } from "../../common"; diff --git a/src/global.d.ts b/src/global.d.ts index bb0accd..1da0dbd 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -12,11 +12,14 @@ interface Nest { emit: any } -const demon: { +type DemonGlobal = { summon: (mod: string) => any } +const demon: DemonGlobal + interface Window { + demon: DemonGlobal beelzejuice: Uint8Array[] webpackChunkdiscord_app: any webpackJsonp: (thing1: [], thing2: [(mod: any, _exports: any, req: any) => void]) => any @@ -31,4 +34,6 @@ namespace JSX { label: any span: any } -} \ No newline at end of file +} + +const _: any \ No newline at end of file diff --git a/src/index.js b/src/index.ts similarity index 95% rename from src/index.js rename to src/index.ts index ec90e4f..23be062 100644 --- a/src/index.js +++ b/src/index.ts @@ -11,7 +11,7 @@ Object.assign(webpack, { findByRitual }); -const demon = { +const demon: Record = { modules: { webpack, common @@ -37,7 +37,7 @@ const demon = { settings }; -function summon(mod) { +function summon(mod: string) { const mods = mod.split("/"); let res = demon; mods.forEach((m) => { diff --git a/src/shim_react.js b/src/shim_react.ts similarity index 100% rename from src/shim_react.js rename to src/shim_react.ts