diff --git a/plugins/BetterSpotifyIntegration/manifest.json b/plugins/BetterSpotifyIntegration/manifest.json
deleted file mode 100644
index 011e41c..0000000
--- a/plugins/BetterSpotifyIntegration/manifest.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "BetterSpotifyIntegration",
- "description": "Shrimply better integration with Spotify",
- "vendetta": { },
- "main": "src/index.tsx"
-}
diff --git a/plugins/BetterSpotifyIntegration/src/components/ListenAlongButton.tsx b/plugins/BetterSpotifyIntegration/src/components/ListenAlongButton.tsx
deleted file mode 100644
index f96b515..0000000
--- a/plugins/BetterSpotifyIntegration/src/components/ListenAlongButton.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { findByProps, findByStoreName } from "@vendetta/metro";
-import { getAssetIDByName } from "@vendetta/ui/assets";
-import { Image, View } from "react-native";
-
-const FluxUtils = findByProps("useStateFromStores");
-const SpotifyStore = findByStoreName("SpotifyStore");
-
-const Button = findByProps("Sizes", "Looks") as any;
-const SpotifySyncUtil = findByProps("play", "sync");
-
-type ListenAlongButtonProps = Partial<{
- activity: any;
- user: any;
- isCurrentUser: boolean;
- activityButtonColor: string;
- [key: string]: any;
-}>
-
-export default function ListenAlongButton(props: ListenAlongButtonProps) {
- const currentPartyId = FluxUtils.useStateFromStores([SpotifyStore], () => SpotifyStore.getActivity()?.party?.id);
- const alreadySync = props.isCurrentUser || props.activity?.party?.id === currentPartyId;
-
- return
- ;
-}
diff --git a/plugins/BetterSpotifyIntegration/src/index.tsx b/plugins/BetterSpotifyIntegration/src/index.tsx
deleted file mode 100644
index 8f96ff4..0000000
--- a/plugins/BetterSpotifyIntegration/src/index.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { findByName } from "@vendetta/metro";
-import { i18n } from "@vendetta/metro/common";
-import { before } from "@vendetta/patcher";
-import { findInReactTree } from "@vendetta/utils";
-
-import ListenAlongButton from "./components/ListenAlongButton";
-
-let sectionPatch: () => void;
-
-export default {
- onLoad() {
- const getListeningHeader = () => i18n.Messages.USER_ACTIVITY_HEADER_LISTENING?.intlMessage?.format({ name: "Spotify" });
-
- sectionPatch = before("default", findByName("UserProfileSection", false), ([props]) => {
- if (props.title !== getListeningHeader()) return;
-
- const spotifyElement = findInReactTree(props.children, e => e?.style?.padding === 0);
- const actionsIndex = spotifyElement?.children?.findIndex?.(e => e?.type?.name === "Actions");
-
- if (actionsIndex && actionsIndex !== -1) {
- const actions = spotifyElement.children[actionsIndex];
-
- spotifyElement.children[actionsIndex] = <>
- {actions}
- {}
- >;
- }
- });
- },
- onUnload() {
- sectionPatch?.();
- }
-};
diff --git a/plugins/BetterSpotifyIntegration/src/utils/useListeningParty.ts b/plugins/BetterSpotifyIntegration/src/utils/useListeningParty.ts
deleted file mode 100644
index 72b4ed4..0000000
--- a/plugins/BetterSpotifyIntegration/src/utils/useListeningParty.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { findByProps, findByStoreName } from "@vendetta/metro";
-
-const FluxUtils = findByProps("useStateFromStores");
-const SpotifyStore = findByStoreName("SpotifyStore");
-const GamePartyStore = findByStoreName("GamePartyStore");
-const UserStore = findByStoreName("UserStore");
-
-export default function useListeningParty() {
- const partySet = FluxUtils.useStateFromStores([GamePartyStore, SpotifyStore], () => {
- const party = GamePartyStore.getParty(SpotifyStore.getActivity()?.party?.id);
- return party?.size > 1 ? party : null;
- });
-
- return partySet ? [...partySet].map(id => UserStore.getUser(id)) : [];
-}
diff --git a/plugins/HideGiftButton/manifest.json b/plugins/HideGiftButton/manifest.json
deleted file mode 100644
index f41fa9f..0000000
--- a/plugins/HideGiftButton/manifest.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "HideGiftButton",
- "description": "Hides the gift button in the chat input.",
- "vendetta": {
- "icon": "ic_gift_24px"
- }
-}
diff --git a/plugins/HideGiftButton/src/index.ts b/plugins/HideGiftButton/src/index.ts
deleted file mode 100644
index 0b653cb..0000000
--- a/plugins/HideGiftButton/src/index.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { findByName } from "@vendetta/metro";
-import { after } from "@vendetta/patcher";
-import { getAssetIDByName } from "@vendetta/ui/assets";
-import { findInReactTree } from "@vendetta/utils";
-
-const ChatInput = findByName("ChatInput");
-
-let unpatch: () => boolean;
-
-export default {
- onLoad() {
- const blockList = ["ic_thread_normal_24px", "ic_gift"].map(n => getAssetIDByName(n));
- unpatch = after("render", ChatInput.prototype, (_, ret) => {
- const input = findInReactTree(ret, t => "forceAnimateButtons" in t.props && t.props.actions);
- input.props.actions = input.props.actions.filter(a => !blockList.includes(a.source));
- });
- },
- onUnload: unpatch
-};
diff --git a/plugins/HoldGIFSend/manifest.json b/plugins/HoldGIFSend/manifest.json
deleted file mode 100644
index 19c34b4..0000000
--- a/plugins/HoldGIFSend/manifest.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "HoldGIFSend",
- "description": "Hold GIF links to chat input before sending them.",
- "vendetta": {
- "icon": "gif"
- }
-}
diff --git a/plugins/HoldGIFSend/src/index.ts b/plugins/HoldGIFSend/src/index.ts
deleted file mode 100644
index 9858c92..0000000
--- a/plugins/HoldGIFSend/src/index.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { findByProps } from "@vendetta/metro";
-import { instead } from "@vendetta/patcher";
-
-const messageInputUtil = findByProps("selectGIF");
-
-export const onUnload = instead("selectGIF", messageInputUtil, (args) => {
- // args[1] never exists on older version, so we use it as an indicator
- // prev: selectGIF([GIF]) now: selectGIF(currentChannelId, [GIF]);
- if (args[1]) args[1] = args[1].url;
- else args[0] = args[0].url;
-
- messageInputUtil.insertText(...args);
-});
diff --git a/plugins/Last.fm/src/manager.ts b/plugins/Last.fm/src/manager.ts
index 39ba9a1..7e2dd96 100644
--- a/plugins/Last.fm/src/manager.ts
+++ b/plugins/Last.fm/src/manager.ts
@@ -81,12 +81,12 @@ class PluginManager {
const activity: Activity = {
name: currentSettings.appName || Constants.DEFAULT_APP_NAME,
- flags: 0,
+ flags: 2,
type: currentSettings.listeningTo
? ActivityType.LISTENING
: ActivityType.PLAYING,
details: lastTrack.name,
- state: lastTrack.artist,
+ state: `by ${lastTrack.artist}`,
status_display_type: 1,
application_id: Constants.APPLICATION_ID,
};
@@ -102,9 +102,11 @@ class PluginManager {
}
// Set timestamps if enabled
- if (currentSettings.showTimestamp) {
+ // Use `from` and `to` from track.getInfo
+ if (currentSettings.showTimestamp && typeof lastTrack.from === "number") {
activity.timestamps = {
- start: Date.now() | 0,
+ start: lastTrack.from * 1000,
+ ...(typeof lastTrack.to === "number" && { end: lastTrack.to * 1000 }),
};
}
@@ -114,7 +116,7 @@ class PluginManager {
if (asset[0]) {
activity.assets = {
large_image: asset[0],
- large_text: lastTrack.album,
+ large_text: `on ${lastTrack.album}`,
};
}
}
diff --git a/plugins/Last.fm/src/utils/lastfm.ts b/plugins/Last.fm/src/utils/lastfm.ts
index fc1994c..d2dc427 100644
--- a/plugins/Last.fm/src/utils/lastfm.ts
+++ b/plugins/Last.fm/src/utils/lastfm.ts
@@ -177,7 +177,9 @@ class LastFMClient {
export const lastfmClient = LastFMClient.getInstance();
/** Fetches the latest user's scrobble */
-export async function fetchLatestScrobble(): Promise