Compare commits

...

8 Commits

Author SHA1 Message Date
29fd1bfb62 comp name changes and small behavior changes 2024-04-20 15:24:58 +02:00
998000aa3a work on receive state and prep for pers 2024-04-19 11:51:20 +02:00
e66f4651d0 disable stb_image image loading
its still around since we use it for image writing, which is fine for now.
2024-04-17 15:57:36 +02:00
854d09f05c windows ci 2024-04-17 12:41:02 +02:00
2d6a9acbb6 enable avif in flake 2024-04-16 10:30:13 +02:00
b7f0ad6c9a enable sdl_image image_loader (animated gif works) 2024-04-16 10:23:17 +02:00
43f8c22570 add sdl_image image_loader (untested) 2024-04-16 00:45:12 +02:00
3c7bd2e2cb add sdl_image dep 2024-04-15 19:37:29 +02:00
19 changed files with 265 additions and 47 deletions

View File

@ -7,7 +7,7 @@ on:
branches: [ master ]
env:
BUILD_TYPE: Release
BUILD_TYPE: RelWithDebInfo
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
jobs:
@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive
@ -63,7 +63,7 @@ jobs:
runs-on: windows-2019
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive
@ -75,8 +75,11 @@ jobs:
with:
arch: amd64
## sdl_image vendored needs nasm for dav1d
#- uses: ilammy/setup-nasm@v1
- name: Configure CMake
run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static
run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DSDL3IMAGE_VENDORED=ON -DSDL3IMAGE_DEPS_SHARED=ON -DSDL3IMAGE_JXL=OFF -DSDL3IMAGE_AVIF=OFF
- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
@ -114,7 +117,7 @@ jobs:
runs-on: windows-2019
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive
@ -126,8 +129,11 @@ jobs:
with:
arch: amd64
## sdl_image vendored needs nasm for dav1d
#- uses: ilammy/setup-nasm@v1
- name: Configure CMake
run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DTOMATO_ASAN=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded
run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DTOMATO_ASAN=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DSDL3IMAGE_VENDORED=ON -DSDL3IMAGE_DEPS_SHARED=ON -DSDL3IMAGE_JXL=OFF -DSDL3IMAGE_AVIF=OFF
- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4
@ -172,7 +178,7 @@ jobs:
contents: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive

View File

@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive
@ -35,7 +35,7 @@ jobs:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive
@ -49,12 +49,12 @@ jobs:
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4
windows:
timeout-minutes: 10
timeout-minutes: 15
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive
@ -66,8 +66,11 @@ jobs:
with:
arch: amd64
## sdl_image vendored needs nasm for dav1d
#- uses: ilammy/setup-nasm@v1
- name: Configure CMake
run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static
run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DSDL3IMAGE_VENDORED=ON -DSDL3IMAGE_DEPS_SHARED=ON -DSDL3IMAGE_JXL=OFF -DSDL3IMAGE_AVIF=OFF
- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4

View File

@ -21,4 +21,5 @@ add_subdirectory(./imgui)
add_subdirectory(./stb)
add_subdirectory(./libwebp)
add_subdirectory(./qoi)
add_subdirectory(./sdl_image)

23
external/sdl_image/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 3.16...3.24 FATAL_ERROR)
include(FetchContent)
if (NOT TARGET SDL3_image::SDL3_image)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
# TODO: make pr to make this an option
set(SDL3IMAGE_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(SDL3IMAGE_BACKEND_STB OFF CACHE BOOL "" FORCE) # important for security
set(SDL3IMAGE_BACKEND_IMAGEIO OFF CACHE BOOL "" FORCE) # some funky apple cmake bug
#set(SDL3IMAGE_JXL ON CACHE BOOL "" FORCE) # default to off
set(SDL3IMAGE_QOI OFF CACHE BOOL "" FORCE) # we have our own
set(SDL3IMAGE_WEBP OFF CACHE BOOL "" FORCE) # we have our own
FetchContent_Declare(SDL3_image
GIT_REPOSITORY https://github.com/libsdl-org/SDL_image
# waiting on the imgui pr to get merged so i can update sdl <.<
GIT_TAG a45d6e5b84ccc0f3faae6ba7d561709ed600eee7 # tip last check
FIND_PACKAGE_ARGS # for the future
)
FetchContent_MakeAvailable(SDL3_image)
endif()

32
flake.lock generated
View File

@ -5,11 +5,11 @@
"systems": "systems"
},
"locked": {
"lastModified": 1694529238,
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
@ -20,11 +20,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1709953752,
"narHash": "sha256-LW84B4vM1cn7E6cDNQn2LndT9iJXI1dRE5fwbNFbQa8=",
"lastModified": 1713189761,
"narHash": "sha256-MPp1dBhlY066IeBo+EPGEUN+s+aSUA+LWkvnzKh+rts=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "fcaa81ed3c273237217330cf342ef1873b77c80a",
"rev": "ff44be4d8ff33f797ff3e3f87153d4f3b6a85ffb",
"type": "github"
},
"original": {
@ -56,7 +56,8 @@
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"nlohmann-json": "nlohmann-json",
"sdl3": "sdl3"
"sdl3": "sdl3",
"sdl3_image": "sdl3_image"
}
},
"sdl3": {
@ -76,6 +77,23 @@
"type": "github"
}
},
"sdl3_image": {
"flake": false,
"locked": {
"lastModified": 1712700609,
"narHash": "sha256-PVPH1uJ6g65SzHUboeQE6ZkC+72doMz9t9SG2LBo+7I=",
"owner": "libsdl-org",
"repo": "SDL_image",
"rev": "a45d6e5b84ccc0f3faae6ba7d561709ed600eee7",
"type": "github"
},
"original": {
"owner": "libsdl-org",
"repo": "SDL_image",
"rev": "a45d6e5b84ccc0f3faae6ba7d561709ed600eee7",
"type": "github"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,

View File

@ -14,9 +14,13 @@
url = "github:libsdl-org/SDL/0429f5d6a36fc35b551bcc2acd4a40c2db6dab82"; # keep in sync this cmake
flake = false;
};
sdl3_image = {
url = "github:libsdl-org/SDL_image/a45d6e5b84ccc0f3faae6ba7d561709ed600eee7";
flake = false;
};
};
outputs = { self, nixpkgs, flake-utils, nlohmann-json, sdl3 }:
outputs = { self, nixpkgs, flake-utils, nlohmann-json, sdl3, sdl3_image }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
@ -57,6 +61,13 @@
libGL
pipewire
# sdl3_image:
libpng
libjpeg
libjxl
libavif
#libwebp # still using our own loader
];
buildInputs = with pkgs; [
@ -74,6 +85,8 @@
"-DFETCHCONTENT_SOURCE_DIR_ZSTD=${pkgs.zstd.src}" # we dont care about the version (we use 1.4.x features)
"-DFETCHCONTENT_SOURCE_DIR_LIBWEBP=${pkgs.libwebp.src}"
"-DFETCHCONTENT_SOURCE_DIR_SDL3=${sdl3}"
"-DFETCHCONTENT_SOURCE_DIR_SDL3_IMAGE=${sdl3_image}"
"-DSDL3IMAGE_JXL=ON"
];
# TODO: replace with install command

View File

@ -29,6 +29,8 @@ add_executable(tomato
./image_loader_webp.cpp
./image_loader_qoi.hpp
./image_loader_qoi.cpp
./image_loader_sdl_image.hpp
./image_loader_sdl_image.cpp
./texture_uploader.hpp
./sdlrenderer_texture_uploader.hpp
@ -98,5 +100,6 @@ target_link_libraries(tomato PUBLIC
webpdemux
libwebpmux # the f why (needed for anim encode)
qoi
SDL3_image::SDL3_image
)

View File

@ -197,9 +197,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 +418,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 +457,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 +475,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 +485,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 +1053,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 {

View File

@ -0,0 +1,118 @@
#include "./image_loader_sdl_image.hpp"
#include <SDL3_image/SDL_image.h>
#include <optional>
#include <iostream>
static std::optional<const char*> getExt(SDL_IOStream* ios) {
if (IMG_isAVIF(ios)) {
return "avif";
} else if (IMG_isCUR(ios)) {
return "cur";
} else if (IMG_isICO(ios)) {
return "ico";
} else if (IMG_isBMP(ios)) {
return "bmp";
} else if (IMG_isGIF(ios)) {
return "gif";
} else if (IMG_isJPG(ios)) {
return "jpg";
} else if (IMG_isJXL(ios)) {
return "jxl";
} else if (IMG_isLBM(ios)) {
return "lbm";
} else if (IMG_isPCX(ios)) {
return "pcx";
} else if (IMG_isPNG(ios)) {
return "png";
} else if (IMG_isPNM(ios)) {
return "pnm";
} else if (IMG_isSVG(ios)) {
return "svg";
} else if (IMG_isTIF(ios)) {
return "tiff";
} else if (IMG_isXCF(ios)) {
return "xcf";
} else if (IMG_isXPM(ios)) {
return "xpm";
} else if (IMG_isXV(ios)) {
return "xv";
} else if (IMG_isWEBP(ios)) {
return "webp";
} else if (IMG_isQOI(ios)) {
return "qoi";
} else {
return std::nullopt;
}
}
ImageLoaderSDLImage::ImageInfo ImageLoaderSDLImage::loadInfoFromMemory(const uint8_t* data, uint64_t data_size) {
ImageInfo res;
auto* ios = SDL_IOFromConstMem(data, data_size);
// we ignore tga
auto ext_opt = getExt(ios);
if (!ext_opt.has_value()) {
return res;
}
SDL_Surface* surf = IMG_Load_IO(ios, SDL_TRUE);
if (surf == nullptr) {
return res;
}
res.width = surf->w;
res.height = surf->h;
res.file_ext = ext_opt.value();
SDL_DestroySurface(surf);
return res;
}
ImageLoaderSDLImage::ImageResult ImageLoaderSDLImage::loadFromMemoryRGBA(const uint8_t* data, uint64_t data_size) {
ImageResult res;
auto* ios = SDL_IOFromConstMem(data, data_size);
// we ignore tga
auto ext_opt = getExt(ios);
if (!ext_opt.has_value()) {
return res;
}
IMG_Animation* anim = IMG_LoadAnimation_IO(ios, SDL_TRUE);
if (anim == nullptr) {
return res;
}
for (int i = 0; i < anim->count; i++) {
SDL_Surface* conv_surf = SDL_ConvertSurfaceFormat(anim->frames[i], SDL_PIXELFORMAT_RGBA32);
if (conv_surf == nullptr) {
return res;
}
SDL_LockSurface(conv_surf);
auto& new_frame = res.frames.emplace_back();
new_frame.ms = anim->delays[i];
new_frame.data.insert(new_frame.data.cbegin(), (const uint8_t*)conv_surf->pixels, ((const uint8_t*)conv_surf->pixels) + (anim->w*anim->h*4));
SDL_UnlockSurface(conv_surf);
SDL_DestroySurface(conv_surf);
}
res.width = anim->w;
res.height = anim->h;
res.file_ext = ext_opt.value();
IMG_FreeAnimation(anim);
std::cout << "IL_SDLI: loaded img " << res.width << "x" << res.height << "\n";
return res;
}

View File

@ -0,0 +1,9 @@
#pragma once
#include "./image_loader.hpp"
struct ImageLoaderSDLImage : public ImageLoaderI {
ImageInfo loadInfoFromMemory(const uint8_t* data, uint64_t data_size) override;
ImageResult loadFromMemoryRGBA(const uint8_t* data, uint64_t data_size) override;
};

View File

@ -3,7 +3,7 @@
#include "./image_loader_webp.hpp"
#include "./image_loader_sdl_bmp.hpp"
#include "./image_loader_qoi.hpp"
#include "./image_loader_stb.hpp"
#include "./image_loader_sdl_image.hpp"
#include <solanaceae/message3/components.hpp>
@ -79,7 +79,7 @@ MediaMetaInfoLoader::MediaMetaInfoLoader(RegistryMessageModel& rmm) : _rmm(rmm)
_image_loaders.push_back(std::make_unique<ImageLoaderWebP>());
_image_loaders.push_back(std::make_unique<ImageLoaderSDLBMP>());
_image_loaders.push_back(std::make_unique<ImageLoaderQOI>());
_image_loaders.push_back(std::make_unique<ImageLoaderSTB>());
_image_loaders.push_back(std::make_unique<ImageLoaderSDLImage>());
_rmm.subscribe(this, RegistryMessageModel_Event::message_construct);
_rmm.subscribe(this, RegistryMessageModel_Event::message_updated);

View File

@ -2,8 +2,8 @@
#include "./image_loader_sdl_bmp.hpp"
#include "./image_loader_qoi.hpp"
#include "./image_loader_stb.hpp"
#include "./image_loader_webp.hpp"
#include "./image_loader_sdl_image.hpp"
#include "./media_meta_info_loader.hpp"
#include <solanaceae/message3/components.hpp>
@ -22,7 +22,7 @@ MessageImageLoader::MessageImageLoader(void) {
_image_loaders.push_back(std::make_unique<ImageLoaderSDLBMP>());
_image_loaders.push_back(std::make_unique<ImageLoaderQOI>());
_image_loaders.push_back(std::make_unique<ImageLoaderWebP>());
_image_loaders.push_back(std::make_unique<ImageLoaderSTB>());
_image_loaders.push_back(std::make_unique<ImageLoaderSDLImage>());
}
std::optional<TextureEntry> MessageImageLoader::load(TextureUploaderI& tu, Message3Handle m) {

View File

@ -4,6 +4,7 @@
#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>
@ -16,7 +17,7 @@ SendImagePopup::SendImagePopup(TextureUploaderI& tu) : _tu(tu) {
_image_loaders.push_back(std::make_unique<ImageLoaderSDLBMP>());
_image_loaders.push_back(std::make_unique<ImageLoaderQOI>());
_image_loaders.push_back(std::make_unique<ImageLoaderWebP>());
_image_loaders.push_back(std::make_unique<ImageLoaderSTB>());
_image_loaders.push_back(std::make_unique<ImageLoaderSDLImage>());
}
void SendImagePopup::reset(void) {

View File

@ -2,8 +2,8 @@
#include "./image_loader_sdl_bmp.hpp"
#include "./image_loader_qoi.hpp"
#include "./image_loader_stb.hpp"
#include "./image_loader_webp.hpp"
#include "./image_loader_sdl_image.hpp"
#include <solanaceae/contact/components.hpp>
#include <solanaceae/tox_contacts/components.hpp>
@ -24,7 +24,7 @@ ToxAvatarLoader::ToxAvatarLoader(Contact3Registry& cr) : _cr(cr) {
_image_loaders.push_back(std::make_unique<ImageLoaderSDLBMP>());
_image_loaders.push_back(std::make_unique<ImageLoaderQOI>());
_image_loaders.push_back(std::make_unique<ImageLoaderWebP>());
_image_loaders.push_back(std::make_unique<ImageLoaderSTB>());
_image_loaders.push_back(std::make_unique<ImageLoaderSDLImage>());
}
static float getHue_6bytes(const uint8_t* data) {

View File

@ -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;