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