mirror of
https://github.com/matrix-construct/construct
synced 2024-11-05 05:18:54 +01:00
161 lines
2.7 KiB
C++
161 lines
2.7 KiB
C++
// 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.
|
|
|
|
using namespace ircd;
|
|
|
|
mapi::header
|
|
IRCD_MODULE
|
|
{
|
|
"Configuration module"
|
|
};
|
|
|
|
const ircd::m::room::id::buf
|
|
conf_room_id
|
|
{
|
|
"conf", ircd::my_host()
|
|
};
|
|
|
|
m::room
|
|
conf_room
|
|
{
|
|
conf_room_id
|
|
};
|
|
|
|
static void
|
|
_conf_set(const m::event &event,
|
|
const string_view &key,
|
|
const string_view &val)
|
|
try
|
|
{
|
|
conf::set(key, val);
|
|
|
|
const auto event_id
|
|
{
|
|
send(conf_room, at<"sender"_>(event), key,
|
|
{
|
|
{ "value", val }
|
|
})
|
|
};
|
|
|
|
char kvbuf[768];
|
|
notice(m::control, fmt::sprintf
|
|
{
|
|
kvbuf, "[%s] %s = %s", string_view{event_id}, key, val
|
|
});
|
|
}
|
|
catch(const std::exception &e)
|
|
{
|
|
notice(m::control, e.what());
|
|
}
|
|
|
|
static void
|
|
_conf_get(const m::event &event,
|
|
const string_view &key)
|
|
try
|
|
{
|
|
char vbuf[256];
|
|
const auto value
|
|
{
|
|
conf::get(key, vbuf)
|
|
};
|
|
|
|
char kvbuf[512];
|
|
notice(m::control, fmt::sprintf
|
|
{
|
|
kvbuf, "%s = %s", key, value
|
|
});
|
|
}
|
|
catch(const std::exception &e)
|
|
{
|
|
notice(m::control, e.what());
|
|
}
|
|
|
|
static void
|
|
_conf_list(const m::event &event)
|
|
try
|
|
{
|
|
char val[512];
|
|
std::stringstream ss;
|
|
ss << "<pre>";
|
|
for(const auto &p : conf::items)
|
|
ss << std::setw(32) << std::right << p.first
|
|
<< " = " << p.second->get(val)
|
|
<< "<br />";
|
|
ss << "</pre>";
|
|
|
|
msghtml(m::control, m::me.user_id, ss.str());
|
|
}
|
|
catch(const std::exception &e)
|
|
{
|
|
notice(m::control, e.what());
|
|
}
|
|
|
|
static void
|
|
_update_conf(const m::event &event)
|
|
noexcept
|
|
{
|
|
const auto &content
|
|
{
|
|
at<"content"_>(event)
|
|
};
|
|
|
|
const string_view &body
|
|
{
|
|
unquote(content.at("body"))
|
|
};
|
|
|
|
string_view tokens[4];
|
|
const size_t count
|
|
{
|
|
ircd::tokens(body, ' ', tokens)
|
|
};
|
|
|
|
const auto &cmd{tokens[0]};
|
|
const auto &key{tokens[1]};
|
|
const auto &val{tokens[3]};
|
|
|
|
if(cmd == "set" && count >= 4)
|
|
return _conf_set(event, key, val);
|
|
|
|
if(cmd == "get" && count >= 2)
|
|
return _conf_get(event, key);
|
|
|
|
if(cmd == "conf")
|
|
return _conf_list(event);
|
|
}
|
|
|
|
const m::hook
|
|
_update_conf_hook
|
|
{
|
|
_update_conf,
|
|
{
|
|
{ "_site", "vm notify" },
|
|
{ "room_id", "!control" },
|
|
{ "type", "m.room.message" },
|
|
{ "content",
|
|
{
|
|
{ "msgtype", "m.text" }
|
|
}}
|
|
}
|
|
};
|
|
|
|
const m::hook
|
|
_create_conf_hook
|
|
{
|
|
{
|
|
{ "_site", "vm notify" },
|
|
{ "room_id", "!ircd" },
|
|
{ "type", "m.room.create" },
|
|
},
|
|
[](const m::event &)
|
|
{
|
|
m::create(conf_room_id, m::me.user_id);
|
|
}
|
|
};
|