mirror of
https://github.com/ByteWelder/Tactility.git
synced 2026-10-17 10:55:06 +00:00
60 lines
1.4 KiB
C++
60 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#ifdef ESP_PLATFORM
|
|
#include <sdkconfig.h>
|
|
#endif
|
|
|
|
#if defined(CONFIG_SOC_WIFI_SUPPORTED) || defined(CONFIG_SLAVE_SOC_WIFI_SUPPORTED)
|
|
|
|
#include <Tactility/RecursiveMutex.h>
|
|
|
|
#include <cstddef>
|
|
#include <deque>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace tt::app::chat {
|
|
|
|
constexpr size_t MAX_MESSAGES = 100;
|
|
|
|
struct StoredMessage {
|
|
std::string displayText;
|
|
std::string target; // for channel filtering
|
|
bool isOwn;
|
|
};
|
|
|
|
/** Thread safety: All public methods are mutex-protected.
|
|
* LVGL sync lock must be held separately when updating UI. */
|
|
class ChatState {
|
|
|
|
mutable RecursiveMutex mutex;
|
|
|
|
std::deque<StoredMessage> messages;
|
|
std::string currentChannel = "#general";
|
|
std::string localNickname = "Device";
|
|
|
|
public:
|
|
ChatState() = default;
|
|
~ChatState() = default;
|
|
|
|
ChatState(const ChatState&) = delete;
|
|
ChatState& operator=(const ChatState&) = delete;
|
|
ChatState(ChatState&&) = delete;
|
|
ChatState& operator=(ChatState&&) = delete;
|
|
|
|
void setLocalNickname(const std::string& nickname);
|
|
std::string getLocalNickname() const;
|
|
|
|
void setCurrentChannel(const std::string& channel);
|
|
std::string getCurrentChannel() const;
|
|
|
|
void addMessage(const StoredMessage& msg);
|
|
|
|
/** Returns messages matching the current channel (or broadcast). */
|
|
std::vector<StoredMessage> getFilteredMessages() const;
|
|
};
|
|
|
|
} // namespace tt::app::chat
|
|
|
|
#endif // CONFIG_SOC_WIFI_SUPPORTED || CONFIG_SLAVE_SOC_WIFI_SUPPORTED
|