From b18424c5b128e9cf3cb8c99705c7cc3302e8d4cb 2012-10-18 09:33:44 From: Jan Kaluza Date: 2012-10-18 09:33:44 Subject: [PATCH] Forward message timestamps --- diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 1c3f8c4850fb089284e030f4b345b405861f22e4..06df61eee007e8070bd65b3440437a67ea3cb511 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -933,14 +933,21 @@ static void conv_write_im(PurpleConversation *conv, const char *who, const char xhtml_ = ""; } + std::string timestamp; + if (mtime && (unsigned long) time(NULL)-10 > (unsigned long) mtime/* && (unsigned long) time(NULL) - 31536000 < (unsigned long) mtime*/) { + char buf[80]; + strftime(buf, sizeof(buf), "%Y%m%dT%H%M%S", gmtime(&mtime)); + timestamp = buf; + } + // LOG4CXX_INFO(logger, "Received message body='" << message_ << "' xhtml='" << xhtml_ << "'"); if (purple_conversation_get_type_wrapped(conv) == PURPLE_CONV_TYPE_IM) { - np->handleMessage(np->m_accounts[account], w, message_, "", xhtml_); + np->handleMessage(np->m_accounts[account], w, message_, "", xhtml_, timestamp); } else { LOG4CXX_INFO(logger, "Received message body='" << message_ << "' name='" << purple_conversation_get_name_wrapped(conv) << "' " << w); - np->handleMessage(np->m_accounts[account], purple_conversation_get_name_wrapped(conv), message_, w, xhtml_); + np->handleMessage(np->m_accounts[account], purple_conversation_get_name_wrapped(conv), message_, w, xhtml_, timestamp); } } diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 3d5c87da9399ede805c101c09e67858c5eb5d278..6c4ababdf0fcf0ef020d6f2182cfbfd8356d4ba8 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -110,7 +110,7 @@ class NetworkPlugin { /// \param message Plain text message. /// \param nickname Nickname of buddy in room. Empty if it's normal chat message. /// \param xhtml XHTML message. - void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = "", const std::string &xhtml = ""); + void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = "", const std::string &xhtml = "", const std::string ×tamp = ""); /// Call this function when subject in room changed. /// \param user XMPP JID of user for which this event occurs. You can get it from NetworkPlugin::handleLoginRequest(). (eg. "user%gmail.com@xmpp.domain.tld") diff --git a/include/transport/protocol.proto b/include/transport/protocol.proto index de423598cd25aa592640b87caf995a09fec4abf1..4475b70764d336804eac13580ef9918afe359ac1 100644 --- a/include/transport/protocol.proto +++ b/include/transport/protocol.proto @@ -69,6 +69,7 @@ message ConversationMessage { required string message = 3; optional string nickname = 4; optional string xhtml = 5; + optional string timestamp = 6; } message Room { diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index fccd33f3e6396230bdcb67043103c9c110f62bef..b562232630ffd57e6d9b724178d0cf02b0cb48d4 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -82,13 +82,14 @@ void NetworkPlugin::sendConfig(const PluginConfig &cfg) { send(message); } -void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &nickname, const std::string &xhtml) { +void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &nickname, const std::string &xhtml, const std::string ×tamp) { pbnetwork::ConversationMessage m; m.set_username(user); m.set_buddyname(legacyName); m.set_message(msg); m.set_nickname(nickname); m.set_xhtml(xhtml); + m.set_timestamp(timestamp); std::string message; m.SerializeToString(&message); diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 361ee530da704caf201c7cff238b0a3380e8c459..2e412b6910da989170b33d8a898e7bd5723fa24e 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -13,10 +13,10 @@ admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any users_per_backend=10 -#backend=../..//backends/libpurple/spectrum2_libpurple_backend +backend=../..//backends/libpurple/spectrum2_libpurple_backend #backend=../../backends/twitter/spectrum2_twitter_backend -backend=/home/hanzz/code/libtransport/backends/libcommuni/spectrum2_libcommuni_backend -protocol=prpl-icq +#backend=/home/hanzz/code/libtransport/backends/libcommuni/spectrum2_libcommuni_backend +protocol=prpl-jabber #protocol=prpl-msn #protocol=any #protocol=prpl-icq diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 177469f836d8c5acce76843efe3efd81517ecf39..6849a023bd6cbf6be7d1a2148e890b1548f8fcac 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -628,6 +628,11 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool msg->addPayload(boost::make_shared(payload.xhtml())); } + if (!payload.timestamp().empty()) { + boost::posix_time::ptime timestamp = boost::posix_time::from_iso_string(payload.timestamp()); + msg->addPayload(boost::make_shared(timestamp)); + } + // Create new Conversation if it does not exist NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname()); if (!conv) {