From 48d78d39a88294de9fa23e3bc86e33831f724a5d Mon Sep 17 00:00:00 2001 From: Torsten Schulz Date: Sun, 18 Feb 2024 12:34:51 +0100 Subject: [PATCH] Enhanced output --- src/app.cpp | 20 ++++++++++++++------ src/app.h | 4 ++-- src/broadcast.cpp | 12 ++++++++++++ src/broadcast.h | 1 + 4 files changed, 29 insertions(+), 8 deletions(-) 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);