From 9d51c98be81f04ac325ee06671d18422f6104c78 Mon Sep 17 00:00:00 2001 From: Ruthenic Date: Sun, 16 Jan 2022 03:48:36 -0500 Subject: [PATCH] Add logger Console logger, not token logger --- dist/build.js | 2 +- src/api/plugins.js | 19 ++++++++++--------- src/api/utils/logger.js | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 src/api/utils/logger.js diff --git a/dist/build.js b/dist/build.js index 7ea282a..85a8c55 100644 --- a/dist/build.js +++ b/dist/build.js @@ -1 +1 @@ -(function(){"use strict";const R=n=>typeof n.prev=="function"?n.prev:R(n.prev);var B=(n,e,t)=>{const r=e[n][t];return r===void 0?e[t]:R(r)};class O{constructor(e,t,r){this.data={id:e,func:(o,...i)=>r(o,typeof this.prev=="function"?this.prev:this.prev.data.func,i)},this.prev=t}}var x=(n,e,t,r)=>{const o=n[r][e];if(o.data.id===t){if(typeof o.prev=="function"){n[e]=o.prev,delete n[r][e];return}n[r][e]=o.prev,n[e]=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),n[r][e]=l,n[e]=l.data.func},T=function(n,e,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 e=="function"?n!==e||!o:!e.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return r==="a"?o.call(n,t):o?o.value=t:e.set(n,t),t},s=function(n,e,t,r){if(t==="a"&&!r)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?n!==e||!r:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?r:t==="a"?r.call(n):r?r.value:e.get(n)},y,d,m,P;class I{constructor(e="simian"){y.add(this),d.set(this,void 0),m.set(this,void 0),T(this,d,Symbol(e),"f"),T(this,m,new Set,"f"),this.after=s(this,y,"m",P).call(this,"AFTER"),this.before=s(this,y,"m",P).call(this,"BEFORE"),this.instead=s(this,y,"m",P).call(this,"INSTEAD")}cleanupAll(){for(const e of s(this,m,"f")){for(const t in e[s(this,d,"f")]){const r=B(s(this,d,"f"),e,t);e[t]=r,e[s(this,d,"f")][t]=void 0}e[s(this,d,"f")]=void 0,delete e[s(this,d,"f")]}s(this,m,"f").clear()}}d=new WeakMap,m=new WeakMap,y=new WeakSet,P=function(e){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(e){case"AFTER":l=(_,S,g)=>{let w=S.apply(_,g);const E=o.apply(_,[g,w]);return typeof E!="undefined"&&(w=E),w};break;case"BEFORE":l=(_,S,g)=>{var w;let E=g;const M=(w=o.apply(_,[g]))!==null&&w!==void 0?w:g;return Array.isArray(M)&&(E=M),S.apply(_,E)};break;case"INSTEAD":l=(_,S,g)=>o.apply(_,[g,S.bind(_)]);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),()=>x(r,t,f,s(this,d,"f"))}};function L(){let n={};return window.webpackChunkdiscord_app.push([[Math.random().toString(36)],{},e=>{n=e}]),n.c}function $(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 p={modules:L(),filter:$,find:n=>p.filter(n,p.modules)[0],findAll:n=>p.filter(n,p.modules),findByProps:(...n)=>p.find(e=>n.every(t=>e[t]!==void 0)),findByPropsAll:(...n)=>p.findAll(e=>n.every(t=>e[t]!==void 0))};function U(){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 u(n){return new Promise((e,t)=>{n.oncomplete=n.onsuccess=()=>e(n.result),n.onabort=n.onerror=()=>t(n.error)})}function A(n,e){const t=U().then(()=>{const r=indexedDB.open(n);return r.onupgradeneeded=()=>r.result.createObjectStore(e),u(r)});return(r,o)=>t.then(i=>o(i.transaction(e,r).objectStore(e)))}let b;function c(){return b||(b=A("keyval-store","keyval")),b}function h(n,e=c()){return e("readonly",t=>u(t.get(n)))}function v(n,e,t=c()){return t("readwrite",r=>(r.put(e,n),u(r.transaction)))}function W(n,e=c()){return e("readwrite",t=>(n.forEach(r=>t.put(r[1],r[0])),u(t.transaction)))}function G(n,e=c()){return e("readonly",t=>Promise.all(n.map(r=>u(t.get(r)))))}function H(n,e,t=c()){return t("readwrite",r=>new Promise((o,i)=>{r.get(n).onsuccess=function(){try{r.put(e(this.result),n),o(u(r.transaction))}catch(f){i(f)}}}))}function Y(n,e=c()){return e("readwrite",t=>(t.delete(n),u(t.transaction)))}function z(n,e=c()){return e("readwrite",t=>(n.forEach(r=>t.delete(r)),u(t.transaction)))}function K(n=c()){return n("readwrite",e=>(e.clear(),u(e.transaction)))}function D(n,e){return n("readonly",t=>(t.openCursor().onsuccess=function(){!this.result||(e(this.result),this.result.continue())},u(t.transaction)))}function J(n=c()){const e=[];return D(n,t=>e.push(t.key)).then(()=>e)}function Q(n=c()){const e=[];return D(n,t=>e.push(t.value)).then(()=>e)}function V(n=c()){const e=[];return D(n,t=>e.push([t.key,t.value])).then(()=>e)}var X=Object.freeze({__proto__:null,clear:K,createStore:A,del:Y,delMany:z,entries:V,get:h,getMany:G,keys:J,promisifyRequest:u,set:v,setMany:W,update:H,values:Q});const Z={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:X};function q(n){n.demon.__commands={},n.demon.patcher.after("sendMessage",n.demon.webpack.findByProps("sendMessage"),(e,t)=>{console.log(e);let r;for(const o of Reflect.ownKeys(n.demon.__commands)){let i=n.demon.__commands[o];if(e[1].content.split(" ")[0]===">"+i.name){r=i.callback(e);break}}return r!==void 0&&(e[1].content=r),e})}function N(n){let e=Symbol(n.name);return window.demon.__commands[e]=n,()=>{delete window.demon.__commands[e]}}var k={add:N,init:q};async function j(n){let e=await h("demoncord");e===void 0&&(await v("demoncord",{plugin:{}}),e=await h("demoncord")),n.demon.__plugins={};for(let t in e.plugin)t=e.plugin[t],t.enabled&&C(t.metadata.name);return!0}async function ee(n,e){const t={metadata:e,iife:n,enabled:!1},r=await h("demoncord");return r.plugin[e.name]=t,await v("demoncord",r),!0}async function ne(n){const e=await h("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 v("demoncord",e),!0)}async function C(n){const e=await h("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 i={};return o(i),console.log(`[Demoncord] Started ${n}!`),window.demon.__plugins[n]={status:1,ctx:i},!0}}async function te(n){const e=await h("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}}async function re(n){const e=await h("demoncord");return e.plugin[n]===void 0?(console.error("[Demoncord] Cannot enable non-existant plugin!"),!1):(e.plugin[n].enabled=!e.plugin[n].enabled,await v("demoncord",e),!0)}var F={init:j,addPlugin:ee,delPlugin:ne,startPlugin:C,stopPlugin:te,togglePlugin:re};async function oe(n){const e=new I;n.demon={patcher:{monkeyPatch:function(t,r,o){let[i,f,l]=[()=>{},()=>{},()=>{}];return o.before!==void 0&&(i=e.before(t,r,o.before)),o.instead!==void 0&&(i=e.instead(t,r,o.instead)),o.after!==void 0&&(i=e.after(t,r,o.after)),()=>{i(),f(),l()}},before:e.before,instead:e.instead,after:e.after},webpack:p,common:Z,commands:{add:k.add},__DO_NOT_USE_OR_YOU_WILL_BE_FIRED_UNTO_THE_DEPTHS_OF_HELL:{plugins:F}},k.init(n),F.init(n)}window.demon&&delete window.demon,oe(window)})(); +(function(){"use strict";const R=n=>typeof n.prev=="function"?n.prev:R(n.prev);var D=(n,e,t)=>{const r=e[n][t];return r===void 0?e[t]:R(r)};class O{constructor(e,t,r){this.data={id:e,func:(i,...o)=>r(i,typeof this.prev=="function"?this.prev:this.prev.data.func,o)},this.prev=t}}var F=(n,e,t,r)=>{const i=n[r][e];if(i.data.id===t){if(typeof i.prev=="function"){n[e]=i.prev,delete n[r][e];return}n[r][e]=i.prev,n[e]=i.prev.data.func;return}const o=a=>a&&typeof a.prev=="object"?(a.data=a.prev.data,a.prev=a.prev.prev,o(a.prev)):!0,u=a=>{if(!a)throw new Error("could not find unpatch");return typeof a.prev=="object"&&a.data.id!==t?u(a.prev):o(a)};let f=Object.assign({},i);u(f),n[r][e]=f,n[e]=f.data.func},T=function(n,e,t,r,i){if(r==="m")throw new TypeError("Private method is not writable");if(r==="a"&&!i)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?n!==e||!i:!e.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return r==="a"?i.call(n,t):i?i.value=t:e.set(n,t),t},s=function(n,e,t,r){if(t==="a"&&!r)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?n!==e||!r:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?r:t==="a"?r.call(n):r?r.value:e.get(n)},v,d,y,b;class ${constructor(e="simian"){v.add(this),d.set(this,void 0),y.set(this,void 0),T(this,d,Symbol(e),"f"),T(this,y,new Set,"f"),this.after=s(this,v,"m",b).call(this,"AFTER"),this.before=s(this,v,"m",b).call(this,"BEFORE"),this.instead=s(this,v,"m",b).call(this,"INSTEAD")}cleanupAll(){for(const e of s(this,y,"f")){for(const t in e[s(this,d,"f")]){const r=D(s(this,d,"f"),e,t);e[t]=r,e[s(this,d,"f")][t]=void 0}e[s(this,d,"f")]=void 0,delete e[s(this,d,"f")]}s(this,y,"f").clear()}}d=new WeakMap,y=new WeakMap,v=new WeakSet,b=function(e){return(t,r,i)=>{const o=r[t];if(typeof o!="function")throw new Error(`${t} is not a function on ${r}`);const u=Symbol();r[s(this,d,"f")]===void 0&&(r[s(this,d,"f")]={});let f;switch(e){case"AFTER":f=(m,S,w)=>{let _=S.apply(m,w);const E=i.apply(m,[w,_]);return typeof E!="undefined"&&(_=E),_};break;case"BEFORE":f=(m,S,w)=>{var _;let E=w;const I=(_=i.apply(m,[w]))!==null&&_!==void 0?_:w;return Array.isArray(I)&&(E=I),S.apply(m,E)};break;case"INSTEAD":f=(m,S,w)=>i.apply(m,[w,S.bind(m)]);break}let a=r[s(this,d,"f")][t];return a===void 0?a=new O(u,o,f):a=new O(u,a,f),r[s(this,d,"f")][t]=a,r[t]=function(){return a.data.func(this,...arguments)},Object.assign(r[t],o),s(this,y,"f").add(r),()=>F(r,t,u,s(this,d,"f"))}};function L(){let n={};return window.webpackChunkdiscord_app.push([[Math.random().toString(36)],{},e=>{n=e}]),n.c}function U(n,e){let t=[];for(const r in e){const i=e[r].exports;i&&(i.default&&i.__esModule&&n(i.default)?t.push(i.default):n(i)&&t.push(i))}return t}let p={modules:L(),filter:U,find:n=>p.filter(n,p.modules)[0],findAll:n=>p.filter(n,p.modules),findByProps:(...n)=>p.find(e=>n.every(t=>e[t]!==void 0)),findByPropsAll:(...n)=>p.findAll(e=>n.every(t=>e[t]!==void 0))};function W(){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 l(n){return new Promise((e,t)=>{n.oncomplete=n.onsuccess=()=>e(n.result),n.onabort=n.onerror=()=>t(n.error)})}function B(n,e){const t=W().then(()=>{const r=indexedDB.open(n);return r.onupgradeneeded=()=>r.result.createObjectStore(e),l(r)});return(r,i)=>t.then(o=>i(o.transaction(e,r).objectStore(e)))}let x;function c(){return x||(x=B("keyval-store","keyval")),x}function g(n,e=c()){return e("readonly",t=>l(t.get(n)))}function P(n,e,t=c()){return t("readwrite",r=>(r.put(e,n),l(r.transaction)))}function z(n,e=c()){return e("readwrite",t=>(n.forEach(r=>t.put(r[1],r[0])),l(t.transaction)))}function G(n,e=c()){return e("readonly",t=>Promise.all(n.map(r=>l(t.get(r)))))}function H(n,e,t=c()){return t("readwrite",r=>new Promise((i,o)=>{r.get(n).onsuccess=function(){try{r.put(e(this.result),n),i(l(r.transaction))}catch(u){o(u)}}}))}function Y(n,e=c()){return e("readwrite",t=>(t.delete(n),l(t.transaction)))}function K(n,e=c()){return e("readwrite",t=>(n.forEach(r=>t.delete(r)),l(t.transaction)))}function J(n=c()){return n("readwrite",e=>(e.clear(),l(e.transaction)))}function M(n,e){return n("readonly",t=>(t.openCursor().onsuccess=function(){!this.result||(e(this.result),this.result.continue())},l(t.transaction)))}function Q(n=c()){const e=[];return M(n,t=>e.push(t.key)).then(()=>e)}function V(n=c()){const e=[];return M(n,t=>e.push(t.value)).then(()=>e)}function X(n=c()){const e=[];return M(n,t=>e.push([t.key,t.value])).then(()=>e)}var Z=Object.freeze({__proto__:null,clear:J,createStore:B,del:Y,delMany:K,entries:X,get:g,getMany:G,keys:Q,promisifyRequest:l,set:P,setMany:z,update:H,values:V});const q={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:Z};function N(n){n.demon.__commands={},n.demon.patcher.after("sendMessage",n.demon.webpack.findByProps("sendMessage"),(e,t)=>{let r;for(const i of Reflect.ownKeys(n.demon.__commands)){let o=n.demon.__commands[i];if(e[1].content.split(" ")[0]===">"+o.name){r=o.callback(e);break}}return r!==void 0&&(e[1].content=r),e})}function j(n){let e=Symbol(n.name);return window.demon.__commands[e]=n,()=>{delete window.demon.__commands[e]}}var k={add:j,init:N};function h(n,e,...t){let r="%cDemoncord%c ",i=[];for(let o=0;o{},()=>{},()=>{}];return i.before!==void 0&&(o=e.before(t,r,i.before)),i.instead!==void 0&&(o=e.instead(t,r,i.instead)),i.after!==void 0&&(o=e.after(t,r,i.after)),()=>{o(),u(),f()}},before:e.before,instead:e.instead,after:e.after},webpack:p,common:q,commands:{add:k.add},__DO_NOT_USE_OR_YOU_WILL_BE_FIRED_UNTO_THE_DEPTHS_OF_HELL:{plugins:C}},k.init(n),C.init(n)}window.demon&&delete window.demon,oe(window)})(); diff --git a/src/api/plugins.js b/src/api/plugins.js index 7e2196a..c340ef1 100644 --- a/src/api/plugins.js +++ b/src/api/plugins.js @@ -1,5 +1,6 @@ // @flow import { get, set } from 'idb-keyval'; +import log from './utils/logger.js' async function init(obj: Object): Promise { //TODO: check for enabled plugins in the idb, start them @@ -28,7 +29,7 @@ async function addPlugin(iife: string, metadata: Object): Promise { const globalSettings: Object = await get("demoncord"); /*try { if (globalSettings["plugin"][metadata.name] !== undefined) { - console.error("[Demoncord] Cannot add plugin that already exists!") + log("Cannot add plugin that already exists!", "error", "Plugins") return false } } catch (error) {*/ @@ -41,7 +42,7 @@ async function addPlugin(iife: string, metadata: Object): Promise { async function delPlugin(name: string): Promise { const globalSettings = await get("demoncord") if (globalSettings["plugin"][name] === undefined) { - console.error("[Demoncord] Cannot remove non-existant plugin!") + log("Cannot remove non-existant plugin!", "error", "Plugins") return false } else { globalSettings["plugin"][name] = undefined @@ -54,16 +55,16 @@ async function delPlugin(name: string): Promise { async function startPlugin(name: string): Promise { const globalSettings = await get("demoncord") if (globalSettings["plugin"][name] === undefined) { - console.error("[Demoncord] Cannot start non-existant plugin!") + log("Cannot start non-existant plugin!", "error", "Plugins") return false } else { - console.log(`[Demoncord] Starting ${name}...`) + log(`Starting ${name}...`, "log", "Plugins") const plug = globalSettings["plugin"][name] const exports: Object = (0, eval)(plug.iife) const onStart: (ctx: Object)=>void = exports.onStart let ctx = {} // ctx is how you're going to store things that need to be accessed in both onStart and onStop. dumb, i know onStart(ctx) - console.log(`[Demoncord] Started ${name}!`) + log(`Started ${name}!`, "log", "Plugins") window.demon.__plugins[name] = {status: 1, ctx: ctx} return true } @@ -72,15 +73,15 @@ async function startPlugin(name: string): Promise { async function stopPlugin(name: string): Promise { const globalSettings = await get("demoncord") if (globalSettings["plugin"][name] === undefined ) { - console.error("[Demoncord] Cannot stop non-existant or non-running plugin!") + log("Cannot stop non-existant or non-running plugin!", "error", "Plugins") return false } else { - console.log(`[Demoncord] Stopping ${name}...`) + log(`Stopping ${name}...`, "log", "Plugins") const plug = globalSettings["plugin"][name] const exports: Object = (0, eval)(plug.iife) const onStop: (ctx: Object)=>void = exports.onStop onStop(window.demon.__plugins[name].ctx) - console.log(`[Demoncord] Stopped ${name}!`) + log(`Stopped ${name}!`, "log", "Plugins") return true } } @@ -88,7 +89,7 @@ async function stopPlugin(name: string): Promise { async function togglePlugin(name: string): Promise { const globalSettings = await get("demoncord") if (globalSettings["plugin"][name] === undefined) { - console.error("[Demoncord] Cannot enable non-existant plugin!") + log("Cannot toggle non-existant plugin!", "error", "Plugins") return false } else { globalSettings["plugin"][name].enabled = !globalSettings["plugin"][name].enabled diff --git a/src/api/utils/logger.js b/src/api/utils/logger.js new file mode 100644 index 0000000..e4a4901 --- /dev/null +++ b/src/api/utils/logger.js @@ -0,0 +1,19 @@ +//@flow +//TODO: make setting to save logs in idb, for debugging and troubleshooting purposes +//bg: #aa8dd8 +//fg: #553986 +function log(message: string, type: string, ...locs: string[]): void { + let string = "%cDemoncord%c " + let style = [] + for (let i = 0; i < locs.length; i++) { + const loc = locs[i] + style.push("@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@700&display=swap'); font-family: 'IBM Plex Mono', monospace; font-weight: 600; background-color: #aa8dd8; color: #1d1131; border-radius: 5px; padding: 0px 5px 1px 5px; font-size: 0.9em;", "") + string += `%c${loc}%c ` + } + style.push("@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@700&display=swap'); font-family: 'IBM Plex Mono', monospace; font-weight: 600; background-color: #aa8dd8; color: #1d1131; border-radius: 5px; padding: 0px 5px 1px 5px; font-size: 0.9em;", "") + string += `%c${message}` + style.push("@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@700&display=swap'); font-family: 'IBM Plex Mono', monospace; font-weight: 500; font-size: 0.9em; color: #E2EECE;") + console[type](string, ...style) +} + +export default log;