From e3770a9ed5e4cac48a56262fa3553916f01c04bb Mon Sep 17 00:00:00 2001 From: Ruthenic Date: Tue, 11 Jan 2022 15:28:58 -0500 Subject: [PATCH] move from demonpatcher to simian --- dist/build.js | 2 +- package.json | 3 ++- pnpm-lock.yaml | 6 ++++++ src/init.js | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/dist/build.js b/dist/build.js index 3100cf2..d064f1a 100644 --- a/dist/build.js +++ b/dist/build.js @@ -1 +1 @@ -(function(){"use strict";function l(n,e,t){var r=Symbol();const o=t.before,u=t.instead,f=t.after,X=new Proxy(e[n],{apply:(b,Z,[d,p])=>{o!==void 0&&o.apply(d,p);const E=t.instead!==void 0?u.apply(d,[b.bind(d),...p]):b.apply(d,p);return f===void 0?E:f.apply(d,[E].concat(p))}}),h=e[n];e[n]=function(){return X(this,arguments)};var v=()=>{e[n]=h};return e[r]={name:n,orig:h,unpatch:v},v}function D(n,e,t){return l(n,e,{before:t})}function P(n,e,t){return l(n,e,{instead:t})}function O(n,e,t){return l(n,e,{after:t})}var R={monkeyPatch:l,before:D,instead:P,after:O};function k(){let n={};return window.webpackChunkdiscord_app.push([[Math.random().toString(36)],{},e=>{n=e}]),n.c}function x(n,e){let t=[];for(const r in e){const o=e[r].exports;o&&(o.default&&o.__esModule&&n(o.default)?t.push(o.default):n(o)&&t.push(o))}return t}let s={modules:k(),filter:x,find:n=>s.filter(n,s.modules)[0],findAll:n=>s.filter(n,s.modules),findByProps:(...n)=>s.find(e=>n.every(t=>e[t]!==void 0)),findByPropsAll:(...n)=>s.findAll(e=>n.every(t=>e[t]!==void 0))};function I(){var n=!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent);if(!n||!indexedDB.databases)return Promise.resolve();var e;return new Promise(function(t){var r=function(){return indexedDB.databases().finally(t)};e=setInterval(r,100),r()}).finally(function(){return clearInterval(e)})}function i(n){return new Promise((e,t)=>{n.oncomplete=n.onsuccess=()=>e(n.result),n.onabort=n.onerror=()=>t(n.error)})}function y(n,e){const t=I().then(()=>{const r=indexedDB.open(n);return r.onupgradeneeded=()=>r.result.createObjectStore(e),i(r)});return(r,o)=>t.then(u=>o(u.transaction(e,r).objectStore(e)))}let m;function a(){return m||(m=y("keyval-store","keyval")),m}function c(n,e=a()){return e("readonly",t=>i(t.get(n)))}function _(n,e,t=a()){return t("readwrite",r=>(r.put(e,n),i(r.transaction)))}function M(n,e=a()){return e("readwrite",t=>(n.forEach(r=>t.put(r[1],r[0])),i(t.transaction)))}function B(n,e=a()){return e("readonly",t=>Promise.all(n.map(r=>i(t.get(r)))))}function T(n,e,t=a()){return t("readwrite",r=>new Promise((o,u)=>{r.get(n).onsuccess=function(){try{r.put(e(this.result),n),o(i(r.transaction))}catch(f){u(f)}}}))}function C(n,e=a()){return e("readwrite",t=>(t.delete(n),i(t.transaction)))}function L(n,e=a()){return e("readwrite",t=>(n.forEach(r=>t.delete(r)),i(t.transaction)))}function A(n=a()){return n("readwrite",e=>(e.clear(),i(e.transaction)))}function g(n,e){return n("readonly",t=>(t.openCursor().onsuccess=function(){!this.result||(e(this.result),this.result.continue())},i(t.transaction)))}function U(n=a()){const e=[];return g(n,t=>e.push(t.key)).then(()=>e)}function N(n=a()){const e=[];return g(n,t=>e.push(t.value)).then(()=>e)}function $(n=a()){const e=[];return g(n,t=>e.push([t.key,t.value])).then(()=>e)}var F=Object.freeze({__proto__:null,clear:A,createStore:y,del:C,delMany:L,entries:$,get:c,getMany:B,keys:U,promisifyRequest:i,set:_,setMany:M,update:T,values:N});const H={React:s.findByProps("__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","createElement"),ReactDOM:s.findByProps("__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","hydrate"),"idb-keyval":F};function W(n){n.demon.__commands={},n.demon.patcher.after("sendMessage",n.demon.webpack.findByProps("sendMessage"),(e,t)=>{let r;for(const o of Reflect.ownKeys(n.demon.__commands)){let u=n.demon.__commands[o];if(t[1].content.split(" ")[0]===">"+u.name){r=u.callback(t);break}}return r!==void 0&&(t[1].content=r),t})}function Y(n){let e=Symbol(n.name);return window.demon.__commands[e]=n,()=>{delete window.demon.__commands[e]}}var w={add:Y,init:W};async function G(n){return n.demon.__plugins={},!0}async function z(n,e){const t={metadata:e,iife:n,enabled:!1},r=await c("demoncord");return r.plugin[e.name]=t,await _("demoncord",r),!0}async function K(n){const e=await c("demoncord");return e.plugin[n]===void 0?(console.error("[Demoncord] Cannot remove non-existant plugin!"),!1):(e.plugin[n]=void 0,delete e.plugin[n],await _("demoncord",e),!0)}async function J(n){const e=await c("demoncord");if(e.plugin[n]===void 0)return console.error("[Demoncord] Cannot start non-existant plugin!"),!1;{console.log(`[Demoncord] Starting ${n}...`);const t=e.plugin[n],o=(0,eval)(t.iife).onStart;let u={};return o(u),console.log(`[Demoncord] Started ${n}!`),window.demon.__plugins[n]={status:1,ctx:u},!0}}async function Q(n){const e=await c("demoncord");if(e.plugin[n]===void 0)return console.error("[Demoncord] Cannot stop non-existant or non-running plugin!"),!1;{console.log(`[Demoncord] Stopping ${n}...`);const t=e.plugin[n];return(0,eval)(t.iife).onStop(window.demon.__plugins[n].ctx),console.log(`[Demoncord] Stopped ${n}!`),!0}}var S={init:G,addPlugin:z,delPlugin:K,startPlugin:J,stopPlugin:Q};async function V(n){n.demon={patcher:R,webpack:s,common:H,commands:{add:w.add},__DO_NOT_USE_OR_YOU_WILL_BE_FIRED_UNTO_THE_DEPTHS_OF_HELL:{plugins:S}},w.init(n),S.init(n)}window.demon&&delete window.demon,V(window)})(); +(function(){"use strict";const D=e=>typeof e.prev=="function"?e.prev:D(e.prev);var M=(e,n,t)=>{const r=n[e][t];return r===void 0?n[t]:D(r)};class O{constructor(n,t,r){this.data={id:n,func:(o,...i)=>r(o,typeof this.prev=="function"?this.prev:this.prev.data.func,i)},this.prev=t}}var B=(e,n,t,r)=>{const o=e[r][n];if(o.data.id===t){if(typeof o.prev=="function"){e[n]=o.prev,delete e[r][n];return}e[r][n]=o.prev,e[n]=o.prev.data.func;return}const i=a=>a&&typeof a.prev=="object"?(a.data=a.prev.data,a.prev=a.prev.prev,i(a.prev)):!0,f=a=>{if(!a)throw new Error("could not find unpatch");return typeof a.prev=="object"&&a.data.id!==t?f(a.prev):i(a)};let l=Object.assign({},o);f(l),e[r][n]=l,e[n]=l.data.func},T=function(e,n,t,r,o){if(r==="m")throw new TypeError("Private method is not writable");if(r==="a"&&!o)throw new TypeError("Private accessor was defined without a setter");if(typeof n=="function"?e!==n||!o:!n.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return r==="a"?o.call(e,t):o?o.value=t:n.set(e,t),t},s=function(e,n,t,r){if(t==="a"&&!r)throw new TypeError("Private accessor was defined without a getter");if(typeof n=="function"?e!==n||!r:!n.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?r:t==="a"?r.call(e):r?r.value:n.get(e)},y,d,m,E;class x{constructor(n="simian"){y.add(this),d.set(this,void 0),m.set(this,void 0),T(this,d,Symbol(n),"f"),T(this,m,new Set,"f"),this.after=s(this,y,"m",E).call(this,"AFTER"),this.before=s(this,y,"m",E).call(this,"BEFORE"),this.instead=s(this,y,"m",E).call(this,"INSTEAD")}cleanupAll(){for(const n of s(this,m,"f")){for(const t in n[s(this,d,"f")]){const r=M(s(this,d,"f"),n,t);n[t]=r,n[s(this,d,"f")][t]=void 0}n[s(this,d,"f")]=void 0,delete n[s(this,d,"f")]}s(this,m,"f").clear()}}d=new WeakMap,m=new WeakMap,y=new WeakSet,E=function(n){return(t,r,o)=>{const i=r[t];if(typeof i!="function")throw new Error(`${t} is not a function on ${r}`);const f=Symbol();r[s(this,d,"f")]===void 0&&(r[s(this,d,"f")]={});let l;switch(n){case"AFTER":l=(h,v,_)=>{let w=v.apply(h,_);const S=o.apply(h,[_,w]);return typeof S!="undefined"&&(w=S),w};break;case"BEFORE":l=(h,v,_)=>{var w;let S=_;const F=(w=o.apply(h,[_]))!==null&&w!==void 0?w:_;return Array.isArray(F)&&(S=F),v.apply(h,S)};break;case"INSTEAD":l=(h,v,_)=>o.apply(h,[_,v.bind(h)]);break}let a=r[s(this,d,"f")][t];return a===void 0?a=new O(f,i,l):a=new O(f,a,l),r[s(this,d,"f")][t]=a,r[t]=function(){return a.data.func(this,...arguments)},Object.assign(r[t],i),s(this,m,"f").add(r),()=>B(r,t,f,s(this,d,"f"))}};function I(){let e={};return window.webpackChunkdiscord_app.push([[Math.random().toString(36)],{},n=>{e=n}]),e.c}function L(e,n){let t=[];for(const r in n){const o=n[r].exports;o&&(o.default&&o.__esModule&&e(o.default)?t.push(o.default):e(o)&&t.push(o))}return t}let p={modules:I(),filter:L,find:e=>p.filter(e,p.modules)[0],findAll:e=>p.filter(e,p.modules),findByProps:(...e)=>p.find(n=>e.every(t=>n[t]!==void 0)),findByPropsAll:(...e)=>p.findAll(n=>e.every(t=>n[t]!==void 0))};function $(){var e=!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent);if(!e||!indexedDB.databases)return Promise.resolve();var n;return new Promise(function(t){var r=function(){return indexedDB.databases().finally(t)};n=setInterval(r,100),r()}).finally(function(){return clearInterval(n)})}function u(e){return new Promise((n,t)=>{e.oncomplete=e.onsuccess=()=>n(e.result),e.onabort=e.onerror=()=>t(e.error)})}function A(e,n){const t=$().then(()=>{const r=indexedDB.open(e);return r.onupgradeneeded=()=>r.result.createObjectStore(n),u(r)});return(r,o)=>t.then(i=>o(i.transaction(n,r).objectStore(n)))}let P;function c(){return P||(P=A("keyval-store","keyval")),P}function g(e,n=c()){return n("readonly",t=>u(t.get(e)))}function b(e,n,t=c()){return t("readwrite",r=>(r.put(n,e),u(r.transaction)))}function U(e,n=c()){return n("readwrite",t=>(e.forEach(r=>t.put(r[1],r[0])),u(t.transaction)))}function W(e,n=c()){return n("readonly",t=>Promise.all(e.map(r=>u(t.get(r)))))}function G(e,n,t=c()){return t("readwrite",r=>new Promise((o,i)=>{r.get(e).onsuccess=function(){try{r.put(n(this.result),e),o(u(r.transaction))}catch(f){i(f)}}}))}function H(e,n=c()){return n("readwrite",t=>(t.delete(e),u(t.transaction)))}function Y(e,n=c()){return n("readwrite",t=>(e.forEach(r=>t.delete(r)),u(t.transaction)))}function z(e=c()){return e("readwrite",n=>(n.clear(),u(n.transaction)))}function R(e,n){return e("readonly",t=>(t.openCursor().onsuccess=function(){!this.result||(n(this.result),this.result.continue())},u(t.transaction)))}function K(e=c()){const n=[];return R(e,t=>n.push(t.key)).then(()=>n)}function J(e=c()){const n=[];return R(e,t=>n.push(t.value)).then(()=>n)}function Q(e=c()){const n=[];return R(e,t=>n.push([t.key,t.value])).then(()=>n)}var V=Object.freeze({__proto__:null,clear:z,createStore:A,del:H,delMany:Y,entries:Q,get:g,getMany:W,keys:K,promisifyRequest:u,set:b,setMany:U,update:G,values:J});const X={React:p.findByProps("__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","createElement"),ReactDOM:p.findByProps("__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","hydrate"),"idb-keyval":V};function Z(e){e.demon.__commands={},e.demon.patcher.after("sendMessage",e.demon.webpack.findByProps("sendMessage"),(n,t)=>{let r;for(const o of Reflect.ownKeys(e.demon.__commands)){let i=e.demon.__commands[o];if(t[1].content.split(" ")[0]===">"+i.name){r=i.callback(t);break}}return r!==void 0&&(t[1].content=r),t})}function q(e){let n=Symbol(e.name);return window.demon.__commands[n]=e,()=>{delete window.demon.__commands[n]}}var k={add:q,init:Z};async function N(e){return e.demon.__plugins={},!0}async function j(e,n){const t={metadata:n,iife:e,enabled:!1},r=await g("demoncord");return r.plugin[n.name]=t,await b("demoncord",r),!0}async function ee(e){const n=await g("demoncord");return n.plugin[e]===void 0?(console.error("[Demoncord] Cannot remove non-existant plugin!"),!1):(n.plugin[e]=void 0,delete n.plugin[e],await b("demoncord",n),!0)}async function ne(e){const n=await g("demoncord");if(n.plugin[e]===void 0)return console.error("[Demoncord] Cannot start non-existant plugin!"),!1;{console.log(`[Demoncord] Starting ${e}...`);const t=n.plugin[e],o=(0,eval)(t.iife).onStart;let i={};return o(i),console.log(`[Demoncord] Started ${e}!`),window.demon.__plugins[e]={status:1,ctx:i},!0}}async function te(e){const n=await g("demoncord");if(n.plugin[e]===void 0)return console.error("[Demoncord] Cannot stop non-existant or non-running plugin!"),!1;{console.log(`[Demoncord] Stopping ${e}...`);const t=n.plugin[e];return(0,eval)(t.iife).onStop(window.demon.__plugins[e].ctx),console.log(`[Demoncord] Stopped ${e}!`),!0}}var C={init:N,addPlugin:j,delPlugin:ee,startPlugin:ne,stopPlugin:te};async function re(e){const n=new x;e.demon={patcher:{monkeyPatch:function(t,r,o){let[i,f,l]=[()=>{},()=>{},()=>{}];return o.before!==void 0&&(i=n.before(t,r,o.before)),o.instead!==void 0&&(i=n.instead(t,r,o.instead)),o.after!==void 0&&(i=n.after(t,r,o.after)),()=>{i(),f(),l()}},before:n.before,instead:n.instead,after:n.after},webpack:p,common:X,commands:{add:k.add},__DO_NOT_USE_OR_YOU_WILL_BE_FIRED_UNTO_THE_DEPTHS_OF_HELL:{plugins:C}},k.init(e),C.init(e)}window.demon&&delete window.demon,re(window)})(); diff --git a/package.json b/package.json index 25792b3..88bb633 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "rollup": "^2.63.0", "rollup-plugin-esbuild": "^4.8.2", "rollup-plugin-flow": "^1.1.1", - "rollup-plugin-uglify": "^6.0.4" + "rollup-plugin-uglify": "^6.0.4", + "simian": "^1.4.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ad8183..bc25175 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,7 @@ specifiers: rollup-plugin-esbuild: ^4.8.2 rollup-plugin-flow: ^1.1.1 rollup-plugin-uglify: ^6.0.4 + simian: ^1.4.3 devDependencies: '@rollup/plugin-commonjs': 21.0.1_rollup@2.63.0 @@ -25,6 +26,7 @@ devDependencies: rollup-plugin-esbuild: 4.8.2_esbuild@0.14.11+rollup@2.63.0 rollup-plugin-flow: 1.1.1 rollup-plugin-uglify: 6.0.4_rollup@2.63.0 + simian: 1.4.3 packages: @@ -627,6 +629,10 @@ packages: resolution: {integrity: sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==} dev: true + /simian/1.4.3: + resolution: {integrity: sha512-oETEd8qhSqrHyUPmTfjVIpxydAcXALA6rccrNdx/3chULLiG6TH18HYiUjlqGPB5AvnjbQfRViMIGgwNjh7uXA==} + dev: true + /sourcemap-codec/1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: true diff --git a/src/init.js b/src/init.js index dc7733e..4df6413 100644 --- a/src/init.js +++ b/src/init.js @@ -1,13 +1,41 @@ // @flow -import demonpatcher from "demonpatcher" +import Patcher from "simian" import webpack from "./api/webpack.js" import common from "./api/common.js" import commands from "./api/commands.js" import plugins from "./api/plugins.js" async function init(obj: Object): Promise { + const patcher = new Patcher() obj.demon = { - patcher: demonpatcher, + patcher: { + monkeyPatch: function(name: string, parentObj: Object, patches: Object): ()=>void { + let [upb,upi,upa] = [()=>{},()=>{},()=>{}] + if (patches.before !== undefined) upb = patcher.before( + name, + parentObj, + patches.before + ) + if (patches.instead !== undefined) upb = patcher.instead( + name, + parentObj, + patches.instead + ) + if (patches.after !== undefined) upb = patcher.after( + name, + parentObj, + patches.after + ) + return ()=>{ + upb() + upi() + upa() + } + }, + before: patcher.before, + instead: patcher.instead, + after: patcher.after + }, webpack, common, commands: {