Files
weechat-matrix-rs/src/completions.rs
2026-04-04 01:33:50 +03:00

111 lines
2.6 KiB
Rust

use std::borrow::Cow;
use weechat::{
buffer::Buffer,
hooks::{
Completion, CompletionCallback, CompletionHook, CompletionPosition,
},
Weechat,
};
use crate::Servers;
#[allow(dead_code)]
pub struct Completions {
servers: CompletionHook,
users: CompletionHook,
}
impl Completions {
pub fn hook_all(servers: Servers) -> Result<Self, ()> {
Ok(Self {
servers: ServersCompletion::create(servers.clone())?,
users: UsersCompletion::create(servers)?,
})
}
}
struct ServersCompletion {
servers: Servers,
}
impl ServersCompletion {
fn create(servers: Servers) -> Result<CompletionHook, ()> {
let comp = ServersCompletion { servers };
CompletionHook::new(
"matrix_servers",
"Completion for the list of added Matrix servers",
comp,
)
}
}
impl CompletionCallback for ServersCompletion {
fn callback(
&mut self,
_weechat: &Weechat,
_buffer: &Buffer,
_completion_name: Cow<str>,
completion: &Completion,
) -> Result<(), ()> {
for server_name in self.servers.borrow().keys() {
completion.add_with_options(
server_name,
false,
CompletionPosition::Sorted,
);
}
Ok(())
}
}
struct UsersCompletion {
servers: Servers,
}
impl UsersCompletion {
fn create(servers: Servers) -> Result<CompletionHook, ()> {
let comp = UsersCompletion { servers };
CompletionHook::new(
"matrix-users",
"Completion for the list of Matrix users",
comp,
)
}
}
impl CompletionCallback for UsersCompletion {
fn callback(
&mut self,
_: &Weechat,
buffer: &Buffer,
_: Cow<str>,
completion: &Completion,
) -> Result<(), ()> {
if let Some(server) = self.servers.find_server(buffer) {
if let Some(connection) = server.connection() {
let tracked_users = self
.servers
.runtime()
.block_on(connection.client().encryption().tracked_users())
.unwrap_or_else(|e| {
tracing::warn!("Error getting tracked users: {e}");
Default::default()
});
for user in tracked_users.into_iter() {
completion.add_with_options(
user.as_str(),
true,
CompletionPosition::Sorted,
)
}
}
}
Ok(())
}
}