1
- use std:: sync:: Arc ;
1
+ use std:: { path :: Path , sync:: Arc } ;
2
2
use tokio:: {
3
- fs:: { File , OpenOptions } ,
3
+ fs:: File ,
4
4
io:: { AsyncReadExt , AsyncSeekExt , AsyncWriteExt } ,
5
5
sync:: Mutex ,
6
6
} ;
@@ -136,57 +136,53 @@ pub struct Data {
136
136
}
137
137
138
138
impl Data {
139
- pub async fn new ( path : Option < & str > , save : bool ) -> Self {
140
- let mut file = match path {
141
- Some ( path) => Some ( if save {
142
- OpenOptions :: new ( )
143
- . read ( true )
144
- . write ( true )
145
- . create ( true )
146
- . truncate ( true )
147
- . open ( path)
148
- . await
149
- . unwrap ( )
150
- } else {
151
- File :: open ( path) . await . unwrap ( )
152
- } ) ,
139
+ pub async fn new ( path : Option < String > , save : bool ) -> Self {
140
+ let mut file = match path. clone ( ) {
141
+ Some ( path) => match Path :: new ( & path) . exists ( ) {
142
+ true => Some ( File :: open ( path) . await . unwrap ( ) ) ,
143
+ false => None ,
144
+ } ,
153
145
None => None ,
154
146
} ;
155
147
156
148
let mut data: Vec < u8 > = vec ! [ 0xff ; RESOLUTION * 3 ] ;
157
149
if file. is_some ( ) {
150
+ data. clear ( ) ;
158
151
file. as_mut ( ) . unwrap ( ) . read_to_end ( & mut data) . await . unwrap ( ) ;
159
152
}
160
153
154
+ drop ( file) ;
155
+
161
156
let data = Arc :: new ( Mutex :: new ( data) ) ;
162
157
let task_data = Arc :: clone ( & data) ;
163
- if file. is_some ( ) && save {
164
- tokio:: spawn ( async move {
165
- #[ allow( clippy:: unnecessary_unwrap) ]
166
- let mut file = file. unwrap ( ) ;
158
+ if let Some ( path) = path {
159
+ if save {
160
+ tokio:: spawn ( async move {
161
+ let mut file = File :: options ( )
162
+ . write ( true )
163
+ . truncate ( true )
164
+ . create ( true )
165
+ . open ( path)
166
+ . await
167
+ . unwrap ( ) ;
167
168
168
- loop {
169
- tokio:: time:: sleep ( tokio:: time:: Duration :: from_secs ( 5 ) ) . await ;
169
+ loop {
170
+ tokio:: time:: sleep ( tokio:: time:: Duration :: from_secs ( 10 ) ) . await ;
170
171
171
- println ! ( "saving data..." ) ;
172
+ println ! ( "saving data..." ) ;
172
173
173
- file. seek ( std :: io:: SeekFrom :: Start ( 0 ) ) . await . unwrap ( ) ;
174
+ file. seek ( tokio :: io:: SeekFrom :: Start ( 0 ) ) . await . unwrap ( ) ;
174
175
175
- let data = task_data. lock ( ) . await ;
176
- file. write_all (
177
- & data
178
- . iter ( )
179
- . flat_map ( |data| data. to_le_bytes ( ) )
180
- . collect :: < Vec < u8 > > ( ) ,
181
- )
182
- . await
183
- . unwrap ( ) ;
176
+ let data = task_data. lock ( ) . await ;
177
+ file. write_all ( & data) . await . unwrap ( ) ;
184
178
185
- println ! ( "saving data... done" ) ;
179
+ drop ( data) ;
180
+ file. sync_all ( ) . await . unwrap ( ) ;
186
181
187
- file. sync_all ( ) . await . unwrap ( ) ;
188
- }
189
- } ) ;
182
+ println ! ( "saving data... done" ) ;
183
+ }
184
+ } ) ;
185
+ }
190
186
}
191
187
192
188
Self {
@@ -231,7 +227,7 @@ impl Data {
231
227
}
232
228
Action :: DrawCubeNormal => {
233
229
let height = message. height as usize * 4 ;
234
- println ! ( "height: {}" , height ) ;
230
+
235
231
let start_x = message. x as usize ;
236
232
let end_x =
237
233
( ( message. x + height as u16 ) . min ( RESOLUTION_WIDTH as u16 - 1 ) ) as usize ;
@@ -249,6 +245,7 @@ impl Data {
249
245
}
250
246
Action :: DrawCubeHollow => {
251
247
let height = message. height as usize * 4 ;
248
+
252
249
let start_x = message. x as usize ;
253
250
let end_x =
254
251
( ( message. x + height as u16 ) . min ( RESOLUTION_WIDTH as u16 - 1 ) ) as usize ;
@@ -343,9 +340,11 @@ impl Data {
343
340
let mut encoded = Vec :: with_capacity ( 7 * data. len ( ) ) ;
344
341
encoded. extend ( data. iter ( ) . flat_map ( |msg| msg. encode ( ) ) ) ;
345
342
346
- self . listeners . retain ( |listener| !listener. is_closed ( ) ) ;
347
-
348
343
for listener in & self . listeners {
344
+ if listener. is_closed ( ) {
345
+ continue ;
346
+ }
347
+
349
348
listener. send ( encoded. clone ( ) ) . await . unwrap ( ) ;
350
349
}
351
350
}
0 commit comments