From 2a63dcd3f68f8e7366e0b523a4268e69e8e6a3cf Mon Sep 17 00:00:00 2001 From: Green Sky Date: Tue, 18 Apr 2023 17:32:16 +0200 Subject: [PATCH] fill in the friends section in tox interface --- solanaceae/core/tox_default_impl.cpp | 100 ++++++++++++++++++++++++++- solanaceae/core/tox_default_impl.hpp | 12 +++- solanaceae/core/tox_interface.hpp | 24 +++++-- 3 files changed, 126 insertions(+), 10 deletions(-) diff --git a/solanaceae/core/tox_default_impl.cpp b/solanaceae/core/tox_default_impl.cpp index e99d98c..ec5ae3e 100644 --- a/solanaceae/core/tox_default_impl.cpp +++ b/solanaceae/core/tox_default_impl.cpp @@ -1,4 +1,5 @@ #include "./tox_default_impl.hpp" +#include "tox/tox.h" #include Tox_Connection ToxDefaultImpl::toxSelfGetConnectionStatus(void) { @@ -93,17 +94,110 @@ Tox_Err_Friend_Delete ToxDefaultImpl::toxFriendDelete(uint32_t friend_number) { return err; } -std::tuple>, Tox_Err_Friend_Get_Public_Key> ToxDefaultImpl::toxFriendGetPublicKey(uint32_t friend_number) { +std::tuple, Tox_Err_Friend_By_Public_Key> ToxDefaultImpl::toxFriendByPublicKey(const std::vector& public_key) { + // TODO: check size + Tox_Err_Friend_By_Public_Key err = TOX_ERR_FRIEND_BY_PUBLIC_KEY_OK; + auto res = tox_friend_by_public_key(_tox, public_key.data(), &err); + if (err == TOX_ERR_FRIEND_BY_PUBLIC_KEY_OK) { + return {res, err}; + } else { + return {std::nullopt, err}; + } +} + +bool ToxDefaultImpl::toxFriendExists(uint32_t friend_number) { + return tox_friend_exists(_tox, friend_number); +} + +std::optional> ToxDefaultImpl::toxFriendGetPublicKey(uint32_t friend_number) { std::vector pub(TOX_PUBLIC_KEY_SIZE); Tox_Err_Friend_Get_Public_Key err = TOX_ERR_FRIEND_GET_PUBLIC_KEY_OK; tox_friend_get_public_key(_tox, friend_number, pub.data(), &err); if (err == TOX_ERR_FRIEND_GET_PUBLIC_KEY_OK) { - return {pub, err}; + return pub; } else { - return {std::nullopt, err}; + return std::nullopt; } } +std::optional ToxDefaultImpl::toxFriendGetLastOnline(uint32_t friend_number) { + Tox_Err_Friend_Get_Last_Online err = TOX_ERR_FRIEND_GET_LAST_ONLINE_OK; + auto res = tox_friend_get_last_online(_tox, friend_number, &err); + if (res == TOX_ERR_FRIEND_GET_LAST_ONLINE_OK) { + return res; + } else { + return std::nullopt; + } +} + +std::optional ToxDefaultImpl::toxFriendGetName(uint32_t friend_number) { + std::string name; + Tox_Err_Friend_Query err = TOX_ERR_FRIEND_QUERY_OK; + const auto size = tox_friend_get_name_size(_tox, friend_number, &err); + if (err != TOX_ERR_FRIEND_QUERY_OK) { + return std::nullopt; + } + name.resize(size); + tox_friend_get_name(_tox, friend_number, reinterpret_cast(name.data()), &err); + if (err == TOX_ERR_FRIEND_QUERY_OK) { + return name; + } else { + return std::nullopt; + } +} + +std::optional ToxDefaultImpl::toxFriendGetStatusMessage(uint32_t friend_number) { + std::string status; + Tox_Err_Friend_Query err = TOX_ERR_FRIEND_QUERY_OK; + const auto size = tox_friend_get_status_message_size(_tox, friend_number, &err); + if (err != TOX_ERR_FRIEND_QUERY_OK) { + return std::nullopt; + } + status.resize(size); + tox_friend_get_status_message(_tox, friend_number, reinterpret_cast(status.data()), &err); + if (err == TOX_ERR_FRIEND_QUERY_OK) { + return status; + } else { + return std::nullopt; + } +} + +std::optional ToxDefaultImpl::toxFriendGetStatus(uint32_t friend_number) { + Tox_Err_Friend_Query err = TOX_ERR_FRIEND_QUERY_OK; + auto res = tox_friend_get_status(_tox, friend_number, &err); + if (err == TOX_ERR_FRIEND_QUERY_OK) { + return res; + } else { + return std::nullopt; + } +} + +std::optional ToxDefaultImpl::toxFriendGetConnectionStatus(uint32_t friend_number) { + Tox_Err_Friend_Query err = TOX_ERR_FRIEND_QUERY_OK; + auto res = tox_friend_get_connection_status(_tox, friend_number, &err); + if (err == TOX_ERR_FRIEND_QUERY_OK) { + return res; + } else { + return std::nullopt; + } +} + +std::optional ToxDefaultImpl::toxFriendGetTyping(uint32_t friend_number) { + Tox_Err_Friend_Query err = TOX_ERR_FRIEND_QUERY_OK; + auto res = tox_friend_get_typing(_tox, friend_number, &err); + if (err == TOX_ERR_FRIEND_QUERY_OK) { + return res; + } else { + return std::nullopt; + } +} + +Tox_Err_Set_Typing ToxDefaultImpl::toxSelfSetTyping(uint32_t friend_number, bool typing) { + Tox_Err_Set_Typing err = TOX_ERR_SET_TYPING_OK; + tox_self_set_typing(_tox, friend_number, typing, &err); + return err; +} + std::tuple, Tox_Err_Friend_Send_Message> ToxDefaultImpl::toxFriendSendMessage(uint32_t friend_number, Tox_Message_Type type, std::string_view message) { Tox_Err_Friend_Send_Message err = TOX_ERR_FRIEND_SEND_MESSAGE_OK; auto res = tox_friend_send_message(_tox, friend_number, type, reinterpret_cast(message.data()), message.size(), &err); diff --git a/solanaceae/core/tox_default_impl.hpp b/solanaceae/core/tox_default_impl.hpp index babed20..f9f5afb 100644 --- a/solanaceae/core/tox_default_impl.hpp +++ b/solanaceae/core/tox_default_impl.hpp @@ -30,8 +30,16 @@ struct ToxDefaultImpl : public ToxI { std::tuple, Tox_Err_Friend_Add> toxFriendAdd(const std::vector& address, std::string_view message) override; std::tuple, Tox_Err_Friend_Add> toxFriendAddNorequest(const std::vector& public_key) override; Tox_Err_Friend_Delete toxFriendDelete(uint32_t friend_number) override; - std::tuple>, Tox_Err_Friend_Get_Public_Key> toxFriendGetPublicKey(uint32_t friend_number) override; - + std::tuple, Tox_Err_Friend_By_Public_Key> toxFriendByPublicKey(const std::vector& public_key) override; + bool toxFriendExists(uint32_t friend_number) override; + std::optional> toxFriendGetPublicKey(uint32_t friend_number) override; + std::optional toxFriendGetLastOnline(uint32_t friend_number) override; + std::optional toxFriendGetName(uint32_t friend_number) override; + std::optional toxFriendGetStatusMessage(uint32_t friend_number) override; + std::optional toxFriendGetStatus(uint32_t friend_number) override; + std::optional toxFriendGetConnectionStatus(uint32_t friend_number) override; + std::optional toxFriendGetTyping(uint32_t friend_number) override; + Tox_Err_Set_Typing toxSelfSetTyping(uint32_t friend_number, bool typing) override; std::tuple, Tox_Err_Friend_Send_Message> toxFriendSendMessage(uint32_t friend_number, Tox_Message_Type type, std::string_view message) override; // files diff --git a/solanaceae/core/tox_interface.hpp b/solanaceae/core/tox_interface.hpp index 882a937..ad4ee2d 100644 --- a/solanaceae/core/tox_interface.hpp +++ b/solanaceae/core/tox_interface.hpp @@ -15,6 +15,13 @@ struct ToxI_raw { virtual ~ToxI_raw(void) {} + // TODO: tox version + // size stuff + // options? (no) + // get save data? + // bootstrap + // add tcp relay + virtual Tox_Connection toxSelfGetConnectionStatus(void) = 0; virtual uint32_t toxIterationInterval(void) = 0; @@ -39,15 +46,22 @@ struct ToxI_raw { virtual std::tuple, Tox_Err_Friend_Add> toxFriendAdd(const std::vector& address, std::string_view message) = 0; virtual std::tuple, Tox_Err_Friend_Add> toxFriendAddNorequest(const std::vector& public_key) = 0; virtual Tox_Err_Friend_Delete toxFriendDelete(uint32_t friend_number) = 0; - virtual std::tuple>, Tox_Err_Friend_Get_Public_Key> toxFriendGetPublicKey(uint32_t friend_number) = 0; - - + virtual std::tuple, Tox_Err_Friend_By_Public_Key> toxFriendByPublicKey(const std::vector& public_key) = 0; + virtual bool toxFriendExists(uint32_t friend_number) = 0; + // tox_self_get_friend_list + virtual std::optional> toxFriendGetPublicKey(uint32_t friend_number) = 0; + virtual std::optional toxFriendGetLastOnline(uint32_t friend_number) = 0; + virtual std::optional toxFriendGetName(uint32_t friend_number) = 0; + virtual std::optional toxFriendGetStatusMessage(uint32_t friend_number) = 0; + virtual std::optional toxFriendGetStatus(uint32_t friend_number) = 0; + virtual std::optional toxFriendGetConnectionStatus(uint32_t friend_number) = 0; + virtual std::optional toxFriendGetTyping(uint32_t friend_number) = 0; + virtual Tox_Err_Set_Typing toxSelfSetTyping(uint32_t friend_number, bool typing) = 0; virtual std::tuple, Tox_Err_Friend_Send_Message> toxFriendSendMessage(uint32_t friend_number, Tox_Message_Type type, std::string_view message) = 0; + // files // TODO: array? make it type agnostic? virtual std::vector toxHash(const std::vector& data); - - // files virtual Tox_Err_File_Control toxFileControl(uint32_t friend_number, uint32_t file_number, Tox_File_Control control) = 0; virtual Tox_Err_File_Seek toxFileSeek(uint32_t friend_number, uint32_t file_number, uint64_t position) = 0; virtual std::tuple>, Tox_Err_File_Get> toxFileGetFileID(uint32_t friend_number, uint32_t file_number) = 0;