allow kick/ban

This commit is contained in:
bgkillas 2024-10-20 10:10:22 -04:00
parent 26239df5ac
commit 9734bf154a
3 changed files with 51 additions and 3 deletions

View file

@ -937,20 +937,37 @@ impl eframe::App for App {
ScrollArea::vertical().auto_shrink(false).show(ui, |ui| { ScrollArea::vertical().auto_shrink(false).show(ui, |ui| {
for peer in netman.peer.iter_peer_ids() { for peer in netman.peer.iter_peer_ids() {
let role = peer_role(peer, netman); let role = peer_role(peer, netman);
let username = steam.get_user_name(peer.into()); let username = steam.get_user_name(peer.into());
let avatar = steam.get_avatar(ctx, peer.into()); let avatar = steam.get_avatar(ctx, peer.into());
if let Some(avatar) = avatar { if let Some(avatar) = avatar {
avatar.display_with_labels(ui, &username, &role); avatar.display_with_labels(ui, &username, &role);
ui.add_space(5.0);
} else { } else {
ui.label(&username); ui.label(&username);
} }
if netman.peer.is_host() && peer != netman.peer.my_id() {
if ui.button("kick").clicked() {
netman.kick_list.lock().unwrap().push(peer)
}
if ui.button("ban").clicked() {
netman.ban_list.lock().unwrap().push(peer)
}
}
if avatar.is_some() {
ui.add_space(5.0);
}
} }
}); });
} else { } else {
for peer in netman.peer.iter_peer_ids() { for peer in netman.peer.iter_peer_ids() {
ui.label(peer.to_string()); ui.label(peer.to_string());
if netman.peer.is_host() && peer != netman.peer.my_id() {
if ui.button("kick").clicked() {
netman.kick_list.lock().unwrap().push(peer)
}
if ui.button("ban").clicked() {
netman.ban_list.lock().unwrap().push(peer)
}
}
} }
} }
}); });

View file

@ -131,6 +131,8 @@ pub struct NetManager {
pub debug_markers: Mutex<Vec<DebugMarker>>, pub debug_markers: Mutex<Vec<DebugMarker>>,
pub friendly_fire_team: AtomicI32, pub friendly_fire_team: AtomicI32,
pub friendly_fire: AtomicBool, pub friendly_fire: AtomicBool,
pub ban_list: Mutex<Vec<OmniPeerId>>,
pub kick_list: Mutex<Vec<OmniPeerId>>,
} }
impl NetManager { impl NetManager {
@ -151,6 +153,8 @@ impl NetManager {
debug_markers: Default::default(), debug_markers: Default::default(),
friendly_fire_team: AtomicI32::new(-2), friendly_fire_team: AtomicI32::new(-2),
friendly_fire: AtomicBool::new(false), friendly_fire: AtomicBool::new(false),
ban_list: Default::default(),
kick_list: Default::default(),
} }
.into() .into()
} }
@ -283,6 +287,23 @@ impl NetManager {
warn!("Websocket flush not ok: {err}"); warn!("Websocket flush not ok: {err}");
} }
} }
let mut list = self.kick_list.lock().unwrap();
for peer in list.iter() {
info!("player kicked: {}", peer);
state.try_ws_write(ws_encode_proxy("leave", peer.as_hex()));
state.world.handle_peer_left(*peer);
self.send(*peer, &NetMsg::Kick, Reliability::Reliable);
self.broadcast(&NetMsg::PeerDisconnected {id: *peer}, Reliability::Reliable);
}
list.clear();
let list = self.ban_list.lock().unwrap();
for peer in list.iter() {
info!("player kicked: {}", peer);
state.try_ws_write(ws_encode_proxy("leave", peer.as_hex()));
state.world.handle_peer_left(*peer);
self.send(*peer, &NetMsg::Kick, Reliability::Reliable);
self.broadcast(&NetMsg::PeerDisconnected {id: *peer}, Reliability::Reliable);
}
for net_event in self.peer.recv() { for net_event in self.peer.recv() {
match net_event { match net_event {
omni::OmniNetworkEvent::PeerConnected(id) => { omni::OmniNetworkEvent::PeerConnected(id) => {
@ -333,6 +354,11 @@ impl NetManager {
}; };
match net_msg { match net_msg {
NetMsg::Welcome => {} NetMsg::Welcome => {}
NetMsg::PeerDisconnected{id} => {
info!("player kicked: {}", id);
state.try_ws_write(ws_encode_proxy("leave", id.as_hex()));
state.world.handle_peer_left(id);
}
NetMsg::EndRun => state.try_ws_write(ws_encode_proxy( NetMsg::EndRun => state.try_ws_write(ws_encode_proxy(
"end_run", "end_run",
self.peer.my_id().to_string(), self.peer.my_id().to_string(),
@ -364,6 +390,9 @@ impl NetManager {
host, host,
); );
} }
NetMsg::Kick => {
std::process::exit(0)
},
} }
} }
} }
@ -633,4 +662,4 @@ impl Drop for NetManager {
info!("Skip saving run info: not a host"); info!("Skip saving run info: not a host");
} }
} }
} }

View file

@ -21,6 +21,8 @@ pub(crate) struct MessageRequest<T> {
pub(crate) enum NetMsg { pub(crate) enum NetMsg {
Welcome, Welcome,
EndRun, EndRun,
Kick,
PeerDisconnected { id: OmniPeerId },
StartGame { settings: GameSettings }, StartGame { settings: GameSettings },
ModRaw { data: Vec<u8> }, ModRaw { data: Vec<u8> },
ModCompressed { data: Vec<u8> }, ModCompressed { data: Vec<u8> },