File: getdtreactions.cc

package info (click to toggle)
signalbackup-tools 20250313.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 3,752 kB
  • sloc: cpp: 47,042; sh: 477; ansic: 399; ruby: 19; makefile: 3
file content (76 lines) | stat: -rw-r--r-- 3,978 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
  Copyright (C) 2022-2024  Selwin van Dijk

  This file is part of signalbackup-tools.

  signalbackup-tools is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  signalbackup-tools is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with signalbackup-tools.  If not, see <https://www.gnu.org/licenses/>.
*/

#include "signalbackup.ih"

void SignalBackup::getDTReactions(SqliteDB const &ddb, long long int rowid, long long int numreactions, std::vector<std::vector<std::string>> *reactions) const
{
  SqliteDB::QueryResults results_emoji_reactions;
  //if (numreactions)
  //  std::cout << "  " << numreactions << " reactions." << std::endl;
  for (unsigned int k = 0; k < numreactions; ++k)
  {
    if (!ddb.exec("SELECT "
                  "json_extract(messages.json, '$.reactions[" + bepaald::toString(k) + "].emoji') AS emoji,"

                  // not present in android database
                  //"json_extract(messages.json, '$.reactions[" + bepaald::toString(k) + "].remove') AS remove,"

                  // THIS IS THE AUTHOR OF THE MESSAGE THATS REACTED TO
                  //"json_extract(messages.json, '$.reactions[" + bepaald::toString(k) + "].targetAuthorUuid') AS target_author_uuid,"

                  //timestamp of message that reaction belongs to, dont know why this exists
                  //"JSONLONG(json_extract(messages.json, '$.reactions[" + bepaald::toString(k) + "].targetTimestamp')) AS target_timestamp,"

                  "JSONLONG(json_extract(messages.json, '$.reactions[" + bepaald::toString(k) + "].timestamp')) AS timestamp,"

                  // THE ID OF THE CONVERSATION OF THE REACTION AUTHOR (conversation somewhat doubles android's recipient table)
                  // ON OLDER DATABASES THIS IS PHONE NUMBER OF THE ACTUAL AUTHOR
                  "json_extract(messages.json, '$.reactions[" + bepaald::toString(k) + "].fromId') AS from_id,"

                  //"json_extract(messages.json, '$.reactions[" + bepaald::toString(k) + "].source') AS source" // ???
                  "conversations." + d_dt_c_uuid + " AS uuid,"
                  "conversations.e164 AS phone"
                  " FROM messages LEFT JOIN conversations ON"
                  " (conversations.id IS json_extract(messages.json, '$.reactions[" + bepaald::toString(k) + "].fromId')"
                  " OR "
                  "conversations.e164 IS json_extract(messages.json, '$.reactions[" + bepaald::toString(k) + "].fromId'))"
                  " WHERE rowid = ?", rowid, &results_emoji_reactions))
    {
      Logger::error("Failed to get reaction data from desktop database. Skipping.");
      continue;
    }
    //std::cout << "  Reaction " << k + 1 << "/" << numreactions << std::endl;
    //results_emoji_reactions.print(false);

    // DEBUG
    if (results_emoji_reactions.valueAsString(0, "uuid").empty() &&
        results_emoji_reactions.valueAsString(0, "phone").empty()) [[unlikely]]
    {
      Logger::warning("Got empty author uuid, here is some additional info:");
      ddb.print("SELECT json_extract(json, '$.reactions') FROM messages WHERE rowid = ?", rowid);
      results_emoji_reactions.printLineMode();
    }

    reactions->emplace_back(std::vector{results_emoji_reactions.valueAsString(0, "emoji"),
                                        results_emoji_reactions.valueAsString(0, "timestamp"),
                                        results_emoji_reactions.valueAsString(0, "uuid"),
                                        results_emoji_reactions.valueAsString(0, "phone")});
  }
}