diff --git a/package-lock.json b/package-lock.json index 5b6231a2..47c618de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sky-follower-bridge", - "version": "2.9.3", + "version": "3.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sky-follower-bridge", - "version": "2.9.3", + "version": "3.1.0", "dependencies": { "@atproto/api": "^0.19.3", "@atproto/jwk-webcrypto": "^0.2.0", diff --git a/src/hooks/useRetrieveBskyUsers.ts b/src/hooks/useRetrieveBskyUsers.ts index b18cae28..f8b0d846 100644 --- a/src/hooks/useRetrieveBskyUsers.ts +++ b/src/hooks/useRetrieveBskyUsers.ts @@ -32,6 +32,7 @@ const getServiceType = (messageName: MessageName): ServiceType => { MESSAGE_NAMES.SEARCH_BSKY_USER_ON_FOLLOW_PAGE, MESSAGE_NAMES.SEARCH_BSKY_USER_ON_LIST_MEMBERS_PAGE, MESSAGE_NAMES.SEARCH_BSKY_USER_ON_BLOCK_PAGE, + MESSAGE_NAMES.SEARCH_BSKY_USER_ON_REPOST_PAGE, ), () => SERVICE_TYPE.X, ) diff --git a/src/hooks/useSearch.ts b/src/hooks/useSearch.ts index caa69b1b..809b8bd6 100644 --- a/src/hooks/useSearch.ts +++ b/src/hooks/useSearch.ts @@ -32,7 +32,7 @@ export const useSearch = () => { const retrySearch = async () => { clearErrorMessage(); setIsLoading(true); - await new Promise((r) => setTimeout(r, 3000)); + await new Promise((r) => setTimeout(r, 5000)); await searchBskyUser(); }; @@ -98,6 +98,10 @@ export const useSearch = () => { P.when((url) => TARGET_URLS_REGEX.FACEBOOK.test(url)), () => MESSAGE_NAMES.SEARCH_BSKY_USER_ON_FACEBOOK_PAGE, ) + .with( + P.when((url) => TARGET_URLS_REGEX.REPOST.test(url)), + () => MESSAGE_NAMES.SEARCH_BSKY_USER_ON_REPOST_PAGE, + ) .run(); await setToChromeStorage(STORAGE_KEYS.BSKY_MESSAGE_NAME, messageName); diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 07eebef3..02abca8b 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -7,6 +7,7 @@ export const MESSAGE_NAMES = { SEARCH_BSKY_USER_ON_INSTAGRAM_PAGE: "search_bsky_user_on_instagram_page", SEARCH_BSKY_USER_ON_TIKTOK_PAGE: "search_bsky_user_on_tiktok_page", SEARCH_BSKY_USER_ON_FACEBOOK_PAGE: "search_bsky_user_on_facebook_page", + SEARCH_BSKY_USER_ON_REPOST_PAGE: "search_bsky_user_on_repost_page", } as const; export const ACTION_MODE = { @@ -24,6 +25,7 @@ export const MESSAGE_NAME_TO_ACTION_MODE_MAP = { [MESSAGE_NAMES.SEARCH_BSKY_USER_ON_INSTAGRAM_PAGE]: ACTION_MODE.FOLLOW, [MESSAGE_NAMES.SEARCH_BSKY_USER_ON_TIKTOK_PAGE]: ACTION_MODE.FOLLOW, [MESSAGE_NAMES.SEARCH_BSKY_USER_ON_FACEBOOK_PAGE]: ACTION_MODE.FOLLOW, + [MESSAGE_NAMES.SEARCH_BSKY_USER_ON_REPOST_PAGE]: ACTION_MODE.FOLLOW, }; const STORAGE_PREFIX = "sky_follower_bridge_storage"; @@ -46,6 +48,7 @@ export const TARGET_URLS_REGEX = { INSTAGRAM: /^https:\/\/www\.instagram\.com\/[^/]+\/(followers|following)\/?/, TIKTOK: /^https:\/\/www\.tiktok\.com/, FACEBOOK: /^https:\/\/www\.facebook\.com\/friends\/list/, + REPOST: /^https:\/\/(twitter|x)\.com\/[^/]+\/with_replies/, } as const; export const MESSAGE_TYPE = { diff --git a/src/services/xService.ts b/src/services/xService.ts index 1c8a88f1..48de8fc9 100644 --- a/src/services/xService.ts +++ b/src/services/xService.ts @@ -8,7 +8,10 @@ const USER_CELL_SELECTOR_MAP = { '[data-testid="primaryColumn"] [data-testid="UserCell"]', [MESSAGE_NAMES.SEARCH_BSKY_USER_ON_LIST_MEMBERS_PAGE]: '[data-testid="cellInnerDiv"] [data-testid="UserCell"]', - [MESSAGE_NAMES.SEARCH_BSKY_USER_ON_BLOCK_PAGE]: '[data-testid="UserCell"]', + [MESSAGE_NAMES.SEARCH_BSKY_USER_ON_BLOCK_PAGE]: + '[data-testid="UserCell"]', + [MESSAGE_NAMES.SEARCH_BSKY_USER_ON_REPOST_PAGE]: + '[data-testid="tweet"]:has([data-testid="socialContext"])', }; const LIST_PAGE_SCROLL_TARGET_SELECTOR = 'div[data-viewportview="true"]'; @@ -54,7 +57,10 @@ export class XService implements IService { } extractUserData(userCell: Element): CrawledUserInfo { - const anchors = Array.from(userCell.querySelectorAll("a")); + const userNameEl = userCell.querySelector('[data-testid="User-Name"]'); + const anchors = userNameEl + ? Array.from(userNameEl.querySelectorAll("a")) + : Array.from(userCell.querySelectorAll("a")); const [avatarEl, displayNameEl] = anchors; const accountName = avatarEl?.getAttribute("href")?.replace("/", "") ?? ""; const accountNameRemoveUnderscore = accountName.replaceAll("_", ""); // bsky does not allow underscores in handle, so remove them.