Compare commits

...

2 Commits

Author SHA1 Message Date
Green Sky
3db909d397 add tox connect command 2025-11-25 15:17:43 +01:00
Green Sky
5aec4523be update toxcore 2025-11-23 20:36:31 +01:00
2 changed files with 80 additions and 2 deletions

View File

@@ -18,7 +18,7 @@ if (NOT TARGET toxcore)
FetchContent_Declare(toxcore FetchContent_Declare(toxcore
GIT_REPOSITORY https://github.com/TokTok/c-toxcore.git GIT_REPOSITORY https://github.com/TokTok/c-toxcore.git
GIT_TAG v0.2.20 GIT_TAG v0.2.21
EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL
) )

View File

@@ -12,7 +12,9 @@
#include <solanaceae/contact/components.hpp> #include <solanaceae/contact/components.hpp>
#include <solanaceae/tox_contacts/components.hpp> #include <solanaceae/tox_contacts/components.hpp>
#include <iostream> #include <solanaceae/util/string_view_split.hpp>
#include <charconv>
void registerToxCommands( void registerToxCommands(
MessageCommandDispatcher& mcd, MessageCommandDispatcher& mcd,
@@ -227,5 +229,81 @@ void registerToxCommands(
}, },
"invite a tox friend to the same tox group" "invite a tox friend to the same tox group"
); );
mcd.registerCommand(
"tox", "tox",
"connect",
[&](std::string_view params, Message3Handle m) -> bool {
const auto contact_from = m.get<Message::Components::ContactFrom>().c;
const auto split = MM::std_utils::split(params, " ");
if (split.size() != 3) {
rmm.sendText(
contact_from,
"error, invalid number of params"
);
return true;
}
try {
const auto addr = split.at(0);
const auto port_sv = split.at(1);
const auto pubkey_sv = split.at(2);
uint16_t port{0};
{ // port
auto result = std::from_chars(port_sv.data(), port_sv.data() + port_sv.size(), port);
if (result.ec != std::errc{}) {
rmm.sendText(
contact_from,
"error, invalid port"
);
return true;
}
}
// pubkey
const auto pubkey = hex2bin(pubkey_sv);
if (pubkey.size() != 32/*TOX_PUBLIC_KEY_SIZE*/) {
rmm.sendText(
contact_from,
"error, invalid id/pubkey"
);
return true;
}
std::string response;
{
Tox_Err_Bootstrap err = t.toxBootstrap(std::string{addr}, port, pubkey);
if (err != Tox_Err_Bootstrap::TOX_ERR_BOOTSTRAP_OK) {
response += "add udp node failed with " + std::to_string(err) + "\n";
} else {
response += "add udp node succeeded\n";
}
}
{
Tox_Err_Bootstrap err = t.toxAddTcpRelay(std::string{addr}, port, pubkey);
if (err != Tox_Err_Bootstrap::TOX_ERR_BOOTSTRAP_OK) {
response += "add tcp relay failed with " + std::to_string(err);
} else {
response += "add tcp relay succeeded";
}
}
rmm.sendText(
contact_from,
response
);
return true;
} catch (...) {
rmm.sendText(
contact_from,
"error, unknown exception"
);
return true;
}
},
"connect to a DHT node. 'addr port pubkey'"
);
} }