0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-09-27 11:18:51 +02:00

modules: Reorg conf/console related; add s_control.

This commit is contained in:
Jason Volk 2018-03-05 02:44:03 -08:00
parent 8de1fde58c
commit 5c1cb57e9c
6 changed files with 280 additions and 68 deletions

View file

@ -76,7 +76,7 @@ console_init()
console_cancel();
console_active = true;
console_ctx = &ctx::cur();
console_module = new ircd::module{"console"};
console_module = new ircd::module{"s_console"};
}
void

View file

@ -111,10 +111,9 @@ ircd::m::init::modules()
{
const string_view prefixes[]
{
"m_", "client_", "key_", "federation_", "media_"
"s_", "m_", "client_", "key_", "federation_", "media_"
};
m::modules.emplace("conf"s, "conf"s);
for(const auto &name : mods::available())
if(startswith_any(name, std::begin(prefixes), std::end(prefixes)))
m::modules.emplace(name, name);
@ -213,13 +212,6 @@ ircd::m::init::bootstrap()
{ "topic", "The daemon's den." }
});
create(control, me.user_id);
join(control, me.user_id);
send(control, me.user_id, "m.room.name", "",
{
{ "name", "Control Room" }
});
send(user::users, me.user_id, "m.room.name", "",
{
{ "name", "Users" }
@ -232,9 +224,6 @@ ircd::m::init::bootstrap()
});
_keys.bootstrap();
notice(control, me.user_id, "Welcome to the control room.");
notice(control, me.user_id, "I am the daemon. You can talk to me in this room by highlighting me.");
}
bool

View file

@ -37,21 +37,34 @@ AM_LDFLAGS += \
###############################################################################
#
# (TBD) equipment
# Server modules
#
s_moduledir = @moduledir@
s_console_la_SOURCES = s_console.cc
s_conf_la_SOURCES = s_conf.cc
s_control_la_SOURCES = s_control.cc
s_module_LTLIBRARIES = \
s_console.la \
s_conf.la \
s_control.la \
###
###############################################################################
#
# Messages / protocol
#
# This puts the source in vm/ but the installed
# library is vm_X.so in the main modules dir.
m_moduledir = @moduledir@
console_la_SOURCES = console.cc
conf_la_SOURCES = conf.cc
m_noop_la_SOURCES = m_noop.cc
m_presence_la_SOURCES = m_presence.cc
m_module_LTLIBRARIES = \
console.la \
conf.la \
m_noop.la \
m_presence.la \
###
###############################################################################

121
modules/s_conf.cc Normal file
View file

@ -0,0 +1,121 @@
// 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
update_conf(const m::event &event)
noexcept
{
const auto &content
{
at<"content"_>(event)
};
const auto &key
{
at<"state_key"_>(event)
};
const string_view &value
{
unquote(content.at("value"))
};
ircd::conf::set(key, value);
}
const m::hook
update_conf_hook
{
update_conf,
{
{ "_site", "vm notify" },
{ "room_id", "!conf" },
{ "type", "ircd.conf.item" },
}
};
static void
init_conf_items(const m::event &)
{
}
const m::hook
init_conf_items_hook
{
init_conf_items,
{
{ "_site", "vm notify" },
{ "room_id", "!ircd" },
{ "type", "m.room.member" },
{ "membership", "join" },
{ "state_key", "@ircd" },
}
};
static void
create_conf_item(const string_view &key,
const conf::item<> &item)
{
thread_local char vbuf[4_KiB];
const string_view &val
{
item.get(vbuf)
};
send(conf_room, m::me.user_id, "ircd.conf.item", key,
{
{ "value", val }
});
}
static void
create_conf_room(const m::event &)
{
m::create(conf_room_id, m::me.user_id);
for(const auto &p : conf::items)
{
const auto &key{p.first};
const auto &item{p.second}; assert(item);
create_conf_item(key, *item);
}
}
const m::hook
create_conf_room_hook
{
create_conf_room,
{
{ "_site", "vm notify" },
{ "room_id", "!ircd" },
{ "type", "m.room.create" },
}
};

View file

@ -283,6 +283,7 @@ console_cmd__mod_reload(const string_view &line)
//
static bool console_cmd__db_list(const string_view &line);
static bool console_cmd__db_prop(const string_view &line);
bool
console_cmd__db(const string_view &line)
@ -294,12 +295,31 @@ console_cmd__db(const string_view &line)
switch(hash(token(line, " ", 0)))
{
case hash("prop"):
return console_cmd__db_prop(args);
default:
case hash("list"):
return console_cmd__db_list(args);
}
}
bool
console_cmd__db_prop(const string_view &line)
{
const auto dbname
{
token(line, ' ', 0)
};
const auto property
{
token(line, ' ', 1)
};
return true;
}
bool
console_cmd__db_list(const string_view &line)
{
@ -976,7 +996,11 @@ console_cmd__exec_file(const string_view &line)
id && m::sigil(id) == m::id::USER? id : string_view{}
};
struct m::vm::eval::opts opts;
m::vm::opts opts;
opts.non_conform.set(m::event::conforms::MISSING_PREV_STATE);
opts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP);
opts.prev_check_exists = false;
opts.notify = false;
m::vm::eval eval
{
opts
@ -1157,6 +1181,11 @@ console_cmd__room__members(const string_view &line)
token(line, ' ', 0)
};
const string_view membership
{
token_count(line, ' ') > 1? token(line, ' ', 1) : string_view{}
};
const m::room room
{
room_id
@ -1167,10 +1196,15 @@ console_cmd__room__members(const string_view &line)
room
};
members.for_each([](const m::event &event)
const auto closure{[](const m::event &event)
{
out << pretty_oneline(event) << std::endl;
});
}};
if(membership)
members.for_each(membership, closure);
else
members.for_each(closure);
return true;
}
@ -1210,9 +1244,14 @@ console_cmd__room__state(const string_view &line)
token(line, ' ', 0)
};
const auto &event_id
{
token(line, ' ', 1, {})
};
const m::room room
{
room_id
room_id, event_id
};
const m::room::state state

View file

@ -17,15 +17,21 @@ IRCD_MODULE
};
const ircd::m::room::id::buf
conf_room_id
control_room_id
{
"conf", ircd::my_host()
"!control", ircd::my_host()
};
m::room
conf_room
const m::room
control_room
{
conf_room_id
control_room_id
};
const ircd::m::room::id::buf
conf_room_id
{
"!conf", ircd::my_host()
};
static void
@ -34,25 +40,23 @@ _conf_set(const m::event &event,
const string_view &val)
try
{
conf::set(key, val);
const auto event_id
{
send(conf_room, at<"sender"_>(event), key,
send(conf_room_id, at<"sender"_>(event), "ircd.conf.item", key,
{
{ "value", val }
})
};
char kvbuf[768];
notice(m::control, fmt::sprintf
notice(control_room, fmt::sprintf
{
kvbuf, "[%s] %s = %s", string_view{event_id}, key, val
});
}
catch(const std::exception &e)
{
notice(m::control, e.what());
notice(control_room, e.what());
}
static void
@ -60,21 +64,25 @@ _conf_get(const m::event &event,
const string_view &key)
try
{
char vbuf[256];
const auto value
const m::room conf_room{conf_room_id};
conf_room.get("ircd.conf.item", key, [&key]
(const m::event &event)
{
conf::get(key, vbuf)
};
const auto &value
{
unquote(at<"content"_>(event).at("value"))
};
char kvbuf[512];
notice(m::control, fmt::sprintf
{
kvbuf, "%s = %s", key, value
char kvbuf[256];
notice(control_room, fmt::sprintf
{
kvbuf, "%s = %s", key, value
});
});
}
catch(const std::exception &e)
{
notice(m::control, e.what());
notice(control_room, e.what());
}
static void
@ -90,31 +98,21 @@ try
<< "<br />";
ss << "</pre>";
msghtml(m::control, m::me.user_id, ss.str());
msghtml(control_room, m::me.user_id, ss.str());
}
catch(const std::exception &e)
{
notice(m::control, e.what());
notice(control_room, e.what());
}
static void
_update_conf(const m::event &event)
noexcept
_cmd__conf(const m::event &event,
const string_view &line)
{
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)
ircd::tokens(line, ' ', tokens)
};
const auto &cmd{tokens[0]};
@ -127,14 +125,55 @@ noexcept
if(cmd == "get" && count >= 2)
return _conf_get(event, key);
if(cmd == "conf")
if(cmd == "list")
return _conf_list(event);
}
const m::hook
_update_conf_hook
static void
_cmd__die(const m::event &event,
const string_view &line)
{
_update_conf,
ircd::post([]
{
ircd::quit();
});
ctx::yield();
}
static void
command_control(const m::event &event)
noexcept
{
const auto &content
{
at<"content"_>(event)
};
const string_view &body
{
unquote(content.at("body"))
};
const string_view &cmd
{
token(body, ' ', 0, {})
};
switch(hash(cmd))
{
case hash("conf"):
return _cmd__conf(event, tokens_after(body, ' ', 0));
case hash("die"):
return _cmd__die(event, tokens_after(body, ' ', 0));
}
}
const m::hook
command_control_hook
{
command_control,
{
{ "_site", "vm notify" },
{ "room_id", "!control" },
@ -146,16 +185,27 @@ _update_conf_hook
}
};
const m::hook
_create_conf_hook
static void
create_control_room(const m::event &)
{
create(control_room_id, m::me.user_id);
join(control_room, m::me.user_id);
send(control_room, m::me.user_id, "m.room.name", "",
{
{ "name", "Control Room" }
});
notice(control_room, m::me.user_id, "Welcome to the control room.");
notice(control_room, m::me.user_id, "I am the daemon. You can talk to me in this room by highlighting me.");
}
const m::hook
create_control_hook
{
create_control_room,
{
{ "_site", "vm notify" },
{ "room_id", "!ircd" },
{ "type", "m.room.create" },
},
[](const m::event &)
{
m::create(conf_room_id, m::me.user_id);
}
};