diff --git a/plugins-data.json b/plugins-data.json index 834253a..6e6f65a 100644 --- a/plugins-data.json +++ b/plugins-data.json @@ -12,7 +12,7 @@ "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.", + "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. A second, separate bug (an unguarded lookup that crashed the whole plugin bundle before it could even load) is also fixed.", "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", @@ -37,7 +37,7 @@ "status": "revived", "accent": "#9B59B6", "tagline": "Shows a user's pronouns in their profile, pulled from pronoundb.org.", - "note": "Previously broken because PronounDB shut down the API it used (HTTP 410) - migrated to their current v2 API. Requires people to have set pronouns at pronoundb.org; nothing to configure in the plugin itself.", + "note": "Previously broken because PronounDB shut down the API it used (HTTP 410) - migrated to their current v2 API. Also fixed the profile-page lookup itself: Discord renamed the top-level profile component to UserProfileContent and the bio card to UserProfileAboutMeCard (confirmed against decompiled current-build source), so both the new and old names are checked. Requires people to have set pronouns at pronoundb.org; nothing to configure in the plugin itself.", "howItWorks": "PronounDB is a separate, independent service (not run by Discord or Revenge) where people manually set their own pronouns once and link the profile to their Discord account. This plugin adds a \"Pronouns\" section near the bio on anyone's profile who has done that. Lookups are batched and cached client-side, so opening a profile for the first time may take a moment while it fetches, and re-opening the same profile later is instant.", "features": [ "Adds a native-feeling \"Pronouns\" section to profiles", @@ -90,7 +90,7 @@ "status": "revived", "accent": "#1ABC9C", "tagline": "Long-press a role pill to copy its color as hex.", - "note": "Previously broken (unguarded React-tree lookups that could throw on a shape mismatch). Rebuilt with defensive checks throughout.", + "note": "Previously broken - the component was renamed from ThemedRolePill to just RolePill (confirmed against decompiled current-build Discord source), so the old lookup never found anything. Now checks both names, with defensive checks throughout so a shape mismatch never crashes.", "howItWorks": "Long-press a role pill - in the member list, a role list, wherever Discord renders one as its own element - and the color gets copied to your clipboard as a hex code. Useful for designers, bot builders, or staff matching embed colors to a role.", "features": [ "Works on any rendered role pill, not just one specific screen", @@ -317,6 +317,35 @@ "sourceUrl": "https://github.com/everestmcarthur/revenge-plugins/tree/main/plugins/key-inspector", "issueUrl": "https://github.com/everestmcarthur/revenge-plugins/issues/new?title=%5BKey%20Inspector%5D%20" }, + { + "id": "rose-utils", + "name": "RoseUtils", + "description": "A small collection of independent utilities - Spotify listen-along, a Tenor download fix, colorful channel icons, and more. Fork of nexpid's NexxUtils.", + "authors": [ + "everestmcarthur", + "nexpid" + ], + "category": "Utility", + "status": "revived", + "accent": "#F0637E", + "tagline": "A grab-bag of independent utilities - Spotify listen-along, a Tenor fix, colorful channels, and more.", + "note": "Fork of nexpid's NexxUtils. Fixed the reported \"render is not a function in SpotifyPlayButton\" crash - Discord converted it from a class component to a function component, confirmed against decompiled current-build source, so patching .prototype.render no longer worked. Also fixed six other lookups across the plugin that had the same unguarded pattern that crashed FPTE's whole bundle at load time - any one of them failing would have taken the entire plugin down, not just one module.", + "howItWorks": "Each utility is its own independently toggleable module: Spotify listen-along buttons on activities, a fix for Tenor GIFs downloading as videos, an invite-to-listen-along button in the chat attachment menu, a fun \"minimod\" that shows member timeouts in chat, and colorful/NSFW-tagged channel icons. Every module tracks its own errors and shows a one-tap \"copy report\" row if something goes wrong, so a problem in one module is easy to report without digging through logs. The original's Material-Design component reskin (Switch/Toast/Alert) wasn't ported - it depends on react-native-reanimated, which isn't part of this build, and it was already disabled by default upstream due to known issues.", + "features": [ + "Spotify listen-along buttons on activities (fixed)", + "Tenor GIF download fix", + "Send-a-Spotify-invite button in the attachment menu", + "Minimod: shows member timeouts in chat", + "Colorful, NSFW-tagged channel icons", + "Per-module error tracking with one-tap copy for bug reports" + ], + "commands": [], + "limitations": "The Material-Design component reskin from the original isn't included (needs react-native-reanimated). Each module was fixed and defensively guarded, but only the specific reported crash was verified against live decompiled source - the rest are guarded, not individually confirmed working on-device.", + "pageUrl": "https://rp.jarviscli.dev/rose-utils/", + "installUrl": "https://rp.jarviscli.dev/rose-utils/install/", + "sourceUrl": "https://github.com/everestmcarthur/revenge-plugins/tree/main/plugins/rose-utils", + "issueUrl": "https://github.com/everestmcarthur/revenge-plugins/issues/new?title=%5BRoseUtils%5D%20" + }, { "id": "view-raw", "name": "ViewRaw", diff --git a/role-color-everywhere/install/index.js b/role-color-everywhere/install/index.js index 3db00ec..d046921 100644 --- a/role-color-everywhere/install/index.js +++ b/role-color-everywhere/install/index.js @@ -1 +1 @@ -(function(m,w,o,d,s,p,T,x,R,V){"use strict";function $(e,t,n,r){try{return n()}catch(a){return r.error(`[${e}] Failed to apply the "${t}" patch, that surface will be skipped: ${a}`),function(){}}}function k(e,t,n){const r=Object.entries(n).map(function([a,c]){return $(e,a,c,t)});return function(){return r.forEach(function(a){return a()})}}function B(e){return e.length===4?"#"+e.slice(1).split("").map(function(t){return t+t}).join(""):e}function O(e,t,n){const r=function(f){return(B(f).match(/\w\w/g)??["00","00","00"]).map(function(i){return parseInt(i,16)})},a=function(f){return"#"+f.map(function(i){return i.toString(16).padStart(2,"0")}).join("")},c=r(e),l=r(t),u=c.map(function(f,i){return Math.round(f+(l[i]-f)*n)});return a(u)}const P=d.findByStoreName("ThemeStore"),_=d.find(function(e){return e?.default?.internal?.resolveSemanticColor})?.default?.internal?.resolveSemanticColor??d.find(function(e){return e?.meta?.resolveSemanticColor})?.meta?.resolveSemanticColor??function(){};function S(){try{return _(P?.theme,T.semanticColors.TEXT_NORMAL)}catch{return}}const I=d.findByStoreName("GuildMemberStore"),A=d.findByStoreName("ChannelStore"),M=d.findByName("RowManager",!1);function y(e,t,n,r){if(!e)return e;if(r=r?[...r,e]:[e],Array.isArray(e.content)?e.content.forEach(function(a,c){return e.content[c]=y(a,t,n,r)}):e.items?e.items.forEach(function(a,c){return e.items[c]=y(a,t,n,r)}):Array.isArray(e)&&e.forEach(function(a,c){return e[c]=y(a,t,n,r)}),e.type)for(const a of t)e=a(e,n,r)||e;return e}function v(e){const{message:t}=e;if(!t||(!o.storage.chatInterpolation||o.storage.chatInterpolation<=0)&&o.storage.noMention)return;const n=A?.getChannel(t.channelId);if(!n?.guild_id)return;const r=function(l){if(l.type!=="mention"||!l.userId)return;const u=I?.getMember(n.guild_id,l.userId)?.colorString;if(u)return{...l,roleColor:parseInt(u.slice(1),16),color:parseInt(u.slice(1),16),colorString:u}},a=function(l,[u],f){if(f?.map(function(h){return h.type})?.some(function(h){return["mention","channelMention","roleMention","commandMention","link"].includes(h)})||l.type!=="text")return;const i=I?.getMember(t.guildId,u);if(i?.colorString)return{content:[l],target:"usernameOnClick",context:{username:1,usernameOnClick:{action:"0",userId:"0",linkColor:s.ReactNative.processColor(O(S()??"#ffffff",i.colorString,o.storage.chatInterpolation/100)),messageChannelId:"0"},medium:!0},type:"link"}},c=[];o.storage.chatInterpolation>0&&c.push(a),o.storage.noMention||(c.push(r),t.shouldShowRoleOnName=!0,t.referencedMessage?.message&&(t.referencedMessage.message.shouldShowRoleOnName=!0)),c.length&&(t.content&&y({content:t.content},c,[t.authorId]),t.embeds&&t.embeds.forEach(function(l){return y({content:l.description},c,[t.authorId])}),t.referencedMessage?.message?.content&&y({content:t.referencedMessage.message.content},c,[t.referencedMessage.message.authorId]))}function G(){const{NativeModules:e}=s.ReactNative,t=e?.DCDChatManager;return t?.updateRows?p.before("updateRows",t,function(n){try{const r=JSON.parse(n[1]);for(const a of r)v(a);n[1]=JSON.stringify(r)}catch{}}):M?.prototype?.generate?p.after("generate",M.prototype,function(n,r){try{v(r)}catch{}}):function(){}}const{View:C}=s.ReactNative,L=d.findByStoreName("GuildStore");function F(){return C?p.after("render",C,function(e,t){try{if(o.storage.noRole)return;const n=x.findInReactTree(t,function(a){return a?.props?.roleId!==void 0});if(!n||Number.isNaN(Number(n.props.roleId))||n.props.excludedApplications||"displayRoleIcon"in n.props||"searchable"in n.props)return;const r={type:{...n.type}};p.after("type",r.type,function(a,c){const l=c?.props?.children?.[1];if(!l?.type)return;const u={type:{...l.type}};p.after("render",u.type,function(f,i){const h=L?.getGuild(n.props.guildId)?.roles?.[n.props.roleId];!h?.colorString||!i?.props?.style?.push||i.props.style.push({color:h.colorString})}),l.type=u.type}),n.type=r.type}catch{}}):function(){}}const{Text:D}=R.General,H=d.findByStoreName("UserStore"),U=d.findByStoreName("RelationshipStore"),j=d.findByStoreName("GuildMemberStore"),b=d.findByProps("TYPING_WRAPPER_HEIGHT");function z(){return b?.default?p.after("default",b,function([{channel:e}],t){try{if(!t||o.storage.hideTyping)return;const n=t.props?.children;if(!n)return;const r=p.after("type",n,function(a,c){try{s.React.useEffect(function(){return function(){return r()}},[]);const l=c?.props?.children?.[0]?.props?.children?.[1]?.props;if(!l?.children||l.children==="Several people are typing...")return;const u=(b.useTypingUserIds?.(e.id)??[]).map(function(i){const h=j?.getMember(e.guild_id,i),E=H?.getUser(i),re=h?.nick||U?.getNickname?.(i)||E?.globalName||E?.username||"Someone",oe=h?.colorString||S();return{name:re,color:oe}});if(!u.length)return;const f=function(i){return s.React.createElement(D,{style:{color:i.color,fontFamily:s.constants.Fonts.DISPLAY_SEMIBOLD}},i.name)};l.children=u.length===1?[f(u[0])," is typing..."]:[...u.slice(0,-1).flatMap(function(i,h){return[f(i),h0,onValueChange:function(e){o.storage.chatInterpolation=e?60:0}}),o.storage.chatInterpolation>0&&s.React.createElement(ee,{title:"Message text strength (0-100)",value:String(o.storage.chatInterpolation),keyboardType:"numeric",onChange:function(e){o.storage.chatInterpolation=Math.max(0,Math.min(100,Number(e)||0))}})),s.React.createElement(Q,null,"Some of these surfaces (especially the member list headers) rely on component internals Discord doesn't officially expose, so a future Discord update may silently turn one of these off again - the rest will keep working if that happens."))}let N=function(){};var ne={onLoad:function(){o.storage.noMention??=!1,o.storage.noRole??=!1,o.storage.noVoice??=!1,o.storage.hideTyping??=!1,o.storage.chatInterpolation??=0,N=k("RoleColorEverywhere",w.logger,{"mentions & chat text":G,"member list role headers":F,"typing indicator":z,"voice channel names":W})},onUnload:function(){return N()},settings:te};return m.default=ne,Object.defineProperty(m,"__esModule",{value:!0}),m})({},vendetta,vendetta.plugin,vendetta.metro,vendetta.metro.common,vendetta.patcher,vendetta.ui,vendetta.utils,vendetta.ui.components,vendetta.storage); +(function(m,w,o,f,s,p,T,x,R,V){"use strict";function B(e,t,n,r){try{return n()}catch(a){return r.error(`[${e}] Failed to apply the "${t}" patch, that surface will be skipped: ${a}`),function(){}}}function $(e,t,n){const r=Object.entries(n).map(function([a,c]){return B(e,a,c,t)});return function(){return r.forEach(function(a){return a()})}}f.findByStoreName("ThemeStore"),f.find(function(e){return e?.default?.internal?.resolveSemanticColor})?.default?.internal?.resolveSemanticColor??f.find(function(e){return e?.meta?.resolveSemanticColor})?.meta?.resolveSemanticColor;function k(e){return e.length===4?"#"+e.slice(1).split("").map(function(t){return t+t}).join(""):e}function O(e,t,n){const r=function(d){return(k(d).match(/\w\w/g)??["00","00","00"]).map(function(i){return parseInt(i,16)})},a=function(d){return"#"+d.map(function(i){return i.toString(16).padStart(2,"0")}).join("")},c=r(e),l=r(t),u=c.map(function(d,i){return Math.round(d+(l[i]-d)*n)});return a(u)}const P=f.findByStoreName("ThemeStore"),_=f.find(function(e){return e?.default?.internal?.resolveSemanticColor})?.default?.internal?.resolveSemanticColor??f.find(function(e){return e?.meta?.resolveSemanticColor})?.meta?.resolveSemanticColor??function(){};function S(){try{return _(P?.theme,T.semanticColors.TEXT_NORMAL)}catch{return}}const v=f.findByStoreName("GuildMemberStore"),A=f.findByStoreName("ChannelStore"),I=f.findByName("RowManager",!1);function y(e,t,n,r){if(!e)return e;if(r=r?[...r,e]:[e],Array.isArray(e.content)?e.content.forEach(function(a,c){return e.content[c]=y(a,t,n,r)}):e.items?e.items.forEach(function(a,c){return e.items[c]=y(a,t,n,r)}):Array.isArray(e)&&e.forEach(function(a,c){return e[c]=y(a,t,n,r)}),e.type)for(const a of t)e=a(e,n,r)||e;return e}function C(e){const{message:t}=e;if(!t||(!o.storage.chatInterpolation||o.storage.chatInterpolation<=0)&&o.storage.noMention)return;const n=A?.getChannel(t.channelId);if(!n?.guild_id)return;const r=function(l){if(l.type!=="mention"||!l.userId)return;const u=v?.getMember(n.guild_id,l.userId)?.colorString;if(u)return{...l,roleColor:parseInt(u.slice(1),16),color:parseInt(u.slice(1),16),colorString:u}},a=function(l,[u],d){if(d?.map(function(h){return h.type})?.some(function(h){return["mention","channelMention","roleMention","commandMention","link"].includes(h)})||l.type!=="text")return;const i=v?.getMember(t.guildId,u);if(i?.colorString)return{content:[l],target:"usernameOnClick",context:{username:1,usernameOnClick:{action:"0",userId:"0",linkColor:s.ReactNative.processColor(O(S()??"#ffffff",i.colorString,o.storage.chatInterpolation/100)),messageChannelId:"0"},medium:!0},type:"link"}},c=[];o.storage.chatInterpolation>0&&c.push(a),o.storage.noMention||(c.push(r),t.shouldShowRoleOnName=!0,t.referencedMessage?.message&&(t.referencedMessage.message.shouldShowRoleOnName=!0)),c.length&&(t.content&&y({content:t.content},c,[t.authorId]),t.embeds&&t.embeds.forEach(function(l){return y({content:l.description},c,[t.authorId])}),t.referencedMessage?.message?.content&&y({content:t.referencedMessage.message.content},c,[t.referencedMessage.message.authorId]))}function G(){const{NativeModules:e}=s.ReactNative,t=e?.DCDChatManager;return t?.updateRows?p.before("updateRows",t,function(n){try{const r=JSON.parse(n[1]);for(const a of r)C(a);n[1]=JSON.stringify(r)}catch{}}):I?.prototype?.generate?p.after("generate",I.prototype,function(n,r){try{C(r)}catch{}}):function(){}}const{View:M}=s.ReactNative,L=f.findByStoreName("GuildStore");function F(){return M?p.after("render",M,function(e,t){try{if(o.storage.noRole)return;const n=x.findInReactTree(t,function(a){return a?.props?.roleId!==void 0});if(!n||Number.isNaN(Number(n.props.roleId))||n.props.excludedApplications||"displayRoleIcon"in n.props||"searchable"in n.props)return;const r={type:{...n.type}};p.after("type",r.type,function(a,c){const l=c?.props?.children?.[1];if(!l?.type)return;const u={type:{...l.type}};p.after("render",u.type,function(d,i){const h=L?.getGuild(n.props.guildId)?.roles?.[n.props.roleId];!h?.colorString||!i?.props?.style?.push||i.props.style.push({color:h.colorString})}),l.type=u.type}),n.type=r.type}catch{}}):function(){}}const{Text:D}=R.General,H=f.findByStoreName("UserStore"),U=f.findByStoreName("RelationshipStore"),j=f.findByStoreName("GuildMemberStore"),b=f.findByProps("TYPING_WRAPPER_HEIGHT");function z(){return b?.default?p.after("default",b,function([{channel:e}],t){try{if(!t||o.storage.hideTyping)return;const n=t.props?.children;if(!n)return;const r=p.after("type",n,function(a,c){try{s.React.useEffect(function(){return function(){return r()}},[]);const l=c?.props?.children?.[0]?.props?.children?.[1]?.props;if(!l?.children||l.children==="Several people are typing...")return;const u=(b.useTypingUserIds?.(e.id)??[]).map(function(i){const h=j?.getMember(e.guild_id,i),E=H?.getUser(i),re=h?.nick||U?.getNickname?.(i)||E?.globalName||E?.username||"Someone",oe=h?.colorString||S();return{name:re,color:oe}});if(!u.length)return;const d=function(i){return s.React.createElement(D,{style:{color:i.color,fontFamily:s.constants.Fonts.DISPLAY_SEMIBOLD}},i.name)};l.children=u.length===1?[d(u[0])," is typing..."]:[...u.slice(0,-1).flatMap(function(i,h){return[d(i),h0,onValueChange:function(e){o.storage.chatInterpolation=e?60:0}}),o.storage.chatInterpolation>0&&s.React.createElement(ee,{title:"Message text strength (0-100)",value:String(o.storage.chatInterpolation),keyboardType:"numeric",onChange:function(e){o.storage.chatInterpolation=Math.max(0,Math.min(100,Number(e)||0))}})),s.React.createElement(Q,null,"Some of these surfaces (especially the member list headers) rely on component internals Discord doesn't officially expose, so a future Discord update may silently turn one of these off again - the rest will keep working if that happens."))}let N=function(){};var ne={onLoad:function(){o.storage.noMention??=!1,o.storage.noRole??=!1,o.storage.noVoice??=!1,o.storage.hideTyping??=!1,o.storage.chatInterpolation??=0,N=$("RoleColorEverywhere",w.logger,{"mentions & chat text":G,"member list role headers":F,"typing indicator":z,"voice channel names":W})},onUnload:function(){return N()},settings:te};return m.default=ne,Object.defineProperty(m,"__esModule",{value:!0}),m})({},vendetta,vendetta.plugin,vendetta.metro,vendetta.metro.common,vendetta.patcher,vendetta.ui,vendetta.utils,vendetta.ui.components,vendetta.storage); diff --git a/role-color-everywhere/install/manifest.json b/role-color-everywhere/install/manifest.json index f62ca5b..430ba8f 100644 --- a/role-color-everywhere/install/manifest.json +++ b/role-color-everywhere/install/manifest.json @@ -1 +1 @@ -{"name":"RoleColorEverywhere","description":"Displays a member's top role color in more places: mentions, the typing indicator, voice channel participant names, member list role headers, and optionally message text.","authors":[{"name":"everestmcarthur"}],"main":"index.js","vendetta":{"icon":"ic_theme_24px"},"hash":"ae31dba924c5e4aca9f3be01f489fbc1e2eddc23deb7ac970138c3cff9f9eddf"} \ No newline at end of file +{"name":"RoleColorEverywhere","description":"Displays a member's top role color in more places: mentions, the typing indicator, voice channel participant names, member list role headers, and optionally message text.","authors":[{"name":"everestmcarthur"}],"main":"index.js","vendetta":{"icon":"ic_theme_24px"},"hash":"d614c27b4701a8665bdd2bb0ca58f7048a445cec39e1d1f25c794bdca6a27c4f"} \ No newline at end of file diff --git a/rose-utils/index.html b/rose-utils/index.html new file mode 100644 index 0000000..d3dce5e --- /dev/null +++ b/rose-utils/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 +
+
+
+ +
+

+
+ +
+
+ +
+ +
+
+

Built with revenge-plugins · not affiliated with Discord or the Revenge project · install links point to this site

+
+
+ +
+ +
+
+ +
+
+
+ + + + diff --git a/rose-utils/install/11d89273b5bd6cc6.png b/rose-utils/install/11d89273b5bd6cc6.png new file mode 100644 index 0000000..323afc3 Binary files /dev/null and b/rose-utils/install/11d89273b5bd6cc6.png differ diff --git a/rose-utils/install/3a73d84a21043a5e.png b/rose-utils/install/3a73d84a21043a5e.png new file mode 100644 index 0000000..6beb211 Binary files /dev/null and b/rose-utils/install/3a73d84a21043a5e.png differ diff --git a/rose-utils/install/4d1aef97fe869aaf.png b/rose-utils/install/4d1aef97fe869aaf.png new file mode 100644 index 0000000..8a5e8af Binary files /dev/null and b/rose-utils/install/4d1aef97fe869aaf.png differ diff --git a/rose-utils/install/88eacd3588829ded.png b/rose-utils/install/88eacd3588829ded.png new file mode 100644 index 0000000..752ed54 Binary files /dev/null and b/rose-utils/install/88eacd3588829ded.png differ diff --git a/rose-utils/install/8b628d7e3fc05957.png b/rose-utils/install/8b628d7e3fc05957.png new file mode 100644 index 0000000..6441795 Binary files /dev/null and b/rose-utils/install/8b628d7e3fc05957.png differ diff --git a/rose-utils/install/9901722947705011.png b/rose-utils/install/9901722947705011.png new file mode 100644 index 0000000..e2485b5 Binary files /dev/null and b/rose-utils/install/9901722947705011.png differ diff --git a/rose-utils/install/a738efc867a225ee.png b/rose-utils/install/a738efc867a225ee.png new file mode 100644 index 0000000..10c32ee Binary files /dev/null and b/rose-utils/install/a738efc867a225ee.png differ diff --git a/rose-utils/install/b0d124bd12658047.png b/rose-utils/install/b0d124bd12658047.png new file mode 100644 index 0000000..f6346dc Binary files /dev/null and b/rose-utils/install/b0d124bd12658047.png differ diff --git a/rose-utils/install/cb7a2c9b3fb9561c.png b/rose-utils/install/cb7a2c9b3fb9561c.png new file mode 100644 index 0000000..e582452 Binary files /dev/null and b/rose-utils/install/cb7a2c9b3fb9561c.png differ diff --git a/rose-utils/install/cb8b45023e70bb61.png b/rose-utils/install/cb8b45023e70bb61.png new file mode 100644 index 0000000..48151f6 Binary files /dev/null and b/rose-utils/install/cb8b45023e70bb61.png differ diff --git a/rose-utils/install/cba17334eeaf3198.png b/rose-utils/install/cba17334eeaf3198.png new file mode 100644 index 0000000..1715494 Binary files /dev/null and b/rose-utils/install/cba17334eeaf3198.png differ diff --git a/rose-utils/install/d170a10bd3781e4a.png b/rose-utils/install/d170a10bd3781e4a.png new file mode 100644 index 0000000..5397356 Binary files /dev/null and b/rose-utils/install/d170a10bd3781e4a.png differ diff --git a/rose-utils/install/d6a4e512cdcf1078.png b/rose-utils/install/d6a4e512cdcf1078.png new file mode 100644 index 0000000..07b9916 Binary files /dev/null and b/rose-utils/install/d6a4e512cdcf1078.png differ diff --git a/rose-utils/install/ea31146eb15fdde7.png b/rose-utils/install/ea31146eb15fdde7.png new file mode 100644 index 0000000..5d31eab Binary files /dev/null and b/rose-utils/install/ea31146eb15fdde7.png differ diff --git a/rose-utils/install/f47fd463dcaac61e.png b/rose-utils/install/f47fd463dcaac61e.png new file mode 100644 index 0000000..21fd500 Binary files /dev/null and b/rose-utils/install/f47fd463dcaac61e.png differ diff --git a/rose-utils/install/f944dbd033a60207.png b/rose-utils/install/f944dbd033a60207.png new file mode 100644 index 0000000..c691abc Binary files /dev/null and b/rose-utils/install/f944dbd033a60207.png differ diff --git a/rose-utils/install/fead9e69933db668.png b/rose-utils/install/fead9e69933db668.png new file mode 100644 index 0000000..d9aa794 Binary files /dev/null and b/rose-utils/install/fead9e69933db668.png differ diff --git a/rose-utils/install/index.js b/rose-utils/install/index.js new file mode 100644 index 0000000..a38c4c0 --- /dev/null +++ b/rose-utils/install/index.js @@ -0,0 +1,4 @@ +(function(v,g,o,a,c,H,h,S,b,R){"use strict";function T(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function N(e,t){for(var n=0;nn&&(r.message.communicationDisabled=!0)}))},onStop(){}}});const ge=o.findByStoreName("ThemeStore"),he=o.find(function(e){return e?.default?.internal?.resolveSemanticColor})?.default?.internal?.resolveSemanticColor??o.find(function(e){return e?.meta?.resolveSemanticColor})?.meta?.resolveSemanticColor??function(){};function V(e,t=ge?.theme){if(e)try{return he(t,e)}catch{return}}const{View:be,Text:ye}=a.ReactNative,W={destructive:{bg:"#F23F42",fg:"#FFFFFF"},default:{bg:"#4E5058",fg:"#FFFFFF"}};function pe({variant:e="default",children:t}){const n=W[e]??W.default;return a.React.createElement(be,{style:{backgroundColor:n.bg,borderRadius:4,paddingHorizontal:4,paddingVertical:1,marginLeft:4,alignSelf:"center"}},a.React.createElement(ye,{style:{color:n.fg,fontSize:10,fontWeight:"700",textTransform:"uppercase"}},t))}var ve="f47fd463dcaac61e.png",Se="f944dbd033a60207.png",Re="88eacd3588829ded.png",we="4d1aef97fe869aaf.png",Ee="3a73d84a21043a5e.png",ke="8b628d7e3fc05957.png",me="cb7a2c9b3fb9561c.png",Fe="11d89273b5bd6cc6.png",$e="ea31146eb15fdde7.png",Ae="b0d124bd12658047.png",Ce="cb8b45023e70bb61.png",Te="a738efc867a225ee.png",Ne="cba17334eeaf3198.png",Ie="fead9e69933db668.png",Le="fead9e69933db668.png",Be="d6a4e512cdcf1078.png",xe="9901722947705011.png",Pe=function(e){return e.Lock="Lock",e.Warning="Warning",e.Controller="Controller",e}(Pe||{});function De(e,t){if(e==="Lock")return t?$e:Fe;if(e==="Warning")return t?xe:Be;if(e==="Controller")return Re}const Ue={Lock:["#f0b232","STATUS_WARNING"],Warning:["#f23f43","STATUS_DANGER"],Controller:["#23a55a","STATUS_POSITIVE"]},Me=[{name:"Announcements",kind:"Lock",base:ve},{name:"Announcements",kind:"Warning",base:Se},{name:"Text",kind:"Lock",base:Te},{name:"Text",kind:"Warning",base:Ne},{name:"Text",kind:"Controller",base:Ce},{name:"Voice",kind:"Lock",base:Ie},{name:"Voice",kind:"Warning",base:Le},{name:"Forum",kind:"Lock",base:we},{name:"Forum",kind:"Warning",base:Ee},{name:"Stage",kind:"Lock",bottom:!0,base:Ae},{name:"Stage",kind:"Warning",bottom:!0,base:0},{name:"Image",kind:"Lock",bottom:!0,base:ke},{name:"Image",kind:"Warning",bottom:!0,base:me}],O=o.findByName("ChannelInfo",!1),j=o.findByProps("BaseChannelIcon");var _e=new d({id:"colorful-channels",label:"Colorful Channels",meta:{sublabel:"Gives channel icons with symbols colors to make them more aesthetically pleasing",category:u.Useful},settings:{nsfwTag:{label:"NSFW tag",subLabel:"Adds a red NSFW tag next to channel names",type:"toggle",default:!0},colorIcons:{label:"Colored icon symbols",subLabel:"Turns locked channel symbols yellow, NSFW channel symbols red",type:"toggle",default:!0},colorIconsFallback:{label:"Fallback colors for colored icon symbols",subLabel:"Uses yellow, red and green colors regardless of theme",type:"toggle",default:!1}},handlers:{onStart(){var e=this;this.storage.options.nsfwTag&&O&&this.patches.add(c.after("default",O,function([{channel:t}],n){return a.React.createElement(a.React.Fragment,{},t?.nsfw_&&a.React.createElement(pe,{variant:"destructive"},"nsfw"),n)})),this.storage.options.colorIcons&&j?.BaseChannelIcon&&this.patches.add(c.after("BaseChannelIcon",j,function([{source:t,style:n}],r){try{const i=typeof t?.original=="number"?b.getAssetByID(t.original)?.name:typeof t=="number"?b.getAssetByID(t)?.name:null;if(!i)return;const s=Me.find(function(G){return i===`${G.name}${G.kind}Icon`});if(!s)return;const[l,A]=Ue[s.kind],C=De(s.kind,s.bottom),f=r?.props?.color?.replace(/-/g,"_")?.toUpperCase(),Ze=f&&R.semanticColors?.[f]?V(R.semanticColors[f]):void 0,z=a.ReactNative.StyleSheet.flatten([n,r?.props?.style,{width:18,height:18,tintColor:Ze}]),et=e.storage.options.colorIconsFallback?l:V(R.semanticColors?.[A])??l;return a.React.createElement(a.ReactNative.View,{},a.React.createElement(a.ReactNative.Image,{style:z,source:s.base}),a.React.createElement(a.ReactNative.View,{style:{position:"absolute",right:0,bottom:0}},a.React.createElement(a.ReactNative.Image,{style:{...z,tintColor:et},source:C})))}catch{return}}))},onStop(){}}}),F=[te,ne,ue,fe,_e];const{ScrollView:Ve,View:We}=a.ReactNative;function Oe({children:e}){return a.React.createElement(Ve,{style:{flex:1}},e,a.React.createElement(We,{style:{height:24}}))}const{View:je,Text:Ye}=a.ReactNative;function ze({children:e,style:t}){return a.React.createElement(je,{style:[{marginHorizontal:16,marginVertical:8,padding:10,borderRadius:8,borderWidth:1,borderColor:"rgba(128,128,128,0.25)"},t]},a.React.createElement(Ye,{style:{fontSize:12.5,lineHeight:18,opacity:.75}},e))}const{FormSection:Ge,FormSwitchRow:Y,FormRow:$}=S.Forms;function He(e,t){return typeof e.subLabel=="function"?e.subLabel(t):e.subLabel}function Ke({module:e,settingKey:t}){const n=e.settings[t];if(n.predicate&&!n.predicate.call(e))return null;const r=e.storage.options[t],i=He(n,r),s=!e.storage.enabled;return n.type==="toggle"?a.React.createElement(Y,{label:n.label,subLabel:i,value:!!r,disabled:s,onValueChange:function(l){e.storage.options[t]=l,e.restart()}}):n.type==="button"?a.React.createElement($,{label:n.label,subLabel:i,disabled:s,onPress:function(){return n.action.call(e)}}):a.React.createElement($,{label:n.label,subLabel:[i,r].filter(Boolean).join(" - "),disabled:s,onPress:function(){const l=n.choices.indexOf(r);e.storage.options[t]=n.choices[(l+1)%n.choices.length],e.restart()}})}function Je({module:e}){e.useRefresh();const t=Object.entries(e.errors);return a.React.createElement(Ge,{title:e.label},a.React.createElement(Y,{label:"Enabled",subLabel:e.meta.sublabel,value:!!e.storage.enabled,onValueChange:function(){return e.toggle()}}),e.storage.enabled&&Object.keys(e.settings).map(function(n){return a.React.createElement(Ke,{key:n,module:e,settingKey:n})}),t.length>0&&a.React.createElement($,{label:`${t.length} error${t.length===1?"":"s"} - tap to copy`,onPress:function(){const n=t.map(function([r,i]){return`[${e.label}] ${r} +${i}`}).join(` + +`);a.clipboard.setString(n),h.showToast("Copied - paste this when reporting the issue",void 0)}}))}const qe=[u.Useful,u.Fixes,u.Fun];function Qe(){return a.React.createElement(Oe,null,a.React.createElement(ze,null,"RoseUtils is a collection of small, independent utilities - toggle whichever ones you want. Fork of nexpid's NexxUtils, with fixes for lookups that broke on newer Discord versions. If a module shows an error below, tap it to copy the details for a bug report."),qe.flatMap(function(e){return F.filter(function(t){return t.meta.category===e}).map(function(t){return a.React.createElement(Je,{key:t.id,module:t})})}))}var Xe={onLoad(){y.modules??={};for(const e of F)try{e.storage.enabled&&e.start()}catch(t){g.logger.error(`[RoseUtils] Failed to start "${e.label}" on load: ${t}`)}},onUnload(){for(const e of F)try{e.stop()}catch(t){g.logger.error(`[RoseUtils] Failed to stop "${e.label}" cleanly: ${t}`)}},settings:Qe};return v.default=Xe,Object.defineProperty(v,"__esModule",{value:!0}),v})({},vendetta,vendetta.metro,vendetta.metro.common,vendetta.patcher,vendetta.plugin,vendetta.ui.toasts,vendetta.ui.components,vendetta.ui.assets,vendetta.ui); diff --git a/rose-utils/install/manifest.json b/rose-utils/install/manifest.json new file mode 100644 index 0000000..97b2cac --- /dev/null +++ b/rose-utils/install/manifest.json @@ -0,0 +1 @@ +{"name":"RoseUtils","description":"A small collection of independent utilities - Spotify listen-along, a Tenor download fix, colorful channel icons, and more. Fork of nexpid's NexxUtils.","authors":[{"name":"everestmcarthur"},{"name":"nexpid"}],"main":"index.js","hash":"f38420b78e1d622085a482a51db142f592c4e093a8c77c429734adfcddaa7ad6"} \ No newline at end of file diff --git a/staff-tags/install/11d89273b5bd6cc6.png b/staff-tags/install/11d89273b5bd6cc6.png new file mode 100644 index 0000000..323afc3 Binary files /dev/null and b/staff-tags/install/11d89273b5bd6cc6.png differ diff --git a/staff-tags/install/3a73d84a21043a5e.png b/staff-tags/install/3a73d84a21043a5e.png new file mode 100644 index 0000000..6beb211 Binary files /dev/null and b/staff-tags/install/3a73d84a21043a5e.png differ diff --git a/staff-tags/install/4d1aef97fe869aaf.png b/staff-tags/install/4d1aef97fe869aaf.png new file mode 100644 index 0000000..8a5e8af Binary files /dev/null and b/staff-tags/install/4d1aef97fe869aaf.png differ diff --git a/staff-tags/install/88eacd3588829ded.png b/staff-tags/install/88eacd3588829ded.png new file mode 100644 index 0000000..752ed54 Binary files /dev/null and b/staff-tags/install/88eacd3588829ded.png differ diff --git a/staff-tags/install/8b628d7e3fc05957.png b/staff-tags/install/8b628d7e3fc05957.png new file mode 100644 index 0000000..6441795 Binary files /dev/null and b/staff-tags/install/8b628d7e3fc05957.png differ diff --git a/staff-tags/install/9901722947705011.png b/staff-tags/install/9901722947705011.png new file mode 100644 index 0000000..e2485b5 Binary files /dev/null and b/staff-tags/install/9901722947705011.png differ diff --git a/staff-tags/install/a738efc867a225ee.png b/staff-tags/install/a738efc867a225ee.png new file mode 100644 index 0000000..10c32ee Binary files /dev/null and b/staff-tags/install/a738efc867a225ee.png differ diff --git a/staff-tags/install/b0d124bd12658047.png b/staff-tags/install/b0d124bd12658047.png new file mode 100644 index 0000000..f6346dc Binary files /dev/null and b/staff-tags/install/b0d124bd12658047.png differ diff --git a/staff-tags/install/cb7a2c9b3fb9561c.png b/staff-tags/install/cb7a2c9b3fb9561c.png new file mode 100644 index 0000000..e582452 Binary files /dev/null and b/staff-tags/install/cb7a2c9b3fb9561c.png differ diff --git a/staff-tags/install/cb8b45023e70bb61.png b/staff-tags/install/cb8b45023e70bb61.png new file mode 100644 index 0000000..48151f6 Binary files /dev/null and b/staff-tags/install/cb8b45023e70bb61.png differ diff --git a/staff-tags/install/cba17334eeaf3198.png b/staff-tags/install/cba17334eeaf3198.png new file mode 100644 index 0000000..1715494 Binary files /dev/null and b/staff-tags/install/cba17334eeaf3198.png differ diff --git a/staff-tags/install/d170a10bd3781e4a.png b/staff-tags/install/d170a10bd3781e4a.png new file mode 100644 index 0000000..5397356 Binary files /dev/null and b/staff-tags/install/d170a10bd3781e4a.png differ diff --git a/staff-tags/install/d6a4e512cdcf1078.png b/staff-tags/install/d6a4e512cdcf1078.png new file mode 100644 index 0000000..07b9916 Binary files /dev/null and b/staff-tags/install/d6a4e512cdcf1078.png differ diff --git a/staff-tags/install/ea31146eb15fdde7.png b/staff-tags/install/ea31146eb15fdde7.png new file mode 100644 index 0000000..5d31eab Binary files /dev/null and b/staff-tags/install/ea31146eb15fdde7.png differ diff --git a/staff-tags/install/f47fd463dcaac61e.png b/staff-tags/install/f47fd463dcaac61e.png new file mode 100644 index 0000000..21fd500 Binary files /dev/null and b/staff-tags/install/f47fd463dcaac61e.png differ diff --git a/staff-tags/install/f944dbd033a60207.png b/staff-tags/install/f944dbd033a60207.png new file mode 100644 index 0000000..c691abc Binary files /dev/null and b/staff-tags/install/f944dbd033a60207.png differ diff --git a/staff-tags/install/fead9e69933db668.png b/staff-tags/install/fead9e69933db668.png new file mode 100644 index 0000000..d9aa794 Binary files /dev/null and b/staff-tags/install/fead9e69933db668.png differ diff --git a/staff-tags/install/index.js b/staff-tags/install/index.js index 7497db7..bb7eca6 100644 --- a/staff-tags/install/index.js +++ b/staff-tags/install/index.js @@ -1 +1 @@ -(function(b,V,s,u,i,p,B,C,v,D){"use strict";function H(e,r,a,n){try{return a()}catch(t){return n.error(`[${e}] Failed to apply the "${r}" patch, that surface will be skipped: ${t}`),function(){}}}function W(e,r,a){const n=Object.entries(a).map(function([t,o]){return H(e,t,o,r)});return function(){return n.forEach(function(t){return t()})}}const z=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i;function h(e){return!!e&&z.test(e)}const{Permissions:U}=i.constants,K=u.findByProps("computePermissions","canEveryoneRole"),j=u.findByStoreName("GuildMemberStore"),T=[{id:"webhook",defaultText:"WEBHOOK",defaultColor:"#99AAB5",condition:function(e,r,a){return!!a?.isNonUserBot?.()}},{id:"owner",defaultText:"OWNER",defaultColor:"#F0B232",condition:function(e,r,a){return!!e&&e.ownerId===a?.id}},{id:"admin",defaultText:"ADMIN",defaultColor:"#F23F42",permissions:["ADMINISTRATOR"]},{id:"staff",defaultText:"STAFF",defaultColor:"#23A55A",permissions:["MANAGE_GUILD","MANAGE_CHANNELS","MANAGE_ROLES","MANAGE_WEBHOOKS"]},{id:"mod",defaultText:"MOD",defaultColor:"#5865F2",permissions:["MANAGE_MESSAGES","KICK_MEMBERS","BAN_MEMBERS"]},{id:"vc_mod",defaultText:"VC Mod",defaultColor:"#1ABC9C",permissions:["MOVE_MEMBERS","MUTE_MEMBERS","DEAFEN_MEMBERS"]},{id:"chat_mod",defaultText:"Chat Mod",defaultColor:"#9B59B6",permissions:["MODERATE_MEMBERS"]}];function S(e){return s.storage.tags??={},s.storage.tags[e]??={},s.storage.tags[e]}function X(e,r,a,n){if(r.useCustomColor&&h(r.color))return r.color;if(s.storage.useRoleColor)try{const t=j?.getMember?.(a?.id,n?.id)?.colorString;if(t)return t}catch{}return e.defaultColor}function R(e,r,a){if(!a)return;let n=[];if(e)try{const t=K?.computePermissions?.({user:a,context:e,overwrites:r?.permissionOverwrites});t!=null&&(n=Object.entries(U).filter(function([,o]){return t&o}).map(function([o]){return o}))}catch{}for(const t of T){const o=S(t.id);if(o.enabled===!1)continue;const d=!!t.condition?.(e,r,a),c=!a.bot&&!!t.permissions?.some(function(ye){return n.includes(ye)});if(!d&&!c)continue;const l=X(t,o,e,a),f=i.chroma(l).get("lab.l")<70?B.rawColors.WHITE_500:B.rawColors.BLACK_500;let g;return o.useGradient&&(g=h(o.gradientColor)?o.gradientColor:i.chroma(l).brighten(1.4).hex()),{id:t.id,text:o.text?.trim()||t.defaultText,textColor:f,backgroundColor:l,gradientColor:g,verified:!1}}}const A=u.findByName("getTagProperties",!1),q=u.findByStoreName("GuildStore"),J=u.findByStoreName("ChannelStore");function Q(){return A?p.after("default",A,function([{message:e}],r){if(r?.tagType)return;const a=J?.getChannel(e?.channel_id),n=q?.getGuild(a?.guild_id),t=R(n,a,e?.author);if(t)return{...r,tagText:t.text,tagTextColor:t.textColor?i.ReactNative.processColor(i.chroma(t.textColor).hex()):void 0,tagBackgroundColor:i.ReactNative.processColor(i.chroma(t.backgroundColor).hex()),tagVerified:t.verified,tagType:void 0}}):function(){}}let y,N=!1;function Y(){if(N)return y;N=!0;try{y=u.findByProps("colors","start","end")?.default??u.findByProps("colors","locations")?.default??null}catch{y=null}return y}const{View:Z,Text:F}=i.ReactNative,M={flexDirection:"row",alignItems:"center",borderRadius:4,paddingHorizontal:4,marginLeft:4,overflow:"hidden"};function w({text:e,textColor:r,backgroundColor:a,gradientColor:n,style:t}){const o={color:r,fontSize:11,fontWeight:"700"},d=n?Y():null;return d?i.React.createElement(d,{colors:[a,n],start:{x:0,y:0},end:{x:1,y:0},style:[M,t]},i.React.createElement(F,{style:o},e)):i.React.createElement(Z,{style:[M,{backgroundColor:a},t]},i.React.createElement(F,{style:o},e))}const k=u.findByProps("getBotLabel"),ee=u.findByStoreName("GuildStore"),te=function([{guildId:e,user:r}],a){try{const n=a?.props?.label,t=C.findInReactTree(n,function(l){return Array.isArray(l?.props?.children)&&l.props.children.some(function(f){return typeof f=="string"||typeof f?.props?.children=="string"})});if(!t)return;const o=C.findInReactTree(t,function(l){return l?.type?.Types});if(o&&o.props?.type!==0)return;const d=ee?.getGuild(e),c=R(d,void 0,r);if(!c)return;if(o){Object.assign(o.props,{type:0,text:c.text,textColor:c.textColor,backgroundColor:c.backgroundColor,verified:c.verified});return}Array.isArray(t.props.children)||(t.props.children=[t.props.children]),c.gradientColor?t.props.children.push(React.createElement(w,{text:c.text,textColor:c.textColor,backgroundColor:c.backgroundColor,gradientColor:c.gradientColor})):k&&t.props.children.push(React.createElement(k.default,{type:0,text:c.text,textColor:c.textColor,backgroundColor:c.backgroundColor,verified:c.verified}))}catch{}};function re(){const e=[];return(u.findByTypeNameAll("UserRow")??[]).forEach(function(r){return e.push(p.after("type",r,te))}),function(){return e.forEach(function(r){return r()})}}const I=u.findByName("DisplayName",!1),G=u.findByName("HeaderName",!1),$=u.findByProps("getBotLabel"),oe=u.findByStoreName("GuildStore"),ne=u.findByStoreName("ChannelStore");function ae(){const e=[];return G&&e.push(p.after("default",G,function([{channelId:r}],a){a?.props&&(a.props.channelId=r)})),I&&e.push(p.after("default",I,function([{guildId:r,channelId:a,user:n}],t){try{const o=C.findInReactTree(t,function(g){return g?.type?.Types});if(o&&o.props?.type!==0)return;const d=oe?.getGuild(r),c=ne?.getChannel(a),l=R(d,c,n);if(!l)return;if(o){o.props={type:0,text:l.text,textColor:l.textColor,backgroundColor:l.backgroundColor,verified:l.verified};return}const f=C.findInReactTree(t,function(g){return g?.props?.style?.flexDirection==="row"});if(!Array.isArray(f?.props?.children))return;l.gradientColor?f.props.children.push(React.createElement(w,{style:{marginLeft:0},text:l.text,textColor:l.textColor,backgroundColor:l.backgroundColor,gradientColor:l.gradientColor})):$&&f.props.children.push(React.createElement($.default,{style:{marginLeft:0},type:0,text:l.text,textColor:l.textColor,backgroundColor:l.backgroundColor,verified:l.verified}))}catch{}})),function(){return e.forEach(function(r){return r()})}}const m=u.findByProps("getBotLabel");function ie(){return m?p.after("default",m,function([{text:e,textColor:r,backgroundColor:a}],n){const t=C.findInReactTree(n,function(o){return typeof o?.props?.children=="string"});t&&(e&&(t.props.children=e),r&&t.props.style?.push?.({color:r}),a&&n?.props?.style?.push?.({backgroundColor:a}))}):function(){}}const{ScrollView:le,View:ce}=i.ReactNative;function ue({children:e}){return i.React.createElement(le,{style:{flex:1}},e,i.React.createElement(ce,{style:{height:24}}))}const{View:E,Text:_,TextInput:de,TouchableOpacity:se}=i.ReactNative,fe=["#F23F42","#F0B232","#FEE75C","#23A55A","#1ABC9C","#5865F2","#9B59B6","#EB459E","#99AAB5","#FFFFFF"];function O({title:e,value:r,placeholder:a,onChange:n}){const t=!r||h(r),o=h(r)?r:h(a)?a:"#5865F2";return i.React.createElement(E,{style:{paddingHorizontal:16,paddingVertical:8}},i.React.createElement(E,{style:{flexDirection:"row",alignItems:"center",marginBottom:8}},i.React.createElement(E,{style:{width:20,height:20,borderRadius:6,backgroundColor:o,marginRight:10,borderWidth:1,borderColor:"rgba(128,128,128,0.35)"}}),i.React.createElement(_,{style:{fontSize:15,fontWeight:"600"}},e)),i.React.createElement(de,{value:r??"",placeholder:a??"#5865F2",onChangeText:n,autoCapitalize:"none",autoCorrect:!1,style:{borderWidth:1,borderColor:t?"rgba(128,128,128,0.35)":"#F23F42",borderRadius:8,paddingHorizontal:10,paddingVertical:8,fontSize:14,marginBottom:8}}),i.React.createElement(E,{style:{flexDirection:"row",flexWrap:"wrap"}},fe.map(function(d){const c=r?.toLowerCase()===d.toLowerCase();return i.React.createElement(se,{key:d,onPress:function(){return n(d)},style:{width:24,height:24,borderRadius:6,backgroundColor:d,marginRight:8,marginBottom:8,borderWidth:c?2:1,borderColor:c?"#ffffff":"rgba(128,128,128,0.35)"}})})),!t&&i.React.createElement(_,{style:{color:"#F23F42",marginTop:2,fontSize:12}},"Invalid hex color, e.g. #5865F2"))}const{FormSection:L,FormSwitchRow:x,FormInput:ge}=D.Forms;function pe({id:e,defaultText:r,defaultColor:a}){const n=S(e);v.useProxy(n);const t=n.enabled!==!1;return i.React.createElement(L,{title:r},i.React.createElement(x,{label:"Show this tag",value:t,onValueChange:function(o){n.enabled=o}}),i.React.createElement(ge,{title:"Tag text",placeholder:r,value:n.text??"",editable:t,onChange:function(o){n.text=o}}),i.React.createElement(x,{label:"Custom color",subLabel:`Default: ${a}`,value:!!n.useCustomColor,disabled:!t,onValueChange:function(o){n.useCustomColor=o}}),n.useCustomColor&&i.React.createElement(O,{title:"Color",value:n.color,placeholder:a,onChange:function(o){n.color=o}}),i.React.createElement(x,{label:"Gradient",subLabel:"Member list & profile only, chat tags stay solid",value:!!n.useGradient,disabled:!t,onValueChange:function(o){n.useGradient=o}}),n.useGradient&&i.React.createElement(O,{title:"Gradient color",value:n.gradientColor,onChange:function(o){n.gradientColor=o}}))}function Ce(){return v.useProxy(s.storage),i.React.createElement(ue,null,i.React.createElement(L,{title:"General"},i.React.createElement(x,{label:"Use top role color",subLabel:"Used when a tag has no custom color set",value:!!s.storage.useRoleColor,onValueChange:function(e){s.storage.useRoleColor=e}})),T.map(function(e){return i.React.createElement(pe,{key:e.id,id:e.id,defaultText:e.defaultText,defaultColor:e.defaultColor})}))}let P=function(){};var he={onLoad:function(){s.storage.useRoleColor??=!1,s.storage.tags??={},P=W("Staff Tags",V.logger,{tag:ie,chat:Q,name:ae,details:re})},onUnload:function(){return P()},settings:Ce};return b.default=he,Object.defineProperty(b,"__esModule",{value:!0}),b})({},vendetta,vendetta.plugin,vendetta.metro,vendetta.metro.common,vendetta.patcher,vendetta.ui,vendetta.utils,vendetta.storage,vendetta.ui.components); +(function(b,V,s,u,i,C,v,p,B,D){"use strict";function H(e,r,a,n){try{return a()}catch(t){return n.error(`[${e}] Failed to apply the "${r}" patch, that surface will be skipped: ${t}`),function(){}}}function W(e,r,a){const n=Object.entries(a).map(function([t,o]){return H(e,t,o,r)});return function(){return n.forEach(function(t){return t()})}}const z=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i;u.findByStoreName("ThemeStore"),u.find(function(e){return e?.default?.internal?.resolveSemanticColor})?.default?.internal?.resolveSemanticColor??u.find(function(e){return e?.meta?.resolveSemanticColor})?.meta?.resolveSemanticColor;function h(e){return!!e&&z.test(e)}const{Permissions:U}=i.constants,K=u.findByProps("computePermissions","canEveryoneRole"),j=u.findByStoreName("GuildMemberStore"),S=[{id:"webhook",defaultText:"WEBHOOK",defaultColor:"#99AAB5",condition:function(e,r,a){return!!a?.isNonUserBot?.()}},{id:"owner",defaultText:"OWNER",defaultColor:"#F0B232",condition:function(e,r,a){return!!e&&e.ownerId===a?.id}},{id:"admin",defaultText:"ADMIN",defaultColor:"#F23F42",permissions:["ADMINISTRATOR"]},{id:"staff",defaultText:"STAFF",defaultColor:"#23A55A",permissions:["MANAGE_GUILD","MANAGE_CHANNELS","MANAGE_ROLES","MANAGE_WEBHOOKS"]},{id:"mod",defaultText:"MOD",defaultColor:"#5865F2",permissions:["MANAGE_MESSAGES","KICK_MEMBERS","BAN_MEMBERS"]},{id:"vc_mod",defaultText:"VC Mod",defaultColor:"#1ABC9C",permissions:["MOVE_MEMBERS","MUTE_MEMBERS","DEAFEN_MEMBERS"]},{id:"chat_mod",defaultText:"Chat Mod",defaultColor:"#9B59B6",permissions:["MODERATE_MEMBERS"]}];function T(e){return s.storage.tags??={},s.storage.tags[e]??={},s.storage.tags[e]}function X(e,r,a,n){if(r.useCustomColor&&h(r.color))return r.color;if(s.storage.useRoleColor)try{const t=j?.getMember?.(a?.id,n?.id)?.colorString;if(t)return t}catch{}return e.defaultColor}function R(e,r,a){if(!a)return;let n=[];if(e)try{const t=K?.computePermissions?.({user:a,context:e,overwrites:r?.permissionOverwrites});t!=null&&(n=Object.entries(U).filter(function([,o]){return t&o}).map(function([o]){return o}))}catch{}for(const t of S){const o=T(t.id);if(o.enabled===!1)continue;const d=!!t.condition?.(e,r,a),c=!a.bot&&!!t.permissions?.some(function(ye){return n.includes(ye)});if(!d&&!c)continue;const l=X(t,o,e,a),f=i.chroma(l).get("lab.l")<70?v.rawColors.WHITE_500:v.rawColors.BLACK_500;let g;return o.useGradient&&(g=h(o.gradientColor)?o.gradientColor:i.chroma(l).brighten(1.4).hex()),{id:t.id,text:o.text?.trim()||t.defaultText,textColor:f,backgroundColor:l,gradientColor:g,verified:!1}}}const A=u.findByName("getTagProperties",!1),q=u.findByStoreName("GuildStore"),J=u.findByStoreName("ChannelStore");function Q(){return A?C.after("default",A,function([{message:e}],r){if(r?.tagType)return;const a=J?.getChannel(e?.channel_id),n=q?.getGuild(a?.guild_id),t=R(n,a,e?.author);if(t)return{...r,tagText:t.text,tagTextColor:t.textColor?i.ReactNative.processColor(i.chroma(t.textColor).hex()):void 0,tagBackgroundColor:i.ReactNative.processColor(i.chroma(t.backgroundColor).hex()),tagVerified:t.verified,tagType:void 0}}):function(){}}let y,N=!1;function Y(){if(N)return y;N=!0;try{y=u.findByProps("colors","start","end")?.default??u.findByProps("colors","locations")?.default??null}catch{y=null}return y}const{View:Z,Text:F}=i.ReactNative,M={flexDirection:"row",alignItems:"center",borderRadius:4,paddingHorizontal:4,marginLeft:4,overflow:"hidden"};function m({text:e,textColor:r,backgroundColor:a,gradientColor:n,style:t}){const o={color:r,fontSize:11,fontWeight:"700"},d=n?Y():null;return d?i.React.createElement(d,{colors:[a,n],start:{x:0,y:0},end:{x:1,y:0},style:[M,t]},i.React.createElement(F,{style:o},e)):i.React.createElement(Z,{style:[M,{backgroundColor:a},t]},i.React.createElement(F,{style:o},e))}const w=u.findByProps("getBotLabel"),ee=u.findByStoreName("GuildStore"),te=function([{guildId:e,user:r}],a){try{const n=a?.props?.label,t=p.findInReactTree(n,function(l){return Array.isArray(l?.props?.children)&&l.props.children.some(function(f){return typeof f=="string"||typeof f?.props?.children=="string"})});if(!t)return;const o=p.findInReactTree(t,function(l){return l?.type?.Types});if(o&&o.props?.type!==0)return;const d=ee?.getGuild(e),c=R(d,void 0,r);if(!c)return;if(o){Object.assign(o.props,{type:0,text:c.text,textColor:c.textColor,backgroundColor:c.backgroundColor,verified:c.verified});return}Array.isArray(t.props.children)||(t.props.children=[t.props.children]),c.gradientColor?t.props.children.push(React.createElement(m,{text:c.text,textColor:c.textColor,backgroundColor:c.backgroundColor,gradientColor:c.gradientColor})):w&&t.props.children.push(React.createElement(w.default,{type:0,text:c.text,textColor:c.textColor,backgroundColor:c.backgroundColor,verified:c.verified}))}catch{}};function re(){const e=[];return(u.findByTypeNameAll("UserRow")??[]).forEach(function(r){return e.push(C.after("type",r,te))}),function(){return e.forEach(function(r){return r()})}}const k=u.findByName("DisplayName",!1),I=u.findByName("HeaderName",!1),G=u.findByProps("getBotLabel"),oe=u.findByStoreName("GuildStore"),ne=u.findByStoreName("ChannelStore");function ae(){const e=[];return I&&e.push(C.after("default",I,function([{channelId:r}],a){a?.props&&(a.props.channelId=r)})),k&&e.push(C.after("default",k,function([{guildId:r,channelId:a,user:n}],t){try{const o=p.findInReactTree(t,function(g){return g?.type?.Types});if(o&&o.props?.type!==0)return;const d=oe?.getGuild(r),c=ne?.getChannel(a),l=R(d,c,n);if(!l)return;if(o){o.props={type:0,text:l.text,textColor:l.textColor,backgroundColor:l.backgroundColor,verified:l.verified};return}const f=p.findInReactTree(t,function(g){return g?.props?.style?.flexDirection==="row"});if(!Array.isArray(f?.props?.children))return;l.gradientColor?f.props.children.push(React.createElement(m,{style:{marginLeft:0},text:l.text,textColor:l.textColor,backgroundColor:l.backgroundColor,gradientColor:l.gradientColor})):G&&f.props.children.push(React.createElement(G.default,{style:{marginLeft:0},type:0,text:l.text,textColor:l.textColor,backgroundColor:l.backgroundColor,verified:l.verified}))}catch{}})),function(){return e.forEach(function(r){return r()})}}const $=u.findByProps("getBotLabel");function ie(){return $?C.after("default",$,function([{text:e,textColor:r,backgroundColor:a}],n){const t=p.findInReactTree(n,function(o){return typeof o?.props?.children=="string"});t&&(e&&(t.props.children=e),r&&t.props.style?.push?.({color:r}),a&&n?.props?.style?.push?.({backgroundColor:a}))}):function(){}}const{ScrollView:le,View:ce}=i.ReactNative;function ue({children:e}){return i.React.createElement(le,{style:{flex:1}},e,i.React.createElement(ce,{style:{height:24}}))}const{View:E,Text:_,TextInput:de,TouchableOpacity:se}=i.ReactNative,fe=["#F23F42","#F0B232","#FEE75C","#23A55A","#1ABC9C","#5865F2","#9B59B6","#EB459E","#99AAB5","#FFFFFF"];function O({title:e,value:r,placeholder:a,onChange:n}){const t=!r||h(r),o=h(r)?r:h(a)?a:"#5865F2";return i.React.createElement(E,{style:{paddingHorizontal:16,paddingVertical:8}},i.React.createElement(E,{style:{flexDirection:"row",alignItems:"center",marginBottom:8}},i.React.createElement(E,{style:{width:20,height:20,borderRadius:6,backgroundColor:o,marginRight:10,borderWidth:1,borderColor:"rgba(128,128,128,0.35)"}}),i.React.createElement(_,{style:{fontSize:15,fontWeight:"600"}},e)),i.React.createElement(de,{value:r??"",placeholder:a??"#5865F2",onChangeText:n,autoCapitalize:"none",autoCorrect:!1,style:{borderWidth:1,borderColor:t?"rgba(128,128,128,0.35)":"#F23F42",borderRadius:8,paddingHorizontal:10,paddingVertical:8,fontSize:14,marginBottom:8}}),i.React.createElement(E,{style:{flexDirection:"row",flexWrap:"wrap"}},fe.map(function(d){const c=r?.toLowerCase()===d.toLowerCase();return i.React.createElement(se,{key:d,onPress:function(){return n(d)},style:{width:24,height:24,borderRadius:6,backgroundColor:d,marginRight:8,marginBottom:8,borderWidth:c?2:1,borderColor:c?"#ffffff":"rgba(128,128,128,0.35)"}})})),!t&&i.React.createElement(_,{style:{color:"#F23F42",marginTop:2,fontSize:12}},"Invalid hex color, e.g. #5865F2"))}const{FormSection:L,FormSwitchRow:x,FormInput:ge}=D.Forms;function Ce({id:e,defaultText:r,defaultColor:a}){const n=T(e);B.useProxy(n);const t=n.enabled!==!1;return i.React.createElement(L,{title:r},i.React.createElement(x,{label:"Show this tag",value:t,onValueChange:function(o){n.enabled=o}}),i.React.createElement(ge,{title:"Tag text",placeholder:r,value:n.text??"",editable:t,onChange:function(o){n.text=o}}),i.React.createElement(x,{label:"Custom color",subLabel:`Default: ${a}`,value:!!n.useCustomColor,disabled:!t,onValueChange:function(o){n.useCustomColor=o}}),n.useCustomColor&&i.React.createElement(O,{title:"Color",value:n.color,placeholder:a,onChange:function(o){n.color=o}}),i.React.createElement(x,{label:"Gradient",subLabel:"Member list & profile only, chat tags stay solid",value:!!n.useGradient,disabled:!t,onValueChange:function(o){n.useGradient=o}}),n.useGradient&&i.React.createElement(O,{title:"Gradient color",value:n.gradientColor,onChange:function(o){n.gradientColor=o}}))}function pe(){return B.useProxy(s.storage),i.React.createElement(ue,null,i.React.createElement(L,{title:"General"},i.React.createElement(x,{label:"Use top role color",subLabel:"Used when a tag has no custom color set",value:!!s.storage.useRoleColor,onValueChange:function(e){s.storage.useRoleColor=e}})),S.map(function(e){return i.React.createElement(Ce,{key:e.id,id:e.id,defaultText:e.defaultText,defaultColor:e.defaultColor})}))}let P=function(){};var he={onLoad:function(){s.storage.useRoleColor??=!1,s.storage.tags??={},P=W("Staff Tags",V.logger,{tag:ie,chat:Q,name:ae,details:re})},onUnload:function(){return P()},settings:pe};return b.default=he,Object.defineProperty(b,"__esModule",{value:!0}),b})({},vendetta,vendetta.plugin,vendetta.metro,vendetta.metro.common,vendetta.patcher,vendetta.ui,vendetta.utils,vendetta.storage,vendetta.ui.components); diff --git a/staff-tags/install/manifest.json b/staff-tags/install/manifest.json index e8ef8a4..14c07be 100644 --- a/staff-tags/install/manifest.json +++ b/staff-tags/install/manifest.json @@ -1 +1 @@ -{"name":"Staff Tags","description":"Adds customizable tags (OWNER, ADMIN, STAFF, MOD, and more) next to members based on their server permissions. Supports per-tag colors, gradients, custom text, and visibility toggles.","authors":[{"name":"everestmcarthur"}],"main":"index.js","vendetta":{"icon":"ic_badge_staff"},"hash":"80fb55df1ea826c24324a4b3aed5f1f2db0c0c0d94b0ae28cfbb80f9238c1a1d"} \ No newline at end of file +{"name":"Staff Tags","description":"Adds customizable tags (OWNER, ADMIN, STAFF, MOD, and more) next to members based on their server permissions. Supports per-tag colors, gradients, custom text, and visibility toggles.","authors":[{"name":"everestmcarthur"}],"main":"index.js","vendetta":{"icon":"ic_badge_staff"},"hash":"39911b3c94d6ca4ed6cf98825425d7c7ac7cdd7e45ef3bf264dd82724d0d7520"} \ No newline at end of file diff --git a/urban-dictionary/install/11d89273b5bd6cc6.png b/urban-dictionary/install/11d89273b5bd6cc6.png new file mode 100644 index 0000000..323afc3 Binary files /dev/null and b/urban-dictionary/install/11d89273b5bd6cc6.png differ diff --git a/urban-dictionary/install/3a73d84a21043a5e.png b/urban-dictionary/install/3a73d84a21043a5e.png new file mode 100644 index 0000000..6beb211 Binary files /dev/null and b/urban-dictionary/install/3a73d84a21043a5e.png differ diff --git a/urban-dictionary/install/4d1aef97fe869aaf.png b/urban-dictionary/install/4d1aef97fe869aaf.png new file mode 100644 index 0000000..8a5e8af Binary files /dev/null and b/urban-dictionary/install/4d1aef97fe869aaf.png differ diff --git a/urban-dictionary/install/88eacd3588829ded.png b/urban-dictionary/install/88eacd3588829ded.png new file mode 100644 index 0000000..752ed54 Binary files /dev/null and b/urban-dictionary/install/88eacd3588829ded.png differ diff --git a/urban-dictionary/install/8b628d7e3fc05957.png b/urban-dictionary/install/8b628d7e3fc05957.png new file mode 100644 index 0000000..6441795 Binary files /dev/null and b/urban-dictionary/install/8b628d7e3fc05957.png differ diff --git a/urban-dictionary/install/9901722947705011.png b/urban-dictionary/install/9901722947705011.png new file mode 100644 index 0000000..e2485b5 Binary files /dev/null and b/urban-dictionary/install/9901722947705011.png differ diff --git a/urban-dictionary/install/a738efc867a225ee.png b/urban-dictionary/install/a738efc867a225ee.png new file mode 100644 index 0000000..10c32ee Binary files /dev/null and b/urban-dictionary/install/a738efc867a225ee.png differ diff --git a/urban-dictionary/install/b0d124bd12658047.png b/urban-dictionary/install/b0d124bd12658047.png new file mode 100644 index 0000000..f6346dc Binary files /dev/null and b/urban-dictionary/install/b0d124bd12658047.png differ diff --git a/urban-dictionary/install/cb7a2c9b3fb9561c.png b/urban-dictionary/install/cb7a2c9b3fb9561c.png new file mode 100644 index 0000000..e582452 Binary files /dev/null and b/urban-dictionary/install/cb7a2c9b3fb9561c.png differ diff --git a/urban-dictionary/install/cb8b45023e70bb61.png b/urban-dictionary/install/cb8b45023e70bb61.png new file mode 100644 index 0000000..48151f6 Binary files /dev/null and b/urban-dictionary/install/cb8b45023e70bb61.png differ diff --git a/urban-dictionary/install/cba17334eeaf3198.png b/urban-dictionary/install/cba17334eeaf3198.png new file mode 100644 index 0000000..1715494 Binary files /dev/null and b/urban-dictionary/install/cba17334eeaf3198.png differ diff --git a/urban-dictionary/install/d170a10bd3781e4a.png b/urban-dictionary/install/d170a10bd3781e4a.png new file mode 100644 index 0000000..5397356 Binary files /dev/null and b/urban-dictionary/install/d170a10bd3781e4a.png differ diff --git a/urban-dictionary/install/d6a4e512cdcf1078.png b/urban-dictionary/install/d6a4e512cdcf1078.png new file mode 100644 index 0000000..07b9916 Binary files /dev/null and b/urban-dictionary/install/d6a4e512cdcf1078.png differ diff --git a/urban-dictionary/install/ea31146eb15fdde7.png b/urban-dictionary/install/ea31146eb15fdde7.png new file mode 100644 index 0000000..5d31eab Binary files /dev/null and b/urban-dictionary/install/ea31146eb15fdde7.png differ diff --git a/urban-dictionary/install/f47fd463dcaac61e.png b/urban-dictionary/install/f47fd463dcaac61e.png new file mode 100644 index 0000000..21fd500 Binary files /dev/null and b/urban-dictionary/install/f47fd463dcaac61e.png differ diff --git a/urban-dictionary/install/f944dbd033a60207.png b/urban-dictionary/install/f944dbd033a60207.png new file mode 100644 index 0000000..c691abc Binary files /dev/null and b/urban-dictionary/install/f944dbd033a60207.png differ diff --git a/urban-dictionary/install/fead9e69933db668.png b/urban-dictionary/install/fead9e69933db668.png new file mode 100644 index 0000000..d9aa794 Binary files /dev/null and b/urban-dictionary/install/fead9e69933db668.png differ diff --git a/view-raw/install/11d89273b5bd6cc6.png b/view-raw/install/11d89273b5bd6cc6.png new file mode 100644 index 0000000..323afc3 Binary files /dev/null and b/view-raw/install/11d89273b5bd6cc6.png differ diff --git a/view-raw/install/3a73d84a21043a5e.png b/view-raw/install/3a73d84a21043a5e.png new file mode 100644 index 0000000..6beb211 Binary files /dev/null and b/view-raw/install/3a73d84a21043a5e.png differ diff --git a/view-raw/install/4d1aef97fe869aaf.png b/view-raw/install/4d1aef97fe869aaf.png new file mode 100644 index 0000000..8a5e8af Binary files /dev/null and b/view-raw/install/4d1aef97fe869aaf.png differ diff --git a/view-raw/install/88eacd3588829ded.png b/view-raw/install/88eacd3588829ded.png new file mode 100644 index 0000000..752ed54 Binary files /dev/null and b/view-raw/install/88eacd3588829ded.png differ diff --git a/view-raw/install/8b628d7e3fc05957.png b/view-raw/install/8b628d7e3fc05957.png new file mode 100644 index 0000000..6441795 Binary files /dev/null and b/view-raw/install/8b628d7e3fc05957.png differ diff --git a/view-raw/install/9901722947705011.png b/view-raw/install/9901722947705011.png new file mode 100644 index 0000000..e2485b5 Binary files /dev/null and b/view-raw/install/9901722947705011.png differ diff --git a/view-raw/install/a738efc867a225ee.png b/view-raw/install/a738efc867a225ee.png new file mode 100644 index 0000000..10c32ee Binary files /dev/null and b/view-raw/install/a738efc867a225ee.png differ diff --git a/view-raw/install/b0d124bd12658047.png b/view-raw/install/b0d124bd12658047.png new file mode 100644 index 0000000..f6346dc Binary files /dev/null and b/view-raw/install/b0d124bd12658047.png differ diff --git a/view-raw/install/cb7a2c9b3fb9561c.png b/view-raw/install/cb7a2c9b3fb9561c.png new file mode 100644 index 0000000..e582452 Binary files /dev/null and b/view-raw/install/cb7a2c9b3fb9561c.png differ diff --git a/view-raw/install/cb8b45023e70bb61.png b/view-raw/install/cb8b45023e70bb61.png new file mode 100644 index 0000000..48151f6 Binary files /dev/null and b/view-raw/install/cb8b45023e70bb61.png differ diff --git a/view-raw/install/cba17334eeaf3198.png b/view-raw/install/cba17334eeaf3198.png new file mode 100644 index 0000000..1715494 Binary files /dev/null and b/view-raw/install/cba17334eeaf3198.png differ diff --git a/view-raw/install/d170a10bd3781e4a.png b/view-raw/install/d170a10bd3781e4a.png new file mode 100644 index 0000000..5397356 Binary files /dev/null and b/view-raw/install/d170a10bd3781e4a.png differ diff --git a/view-raw/install/d6a4e512cdcf1078.png b/view-raw/install/d6a4e512cdcf1078.png new file mode 100644 index 0000000..07b9916 Binary files /dev/null and b/view-raw/install/d6a4e512cdcf1078.png differ diff --git a/view-raw/install/ea31146eb15fdde7.png b/view-raw/install/ea31146eb15fdde7.png new file mode 100644 index 0000000..5d31eab Binary files /dev/null and b/view-raw/install/ea31146eb15fdde7.png differ diff --git a/view-raw/install/f47fd463dcaac61e.png b/view-raw/install/f47fd463dcaac61e.png new file mode 100644 index 0000000..21fd500 Binary files /dev/null and b/view-raw/install/f47fd463dcaac61e.png differ diff --git a/view-raw/install/f944dbd033a60207.png b/view-raw/install/f944dbd033a60207.png new file mode 100644 index 0000000..c691abc Binary files /dev/null and b/view-raw/install/f944dbd033a60207.png differ diff --git a/view-raw/install/fead9e69933db668.png b/view-raw/install/fead9e69933db668.png new file mode 100644 index 0000000..d9aa794 Binary files /dev/null and b/view-raw/install/fead9e69933db668.png differ