add management commands (add to admin or moderator list)
This commit is contained in:
parent
b0b117e615
commit
92cf42ead5
@ -15,6 +15,9 @@ add_executable(totato
|
||||
./message_command_dispatcher.hpp
|
||||
./message_command_dispatcher.cpp
|
||||
|
||||
./managment_commands.hpp
|
||||
./managment_commands.cpp
|
||||
|
||||
./tox_commands.hpp
|
||||
./tox_commands.cpp
|
||||
)
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "./message_cleanser.hpp"
|
||||
#include "./message_command_dispatcher.hpp"
|
||||
|
||||
#include "./managment_commands.hpp"
|
||||
#include "./tox_commands.hpp"
|
||||
|
||||
//#include <solanaceae/message3/components.hpp>
|
||||
@ -241,6 +242,7 @@ int main(int argc, char** argv) {
|
||||
}
|
||||
}
|
||||
|
||||
registerManagementCommands(mcd, conf, cr, rmm);
|
||||
registerToxCommands(mcd, conf, cr, rmm, tc, tpi);
|
||||
|
||||
conf.dump();
|
||||
@ -269,6 +271,8 @@ int main(int argc, char** argv) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(20)); // HACK: until i figure out the best main loop
|
||||
}
|
||||
|
||||
conf.dump();
|
||||
|
||||
std::cout << "\nTOTATO shutting down...\n";
|
||||
|
||||
return 0;
|
||||
|
138
src/managment_commands.cpp
Normal file
138
src/managment_commands.cpp
Normal file
@ -0,0 +1,138 @@
|
||||
#include "./managment_commands.hpp"
|
||||
|
||||
#include <solanaceae/contact/contact_model3.hpp>
|
||||
#include <solanaceae/util/config_model.hpp>
|
||||
|
||||
#include "./message_command_dispatcher.hpp"
|
||||
|
||||
#include <solanaceae/message3/components.hpp>
|
||||
#include <solanaceae/contact/components.hpp>
|
||||
#include <solanaceae/toxcore/utils.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
static std::optional<Contact3> getContactFromIDStr(
|
||||
Contact3Registry& cr,
|
||||
std::string_view id_str
|
||||
) {
|
||||
const std::vector<uint8_t> id = hex2bin(std::string{id_str});
|
||||
const auto view = cr.view<Contact::Components::ID>();
|
||||
const auto found_contact = std::find_if(view.begin(), view.end(), [&id, &view](const Contact3 c) -> bool {
|
||||
return view.get<Contact::Components::ID>(c).data == id;
|
||||
});
|
||||
|
||||
if (found_contact != view.end()) {
|
||||
return *found_contact;
|
||||
} else {
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
static std::string getStatusFromContact(
|
||||
Contact3Handle c
|
||||
) {
|
||||
std::string status_str;
|
||||
|
||||
// name
|
||||
if (c.all_of<Contact::Components::Name>()) {
|
||||
status_str += " name: " + c.get<Contact::Components::Name>().name;
|
||||
} else {
|
||||
status_str += " name: not found";
|
||||
}
|
||||
|
||||
// connection state
|
||||
if (c.all_of<Contact::Components::ConnectionState>()) {
|
||||
status_str += "\n connection: " + std::to_string(c.get<Contact::Components::ConnectionState>().state);
|
||||
} else {
|
||||
status_str += "\n connection: not found";
|
||||
}
|
||||
|
||||
return status_str;
|
||||
}
|
||||
|
||||
bool handleContactAddToGroup(
|
||||
ConfigModelI& conf,
|
||||
Contact3Registry& cr,
|
||||
RegistryMessageModel& rmm,
|
||||
|
||||
std::string_view params,
|
||||
Message3Handle m,
|
||||
|
||||
const std::string_view group
|
||||
) {
|
||||
const auto contact_from = m.get<Message::Components::ContactFrom>().c;
|
||||
|
||||
// TODO: move parameter parsing to mcd
|
||||
if (params.empty()) {
|
||||
rmm.sendText(
|
||||
contact_from,
|
||||
std::string{"error: command requires the ID for the contact to promote to "} + std::string{group}
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const auto target_opt = getContactFromIDStr(cr, params);
|
||||
if (!target_opt.has_value()) {
|
||||
rmm.sendText(
|
||||
contact_from,
|
||||
"error: unknown contact\n"
|
||||
"For practicality reasons the contact has to be observed once, before it can be added."
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string reply;
|
||||
|
||||
if (conf.get_bool("MessageCommandDispatcher", group, params).value_or(false)) {
|
||||
reply += "warning: contact already ";
|
||||
reply += group;
|
||||
reply += "!\n";
|
||||
}
|
||||
|
||||
conf.set("MessageCommandDispatcher", group, params, true);
|
||||
|
||||
reply += "Added '";
|
||||
reply += params;
|
||||
reply += "' to the ";
|
||||
reply += group;
|
||||
reply += "s.\n";
|
||||
reply += getStatusFromContact(Contact3Handle{cr, target_opt.value()});
|
||||
|
||||
rmm.sendText(
|
||||
contact_from,
|
||||
reply
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void registerManagementCommands(
|
||||
MessageCommandDispatcher& mcd,
|
||||
ConfigModelI& conf,
|
||||
Contact3Registry& cr,
|
||||
RegistryMessageModel& rmm
|
||||
) {
|
||||
mcd.registerCommand(
|
||||
"Management", "manage",
|
||||
"admin-add",
|
||||
[&](std::string_view params, Message3Handle m) -> bool {
|
||||
return handleContactAddToGroup(conf, cr, rmm, params, m, "admin");
|
||||
},
|
||||
"Add an admin by ID.",
|
||||
MessageCommandDispatcher::Perms::ADMIN
|
||||
);
|
||||
|
||||
mcd.registerCommand(
|
||||
"Management", "manage",
|
||||
"mod-add",
|
||||
[&](std::string_view params, Message3Handle m) -> bool {
|
||||
return handleContactAddToGroup(conf, cr, rmm, params, m, "moderator");
|
||||
},
|
||||
"Add a moderator by ID.",
|
||||
MessageCommandDispatcher::Perms::ADMIN
|
||||
);
|
||||
}
|
||||
|
16
src/managment_commands.hpp
Normal file
16
src/managment_commands.hpp
Normal file
@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
#include <solanaceae/contact/contact_model3.hpp>
|
||||
#include <solanaceae/message3/registry_message_model.hpp>
|
||||
|
||||
// fwd
|
||||
class MessageCommandDispatcher;
|
||||
struct ConfigModelI;
|
||||
|
||||
void registerManagementCommands(
|
||||
MessageCommandDispatcher& mcd,
|
||||
ConfigModelI& conf,
|
||||
Contact3Registry& cr,
|
||||
RegistryMessageModel& rmm
|
||||
);
|
||||
|
Loading…
Reference in New Issue
Block a user