0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-29 02:02:38 +01:00

ircd:Ⓜ️ Add user::events iterator w/ console cmd.

This commit is contained in:
Jason Volk 2018-08-24 13:56:52 -07:00
parent bf234c77a4
commit 170475f374
3 changed files with 133 additions and 0 deletions

View file

@ -26,6 +26,7 @@ struct ircd::m::user
struct room;
struct rooms;
struct mitsein;
struct events;
using id = m::id::user;
using closure = std::function<void (const user &)>;
using closure_bool = std::function<bool (const user &)>;
@ -165,6 +166,22 @@ struct ircd::m::user::mitsein
mitsein(const m::user &user);
};
/// 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);
};
inline ircd::m::user::operator
const ircd::m::user::id &()
const

View file

@ -2235,6 +2235,77 @@ const
}});
}
//
// user::events
//
ircd::m::user::events::events(const m::user &user)
:user{user}
{
}
size_t
ircd::m::user::events::count()
const
{
size_t ret{0};
for_each([&ret](const event::idx &)
{
++ret;
return true;
});
return ret;
}
bool
ircd::m::user::events::for_each(const closure_bool &closure)
const
{
m::event::fetch event;
return for_each([&closure, &event]
(const event::idx &event_idx)
{
if(!seek(event, event_idx, std::nothrow))
return true;
return closure(event);
});
}
bool
ircd::m::user::events::for_each(const idx_closure_bool &closure)
const
{
const m::user::rooms rooms
{
user
};
return rooms.for_each(rooms::closure_bool{[this, &closure]
(const m::room &room, const string_view &membership)
{
m::room::messages it
{
room
};
bool ret{true};
for(; ret && it; --it)
{
const auto &idx{it.event_idx()};
m::get(std::nothrow, idx, "sender", [this, &closure, &idx, &ret]
(const string_view &sender)
{
if(sender == this->user.user_id)
ret = closure(idx);
});
}
return ret;
}});
}
///////////////////////////////////////////////////////////////////////////////
//
// m/room.h

View file

@ -5850,6 +5850,51 @@ console_cmd__user__filter(opt &out, const string_view &line)
return true;
}
bool
console_cmd__user__events(opt &out, const string_view &line)
{
const params param{line, " ",
{
"user_id", "limit"
}};
const m::user::events user
{
m::user(param.at("user_id"))
};
size_t limit
{
param.at<size_t>("limit", 32)
};
user.for_each([&out, &limit]
(const m::event &event)
{
out << pretty_oneline(event) << std::endl;;
return bool(--limit);
});
return true;
}
bool
console_cmd__user__events__count(opt &out, const string_view &line)
{
const params param{line, " ",
{
"user_id"
}};
const m::user::events user
{
m::user(param.at("user_id"))
};
out << user.count() << std::endl;
return true;
}
//
// node
//