11use std:: sync:: Arc ;
22
3- use anyhow:: Result as AnyResult ;
43use async_trait:: async_trait;
54use tentacli_traits:: types:: opcodes:: Opcode ;
65use tokio:: io:: { AsyncReadExt , BufReader } ;
76use tokio:: net:: tcp:: OwnedReadHalf ;
7+ use tokio:: sync:: mpsc:: Sender ;
88use tokio:: sync:: Mutex ;
9+ use tokio:: task:: JoinHandle ;
910
11+ use crate :: primary:: crypto:: header_crypt:: HeaderDecryptor ;
1012use crate :: primary:: server:: auth:: {
1113 AuthProcessor , LoginChallengeIncoming , LoginProofIncoming , RealmlistIncoming ,
1214} ;
1315use crate :: primary:: server:: types:: Packet ;
14- use crate :: primary:: traits:: base_server:: { BaseServer , Connection } ;
1516use crate :: primary:: traits:: processor:: Processor ;
17+ use crate :: primary:: traits:: server:: BaseServer ;
1618use crate :: primary:: types:: ProcessorFunction ;
17- use crate :: RunOptions ;
1819
19- pub struct LoginServer { }
20- impl LoginServer {
21- pub fn new ( ) -> Self {
22- Self { }
23- }
24- }
20+ #[ derive( Default ) ]
21+ pub struct LoginServer ;
2522
2623#[ async_trait]
2724impl BaseServer for LoginServer {
28- async fn read_packet (
29- socket : & mut OwnedReadHalf ,
30- _: Arc < Mutex < Connection > > ,
31- ) -> AnyResult < Packet > {
32- let opcode = socket. read_u8 ( ) . await ?;
33- let mut reader = BufReader :: new ( socket) ;
34-
35- let data = match opcode {
36- Opcode :: LOGIN_CHALLENGE => LoginChallengeIncoming :: from_stream ( & mut reader) . await ?,
37- Opcode :: LOGIN_PROOF => LoginProofIncoming :: from_stream ( & mut reader) . await ?,
38- Opcode :: REALM_LIST => RealmlistIncoming :: from_stream ( & mut reader) . await ?,
39- _ => vec ! [ ] ,
40- } ;
41-
42- Ok ( Packet {
43- opcode : opcode as u32 ,
44- data,
25+ fn handle_read (
26+ input_sender : Sender < Packet > ,
27+ mut reader : BufReader < OwnedReadHalf > ,
28+ _: Arc < Mutex < Option < HeaderDecryptor > > > ,
29+ ) -> JoinHandle < anyhow:: Result < ( ) > > {
30+ tokio:: spawn ( async move {
31+ loop {
32+ let opcode = reader. read_u8 ( ) . await ?;
33+
34+ let body = match opcode {
35+ Opcode :: LOGIN_CHALLENGE => {
36+ LoginChallengeIncoming :: from_stream ( & mut reader) . await ?
37+ }
38+ Opcode :: LOGIN_PROOF => LoginProofIncoming :: from_stream ( & mut reader) . await ?,
39+ Opcode :: REALM_LIST => RealmlistIncoming :: from_stream ( & mut reader) . await ?,
40+ _ => vec ! [ ] ,
41+ } ;
42+
43+ if !body. is_empty ( ) {
44+ input_sender. send ( Packet { opcode : opcode as u32 , body } ) . await ?;
45+ }
46+ }
4547 } )
4648 }
4749
@@ -52,8 +54,4 @@ impl BaseServer for LoginServer {
5254 fn server_name < ' a > ( ) -> & ' a str {
5355 "Login Server"
5456 }
55-
56- fn port ( options : Arc < RunOptions > ) -> u16 {
57- options. login_port
58- }
5957}
0 commit comments