Ring Daemon 16.0.0
Loading...
Searching...
No Matches
conversation_interface.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2004-2025 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
23
24#include <cerrno>
25#include <sstream>
26#include <cstring>
27
28#include "logger.h"
29#include "manager.h"
30#include "jamidht/jamiaccount.h"
32
33namespace libjami {
34
35std::string
36startConversation(const std::string& accountId)
37{
38 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
39 if (auto convModule = acc->convModule(true))
40 return convModule->startConversation();
41 return {};
42}
43
44void
45acceptConversationRequest(const std::string& accountId, const std::string& conversationId)
46{
47 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
48 if (auto convModule = acc->convModule(true))
49 convModule->acceptConversationRequest(conversationId);
50}
51
52void
53declineConversationRequest(const std::string& accountId, const std::string& conversationId)
54{
55 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
56 acc->declineConversationRequest(conversationId);
57}
58
59bool
60removeConversation(const std::string& accountId, const std::string& conversationId)
61{
62 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
63 if (auto convModule = acc->convModule(true))
64 return convModule->removeConversation(conversationId);
65 return false;
66}
67
68std::vector<std::string>
69getConversations(const std::string& accountId)
70{
71 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
72 if (auto convModule = acc->convModule(true))
73 return convModule->getConversations();
74 return {};
75}
76
77std::vector<std::map<std::string, std::string>>
78getActiveCalls(const std::string& accountId, const std::string& conversationId)
79{
80 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
81 if (auto convModule = acc->convModule(true))
82 return convModule->getActiveCalls(conversationId);
83 return {};
84}
85
86std::vector<std::map<std::string, std::string>>
87getConversationRequests(const std::string& accountId)
88{
89 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
90 if (auto convModule = acc->convModule(true))
91 return convModule->getConversationRequests();
92 return {};
93}
94
95void
96updateConversationInfos(const std::string& accountId,
97 const std::string& conversationId,
98 const std::map<std::string, std::string>& infos)
99{
100 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
101 if (auto convModule = acc->convModule(true))
102 convModule->updateConversationInfos(conversationId, infos);
103}
104
105std::map<std::string, std::string>
106conversationInfos(const std::string& accountId, const std::string& conversationId)
107{
108 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
109 if (auto convModule = acc->convModule(true))
110 return convModule->conversationInfos(conversationId);
111 return {};
112}
113
114void
115setConversationPreferences(const std::string& accountId,
116 const std::string& conversationId,
117 const std::map<std::string, std::string>& prefs)
118{
119 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
120 if (auto convModule = acc->convModule(true))
121 convModule->setConversationPreferences(conversationId, prefs);
122}
123
124std::map<std::string, std::string>
125getConversationPreferences(const std::string& accountId, const std::string& conversationId)
126{
127 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
128 if (auto convModule = acc->convModule(true))
129 return convModule->getConversationPreferences(conversationId);
130 return {};
131}
132
133// Member management
134void
135addConversationMember(const std::string& accountId,
136 const std::string& conversationId,
137 const std::string& contactUri)
138{
139 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
140 if (auto convModule = acc->convModule(true)) {
141 dht::InfoHash h(contactUri);
142 if (not h) {
143 JAMI_ERROR("addConversationMember: invalid contact URI `{}`", contactUri);
144 return;
145 }
146 convModule->addConversationMember(conversationId, h);
147 }
148}
149
150void
151removeConversationMember(const std::string& accountId,
152 const std::string& conversationId,
153 const std::string& contactUri)
154{
155 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
156 if (auto convModule = acc->convModule(true)) {
157 dht::InfoHash h(contactUri);
158 if (not h) {
159 JAMI_ERROR("removeConversationMember: invalid contact URI `{}`", contactUri);
160 return;
161 }
162 convModule->removeConversationMember(conversationId, h);
163 }
164}
165
166std::vector<std::map<std::string, std::string>>
167getConversationMembers(const std::string& accountId, const std::string& conversationId)
168{
169 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
170 if (auto convModule = acc->convModule(true))
171 return convModule->getConversationMembers(conversationId, true);
172 return {};
173}
174
175// Message send/load
176void
177sendMessage(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 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
184 if (auto convModule = acc->convModule(true)) {
185 if (flag == 0 /* Reply or simple commit */) {
186 convModule->sendMessage(conversationId, message, commitId);
187 } else if (flag == 1 /* message edition */) {
188 convModule->editMessage(conversationId, message, commitId);
189 } else if (flag == 2 /* reaction */) {
190 convModule->reactToMessage(conversationId, message, commitId);
191 }
192 }
193}
194
195uint32_t
196loadConversationMessages(const std::string& accountId,
197 const std::string& conversationId,
198 const std::string& fromMessage,
199 size_t n)
200{
201 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
202 if (auto convModule = acc->convModule(true))
203 return convModule->loadConversationMessages(conversationId, fromMessage, n);
204 return 0;
205}
206
207uint32_t
208loadConversation(const std::string& accountId,
209 const std::string& conversationId,
210 const std::string& fromMessage,
211 size_t n)
212{
213 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
214 if (auto convModule = acc->convModule(true))
215 return convModule->loadConversation(conversationId, fromMessage, n);
216 return 0;
217}
218
219uint32_t
220loadConversationUntil(const std::string& accountId,
221 const std::string& conversationId,
222 const std::string& fromMessage,
223 const std::string& toMessage)
224{
225 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
226 if (auto convModule = acc->convModule(true))
227 return convModule->loadConversationUntil(conversationId, fromMessage, toMessage);
228 return 0;
229}
230
231uint32_t
232loadSwarmUntil(const std::string& accountId,
233 const std::string& conversationId,
234 const std::string& fromMessage,
235 const std::string& toMessage)
236{
237 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
238 if (auto convModule = acc->convModule(true))
239 return convModule->loadSwarmUntil(conversationId, fromMessage, toMessage);
240 return 0;
241}
242
243uint32_t
244countInteractions(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 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
251 if (auto convModule = acc->convModule(true))
252 return convModule->countInteractions(conversationId, toId, fromId, authorUri);
253 return 0;
254}
255
256void
257clearCache(const std::string& accountId, const std::string& conversationId)
258{
259 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
260 if (auto convModule = acc->convModule(true))
261 convModule->clearCache(conversationId);
262}
263
264uint32_t
265searchConversation(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 uint32_t res = 0;
277 jami::Filter filter {author, lastId, regexSearch, type, after, before, maxResult, flag != 0};
278 for (const auto& accId : jami::Manager::instance().getAccountList()) {
279 if (!accountId.empty() && accId != accountId)
280 continue;
281 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accId)) {
282 res = std::uniform_int_distribution<uint32_t>()(acc->rand);
283 if (auto convModule = acc->convModule(true)) {
284 convModule->search(res, conversationId, filter);
285 }
286 }
287 }
288 return res;
289}
290
291void
292reloadConversationsAndRequests(const std::string& accountId)
293{
294 if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) {
295 acc->reloadContacts();
296 if (auto convModule = acc->convModule(true)) {
297 convModule->reloadRequests();
298 convModule->loadConversations();
299 }
300 }
301}
302
303} // namespace libjami
Ring Account is build on top of SIPAccountBase and uses DHT to handle call connectivity.
Definition jamiaccount.h:96
std::vector< std::string > getAccountList() const
Get account list.
Definition manager.cpp:2667
static LIBJAMI_TEST_EXPORT Manager & instance()
Definition manager.cpp:676
std::shared_ptr< T > getAccount(std::string_view accountId) const
Get an account pointer, looks for account of type T.
Definition manager.h:721
#define JAMI_ERROR(formatstr,...)
Definition logger.h:228
void clearCache(const std::string &accountId, const std::string &conversationId)
std::map< std::string, std::string > getConversationPreferences(const std::string &accountId, const std::string &conversationId)
std::string startConversation(const std::string &accountId)
uint32_t loadSwarmUntil(const std::string &accountId, const std::string &conversationId, const std::string &fromMessage, const std::string &toMessage)
std::vector< std::map< std::string, std::string > > getConversationMembers(const std::string &accountId, const std::string &conversationId)
std::map< std::string, std::string > conversationInfos(const std::string &accountId, const std::string &conversationId)
void acceptConversationRequest(const std::string &accountId, const std::string &conversationId)
void sendMessage(const std::string &accountId, const std::string &conversationId, const std::string &message, const std::string &commitId, const int32_t &flag)
void reloadConversationsAndRequests(const std::string &accountId)
void declineConversationRequest(const std::string &accountId, const std::string &conversationId)
uint32_t loadConversation(const std::string &accountId, const std::string &conversationId, const std::string &fromMessage, size_t n)
void addConversationMember(const std::string &accountId, const std::string &conversationId, const std::string &contactUri)
uint32_t loadConversationMessages(const std::string &accountId, const std::string &conversationId, const std::string &fromMessage, size_t n)
uint32_t loadConversationUntil(const std::string &accountId, const std::string &conversationId, const std::string &fromMessage, const std::string &toMessage)
uint32_t searchConversation(const std::string &accountId, const std::string &conversationId, const std::string &author, const std::string &lastId, const std::string &regexSearch, const std::string &type, const int64_t &after, const int64_t &before, const uint32_t &maxResult, const int32_t &flag)
void removeConversationMember(const std::string &accountId, const std::string &conversationId, const std::string &contactUri)
void setConversationPreferences(const std::string &accountId, const std::string &conversationId, const std::map< std::string, std::string > &prefs)
std::vector< std::map< std::string, std::string > > getActiveCalls(const std::string &accountId, const std::string &conversationId)
std::vector< std::string > getConversations(const std::string &accountId)
bool removeConversation(const std::string &accountId, const std::string &conversationId)
uint32_t countInteractions(const std::string &accountId, const std::string &conversationId, const std::string &toId, const std::string &fromId, const std::string &authorUri)
void updateConversationInfos(const std::string &accountId, const std::string &conversationId, const std::map< std::string, std::string > &infos)
std::vector< std::map< std::string, std::string > > getConversationRequests(const std::string &accountId)