adminroom: add various state_cache db accessors
Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
parent
03ba9bde29
commit
d2063013b4
2 changed files with 307 additions and 0 deletions
|
@ -3,10 +3,12 @@ pub(crate) mod appservice;
|
||||||
pub(crate) mod globals;
|
pub(crate) mod globals;
|
||||||
pub(crate) mod presence;
|
pub(crate) mod presence;
|
||||||
pub(crate) mod room_alias;
|
pub(crate) mod room_alias;
|
||||||
|
pub(crate) mod room_state_cache;
|
||||||
pub(crate) mod sending;
|
pub(crate) mod sending;
|
||||||
pub(crate) mod users;
|
pub(crate) mod users;
|
||||||
|
|
||||||
use clap::Subcommand;
|
use clap::Subcommand;
|
||||||
|
use room_state_cache::room_state_cache;
|
||||||
use ruma::{
|
use ruma::{
|
||||||
events::{room::message::RoomMessageEventContent, RoomAccountDataEventType},
|
events::{room::message::RoomMessageEventContent, RoomAccountDataEventType},
|
||||||
RoomAliasId, RoomId, ServerName, UserId,
|
RoomAliasId, RoomId, ServerName, UserId,
|
||||||
|
@ -38,6 +40,10 @@ pub(crate) enum QueryCommand {
|
||||||
#[command(subcommand)]
|
#[command(subcommand)]
|
||||||
RoomAlias(RoomAlias),
|
RoomAlias(RoomAlias),
|
||||||
|
|
||||||
|
/// - rooms/state_cache iterators and getters
|
||||||
|
#[command(subcommand)]
|
||||||
|
RoomStateCache(RoomStateCache),
|
||||||
|
|
||||||
/// - globals.rs iterators and getters
|
/// - globals.rs iterators and getters
|
||||||
#[command(subcommand)]
|
#[command(subcommand)]
|
||||||
Globals(Globals),
|
Globals(Globals),
|
||||||
|
@ -127,6 +133,73 @@ pub(crate) enum RoomAlias {
|
||||||
AllLocalAliases,
|
AllLocalAliases,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(test, derive(Debug))]
|
||||||
|
#[derive(Subcommand)]
|
||||||
|
pub(crate) enum RoomStateCache {
|
||||||
|
RoomServers {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
ServerRooms {
|
||||||
|
server: Box<ServerName>,
|
||||||
|
},
|
||||||
|
|
||||||
|
RoomMembers {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
LocalUsersInRoom {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
ActiveLocalUsersInRoom {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
RoomJoinedCount {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
RoomInvitedCount {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
RoomUserOnceJoined {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
RoomMembersInvited {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
GetInviteCount {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
user_id: Box<UserId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
GetLeftCount {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
user_id: Box<UserId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
RoomsJoined {
|
||||||
|
user_id: Box<UserId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
RoomsLeft {
|
||||||
|
user_id: Box<UserId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
RoomsInvited {
|
||||||
|
user_id: Box<UserId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
InviteState {
|
||||||
|
user_id: Box<UserId>,
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg_attr(test, derive(Debug))]
|
#[cfg_attr(test, derive(Debug))]
|
||||||
#[derive(Subcommand)]
|
#[derive(Subcommand)]
|
||||||
/// All the getters and iterators from src/database/key_value/globals.rs
|
/// All the getters and iterators from src/database/key_value/globals.rs
|
||||||
|
@ -216,6 +289,7 @@ pub(crate) async fn process(command: QueryCommand, _body: Vec<&str>) -> Result<R
|
||||||
QueryCommand::Appservice(command) => appservice(command).await?,
|
QueryCommand::Appservice(command) => appservice(command).await?,
|
||||||
QueryCommand::Presence(command) => presence(command).await?,
|
QueryCommand::Presence(command) => presence(command).await?,
|
||||||
QueryCommand::RoomAlias(command) => room_alias(command).await?,
|
QueryCommand::RoomAlias(command) => room_alias(command).await?,
|
||||||
|
QueryCommand::RoomStateCache(command) => room_state_cache(command).await?,
|
||||||
QueryCommand::Globals(command) => globals(command).await?,
|
QueryCommand::Globals(command) => globals(command).await?,
|
||||||
QueryCommand::Sending(command) => sending(command).await?,
|
QueryCommand::Sending(command) => sending(command).await?,
|
||||||
QueryCommand::Users(command) => users(command).await?,
|
QueryCommand::Users(command) => users(command).await?,
|
||||||
|
|
233
src/admin/query/room_state_cache.rs
Normal file
233
src/admin/query/room_state_cache.rs
Normal file
|
@ -0,0 +1,233 @@
|
||||||
|
use ruma::events::room::message::RoomMessageEventContent;
|
||||||
|
|
||||||
|
use super::RoomStateCache;
|
||||||
|
use crate::{services, Result};
|
||||||
|
|
||||||
|
pub(crate) async fn room_state_cache(subcommand: RoomStateCache) -> Result<RoomMessageEventContent> {
|
||||||
|
match subcommand {
|
||||||
|
RoomStateCache::RoomServers {
|
||||||
|
room_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results: Result<Vec<_>> = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.room_servers(&room_id)
|
||||||
|
.collect();
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::ServerRooms {
|
||||||
|
server,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results: Result<Vec<_>> = services().rooms.state_cache.server_rooms(&server).collect();
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::RoomMembers {
|
||||||
|
room_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results: Result<Vec<_>> = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.room_members(&room_id)
|
||||||
|
.collect();
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::LocalUsersInRoom {
|
||||||
|
room_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results: Vec<_> = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.local_users_in_room(&room_id)
|
||||||
|
.collect();
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::ActiveLocalUsersInRoom {
|
||||||
|
room_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results: Vec<_> = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.active_local_users_in_room(&room_id)
|
||||||
|
.collect();
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::RoomJoinedCount {
|
||||||
|
room_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results = services().rooms.state_cache.room_joined_count(&room_id);
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::RoomInvitedCount {
|
||||||
|
room_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results = services().rooms.state_cache.room_invited_count(&room_id);
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::RoomUserOnceJoined {
|
||||||
|
room_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results: Result<Vec<_>> = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.room_useroncejoined(&room_id)
|
||||||
|
.collect();
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::RoomMembersInvited {
|
||||||
|
room_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results: Result<Vec<_>> = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.room_members_invited(&room_id)
|
||||||
|
.collect();
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::GetInviteCount {
|
||||||
|
room_id,
|
||||||
|
user_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.get_invite_count(&room_id, &user_id);
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::GetLeftCount {
|
||||||
|
room_id,
|
||||||
|
user_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.get_left_count(&room_id, &user_id);
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::RoomsJoined {
|
||||||
|
user_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results: Result<Vec<_>> = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.rooms_joined(&user_id)
|
||||||
|
.collect();
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::RoomsInvited {
|
||||||
|
user_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results: Result<Vec<_>> = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.rooms_invited(&user_id)
|
||||||
|
.collect();
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::RoomsLeft {
|
||||||
|
user_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results: Result<Vec<_>> = services().rooms.state_cache.rooms_left(&user_id).collect();
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
RoomStateCache::InviteState {
|
||||||
|
user_id,
|
||||||
|
room_id,
|
||||||
|
} => {
|
||||||
|
let timer = tokio::time::Instant::now();
|
||||||
|
let results = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.invite_state(&user_id, &room_id);
|
||||||
|
let query_time = timer.elapsed();
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Query completed in {query_time:?}:\n\n```\n{results:?}```"),
|
||||||
|
format!("<p>Query completed in {query_time:?}:</p>\n<pre><code>{results:?}\n</code></pre>"),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue