mirror of
https://github.com/matrix-construct/construct
synced 2024-11-26 00:32:35 +01:00
ircd:Ⓜ️ Consolidate m::membership() suite to header; minor cleanup.
This commit is contained in:
parent
9a446d6c42
commit
11699baff0
10 changed files with 158 additions and 127 deletions
|
@ -18,10 +18,6 @@ namespace ircd::m
|
||||||
// General util
|
// General util
|
||||||
bool my(const id::event &);
|
bool my(const id::event &);
|
||||||
bool my(const event &);
|
bool my(const event &);
|
||||||
size_t degree(const event &);
|
|
||||||
string_view membership(const event &);
|
|
||||||
|
|
||||||
// [GET]
|
|
||||||
bool exists(const id::event &);
|
bool exists(const id::event &);
|
||||||
bool exists(const id::event &, const bool &good);
|
bool exists(const id::event &, const bool &good);
|
||||||
bool cached(const id::event &);
|
bool cached(const id::event &);
|
||||||
|
@ -38,6 +34,7 @@ namespace ircd::m
|
||||||
bool operator>=(const event &, const event &);
|
bool operator>=(const event &, const event &);
|
||||||
|
|
||||||
// Topological comparison
|
// Topological comparison
|
||||||
|
size_t degree(const event &);
|
||||||
bool before(const event &a, const event &b);
|
bool before(const event &a, const event &b);
|
||||||
|
|
||||||
bool check_id(const event &) noexcept;
|
bool check_id(const event &) noexcept;
|
||||||
|
|
|
@ -57,6 +57,7 @@ namespace ircd::m
|
||||||
#include "users.h"
|
#include "users.h"
|
||||||
#include "rooms.h"
|
#include "rooms.h"
|
||||||
#include "rooms_summary.h"
|
#include "rooms_summary.h"
|
||||||
|
#include "membership.h"
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
#include "events.h"
|
#include "events.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
|
|
32
include/ircd/m/membership.h
Normal file
32
include/ircd/m/membership.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
// Matrix Construct
|
||||||
|
//
|
||||||
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
||||||
|
// Copyright (C) 2016-2019 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_MEMBERSHIP_H
|
||||||
|
|
||||||
|
namespace ircd::m
|
||||||
|
{
|
||||||
|
// Extract membership string from event data.
|
||||||
|
string_view membership(const event &);
|
||||||
|
|
||||||
|
// Query and copy membership string to buffer. Note that the event type
|
||||||
|
// is not checked here, only content.membership is sought.
|
||||||
|
string_view membership(const mutable_buffer &out, const event::idx &);
|
||||||
|
|
||||||
|
// Query and compare membership string to argument string. Returns
|
||||||
|
// true on equal; false on not equal; false on not found.
|
||||||
|
bool membership(const event::idx &, const string_view &);
|
||||||
|
|
||||||
|
// Query and copy membership string to buffer; queries room state. (also room.h)
|
||||||
|
string_view membership(const mutable_buffer &out, const room &, const id::user &);
|
||||||
|
|
||||||
|
// Query and compare membership string; queries room state. (also room.h)
|
||||||
|
bool membership(const room &, const id::user &, const string_view &);
|
||||||
|
}
|
|
@ -21,9 +21,6 @@ struct ircd::m::room::members
|
||||||
using closure_idx = std::function<bool (const id::user &, const event::idx &)>;
|
using closure_idx = std::function<bool (const id::user &, const event::idx &)>;
|
||||||
using closure = std::function<bool (const id::user &)>;
|
using closure = std::function<bool (const id::user &)>;
|
||||||
|
|
||||||
static string_view membership(const mutable_buffer &out, const event::idx &);
|
|
||||||
static bool membership(const event::idx &, const string_view &);
|
|
||||||
|
|
||||||
m::room room;
|
m::room room;
|
||||||
|
|
||||||
bool for_each_join_present(const string_view &host, const closure &) const;
|
bool for_each_join_present(const string_view &host, const closure &) const;
|
||||||
|
|
100
ircd/m.cc
100
ircd/m.cc
|
@ -2318,6 +2318,106 @@ ircd::m::event_filter::event_filter(const mutable_buffer &buf,
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// m/membership.h
|
||||||
|
//
|
||||||
|
|
||||||
|
bool
|
||||||
|
ircd::m::membership(const room &room,
|
||||||
|
const user::id &user_id,
|
||||||
|
const string_view &membership)
|
||||||
|
{
|
||||||
|
const room::state state
|
||||||
|
{
|
||||||
|
room
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto event_idx
|
||||||
|
{
|
||||||
|
state.get(std::nothrow, "m.room.member", user_id)
|
||||||
|
};
|
||||||
|
|
||||||
|
return m::membership(event_idx, membership);
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::string_view
|
||||||
|
ircd::m::membership(const mutable_buffer &out,
|
||||||
|
const room &room,
|
||||||
|
const user::id &user_id)
|
||||||
|
{
|
||||||
|
const room::state state
|
||||||
|
{
|
||||||
|
room
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto event_idx
|
||||||
|
{
|
||||||
|
state.get(std::nothrow, "m.room.member", user_id)
|
||||||
|
};
|
||||||
|
|
||||||
|
return m::membership(out, event_idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
ircd::m::membership(const event::idx &event_idx,
|
||||||
|
const string_view &membership)
|
||||||
|
{
|
||||||
|
return m::query(std::nothrow, event_idx, "content", [&membership]
|
||||||
|
(const json::object &content)
|
||||||
|
{
|
||||||
|
const json::string &content_membership
|
||||||
|
{
|
||||||
|
content["membership"]
|
||||||
|
};
|
||||||
|
|
||||||
|
return content_membership == membership;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::string_view
|
||||||
|
ircd::m::membership(const mutable_buffer &out,
|
||||||
|
const event::idx &event_idx)
|
||||||
|
{
|
||||||
|
return m::query(std::nothrow, event_idx, "content", [&out]
|
||||||
|
(const json::object &content) -> string_view
|
||||||
|
{
|
||||||
|
const json::string &content_membership
|
||||||
|
{
|
||||||
|
content["membership"]
|
||||||
|
};
|
||||||
|
|
||||||
|
return strlcpy
|
||||||
|
{
|
||||||
|
out, content_membership
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::string_view
|
||||||
|
ircd::m::membership(const event &event)
|
||||||
|
{
|
||||||
|
const json::object &content
|
||||||
|
{
|
||||||
|
json::get<"content"_>(event)
|
||||||
|
};
|
||||||
|
|
||||||
|
const string_view &membership
|
||||||
|
{
|
||||||
|
json::get<"membership"_>(event)
|
||||||
|
};
|
||||||
|
|
||||||
|
if(membership)
|
||||||
|
return membership;
|
||||||
|
|
||||||
|
const json::string &content_membership
|
||||||
|
{
|
||||||
|
content.get("membership")
|
||||||
|
};
|
||||||
|
|
||||||
|
return content_membership;
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// m/user.h
|
// m/user.h
|
||||||
|
|
|
@ -3099,6 +3099,25 @@ ircd::m::before(const event &a,
|
||||||
return prev.prev_events_has(a.event_id);
|
return prev.prev_events_has(a.event_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
ircd::m::degree(const event &event)
|
||||||
|
{
|
||||||
|
return degree(event::prev{event});
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
ircd::m::degree(const event::prev &prev)
|
||||||
|
{
|
||||||
|
size_t ret{0};
|
||||||
|
json::for_each(prev, [&ret]
|
||||||
|
(const auto &, const json::array &prevs)
|
||||||
|
{
|
||||||
|
ret += prevs.count();
|
||||||
|
});
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ircd::m::operator>=(const event &a, const event &b)
|
ircd::m::operator>=(const event &a, const event &b)
|
||||||
{
|
{
|
||||||
|
@ -3186,49 +3205,6 @@ ircd::m::exists(const id::event &event_id)
|
||||||
return bool(event_id) && has(column, event_id);
|
return bool(event_id) && has(column, event_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
ircd::string_view
|
|
||||||
ircd::m::membership(const event &event)
|
|
||||||
{
|
|
||||||
const json::object &content
|
|
||||||
{
|
|
||||||
json::get<"content"_>(event)
|
|
||||||
};
|
|
||||||
|
|
||||||
const string_view &membership
|
|
||||||
{
|
|
||||||
json::get<"membership"_>(event)
|
|
||||||
};
|
|
||||||
|
|
||||||
if(membership)
|
|
||||||
return membership;
|
|
||||||
|
|
||||||
const json::string &content_membership
|
|
||||||
{
|
|
||||||
content.get("membership")
|
|
||||||
};
|
|
||||||
|
|
||||||
return content_membership;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t
|
|
||||||
ircd::m::degree(const event &event)
|
|
||||||
{
|
|
||||||
return degree(event::prev{event});
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t
|
|
||||||
ircd::m::degree(const event::prev &prev)
|
|
||||||
{
|
|
||||||
size_t ret{0};
|
|
||||||
json::for_each(prev, [&ret]
|
|
||||||
(const auto &, const json::array &prevs)
|
|
||||||
{
|
|
||||||
ret += prevs.count();
|
|
||||||
});
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ircd::m::my(const event &event)
|
ircd::m::my(const event &event)
|
||||||
{
|
{
|
||||||
|
|
|
@ -891,24 +891,6 @@ ircd::m::any_user(const room &room,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ircd::string_view
|
|
||||||
ircd::m::membership(const mutable_buffer &out,
|
|
||||||
const room &room,
|
|
||||||
const user::id &user_id)
|
|
||||||
{
|
|
||||||
const room::state state
|
|
||||||
{
|
|
||||||
room
|
|
||||||
};
|
|
||||||
|
|
||||||
const auto event_idx
|
|
||||||
{
|
|
||||||
state.get(std::nothrow, "m.room.member", user_id)
|
|
||||||
};
|
|
||||||
|
|
||||||
return room::members::membership(out, event_idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Receive the join_rule of the room into buffer of sufficient size.
|
/// Receive the join_rule of the room into buffer of sufficient size.
|
||||||
/// The protocol does not specify a join_rule string longer than 7
|
/// The protocol does not specify a join_rule string longer than 7
|
||||||
/// characters but do be considerate of the future. This function
|
/// characters but do be considerate of the future. This function
|
||||||
|
@ -1161,24 +1143,6 @@ ircd::m::join_rule(const room &room,
|
||||||
return join_rule(buf, room) == rule;
|
return join_rule(buf, room) == rule;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
ircd::m::membership(const room &room,
|
|
||||||
const user::id &user_id,
|
|
||||||
const string_view &membership)
|
|
||||||
{
|
|
||||||
const room::state state
|
|
||||||
{
|
|
||||||
room
|
|
||||||
};
|
|
||||||
|
|
||||||
const auto event_idx
|
|
||||||
{
|
|
||||||
state.get(std::nothrow, "m.room.member", user_id)
|
|
||||||
};
|
|
||||||
|
|
||||||
return room::members::membership(event_idx, membership);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ircd::m::creator(const room::id &room_id,
|
ircd::m::creator(const room::id &room_id,
|
||||||
const user::id &user_id)
|
const user::id &user_id)
|
||||||
|
@ -3188,7 +3152,7 @@ const
|
||||||
if(host && user_id.host() != host)
|
if(host && user_id.host() != host)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return !membership || this->membership(event_idx, membership)?
|
return !membership || m::membership(event_idx, membership)?
|
||||||
closure(user_id, event_idx):
|
closure(user_id, event_idx):
|
||||||
true;
|
true;
|
||||||
});
|
});
|
||||||
|
@ -3232,41 +3196,6 @@ const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
ircd::m::room::members::membership(const event::idx &event_idx,
|
|
||||||
const string_view &membership)
|
|
||||||
{
|
|
||||||
return m::query(std::nothrow, event_idx, "content", [&membership]
|
|
||||||
(const json::object &content)
|
|
||||||
{
|
|
||||||
const json::string &content_membership
|
|
||||||
{
|
|
||||||
content["membership"]
|
|
||||||
};
|
|
||||||
|
|
||||||
return content_membership && content_membership == membership;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
ircd::string_view
|
|
||||||
ircd::m::room::members::membership(const mutable_buffer &out,
|
|
||||||
const event::idx &event_idx)
|
|
||||||
{
|
|
||||||
return m::query(std::nothrow, event_idx, "content", [&out]
|
|
||||||
(const json::object &content) -> string_view
|
|
||||||
{
|
|
||||||
const json::string &content_membership
|
|
||||||
{
|
|
||||||
content["membership"]
|
|
||||||
};
|
|
||||||
|
|
||||||
return strlcpy
|
|
||||||
{
|
|
||||||
out, content_membership
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// room::origins
|
// room::origins
|
||||||
//
|
//
|
||||||
|
|
|
@ -102,7 +102,7 @@ get__members(client &client,
|
||||||
members.for_each(membership, [¬_membership]
|
members.for_each(membership, [¬_membership]
|
||||||
(const m::user::id &member, const m::event::idx &event_idx)
|
(const m::user::id &member, const m::event::idx &event_idx)
|
||||||
{
|
{
|
||||||
if(m::room::members::membership(event_idx, not_membership))
|
if(m::membership(event_idx, not_membership))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
m::prefetch(event_idx);
|
m::prefetch(event_idx);
|
||||||
|
@ -112,7 +112,7 @@ get__members(client &client,
|
||||||
members.for_each(membership, [&request, &chunk, ¬_membership]
|
members.for_each(membership, [&request, &chunk, ¬_membership]
|
||||||
(const m::user::id &member, const m::event::idx &event_idx)
|
(const m::user::id &member, const m::event::idx &event_idx)
|
||||||
{
|
{
|
||||||
if(m::room::members::membership(event_idx, not_membership))
|
if(m::membership(event_idx, not_membership))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
const m::event::fetch event
|
const m::event::fetch event
|
||||||
|
|
|
@ -8701,7 +8701,7 @@ console_cmd__room__members(opt &out, const string_view &line)
|
||||||
(const m::user::id &user_id, const m::event::idx &event_idx)
|
(const m::user::id &user_id, const m::event::idx &event_idx)
|
||||||
{
|
{
|
||||||
char buf[32];
|
char buf[32];
|
||||||
out << std::setw(8) << std::left << m::room::members::membership(buf, event_idx)
|
out << std::setw(8) << std::left << m::membership(buf, event_idx)
|
||||||
<< " " << user_id << std::endl;
|
<< " " << user_id << std::endl;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -108,8 +108,7 @@ ircd::m::room::bootstrap::bootstrap(m::event::id::buf &event_id_buf,
|
||||||
|
|
||||||
const bool existing_join
|
const bool existing_join
|
||||||
{
|
{
|
||||||
member_event_idx &&
|
m::membership(member_event_idx, "join")
|
||||||
m::room::members::membership(member_event_idx, "join")
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if(existing_join)
|
if(existing_join)
|
||||||
|
|
Loading…
Reference in a new issue