diff --git a/backends/libircclient-qt/main.cpp b/backends/libircclient-qt/main.cpp index c62c59de..01b9e32d 100644 --- a/backends/libircclient-qt/main.cpp +++ b/backends/libircclient-qt/main.cpp @@ -43,7 +43,11 @@ class IRCNetworkPlugin : public NetworkPlugin { } void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message) { - + std::cout << "MESSAGE " << user << " " << legacyName << "\n"; + if (m_sessions[user] == NULL) + return; + m_sessions[user]->message(QString::fromStdString(legacyName), QString::fromStdString(message)); + std::cout << "SENT\n"; } void handleJoinRoomRequest(const std::string &user, const std::string &room, const std::string &nickname, const std::string &password) { diff --git a/backends/libircclient-qt/session.cpp b/backends/libircclient-qt/session.cpp index 7142453c..6777cd5c 100644 --- a/backends/libircclient-qt/session.cpp +++ b/backends/libircclient-qt/session.cpp @@ -116,10 +116,11 @@ void MyIrcBuffer::on_kicked(const QString& origin, const QString& nick, const QS qDebug() << "kicked:" << receiver() << origin << nick << message; } -void MyIrcBuffer::on_messageReceived(const QString& origin, const QString& message, Irc::Buffer::MessageFlags flags) -{ - qDebug() << "message received:" << receiver() << origin << message - << (flags & Irc::Buffer::IdentifiedFlag ? "(identified!)" : "(not identified)"); +void MyIrcBuffer::on_messageReceived(const QString& origin, const QString& message, Irc::Buffer::MessageFlags flags) { + qDebug() << "message received:" << receiver() << origin << message << (flags & Irc::Buffer::IdentifiedFlag ? "(identified!)" : "(not identified)"); + if (!receiver().startsWith("#") && (flags & Irc::Buffer::EchoFlag)) + return; + np->handleMessage(user, receiver().toStdString(), message.toStdString(), origin.toStdString()); } void MyIrcBuffer::on_noticeReceived(const QString& origin, const QString& notice, Irc::Buffer::MessageFlags flags) diff --git a/include/transport/conversation.h b/include/transport/conversation.h index 8192d61c..cec46999 100644 --- a/include/transport/conversation.h +++ b/include/transport/conversation.h @@ -41,7 +41,7 @@ class Conversation { const std::string &getLegacyName() { return m_legacyName; } - void handleMessage(boost::shared_ptr &message); + void handleMessage(boost::shared_ptr &message, const std::string &nickname = ""); void handleParticipantChanged(const std::string &nickname, int flag); void setNickname(const std::string &nickname) { m_nickname = nickname; @@ -57,6 +57,7 @@ class Conversation { ConversationManager *m_conversationManager; std::string m_legacyName; std::string m_nickname; + int m_muc; }; } diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index bf8bb021..caa8579f 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -48,7 +48,7 @@ class NetworkPlugin { void handleDisconnected(const std::string &user, const std::string &legacyName, int error, const std::string &message); - void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message); + void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = ""); void handleRoomChanged(const std::string &user, const std::string &room, const std::string &nickname); diff --git a/src/conversation.cpp b/src/conversation.cpp index a8bf2e05..25574771 100644 --- a/src/conversation.cpp +++ b/src/conversation.cpp @@ -31,26 +31,48 @@ namespace Transport { Conversation::Conversation(ConversationManager *conversationManager, const std::string &legacyName) : m_conversationManager(conversationManager) { m_legacyName = legacyName; m_conversationManager->setConversation(this); + m_muc = -1; } Conversation::~Conversation() { m_conversationManager->unsetConversation(this); } -void Conversation::handleMessage(boost::shared_ptr &message) { +void Conversation::handleMessage(boost::shared_ptr &message, const std::string &nickname) { + if (m_muc == -1) + m_muc = message->getType() != Swift::Message::Groupchat; + if (m_muc == 0) { + message->setType(Swift::Message::Groupchat); + } + else { + message->setType(Swift::Message::Chat); + } if (message->getType() != Swift::Message::Groupchat) { + message->setTo(m_conversationManager->getUser()->getJID().toBare()); - Buddy *buddy = m_conversationManager->getUser()->getRosterManager()->getBuddy(m_legacyName); - if (buddy) { - std::cout << m_legacyName << " 222222\n"; - message->setFrom(buddy->getJID()); + // normal message + if (nickname.empty()) { + Buddy *buddy = m_conversationManager->getUser()->getRosterManager()->getBuddy(m_legacyName); + if (buddy) { + std::cout << m_legacyName << " 222222\n"; + message->setFrom(buddy->getJID()); + } + else { + std::cout << m_legacyName << " 1111111\n"; + // TODO: escape from and setFrom + } } + // PM message else { - std::cout << m_legacyName << " 1111111\n"; - // TODO: escape from and setFrom + message->setFrom(Swift::JID(nickname, m_conversationManager->getComponent()->getJID().toBare(), "user")); } m_conversationManager->getComponent()->getStanzaChannel()->sendMessage(message); } + else { + message->setTo(m_conversationManager->getUser()->getJID().toString()); + message->setFrom(Swift::JID(m_legacyName, m_conversationManager->getComponent()->getJID().toBare(), nickname)); + m_conversationManager->getComponent()->getStanzaChannel()->sendMessage(message); + } } void Conversation::handleParticipantChanged(const std::string &nick, int flag) { diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index f41cfab2..a0da1cd7 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -55,11 +55,12 @@ NetworkPlugin::~NetworkPlugin() { delete m_factories; } -void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg) { +void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &nickname) { pbnetwork::ConversationMessage m; m.set_username(user); m.set_buddyname(legacyName); m.set_message(msg); + m.set_nickname(nickname); std::string message; m.SerializeToString(&message); diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 1a0c2705..02073f2c 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -255,14 +255,24 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data) { if (!user) return; + boost::shared_ptr msg(new Swift::Message()); + msg->setBody(payload.message()); + NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname()); if (!conv) { conv = new NetworkConversation(user->getConversationManager(), payload.buddyname()); conv->onMessageToSend.connect(boost::bind(&NetworkPluginServer::handleMessageReceived, this, _1, _2)); } - boost::shared_ptr msg(new Swift::Message()); - msg->setBody(payload.message()); - conv->handleMessage(msg); + else { + // groupchat messages can be created only for conversations initiated from XMPP side, not from legacy network side. + // ie. you can't create Groupchat conversation from legacy network side. + if (!payload.nickname().empty()) { + msg->setType(Swift::Message::Groupchat); + } + } + + + conv->handleMessage(msg, payload.nickname()); } void NetworkPluginServer::handleDataRead(boost::shared_ptr c, const Swift::ByteArray &data) { @@ -423,7 +433,7 @@ void NetworkPluginServer::handleUserDestroyed(User *user) { void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost::shared_ptr &msg) { pbnetwork::ConversationMessage m; - m.set_username(conv->getConversationManager()->getUser()->getUserInfo().uin); + m.set_username(conv->getConversationManager()->getUser()->getJID().toBare()); m.set_buddyname(conv->getLegacyName()); m.set_message(msg->getBody()); diff --git a/src/pbnetwork.proto b/src/pbnetwork.proto index 5fb332b4..e5c29701 100644 --- a/src/pbnetwork.proto +++ b/src/pbnetwork.proto @@ -37,6 +37,7 @@ message ConversationMessage { required string userName = 1; required string buddyName = 2; required string message = 3; + optional string nickname = 4; } message Room {