diff --git a/fake-profile-themes-and-effects/index.html b/fake-profile-themes-and-effects/index.html new file mode 100644 index 0000000..d3dce5e --- /dev/null +++ b/fake-profile-themes-and-effects/index.html @@ -0,0 +1,736 @@ + + + + + +revenge-plugins + + + + + + +
+ + +
+
+ + Revenge Plugins +
+

Discord, your way.

+

A hand-built collection of plugins for Revenge, the Discord Android client mod - rebuilt from scratch where the old ecosystem broke, and net-new where nothing existed yet.

+ + +
+
+ +
+
+
+ + ⌘K +
+
+
+ +
+

+
+ +
+
+ +
+ + + +
+ +
+
+ +
+
+
+ + + + diff --git a/fake-profile-themes-and-effects/install/index.js b/fake-profile-themes-and-effects/install/index.js new file mode 100644 index 0000000..ff23f99 --- /dev/null +++ b/fake-profile-themes-and-effects/install/index.js @@ -0,0 +1 @@ +(function(Q,ze,He,c,A,o,Me,p,x,u,Ve,k,I,Ge){"use strict";function We(e,t,n,i){try{return n()}catch(r){return i.error(`[${e}] Failed to apply the "${t}" patch, that surface will be skipped: ${r}`),function(){}}}function Ke(e,t,n){const i=Object.entries(n).map(function([r,l]){return We(e,r,l,t)});return function(){return i.forEach(function(r){return r()})}}const z=He.FluxDispatcher,je=c.findByStoreName("CollectiblesPurchaseStore"),Z=c.findByStoreName("ProfileEffectStore"),N=c.findByStoreName("UserProfileStore"),v=c.findByStoreName("UserStore"),Xe=Me.semanticColors,Ye=c.find(function(e){return e.default?.internal?.resolveSemanticColor})?.default.internal.resolveSemanticColor??c.find(function(e){return e.meta?.resolveSemanticColor})?.meta.resolveSemanticColor??function(){};function U(e,t,n){for(const i of t){const r=Xe?.[i];if(r)try{const l=Ye(e,r);if(l)return l}catch{}}return n}const Qe=c.findByProps("useAvatarColors")?.useAvatarColors??function(){},me=c.findByProps("getProfileTheme").getProfileTheme,q=c.findByProps("useThemeContext")?.useThemeContext??function(){return{}},Ze=c.findByProps("ThemeContextProvider")?.ThemeContextProvider??function({children:e}){return e};function J(){z.dispatch({type:"USER_SETTINGS_ACCOUNT_SUBMIT_SUCCESS"})}let _=!0;function qe(e){const[t,n]=o.useState(function(){return _=e});return[t,function(i){n(_=i),J()}]}let S=null;function Je(e){const[t,n]=o.useState(function(){return S=e});return[t,function(i){n(S=i),_&&J()}]}let E=null;function $e(e){const[t,n]=o.useState(function(){return E=e});return[t,function(i){n(E=i),_&&J()}]}let O;function $(e){O=e}const et=function(){let e=c.findByName("useProfileTheme",!1);return e?function(){return A.after("default",e,function([t],n){const{user:i}=t;return(i!=null&&i.id===O||"pendingThemeColors"in t)&&_&&(S!==null?(n.theme=me(S),n.primaryColor=S,n.secondaryColor=E??S):E!==null&&(n.theme=me(E),n.primaryColor=E,n.secondaryColor=E)),n})}:(e=c.findByName("useProfileThemeColors",!1),e?function(){return A.after("default",e,function([t,n,i],r){if((t!=null&&t.id===O||i)&&_){if(S!==null)return[S,E??S];if(E!==null)return[E,E]}return r})}:function(){return function(){return!0}})}(),tt=function(){return A.instead("getPurchase",je,function(e,t){return O?{purchasedAt:new Date}:t(e)})},w=String.fromCodePoint(8203),b=4096,y=917504,ee=y+b-1;function te(e,t){return String.fromCodePoint(...[...`[#${e.toString(16)},#${t.toString(16)}]`].map(function(n){return n.codePointAt(0)+y}))}function pe(e){const[t,n]=e.matchAll(/(?<=#)[\dA-Fa-f]{1,6}/g);return[t?parseInt(t[0],16):-1,n?parseInt(n[0],16):-1]}function ne(e){if(e===0)return String.fromCodePoint(y);let t="";for(;e>0;e=Math.trunc(e/b))t=String.fromCodePoint(e%b+y)+t;return t}function L(e){if(e==="")return-1;let t=0;for(let n=0;n16777215)return-2;t+=e.codePointAt(n)*b**(e.length-1-n)}return t}function H(e){if(e===0n)return String.fromCodePoint(y);let t="";for(;e>0n;e/=BigInt(b))t=String.fromCodePoint(Number(e%BigInt(b))+y)+t;return t}function M(e){if(e==="")return-1n;let t=0n;for(let n=0;n=10000000000000000000n)return-2n;t+=BigInt(e.codePointAt(n))*BigInt(b)**BigInt(e.length-1-n)}return t}function nt(e,t,n,i){let r="";if(i){if(e>=0)return t>=0?r=te(e,t):r=te(e,e),n&&(r+=w+H(BigInt(n))),r;if(t>=0)return r=te(t,t),n&&(r+=w+H(BigInt(n))),r}else if(e>=0){if(r=ne(e),t>=0&&e!==t)return r+=w+ne(t),n&&(r+=w+H(BigInt(n))),r}else t>=0&&(r=ne(t));return n&&(r+=w+w+H(BigInt(n))),r}function re(e){const t=["","",""];let n=0;for(const i of e){const r=i.codePointAt(0);if(r===8203){if(n>=2)break;n++}else if(r>=y&&r<=ee)t[n]+=String.fromCodePoint(r-y);else if(n>0||t[0])break}return t}function he(e){for(const t of e){const n=t.codePointAt(0);if(n>=y&&n<=ee||n===8203)return!0}return!1}function Ee(e){return[...e].filter(function(t){const n=t.codePointAt(0);return(nee)&&n!==8203}).join("").trim()}function V(e,t,n){t>-1?(e.themeColors=[t,n>-1?n:t],e.premiumType=2):n>-1&&(e.themeColors=[n,n],e.premiumType=2)}function G(e,t){t>-1n&&(e.profileEffectId=e.profileEffectID=t.toString(),e.premiumType=2)}const rt=function(){return A.after("getUserProfile",N,function(e,t){if(!t||t.profileFetchFailed)return t;if(p.storage.prioritizeNitro){if(t.themeColors){if(!(t.profileEffectId||t.profileEffectID)){const r=re(t.bio);L(r[0])===-2?G(t,M(r[1])):G(t,M(r[2]))}return t}else if(t.profileEffectId||t.profileEffectID){const r=re(t.bio),l=L(r[0]);return l===-2?V(t,...pe(r[0])):V(t,l,L(r[1])),t}}const n=re(t.bio),i=L(n[0]);return i===-2?(V(t,...pe(n[0])),G(t,M(n[1]))):(V(t,i,L(n[1])),G(t,M(n[2]))),t})},oe=c.findByName("ProfileEffectRecord");(function(e){return e[e.AVATAR_DECORATION=0]="AVATAR_DECORATION",e[e.PROFILE_EFFECT=1]="PROFILE_EFFECT",e[e.NONE=100]="NONE",e[e.BUNDLE=1e3]="BUNDLE",e})({});const ot=c.findByPropsAll("NONE_ITEM");let it,ye;const ct=function(){return ot.map(function(e){return A.after("default",e,function(t,n){if(O){const i=Z.profileEffects;it!==i?(n.splice(1),n[0].items.splice(1),Z.profileEffects.forEach(function(r){n[0].items.push(new oe(r))}),ye=n):n=ye}return n})})};function Pe(e){return typeof e[Symbol.iterator]=="function"}function ie(e){return e!==null&&typeof e=="object"}function ce(e){return ie(e)&&"type"in e}function Se(e){return"children"in e.props}function lt(e){return"_context"in e}function st(e){return"render"in e}function ft(e){return"type"in e}function B(e){return typeof e=="symbol"?Symbol.keyFor(e)||null:typeof e=="function"?e.displayName||e.name||null:lt(e)?e._context.displayName||null:e.displayName?e.displayName:st(e)?e.render.displayName||e.render.name||null:ft(e)?B(e.type):null}function W(e,t,n=200){if(ie(e))if(Pe(e)){if(n>0)for(const i of e){const r=W(i,t,n-1);if(r)return r}}else{if(t(e))return e;if(Se(e))return W(e.props.children,t,n-1)}return null}function K(e,t,n=200){if(ie(e)){if(Pe(e)){if(n>0)for(const i of e){const r=K(i,t,n-1);if(r)return r}}else if(Se(e))return t(e.props.children)?e:K(e.props.children,t,n-1)}return null}const ge=c.findByName("EditProfileEffectActionSheet");let le;function ut(e){const{currentEffectId:t,effects:n,onSelect:i,user:r}=e,l=ge({user:r}),h=q(),P=o.useMemo(function(){return n.map(function(f){return{items:new oe(f)}})},[n]);if(p.storage.forceFallbackEffectPicker)return o.createElement(j,e);let g=!1;const a=W(l,function(f){return B(f.type)==="EditProfileEffectInner"?!0:"profileEffects"in f.props&&"selectedProfileEffect"in f.props&&typeof f.props.setSelectedProfileEffect=="function"?g=!0:!1});if(!a)return le||o.createElement(j,e);const C=W(l,function(f){return B(f.type)==="Button"});if(!C)return le||o.createElement(j,e);if(g){a.props.selectedProfileEffect===void 0&&a.props.setSelectedProfileEffect(e.currentEffectId?{id:e.currentEffectId}:null),a.props.profileEffects=e.effects;const f=K(l,function(s){return Array.isArray(s)&&s.some(function(d){return B(d.type)==="DisplayBanner"})});if(f){const s=l;f.props.children=o.createElement(Ze,{theme:s.props.theme,primaryColor:s.props.primaryColor,secondaryColor:s.props.secondaryColor,children:f.props.children}),s.props.theme=h.theme,s.props.primaryColor=h.primaryColor,s.props.secondaryColor=h.secondaryColor}}else a.props.selectedProfileEffect===void 0&&a.props.setSelectedProfileEffect(t?new oe({id:t}):null),a.props.purchases=P;return $(r.id),C.props.onPress=function(){$(void 0),i(n.find(function(f){return f.id===a.props.selectedProfileEffect?.id})?.config??null)},le=l}const at=ge?ut:j,Ce=c.findByProps("triggerHapticFeedback"),dt=Ce?.HapticFeedbackTypes??{},mt=Ce?.triggerHapticFeedback??function(){},pt=k.getAssetIDByName("img_none"),ht=c.findByProps("DEFAULT_PROFILE_EFFECT_WH_RATIO")?.DEFAULT_PROFILE_EFFECT_WH_RATIO??45/88,Et=k.getAssetIDByName("sample-profile-small")??{uri:"https://discordapp.com/assets/f328a6f8209d4f1f5022.png"};k.getAssetIDByName("toast_copy_link"),k.getAssetIDByName("Small");const se=c.findByProps("Radius")?.Radius??{},T=c.findByProps("Spacing")?.Spacing??{},yt=c.findByProps("SafeAreaContext")?.SafeAreaContext,Pt=c.findByName("useWindowDimensions")??function(){},Ae=3;function be({label:e,isSelected:t,size:n,colors:i,onPress:r,style:l,children:h}){const[P,g,a]=i;return o.createElement(ve,{accessibilityLabel:e,accessibilityRole:"button",accessibilityState:{selected:t},disabled:t,onPress:function(){mt(dt.IMPACT_LIGHT),r()},style:[{height:n,width:n,overflow:"hidden",backgroundColor:g,borderColor:P,borderRadius:se.sm,borderWidth:2},t&&{borderColor:a},l]},h)}function j({currentEffectId:e,effects:t,onSelect:n}){const[i,r]=o.useState(e),[l,h]=o.useState(0),{theme:P}=q(),g=o.useMemo(function(){return[U(P,["BACKGROUND_PRIMARY","BACKGROUND_BASE_LOWER","BACKGROUND_BASE_LOW"],"#1E1F22"),U(P,["BACKGROUND_FLOATING","MOBILE_FLOATINGBAR_BACKGROUND","BACKGROUND_BASE_LOWER"],"#2B2D31"),U(P,["BUTTON_OUTLINE_BRAND_BORDER_ACTIVE","BORDER_FOCUS"],"#5865F2")]},[P]),a=Pt(),C=o.useContext(yt),f=o.useMemo(function(){const s=Ve.chunk([null,...t],Ae),d=s[s.length-1];for(;d.length<3;)d.push(void 0);return s},[t]);return o.createElement(Ct,{transparentHeader:!0,scrollable:!0,startExpanded:!0,startHeight:a.height-C.top},o.createElement(At,{scrollsToTop:!1},o.createElement(u.View,{style:{flex:1,flexDirection:"column",alignItems:"center",paddingBottom:88}},o.createElement(X,{variant:"redesign/heading-18/bold",color:"header-primary",style:{margin:T.PX_16}},e?"Change Effect":"Add Profile Effect"),o.createElement(u.View,{style:{width:"72%",minHeight:38}},o.createElement(X,{variant:"heading-md/bold",color:"header-primary",style:{textAlign:"center"}},t.find(function(s){return s.id===i})?.config.title??"None")),o.createElement(u.View,{style:{flex:1,width:"92%",marginTop:3}},o.createElement(wt,{accessibilityLabel:"Profile Effect Selection Section",numColumns:1,estimatedItemSize:98,ItemSeparatorComponent:function(){return o.createElement(u.View,{style:{height:T.PX_16}})},contentContainerStyle:{paddingHorizontal:T.PX_4},data:f,extraData:i,renderItem:function({item:s}){return o.createElement(u.View,{style:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:T.PX_16}},s.map(function(d){return d?o.createElement(be,{label:d.config.accessibilityLabel,isSelected:d.id===i,size:l,colors:g,onPress:function(){r(d.id)}},o.createElement(Re,{effect:d.config})):d===null?o.createElement(be,{label:"None",isSelected:!i,size:l,colors:g,onPress:function(){r(void 0)},style:{alignItems:"center",justifyContent:"center"}},o.createElement(we,{source:pt,size:we.Sizes.LARGE}),o.createElement(X,{variant:"text-sm/medium",color:"header-primary",style:{marginTop:T.PX_4}},"None")):o.createElement(u.View,{style:{width:l,height:l}})}))},onLayout:function(s){h((s.nativeEvent.layout.width-64)/Ae)}})))),o.createElement(F,{text:"Apply",textStyle:{fontSize:16},onPress:function(){n(t.find(function(s){return s.id===i})?.config??null)},style:{position:"absolute",right:0,bottom:0,left:0,height:48,marginHorizontal:36,marginBottom:T.PX_48,borderRadius:se.round}}))}const St=c.findByName("showCustomColorPickerActionSheet")??function(){};function Be(e){return e.color??=0,St(e)}const fe="__FPTE__";function gt(e,t){function n(i){i.key===fe&&(z.unsubscribe("HIDE_ACTION_SHEET",n),$(void 0))}z.subscribe("HIDE_ACTION_SHEET",n),bt({content:o.createElement(at,{effects:Z.profileEffects,onSelect:function(i){e(i),Bt(fe)},user:v.getCurrentUser(),currentEffectId:t}),key:fe})}const Ct=c.findByProps("BottomSheet")?.BottomSheet??c.findByProps("ActionSheet")?.ActionSheet??function(){throw new Error("FakeProfileThemesAndEffects threw an error to avoid an otherwise-inevitable, unrecoverable freeze.")},At=c.findByProps("BottomSheetScrollView")?.BottomSheetScrollView??function(){return null},Te=c.findByProps("showActionSheet"),bt=Te?.showActionSheet??function(){},Bt=Te?.default?.hideActionSheet??function(){},Tt=I.Forms.FormSection,Ft=I.Forms.FormRow,Fe=I.Forms.FormRadioRow,Ie=I.Forms.FormSwitchRow,It=I.Forms.FormCardSection,_e=c.findByProps("saveProfileChanges");function _t({guildId:e}){const[t,n]=Je(null),[i,r]=$e(null),[l,h]=o.useState(null);qe(!0);const[P,g]=o.useState(!1),{theme:a}=q(),[C,f]=o.useMemo(function(){return[U(a,["HEADER_SECONDARY","TEXT_MUTED","TEXT_SUBTLE"],"#B5BAC1"),U(a,["BACKGROUND_ACCENT","BACKGROUND_BASE_LOWER","BACKGROUND_BASE_LOW"],"#1E1F22")]},[a]),s=Qe(v.getCurrentUser()?.getAvatarURL(e,80)??"",f,!1),[d,ae]=o.useState(null);o.useEffect(function(){const R=v.getCurrentUser();if(!R)return;const m=N.getUserProfile(R.id);m&&ae(m.bio??null)},[]);const D=d!==null&&he(d),Y=t!==null||i!==null||l!==null,xe=nt(t??-1,i??-1,l?.id??"",P);function xt(){const R=v.getCurrentUser();if(!R)return;let m=d??"";if(D&&!Y){m=Ee(m);try{_e.saveProfileChanges({...N.getUserProfile(R.id),bio:m}),ae(m),x.showToast("FPTE removed!")}catch(de){x.showToast("Failed to update bio!"),console.error(de)}return}if(xe){he(m)&&(m=Ee(m)),m.length>0&&(m+=" "),m+=xe;try{_e.saveProfileChanges({...N.getUserProfile(R.id),bio:m}),ae(m),x.showToast("FPTE applied!")}catch(de){x.showToast("Failed to update bio!"),console.error(de)}}}const kt=D&&!Y?"Remove FPTE":"Apply FPTE",ke=Y||D;return o.createElement(It,{title:o.createElement(u.View,{style:{flexDirection:"row",alignItems:"center"}},o.createElement(u.Text,{style:{fontSize:16,color:"#FFFFFF"}},"FPTE Builder"),o.createElement(u.Text,{style:{color:D?"#4CAF50":"#F44336",fontSize:17,marginLeft:8}},D?"Active":"Inactive")),cardStyle:{backgroundColor:"transparent"}},o.createElement(u.View,{style:{flexDirection:"row",justifyContent:"space-between"}},o.createElement(ue,{fgColor:C,label:"Primary",bgColor:t,onPress:function(){return Be({color:t,onSelect:n,suggestedColors:s})}}),o.createElement(ue,{fgColor:C,label:"Accent",bgColor:i,onPress:function(){return Be({color:i,onSelect:r,suggestedColors:s})}}),o.createElement(ue,{fgColor:C,label:"Effect",onPress:function(){return gt(h,l?.id)}},l&&o.createElement(Re,{effect:l,style:{width:"140%",height:"100%"}})),o.createElement(u.View,{style:{flexDirection:"column",alignItems:"center",marginLeft:12}},o.createElement(F,{text:kt,size:F.Sizes.SMALL,onPress:xt,style:{marginBottom:6,paddingHorizontal:12,opacity:ke?1:0},pointerEvents:ke?"auto":"none"}),o.createElement(F,{text:"Reset",look:F.Looks.LINK,color:F.Colors.TRANSPARENT,size:F.Sizes.SMALL,...Y?{}:{pointerEvents:"none",style:{opacity:0}},onPress:function(){n(null),r(null),h(null)}}))))}const ue=function({label:e,fgColor:t,bgColor:n,onPress:i,children:r}){return o.createElement(u.View,{style:{width:50}},o.createElement(ve,{accessibilityLabel:e,accessibilityRole:"button",onPress:i,style:[{display:"flex",alignItems:"center",justifyContent:"center",height:50,overflow:"hidden",borderColor:t,borderStyle:"dashed",borderWidth:2,borderRadius:se.xs},n!=null&&{backgroundColor:"#"+n.toString(16).padStart(6,"0"),borderStyle:"solid"},!!r&&{borderWidth:0}]},r??(n==null&&o.createElement(Rt,{fill:t,width:"40%",height:"40%",viewBox:"0 0 144 144"},o.createElement(Nt,{d:"M144 64H80V0H64v64H0v16h64v64h16V80h64Z"})))),!!e&&o.createElement(X,{variant:"text-sm/normal",style:{marginTop:T.PX_4,textAlign:"center"}},e))},F=I.Button,we=c.findByProps("IconSizes")?.default??function(){return null},Re=function({effect:e,style:t}){return o.createElement(u.View,{style:t},o.createElement(u.Image,{resizeMode:"cover",source:Et,style:{width:"100%",height:"100%"}}),o.createElement(u.Image,{alt:e.accessibilityLabel,resizeMethod:"resize",resizeMode:"cover",source:{uri:e.thumbnailPreviewSrc},style:{position:"absolute",width:"100%",aspectRatio:ht}}))},X=c.findByProps("TextStyleSheet")?.Text??function(){return null},wt=c.findByName("FlashList")??function(){return null},Ne=c.findByProps("Svg"),Rt=Ne?.Svg??function(){return null},Nt=Ne?.Path??function(){return null},ve=c.findByProps("PressableOpacity")?.PressableOpacity??function(){return null},vt=c.findByName("UserProfileEditForm",!1),Ut=function(){return A.after("default",vt,function(e,t){if(p.storage.hideBuilder)return t;const n=K(t,function(i){return Array.isArray(i)&&i.some(function(r){return ce(r)&&B(r.type)==="UserProfileEditFormTextField"})});if(n){const i=n.props.children.reduce(function(r,l,h){return ce(l)&&B(l.type)==="UserProfileEditFormTextField"&&r.push(h),r},[]);i.length>=3&&n.props.children.splice(i[2]+1,0,o.createElement(_t,null))}return t})},Ue=c.findByName("UserProfileEditForm",!1);function Oe(e){if(!e||ce(e)&&B(e.type)==="UserProfilePremiumUpsellCard")return null;if(e.props?.children){let t=e.props.children;Array.isArray(t)||(t=[t]);const n=t.map(Oe).filter(function(i){return i!==null});e.props.children=n.length===1?n[0]:n}return e}const Ot=function(){Ue&&A.after("default",Ue,function(e,t){return Oe(t)||t})};function Lt(){return Ge.useProxy(p.storage),o.createElement(u.ScrollView,null,o.createElement(Tt,{title:"Settings"},o.createElement(Ft,{label:"Source to prioritize"}),o.createElement(Fe,{label:"Nitro",selected:!!p.storage.prioritizeNitro,onPress:function(){p.storage.prioritizeNitro=!0}}),o.createElement(Fe,{label:"About Me",selected:!p.storage.prioritizeNitro,onPress:function(){p.storage.prioritizeNitro=!1}}),o.createElement(Ie,{label:"Hide Builder",subLabel:"Hide the FPTE Builder in the User Profile and Server Profiles settings pages",value:!!p.storage.hideBuilder,onValueChange:function(e){p.storage.hideBuilder=e}}),o.createElement(Ie,{label:"Force fallback effect picker",value:!!p.storage.forceFallbackEffectPicker,onValueChange:function(e){p.storage.forceFallbackEffectPicker=e}})))}function Le(){const e=v.getCurrentUser();if(!e)return;const t=N.getUserProfile(e.id);t&&z.dispatch({type:"USER_PROFILE_FETCH_SUCCESS",user:e,user_profile:t,connected_accounts:t.connectedAccounts})}let De=function(){};var Dt={onLoad(){De=Ke("FakeProfileThemesAndEffects",ze.logger,{"purchase check":tt,"user profile data":rt,"profile effect sections":function(){const e=ct();return function(){return e.forEach(function(t){return t()})}},"profile theme":et,"profile edit form":Ut,"nitro upsell card":Ot}),Le()},onUnload(){De(),Le()},settings:Lt};return Q.default=Dt,Object.defineProperty(Q,"__esModule",{value:!0}),Q})({},vendetta,vendetta.metro.common,vendetta.metro,vendetta.patcher,window.React,vendetta.ui,vendetta.plugin,vendetta.ui.toasts,vendetta.metro.common.ReactNative,lodash,vendetta.ui.assets,vendetta.ui.components,vendetta.storage); diff --git a/fake-profile-themes-and-effects/install/manifest.json b/fake-profile-themes-and-effects/install/manifest.json new file mode 100644 index 0000000..29882e9 --- /dev/null +++ b/fake-profile-themes-and-effects/install/manifest.json @@ -0,0 +1 @@ +{"name":"FakeProfileThemesAndEffects","description":"Profile theming and profile effects without Nitro, by hiding the color/effect data in your About Me using invisible zero-width characters.","authors":[{"name":"everestmcarthur"},{"name":"ryan"},{"name":"シグマ siguma"}],"main":"index.js","vendetta":{"icon":"ic_profile_24px"},"hash":"242d3a82b401819fdca86f6b90dbe21f9b3708a1117c2ae0ecdc8ebad119d0f1"} \ No newline at end of file diff --git a/key-inspector/install/index.js b/key-inspector/install/index.js index 0fccb77..2f757e1 100644 --- a/key-inspector/install/index.js +++ b/key-inspector/install/index.js @@ -1,6 +1,8 @@ -(function(d,e,n,s,g,o){"use strict";const{ScrollView:b,View:N}=e.ReactNative;function R({children:t}){return e.React.createElement(b,{style:{flex:1}},t,e.React.createElement(N,{style:{height:24}}))}const{View:P,Text:C}=e.ReactNative;function S({children:t,style:i}){return e.React.createElement(P,{style:[{marginHorizontal:16,marginVertical:8,padding:10,borderRadius:8,borderWidth:1,borderColor:"rgba(128,128,128,0.25)"},i]},e.React.createElement(C,{style:{fontSize:12.5,lineHeight:18,opacity:.75}},t))}const{TouchableOpacity:T,Text:E}=e.ReactNative;function f({label:t,onPress:i,disabled:r,style:u}){return e.React.createElement(T,{disabled:r,onPress:i,style:[{backgroundColor:"#5865F2",borderRadius:8,padding:10,alignItems:"center",opacity:r?.5:1},u]},e.React.createElement(E,{style:{color:"white",fontWeight:"600"}},t))}const v=[{label:'findByProps("computePermissions", "canEveryoneRole")',run:function(){return n.findByProps("computePermissions","canEveryoneRole")}},{label:'findByProps("getBotLabel")',run:function(){return n.findByProps("getBotLabel")}},{label:'findByName("DisplayName", false)',run:function(){return n.findByName("DisplayName",!1)}},{label:'findByName("HeaderName", false)',run:function(){return n.findByName("HeaderName",!1)}},{label:'findByName("getTagProperties", false)',run:function(){return n.findByName("getTagProperties",!1)}},{label:'findByTypeNameAll("UserRow")',run:function(){return n.findByTypeNameAll("UserRow")}},{label:'findByStoreName("ThemeStore")',run:function(){return n.findByStoreName("ThemeStore")}},{label:'findByStoreName("GuildMemberStore")',run:function(){return n.findByStoreName("GuildMemberStore")}},{label:'findByStoreName("GuildStore")',run:function(){return n.findByStoreName("GuildStore")}},{label:'findByStoreName("ChannelStore")',run:function(){return n.findByStoreName("ChannelStore")}},{label:'findByStoreName("UserStore")',run:function(){return n.findByStoreName("UserStore")}},{label:'findByStoreName("RelationshipStore")',run:function(){return n.findByStoreName("RelationshipStore")}},{label:'findByName("RowManager", false)',run:function(){return n.findByName("RowManager",!1)}},{label:'findByProps("TYPING_WRAPPER_HEIGHT")',run:function(){return n.findByProps("TYPING_WRAPPER_HEIGHT")}},{label:'findByName("VoiceUserConnected", false)',run:function(){return n.findByName("VoiceUserConnected",!1)}},{label:"find(resolveSemanticColor via default.internal)",run:function(){return n.find(function(t){return t?.default?.internal?.resolveSemanticColor})}},{label:"find(resolveSemanticColor via meta)",run:function(){return n.find(function(t){return t?.meta?.resolveSemanticColor})}},{label:"find(UserProfile)",run:function(){return n.find(function(t){return t?.type?.name==="UserProfile"})}},{label:'findByName("UserProfileSection", false)',run:function(){return n.findByName("UserProfileSection",!1)}},{label:'findByProps("sendMessage", "sendBotMessage")',run:function(){return n.findByProps("sendMessage","sendBotMessage")}},{label:'findByProps("openLazy", "hideActionSheet")',run:function(){return n.findByProps("openLazy","hideActionSheet")}},{label:'findByProps("push", "pushLazy", "pop")',run:function(){return n.findByProps("push","pushLazy","pop")}},{label:'findByProps("getRenderCloseButton")',run:function(){return n.findByProps("getRenderCloseButton")}},{label:'findByProps("getHeaderCloseButton")',run:function(){return n.findByProps("getHeaderCloseButton")}},{label:'findByName("Navigator")',run:function(){return n.findByName("Navigator")}},{label:'findByName("ThemedRolePill", false)',run:function(){return n.findByName("ThemedRolePill",!1)}},{label:'findByProps("saveProfileChanges")',run:function(){return n.findByProps("saveProfileChanges")}},{label:'findByProps("useAvatarColors")',run:function(){return n.findByProps("useAvatarColors")}},{label:'findByProps("useThemeContext")',run:function(){return n.findByProps("useThemeContext")}},{label:'findByProps("getProfileTheme")',run:function(){return n.findByProps("getProfileTheme")}},{label:'findByProps("ThemeContextProvider")',run:function(){return n.findByProps("ThemeContextProvider")}},{label:"semanticColors.HEADER_SECONDARY",run:function(){return o.semanticColors?.HEADER_SECONDARY}},{label:"semanticColors.BACKGROUND_ACCENT",run:function(){return o.semanticColors?.BACKGROUND_ACCENT}},{label:"semanticColors.BACKGROUND_PRIMARY",run:function(){return o.semanticColors?.BACKGROUND_PRIMARY}},{label:"semanticColors.BACKGROUND_FLOATING",run:function(){return o.semanticColors?.BACKGROUND_FLOATING}},{label:"semanticColors.BUTTON_OUTLINE_BRAND_BORDER_ACTIVE",run:function(){return o.semanticColors?.BUTTON_OUTLINE_BRAND_BORDER_ACTIVE}},{label:"semanticColors.TEXT_NORMAL",run:function(){return o.semanticColors?.TEXT_NORMAL}}];function m(t){if(t==null)return"NOT FOUND";if(typeof t=="object"){const i=Object.keys(t);return`found (${i.length} key${i.length===1?"":"s"})`}return`found (${typeof t})`}function $(){return v.map(function({label:t,run:i}){try{const r=i();return{label:t,found:r!=null,detail:m(r)}}catch(r){return{label:t,found:!1,detail:`threw: ${r}`}}})}function O(t){const i=t.filter(function(r){return!r.found});return[`Key Inspector report - ${new Date().toISOString()}`,`${t.length} checked, ${i.length} missing`,"",...t.map(function(r){return`[${r.found?"OK":"MISSING"}] ${r.label} -> ${r.detail}`}),"",`semanticColors keys (${Object.keys(o.semanticColors??{}).length}):`,...Object.keys(o.semanticColors??{}).sort(),"",`rawColors keys (${Object.keys(o.rawColors??{}).length}):`,...Object.keys(o.rawColors??{}).sort()].join(` -`)}const{View:p,Text:A}=e.ReactNative,{FormSection:B,FormInput:h}=g.Forms;function w(){const[t,i]=e.React.useState(null);return e.React.createElement(B,{title:"Full diagnostic scan"},e.React.createElement(p,{style:{paddingHorizontal:16,paddingVertical:8}},e.React.createElement(f,{label:"Run scan & copy full report",onPress:function(){const r=$(),u=r.filter(function(y){return!y.found}).length;e.clipboard.setString(O(r)),i(`${r.length} checked, ${u} missing - full report copied`),s.showToast(`${u} missing out of ${r.length} - report copied`,void 0)}}),t&&e.React.createElement(A,{style:{marginTop:8,fontSize:12.5,opacity:.7}},t)))}function _(){const[t,i]=e.React.useState(""),[r,u]=e.React.useState(""),y=function(){const a=t.split(",").map(function(l){return l.trim()}).filter(Boolean);if(a.length)try{const l=n.findByProps(...a);if(!l){e.clipboard.setString(`findByProps(${a.join(", ")}) -> not found`),s.showToast("No module found - copied that result",void 0);return}const c=Object.keys(l).sort();e.clipboard.setString(`findByProps(${a.join(", ")}) -> found, keys: -${c.join(` -`)}`),s.showToast(`Found it - copied ${c.length} key(s)`,void 0)}catch(l){e.clipboard.setString(`Error searching for ${a.join(", ")}: ${l}`),s.showToast("Search failed - copied the error instead",void 0)}},D=function(){const a=r.trim();if(a)try{const l=n.findByName(a,!1);if(!l){e.clipboard.setString(`findByName("${a}") -> not found`),s.showToast("No component found - copied that result",void 0);return}const c=Object.keys(l).sort();e.clipboard.setString(`findByName("${a}") -> found, keys: -${c.join(` -`)}`),s.showToast(`Found it - copied ${c.length} key(s)`,void 0)}catch(l){e.clipboard.setString(`Error searching for "${a}": ${l}`),s.showToast("Search failed - copied the error instead",void 0)}};return e.React.createElement(B,{title:"One-off search"},e.React.createElement(p,{style:{paddingHorizontal:16,paddingVertical:8}},e.React.createElement(h,{title:"findByProps - comma-separated prop names",placeholder:"e.g. sendMessage, sendBotMessage",value:t,onChange:i}),e.React.createElement(f,{label:"Search & copy result",style:{marginTop:8,marginBottom:16},onPress:y}),e.React.createElement(h,{title:"findByName - component name",placeholder:"e.g. ThemedRolePill",value:r,onChange:u}),e.React.createElement(f,{label:"Search & copy result",style:{marginTop:8},onPress:D})))}function k(){return e.React.createElement(R,null,e.React.createElement(w,null),e.React.createElement(_,null),e.React.createElement(S,null,"The full scan checks every internal lookup this repo's plugins depend on (plus a few for plugins currently being fixed) in one pass, and includes the complete list of semanticColors/rawColors keys at the end. Paste the report back into chat when reporting a bug - it tells us exactly what's missing on your Discord version."))}var U={settings:k};return d.default=U,Object.defineProperty(d,"__esModule",{value:!0}),d})({},vendetta.metro.common,vendetta.metro,vendetta.ui.toasts,vendetta.ui.components,vendetta.ui); +(function(h,e,t,c,S,s){"use strict";const{ScrollView:T,View:v}=e.ReactNative;function E({children:n}){return e.React.createElement(T,{style:{flex:1}},n,e.React.createElement(v,{style:{height:24}}))}const{View:$,Text:w}=e.ReactNative;function m({children:n,style:i}){return e.React.createElement($,{style:[{marginHorizontal:16,marginVertical:8,padding:10,borderRadius:8,borderWidth:1,borderColor:"rgba(128,128,128,0.25)"},i]},e.React.createElement(w,{style:{fontSize:12.5,lineHeight:18,opacity:.75}},n))}const{TouchableOpacity:A,Text:O}=e.ReactNative;function y({label:n,onPress:i,disabled:r,style:u}){return e.React.createElement(A,{disabled:r,onPress:i,style:[{backgroundColor:"#5865F2",borderRadius:8,padding:10,alignItems:"center",opacity:r?.5:1},u]},e.React.createElement(O,{style:{color:"white",fontWeight:"600"}},n))}const k=[{label:'findByProps("computePermissions", "canEveryoneRole")',run:function(){return t.findByProps("computePermissions","canEveryoneRole")}},{label:'findByProps("getBotLabel")',run:function(){return t.findByProps("getBotLabel")}},{label:'findByName("DisplayName", false)',run:function(){return t.findByName("DisplayName",!1)}},{label:'findByName("HeaderName", false)',run:function(){return t.findByName("HeaderName",!1)}},{label:'findByName("getTagProperties", false)',run:function(){return t.findByName("getTagProperties",!1)}},{label:'findByTypeNameAll("UserRow")',run:function(){return t.findByTypeNameAll("UserRow")}},{label:'findByStoreName("ThemeStore")',run:function(){return t.findByStoreName("ThemeStore")}},{label:'findByStoreName("GuildMemberStore")',run:function(){return t.findByStoreName("GuildMemberStore")}},{label:'findByStoreName("GuildStore")',run:function(){return t.findByStoreName("GuildStore")}},{label:'findByStoreName("ChannelStore")',run:function(){return t.findByStoreName("ChannelStore")}},{label:'findByStoreName("UserStore")',run:function(){return t.findByStoreName("UserStore")}},{label:'findByStoreName("RelationshipStore")',run:function(){return t.findByStoreName("RelationshipStore")}},{label:'findByName("RowManager", false)',run:function(){return t.findByName("RowManager",!1)}},{label:'findByProps("TYPING_WRAPPER_HEIGHT")',run:function(){return t.findByProps("TYPING_WRAPPER_HEIGHT")}},{label:'findByName("VoiceUserConnected", false)',run:function(){return t.findByName("VoiceUserConnected",!1)}},{label:"find(resolveSemanticColor via default.internal)",run:function(){return t.find(function(n){return n?.default?.internal?.resolveSemanticColor})}},{label:"find(resolveSemanticColor via meta)",run:function(){return t.find(function(n){return n?.meta?.resolveSemanticColor})}},{label:"find(UserProfile)",run:function(){return t.find(function(n){return n?.type?.name==="UserProfile"})}},{label:'findByName("UserProfileSection", false)',run:function(){return t.findByName("UserProfileSection",!1)}},{label:'findByProps("sendMessage", "sendBotMessage")',run:function(){return t.findByProps("sendMessage","sendBotMessage")}},{label:'findByProps("openLazy", "hideActionSheet")',run:function(){return t.findByProps("openLazy","hideActionSheet")}},{label:'findByProps("push", "pushLazy", "pop")',run:function(){return t.findByProps("push","pushLazy","pop")}},{label:'findByProps("getRenderCloseButton")',run:function(){return t.findByProps("getRenderCloseButton")}},{label:'findByProps("getHeaderCloseButton")',run:function(){return t.findByProps("getHeaderCloseButton")}},{label:'findByName("Navigator")',run:function(){return t.findByName("Navigator")}},{label:'findByName("ThemedRolePill", false)',run:function(){return t.findByName("ThemedRolePill",!1)}},{label:'findByProps("saveProfileChanges")',run:function(){return t.findByProps("saveProfileChanges")}},{label:'findByProps("useAvatarColors")',run:function(){return t.findByProps("useAvatarColors")}},{label:'findByProps("useThemeContext")',run:function(){return t.findByProps("useThemeContext")}},{label:'findByProps("getProfileTheme")',run:function(){return t.findByProps("getProfileTheme")}},{label:'findByProps("ThemeContextProvider")',run:function(){return t.findByProps("ThemeContextProvider")}},{label:"semanticColors.HEADER_SECONDARY",run:function(){return s.semanticColors?.HEADER_SECONDARY}},{label:"semanticColors.BACKGROUND_ACCENT",run:function(){return s.semanticColors?.BACKGROUND_ACCENT}},{label:"semanticColors.BACKGROUND_PRIMARY",run:function(){return s.semanticColors?.BACKGROUND_PRIMARY}},{label:"semanticColors.BACKGROUND_FLOATING",run:function(){return s.semanticColors?.BACKGROUND_FLOATING}},{label:"semanticColors.BUTTON_OUTLINE_BRAND_BORDER_ACTIVE",run:function(){return s.semanticColors?.BUTTON_OUTLINE_BRAND_BORDER_ACTIVE}},{label:"semanticColors.TEXT_NORMAL",run:function(){return s.semanticColors?.TEXT_NORMAL}}];function _(n){if(n==null)return"NOT FOUND";if(typeof n=="object"){const i=Object.keys(n);return`found (${i.length} key${i.length===1?"":"s"})`}return`found (${typeof n})`}function j(){return k.map(function({label:n,run:i}){try{const r=i();return{label:n,found:r!=null,detail:_(r)}}catch(r){return{label:n,found:!1,detail:`threw: ${r}`}}})}function D(n){const i=n.filter(function(r){return!r.found});return[`Key Inspector report - ${new Date().toISOString()}`,`${n.length} checked, ${i.length} missing`,"",...n.map(function(r){return`[${r.found?"OK":"MISSING"}] ${r.label} -> ${r.detail}`}),"",`semanticColors keys (${Object.keys(s.semanticColors??{}).length}):`,...Object.keys(s.semanticColors??{}).sort(),"",`rawColors keys (${Object.keys(s.rawColors??{}).length}):`,...Object.keys(s.rawColors??{}).sort()].join(` +`)}const I=new Set(["vendetta.metro.modules"]);function U(n){return n===null?"null":n===void 0?"undefined":Array.isArray(n)?`array(${n.length})`:typeof n}function G(n=3){const i=new WeakSet,r=[];function u(l,d,o){if(l==null||typeof l!="object"&&typeof l!="function")return;if(I.has(d)){r.push(`${d} -> (skipped - Discord's full module registry, use the search tools for this)`);return}if(typeof l=="object"){if(i.has(l)){r.push(`${d} -> [already listed elsewhere, circular]`);return}i.add(l)}let a;try{a=Object.keys(l).sort()}catch(p){r.push(`${d} -> [couldn't read keys: ${p}]`);return}const f=a.slice(0,60);for(const p of f){const B=`${d}.${p}`;let R;try{R=l[p]}catch(F){r.push(`${B} -> [threw on access: ${F}]`);continue}const C=U(R);r.push(`${B} (${C})`),C==="object"&&o60&&r.push(`${d} -> (+${a.length-60} more keys not shown at this level)`)}try{u(globalThis.vendetta,"vendetta",0)}catch(l){r.push(`Error walking the vendetta object: ${l}`)}return r.length?r.join(` +`):"vendetta object not found or empty"}const{View:g,Text:N}=e.ReactNative,{FormSection:b,FormInput:P}=S.Forms;function M(){const[n,i]=e.React.useState(null);return e.React.createElement(b,{title:"Full diagnostic scan"},e.React.createElement(g,{style:{paddingHorizontal:16,paddingVertical:8}},e.React.createElement(y,{label:"Run scan & copy full report",onPress:function(){const r=j(),u=r.filter(function(l){return!l.found}).length;e.clipboard.setString(D(r)),i(`${r.length} checked, ${u} missing - full report copied`),c.showToast(`${u} missing out of ${r.length} - report copied`,void 0)}}),n&&e.React.createElement(N,{style:{marginTop:8,fontSize:12.5,opacity:.7}},n)))}function H(){return e.React.createElement(b,{title:"Full Vendetta API tree"},e.React.createElement(g,{style:{paddingHorizontal:16,paddingVertical:8}},e.React.createElement(y,{label:"Copy the entire plugin API tree",onPress:function(){const n=G(3),i=n.split(` +`).length;e.clipboard.setString(n),c.showToast(`Copied ${i} lines - every key path under window.vendetta`,void 0)}}),e.React.createElement(N,{style:{marginTop:8,fontSize:12.5,opacity:.7}},"Every key path under the stable plugin API (window.vendetta), 3 levels deep - this is everything Revenge itself exposes to plugins, not Discord's raw internals (those are searchable individually below, since dumping all of them would be enormous).")))}function V(){const[n,i]=e.React.useState(""),[r,u]=e.React.useState(""),l=function(){const o=n.split(",").map(function(a){return a.trim()}).filter(Boolean);if(o.length)try{const a=t.findByProps(...o);if(!a){e.clipboard.setString(`findByProps(${o.join(", ")}) -> not found`),c.showToast("No module found - copied that result",void 0);return}const f=Object.keys(a).sort();e.clipboard.setString(`findByProps(${o.join(", ")}) -> found, keys: +${f.join(` +`)}`),c.showToast(`Found it - copied ${f.length} key(s)`,void 0)}catch(a){e.clipboard.setString(`Error searching for ${o.join(", ")}: ${a}`),c.showToast("Search failed - copied the error instead",void 0)}},d=function(){const o=r.trim();if(o)try{const a=t.findByName(o,!1);if(!a){e.clipboard.setString(`findByName("${o}") -> not found`),c.showToast("No component found - copied that result",void 0);return}const f=Object.keys(a).sort();e.clipboard.setString(`findByName("${o}") -> found, keys: +${f.join(` +`)}`),c.showToast(`Found it - copied ${f.length} key(s)`,void 0)}catch(a){e.clipboard.setString(`Error searching for "${o}": ${a}`),c.showToast("Search failed - copied the error instead",void 0)}};return e.React.createElement(b,{title:"One-off search"},e.React.createElement(g,{style:{paddingHorizontal:16,paddingVertical:8}},e.React.createElement(P,{title:"findByProps - comma-separated prop names",placeholder:"e.g. sendMessage, sendBotMessage",value:n,onChange:i}),e.React.createElement(y,{label:"Search & copy result",style:{marginTop:8,marginBottom:16},onPress:l}),e.React.createElement(P,{title:"findByName - component name",placeholder:"e.g. ThemedRolePill",value:r,onChange:u}),e.React.createElement(y,{label:"Search & copy result",style:{marginTop:8},onPress:d})))}function L(){return e.React.createElement(E,null,e.React.createElement(M,null),e.React.createElement(H,null),e.React.createElement(V,null),e.React.createElement(m,null,"The full scan checks every internal lookup this repo's plugins depend on (plus a few for plugins currently being fixed) in one pass, and includes the complete list of semanticColors/rawColors keys at the end. Paste the report back into chat when reporting a bug - it tells us exactly what's missing on your Discord version."))}var z={settings:L};return h.default=z,Object.defineProperty(h,"__esModule",{value:!0}),h})({},vendetta.metro.common,vendetta.metro,vendetta.ui.toasts,vendetta.ui.components,vendetta.ui); diff --git a/key-inspector/install/manifest.json b/key-inspector/install/manifest.json index c3f1ecf..4b8fc56 100644 --- a/key-inspector/install/manifest.json +++ b/key-inspector/install/manifest.json @@ -1 +1 @@ -{"name":"Key Inspector","description":"Dev utility: copies live Discord/Revenge color token keys to your clipboard, for diagnosing plugin crashes without needing a computer.","authors":[{"name":"everestmcarthur"}],"main":"index.js","hash":"a35903823b4ea650e0bf7390d770b7ae1a1992a70d22d064a22feb94fce2b56d"} \ No newline at end of file +{"name":"Key Inspector","description":"Dev utility: copies live Discord/Revenge color token keys to your clipboard, for diagnosing plugin crashes without needing a computer.","authors":[{"name":"everestmcarthur"}],"main":"index.js","hash":"5d1c38b44612c122751caa24a5b7e5d5c6ec82f62347c014d3b0c52fe8a96a2c"} \ No newline at end of file diff --git a/plugins-data.json b/plugins-data.json index 7740713..834253a 100644 --- a/plugins-data.json +++ b/plugins-data.json @@ -1,4 +1,31 @@ [ + { + "id": "fake-profile-themes-and-effects", + "name": "FakeProfileThemesAndEffects", + "description": "Profile theming and profile effects without Nitro, by hiding the color/effect data in your About Me using invisible zero-width characters.", + "authors": [ + "everestmcarthur", + "ryan", + "シグマ siguma" + ], + "category": "Identity", + "status": "revived", + "accent": "#EB459E", + "tagline": "Profile theming and profile effects without Nitro.", + "note": "Fork of shipwr3ckd's FPTE. Previously crashed every time you opened the profile editor - confirmed via on-device diagnostics that several color tokens it referenced (HEADER_SECONDARY, BACKGROUND_PRIMARY, BACKGROUND_FLOATING, TEXT_NORMAL) no longer exist on current Discord builds. Rebuilt with a fallback chain of real, currently-valid token names instead of a single hardcoded one.", + "howItWorks": "Encodes your chosen primary color, accent color, and profile effect into invisible zero-width characters appended to your About Me - other people running a compatible plugin (this one, or the original) decode and render it as if you had real Nitro profile theming, without Discord's servers ever knowing. The builder UI for picking colors/effects lives right in the profile editor. Only the two files that were actually confirmed crashing were investigated and fixed; the rest of this plugin's original patches (Nitro upsell card, purchase checks, profile data fetching) are carried over as-is, now with crash isolation so any other latent issue only disables that one patch instead of the whole plugin.", + "features": [ + "Pick a primary color, accent color, and profile effect from the profile editor", + "No Nitro required - works purely by encoding data into your bio", + "Crash isolation per patch, so one broken surface doesn't take down the rest" + ], + "commands": [], + "limitations": "Only the confirmed profile-editor crash was root-caused and fixed with real on-device data. The plugin's other patches (Nitro upsell card, purchase/profile data fetching) weren't individually re-audited - crash isolation means a problem there disables just that patch rather than the whole plugin, but hasn't been proven bug-free the way the color-resolution fix has.", + "pageUrl": "https://rp.jarviscli.dev/fake-profile-themes-and-effects/", + "installUrl": "https://rp.jarviscli.dev/fake-profile-themes-and-effects/install/", + "sourceUrl": "https://github.com/everestmcarthur/revenge-plugins/tree/main/plugins/fake-profile-themes-and-effects", + "issueUrl": "https://github.com/everestmcarthur/revenge-plugins/issues/new?title=%5BFakeProfileThemesAndEffects%5D%20" + }, { "id": "pronoun-db", "name": "PronounDB", @@ -278,12 +305,13 @@ "howItWorks": "The main feature is a full scan: one button runs every internal lookup (findByProps, findByName, findByStoreName, specific semanticColors tokens) that this repo's plugins actually depend on, all in one pass, and copies a complete found/missing report plus the full current semanticColors and rawColors key lists to your clipboard. There's also a manual search section for anything not already in the scan list - type prop names or a component name and copy what findByProps/findByName returns for it. Nothing leaves your device; everything only touches your clipboard.", "features": [ "Full scan: every known lookup, checked in one tap, with a copyable report", + "Full Vendetta API tree: every key path Revenge exposes to plugins, 3 levels deep, in one copy", "Manual findByProps(...) / findByName(...) search for anything else", "Includes the complete semanticColors and rawColors key lists", "No network requests, no data collection - clipboard only" ], "commands": [], - "limitations": "The full-scan list only covers lookups this repo's plugins currently use - it's meant to grow as more plugins get added or fixed, not to be exhaustive of everything Discord/Revenge expose.", + "limitations": "The full-scan list only covers lookups this repo's plugins currently use - it's meant to grow as more plugins get added or fixed. The API tree covers Revenge's own plugin API (window.vendetta), not Discord's raw internal module registry, which is far too large to dump wholesale - use the search tools for that.", "pageUrl": "https://rp.jarviscli.dev/key-inspector/", "installUrl": "https://rp.jarviscli.dev/key-inspector/install/", "sourceUrl": "https://github.com/everestmcarthur/revenge-plugins/tree/main/plugins/key-inspector",