2018-02-04 03:22:01 +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.
|
2017-08-23 23:10:28 +02:00
|
|
|
|
2017-08-18 20:19:13 +02:00
|
|
|
#pragma once
|
2017-09-25 03:05:42 +02:00
|
|
|
#define HAVE_IRCD_M_USER_H
|
2017-08-23 23:10:28 +02:00
|
|
|
|
2017-09-25 03:05:42 +02:00
|
|
|
namespace ircd::m
|
|
|
|
{
|
|
|
|
struct user;
|
2018-02-15 22:11:51 +01:00
|
|
|
|
2018-02-25 09:19:03 +01:00
|
|
|
bool my(const user &);
|
2018-03-09 18:00:28 +01:00
|
|
|
bool exists(const user &);
|
2018-02-15 22:11:51 +01:00
|
|
|
bool exists(const id::user &);
|
2018-03-09 18:00:28 +01:00
|
|
|
user create(const id::user &, const json::members &args = {});
|
2017-09-25 03:05:42 +02:00
|
|
|
}
|
2017-08-18 20:19:13 +02:00
|
|
|
|
2017-09-25 03:05:42 +02:00
|
|
|
struct ircd::m::user
|
2017-08-23 23:10:28 +02:00
|
|
|
{
|
2018-02-15 22:08:10 +01:00
|
|
|
struct room;
|
2018-04-12 00:28:00 +02:00
|
|
|
struct rooms;
|
2018-04-12 01:12:26 +02:00
|
|
|
struct mitsein;
|
2018-08-24 22:56:52 +02:00
|
|
|
struct events;
|
2017-09-25 03:05:42 +02:00
|
|
|
using id = m::id::user;
|
2018-04-12 00:04:04 +02:00
|
|
|
using closure = std::function<void (const user &)>;
|
|
|
|
using closure_bool = std::function<bool (const user &)>;
|
2017-09-25 03:05:42 +02:00
|
|
|
|
2018-04-20 06:45:39 +02:00
|
|
|
static m::room users;
|
|
|
|
static m::room tokens;
|
|
|
|
|
2017-09-25 03:05:42 +02:00
|
|
|
id user_id;
|
2017-09-08 11:32:49 +02:00
|
|
|
|
2018-03-06 08:39:44 +01:00
|
|
|
operator const id &() const;
|
2017-08-18 20:19:13 +02:00
|
|
|
|
2018-02-15 22:05:00 +01:00
|
|
|
static string_view gen_access_token(const mutable_buffer &out);
|
|
|
|
|
2018-02-15 22:08:10 +01:00
|
|
|
id::room room_id(const mutable_buffer &) const;
|
|
|
|
id::room::buf room_id() const;
|
|
|
|
|
2018-02-20 04:38:09 +01:00
|
|
|
bool is_password(const string_view &password) const noexcept;
|
2018-03-05 13:00:17 +01:00
|
|
|
event::id::buf password(const string_view &password);
|
2018-03-05 12:42:41 +01:00
|
|
|
|
2018-03-23 00:25:45 +01:00
|
|
|
using profile_closure = std::function<void (const string_view &)>;
|
|
|
|
void profile(const string_view &key, const profile_closure &) const;
|
|
|
|
bool profile(std::nothrow_t, const string_view &key, const profile_closure &) const;
|
|
|
|
string_view profile(const mutable_buffer &out, const string_view &key) const; //nothrow
|
|
|
|
event::id::buf profile(const m::user &sender, const string_view &key, const string_view &value);
|
|
|
|
|
2018-04-09 04:12:22 +02:00
|
|
|
using account_data_closure = std::function<void (const json::object &)>;
|
2018-06-20 05:40:42 +02:00
|
|
|
static string_view _account_data_type(const mutable_buffer &out, const m::room::id &);
|
2018-04-09 04:12:22 +02:00
|
|
|
void account_data(const string_view &type, const account_data_closure &) const;
|
2018-06-20 05:33:03 +02:00
|
|
|
void account_data(const m::room &, const string_view &type, const account_data_closure &) const;
|
2018-04-09 04:12:22 +02:00
|
|
|
bool account_data(std::nothrow_t, const string_view &type, const account_data_closure &) const;
|
2018-06-20 05:33:03 +02:00
|
|
|
bool account_data(std::nothrow_t, const m::room &, const string_view &type, const account_data_closure &) const;
|
2018-04-09 04:12:22 +02:00
|
|
|
json::object account_data(const mutable_buffer &out, const string_view &type) const; //nothrow
|
2018-06-20 05:33:03 +02:00
|
|
|
json::object account_data(const mutable_buffer &out, const m::room &, const string_view &type) const; //nothrow
|
2018-04-09 04:12:22 +02:00
|
|
|
event::id::buf account_data(const m::user &sender, const string_view &type, const json::object &value);
|
2018-06-20 05:33:03 +02:00
|
|
|
event::id::buf account_data(const m::room &, const m::user &sender, const string_view &type, const json::object &value);
|
2018-04-09 04:12:22 +02:00
|
|
|
|
2018-05-13 01:00:37 +02:00
|
|
|
using filter_closure = std::function<void (const json::object &)>;
|
|
|
|
bool filter(std::nothrow_t, const string_view &filter_id, const filter_closure &) const;
|
|
|
|
void filter(const string_view &filter_id, const filter_closure &) const;
|
|
|
|
std::string filter(std::nothrow_t, const string_view &filter_id) const;
|
|
|
|
std::string filter(const string_view &filter_id) const;
|
|
|
|
event::id::buf filter(const json::object &filter, const mutable_buffer &id);
|
|
|
|
|
2018-03-05 12:42:41 +01:00
|
|
|
bool is_active() const;
|
2018-03-09 18:00:28 +01:00
|
|
|
event::id::buf deactivate();
|
|
|
|
event::id::buf activate();
|
2017-09-25 05:47:13 +02:00
|
|
|
|
|
|
|
user(const id &user_id)
|
|
|
|
:user_id{user_id}
|
|
|
|
{}
|
2018-02-15 21:11:28 +01:00
|
|
|
|
|
|
|
user() = default;
|
2017-09-25 05:47:13 +02:00
|
|
|
};
|
2018-02-15 22:08:10 +01:00
|
|
|
|
|
|
|
struct ircd::m::user::room
|
|
|
|
:m::room
|
|
|
|
{
|
|
|
|
m::user user;
|
|
|
|
id::room::buf room_id;
|
|
|
|
|
2018-05-24 01:44:16 +02:00
|
|
|
room(const m::user &user,
|
|
|
|
const vm::copts *const & = nullptr,
|
|
|
|
const event::fetch::opts *const & = nullptr);
|
|
|
|
|
|
|
|
room(const m::user::id &user_id,
|
|
|
|
const vm::copts *const & = nullptr,
|
|
|
|
const event::fetch::opts *const & = nullptr);
|
|
|
|
|
2018-02-15 22:08:10 +01:00
|
|
|
room() = default;
|
|
|
|
room(const room &) = delete;
|
|
|
|
room &operator=(const room &) = delete;
|
|
|
|
};
|
2018-03-06 08:39:44 +01:00
|
|
|
|
2018-04-12 00:28:00 +02:00
|
|
|
/// Interface to the rooms for a user.
|
|
|
|
struct ircd::m::user::rooms
|
|
|
|
{
|
2018-04-24 04:39:50 +02:00
|
|
|
struct origins;
|
|
|
|
|
2018-04-12 00:28:00 +02:00
|
|
|
using closure = std::function<void (const m::room &, const string_view &)>;
|
|
|
|
using closure_bool = std::function<bool (const m::room &, const string_view &)>;
|
|
|
|
|
|
|
|
m::user::room user_room;
|
|
|
|
|
|
|
|
public:
|
|
|
|
// All rooms with specific membership
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const string_view &membership, const closure_bool &) const;
|
2018-04-12 00:28:00 +02:00
|
|
|
void for_each(const string_view &membership, const closure &) const;
|
|
|
|
|
|
|
|
// All rooms with any membership
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const closure_bool &) const;
|
2018-04-12 00:28:00 +02:00
|
|
|
void for_each(const closure &) const;
|
|
|
|
|
2018-04-12 00:47:51 +02:00
|
|
|
size_t count(const string_view &membership) const;
|
|
|
|
size_t count() const;
|
|
|
|
|
2018-04-12 00:28:00 +02:00
|
|
|
rooms(const m::user &user);
|
|
|
|
};
|
|
|
|
|
2018-04-24 04:39:50 +02:00
|
|
|
/// Interface to the other servers visible to a user from all their rooms
|
|
|
|
struct ircd::m::user::rooms::origins
|
|
|
|
{
|
|
|
|
using closure = m::room::origins::closure;
|
|
|
|
using closure_bool = m::room::origins::closure_bool;
|
|
|
|
|
|
|
|
m::user user;
|
|
|
|
|
|
|
|
public:
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const string_view &membership, const closure_bool &) const;
|
2018-04-24 04:39:50 +02:00
|
|
|
void for_each(const string_view &membership, const closure &) const;
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const closure_bool &) const;
|
2018-04-24 04:39:50 +02:00
|
|
|
void for_each(const closure &) const;
|
|
|
|
|
|
|
|
origins(const m::user &user);
|
|
|
|
};
|
|
|
|
|
2018-04-12 01:12:26 +02:00
|
|
|
/// Interface to the other users visible to a user from common rooms.
|
|
|
|
struct ircd::m::user::mitsein
|
|
|
|
{
|
|
|
|
m::user user;
|
|
|
|
|
|
|
|
public:
|
|
|
|
// All common rooms with user
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const m::user &, const string_view &membership, const rooms::closure_bool &) const;
|
2018-04-12 01:12:26 +02:00
|
|
|
void for_each(const m::user &, const string_view &membership, const rooms::closure &) const;
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const m::user &, const rooms::closure_bool &) const;
|
2018-04-12 01:12:26 +02:00
|
|
|
void for_each(const m::user &, const rooms::closure &) const;
|
|
|
|
|
|
|
|
// All common users in all rooms
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const string_view &membership, const closure_bool &) const;
|
2018-04-12 01:12:26 +02:00
|
|
|
void for_each(const string_view &membership, const closure &) const;
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const closure_bool &) const;
|
2018-04-12 01:12:26 +02:00
|
|
|
void for_each(const closure &) const;
|
|
|
|
|
2019-01-04 23:47:46 +01:00
|
|
|
// Counting convenience
|
2018-05-08 09:44:23 +02:00
|
|
|
size_t count(const m::user &, const string_view &membership = {}) const;
|
|
|
|
size_t count(const string_view &membership = {}) const;
|
|
|
|
|
2019-01-04 23:47:46 +01:00
|
|
|
// Existential convenience (does `user` and `other` share any common room).
|
|
|
|
bool has(const m::user &other, const string_view &membership = {}) const;
|
|
|
|
|
2018-04-12 01:12:26 +02:00
|
|
|
mitsein(const m::user &user);
|
|
|
|
};
|
|
|
|
|
2018-08-24 22:56:52 +02:00
|
|
|
/// Interface to all events from a user (sender)
|
|
|
|
struct ircd::m::user::events
|
|
|
|
{
|
|
|
|
using idx_closure_bool = std::function<bool (const event::idx &)>;
|
|
|
|
using closure_bool = std::function<bool (const event &)>;
|
|
|
|
|
|
|
|
m::user user;
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool for_each(const idx_closure_bool &) const;
|
|
|
|
bool for_each(const closure_bool &) const;
|
|
|
|
size_t count() const;
|
|
|
|
|
|
|
|
events(const m::user &user);
|
|
|
|
};
|
|
|
|
|
2018-03-06 08:39:44 +01:00
|
|
|
inline ircd::m::user::operator
|
|
|
|
const ircd::m::user::id &()
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return user_id;
|
|
|
|
}
|