1 use mio; |
1 use mio; |
2 use std::{collections::HashMap, io, io::Write}; |
2 use std::{collections::HashMap, io, io::Write}; |
3 |
3 |
4 use super::{ |
4 use super::{ |
5 actions::{Destination, DestinationRoom}, |
5 actions::{Destination, DestinationGroup}, |
6 core::HWServer, |
6 core::HWServer, |
7 coretypes::{ClientId, Replay, RoomId}, |
7 coretypes::{ClientId, Replay, RoomId}, |
8 room::RoomSave, |
8 room::RoomSave, |
9 }; |
9 }; |
10 use crate::{ |
10 use crate::{ |
128 &'b mut self, |
128 &'b mut self, |
129 server: &'a HWServer, |
129 server: &'a HWServer, |
130 ) -> impl Iterator<Item = (Vec<ClientId>, HWServerMessage)> + 'a { |
130 ) -> impl Iterator<Item = (Vec<ClientId>, HWServerMessage)> + 'a { |
131 let client_id = self.client_id; |
131 let client_id = self.client_id; |
132 self.messages.drain(..).map(move |m| { |
132 self.messages.drain(..).map(move |m| { |
133 let ids = get_recipients(server, client_id, &m.destination); |
133 let ids = get_recipients(server, client_id, m.destination); |
134 (ids, m.message) |
134 (ids, m.message) |
135 }) |
135 }) |
136 } |
136 } |
137 |
137 |
138 pub fn remove_client(&mut self, client_id: ClientId) { |
138 pub fn remove_client(&mut self, client_id: ClientId) { |
157 } |
157 } |
158 |
158 |
159 fn get_recipients( |
159 fn get_recipients( |
160 server: &HWServer, |
160 server: &HWServer, |
161 client_id: ClientId, |
161 client_id: ClientId, |
162 destination: &Destination, |
162 destination: Destination, |
163 ) -> Vec<ClientId> { |
163 ) -> Vec<ClientId> { |
164 let mut ids = match *destination { |
164 match destination { |
165 Destination::ToSelf => vec![client_id], |
165 Destination::ToSelf => vec![client_id], |
166 Destination::ToId(id) => vec![id], |
166 Destination::ToId(id) => vec![id], |
167 Destination::ToAll { |
167 Destination::ToIds(ids) => ids, |
168 room_id: DestinationRoom::Lobby, |
168 Destination::ToAll { group, skip_self } => { |
169 .. |
169 let mut ids = match group { |
170 } => server.collect_lobby_clients(), |
170 DestinationGroup::All => server.clients.iter().map(|(id, _)| id).collect(), |
171 Destination::ToAll { |
171 DestinationGroup::Lobby => server.collect_lobby_clients(), |
172 room_id: DestinationRoom::Room(id), |
172 DestinationGroup::Protocol(proto) => server.protocol_clients(proto), |
173 .. |
173 DestinationGroup::Room(id) => server.collect_room_clients(id), |
174 } => server.collect_room_clients(id), |
174 }; |
175 Destination::ToAll { |
175 |
176 protocol: Some(proto), |
176 if skip_self { |
177 .. |
177 if let Some(index) = ids.iter().position(|id| *id == client_id) { |
178 } => server.protocol_clients(proto), |
178 ids.remove(index); |
179 Destination::ToAll { .. } => server.clients.iter().map(|(id, _)| id).collect::<Vec<_>>(), |
179 } |
180 }; |
180 } |
181 if let Destination::ToAll { |
181 |
182 skip_self: true, .. |
182 ids |
183 } = destination |
183 } |
184 { |
184 } |
185 if let Some(index) = ids.iter().position(|id| *id == client_id) { |
|
186 ids.remove(index); |
|
187 } |
|
188 } |
|
189 ids |
|
190 } |
185 } |
191 |
186 |
192 pub fn handle( |
187 pub fn handle( |
193 server: &mut HWServer, |
188 server: &mut HWServer, |
194 client_id: ClientId, |
189 client_id: ClientId, |