diff --git a/instance.hpp b/instance.hpp index bcdd1d8..3fc195d 100644 --- a/instance.hpp +++ b/instance.hpp @@ -78,6 +78,11 @@ struct ModeSet { } return o.str(); } + bool listModeExists(char character, std::string_view value) { + return std::find_if(params.begin(), params.end(), [&] (const auto o) { + return std::get<0>(o) == character && std::get<1>(o) == value; + }) != params.end(); + } template void parse(std::string_view str, NetworkInfo& netInfo); }; diff --git a/services/chanserv.cpp b/services/chanserv.cpp index d1ba884..93fd452 100644 --- a/services/chanserv.cpp +++ b/services/chanserv.cpp @@ -64,7 +64,10 @@ async::result ChanServ::intitialize() { channel = res->get(); } // Check if user is operator in the channel - // TODO + if (!channel->mode.listModeExists('o', sender->uid.str())) { + co_await i->send_event(user.get_notice("Error: You need to be an operator in {} to be able to perform a registeration!"_format(args[0]), sender->uid)); + co_return; + } // Check that account does not exist already { auto channelregs_found = storage->get_all(where(c(&ChannelReg::name) == std::string(args[0]))); @@ -94,7 +97,7 @@ async::result ChanServ::initializeChannel(Channel *channel, const ChannelR // Get all owners nicks mode +o ModeSet initialModes; for (const auto& member : channel->members) { - if (member->loginName.has_value() && member->loginName.value() == channelReg.owner) { + if (member->loginName.has_value() && member->loginName.value() == channelReg.owner && !channel->mode.listModeExists('o', member->uid.str())) { initialModes.parse("+o {}"_format(member->uid.str()), i->netInfo); } }