#include "./ngc_hs1.h" #include #include #include #include struct _GroupID { std::array data; bool operator<(const _GroupID& rhs) const { for (size_t i = 0; i < data.size(); i++) { if (data[i] > rhs.data[i]) { return false; } } return true; } }; struct _PeerID { std::array data; bool operator<(const _PeerID& rhs) const { for (size_t i = 0; i < data.size(); i++) { if (data[i] > rhs.data[i]) { return false; } } return true; } }; struct NGC_HS1 { void* temp; NGC_HS1_options options; // key - key - key - value store // group pubkey - peer pubkey - msg_id - message(type + text) struct Message { uint32_t msg_id{}; Tox_Message_Type type; std::string text; }; struct Messages { std::map dict; std::list order; // ordered list of message ids void append(uint32_t msg_id, Tox_Message_Type type, const std::string& text) { order.push_back(msg_id); // overwrites auto& new_msg = dict[msg_id]; new_msg.msg_id = msg_id; new_msg.type = type; new_msg.text = text; } }; std::map<_GroupID, std::map<_PeerID, Messages>> history; }; NGC_HS1* NGC_HS1_new(const struct NGC_HS1_options* options) { NGC_HS1* context = new NGC_HS1; context->options = *options; return context; } void NGC_HS1_kill(NGC_HS1* ngc_hs1_ctx) { delete ngc_hs1_ctx; } void NGC_HS1_iterate(Tox *tox, NGC_HS1* ngc_hs1_ctx/*, void *user_data*/) { } bool NGC_HS1_shim_group_send_message( const Tox *tox, NGC_HS1* ngc_hs1_ctx, uint32_t group_number, Tox_Message_Type type, const uint8_t *message, size_t length, uint32_t *message_id, Tox_Err_Group_Send_Message *error ) { uint32_t* msg_id_ptr = message_id; uint32_t msg_id_placeholder = 0; if (msg_id_ptr == nullptr) { msg_id_ptr = &msg_id_placeholder; } bool ret = tox_group_send_message(tox, group_number, type, message, length, msg_id_ptr, error); NGC_HS1_record_own_message(tox, ngc_hs1_ctx, group_number, type, message, length, *msg_id_ptr); return ret; } // record own msg void NGC_HS1_record_own_message( const Tox *tox, NGC_HS1* ngc_hs1_ctx, uint32_t group_number, Tox_Message_Type type, const uint8_t *message, size_t length, uint32_t message_id ) { printf("record_own_message %u\n", message_id); // get group id _GroupID g_id{}; { // TODO: error tox_group_get_chat_id(tox, group_number, g_id.data.data(), nullptr); } // get peer id _PeerID p_id{}; { // TODO: error tox_group_self_get_public_key(tox, group_number, p_id.data.data(), nullptr); } ngc_hs1_ctx->history[g_id]; }