1use std::{
2 net::{SocketAddr, UdpSocket},
3 sync::{Arc, Mutex},
4 time::{Duration, SystemTime},
5};
6
7const CLIENT_TIMEOUT: Duration = Duration::new(3, 0);
8
9use crate::{
10 packets::{ClientPackets, ServerPackets},
11 row::{IntoRawSock, RawSock},
12 DAEMON_PORT,
13};
14use bytes_kman::TBytes;
15use muzzman_lib::{
16 prelude::{TElement, TLocation, TModuleInfo},
17 session::TSession,
18};
19use polling::Poller;
20
21pub struct DaemonInner {
22 socket: UdpSocket,
23 clients: Vec<(SystemTime, SocketAddr)>,
24 buffer: [u8; 4096],
25}
26
27pub struct Daemon {
28 session: Box<dyn TSession>,
29 socket_fd: RawSock,
30 poller: Poller,
31 inner: Arc<Mutex<DaemonInner>>,
32}
33
34unsafe impl Sync for Daemon {}
35unsafe impl Send for Daemon {}
36
37impl Daemon {
38 pub fn new() -> Result<Self, std::io::Error> {
39 let socket = UdpSocket::bind(format!("127.0.0.1:{DAEMON_PORT}")).unwrap();
40 socket.set_nonblocking(true).unwrap();
41
42 let socket_clone = socket.try_clone().unwrap();
43 let socket_fd = socket.into_raw();
44 let socket = socket_clone;
45
46 let poller = Poller::new()?;
47 poller.add(
48 socket_fd,
49 polling::Event {
50 key: 0,
51 readable: true,
52 writable: false,
53 },
54 )?;
55 let socket = socket;
56 let mut session = muzzman_lib::LocalSession::default();
57
58 let inner = Arc::new(Mutex::new(DaemonInner {
59 socket,
60 clients: Vec::new(),
61 buffer: [0; 4096],
62 }));
63
64 let inner_clone = inner.clone();
65 session.callback = Some(Box::new(move |event| {
66 let clients = inner_clone.clients();
67 for client in clients {
68 inner_clone.send(ClientPackets::NewSessionEvent(event.clone()), &client);
69 }
70 }));
71 let session = session.new_session();
72 let default_location = session.get_default_location().unwrap();
73 default_location
74 .set_path(dirs::home_dir().unwrap().join("Downloads"))
75 .unwrap();
76
77 Ok(Self {
78 session,
79 inner,
80 poller,
81 socket_fd,
82 })
83 }
84
85 pub fn run(mut self) {
86 let mut events = Vec::new();
87 events.push(polling::Event {
88 key: 0,
89 readable: false,
90 writable: false,
91 });
92 loop {
93 self.poller.wait(&mut events, None).unwrap();
94 for event in events.iter() {
95 if event.key == 0 {
96 self.poller
97 .modify(
98 self.socket_fd,
99 polling::Event {
100 key: 0,
101 readable: true,
102 writable: false,
103 },
104 )
105 .unwrap();
106 self.respond_to_requests();
107 }
108 }
109 }
110 }
111
112 fn respond_to_requests(&mut self) {
113 let Some((addr, packets)) = self.inner.recv() else{
114 return
115 };
116 for packet in packets {
117 match packet {
118 ServerPackets::GetDefaultLocation { id } => {
119 let packet = match self.session.get_default_location() {
120 Ok(ok) => ClientPackets::GetDefaultLocation(id, Ok(ok.id())),
121 Err(err) => ClientPackets::GetDefaultLocation(id, Err(err)),
122 };
123 self.inner.send(packet, &addr);
124 }
125 ServerPackets::LocationGetName { id, from } => {
126 let packet =
127 ClientPackets::LocationGetName(id, self.session.location_get_name(&from));
128 self.inner.send(packet, &addr);
129 }
130 ServerPackets::LocationSetName { id, from, to } => {
131 let packet = ClientPackets::LocationSetName(
132 id,
133 self.session.location_set_name(&from, &to),
134 );
135 self.inner.send(packet, &addr)
136 }
137 ServerPackets::LocationGetDesc { id, from } => {
138 let packet =
139 ClientPackets::LocationGetDesc(id, self.session.location_get_desc(&from));
140
141 self.inner.send(packet, &addr)
142 }
143 ServerPackets::LocationSetDesc { id, from, to } => {
144 let packet = ClientPackets::LocationSetDesc(
145 id,
146 self.session.location_set_desc(&from, &to),
147 );
148 self.inner.send(packet, &addr)
149 }
150 ServerPackets::LocationGetInfo { id, from } => {
151 let packet = ClientPackets::LocationGetInfo(
152 id,
153 self.session.location_get_location_info(&from),
154 );
155 self.inner.send(packet, &addr)
156 }
157 ServerPackets::CreateElement {
158 id,
159 location_id,
160 name,
161 } => {
162 let packet = match self.session.create_element(&name, &location_id) {
163 Ok(ok) => ClientPackets::CreateElement(id, Ok(ok.id())),
164 Err(err) => ClientPackets::CreateElement(id, Err(err)),
165 };
166 self.inner.send(packet, &addr)
167 }
168 ServerPackets::ElementGetName { id, element_id } => {
169 let packet = ClientPackets::ElementGetName(
170 id,
171 self.session.element_get_name(&element_id),
172 );
173 self.inner.send(packet, &addr);
174 }
175 ServerPackets::ElementSetName { id, element_id, to } => {
176 let packet = ClientPackets::ElementSetName(
177 id,
178 self.session.element_set_name(&element_id, &to),
179 );
180 self.inner.send(packet, &addr);
181 }
182 ServerPackets::ElementGetDesc { id, element_id } => {
183 let packet = ClientPackets::ElementGetDesc(
184 id,
185 self.session.element_get_desc(&element_id),
186 );
187 self.inner.send(packet, &addr);
188 }
189 ServerPackets::ElementSetDesc { id, element_id, to } => {
190 let packet = ClientPackets::ElementSetDesc(
191 id,
192 self.session.element_set_desc(&element_id, &to),
193 );
194 self.inner.send(packet, &addr);
195 }
196 ServerPackets::ElementGetMeta { id, element_id } => {
197 let packet = ClientPackets::ElementGetMeta(
198 id,
199 self.session.element_get_meta(&element_id),
200 );
201 self.inner.send(packet, &addr);
202 }
203 ServerPackets::ElementSetMeta { id, element_id, to } => {
204 let packet = ClientPackets::ElementSetMeta(
205 id,
206 self.session.element_set_meta(&element_id, &to),
207 );
208 self.inner.send(packet, &addr);
209 }
210 ServerPackets::ElementGetInfo { id, element_id } => {
211 let packet = ClientPackets::ElementGetInfo(
212 id,
213 Box::new(self.session.element_get_element_info(&element_id)),
214 );
215 self.inner.send(packet, &addr);
216 }
217 ServerPackets::LoadModule { id, path } => {
218 let packet = ClientPackets::LoadModule(
219 id,
220 match self.session.load_module(path) {
221 Ok(ok) => Ok(ok.id()),
222 Err(err) => Err(err),
223 },
224 );
225 self.inner.send(packet, &addr);
226 }
227 ServerPackets::RemoveModule { id, module_id } => {
228 let packet = ClientPackets::RemoveModule(
229 id,
230 match self.session.remove_module(module_id) {
231 Ok(_) => Ok(()),
232 Err(err) => Err(err),
233 },
234 );
235 self.inner.send(packet, &addr);
236 }
237 ServerPackets::GetActionsLen { id } => {
238 let packet = ClientPackets::GetActionsLen(id, self.session.get_actions_len());
239 self.inner.send(packet, &addr);
240 }
241 ServerPackets::GetActions { id, range } => {
242 let packet = ClientPackets::GetActions(
243 id,
244 match self.session.get_actions(range) {
245 Ok(ok) => {
246 let mut tmp = Vec::new();
247 for k in ok {
248 tmp.push((k.0, k.1.id(), k.2));
249 }
250 Ok(tmp)
251 }
252 Err(err) => Err(err),
253 },
254 );
255 self.inner.send(packet, &addr);
256 }
257 ServerPackets::RunAction {
258 id,
259 module_id,
260 name,
261 data,
262 } => {
263 let packet = ClientPackets::RunAction(
264 id,
265 self.session.run_action(&module_id, name, data),
266 );
267 self.inner.send(packet, &addr);
268 }
269 ServerPackets::GetModulesLen { id } => {
270 let packet = ClientPackets::GetModulesLen(id, self.session.get_modules_len());
271 self.inner.send(packet, &addr);
272 }
273 ServerPackets::GetModules { id, range } => {
274 let packet = ClientPackets::GetModules(
275 id,
276 match self.session.get_modules(range) {
277 Ok(ok) => {
278 let mut tmp = Vec::with_capacity(ok.len());
279 for k in ok {
280 tmp.push(k.id())
281 }
282 Ok(tmp)
283 }
284 Err(err) => Err(err),
285 },
286 );
287 self.inner.send(packet, &addr);
288 }
289 ServerPackets::ModuleGetName { id, module_id } => {
290 let packet =
291 ClientPackets::ModuleGetName(id, self.session.module_get_name(&module_id));
292 self.inner.send(packet, &addr)
293 }
294 ServerPackets::ModuleSetName { id, module_id, to } => {
295 let packet = ClientPackets::ModuleSetName(
296 id,
297 self.session.module_set_name(&module_id, to),
298 );
299 self.inner.send(packet, &addr);
300 }
301 ServerPackets::ModuleGetDefaultName { id, module_id } => {
302 let packet = ClientPackets::ModuleGetDefaultName(
303 id,
304 self.session.module_get_default_name(&module_id),
305 );
306 self.inner.send(packet, &addr)
307 }
308 ServerPackets::ModuleGetDesc { id, module_id } => {
309 let packet =
310 ClientPackets::ModuleGetDesc(id, self.session.module_get_desc(&module_id));
311 self.inner.send(packet, &addr)
312 }
313 ServerPackets::ModuleSetDesc { id, module_id, to } => {
314 let packet = ClientPackets::ModuleSetDesc(
315 id,
316 self.session.module_set_desc(&module_id, to),
317 );
318 self.inner.send(packet, &addr);
319 }
320 ServerPackets::ModuleGetDefaultDesc { id, module_id } => {
321 let packet = ClientPackets::ModuleGetDefaultDesc(
322 id,
323 self.session.module_get_default_desc(&module_id),
324 );
325 self.inner.send(packet, &addr)
326 }
327 ServerPackets::ModuleGetProxy { id, module_id } => {
328 let packet = ClientPackets::ModuleGetProxy(
329 id,
330 self.session.module_get_proxy(&module_id),
331 );
332 self.inner.send(packet, &addr)
333 }
334 ServerPackets::ModuleSetProxy { id, module_id, to } => {
335 let packet = ClientPackets::ModuleSetProxy(
336 id,
337 self.session.module_set_proxy(&module_id, to),
338 );
339 self.inner.send(packet, &addr)
340 }
341 ServerPackets::ModuleGetSettings { id, module_id } => {
342 let packet = ClientPackets::ModuleGetSettings(
343 id,
344 Box::new(self.session.module_get_settings(&module_id)),
345 );
346 self.inner.send(packet, &addr)
347 }
348 ServerPackets::ModuleSetSettings { id, module_id, to } => {
349 let packet = ClientPackets::ModuleSetSettings(
350 id,
351 self.session.module_set_settings(&module_id, to),
352 );
353 self.inner.send(packet, &addr)
354 }
355 ServerPackets::ModuleGetElementSettings { id, module_id } => {
356 let packet = ClientPackets::ModuleGetElementSettings(
357 id,
358 self.session.module_get_element_settings(&module_id),
359 );
360 self.inner.send(packet, &addr);
361 }
362 ServerPackets::ModuleSetElementSettings { id, module_id, to } => {
363 let packet = ClientPackets::ModuleSetElementSettings(
364 id,
365 self.session.module_set_element_settings(&module_id, to),
366 );
367 self.inner.send(packet, &addr)
368 }
369 ServerPackets::ModuleInitLocation {
370 id,
371 module_id,
372 location_id,
373 data,
374 } => {
375 let packet = ClientPackets::ModuleInitLocation(
376 id,
377 self.session
378 .module_init_location(&module_id, &location_id, data),
379 );
380 self.inner.send(packet, &addr)
381 }
382 ServerPackets::ModuleInitElement {
383 id,
384 module_id,
385 element_id,
386 } => {
387 let packet = ClientPackets::ModuleInitElement(
388 id,
389 self.session.module_init_element(&module_id, &element_id),
390 );
391 self.inner.send(packet, &addr)
392 }
393 ServerPackets::ModuleAcceptUrl { id, module_id, url } => {
394 let packet = ClientPackets::ModuleAcceptUrl(
396 id,
397 self.session.module_accept_url(&module_id, url),
398 );
399 self.inner.send(packet, &addr)
400 }
401 ServerPackets::ModuleAcceptExtension {
402 id,
403 module_id,
404 filename,
405 } => {
406 let packet = ClientPackets::ModuleAcceptExtension(
407 id,
408 self.session.module_accept_extension(&module_id, &filename),
409 );
410 self.inner.send(packet, &addr);
411 }
412 ServerPackets::MoveElement {
413 id,
414 element_id,
415 location_id,
416 } => {
417 let packet = ClientPackets::MoveElement(
418 id,
419 self.session.move_element(&element_id, &location_id),
420 );
421 self.inner.send(packet, &addr)
422 }
423 ServerPackets::DestroyElement { id, element_id } => {
424 let packet = ClientPackets::DestroyElement(
425 id,
426 match self.session.destroy_element(element_id) {
427 Ok(_) => Ok(()),
428 Err(err) => Err(err),
429 },
430 );
431 self.inner.send(packet, &addr)
432 }
433 ServerPackets::ElementGetElementData { id, element_id } => {
434 let packet = ClientPackets::ElementGetElementData(
435 id,
436 self.session.element_get_element_data(&element_id),
437 );
438 self.inner.send(packet, &addr)
439 }
440 ServerPackets::ElementSetElementData { id, element_id, to } => {
441 let packet = ClientPackets::ElementSetElementData(
442 id,
443 self.session.element_set_element_data(&element_id, to),
444 );
445 self.inner.send(packet, &addr)
446 }
447 ServerPackets::ElementGetModuleData { id, element_id } => {
448 let packet = ClientPackets::ElementGetModuleData(
449 id,
450 self.session.element_get_module_data(&element_id),
451 );
452 self.inner.send(packet, &addr)
453 }
454 ServerPackets::ElementSetModuleData { id, element_id, to } => {
455 let packet = ClientPackets::ElementSetModuleData(
456 id,
457 self.session.element_set_module_data(&element_id, to),
458 );
459 self.inner.send(packet, &addr)
460 }
461 ServerPackets::ElementGetModule { id, element_id } => {
462 let packet = ClientPackets::ElementGetModule(
463 id,
464 match self.session.element_get_module(&element_id) {
465 Ok(ok) => match ok {
466 Some(some) => Ok(Some(some.id())),
467 None => Ok(None),
468 },
469 Err(err) => Err(err),
470 },
471 );
472 self.inner.send(packet, &addr)
473 }
474 ServerPackets::ElementSetModule {
475 id,
476 element_id,
477 module,
478 } => {
479 let packet = ClientPackets::ElementSetModule(
480 id,
481 self.session.element_set_module(&element_id, module),
482 );
483 self.inner.send(packet, &addr)
484 }
485 ServerPackets::ElementGetStatuses { id, element_id } => {
486 let packet = ClientPackets::ElementGetStatuses(
487 id,
488 self.session.element_get_statuses(&element_id),
489 );
490 self.inner.send(packet, &addr)
491 }
492 ServerPackets::ElementSetStatuses { id, element_id, to } => {
493 let packet = ClientPackets::ElementSetStatuses(
494 id,
495 self.session.element_set_statuses(&element_id, to),
496 );
497 self.inner.send(packet, &addr)
498 }
499 ServerPackets::ElementGetStatus { id, element_id } => {
500 let packet = ClientPackets::ElementGetStatus(
501 id,
502 self.session.element_get_status(&element_id),
503 );
504 self.inner.send(packet, &addr)
505 }
506 ServerPackets::ElementSetStatus { id, element_id, to } => {
507 let packet = ClientPackets::ElementSetStatus(
508 id,
509 self.session.element_set_status(&element_id, to),
510 );
511 self.inner.send(packet, &addr)
512 }
513 ServerPackets::ElementGetData { id, element_id } => {
514 let packet = ClientPackets::ElementGetData(
515 id,
516 self.session.element_get_data(&element_id),
517 );
518 self.inner.send(packet, &addr)
519 }
520 ServerPackets::ElementSetData { id, element_id, to } => {
521 let packet = ClientPackets::ElementSetData(
522 id,
523 self.session.element_set_data(&element_id, to),
524 );
525 self.inner.send(packet, &addr)
526 }
527 ServerPackets::ElementGetProgress { id, element_id } => {
528 let packet = ClientPackets::ElementGetProgress(
529 id,
530 self.session.element_get_progress(&element_id),
531 );
532 self.inner.send(packet, &addr)
533 }
534 ServerPackets::ElementSetProgress { id, element_id, to } => {
535 let packet = ClientPackets::ElementSetProgress(
536 id,
537 self.session.element_set_progress(&element_id, to),
538 );
539 self.inner.send(packet, &addr)
540 }
541 ServerPackets::ElementGetShouldSave { id, element_id } => {
542 let packet = ClientPackets::ElementGetShouldSave(
543 id,
544 self.session.element_get_should_save(&element_id),
545 );
546 self.inner.send(packet, &addr)
547 }
548 ServerPackets::ElementSetShouldSave { id, element_id, to } => {
549 let packet = ClientPackets::ElementSetShouldSave(
550 id,
551 self.session.element_set_should_save(&element_id, to),
552 );
553 self.inner.send(packet, &addr)
554 }
555 ServerPackets::ElementGetEnabled { id, element_id } => {
556 let packet = ClientPackets::ElementGetEnabled(
557 id,
558 self.session.element_get_enabled(&element_id),
559 );
560 self.inner.send(packet, &addr)
561 }
562 ServerPackets::ElementSetEnabled { id, element_id, to } => {
563 let packet = ClientPackets::ElementSetEnabled(
564 id,
565 self.session.element_set_enabled(&element_id, to, None),
566 );
567 self.inner.send(packet, &addr)
568 }
569 ServerPackets::ElementResolvModule { id, element_id } => {
570 let packet = ClientPackets::ElementResolvModule(
571 id,
572 self.session.element_resolv_module(&element_id),
573 );
574 self.inner.send(packet, &addr)
575 }
576 ServerPackets::ElementWait { id, element_id } => {
577 let packet =
586 ClientPackets::ElementWait(id, self.session.element_wait(&element_id));
587 self.inner.send(packet, &addr)
588 }
589 ServerPackets::ElementNotify {
590 id,
591 element_id,
592 event,
593 } => {
594 let packet = ClientPackets::ElementNotify(
595 id,
596 self.session.element_notify(&element_id, event),
597 );
598 self.inner.send(packet, &addr)
599 }
600 ServerPackets::ElementEmit {
601 id,
602 element_id,
603 event,
604 } => {
605 let packet = ClientPackets::ElementEmit(
606 id,
607 self.session.element_emit(&element_id, event),
608 );
609 self.inner.send(packet, &addr)
610 }
611 ServerPackets::ElementSubscribe { id, element_id, to } => {
612 let packet = ClientPackets::ElementSubscribe(
613 id,
614 self.session.element_subscribe(&element_id, to),
615 );
616 self.inner.send(packet, &addr)
617 }
618 ServerPackets::ElementUnSubscribe { id, element_id, to } => {
619 let packet = ClientPackets::ElementUnSubscribe(
620 id,
621 self.session.element_unsubscribe(&element_id, to),
622 );
623 self.inner.send(packet, &addr)
624 }
625 ServerPackets::CreateLocation {
626 id,
627 name,
628 location_id,
629 } => {
630 let packet = ClientPackets::CreateLocation(
631 id,
632 match self.session.create_location(&name, &location_id) {
633 Ok(ok) => Ok(ok.id()),
634 Err(err) => Err(err),
635 },
636 );
637 self.inner.send(packet, &addr)
638 }
639 ServerPackets::GetLocationsLen { id, location_id } => {
640 let packet = ClientPackets::GetLocationsLen(
641 id,
642 self.session.get_locations_len(&location_id),
643 );
644 self.inner.send(packet, &addr)
645 }
646 ServerPackets::GetLocations {
647 id,
648 location_id,
649 range,
650 } => {
651 let packet = ClientPackets::GetLocations(
652 id,
653 match self.session.get_locations(&location_id, range) {
654 Ok(ok) => {
655 let mut tmp = Vec::with_capacity(ok.len());
656
657 for k in ok {
658 tmp.push(k.id())
659 }
660
661 Ok(tmp)
662 }
663 Err(err) => Err(err),
664 },
665 );
666 self.inner.send(packet, &addr)
667 }
668 ServerPackets::DestroyLocation { id, location_id } => {
669 let packet = ClientPackets::DestroyLocation(
670 id,
671 match self.session.destroy_location(location_id) {
672 Ok(_) => Ok(()),
673 Err(err) => Err(err),
674 },
675 );
676 self.inner.send(packet, &addr)
677 }
678 ServerPackets::MoveLocation {
679 id,
680 location_id,
681 to,
682 } => {
683 let packet = ClientPackets::MoveLocation(
684 id,
685 self.session.move_location(&location_id, &to),
686 );
687 self.inner.send(packet, &addr)
688 }
689 ServerPackets::LocationGetPath { id, location_id } => {
690 let packet = ClientPackets::LocationGetPath(
691 id,
692 self.session.location_get_path(&location_id),
693 );
694 self.inner.send(packet, &addr)
695 }
696 ServerPackets::LocationSetPath {
697 id,
698 location_id,
699 to,
700 } => {
701 let packet = ClientPackets::LocationSetPath(
702 id,
703 self.session.location_set_path(&location_id, to),
704 );
705 self.inner.send(packet, &addr)
706 }
707 ServerPackets::LocationGetShouldSave { id, location_id } => {
708 let packet = ClientPackets::LocationGetShouldSave(
709 id,
710 self.session.location_get_should_save(&location_id),
711 );
712 self.inner.send(packet, &addr)
713 }
714 ServerPackets::LocationSetShouldSave {
715 id,
716 location_id,
717 to,
718 } => {
719 let packet = ClientPackets::LocationSetShouldSave(
720 id,
721 self.session.location_set_should_save(&location_id, to),
722 );
723 self.inner.send(packet, &addr)
724 }
725 ServerPackets::LocationGetElementsLen { id, location_id } => {
726 let packet = ClientPackets::LocationGetElementsLen(
727 id,
728 self.session.location_get_elements_len(&location_id),
729 );
730 self.inner.send(packet, &addr)
731 }
732 ServerPackets::LocationGetElements {
733 id,
734 location_id,
735 range,
736 } => {
737 let packet = ClientPackets::LocationGetElements(
738 id,
739 match self.session.location_get_elements(&location_id, range) {
740 Ok(ok) => {
741 let mut tmp = Vec::with_capacity(ok.len());
742
743 for k in ok {
744 tmp.push(k.id())
745 }
746
747 Ok(tmp)
748 }
749 Err(err) => Err(err),
750 },
751 );
752 self.inner.send(packet, &addr)
753 }
754 ServerPackets::LocationNotify {
755 id,
756 location_id,
757 event,
758 } => {
759 let packet = ClientPackets::LocationNotify(
760 id,
761 self.session.location_notify(&location_id, event),
762 );
763 self.inner.send(packet, &addr)
764 }
765 ServerPackets::LocationEmit {
766 id,
767 location_id,
768 event,
769 } => {
770 let packet = ClientPackets::LocationEmit(
771 id,
772 self.session.location_emit(&location_id, event),
773 );
774 self.inner.send(packet, &addr)
775 }
776 ServerPackets::LocationSubscribe {
777 id,
778 location_id,
779 to,
780 } => {
781 let packet = ClientPackets::LocationSubscribe(
782 id,
783 self.session.location_subscribe(&location_id, to),
784 );
785 self.inner.send(packet, &addr)
786 }
787 ServerPackets::LocationUnSubscribe {
788 id,
789 location_id,
790 to,
791 } => {
792 let packet = ClientPackets::LocationUnSubscribe(
793 id,
794 self.session.location_unsubscribe(&location_id, to),
795 );
796 self.inner.send(packet, &addr)
797 }
798 ServerPackets::ModuleAcceptedProtocols { id, module_id } => {
799 let packet = ClientPackets::ModuleAcceptedProtocols(
800 id,
801 self.session.module_accepted_protocols(&module_id),
802 );
803 self.inner.send(packet, &addr)
804 }
805 ServerPackets::ElementGetUrl { id, element_id } => {
806 let packet =
807 ClientPackets::ElementGetUrl(id, self.session.element_get_url(&element_id));
808 self.inner.send(packet, &addr)
809 }
810 ServerPackets::ElementSetUrl { id, element_id, to } => {
811 let packet = ClientPackets::ElementSetUrl(
812 id,
813 self.session.element_set_url(&element_id, to),
814 );
815 self.inner.send(packet, &addr)
816 }
817 ServerPackets::Tick => {}
818 }
819 }
820 }
821}
822
823trait TDaemonInner {
824 fn send(&self, packet: ClientPackets, to: &SocketAddr);
825 fn recv(&self) -> Option<(SocketAddr, Vec<ServerPackets>)>;
826 fn gc_clients(&self);
828 fn clients(&self) -> Vec<SocketAddr>;
829}
830
831impl DaemonInner {
832 fn get_inner(&mut self) -> (&mut [u8], &mut UdpSocket) {
833 (&mut self.buffer, &mut self.socket)
834 }
835}
836
837impl TDaemonInner for Arc<Mutex<DaemonInner>> {
838 fn send(&self, packet: ClientPackets, to: &SocketAddr) {
839 let mut bytes = packet.to_bytes();
840 bytes.reverse();
841 let _ = self.lock().unwrap().socket.send_to(&bytes, to);
842 }
843
844 fn recv(&self) -> Option<(SocketAddr, Vec<ServerPackets>)> {
845 let mut inner = self.lock().unwrap();
846
847 let (buffer, socket) = inner.get_inner();
848
849 let Ok((len, from)) = socket.recv_from(buffer) else{return None};
850
851 {
852 let mut finded = false;
853 for client in inner.clients.iter_mut() {
854 if client.1 == from {
855 client.0 = SystemTime::now();
856 finded = true;
857 break;
858 }
859 }
860
861 if !finded {
862 inner.clients.push((SystemTime::now(), from))
863 }
864 }
865
866 let mut buffer = inner.buffer[0..len].to_vec();
867 let mut packets = Vec::new();
868 while !buffer.is_empty() {
869 let Some(packet) = ServerPackets::from_bytes(&mut buffer) else{continue};
870 packets.push(packet)
871 }
872
873 Some((from, packets))
874 }
875
876 fn gc_clients(&self) {
877 self.lock()
878 .unwrap()
879 .clients
880 .retain(|(time, _)| time.elapsed().unwrap() > CLIENT_TIMEOUT);
881 }
882
883 fn clients(&self) -> Vec<SocketAddr> {
884 self.gc_clients();
885 self.lock()
886 .unwrap()
887 .clients
888 .iter()
889 .map(|(_, addr)| *addr)
890 .collect::<Vec<SocketAddr>>()
891 }
892}