Line data Source code
1 : /*
2 : * Copyright (C) 2004-2024 Savoir-faire Linux Inc.
3 : *
4 : * This program is free software: you can redistribute it and/or modify
5 : * it under the terms of the GNU General Public License as published by
6 : * the Free Software Foundation, either version 3 of the License, or
7 : * (at your option) any later version.
8 : *
9 : * This program is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : * GNU General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU General Public License
15 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 : */
17 :
18 : #ifdef HAVE_CONFIG_H
19 : #include "config.h"
20 : #endif
21 :
22 : #include "conversation_interface.h"
23 :
24 : #include <cerrno>
25 : #include <sstream>
26 : #include <cstring>
27 :
28 : #include "logger.h"
29 : #include "manager.h"
30 : #include "jamidht/jamiaccount.h"
31 : #include "jamidht/conversation_module.h"
32 :
33 : namespace libjami {
34 :
35 : std::string
36 115 : startConversation(const std::string& accountId)
37 : {
38 115 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
39 115 : if (auto convModule = acc->convModule(true))
40 115 : return convModule->startConversation();
41 0 : return {};
42 : }
43 :
44 : void
45 134 : acceptConversationRequest(const std::string& accountId, const std::string& conversationId)
46 : {
47 134 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
48 134 : if (auto convModule = acc->convModule(true))
49 134 : convModule->acceptConversationRequest(conversationId);
50 134 : }
51 :
52 : void
53 3 : declineConversationRequest(const std::string& accountId, const std::string& conversationId)
54 : {
55 3 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
56 3 : acc->declineConversationRequest(conversationId);
57 3 : }
58 :
59 : bool
60 9 : removeConversation(const std::string& accountId, const std::string& conversationId)
61 : {
62 9 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
63 9 : if (auto convModule = acc->convModule(true))
64 9 : return convModule->removeConversation(conversationId);
65 0 : return false;
66 : }
67 :
68 : std::vector<std::string>
69 12 : getConversations(const std::string& accountId)
70 : {
71 12 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
72 12 : if (auto convModule = acc->convModule(true))
73 12 : return convModule->getConversations();
74 0 : return {};
75 : }
76 :
77 : std::vector<std::map<std::string, std::string>>
78 16 : getActiveCalls(const std::string& accountId, const std::string& conversationId)
79 : {
80 16 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
81 16 : if (auto convModule = acc->convModule(true))
82 16 : return convModule->getActiveCalls(conversationId);
83 0 : return {};
84 : }
85 :
86 : std::vector<std::map<std::string, std::string>>
87 12 : getConversationRequests(const std::string& accountId)
88 : {
89 12 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
90 12 : if (auto convModule = acc->convModule(true))
91 12 : return convModule->getConversationRequests();
92 0 : return {};
93 : }
94 :
95 : void
96 3 : updateConversationInfos(const std::string& accountId,
97 : const std::string& conversationId,
98 : const std::map<std::string, std::string>& infos)
99 : {
100 3 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
101 3 : if (auto convModule = acc->convModule(true))
102 3 : convModule->updateConversationInfos(conversationId, infos);
103 3 : }
104 :
105 : std::map<std::string, std::string>
106 5 : conversationInfos(const std::string& accountId, const std::string& conversationId)
107 : {
108 5 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
109 5 : if (auto convModule = acc->convModule(true))
110 5 : return convModule->conversationInfos(conversationId);
111 0 : return {};
112 : }
113 :
114 : void
115 5 : setConversationPreferences(const std::string& accountId,
116 : const std::string& conversationId,
117 : const std::map<std::string, std::string>& prefs)
118 : {
119 5 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
120 5 : if (auto convModule = acc->convModule(true))
121 5 : convModule->setConversationPreferences(conversationId, prefs);
122 5 : }
123 :
124 : std::map<std::string, std::string>
125 4 : getConversationPreferences(const std::string& accountId, const std::string& conversationId)
126 : {
127 4 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
128 4 : if (auto convModule = acc->convModule(true))
129 4 : return convModule->getConversationPreferences(conversationId);
130 0 : return {};
131 : }
132 :
133 : // Member management
134 : void
135 132 : addConversationMember(const std::string& accountId,
136 : const std::string& conversationId,
137 : const std::string& contactUri)
138 : {
139 132 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
140 132 : if (auto convModule = acc->convModule(true)) {
141 132 : dht::InfoHash h(contactUri);
142 132 : if (not h) {
143 0 : JAMI_ERROR("addConversationMember: invalid contact URI `{}`", contactUri);
144 0 : return;
145 : }
146 132 : convModule->addConversationMember(conversationId, h);
147 132 : }
148 : }
149 :
150 : void
151 14 : removeConversationMember(const std::string& accountId,
152 : const std::string& conversationId,
153 : const std::string& contactUri)
154 : {
155 14 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
156 14 : if (auto convModule = acc->convModule(true)) {
157 14 : dht::InfoHash h(contactUri);
158 14 : if (not h) {
159 0 : JAMI_ERROR("removeConversationMember: invalid contact URI `{}`", contactUri);
160 0 : return;
161 : }
162 14 : convModule->removeConversationMember(conversationId, h);
163 14 : }
164 : }
165 :
166 : std::vector<std::map<std::string, std::string>>
167 22 : getConversationMembers(const std::string& accountId, const std::string& conversationId)
168 : {
169 22 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
170 22 : if (auto convModule = acc->convModule(true))
171 22 : return convModule->getConversationMembers(conversationId, true);
172 0 : return {};
173 : }
174 :
175 : // Message send/load
176 : void
177 99 : sendMessage(const std::string& accountId,
178 : const std::string& conversationId,
179 : const std::string& message,
180 : const std::string& commitId,
181 : const int32_t& flag)
182 : {
183 99 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
184 99 : if (auto convModule = acc->convModule(true)) {
185 99 : if (flag == 0 /* Reply or simple commit */) {
186 89 : convModule->sendMessage(conversationId, message, commitId);
187 10 : } else if (flag == 1 /* message edition */) {
188 7 : convModule->editMessage(conversationId, message, commitId);
189 3 : } else if (flag == 2 /* reaction */) {
190 3 : convModule->reactToMessage(conversationId, message, commitId);
191 : }
192 99 : }
193 99 : }
194 :
195 : uint32_t
196 0 : loadConversationMessages(const std::string& accountId,
197 : const std::string& conversationId,
198 : const std::string& fromMessage,
199 : size_t n)
200 : {
201 0 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
202 0 : if (auto convModule = acc->convModule(true))
203 0 : return convModule->loadConversationMessages(conversationId, fromMessage, n);
204 0 : return 0;
205 : }
206 :
207 : uint32_t
208 2 : loadConversation(const std::string& accountId,
209 : const std::string& conversationId,
210 : const std::string& fromMessage,
211 : size_t n)
212 : {
213 2 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
214 2 : if (auto convModule = acc->convModule(true))
215 2 : return convModule->loadConversation(conversationId, fromMessage, n);
216 0 : return 0;
217 : }
218 :
219 : uint32_t
220 0 : loadConversationUntil(const std::string& accountId,
221 : const std::string& conversationId,
222 : const std::string& fromMessage,
223 : const std::string& toMessage)
224 : {
225 0 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
226 0 : if (auto convModule = acc->convModule(true))
227 0 : return convModule->loadConversationUntil(conversationId, fromMessage, toMessage);
228 0 : return 0;
229 : }
230 :
231 : uint32_t
232 0 : loadSwarmUntil(const std::string& accountId,
233 : const std::string& conversationId,
234 : const std::string& fromMessage,
235 : const std::string& toMessage)
236 : {
237 0 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
238 0 : if (auto convModule = acc->convModule(true))
239 0 : return convModule->loadSwarmUntil(conversationId, fromMessage, toMessage);
240 0 : return 0;
241 : }
242 :
243 : uint32_t
244 4 : countInteractions(const std::string& accountId,
245 : const std::string& conversationId,
246 : const std::string& toId,
247 : const std::string& fromId,
248 : const std::string& authorUri)
249 : {
250 4 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
251 4 : if (auto convModule = acc->convModule(true))
252 4 : return convModule->countInteractions(conversationId, toId, fromId, authorUri);
253 0 : return 0;
254 : }
255 :
256 : void
257 0 : clearCache(const std::string& accountId, const std::string& conversationId)
258 : {
259 0 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
260 0 : if (auto convModule = acc->convModule(true))
261 0 : convModule->clearCache(conversationId);
262 0 : }
263 :
264 : uint32_t
265 4 : searchConversation(const std::string& accountId,
266 : const std::string& conversationId,
267 : const std::string& author,
268 : const std::string& lastId,
269 : const std::string& regexSearch,
270 : const std::string& type,
271 : const int64_t& after,
272 : const int64_t& before,
273 : const uint32_t& maxResult,
274 : const int32_t& flag)
275 : {
276 4 : uint32_t res = 0;
277 4 : jami::Filter filter {author, lastId, regexSearch, type, after, before, maxResult, flag != 0};
278 16 : for (const auto& accId : jami::Manager::instance().getAccountList()) {
279 12 : if (!accountId.empty() && accId != accountId)
280 8 : continue;
281 4 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accId)) {
282 4 : res = std::uniform_int_distribution<uint32_t>()(acc->rand);
283 4 : if (auto convModule = acc->convModule(true)) {
284 4 : convModule->search(res, conversationId, filter);
285 : }
286 4 : }
287 4 : }
288 4 : return res;
289 4 : }
290 :
291 : void
292 0 : reloadConversationsAndRequests(const std::string& accountId)
293 : {
294 0 : if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) {
295 0 : acc->reloadContacts();
296 0 : if (auto convModule = acc->convModule(true)) {
297 0 : convModule->reloadRequests();
298 0 : convModule->loadConversations();
299 : }
300 0 : }
301 0 : }
302 :
303 : } // namespace libjami
|