From a84ce9df9d4ee280fe4e859dff5feb62b87da8df Mon Sep 17 00:00:00 2001 From: mtyszczak <mateusz.tyszczak@gmail.com> Date: Fri, 3 Jan 2025 08:56:15 +0100 Subject: [PATCH] Parse user mentions from post JSON metadata instead of raw body --- src/chain-observers/filters/post-mention.ts | 11 +++++++--- .../providers/mention-provider.ts | 11 +++++++--- src/utils/mention.ts | 22 ------------------- 3 files changed, 16 insertions(+), 28 deletions(-) delete mode 100644 src/utils/mention.ts diff --git a/src/chain-observers/filters/post-mention.ts b/src/chain-observers/filters/post-mention.ts index 7add925..be8bb05 100644 --- a/src/chain-observers/filters/post-mention.ts +++ b/src/chain-observers/filters/post-mention.ts @@ -1,5 +1,4 @@ import type { WorkerBee } from "../../bot"; -import { mentionedAccount } from "../../utils/mention"; import { OperationClassifier } from "../classifiers"; import type { TRegisterEvaluationContext } from "../classifiers/collector-classifier-base"; import type { DataEvaluationContext } from "../factories/data-evaluation-context"; @@ -23,8 +22,14 @@ export class PostMentionFilter extends FilterBase { const { operationsPerType } = await data.get(OperationClassifier); for(const { operation } of (operationsPerType.comment ?? [])) - if (mentionedAccount(this.account, operation.body)) - return true; + try { + const jsonMetadata = JSON.parse(operation.json_metadata); + + if ("users" in jsonMetadata && Array.isArray(jsonMetadata.users)) + if (jsonMetadata.users.indexOf(this.account) !== -1) + return true; + // eslint-disable-next-line no-empty + } catch {} return false; } diff --git a/src/chain-observers/providers/mention-provider.ts b/src/chain-observers/providers/mention-provider.ts index 2e4aa99..e737c4d 100644 --- a/src/chain-observers/providers/mention-provider.ts +++ b/src/chain-observers/providers/mention-provider.ts @@ -1,6 +1,5 @@ import { comment, TAccountName } from "@hiveio/wax"; import { WorkerBeeIterable } from "../../types/iterator"; -import { mentionedAccount } from "../../utils/mention"; import { OperationClassifier } from "../classifiers"; import { TRegisterEvaluationContext } from "../classifiers/collector-classifier-base"; import { DataEvaluationContext } from "../factories/data-evaluation-context"; @@ -34,8 +33,14 @@ export class MentionedAccountProvider<TMentions extends Array<TAccountName> = Ar for(const { operation } of (operationsPerType.comment ?? [])) for(const account of this.accounts) - if (mentionedAccount(account, operation.body)) - mentioned[account].push(operation); + try { + const jsonMetadata = JSON.parse(operation.json_metadata); + + if ("users" in jsonMetadata && Array.isArray(jsonMetadata.users)) + if (jsonMetadata.users.indexOf(account) !== -1) + mentioned[account].push(operation); + // eslint-disable-next-line no-empty + } catch {} return { diff --git a/src/utils/mention.ts b/src/utils/mention.ts deleted file mode 100644 index d3374e0..0000000 --- a/src/utils/mention.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { TAccountName } from "@hiveio/wax"; - -export const mentionedAccount = (accountName: TAccountName, message: string): boolean => { - let lastIndexOf = -1; - while((lastIndexOf = message.indexOf(`@${accountName}`, lastIndexOf + 1)) !== -1) { - const nextChar = message[lastIndexOf + accountName.length + 1]; - switch(nextChar) { - case "a": case "b": case "c": case "d": case "e": case "f": case "g": case "h": - case "i": case "j": case "k": case "l": case "m": case "n": case "o": case "p": - case "q": case "r": case "s": case "t": case "u": case "v": case "w": case "x": - case "y": case "z": - case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": - case "8": case "9": - case "-": case ".": - continue; - default: - return true; // - next char is not a possible username character, so we have a mention - } - } - - return false; -}; -- GitLab