Compare commits
	
		
			5 Commits
		
	
	
		
			v0.2
			...
			dev-858b9d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 858b9dfcfa | |||
| bc8b631b84 | |||
| 52278f6726 | |||
| 29fd1bfb62 | |||
| 998000aa3a | 
							
								
								
									
										2
									
								
								external/solanaceae_contact
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								external/solanaceae_contact
									
									
									
									
										vendored
									
									
								
							 Submodule external/solanaceae_contact updated: e40271670b...7710da6c89
									
								
							
							
								
								
									
										2
									
								
								external/solanaceae_message3
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								external/solanaceae_message3
									
									
									
									
										vendored
									
									
								
							 Submodule external/solanaceae_message3 updated: f9f70a05b1...96b76dc67f
									
								
							
							
								
								
									
										2
									
								
								external/solanaceae_message_serializer
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								external/solanaceae_message_serializer
									
									
									
									
										vendored
									
									
								
							 Submodule external/solanaceae_message_serializer updated: 1409485ef1...1a3fcc6757
									
								
							
							
								
								
									
										2
									
								
								external/solanaceae_tox
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								external/solanaceae_tox
									
									
									
									
										vendored
									
									
								
							 Submodule external/solanaceae_tox updated: 25857b8aa7...560eab1f6c
									
								
							@@ -52,14 +52,14 @@ add_executable(tomato
 | 
			
		||||
	./sdl_clipboard_utils.hpp
 | 
			
		||||
	./sdl_clipboard_utils.cpp
 | 
			
		||||
 | 
			
		||||
	./file_selector.hpp
 | 
			
		||||
	./file_selector.cpp
 | 
			
		||||
	./chat_gui/file_selector.hpp
 | 
			
		||||
	./chat_gui/file_selector.cpp
 | 
			
		||||
 | 
			
		||||
	./send_image_popup.hpp
 | 
			
		||||
	./send_image_popup.cpp
 | 
			
		||||
	./chat_gui/send_image_popup.hpp
 | 
			
		||||
	./chat_gui/send_image_popup.cpp
 | 
			
		||||
 | 
			
		||||
	./settings_window.hpp
 | 
			
		||||
	./settings_window.cpp
 | 
			
		||||
	./chat_gui/settings_window.hpp
 | 
			
		||||
	./chat_gui/settings_window.cpp
 | 
			
		||||
 | 
			
		||||
	./tox_ui_utils.hpp
 | 
			
		||||
	./tox_ui_utils.cpp
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
#include "./send_image_popup.hpp"
 | 
			
		||||
 | 
			
		||||
#include "./image_loader_sdl_bmp.hpp"
 | 
			
		||||
#include "./image_loader_stb.hpp"
 | 
			
		||||
#include "./image_loader_webp.hpp"
 | 
			
		||||
#include "./image_loader_qoi.hpp"
 | 
			
		||||
#include "./image_loader_sdl_image.hpp"
 | 
			
		||||
#include "../image_loader_sdl_bmp.hpp"
 | 
			
		||||
#include "../image_loader_stb.hpp"
 | 
			
		||||
#include "../image_loader_webp.hpp"
 | 
			
		||||
#include "../image_loader_qoi.hpp"
 | 
			
		||||
#include "../image_loader_sdl_image.hpp"
 | 
			
		||||
 | 
			
		||||
#include <imgui/imgui.h>
 | 
			
		||||
 | 
			
		||||
@@ -5,8 +5,8 @@
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include "./image_loader.hpp"
 | 
			
		||||
#include "./texture_cache.hpp"
 | 
			
		||||
#include "../image_loader.hpp"
 | 
			
		||||
#include "../texture_cache.hpp"
 | 
			
		||||
 | 
			
		||||
struct SendImagePopup {
 | 
			
		||||
	TextureUploaderI& _tu;
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
#include "./chat_gui4.hpp"
 | 
			
		||||
 | 
			
		||||
#include "./file_selector.hpp"
 | 
			
		||||
 | 
			
		||||
#include <solanaceae/message3/components.hpp>
 | 
			
		||||
#include <solanaceae/tox_messages/components.hpp>
 | 
			
		||||
#include <solanaceae/contact/components.hpp>
 | 
			
		||||
@@ -197,9 +195,10 @@ float ChatGui4::render(float time_delta) {
 | 
			
		||||
				sub_contacts = &_cr.get<Contact::Components::ParentOf>(*_selected_contact).subs;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			const bool highlight_private {!_cr.all_of<Contact::Components::TagPrivate>(*_selected_contact)};
 | 
			
		||||
 | 
			
		||||
			if (ImGui::BeginChild(chat_label.c_str(), {0, 0}, true)) {
 | 
			
		||||
				//if (_cr.all_of<Contact::Components::ParentOf>(*_selected_contact)) {
 | 
			
		||||
				if (sub_contacts != nullptr) {
 | 
			
		||||
				if (sub_contacts != nullptr && !_cr.all_of<Contact::Components::TagPrivate>(*_selected_contact) && _cr.all_of<Contact::Components::TagGroup>(*_selected_contact)) {
 | 
			
		||||
					if (!sub_contacts->empty()) {
 | 
			
		||||
						if (ImGui::BeginChild("subcontacts", {150, -100}, true)) {
 | 
			
		||||
							ImGui::Text("subs: %zu", sub_contacts->size());
 | 
			
		||||
@@ -417,7 +416,7 @@ float ChatGui4::render(float time_delta) {
 | 
			
		||||
								std::optional<ImVec4> row_bg;
 | 
			
		||||
 | 
			
		||||
								// private group message
 | 
			
		||||
								if (_cr.any_of<Contact::Components::TagSelfWeak, Contact::Components::TagSelfStrong>(c_to.c)) {
 | 
			
		||||
								if (highlight_private && _cr.any_of<Contact::Components::TagSelfWeak, Contact::Components::TagSelfStrong>(c_to.c)) {
 | 
			
		||||
									const ImVec4 priv_msg_hi_col = ImVec4(0.5f, 0.2f, 0.5f, 0.35f);
 | 
			
		||||
									ImU32 row_bg_color = ImGui::GetColorU32(priv_msg_hi_col);
 | 
			
		||||
									ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg1, row_bg_color);
 | 
			
		||||
@@ -456,8 +455,11 @@ float ChatGui4::render(float time_delta) {
 | 
			
		||||
							if (ImGui::TableNextColumn()) {
 | 
			
		||||
								// TODO: theming for hardcoded values
 | 
			
		||||
 | 
			
		||||
								if (msg_reg.all_of<Message::Components::Remote::TimestampReceived>(e)) {
 | 
			
		||||
									const auto list = msg_reg.get<Message::Components::Remote::TimestampReceived>(e).ts;
 | 
			
		||||
								if (!msg_reg.all_of<Message::Components::ReceivedBy>(e)) {
 | 
			
		||||
									// TODO: dedup?
 | 
			
		||||
									ImGui::TextDisabled("_");
 | 
			
		||||
								} else {
 | 
			
		||||
									const auto list = msg_reg.get<Message::Components::ReceivedBy>(e).ts;
 | 
			
		||||
									// wrongly assumes contacts never get removed from a group
 | 
			
		||||
									if (sub_contacts != nullptr && list.size() < sub_contacts->size()) {
 | 
			
		||||
										// if partically delivered
 | 
			
		||||
@@ -471,6 +473,7 @@ float ChatGui4::render(float time_delta) {
 | 
			
		||||
										std::string synced_by_text {"delivery confirmed by:"};
 | 
			
		||||
										const int64_t now_ts_s = int64_t(Message::getTimeMS() / 1000u);
 | 
			
		||||
 | 
			
		||||
										size_t other_contacts {0};
 | 
			
		||||
										for (const auto& [c, syned_ts] : list) {
 | 
			
		||||
											if (_cr.all_of<Contact::Components::TagSelfStrong>(c)) {
 | 
			
		||||
												//synced_by_text += "\n sself(!)"; // makes no sense
 | 
			
		||||
@@ -480,23 +483,26 @@ float ChatGui4::render(float time_delta) {
 | 
			
		||||
											} else {
 | 
			
		||||
												synced_by_text += "\n >" + (_cr.all_of<Contact::Components::Name>(c) ? _cr.get<Contact::Components::Name>(c).name : "<unk>");
 | 
			
		||||
											}
 | 
			
		||||
											other_contacts += 1;
 | 
			
		||||
											const int64_t seconds_ago = (int64_t(syned_ts / 1000u) - now_ts_s) * -1;
 | 
			
		||||
											synced_by_text += " (" + std::to_string(seconds_ago) + "sec ago)";
 | 
			
		||||
										}
 | 
			
		||||
 | 
			
		||||
										ImGui::Text("%s", synced_by_text.c_str());
 | 
			
		||||
										if (other_contacts > 0) {
 | 
			
		||||
											ImGui::Text("%s", synced_by_text.c_str());
 | 
			
		||||
										} else {
 | 
			
		||||
											ImGui::TextUnformatted("no delivery confirmation");
 | 
			
		||||
										}
 | 
			
		||||
 | 
			
		||||
										ImGui::EndTooltip();
 | 
			
		||||
									}
 | 
			
		||||
								} else {
 | 
			
		||||
									ImGui::TextDisabled("_");
 | 
			
		||||
								}
 | 
			
		||||
 | 
			
		||||
								ImGui::SameLine();
 | 
			
		||||
 | 
			
		||||
								// TODO: dedup
 | 
			
		||||
								if (msg_reg.all_of<Message::Components::Remote::TimestampRead>(e)) {
 | 
			
		||||
									const auto list = msg_reg.get<Message::Components::Remote::TimestampRead>(e).ts;
 | 
			
		||||
								if (msg_reg.all_of<Message::Components::ReadBy>(e)) {
 | 
			
		||||
									const auto list = msg_reg.get<Message::Components::ReadBy>(e).ts;
 | 
			
		||||
									// wrongly assumes contacts never get removed from a group
 | 
			
		||||
									if (sub_contacts != nullptr && list.size() < sub_contacts->size()) {
 | 
			
		||||
										// if partially read
 | 
			
		||||
@@ -1045,13 +1051,13 @@ void ChatGui4::renderMessageExtra(Message3Registry& reg, const Message3 e) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO: remove?
 | 
			
		||||
	if (reg.all_of<Message::Components::Remote::TimestampReceived>(e)) {
 | 
			
		||||
	if (reg.all_of<Message::Components::ReceivedBy>(e)) {
 | 
			
		||||
		std::string synced_by_text {"receivedBy:"};
 | 
			
		||||
		const int64_t now_ts_s = int64_t(Message::getTimeMS() / 1000u);
 | 
			
		||||
 | 
			
		||||
		for (const auto& [c, syned_ts] : reg.get<Message::Components::Remote::TimestampReceived>(e).ts) {
 | 
			
		||||
		for (const auto& [c, syned_ts] : reg.get<Message::Components::ReceivedBy>(e).ts) {
 | 
			
		||||
			if (_cr.all_of<Contact::Components::TagSelfStrong>(c)) {
 | 
			
		||||
				synced_by_text += "\n sself(!)"; // makes no sense
 | 
			
		||||
				synced_by_text += "\n sself"; // required (except when synced externally)
 | 
			
		||||
			} else if (_cr.all_of<Contact::Components::TagSelfWeak>(c)) {
 | 
			
		||||
				synced_by_text += "\n wself";
 | 
			
		||||
			} else {
 | 
			
		||||
@@ -1080,7 +1086,6 @@ void ChatGui4::renderContactList(void) {
 | 
			
		||||
bool ChatGui4::renderContactListContactBig(const Contact3 c, const bool selected) {
 | 
			
		||||
	// TODO:
 | 
			
		||||
	// - unread message
 | 
			
		||||
	// - avatar img
 | 
			
		||||
	// - connection status
 | 
			
		||||
	// - user status
 | 
			
		||||
	// - status message
 | 
			
		||||
@@ -1109,10 +1114,27 @@ bool ChatGui4::renderContactListContactBig(const Contact3 c, const bool selected
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const bool got_selected = ImGui::Selectable(label.c_str(), show_selected, 0, {0,3*TEXT_BASE_HEIGHT});
 | 
			
		||||
 | 
			
		||||
	if (request_incoming || request_outgoing) {
 | 
			
		||||
		ImGui::PopStyleColor();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ImGui::BeginItemTooltip()) {
 | 
			
		||||
		if (_cr.all_of<Contact::Components::ConnectionState>(c)) {
 | 
			
		||||
			const auto cstate = _cr.get<Contact::Components::ConnectionState>(c).state;
 | 
			
		||||
			ImGui::Text("Connection state: %s",
 | 
			
		||||
				(cstate == Contact::Components::ConnectionState::disconnected)
 | 
			
		||||
				? "offline"
 | 
			
		||||
				: (cstate == Contact::Components::ConnectionState::direct)
 | 
			
		||||
				? "online (direct)"
 | 
			
		||||
				: "online (cloud)"
 | 
			
		||||
			);
 | 
			
		||||
		} else {
 | 
			
		||||
			ImGui::TextUnformatted("Connection state: unknown");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ImGui::EndTooltip();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ImVec2 post_curser_pos = ImGui::GetCursorPos();
 | 
			
		||||
 | 
			
		||||
	ImVec2 img_curser {
 | 
			
		||||
@@ -1181,14 +1203,16 @@ bool ChatGui4::renderContactListContactBig(const Contact3 c, const bool selected
 | 
			
		||||
			ImGui::TextUnformatted("Incoming request/invite");
 | 
			
		||||
		} else if (request_outgoing) {
 | 
			
		||||
			ImGui::TextUnformatted("Outgoing request/invite");
 | 
			
		||||
		} else {
 | 
			
		||||
			//ImGui::Text("status message...");
 | 
			
		||||
		}
 | 
			
		||||
		//ImGui::Text("status message...");
 | 
			
		||||
		//ImGui::TextDisabled("hi");
 | 
			
		||||
		//ImGui::RenderTextEllipsis
 | 
			
		||||
	}
 | 
			
		||||
	ImGui::EndGroup();
 | 
			
		||||
 | 
			
		||||
	ImGui::SetCursorPos(post_curser_pos);
 | 
			
		||||
 | 
			
		||||
	return got_selected;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,8 +7,8 @@
 | 
			
		||||
#include "./texture_cache.hpp"
 | 
			
		||||
#include "./tox_avatar_loader.hpp"
 | 
			
		||||
#include "./message_image_loader.hpp"
 | 
			
		||||
#include "./file_selector.hpp"
 | 
			
		||||
#include "./send_image_popup.hpp"
 | 
			
		||||
#include "./chat_gui/file_selector.hpp"
 | 
			
		||||
#include "./chat_gui/send_image_popup.hpp"
 | 
			
		||||
 | 
			
		||||
#include <entt/container/dense_map.hpp>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <cmath>
 | 
			
		||||
 | 
			
		||||
MainScreen::MainScreen(SDL_Renderer* renderer_, std::string save_path, std::string save_password, std::vector<std::string> plugins) :
 | 
			
		||||
MainScreen::MainScreen(SDL_Renderer* renderer_, std::string save_path, std::string save_password, std::string new_username, std::vector<std::string> plugins) :
 | 
			
		||||
	renderer(renderer_),
 | 
			
		||||
	rmm(cr),
 | 
			
		||||
	msnj{cr, {}, {}},
 | 
			
		||||
@@ -44,9 +44,10 @@ MainScreen::MainScreen(SDL_Renderer* renderer_, std::string save_path, std::stri
 | 
			
		||||
	conf.set("tox", "save_file_path", save_path);
 | 
			
		||||
 | 
			
		||||
	{ // name stuff
 | 
			
		||||
		// a new profile will not have this set
 | 
			
		||||
		auto name = tc.toxSelfGetName();
 | 
			
		||||
		if (name.empty()) {
 | 
			
		||||
			name = "tomato";
 | 
			
		||||
			name = new_username;
 | 
			
		||||
		}
 | 
			
		||||
		conf.set("tox", "name", name);
 | 
			
		||||
		tc.setSelfName(name); // TODO: this is ugly
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@
 | 
			
		||||
#include "./message_image_loader.hpp"
 | 
			
		||||
 | 
			
		||||
#include "./chat_gui4.hpp"
 | 
			
		||||
#include "./settings_window.hpp"
 | 
			
		||||
#include "./chat_gui/settings_window.hpp"
 | 
			
		||||
#include "./tox_ui_utils.hpp"
 | 
			
		||||
#include "./tox_dht_cap_histo.hpp"
 | 
			
		||||
#include "./tox_friend_faux_offline_messaging.hpp"
 | 
			
		||||
@@ -89,7 +89,7 @@ struct MainScreen final : public Screen {
 | 
			
		||||
	uint64_t _window_hidden_ts {0};
 | 
			
		||||
	float _time_since_event {0.f};
 | 
			
		||||
 | 
			
		||||
	MainScreen(SDL_Renderer* renderer_, std::string save_path, std::string save_password, std::vector<std::string> plugins);
 | 
			
		||||
	MainScreen(SDL_Renderer* renderer_, std::string save_path, std::string save_password, std::string new_username, std::vector<std::string> plugins);
 | 
			
		||||
	~MainScreen(void);
 | 
			
		||||
 | 
			
		||||
	bool handleEvent(SDL_Event& e) override;
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
#include <imgui/imgui.h>
 | 
			
		||||
#include <imgui/misc/cpp/imgui_stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include <cctype>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <filesystem>
 | 
			
		||||
 | 
			
		||||
@@ -33,13 +34,13 @@ Screen* StartScreen::render(float, bool&) {
 | 
			
		||||
				_fss.requestFile(
 | 
			
		||||
					[](const auto& path) -> bool { return std::filesystem::is_regular_file(path); },
 | 
			
		||||
					[this](const auto& path) {
 | 
			
		||||
						tox_profile_path = path.string();
 | 
			
		||||
						_tox_profile_path = path.string();
 | 
			
		||||
					},
 | 
			
		||||
					[](){}
 | 
			
		||||
				);
 | 
			
		||||
			}
 | 
			
		||||
			ImGui::SameLine();
 | 
			
		||||
			ImGui::TextUnformatted(tox_profile_path.c_str());
 | 
			
		||||
			ImGui::TextUnformatted(_tox_profile_path.c_str());
 | 
			
		||||
 | 
			
		||||
			ImGui::TextUnformatted("password:");
 | 
			
		||||
			ImGui::SameLine();
 | 
			
		||||
@@ -56,8 +57,22 @@ Screen* StartScreen::render(float, bool&) {
 | 
			
		||||
		if (ImGui::BeginTabItem("create profile")) {
 | 
			
		||||
			_new_save = true;
 | 
			
		||||
 | 
			
		||||
			ImGui::TextUnformatted("TODO: profile path");
 | 
			
		||||
			ImGui::TextUnformatted("TODO: profile name");
 | 
			
		||||
			ImGui::TextUnformatted("username:");
 | 
			
		||||
			ImGui::SameLine();
 | 
			
		||||
			if (ImGui::InputText("##user_name", &_user_name)) {
 | 
			
		||||
				std::string tmp_copy = _user_name;
 | 
			
		||||
				for (auto& c : tmp_copy) {
 | 
			
		||||
					if (!std::isalnum(static_cast<unsigned char>(c)) && c != '-' && c != '.') {
 | 
			
		||||
						c = '_';
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (tmp_copy.empty()) {
 | 
			
		||||
					tmp_copy = "unnamed-tomato";
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				_tox_profile_path = tmp_copy + ".tox";
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			ImGui::TextUnformatted("password:");
 | 
			
		||||
			ImGui::SameLine();
 | 
			
		||||
@@ -69,6 +84,8 @@ Screen* StartScreen::render(float, bool&) {
 | 
			
		||||
			ImGui::SameLine();
 | 
			
		||||
			ImGui::Checkbox("show password", &_show_password);
 | 
			
		||||
 | 
			
		||||
			ImGui::TextUnformatted("TODO: profile path (current path for now)");
 | 
			
		||||
 | 
			
		||||
			ImGui::EndTabItem();
 | 
			
		||||
		}
 | 
			
		||||
		if (ImGui::BeginTabItem("plugins")) {
 | 
			
		||||
@@ -81,7 +98,6 @@ Screen* StartScreen::render(float, bool&) {
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
				ImGui::SameLine();
 | 
			
		||||
 | 
			
		||||
				ImGui::TextUnformatted(it->c_str());
 | 
			
		||||
 | 
			
		||||
				ImGui::PopID();
 | 
			
		||||
@@ -105,7 +121,7 @@ Screen* StartScreen::render(float, bool&) {
 | 
			
		||||
 | 
			
		||||
	ImGui::Separator();
 | 
			
		||||
 | 
			
		||||
	if (!_new_save && !std::filesystem::is_regular_file(tox_profile_path)) {
 | 
			
		||||
	if (!_new_save && !std::filesystem::is_regular_file(_tox_profile_path)) {
 | 
			
		||||
		// load but file missing
 | 
			
		||||
 | 
			
		||||
		ImGui::BeginDisabled();
 | 
			
		||||
@@ -115,7 +131,7 @@ Screen* StartScreen::render(float, bool&) {
 | 
			
		||||
		if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_AllowWhenDisabled)) {
 | 
			
		||||
			ImGui::SetTooltip("file does not exist");
 | 
			
		||||
		}
 | 
			
		||||
	} else if (_new_save && std::filesystem::exists(tox_profile_path)) {
 | 
			
		||||
	} else if (_new_save && std::filesystem::exists(_tox_profile_path)) {
 | 
			
		||||
		// new but file exists
 | 
			
		||||
 | 
			
		||||
		ImGui::BeginDisabled();
 | 
			
		||||
@@ -127,7 +143,7 @@ Screen* StartScreen::render(float, bool&) {
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if (ImGui::Button("load", {60, 25})) {
 | 
			
		||||
			auto new_screen = std::make_unique<MainScreen>(_renderer, tox_profile_path, _password, queued_plugin_paths);
 | 
			
		||||
			auto new_screen = std::make_unique<MainScreen>(_renderer, _tox_profile_path, _password, _user_name, queued_plugin_paths);
 | 
			
		||||
			return new_screen.release();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
#include "./screen.hpp"
 | 
			
		||||
 | 
			
		||||
#include "./file_selector.hpp"
 | 
			
		||||
#include "./chat_gui/file_selector.hpp"
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <string>
 | 
			
		||||
@@ -17,11 +17,12 @@ struct StartScreen final : public Screen {
 | 
			
		||||
	FileSelector _fss;
 | 
			
		||||
 | 
			
		||||
	bool _new_save {false};
 | 
			
		||||
	std::string _user_name {"unnamed-tomato"};
 | 
			
		||||
 | 
			
		||||
	bool _show_password {false};
 | 
			
		||||
	std::string _password;
 | 
			
		||||
 | 
			
		||||
	std::string tox_profile_path {"tomato.tox"};
 | 
			
		||||
	std::string _tox_profile_path {"unnamed-tomato.tox"};
 | 
			
		||||
	std::vector<std::string> queued_plugin_paths;
 | 
			
		||||
 | 
			
		||||
	StartScreen(void) = delete;
 | 
			
		||||
 
 | 
			
		||||
@@ -107,6 +107,12 @@ ToxFriendFauxOfflineMessaging::dfmc_Ret ToxFriendFauxOfflineMessaging::doFriendM
 | 
			
		||||
 | 
			
		||||
	const uint64_t ts_now = Message::getTimeMS();
 | 
			
		||||
 | 
			
		||||
	if (!_cr.all_of<Contact::Components::Self>(c)) {
 | 
			
		||||
		return dfmc_Ret::NO_MSG; // error
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const auto self_c = _cr.get<Contact::Components::Self>(c).self;
 | 
			
		||||
 | 
			
		||||
	// filter for unconfirmed messages
 | 
			
		||||
 | 
			
		||||
	// we assume sorted
 | 
			
		||||
@@ -127,9 +133,8 @@ ToxFriendFauxOfflineMessaging::dfmc_Ret ToxFriendFauxOfflineMessaging::doFriendM
 | 
			
		||||
			continue; // skip
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// exclude
 | 
			
		||||
		if (mr->any_of<
 | 
			
		||||
				Message::Components::Remote::TimestampReceived // this acts like a tag, which is wrong in groups
 | 
			
		||||
		if (!mr->any_of<
 | 
			
		||||
				Message::Components::ReceivedBy
 | 
			
		||||
			>(msg)
 | 
			
		||||
		) {
 | 
			
		||||
			continue; // skip
 | 
			
		||||
@@ -139,6 +144,16 @@ ToxFriendFauxOfflineMessaging::dfmc_Ret ToxFriendFauxOfflineMessaging::doFriendM
 | 
			
		||||
			continue; // not outbound (in private)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		const auto& ts_received = mr->get<Message::Components::ReceivedBy>(msg).ts;
 | 
			
		||||
		// not target
 | 
			
		||||
		if (ts_received.contains(c)) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		// needs to contain self
 | 
			
		||||
		if (!ts_received.contains(self_c)) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		valid_unsent = true;
 | 
			
		||||
 | 
			
		||||
		uint64_t msg_ts = msg_view.get<Message::Components::Timestamp>(msg).ts;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user