mirror of
https://github.com/stoatchat/stoatchat.git
synced 2026-08-31 01:20:30 +00:00
Merge commit from fork
* fix: check membership before subscribing to servers Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com> * remove active_server when leaving a server. Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com> --------- Signed-off-by: IAmTomahawkx <iamtomahawkx@gmail.com>
This commit is contained in:
@@ -567,6 +567,7 @@ impl State {
|
|||||||
EventV1::ServerMemberLeave { id, user, .. } => {
|
EventV1::ServerMemberLeave { id, user, .. } => {
|
||||||
if user == &self.cache.user_id {
|
if user == &self.cache.user_id {
|
||||||
self.remove_subscription(id).await;
|
self.remove_subscription(id).await;
|
||||||
|
self.remove_active_server(id).await;
|
||||||
|
|
||||||
if let Some(server) = self.cache.servers.remove(id) {
|
if let Some(server) = self.cache.servers.remove(id) {
|
||||||
for channel in &server.channels {
|
for channel in &server.channels {
|
||||||
|
|||||||
@@ -216,4 +216,19 @@ impl State {
|
|||||||
|
|
||||||
subscribed.remove(subscription);
|
subscribed.remove(subscription);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove a server from the active server state.
|
||||||
|
pub async fn remove_active_server(&mut self, server_id: &str) -> Option<()> {
|
||||||
|
let removed = {
|
||||||
|
let mut lock = self.active_servers.lock().await;
|
||||||
|
lock.remove(server_id).is_some()
|
||||||
|
};
|
||||||
|
|
||||||
|
if removed {
|
||||||
|
self.remove_subscription(&format!("{server_id}u")).await;
|
||||||
|
Some(())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -189,6 +189,7 @@ pub async fn client(db: &'static Database, stream: TcpStream, addr: SocketAddr)
|
|||||||
read,
|
read,
|
||||||
&write,
|
&write,
|
||||||
kill_signal_1_s,
|
kill_signal_1_s,
|
||||||
|
db,
|
||||||
);
|
);
|
||||||
|
|
||||||
join!(listener, worker);
|
join!(listener, worker);
|
||||||
@@ -420,6 +421,7 @@ async fn worker_with_kill_signal(
|
|||||||
read: WsReader,
|
read: WsReader,
|
||||||
write: &Mutex<WsWriter>,
|
write: &Mutex<WsWriter>,
|
||||||
kill_signal_s: async_channel::Sender<()>,
|
kill_signal_s: async_channel::Sender<()>,
|
||||||
|
db: &Database,
|
||||||
) {
|
) {
|
||||||
worker(
|
worker(
|
||||||
addr,
|
addr,
|
||||||
@@ -431,6 +433,7 @@ async fn worker_with_kill_signal(
|
|||||||
kill_signal_r,
|
kill_signal_r,
|
||||||
read,
|
read,
|
||||||
write,
|
write,
|
||||||
|
db,
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
kill_signal_s.send(()).await.ok();
|
kill_signal_s.send(()).await.ok();
|
||||||
@@ -447,6 +450,7 @@ async fn worker(
|
|||||||
kill_signal_r: async_channel::Receiver<()>,
|
kill_signal_r: async_channel::Receiver<()>,
|
||||||
mut read: WsReader,
|
mut read: WsReader,
|
||||||
write: &Mutex<WsWriter>,
|
write: &Mutex<WsWriter>,
|
||||||
|
db: &Database,
|
||||||
) {
|
) {
|
||||||
loop {
|
loop {
|
||||||
let t1 = read.try_next().fuse();
|
let t1 = read.try_next().fuse();
|
||||||
@@ -508,6 +512,7 @@ async fn worker(
|
|||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
ClientMessage::Subscribe { server_id } => {
|
ClientMessage::Subscribe { server_id } => {
|
||||||
|
if db.fetch_member(&server_id, &user_id).await.is_ok() {
|
||||||
let mut servers = active_servers.lock().await;
|
let mut servers = active_servers.lock().await;
|
||||||
let has_item = servers.contains_key(&server_id);
|
let has_item = servers.contains_key(&server_id);
|
||||||
servers.insert(server_id, ());
|
servers.insert(server_id, ());
|
||||||
@@ -517,6 +522,7 @@ async fn worker(
|
|||||||
topic_signal_s.send(()).await.ok();
|
topic_signal_s.send(()).await.ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ClientMessage::Ping { data, responded } => {
|
ClientMessage::Ping { data, responded } => {
|
||||||
if responded.is_none() {
|
if responded.is_none() {
|
||||||
write
|
write
|
||||||
|
|||||||
Reference in New Issue
Block a user