From d27375162d8e910d6a9742fdb68c17e8f329a546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Ortega=20Froysa?= Date: Fri, 17 Nov 2017 17:20:05 +0100 Subject: [PATCH] Move message functions to own file. --- src/channel.cpp | 55 -------------------------------- src/message.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 55 deletions(-) create mode 100644 src/message.cpp diff --git a/src/channel.cpp b/src/channel.cpp index 08da9b5..6034c39 100644 --- a/src/channel.cpp +++ b/src/channel.cpp @@ -101,58 +101,3 @@ int NeoComm_leave_channel(const char *channel_name) { channels.erase(s_chan_name); return 1; } - -struct message *NeoComm_get_next_message(const char *channel_name) { - const std::string s_chan_name(channel_name); - if(channels[s_chan_name].msgs.empty()) - return NULL; - const dht::ImMessage *new_msg = &channels[s_chan_name].msgs.front(); - struct message *msg = - static_cast(malloc(sizeof(struct message))); - - *msg = { - /*.msg =*/ new_msg->msg.c_str(), - /*.sent =*/ new_msg->date, - /*.from =*/ { - /*.nick =*/ "DEFAULT", // TODO: Implement this!!! - /*.hash =*/ new_msg->from.to_c_str() - } - }; - - return msg; -} - -time_t NeoComm_send_message(const char *channel_name, const char *message) { - if(not node.isRunning()) - { - add_error("NeoComm must be initialized."); - return 0; - } - const dht::InfoHash chan_hash = channels[channel_name].hash; - const time_t now = - std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); - - if(channels.find(channel_name) == channels.end()) - { - add_error("Not connected to channel"); - return 0; - } - sent_messages[now] = NC_PENDING; - node.putSigned(chan_hash, - dht::ImMessage(rand_id(rand_dev), message, now), [&](bool sent) { - sent_messages[now] = sent ? NC_GOOD : NC_BAD; - }); - return now; -} - -// TODO: Devise a way so that the message can be resent. -int NeoComm_check_message(const time_t token) { - if(sent_messages.find(token) == sent_messages.end()) - { - add_error("No message found with that token."); - return 0; - } - const int status = sent_messages[token]; - sent_messages.erase(token); - return status; -} diff --git a/src/message.cpp b/src/message.cpp new file mode 100644 index 0000000..c7364d4 --- /dev/null +++ b/src/message.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2017 Ortega Froysa, Nicolás + * Author: Ortega Froysa, Nicolás + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "neocomm.h" + +#include "globals.hpp" +#include "error.hpp" + +std::map channels; + +static std::mt19937_64 rand_dev { dht::crypto::random_device{}() }; +static std::uniform_int_distribution rand_id; + +static std::map sent_messages; + +struct message *NeoComm_get_next_message(const char *channel_name) { + const std::string s_chan_name(channel_name); + if(channels[s_chan_name].msgs.empty()) + return NULL; + const dht::ImMessage *new_msg = &channels[s_chan_name].msgs.front(); + struct message *msg = + static_cast(malloc(sizeof(struct message))); + + *msg = { + /*.msg =*/ new_msg->msg.c_str(), + /*.sent =*/ new_msg->date, + /*.from =*/ { + /*.nick =*/ "DEFAULT", // TODO: Implement this!!! + /*.hash =*/ new_msg->from.to_c_str() + } + }; + + return msg; +} + +time_t NeoComm_send_message(const char *channel_name, const char *message) { + if(not node.isRunning()) + { + add_error("NeoComm must be initialized."); + return 0; + } + const dht::InfoHash chan_hash = channels[channel_name].hash; + const time_t now = + std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + + if(channels.find(channel_name) == channels.end()) + { + add_error("Not connected to channel"); + return 0; + } + sent_messages[now] = NC_PENDING; + node.putSigned(chan_hash, + dht::ImMessage(rand_id(rand_dev), message, now), [&](bool sent) { + sent_messages[now] = sent ? NC_GOOD : NC_BAD; + }); + return now; +} + +// TODO: Devise a way so that the message can be resent. +int NeoComm_check_message(const time_t token) { + if(sent_messages.find(token) == sent_messages.end()) + { + add_error("No message found with that token."); + return 0; + } + const int status = sent_messages[token]; + sent_messages.erase(token); + return status; +}