add api helpers for contact creation

workaround until i settle on a more generic api
This commit is contained in:
Green Sky
2025-07-31 18:58:49 +02:00
parent f1152e9410
commit 91ae0671b0
2 changed files with 85 additions and 0 deletions

View File

@@ -1,6 +1,7 @@
#include "./tox_contact_model2.hpp"
#include <solanaceae/util/time.hpp>
#include <solanaceae/util/utils.hpp>
#include <solanaceae/toxcore/tox_interface.hpp>
#include <solanaceae/contact/components.hpp>
@@ -172,6 +173,72 @@ bool ToxContactModel2::leave(Contact4 c, std::string_view reason) {
return false;
}
std::tuple<ContactHandle4, Tox_Err_Friend_Add> ToxContactModel2::createContactFriend(
std::string_view tox_id,
std::string_view message
) {
auto [id_opt, err_r] = _t.toxFriendAdd(
hex2bin(tox_id),
message
);
if (!id_opt.has_value()) {
return std::make_tuple(ContactHandle4{}, err_r);
}
auto contact = getContactFriend(id_opt.value());
return std::make_tuple(contact, err_r);
}
std::tuple<ContactHandle4, Tox_Err_Group_Join> ToxContactModel2::createContactGroupJoin(
std::string_view chat_id,
std::string_view self_name,
std::string_view password
) {
auto [id_opt, err_r] = _t.toxGroupJoin(
hex2bin(chat_id),
self_name,
password
);
if (!id_opt.has_value()) {
return std::make_tuple(ContactHandle4{}, err_r);
}
auto contact = getContactGroup(id_opt.value());
return std::make_tuple(contact, err_r);
}
std::tuple<ContactHandle4, Tox_Err_Group_New, Tox_Err_Group_Set_Password> ToxContactModel2::createContactGroupNew(
Tox_Group_Privacy_State privacy_state,
std::string_view name,
std::string_view self_name,
std::string_view password
) {
Tox_Err_Group_Set_Password err_pw = Tox_Err_Group_Set_Password::TOX_ERR_GROUP_SET_PASSWORD_OK;
auto [new_id_opt, err_r] = _t.toxGroupNew(
privacy_state,
name,
self_name
);
if (!new_id_opt.has_value() || err_r != TOX_ERR_GROUP_NEW_OK) {
return std::make_tuple(ContactHandle4{}, err_r, err_pw);
}
auto contact = getContactGroup(new_id_opt.value());
if (!static_cast<bool>(contact)) {
return std::make_tuple(contact, err_r, err_pw);
}
if (!password.empty()) {
// TODO: error handling, delete new group if pw error?
err_pw = _t.toxGroupSetPassword(new_id_opt.value(), password);
}
return std::make_tuple(contact, err_r, err_pw);
}
ContactHandle4 ToxContactModel2::getContactFriend(uint32_t friend_number) {
auto& cr = _cs.registry();
Contact4 c {entt::null};

View File

@@ -35,6 +35,24 @@ class ToxContactModel2 : public ContactModel4I, public ToxEventI {
bool leave(Contact4 c, std::string_view reason) override;
public: // api until i have a better idea
std::tuple<ContactHandle4, Tox_Err_Friend_Add> createContactFriend(
std::string_view tox_id,
std::string_view message
);
std::tuple<ContactHandle4, Tox_Err_Group_Join> createContactGroupJoin(
std::string_view chat_id,
std::string_view self_name,
std::string_view password
);
std::tuple<ContactHandle4, Tox_Err_Group_New, Tox_Err_Group_Set_Password> createContactGroupNew(
Tox_Group_Privacy_State privacy_state,
std::string_view name,
std::string_view self_name,
std::string_view password
);
public: // util for tox code
// also creates if non existant
ContactHandle4 getContactFriend(uint32_t friend_number);