fix(@desktop/cpp): Implement StatusGoQt::sendMessage() function
Issue #7848
This commit is contained in:
parent
e2697ae5aa
commit
d57f493443
|
@ -24,6 +24,7 @@ public:
|
|||
|
||||
Q_INVOKABLE void init(const QString& sectionId);
|
||||
Q_INVOKABLE void setCurrentChatIndex(int index);
|
||||
Q_INVOKABLE void sendMessage(const QString &message) const;
|
||||
|
||||
signals:
|
||||
void chatsModelChanged();
|
||||
|
|
|
@ -8,6 +8,7 @@ Item {
|
|||
id: root
|
||||
|
||||
required property var selectedChat
|
||||
required property var chatSectionController
|
||||
|
||||
ColumnLayout {
|
||||
anchors.left: parent.left
|
||||
|
@ -37,5 +38,18 @@ Item {
|
|||
Label {
|
||||
text: "is muted: %1".arg(root.selectedChat.muted)
|
||||
}
|
||||
|
||||
Row {
|
||||
TextField {
|
||||
id: chatInput
|
||||
width: root.width / 2
|
||||
}
|
||||
|
||||
Button {
|
||||
id: sendMessageButton
|
||||
text: "Send"
|
||||
onClicked: chatSectionController.sendMessage(chatInput.text)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ PanelAndContentBase {
|
|||
Layout.fillHeight: true
|
||||
|
||||
selectedChat: chatSectionController.currentChat
|
||||
chatSectionController: chatSectionController
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
#include "Status/ChatSection/ChatSectionController.h"
|
||||
|
||||
#include <StatusGo/Messages/InputMessage.h>
|
||||
#include <StatusGo/Messages/MessagesApi.h>
|
||||
#include <StatusGo/Metadata/api_response.h>
|
||||
|
||||
using namespace Status::ChatSection;
|
||||
|
||||
ChatSectionController::ChatSectionController()
|
||||
|
@ -39,3 +43,18 @@ void ChatSectionController::setCurrentChatIndex(int index)
|
|||
m_currentChat = chat;
|
||||
emit currentChatChanged();
|
||||
}
|
||||
|
||||
void ChatSectionController::sendMessage(const QString &message) const
|
||||
{
|
||||
namespace Messages = StatusGo::Messages;
|
||||
auto chatMessage = Messages::InputMessage::createTextMessage(message, m_currentChat->id());
|
||||
try {
|
||||
Messages::sendMessage(chatMessage);
|
||||
}
|
||||
catch(const StatusGo::CallPrivateRpcError& rpcError)
|
||||
{
|
||||
qWarning() << "Can't send message " << message
|
||||
<< " to id " << m_currentChat->id()
|
||||
<< ", error: " << rpcError.errorResponse().error.message.c_str();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -106,6 +106,12 @@ target_sources(${PROJECT_NAME}
|
|||
src/StatusGo/Chat/ChatDto.h
|
||||
src/StatusGo/Chat/ChatDto.cpp
|
||||
|
||||
src/StatusGo/Messages/InputMessage.h
|
||||
src/StatusGo/Messages/InputMessage.cpp
|
||||
src/StatusGo/Messages/MessagesApi.h
|
||||
src/StatusGo/Messages/MessagesApi.cpp
|
||||
src/StatusGo/Messages/MessageDto.h
|
||||
|
||||
src/StatusGo/Messenger/Service.h
|
||||
src/StatusGo/Messenger/Service.cpp
|
||||
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
#include "InputMessage.h"
|
||||
|
||||
#include <Helpers/JsonMacros.h>
|
||||
#include <Helpers/conversions.h>
|
||||
|
||||
using namespace Status::StatusGo;
|
||||
|
||||
Messages::InputMessage Messages::InputMessage::createTextMessage(const QString &message, const QString &chatId)
|
||||
{
|
||||
return {message, chatId, ContentType::Text};
|
||||
}
|
||||
|
||||
void Messages::to_json(json &j, const InputMessage &d)
|
||||
{
|
||||
j = {
|
||||
{"chatId", d.chatId},
|
||||
{"text", d.messageText},
|
||||
{"responseTo", d.replyTo},
|
||||
{"ensName", d.ensName},
|
||||
{"contentType", d.contentType},
|
||||
};
|
||||
}
|
||||
|
||||
void Messages::from_json(const json &j, InputMessage &d)
|
||||
{
|
||||
STATUS_READ_NLOHMAN_JSON_PROPERTY(chatId)
|
||||
STATUS_READ_NLOHMAN_JSON_PROPERTY(messageText, "text")
|
||||
STATUS_READ_NLOHMAN_JSON_PROPERTY(replyTo, "responseTo")
|
||||
STATUS_READ_NLOHMAN_JSON_PROPERTY(ensName)
|
||||
STATUS_READ_NLOHMAN_JSON_PROPERTY(contentType)
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
#pragma once
|
||||
|
||||
#include "MessageDto.h"
|
||||
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
#include <QString>
|
||||
|
||||
using json = nlohmann::json;
|
||||
|
||||
namespace Status::StatusGo::Messages
|
||||
{
|
||||
|
||||
struct InputMessage
|
||||
{
|
||||
QString messageText;
|
||||
QString chatId;
|
||||
ContentType contentType = ContentType::Unknown;
|
||||
QString replyTo; // Id of the message that we are replying to
|
||||
QString ensName; // Ens name of the sender
|
||||
|
||||
static InputMessage createTextMessage(const QString &message, const QString &chatId);
|
||||
};
|
||||
|
||||
void to_json(json& j, const InputMessage& d);
|
||||
void from_json(const json& j, InputMessage& d);
|
||||
|
||||
} // namespace Status::StatusGo::Messages
|
|
@ -0,0 +1,25 @@
|
|||
#pragma once
|
||||
|
||||
namespace Status::StatusGo::Messages
|
||||
{
|
||||
|
||||
/// @see status-go's protocol/protobuf/chat_message.proto ContentType
|
||||
enum class ContentType
|
||||
{
|
||||
Unknown = 0,
|
||||
Text = 1,
|
||||
Sticker = 2,
|
||||
Status = 3,
|
||||
Emoji = 4,
|
||||
TransactionCommand = 5,
|
||||
// 6 - private
|
||||
Image = 7,
|
||||
Audio = 8,
|
||||
Community = 9,
|
||||
// 10 - private
|
||||
ContactRequest = 11,
|
||||
DiscordMessage = 12,
|
||||
IdentityVerification = 13
|
||||
};
|
||||
|
||||
} // namespace Status::StatusGo::Messages
|
|
@ -0,0 +1,21 @@
|
|||
#include "MessagesApi.h"
|
||||
#include "Metadata/api_response.h"
|
||||
#include "InputMessage.h"
|
||||
#include "Utils.h"
|
||||
|
||||
#include <Helpers/conversions.h>
|
||||
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
using json = nlohmann::json;
|
||||
|
||||
using namespace Status::StatusGo;
|
||||
|
||||
void Messages::sendMessage(const InputMessage &message)
|
||||
{
|
||||
std::vector<json> params{message};
|
||||
json inputJson = {{"jsonrpc", "2.0"}, {"method", "wakuext_sendChatMessage"}, {"params", params}};
|
||||
const auto result = Utils::statusGoCallPrivateRPC(inputJson.dump().c_str());
|
||||
const auto resultJson = json::parse(result);
|
||||
checkPrivateRpcCallResultAndReportError(resultJson);
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
#pragma once
|
||||
|
||||
namespace Status::StatusGo::Messages
|
||||
{
|
||||
class InputMessage;
|
||||
|
||||
/// \brief Sends chat message
|
||||
void sendMessage(const InputMessage &message);
|
||||
|
||||
} // namespace Status::StatusGo::Messages
|
|
@ -1,11 +1,13 @@
|
|||
#include <StatusGo/Messenger/Service.h>
|
||||
|
||||
#include <Onboarding/Accounts/AccountsService.h>
|
||||
|
||||
#include <StatusGo/SignalsManager.h>
|
||||
|
||||
#include <ScopedTestAccount.h>
|
||||
|
||||
#include <StatusGo/Messenger/Service.h>
|
||||
#include <StatusGo/Messages/InputMessage.h>
|
||||
#include <StatusGo/Messages/MessagesApi.h>
|
||||
#include <StatusGo/Metadata/api_response.h>
|
||||
#include <StatusGo/SignalsManager.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace fs = std::filesystem;
|
||||
|
@ -36,4 +38,11 @@ TEST(MessagingApi, TestStartMessaging)
|
|||
ASSERT_TRUE(nodeReady);
|
||||
}
|
||||
|
||||
/// Simple test to validate sendChatMessage rpc function. \todo Expand it later.
|
||||
TEST(MessagingApi, TestSendMessage)
|
||||
{
|
||||
const auto message = StatusGo::Messages::InputMessage::createTextMessage("Hello Status", "someChatId");
|
||||
EXPECT_THROW( StatusGo::Messages::sendMessage(message), StatusGo::CallPrivateRpcError );
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
Loading…
Reference in New Issue