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| {
for peer in netman.peer.iter_peer_ids() {
let role = peer_role(peer, netman);
let username = steam.get_user_name(peer.into());
let avatar = steam.get_avatar(ctx, peer.into());
if let Some(avatar) = avatar {
avatar.display_with_labels(ui, &username, &role);
ui.add_space(5.0);
} else {
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 {
for peer in netman.peer.iter_peer_ids() {
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 friendly_fire_team: AtomicI32,
pub friendly_fire: AtomicBool,
pub ban_list: Mutex<Vec<OmniPeerId>>,
pub kick_list: Mutex<Vec<OmniPeerId>>,
}
impl NetManager {
@ -151,6 +153,8 @@ impl NetManager {
debug_markers: Default::default(),
friendly_fire_team: AtomicI32::new(-2),
friendly_fire: AtomicBool::new(false),
ban_list: Default::default(),
kick_list: Default::default(),
}
.into()
}
@ -283,6 +287,23 @@ impl NetManager {
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() {
match net_event {
omni::OmniNetworkEvent::PeerConnected(id) => {
@ -333,6 +354,11 @@ impl NetManager {
};
match net_msg {
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(
"end_run",
self.peer.my_id().to_string(),
@ -364,6 +390,9 @@ impl NetManager {
host,
);
}
NetMsg::Kick => {
std::process::exit(0)
},
}
}
}

View file

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