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