diff --git a/src/app.cpp b/src/app.cpp
index 6d65ba6..1a100f6 100644
--- a/src/app.cpp
+++ b/src/app.cpp
@@ -555,7 +555,6 @@ void App::updateOutputContainer(Wt::Json::Object conversation) {
auto containerLayout = (Wt::WVBoxLayout*)contentContainer_->layout();
auto outputLayoutItem = containerLayout->itemAt(1);
auto outputContainer = (Wt::WContainerWidget*)outputLayoutItem->widget();
- outputContainer->clear();
outputContainer->setOverflow(Wt::Overflow::Auto);
renderChatLines(conversation, outputContainer);
}
@@ -574,20 +573,28 @@ void App::renderChatLines(Wt::Json::Object conversation, Wt::WContainerWidget* o
void App::renderChatLine(Wt::Json::Object &line, Wt::Json::Object conversation, Wt::WContainerWidget* outputContainer) {
std::string writer = getChatLineWriter(line, conversation);
Wt::WWebWidget* item;
+ auto id = (std::string)line["id"];
+ for (const auto widget: outputContainer->children()) {
+ if (widget->attributeValue("dummy") == id) {
+ return;
+ }
+ }
if ((std::string)line["type"] == "text") {
- item = createTextElement(writer, (std::string)line["string"], outputContainer);
+ item = createTextElement(writer, (std::string)line["string"], outputContainer, id);
} else if ((std::string)line["type"] == "image") {
- item = createImageElement(line, writer, outputContainer);
+ item = createImageElement(line, writer, outputContainer, id);
} else {
item = new Wt::WText("");
}
item->setInline(false);
}
-Wt::WWebWidget* App::createTextElement(const std::string& writer, const std::string& text, Wt::WContainerWidget* outputContainer) {
+Wt::WWebWidget* App::createTextElement(const std::string& writer, const std::string& text, Wt::WContainerWidget* outputContainer, std::string id) {
std::string outputText = replaceSmileys(text);
Wt::WString output = Wt::WString("{1}: {2}").arg(writer).arg(outputText);
- return outputContainer->addNew(output);
+ auto line = outputContainer->addNew(output);
+ line->setAttributeValue("dummy", id);
+ return line;
}
void App::createImprintContainer(Wt::WVBoxLayout *containerLayout) {
@@ -637,7 +644,7 @@ void App::createImprintContainer(Wt::WVBoxLayout *containerLayout) {
});
}
-Wt::WWebWidget* App::createImageElement(Wt::Json::Object& line, const std::string& writer, Wt::WContainerWidget* outputContainer) {
+Wt::WWebWidget* App::createImageElement(Wt::Json::Object& line, const std::string& writer, Wt::WContainerWidget* outputContainer, std::string id) {
Wt::Json::Object imageDescription = line["image"];
auto imageLineItem = outputContainer->addNew();
auto outputText = Wt::WString("{1}: ").arg(writer);
@@ -649,6 +656,7 @@ Wt::WWebWidget* App::createImageElement(Wt::Json::Object& line, const std::strin
std::vector(imageBlob.begin(), imageBlob.end()));
image->setImageLink(Wt::WLink(imageResource));
image->resize(Wt::WLength((int)imageDescription["width"], Wt::LengthUnit::Pixel), Wt::WLength((int)imageDescription["height"], Wt::LengthUnit::Pixel));
+ imageLineItem->setAttributeValue("dummy", id);
return imageLineItem;
}
diff --git a/src/app.h b/src/app.h
index 252e88b..35b11b8 100644
--- a/src/app.h
+++ b/src/app.h
@@ -182,8 +182,8 @@ private:
std::string buildApiUrl(const std::string &userIP);
std::string getUserIP();
Magick::Image scaleImage(const Magick::Image &originalImage, int maxSize) const;
- Wt::WWebWidget *createImageElement(Wt::Json::Object &line, const std::string &writer, Wt::WContainerWidget *outputContainer);
- Wt::WWebWidget *createTextElement(const std::string &writer, const std::string &text, Wt::WContainerWidget *outputContainer);
+ Wt::WWebWidget *createImageElement(Wt::Json::Object &line, const std::string &writer, Wt::WContainerWidget *outputContainer, std::string id);
+ Wt::WWebWidget *createTextElement(const std::string &writer, const std::string &text, Wt::WContainerWidget *outputContainer, std::string id);
void createImprintContainer(Wt::WVBoxLayout *containerLayout);
Wt::WContainerWidget *setupSearchButton(Wt::WVBoxLayout *contentLayout);
void restoreSearchFields(Wt::WContainerWidget *searchResultContainer, Wt::WLineEdit *userNameEdit, Wt::WSpinBox *minAgeEdit, Wt::WSpinBox *maxAgeEdit, Wt::WContainerWidget *countryDropDownContainer, Wt::WContainerWidget *gendersDropDownContainer, Wt::WPushButton *countryOpenList, Wt::WPushButton *gendersOpenList);
diff --git a/src/broadcast.cpp b/src/broadcast.cpp
index 12506dd..5001558 100644
--- a/src/broadcast.cpp
+++ b/src/broadcast.cpp
@@ -3,6 +3,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -643,12 +644,22 @@ Broadcast::Message::Message(std::string fromSessionId_, Wt::WString message_):
fromSessionId(fromSessionId_),
sendType("text"),
message(message_) {
+ auto timestamp = std::time(nullptr);
+ auto combinedString = std::to_string(timestamp) + fromSessionId_;
+ Wt::Auth::SHA1HashFunction hashObj;
+ auto hash = hashObj.compute(combinedString, "salt");
+ messageId = Wt::WString(hash);
sendTime = Wt::WDateTime::currentDateTime();
}
Broadcast::Message::Message(std::string fromSessionId_, std::shared_ptr image_):
fromSessionId(fromSessionId_),
sendType("image") {
+ auto timestamp = std::time(nullptr);
+ auto combinedString = std::to_string(timestamp) + fromSessionId_;
+ Wt::Auth::SHA1HashFunction hashObj;
+ auto hash = hashObj.compute(combinedString, "salt");
+ messageId = Wt::WString(hash);
sendTime = Wt::WDateTime::currentDateTime();
Magick::Blob imageBlob;
image_->write(&imageBlob);
@@ -665,6 +676,7 @@ Wt::Json::Object Broadcast::Message::json() {
json["type"] = Wt::Json::Value(sendType);
json["string"] = Wt::Json::Value(message);
json["image"] = Wt::Json::Value(image);
+ json["id"] = Wt::Json::Value(messageId);
return json;
}
diff --git a/src/broadcast.h b/src/broadcast.h
index 7de4168..75da10a 100644
--- a/src/broadcast.h
+++ b/src/broadcast.h
@@ -55,6 +55,7 @@ public:
std::string sendType;
Wt::WDateTime sendTime;
Wt::WString message;
+ Wt::WString messageId;
Wt::Json::Object image;
Wt::Json::Object json();
void setNewSesionId(std::string oldSessionId, std::string newSessionId);