lower cmake version, static flake build and mcd getting along
This commit is contained in:
parent
317bd5bb52
commit
d44574c284
70
flake.nix
70
flake.nix
@ -12,6 +12,8 @@
|
|||||||
flake-utils.lib.eachDefaultSystem (system:
|
flake-utils.lib.eachDefaultSystem (system:
|
||||||
let
|
let
|
||||||
pkgs = import nixpkgs { inherit system; };
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
|
||||||
|
# get deps
|
||||||
toxcore-src = pkgs.fetchFromGitHub {
|
toxcore-src = pkgs.fetchFromGitHub {
|
||||||
owner = "Green-Sky"; repo = "c-toxcore";
|
owner = "Green-Sky"; repo = "c-toxcore";
|
||||||
fetchSubmodules = true;
|
fetchSubmodules = true;
|
||||||
@ -53,44 +55,52 @@
|
|||||||
rev = "89e74b35f83d888f8aa2e5230811b8a5e2b101a7";
|
rev = "89e74b35f83d888f8aa2e5230811b8a5e2b101a7";
|
||||||
hash = "sha256-PQw2290ahYfU13tHGzBttwrvZBXK+wKh6UF4xfUaRWQ=";
|
hash = "sha256-PQw2290ahYfU13tHGzBttwrvZBXK+wKh6UF4xfUaRWQ=";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pname = "totato";
|
||||||
|
version = "0.0.0-dev";
|
||||||
|
|
||||||
|
src = ./.;
|
||||||
|
|
||||||
|
nativeBuildInputs = with pkgs; [
|
||||||
|
cmake
|
||||||
|
ninja
|
||||||
|
pkg-config
|
||||||
|
git # cmake FetchContent
|
||||||
|
];
|
||||||
|
|
||||||
|
cmakeFlags = [
|
||||||
|
#"-DFETCHCONTENT_SOURCE_DIR_TOXCORE=${pkgs.libtoxcore.src}"
|
||||||
|
"-DFETCHCONTENT_SOURCE_DIR_TOXCORE=${toxcore-src}"
|
||||||
|
"-DFETCHCONTENT_SOURCE_DIR_ENTT=${entt-src}" # the version is important
|
||||||
|
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_UTIL=${solanaceae_util-src}"
|
||||||
|
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_CONTACT=${solanaceae_contact-src}"
|
||||||
|
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_MESSAGE3=${solanaceae_message3-src}"
|
||||||
|
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_PLUGIN=${solanaceae_plugin-src}"
|
||||||
|
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_TOXCORE=${solanaceae_toxcore-src}"
|
||||||
|
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_TOX=${solanaceae_tox-src}"
|
||||||
|
"-DFETCHCONTENT_SOURCE_DIR_JSON=${pkgs.nlohmann_json.src}" # we care less about version here
|
||||||
|
];
|
||||||
|
|
||||||
|
# TODO: replace with install command
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
mv bin/totato $out/bin
|
||||||
|
'';
|
||||||
in {
|
in {
|
||||||
packages.default = pkgs.stdenv.mkDerivation {
|
packages.default = pkgs.stdenv.mkDerivation {
|
||||||
pname = "totato";
|
inherit pname version src nativeBuildInputs cmakeFlags installPhase;
|
||||||
version = "0.0.0-dev";
|
|
||||||
|
|
||||||
src = ./.;
|
|
||||||
|
|
||||||
nativeBuildInputs = with pkgs; [
|
|
||||||
cmake
|
|
||||||
ninja
|
|
||||||
pkg-config
|
|
||||||
git # cmake FetchContent
|
|
||||||
];
|
|
||||||
|
|
||||||
cmakeFlags = [
|
|
||||||
#"-DFETCHCONTENT_SOURCE_DIR_TOXCORE=${pkgs.libtoxcore.src}"
|
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_TOXCORE=${toxcore-src}"
|
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_ENTT=${entt-src}" # the version is important
|
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_UTIL=${solanaceae_util-src}"
|
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_CONTACT=${solanaceae_contact-src}"
|
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_MESSAGE3=${solanaceae_message3-src}"
|
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_PLUGIN=${solanaceae_plugin-src}"
|
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_TOXCORE=${solanaceae_toxcore-src}"
|
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_SOLANACEAE_TOX=${solanaceae_tox-src}"
|
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_JSON=${pkgs.nlohmann_json.src}" # we care less about version here
|
|
||||||
];
|
|
||||||
|
|
||||||
buildInputs = with pkgs; [
|
buildInputs = with pkgs; [
|
||||||
#(libsodium.override { stdenv = pkgs.pkgsStatic.stdenv; })
|
#(libsodium.override { stdenv = pkgs.pkgsStatic.stdenv; })
|
||||||
#pkgsStatic.libsodium
|
#pkgsStatic.libsodium
|
||||||
libsodium
|
libsodium
|
||||||
];
|
];
|
||||||
|
};
|
||||||
|
|
||||||
# TODO: replace with install command
|
packages.static = pkgs.pkgsStatic.stdenv.mkDerivation {
|
||||||
installPhase = ''
|
inherit pname version src nativeBuildInputs cmakeFlags installPhase;
|
||||||
mkdir -p $out/bin
|
buildInputs = with pkgs.pkgsStatic; [
|
||||||
mv bin/totato $out/bin
|
libsodium
|
||||||
'';
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
#apps.default = {
|
#apps.default = {
|
||||||
|
@ -11,6 +11,9 @@ add_executable(totato
|
|||||||
|
|
||||||
./message_cleanser.hpp
|
./message_cleanser.hpp
|
||||||
./message_cleanser.cpp
|
./message_cleanser.cpp
|
||||||
|
|
||||||
|
./message_command_dispatcher.hpp
|
||||||
|
./message_command_dispatcher.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_compile_features(totato PUBLIC cxx_std_17)
|
target_compile_features(totato PUBLIC cxx_std_17)
|
||||||
|
14
src/main.cpp
14
src/main.cpp
@ -13,6 +13,7 @@
|
|||||||
#include "./tox_client.hpp"
|
#include "./tox_client.hpp"
|
||||||
#include "./auto_dirty.hpp"
|
#include "./auto_dirty.hpp"
|
||||||
#include "./message_cleanser.hpp"
|
#include "./message_cleanser.hpp"
|
||||||
|
#include "./message_command_dispatcher.hpp"
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
@ -158,6 +159,19 @@ int main(int argc, char** argv) {
|
|||||||
RegistryMessageModel rmm{cr};
|
RegistryMessageModel rmm{cr};
|
||||||
MessageTimeSort mts{rmm};
|
MessageTimeSort mts{rmm};
|
||||||
MessageCleanser mc{cr, rmm};
|
MessageCleanser mc{cr, rmm};
|
||||||
|
MessageCommandDispatcher mcd{cr, rmm, conf};
|
||||||
|
|
||||||
|
{ // setup basic commands for bot
|
||||||
|
mcd.registerCommand(
|
||||||
|
"host", "",
|
||||||
|
"info",
|
||||||
|
[](std::string_view) -> bool {
|
||||||
|
std::cout << "INFO got called :)\n";
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
"Get basic information about this bot"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
PluginManager pm;
|
PluginManager pm;
|
||||||
|
|
||||||
|
@ -1,6 +1,20 @@
|
|||||||
#include "./message_command_dispatcher.hpp"
|
#include "./message_command_dispatcher.hpp"
|
||||||
|
|
||||||
#include <solanaceae/util/config_model.hpp>
|
#include <solanaceae/util/config_model.hpp>
|
||||||
|
#include <solanaceae/message3/components.hpp>
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
//MessageCommandDispatcher::Command::Command(Command&& other) :
|
||||||
|
//m(std::move(other.m)),
|
||||||
|
//m_prefix(std::move(other.m_prefix)),
|
||||||
|
//command(std::move(other.command)),
|
||||||
|
//fn(std::move(other.fn)),
|
||||||
|
//help_text(std::move(other.help_text))
|
||||||
|
//{
|
||||||
|
//// is this really needed?
|
||||||
|
//}
|
||||||
|
|
||||||
MessageCommandDispatcher::MessageCommandDispatcher(
|
MessageCommandDispatcher::MessageCommandDispatcher(
|
||||||
Contact3Registry& cr,
|
Contact3Registry& cr,
|
||||||
@ -9,6 +23,18 @@ MessageCommandDispatcher::MessageCommandDispatcher(
|
|||||||
) :
|
) :
|
||||||
_cr(cr), _rmm(rmm), _conf(conf)
|
_cr(cr), _rmm(rmm), _conf(conf)
|
||||||
{
|
{
|
||||||
|
_rmm.subscribe(this, RegistryMessageModel_Event::message_construct);
|
||||||
|
|
||||||
|
{ // setup basic commands for bot
|
||||||
|
registerCommand(
|
||||||
|
"host", "",
|
||||||
|
"help",
|
||||||
|
[this](std::string_view params) -> bool {
|
||||||
|
return helpCommand(params);
|
||||||
|
},
|
||||||
|
"Get help"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageCommandDispatcher::~MessageCommandDispatcher(void) {
|
MessageCommandDispatcher::~MessageCommandDispatcher(void) {
|
||||||
@ -17,11 +43,161 @@ MessageCommandDispatcher::~MessageCommandDispatcher(void) {
|
|||||||
void MessageCommandDispatcher::iterate(float time_delta) {
|
void MessageCommandDispatcher::iterate(float time_delta) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string_view get_first_word(std::string_view text) {
|
||||||
|
if (text.empty()) {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
// trim
|
||||||
|
const auto pos_first_non_space = text.find_first_not_of(' ');
|
||||||
|
if (pos_first_non_space == std::string_view::npos) {
|
||||||
|
// only contains spaces o.o
|
||||||
|
return ""; // should return text as is?
|
||||||
|
}
|
||||||
|
|
||||||
|
text = text.substr(pos_first_non_space);
|
||||||
|
|
||||||
|
const auto pos_first_space = text.find_first_of(' ');
|
||||||
|
if (pos_first_space == 0 || pos_first_space == std::string_view::npos) {
|
||||||
|
// does not contain spaces
|
||||||
|
// command is whole message
|
||||||
|
return text;
|
||||||
|
} else {
|
||||||
|
return text.substr(0, pos_first_space);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessageCommandDispatcher::registerCommand(
|
||||||
|
std::string_view m, // module
|
||||||
|
std::string_view m_prefix, // module prefix (if any)
|
||||||
|
std::string_view command, // command
|
||||||
|
std::function<bool(std::string_view params)>&& fn,
|
||||||
|
std::string_view help_text
|
||||||
|
) {
|
||||||
|
std::string full_command_string = std::string{m_prefix} + std::string{command};
|
||||||
|
|
||||||
|
if (_command_map.count(full_command_string)) {
|
||||||
|
std::cout << "MCD warning: overwriting existing '" << full_command_string << "'\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
_command_map[full_command_string] = Command{
|
||||||
|
std::string{m},
|
||||||
|
std::string{m_prefix},
|
||||||
|
std::string{command},
|
||||||
|
std::move(fn),
|
||||||
|
std::string{help_text}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MessageCommandDispatcher::helpCommand(std::string_view params) {
|
||||||
|
std::cout << "MCD: help got called '" << params << "'\n";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool MessageCommandDispatcher::onEvent(const Message::Events::MessageConstruct& e) {
|
bool MessageCommandDispatcher::onEvent(const Message::Events::MessageConstruct& e) {
|
||||||
|
if (!e.e.all_of<Message::Components::MessageText, Message::Components::TagUnread>()) {
|
||||||
|
std::cout << "MCD: got message that is not";
|
||||||
|
|
||||||
|
if (!e.e.all_of<Message::Components::MessageText>()) {
|
||||||
|
std::cout << " text";
|
||||||
|
}
|
||||||
|
if (!e.e.all_of<Message::Components::TagUnread>()) {
|
||||||
|
std::cout << " unread";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.e.any_of<Message::Components::TagMessageIsAction>()) {
|
||||||
|
std::cout << "MCD: got message that is";
|
||||||
|
if (e.e.all_of<Message::Components::TagMessageIsAction>()) {
|
||||||
|
std::cout << " action";
|
||||||
|
}
|
||||||
|
std::cout << "\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string_view message_text = e.e.get<Message::Components::MessageText>().text;
|
||||||
|
|
||||||
|
if (message_text.empty()) {
|
||||||
|
// empty message?
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: skip unrelyable synced
|
||||||
|
|
||||||
|
// TODO: is private
|
||||||
|
|
||||||
|
// TODO: has the permissions
|
||||||
|
|
||||||
|
|
||||||
|
if (false) { // is private
|
||||||
|
} else {
|
||||||
|
// check for command prefix
|
||||||
|
if (
|
||||||
|
message_text.at(0) != '!' &&
|
||||||
|
message_text.at(0) != '/'
|
||||||
|
) {
|
||||||
|
// does not start with command prefix, not for us
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove c prefix
|
||||||
|
message_text = message_text.substr(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message_text.empty()) {
|
||||||
|
// empty message?
|
||||||
|
std::cout << "MCD: got empty command\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "MCD: got command '" << message_text << "'\n";
|
||||||
|
|
||||||
|
|
||||||
|
std::string_view first_word;
|
||||||
|
std::string_view second_word;
|
||||||
|
|
||||||
|
first_word = get_first_word(message_text);
|
||||||
|
std::cout << "------- first_word:'" << first_word << "'\n";
|
||||||
|
if (first_word.size() != message_text.size()) {
|
||||||
|
second_word = get_first_word(
|
||||||
|
message_text.substr(
|
||||||
|
// TODO: optimize this
|
||||||
|
message_text.find(first_word)
|
||||||
|
+ first_word.size()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "------- second_word:'" << second_word << "' empty:" << second_word.empty() << "\n";
|
||||||
|
|
||||||
|
// first search first + space + second word
|
||||||
|
if (!second_word.empty()) {
|
||||||
|
std::string query {first_word};
|
||||||
|
query += " ";
|
||||||
|
query += second_word;
|
||||||
|
|
||||||
|
const auto command_it = _command_map.find(query);
|
||||||
|
if (command_it != _command_map.cend()) {
|
||||||
|
command_it->second.fn(message_text);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// then seach first word only
|
||||||
|
const auto command_it = _command_map.find(std::string{first_word});
|
||||||
|
if (command_it != _command_map.cend()) {
|
||||||
|
command_it->second.fn(message_text);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MessageCommandDispatcher::onEvent(const Message::Events::MessageUpdated& e) {
|
bool MessageCommandDispatcher::onEvent(const Message::Events::MessageUpdated&) {
|
||||||
|
// do i need this?
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,17 @@ class MessageCommandDispatcher : public RegistryMessageModelEventI {
|
|||||||
RegistryMessageModel& _rmm;
|
RegistryMessageModel& _rmm;
|
||||||
ConfigModelI& _conf;
|
ConfigModelI& _conf;
|
||||||
|
|
||||||
|
struct Command {
|
||||||
|
std::string m; // module
|
||||||
|
std::string m_prefix; // module prefix (if any)
|
||||||
|
std::string command; // command
|
||||||
|
std::function<bool(std::string_view params)> fn;
|
||||||
|
std::string help_text;
|
||||||
|
|
||||||
|
//Command(const Command&) = delete;
|
||||||
|
};
|
||||||
|
std::unordered_map<std::string, Command> _command_map;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MessageCommandDispatcher(Contact3Registry& cr, RegistryMessageModel& rmm, ConfigModelI& conf);
|
MessageCommandDispatcher(Contact3Registry& cr, RegistryMessageModel& rmm, ConfigModelI& conf);
|
||||||
~MessageCommandDispatcher(void);
|
~MessageCommandDispatcher(void);
|
||||||
@ -23,11 +34,19 @@ class MessageCommandDispatcher : public RegistryMessageModelEventI {
|
|||||||
// - everyone else?
|
// - everyone else?
|
||||||
// callable
|
// callable
|
||||||
// help text?
|
// help text?
|
||||||
|
|
||||||
|
|
||||||
void registerCommand(
|
void registerCommand(
|
||||||
std::string_view module,
|
std::string_view m, // module
|
||||||
std::string_view command
|
std::string_view m_prefix, // module prefix (if any)
|
||||||
|
std::string_view command, // command
|
||||||
|
std::function<bool(std::string_view params)>&& fn,
|
||||||
|
std::string_view help_text
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// generates a help
|
||||||
|
bool helpCommand(std::string_view params);
|
||||||
|
|
||||||
protected: // mm
|
protected: // mm
|
||||||
bool onEvent(const Message::Events::MessageConstruct& e) override;
|
bool onEvent(const Message::Events::MessageConstruct& e) override;
|
||||||
bool onEvent(const Message::Events::MessageUpdated& e) override;
|
bool onEvent(const Message::Events::MessageUpdated& e) override;
|
||||||
|
Loading…
Reference in New Issue
Block a user