diff --git a/README.md b/README.md index 67f34d11..ee7fadfb 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,14 @@ -# Equicord +# Equicord [Equicord](https://github.com/Equicord/Equicord) -An enhanced version of [Vencord](https://github.com/Vendicated/Vencord) by [Vendicated](https://github.com/Vendicated) called Equicord. +[![Equibop](https://img.shields.io/badge/Equibop-grey?style=flat)](https://github.com/Equicord/Equibop) +[![Tests](https://github.com/Equicord/Equicord/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/Equicord/Equicord/actions/workflows/test.yml) +[![Discord](https://img.shields.io/discord/1207691698386501634.svg?color=768AD4&label=Discord&logo=discord&logoColor=white)](https://discord.gg/VasF3Ma4Ab) -![image](https://github.com/Equicord/Equicord/assets/78185467/81707ad9-3a04-4f76-88a0-60ee70684f81) +Equicord is a fork of [Vencord](https://github.com/Vendicated/Vencord), with over 300+ plugins. -## Features - -- Third-party plugins implemented into the main build. -- 100+ plugins built-in. - - Some highlights: SpotifyControls, MessageLogger, Experiments, GameActivityToggle, Translate, NoTrack, QuickReply, Free Emotes/Stickers, PermissionsViewer, - CustomCommands, ShowHiddenChannels, PronounDB -- Fairly lightweight despite the many inbuilt plugins -- Works on any Discord branch: Stable, Canary or PTB all work (though for the best experience, I recommend stable!) -- Custom CSS and Themes: Inbuilt CSS editor with support to import any CSS files (including BetterDiscord themes) -- Privacy friendly, blocks Discord analytics & crash reporting out of the box and has no telemetry -- Maintained very actively, broken plugins are usually fixed within 12 hours -- Able to update inside of Equicord through the update tab. -- Same supporter badges as on Vencord (Don't lose your benefits) -- Easy to install third-party plugins through the plugin page in Discord. -- Request for plugins from Discord. +You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, changes, chat or even support.


+### Extra included plugins
Extra included plugins (123 additional plugins) @@ -200,17 +189,10 @@ Inject Equicord into your client: ```shell pnpm inject ``` -After you have done this command, it will look like you are just installing Equicord but it will say it is a development build. If it doesn't say it is a development build, please reach out for support in the [Discord Server](https://discord.gg/5Xh2W87egW) - -## Join our Support/Community Server - -https://discord.gg/5Xh2W87egW ## Credits -Thank you to [Vendicated](https://github.com/Vendicated) for creating [Vencord](https://github.com/Vendicated/Vencord). - -Thank you to [Suncord [EOL]](https://github.com/verticalsync/Suncord) by [VerticalSync](https://github.com/verticalsync) for helping me when needed. +Thank you to [Vendicated](https://github.com/Vendicated) for creating [Vencord](https://github.com/Vendicated/Vencord) & [Suncord](https://github.com/verticalsync/Suncord) by [verticalsync](https://github.com/verticalsync) for helping when needed. ## Star History diff --git a/src/equicordplugins/questCompleter/index.tsx b/src/equicordplugins/questCompleter/index.tsx index bd4b7cd6..d474646b 100644 --- a/src/equicordplugins/questCompleter/index.tsx +++ b/src/equicordplugins/questCompleter/index.tsx @@ -158,7 +158,7 @@ export default definePlugin({ const progress = quest.config.configVersion === 1 ? data.userStatus.streamProgressSeconds : Math.floor(data.userStatus.progress.PLAY_ON_DESKTOP.value); showNotification({ title: `${applicationName} - Quests Completer`, - body: `Current progress: ${progress}/${secondsNeeded} minutes.`, + body: `Current progress: ${progress}/${secondsNeeded} seconds.`, icon: icon, }); @@ -191,7 +191,7 @@ export default definePlugin({ const progress = quest.config.configVersion === 1 ? data.userStatus.streamProgressSeconds : Math.floor(data.userStatus.progress.STREAM_ON_DESKTOP.value); showNotification({ title: `${applicationName} - Quests Completer`, - body: `Current progress: ${progress}/${secondsNeeded} minutes.`, + body: `Current progress: ${progress}/${secondsNeeded} seconds.`, icon: icon, }); diff --git a/src/equicordplugins/timezones/index.tsx b/src/equicordplugins/timezones/index.tsx index 6e16af71..5f13d458 100644 --- a/src/equicordplugins/timezones/index.tsx +++ b/src/equicordplugins/timezones/index.tsx @@ -8,7 +8,7 @@ import "./styles.css"; import { NavContextMenuPatchCallback } from "@api/ContextMenu"; import * as DataStore from "@api/DataStore"; -import { definePluginSettings } from "@api/Settings"; +import { definePluginSettings, migratePluginSettings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; import { openModal } from "@utils/modal"; @@ -18,6 +18,7 @@ import { i18n, Menu, Tooltip, useEffect, useState } from "@webpack/common"; import { Message, User } from "discord-types/general"; import { SetTimezoneModal } from "./TimezoneModal"; +import { migrateData } from "plugins/pinDms/data"; export const DATASTORE_KEY = "vencord-timezones"; @@ -137,9 +138,9 @@ const userContextMenuPatch: NavContextMenuPatchCallback = (children, { user }: { }; - +migratePluginSettings("Timezones", "Timezone"); export default definePlugin({ - name: "Timezone", + name: "Timezones", authors: [Devs.Aria], description: "Shows the local time of users in profiles and message headers", contextMenus: { diff --git a/src/plugins/mentionAvatars/index.tsx b/src/plugins/mentionAvatars/index.tsx index d45425c6..6cd27c35 100644 --- a/src/plugins/mentionAvatars/index.tsx +++ b/src/plugins/mentionAvatars/index.tsx @@ -10,27 +10,55 @@ import { definePluginSettings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; -import { SelectedGuildStore, useState } from "@webpack/common"; +import { GuildStore, SelectedGuildStore, useState } from "@webpack/common"; import { User } from "discord-types/general"; const settings = definePluginSettings({ showAtSymbol: { type: OptionType.BOOLEAN, - description: "Whether the the @ symbol should be displayed", + description: "Whether the the @ symbol should be displayed on user mentions", default: true } }); +function DefaultRoleIcon() { + return ( + + + + + + ); +} + export default definePlugin({ name: "MentionAvatars", - description: "Shows user avatars inside mentions", - authors: [Devs.Ven, Devs.Luna], + description: "Shows user avatars and role icons inside mentions", + authors: [Devs.Ven, Devs.SerStars], patches: [{ find: ".USER_MENTION)", replacement: { match: /children:"@"\.concat\((null!=\i\?\i:\i)\)(?<=\.useName\((\i)\).+?)/, replace: "children:$self.renderUsername({username:$1,user:$2})" } + }, + { + find: ".ROLE_MENTION)", + replacement: { + match: /children:\[\i&&.{0,50}\.RoleDot.{0,300},\i(?=\])/, + replace: "$&,$self.renderRoleIcon(arguments[0])" + } }], settings, @@ -46,12 +74,31 @@ export default definePlugin({ onMouseEnter={() => setIsHovering(true)} onMouseLeave={() => setIsHovering(false)} > - + {getUsernameString(username)} ); - }, { noop: true }) + }, { noop: true }), + renderRoleIcon: ErrorBoundary.wrap(({ roleId, guildId }: { roleId: string, guildId: string; }) => { + // Discord uses Role Mentions for uncached users because .... idk + if (!roleId) return null; + + const role = GuildStore.getRole(guildId, roleId); + + if (!role?.icon) return ; + + return ( + + ); + }), }); function getUsernameString(username: string) { diff --git a/src/plugins/mentionAvatars/styles.css b/src/plugins/mentionAvatars/styles.css index 022f968c..64eb4141 100644 --- a/src/plugins/mentionAvatars/styles.css +++ b/src/plugins/mentionAvatars/styles.css @@ -1,8 +1,11 @@ -.vc-mentionAvatars-avatar { +.vc-mentionAvatars-icon { vertical-align: middle; width: 1em !important; /* insane discord sets width: 100% in channel topic */ height: 1em; margin: 0 4px 0.2rem 2px; - border-radius: 50%; box-sizing: border-box; } + +.vc-mentionAvatars-role-icon { + margin: 0 2px 0.2rem 4px; +} diff --git a/src/plugins/reviewDB/index.tsx b/src/plugins/reviewDB/index.tsx index 53839263..7423cc57 100644 --- a/src/plugins/reviewDB/index.tsx +++ b/src/plugins/reviewDB/index.tsx @@ -20,18 +20,16 @@ import "./style.css"; import { NavContextMenuPatchCallback } from "@api/ContextMenu"; import ErrorBoundary from "@components/ErrorBoundary"; -import { ExpandableHeader } from "@components/ExpandableHeader"; import { NotesIcon, OpenExternalIcon } from "@components/Icons"; import { Devs } from "@utils/constants"; import { classes } from "@utils/misc"; import definePlugin from "@utils/types"; import { findByPropsLazy } from "@webpack"; -import { Alerts, Button, Menu, Parser, TooltipContainer, useState } from "@webpack/common"; +import { Alerts, Button, Menu, Parser, TooltipContainer } from "@webpack/common"; import { Guild, User } from "discord-types/general"; import { Auth, initAuth, updateAuth } from "./auth"; import { openReviewsModal } from "./components/ReviewModal"; -import ReviewsView from "./components/ReviewsView"; import { NotificationType } from "./entities"; import { getCurrentUserInfo, readNotification } from "./reviewDbApi"; import { settings } from "./settings"; @@ -78,28 +76,12 @@ export default definePlugin({ }, patches: [ - { - find: "showBorder:null", - replacement: { - match: /user:(\i),setNote:\i,canDM.+?\}\)/, - replace: "$&,$self.getReviewsComponent($1)" - } - }, - { - find: /inline:!1,profileViewedAnalytics:\i}\),/, - replacement: { - match: /currentUser:\i,guild:\i}\)(?<=user:(\i),bio:null==\i\?.+?)/, - replace: "$&,$self.getReviewsComponent($1)" - }, - predicate: () => !settings.store.preferButtonOverDropdown - }, { find: ".BITE_SIZE,user:", replacement: { match: /{profileType:\i\.\i\.BITE_SIZE,children:\[/, replace: "$&$self.BiteSizeReviewsButton({user:arguments[0].user})," - }, - predicate: () => settings.store.preferButtonOverDropdown + } }, { find: ".FULL_SIZE,user:", @@ -171,31 +153,6 @@ export default definePlugin({ }, 4000); }, - getReviewsComponent: ErrorBoundary.wrap((user: User) => { - const [reviewCount, setReviewCount] = useState(); - - return ( - openReviewsModal(user.id, user.username)} - moreTooltipText={ - reviewCount && reviewCount > 50 - ? `View all ${reviewCount} reviews` - : "Open Review Modal" - } - onDropDownClick={state => settings.store.reviewsDropdownState = !state} - defaultState={settings.store.reviewsDropdownState} - > - setReviewCount(r.reviewCount)} - showInput - /> - - ); - }, { message: "Failed to render Reviews" }), - BiteSizeReviewsButton: ErrorBoundary.wrap(({ user }: { user: User; }) => { return ( @@ -212,4 +169,4 @@ export default definePlugin({ ); }, { noop: true }) -}); +}); \ No newline at end of file diff --git a/src/plugins/reviewDB/settings.tsx b/src/plugins/reviewDB/settings.tsx index b8b02171..c3c806f5 100644 --- a/src/plugins/reviewDB/settings.tsx +++ b/src/plugins/reviewDB/settings.tsx @@ -54,12 +54,6 @@ export const settings = definePluginSettings({ description: "Hide reviews from blocked users", default: true, }, - preferButtonOverDropdown: { - description: "Show a button instead of dropdown to view reviews", - type: OptionType.BOOLEAN, - default: true, - restartNeeded: true - }, buttons: { type: OptionType.COMPONENT, description: "ReviewDB buttons", diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 08173b1f..0a058d37 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -552,6 +552,10 @@ export const Devs = /* #__PURE__*/ Object.freeze({ name: "llytz", id: 1271128098301022240n }, + SerStars: { + name: "SerStars", + id: 861631850681729045n, + }, } satisfies Record); export const EquicordDevs = Object.freeze({