From 1e2426837547226dc0e87fca0b5554905e8f7aae Mon Sep 17 00:00:00 2001 From: kawamataryo Date: Sun, 20 Aug 2023 15:22:55 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20improve=20match=20logic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/bskyHelpers.ts | 53 ++++++++++++++++++----------- src/lib/components/BskyUserCell.ts | 4 +-- src/lib/searchAndInsertBskyUsers.ts | 10 +++--- 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/lib/bskyHelpers.ts b/src/lib/bskyHelpers.ts index 056f2b0..679087f 100644 --- a/src/lib/bskyHelpers.ts +++ b/src/lib/bskyHelpers.ts @@ -1,7 +1,13 @@ import type { ProfileView } from "@atproto/api/dist/client/types/app/bsky/actor/defs" import { BSKY_USER_MATCH_TYPE } from "./constants" -export const isSimilarUser = (terms: string[], bskyProfile: ProfileView | undefined): { +type Names = { + accountName: string, + accountNameRemoveUnderscore: string, + displayName: string, +} + +export const isSimilarUser = (names: Names, bskyProfile: ProfileView | undefined): { isSimilar: boolean, type: typeof BSKY_USER_MATCH_TYPE[keyof typeof BSKY_USER_MATCH_TYPE], } => { @@ -12,27 +18,34 @@ export const isSimilarUser = (terms: string[], bskyProfile: ProfileView | undefi } } - for (const term of terms) { - const lowerCaseName = term.toLocaleLowerCase() - if (lowerCaseName === bskyProfile?.handle.toLocaleLowerCase().replace("@", "").split('.')[0]) { - return { - isSimilar: true, - type: BSKY_USER_MATCH_TYPE.HANDLE, - } - } - if (lowerCaseName === bskyProfile.displayName?.toLocaleLowerCase()) { - return { - isSimilar: true, - type: BSKY_USER_MATCH_TYPE.DISPLAY_NAME, - } - } - if (bskyProfile.description?.toLocaleLowerCase().includes(lowerCaseName)) { - return { - isSimilar: true, - type: BSKY_USER_MATCH_TYPE.DESCRIPTION, - } + const lowerCaseNames = Object.entries(names).reduce((acc, [key, value]) => { + acc[key] = value.toLowerCase(); + return acc; + }, {} as Names); + + const bskyHandle = bskyProfile.handle.toLocaleLowerCase().replace("@", "").split('.')[0]; + + if (lowerCaseNames.accountName === bskyHandle || lowerCaseNames.accountNameRemoveUnderscore === bskyHandle) { + return { + isSimilar: true, + type: BSKY_USER_MATCH_TYPE.HANDLE, } } + + if (lowerCaseNames.displayName === bskyProfile.displayName?.toLocaleLowerCase()) { + return { + isSimilar: true, + type: BSKY_USER_MATCH_TYPE.DISPLAY_NAME, + } + } + + if (bskyProfile.description?.toLocaleLowerCase().includes(lowerCaseNames.accountName)) { + return { + isSimilar: true, + type: BSKY_USER_MATCH_TYPE.DESCRIPTION, + } + } + return { isSimilar: false, type: BSKY_USER_MATCH_TYPE.NONE, diff --git a/src/lib/components/BskyUserCell.ts b/src/lib/components/BskyUserCell.ts index b57bf33..0c7bbe3 100644 --- a/src/lib/components/BskyUserCell.ts +++ b/src/lib/components/BskyUserCell.ts @@ -86,7 +86,7 @@ const MatchTypeLabel = ({ matchType }: { matchType: typeof BSKY_USER_MATCH_TYPE[ const [text, labelClass] = match(matchType) .with( BSKY_USER_MATCH_TYPE.HANDLE, - () => ["Same handle", "match-type__handle"] + () => ["Same handle name", "match-type__handle"] ) .with( BSKY_USER_MATCH_TYPE.DISPLAY_NAME, @@ -94,7 +94,7 @@ const MatchTypeLabel = ({ matchType }: { matchType: typeof BSKY_USER_MATCH_TYPE[ ) .with( BSKY_USER_MATCH_TYPE.DESCRIPTION, - () => ["Included handle or display name in description", "match-type__description"] + () => ["Included handle name in description", "match-type__description"] ) .run() diff --git a/src/lib/searchAndInsertBskyUsers.ts b/src/lib/searchAndInsertBskyUsers.ts index fe393ac..8e330c3 100644 --- a/src/lib/searchAndInsertBskyUsers.ts +++ b/src/lib/searchAndInsertBskyUsers.ts @@ -64,11 +64,11 @@ export const searchAndInsertBskyUsers = async ( limit: 1, }) - const { isSimilar: isUserFound, type } = isSimilarUser([ - twAccountName, - twAccountNameRemoveUnderscore, - twDisplayName, - ], searchResult) + const { isSimilar: isUserFound, type } = isSimilarUser({ + accountName: twAccountName, + accountNameRemoveUnderscore: twAccountNameRemoveUnderscore, + displayName: twDisplayName, + }, searchResult) if (isUserFound) { targetAccount = searchResult