diff --git a/solanaceae/tox_contacts/tox_contact_model2.cpp b/solanaceae/tox_contacts/tox_contact_model2.cpp index 067f2fb..6316cff 100644 --- a/solanaceae/tox_contacts/tox_contact_model2.cpp +++ b/solanaceae/tox_contacts/tox_contact_model2.cpp @@ -173,6 +173,55 @@ bool ToxContactModel2::leave(Contact4 c, std::string_view reason) { return false; } +bool ToxContactModel2::invite(Contact4 c, Contact4 to) { + if (!canInvite(c, to)) { + std::cerr << "TCM error: could not invite\n"; + return false; + } + + auto& cr = _cs.registry(); + + { // friend online check + const auto* cs = cr.try_get(c); + if (!cs || cs->state == Contact::Components::ConnectionState::disconnected) { + std::cerr << "TCM error: friend offline, could not invite\n"; + return false; + } + } + + if (cr.all_of(to)) { + auto err = _t.toxGroupInviteFriend( + cr.get(to).group_number, + cr.get(c).friend_number + ); + + std::cerr << "TCM: invited (" << err << ")\n"; + + return err == Tox_Err_Group_Invite_Friend::TOX_ERR_GROUP_INVITE_FRIEND_OK; + } + + std::cerr << "TCM error: unimplemented invite branch\n"; + return false; +} + +bool ToxContactModel2::canInvite(Contact4 c, Contact4 to) { + auto& cr = _cs.registry(); + + // c needs to be friend (online) + if (!cr.all_of(c)) { + return false; + } + + // to needs to be ngc or conf + if (!cr.any_of< + Contact::Components::ToxGroupEphemeral + >(to)) { + return false; + } + + return true; // should cover all cases +} + std::tuple ToxContactModel2::createContactFriend( std::string_view tox_id, std::string_view message diff --git a/solanaceae/tox_contacts/tox_contact_model2.hpp b/solanaceae/tox_contacts/tox_contact_model2.hpp index fe01998..46d8b94 100644 --- a/solanaceae/tox_contacts/tox_contact_model2.hpp +++ b/solanaceae/tox_contacts/tox_contact_model2.hpp @@ -35,6 +35,9 @@ class ToxContactModel2 : public ContactModel4I, public ToxEventI { bool leave(Contact4 c, std::string_view reason) override; + bool invite(Contact4 c, Contact4 to) override; + bool canInvite(Contact4 c, Contact4 to) override; + public: // api until i have a better idea std::tuple createContactFriend( std::string_view tox_id,