0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-07-05 18:18:35 +02:00
construct/include/ircd/m/hook.h

83 lines
2.1 KiB
C
Raw Normal View History

2018-02-26 08:24:12 +01:00
// Matrix Construct
//
// Copyright (C) Matrix Construct Developers, Authors & Contributors
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
//
// 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 is present in all copies. The
// full license for this software is available in the LICENSE file.
#pragma once
#define HAVE_IRCD_M_HOOK_H
namespace ircd::m
{
struct hook;
}
struct ircd::m::hook
:instance_list<hook>
2018-02-26 08:24:12 +01:00
{
struct site;
IRCD_EXCEPTION(ircd::error, error)
json::strung _feature;
json::object feature;
m::event matching;
2018-02-26 08:24:12 +01:00
std::function<void (const m::event &)> function;
bool registered {false};
2018-02-26 08:24:12 +01:00
string_view site_name() const;
site *find_site() const;
bool match(const m::event &) const;
2018-02-26 08:24:12 +01:00
public:
hook(const json::members &, decltype(function));
hook(decltype(function), const json::members &);
2018-02-26 08:24:12 +01:00
hook(hook &&) = delete;
hook(const hook &) = delete;
virtual ~hook() noexcept;
};
/// The hook::site is the call-site for a hook. Each hook site is named
/// and registers itself with the master extern hook::site::list. Each hook
2018-02-26 08:24:12 +01:00
/// then registers itself with a hook::site. The site contains internal
/// state to manage the efficient calling of the participating hooks.
///
/// A hook::site can be created or destroyed at any time (for example if it's
/// in a module which is reloaded) while being agnostic to the hooks it
/// cooperates with.
2018-02-26 08:24:12 +01:00
struct ircd::m::hook::site
:instance_list<site>
2018-02-26 08:24:12 +01:00
{
json::strung _feature;
json::object feature;
size_t count {0};
2018-02-26 08:24:12 +01:00
string_view name() const;
std::multimap<string_view, hook *> origin;
std::multimap<string_view, hook *> room_id;
std::multimap<string_view, hook *> sender;
std::multimap<string_view, hook *> state_key;
std::multimap<string_view, hook *> type;
std::set<hook *> hooks;
2018-02-26 08:24:12 +01:00
friend class hook;
bool add(hook &);
bool del(hook &);
void call(hook &, const event &);
2018-02-26 08:24:12 +01:00
public:
void operator()(const event &);
site(const json::members &);
site(site &&) = delete;
site(const site &) = delete;
~site() noexcept;
};