add moderator
This commit is contained in:
parent
3b7f1ba312
commit
b0b117e615
@ -14,6 +14,9 @@ add_executable(totato
|
|||||||
|
|
||||||
./message_command_dispatcher.hpp
|
./message_command_dispatcher.hpp
|
||||||
./message_command_dispatcher.cpp
|
./message_command_dispatcher.cpp
|
||||||
|
|
||||||
|
./tox_commands.hpp
|
||||||
|
./tox_commands.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_compile_features(totato PUBLIC cxx_std_17)
|
target_compile_features(totato PUBLIC cxx_std_17)
|
||||||
|
136
src/main.cpp
136
src/main.cpp
@ -15,10 +15,12 @@
|
|||||||
#include "./message_cleanser.hpp"
|
#include "./message_cleanser.hpp"
|
||||||
#include "./message_command_dispatcher.hpp"
|
#include "./message_command_dispatcher.hpp"
|
||||||
|
|
||||||
#include <solanaceae/message3/components.hpp>
|
#include "./tox_commands.hpp"
|
||||||
#include <solanaceae/contact/components.hpp>
|
|
||||||
#include <solanaceae/tox_contacts/components.hpp>
|
//#include <solanaceae/message3/components.hpp>
|
||||||
#include <solanaceae/toxcore/utils.hpp>
|
//#include <solanaceae/contact/components.hpp>
|
||||||
|
//#include <solanaceae/tox_contacts/components.hpp>
|
||||||
|
//#include <solanaceae/toxcore/utils.hpp>
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
@ -203,130 +205,6 @@ int main(int argc, char** argv) {
|
|||||||
ToxMessageManager tmm{rmm, cr, tcm, tc, tc};
|
ToxMessageManager tmm{rmm, cr, tcm, tc, tc};
|
||||||
ToxTransferManager ttm{rmm, cr, tcm, tc, tc};
|
ToxTransferManager ttm{rmm, cr, tcm, tc, tc};
|
||||||
|
|
||||||
{ // setup more advanced commands
|
|
||||||
mcd.registerCommand(
|
|
||||||
"tox", "tox",
|
|
||||||
"status",
|
|
||||||
[&](std::string_view, Message3Handle m) -> bool {
|
|
||||||
const auto tox_self_status = tc.toxSelfGetConnectionStatus();
|
|
||||||
|
|
||||||
const auto contact_from = m.get<Message::Components::ContactFrom>().c;
|
|
||||||
|
|
||||||
std::string reply{"dht:"};
|
|
||||||
|
|
||||||
if (tox_self_status == Tox_Connection::TOX_CONNECTION_UDP) {
|
|
||||||
reply += "upd-direct";
|
|
||||||
} else if (tox_self_status == Tox_Connection::TOX_CONNECTION_TCP) {
|
|
||||||
reply += "tcp-relayed";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cr.all_of<Contact::Components::ToxFriendEphemeral>(contact_from)) {
|
|
||||||
const auto con_opt = tc.toxFriendGetConnectionStatus(cr.get<Contact::Components::ToxFriendEphemeral>(contact_from).friend_number);
|
|
||||||
if (!con_opt.has_value() || con_opt.value() == Tox_Connection::TOX_CONNECTION_NONE) {
|
|
||||||
reply += "\nfriend:offline";
|
|
||||||
} else if (con_opt.value() == Tox_Connection::TOX_CONNECTION_UDP) {
|
|
||||||
reply += "\nfriend:udp-direct";
|
|
||||||
} else if (con_opt.value() == Tox_Connection::TOX_CONNECTION_TCP) {
|
|
||||||
reply += "\nfriend:tcp-relayed";
|
|
||||||
}
|
|
||||||
} else if (cr.all_of<Contact::Components::ToxGroupPeerEphemeral>(contact_from)) {
|
|
||||||
const auto [group_number, peer_number] = cr.get<Contact::Components::ToxGroupPeerEphemeral>(contact_from);
|
|
||||||
|
|
||||||
const auto [con_opt, _] = tc.toxGroupPeerGetConnectionStatus(group_number, peer_number);
|
|
||||||
if (!con_opt.has_value() || con_opt.value() == Tox_Connection::TOX_CONNECTION_NONE) {
|
|
||||||
reply += "\ngroup-peer:offline";
|
|
||||||
} else if (con_opt.value() == Tox_Connection::TOX_CONNECTION_UDP) {
|
|
||||||
reply += "\ngroup-peer:udp-direct";
|
|
||||||
} else if (con_opt.value() == Tox_Connection::TOX_CONNECTION_TCP) {
|
|
||||||
reply += "\ngroup-peer:tcp-relayed";
|
|
||||||
}
|
|
||||||
} else if (cr.any_of<Contact::Components::ToxFriendPersistent, Contact::Components::ToxGroupPeerPersistent>(contact_from)) {
|
|
||||||
reply += "\noffline";
|
|
||||||
} else {
|
|
||||||
reply += "\nunk";
|
|
||||||
}
|
|
||||||
|
|
||||||
rmm.sendText(
|
|
||||||
contact_from,
|
|
||||||
reply
|
|
||||||
);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
"Query the tox status of dht and to you.",
|
|
||||||
MessageCommandDispatcher::Perms::EVERYONE
|
|
||||||
);
|
|
||||||
|
|
||||||
mcd.registerCommand(
|
|
||||||
"tox", "tox",
|
|
||||||
"add",
|
|
||||||
[&](std::string_view params, Message3Handle m) -> bool {
|
|
||||||
const auto contact_from = m.get<Message::Components::ContactFrom>().c;
|
|
||||||
|
|
||||||
if (params.size() != 38*2) {
|
|
||||||
rmm.sendText(
|
|
||||||
contact_from,
|
|
||||||
"error adding friend, id is not the correct size!"
|
|
||||||
);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: add tcm interface
|
|
||||||
const auto [_, err] = tc.toxFriendAdd(hex2bin(std::string{params}), "Add me, I am totato");
|
|
||||||
|
|
||||||
if (err == Tox_Err_Friend_Add::TOX_ERR_FRIEND_ADD_OK) {
|
|
||||||
rmm.sendText(
|
|
||||||
contact_from,
|
|
||||||
"freind request sent"
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
rmm.sendText(
|
|
||||||
contact_from,
|
|
||||||
"error adding friend, error code " + std::to_string(err)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
"add a tox friend by id"
|
|
||||||
);
|
|
||||||
|
|
||||||
mcd.registerCommand(
|
|
||||||
"tox", "tox",
|
|
||||||
"join",
|
|
||||||
[&](std::string_view params, Message3Handle m) -> bool {
|
|
||||||
const auto contact_from = m.get<Message::Components::ContactFrom>().c;
|
|
||||||
|
|
||||||
if (params.size() != 32*2) {
|
|
||||||
rmm.sendText(
|
|
||||||
contact_from,
|
|
||||||
"error joining group, id is not the correct size!"
|
|
||||||
);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto name_opt = conf.get_string("tox", "name");
|
|
||||||
|
|
||||||
// TODO: add tcm interface
|
|
||||||
const auto [_, err] = tc.toxGroupJoin(hex2bin(std::string{params}), std::string{name_opt.value_or("no-name-found")}, "");
|
|
||||||
if (err == Tox_Err_Group_Join::TOX_ERR_GROUP_JOIN_OK) {
|
|
||||||
rmm.sendText(
|
|
||||||
contact_from,
|
|
||||||
"joining group..."
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
rmm.sendText(
|
|
||||||
contact_from,
|
|
||||||
"error joining group, error code " + std::to_string(err)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
"join a tox group by id"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
{ // setup plugin instances
|
{ // setup plugin instances
|
||||||
g_provideInstance<ConfigModelI>("ConfigModelI", "host", &conf);
|
g_provideInstance<ConfigModelI>("ConfigModelI", "host", &conf);
|
||||||
g_provideInstance<Contact3Registry>("Contact3Registry", "host", &cr);
|
g_provideInstance<Contact3Registry>("Contact3Registry", "host", &cr);
|
||||||
@ -363,6 +241,8 @@ int main(int argc, char** argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
registerToxCommands(mcd, conf, cr, rmm, tc, tpi);
|
||||||
|
|
||||||
conf.dump();
|
conf.dump();
|
||||||
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(10)); // at startup, just to be safe
|
std::this_thread::sleep_for(std::chrono::milliseconds(10)); // at startup, just to be safe
|
||||||
|
@ -29,8 +29,9 @@ MessageCommandDispatcher::MessageCommandDispatcher(
|
|||||||
) :
|
) :
|
||||||
_cr(cr), _rmm(rmm), _conf(conf)
|
_cr(cr), _rmm(rmm), _conf(conf)
|
||||||
{
|
{
|
||||||
// overwrite default admin to false
|
// overwrite default admin and moderator to false
|
||||||
_conf.set("MessageCommandDispatcher", "admin", false);
|
_conf.set("MessageCommandDispatcher", "admin", false);
|
||||||
|
_conf.set("MessageCommandDispatcher", "moderator", false);
|
||||||
|
|
||||||
_rmm.subscribe(this, RegistryMessageModel_Event::message_construct);
|
_rmm.subscribe(this, RegistryMessageModel_Event::message_construct);
|
||||||
|
|
||||||
@ -203,7 +204,13 @@ bool MessageCommandDispatcher::hasPermission(const Command& cmd, const Contact3
|
|||||||
|
|
||||||
return is_admin_opt.value();
|
return is_admin_opt.value();
|
||||||
}
|
}
|
||||||
// TODO: moderator
|
|
||||||
|
if ((cmd.perms & Perms::MODERATOR) != 0) {
|
||||||
|
auto is_mod_opt = _conf.get_bool("MessageCommandDispatcher", "moderator", id_str);
|
||||||
|
assert(is_mod_opt.has_value);
|
||||||
|
|
||||||
|
return is_mod_opt.value();
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
147
src/tox_commands.cpp
Normal file
147
src/tox_commands.cpp
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
#include "./tox_commands.hpp"
|
||||||
|
|
||||||
|
#include <solanaceae/contact/contact_model3.hpp>
|
||||||
|
#include <solanaceae/util/config_model.hpp>
|
||||||
|
#include <solanaceae/toxcore/tox_interface.hpp>
|
||||||
|
#include <solanaceae/toxcore/tox_private_interface.hpp>
|
||||||
|
|
||||||
|
#include "./message_command_dispatcher.hpp"
|
||||||
|
|
||||||
|
#include <solanaceae/message3/components.hpp>
|
||||||
|
#include <solanaceae/contact/components.hpp>
|
||||||
|
#include <solanaceae/tox_contacts/components.hpp>
|
||||||
|
#include <solanaceae/toxcore/utils.hpp>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
void registerToxCommands(
|
||||||
|
MessageCommandDispatcher& mcd,
|
||||||
|
ConfigModelI& conf,
|
||||||
|
Contact3Registry& cr,
|
||||||
|
RegistryMessageModel& rmm,
|
||||||
|
ToxI& t,
|
||||||
|
ToxPrivateI& tp
|
||||||
|
) {
|
||||||
|
mcd.registerCommand(
|
||||||
|
"tox", "tox",
|
||||||
|
"status",
|
||||||
|
[&](std::string_view, Message3Handle m) -> bool {
|
||||||
|
const auto tox_self_status = t.toxSelfGetConnectionStatus();
|
||||||
|
|
||||||
|
const auto contact_from = m.get<Message::Components::ContactFrom>().c;
|
||||||
|
|
||||||
|
std::string reply{"dht:"};
|
||||||
|
|
||||||
|
if (tox_self_status == Tox_Connection::TOX_CONNECTION_UDP) {
|
||||||
|
reply += "upd-direct";
|
||||||
|
} else if (tox_self_status == Tox_Connection::TOX_CONNECTION_TCP) {
|
||||||
|
reply += "tcp-relayed";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cr.all_of<Contact::Components::ToxFriendEphemeral>(contact_from)) {
|
||||||
|
const auto con_opt = t.toxFriendGetConnectionStatus(cr.get<Contact::Components::ToxFriendEphemeral>(contact_from).friend_number);
|
||||||
|
if (!con_opt.has_value() || con_opt.value() == Tox_Connection::TOX_CONNECTION_NONE) {
|
||||||
|
reply += "\nfriend:offline";
|
||||||
|
} else if (con_opt.value() == Tox_Connection::TOX_CONNECTION_UDP) {
|
||||||
|
reply += "\nfriend:udp-direct";
|
||||||
|
} else if (con_opt.value() == Tox_Connection::TOX_CONNECTION_TCP) {
|
||||||
|
reply += "\nfriend:tcp-relayed";
|
||||||
|
}
|
||||||
|
} else if (cr.all_of<Contact::Components::ToxGroupPeerEphemeral>(contact_from)) {
|
||||||
|
const auto [group_number, peer_number] = cr.get<Contact::Components::ToxGroupPeerEphemeral>(contact_from);
|
||||||
|
|
||||||
|
const auto [con_opt, _] = t.toxGroupPeerGetConnectionStatus(group_number, peer_number);
|
||||||
|
if (!con_opt.has_value() || con_opt.value() == Tox_Connection::TOX_CONNECTION_NONE) {
|
||||||
|
reply += "\ngroup-peer:offline";
|
||||||
|
} else if (con_opt.value() == Tox_Connection::TOX_CONNECTION_UDP) {
|
||||||
|
reply += "\ngroup-peer:udp-direct";
|
||||||
|
} else if (con_opt.value() == Tox_Connection::TOX_CONNECTION_TCP) {
|
||||||
|
reply += "\ngroup-peer:tcp-relayed";
|
||||||
|
}
|
||||||
|
} else if (cr.any_of<Contact::Components::ToxFriendPersistent, Contact::Components::ToxGroupPeerPersistent>(contact_from)) {
|
||||||
|
reply += "\noffline";
|
||||||
|
} else {
|
||||||
|
reply += "\nunk";
|
||||||
|
}
|
||||||
|
|
||||||
|
rmm.sendText(
|
||||||
|
contact_from,
|
||||||
|
reply
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
"Query the tox status of dht and to you.",
|
||||||
|
MessageCommandDispatcher::Perms::EVERYONE
|
||||||
|
);
|
||||||
|
|
||||||
|
mcd.registerCommand(
|
||||||
|
"tox", "tox",
|
||||||
|
"add",
|
||||||
|
[&](std::string_view params, Message3Handle m) -> bool {
|
||||||
|
const auto contact_from = m.get<Message::Components::ContactFrom>().c;
|
||||||
|
|
||||||
|
if (params.size() != 38*2) {
|
||||||
|
rmm.sendText(
|
||||||
|
contact_from,
|
||||||
|
"error adding friend, id is not the correct size!"
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: add tcm interface
|
||||||
|
const auto [_, err] = t.toxFriendAdd(hex2bin(std::string{params}), "Add me, I am totato");
|
||||||
|
|
||||||
|
if (err == Tox_Err_Friend_Add::TOX_ERR_FRIEND_ADD_OK) {
|
||||||
|
rmm.sendText(
|
||||||
|
contact_from,
|
||||||
|
"freind request sent"
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
rmm.sendText(
|
||||||
|
contact_from,
|
||||||
|
"error adding friend, error code " + std::to_string(err)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
"add a tox friend by id"
|
||||||
|
);
|
||||||
|
|
||||||
|
mcd.registerCommand(
|
||||||
|
"tox", "tox",
|
||||||
|
"join",
|
||||||
|
[&](std::string_view params, Message3Handle m) -> bool {
|
||||||
|
const auto contact_from = m.get<Message::Components::ContactFrom>().c;
|
||||||
|
|
||||||
|
if (params.size() != 32*2) {
|
||||||
|
rmm.sendText(
|
||||||
|
contact_from,
|
||||||
|
"error joining group, id is not the correct size!"
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto name_opt = conf.get_string("tox", "name");
|
||||||
|
|
||||||
|
// TODO: add tcm interface
|
||||||
|
const auto [_, err] = t.toxGroupJoin(hex2bin(std::string{params}), std::string{name_opt.value_or("no-name-found")}, "");
|
||||||
|
if (err == Tox_Err_Group_Join::TOX_ERR_GROUP_JOIN_OK) {
|
||||||
|
rmm.sendText(
|
||||||
|
contact_from,
|
||||||
|
"joining group..."
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
rmm.sendText(
|
||||||
|
contact_from,
|
||||||
|
"error joining group, error code " + std::to_string(err)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
"join a tox group by id"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
20
src/tox_commands.hpp
Normal file
20
src/tox_commands.hpp
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <solanaceae/contact/contact_model3.hpp>
|
||||||
|
#include <solanaceae/message3/registry_message_model.hpp>
|
||||||
|
|
||||||
|
// fwd
|
||||||
|
class MessageCommandDispatcher;
|
||||||
|
struct ConfigModelI;
|
||||||
|
class ToxI;
|
||||||
|
class ToxPrivateI;
|
||||||
|
|
||||||
|
void registerToxCommands(
|
||||||
|
MessageCommandDispatcher& mcd,
|
||||||
|
ConfigModelI& conf,
|
||||||
|
Contact3Registry& cr,
|
||||||
|
RegistryMessageModel& rmm,
|
||||||
|
ToxI& t,
|
||||||
|
ToxPrivateI& tp
|
||||||
|
);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user