aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------depends/odhtdb0
-rw-r--r--include/Channel.hpp1
-rw-r--r--include/MessageBoard.hpp2
-rw-r--r--src/Channel.cpp5
-rw-r--r--src/MessageBoard.cpp7
-rw-r--r--src/main.cpp10
6 files changed, 21 insertions, 4 deletions
diff --git a/depends/odhtdb b/depends/odhtdb
-Subproject 0ce0eaf93dea198a6b0f812c724be9bad74270b
+Subproject 9ef02410fda13bffd6ff2fc7172d19d1f7c25a9
diff --git a/include/Channel.hpp b/include/Channel.hpp
index 5f5699e..af6cbf2 100644
--- a/include/Channel.hpp
+++ b/include/Channel.hpp
@@ -47,6 +47,7 @@ namespace dchat
const std::vector<User*> getUsers() const;
OnlineUser* getUserByPublicKey(const odhtdb::Signature::PublicKey &publicKey);
const odhtdb::DatabaseNode& getNodeInfo() const;
+ Message* getLatestMessage();
// If timestamp is 0, then current time is used
void addLocalMessage(const std::string &msg, User *owner, u64 timestampSeconds = 0);
diff --git a/include/MessageBoard.hpp b/include/MessageBoard.hpp
index 861d195..acdaad4 100644
--- a/include/MessageBoard.hpp
+++ b/include/MessageBoard.hpp
@@ -24,6 +24,8 @@ namespace dchat
void processEvent(const sf::Event &event, Cache &cache);
void draw(sf::RenderWindow &window, Cache &cache);
+
+ Message* getLatestMessage();
private:
usize findPositionToInsertMessageByTimestamp(Message *message);
diff --git a/src/Channel.cpp b/src/Channel.cpp
index adcb9be..75d805c 100644
--- a/src/Channel.cpp
+++ b/src/Channel.cpp
@@ -118,6 +118,11 @@ namespace dchat
return databaseNodeInfo;
}
+ Message* Channel::getLatestMessage()
+ {
+ return messageBoard.getLatestMessage();
+ }
+
void Channel::addLocalMessage(const string &msg, User *owner, u64 timestampSeconds)
{
addLocalMessage(msg, owner, timestampSeconds, odhtdb::Hash());
diff --git a/src/MessageBoard.cpp b/src/MessageBoard.cpp
index 3e6532c..74afab8 100644
--- a/src/MessageBoard.cpp
+++ b/src/MessageBoard.cpp
@@ -442,4 +442,11 @@ namespace dchat
//textureSprite.setPosition(backgroundPos);
//window.draw(textureSprite);
}
+
+ Message* MessageBoard::getLatestMessage()
+ {
+ if(!messages.empty())
+ return messages.back();
+ return nullptr;
+ }
}
diff --git a/src/main.cpp b/src/main.cpp
index bc46240..ef4c20f 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -107,7 +107,7 @@ static void channelChangeChannelName(Channel *channel, const StringView data, co
// We dont care if there is more data to read (malicious packet), we already got all the data we need
}
-static void channelAddStoredMessage(Channel *channel, const odhtdb::Hash &requestHash, const odhtdb::Signature::PublicKey &creatorPublicKey, const StringView decryptedObject, u64 timestamp)
+static void channelAddStoredMessage(Channel *channel, const odhtdb::Hash &requestHash, const odhtdb::Signature::PublicKey &creatorPublicKey, const StringView decryptedObject, u64 timestamp, bool loadedFromCache)
{
User *user = channel->getUserByPublicKey(creatorPublicKey);
if(!user)
@@ -125,8 +125,10 @@ static void channelAddStoredMessage(Channel *channel, const odhtdb::Hash &reques
case ChannelDataType::ADD_MESSAGE:
{
string msg(decryptedData.data, decryptedData.size);
- channel->addLocalMessage(msg, user, ntp::NtpTimestamp::fromCombined(timestamp).seconds, requestHash);
- if(!windowFocused && channel->getLocalUser()->isOnlineUser())
+ Message *latestMessage = channel->getLatestMessage();
+ auto timestampSeconds = ntp::NtpTimestamp::fromCombined(timestamp).seconds;
+ channel->addLocalMessage(msg, user, timestampSeconds, requestHash);
+ if(!loadedFromCache && !windowFocused && channel->getLocalUser()->isOnlineUser() && (!latestMessage || (latestMessage && timestampSeconds >= latestMessage->timestampSeconds)))
{
auto onlineLocalUser = static_cast<OnlineLocalUser*>(channel->getLocalUser());
if(creatorPublicKey != onlineLocalUser->getPublicKey())
@@ -284,7 +286,7 @@ int main(int argc, char **argv)
{
if(*request.nodeHash == *channel->getNodeInfo().getRequestHash())
{
- channelAddStoredMessage(channel, *request.requestHash, *request.creatorPublicKey, StringView((const char*)request.decryptedData.data, request.decryptedData.size), request.timestamp);
+ channelAddStoredMessage(channel, *request.requestHash, *request.creatorPublicKey, StringView((const char*)request.decryptedData.data, request.decryptedData.size), request.timestamp, request.loadedFromCache);
if(channel == Channel::getCurrent())
lastFocusedTimer.restart();
return;