Mercurial > irccd
view libirccd-daemon/irccd/daemon/rule_service.cpp @ 809:8460b4a34191
misc: reorganize namespaces, closes #952 @4h
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 16 Nov 2018 12:25:00 +0100 |
parents | libirccd/irccd/daemon/rule_service.cpp@292482f36454 |
children | d0fc4f14678d |
line wrap: on
line source
/* * rule_service.cpp -- rule service * * Copyright (c) 2013-2018 David Demelier <markand@malikania.fr> * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <stdexcept> #include <irccd/config.hpp> #include <irccd/string_util.hpp> #include "bot.hpp" #include "logger.hpp" #include "rule_service.hpp" #include "rule_util.hpp" namespace irccd::daemon { rule_service::rule_service(bot& bot) : bot_(bot) { } auto rule_service::list() const noexcept -> const std::vector<rule>& { return rules_; } void rule_service::add(rule rule) { rules_.push_back(std::move(rule)); } void rule_service::insert(rule rule, unsigned position) { assert(position <= rules_.size()); rules_.insert(rules_.begin() + position, std::move(rule)); } void rule_service::remove(unsigned position) { assert(position < rules_.size()); rules_.erase(rules_.begin() + position); } auto rule_service::require(unsigned position) const -> const rule& { if (position >= rules_.size()) throw rule_error(rule_error::invalid_index); return rules_[position]; } auto rule_service::require(unsigned position) -> rule& { if (position >= rules_.size()) throw rule_error(rule_error::invalid_index); return rules_[position]; } auto rule_service::solve(std::string_view server, std::string_view channel, std::string_view origin, std::string_view plugin, std::string_view event) noexcept -> bool { bool result = true; for (const auto& rule : rules_) if (rule.match(server, channel, origin, plugin, event)) result = rule.action == rule::action_type::accept; return result; } void rule_service::load(const config& cfg) noexcept { rules_.clear(); for (const auto& section : cfg) { if (section.get_key() != "rule") continue; try { rules_.push_back(rule_util::from_config(section)); } catch (const std::exception& ex) { bot_.get_log().warning("rule", "") << ex.what() << std::endl; } } } namespace logger { auto loggable_traits<rule>::get_category(const rule&) -> std::string_view { return "rule"; } auto loggable_traits<rule>::get_component(const rule&) -> std::string_view { return ""; } } // !logger } // !irccd::daemon