Skip to content

Commit 369fdbf

Browse files
update
1 parent d889b81 commit 369fdbf

File tree

13 files changed

+145
-172
lines changed

13 files changed

+145
-172
lines changed

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ license-file = "LICENSE"
1313
[dependencies]
1414
anyhow = "1.0"
1515
arc4 = "0.1.0"
16+
async-broadcast = "0.7.1"
1617
async-trait = "0.1.77"
1718
bitflags = "2.4.2"
1819
byteorder = "1.4.3"
@@ -21,6 +22,7 @@ flate2 = "1.0.24"
2122
futures = "0.3.21"
2223
hmac-sha = "0.6.1"
2324
num-bigint = "0.4.3"
25+
num-traits = "0.2.18"
2426
rand = "0.9.0"
2527
serde = { version = "1.0.197", features = ["derive"] }
2628
serde_json = "1.0.114"
@@ -31,7 +33,6 @@ tentacli-packet = "7.0.0"
3133
tentacli-traits = "9.2.1"
3234
tentacli-utils = "2.1.0"
3335
tokio = { version = "1", features = ["sync", "net", "io-util", "macros", "time", "rt-multi-thread"] }
34-
num-traits = "0.2.18"
3536

3637
[features]
3738
# use this feature to turn on println

src/lib.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
use std::sync::Arc;
2+
3+
use anyhow::Result as AnyResult;
4+
use async_broadcast::Receiver as BroadcastReceiver;
5+
use futures::future::join_all;
6+
use tentacli_traits::types::HandlerOutput;
7+
use tokio::sync::Mutex;
8+
9+
pub(crate) use primary::debug;
10+
11+
pub use crate::primary::crypto::srp::Srp;
12+
use crate::primary::server::{LoginServer, WorldServer};
13+
pub use crate::primary::traits::base_server::{BaseServer, RunOptions};
14+
15+
mod primary;
16+
17+
#[derive(Default)]
18+
pub struct Options {
19+
pub receiver: Option<BroadcastReceiver<HandlerOutput>>,
20+
pub login_port: u16,
21+
pub world_port: u16,
22+
}
23+
24+
pub struct Server;
25+
impl Server {
26+
pub async fn run(
27+
Options {
28+
receiver,
29+
login_port,
30+
world_port,
31+
}: Options,
32+
) -> AnyResult<()> {
33+
let srp = Arc::new(Mutex::new(Srp::new()));
34+
35+
let login_options = Arc::new(RunOptions {
36+
srp: srp.clone(),
37+
login_port,
38+
world_port,
39+
..RunOptions::default()
40+
});
41+
42+
let world_options = Arc::new(RunOptions {
43+
srp,
44+
receiver,
45+
login_port,
46+
world_port,
47+
});
48+
49+
let run_login_server = || {
50+
tokio::spawn(async move {
51+
if let Err(err) = LoginServer::new().run(login_options).await {
52+
debug!("Error running Login Server: {}", err);
53+
}
54+
})
55+
};
56+
57+
let run_world_server = || {
58+
tokio::spawn(async move {
59+
if let Err(err) = WorldServer::new().run(world_options).await {
60+
debug!("Error running World Server: {}", err);
61+
}
62+
})
63+
};
64+
65+
join_all(vec![run_login_server(), run_world_server()]).await;
66+
67+
Ok(())
68+
}
69+
}

src/main.rs

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,15 @@
1-
use std::sync::Arc;
2-
31
use anyhow::Result as AnyResult;
4-
use futures::future::join_all;
5-
use tokio::sync::Mutex;
6-
7-
pub(crate) use primary::debug;
8-
9-
use crate::primary::crypto::srp::Srp;
10-
use crate::primary::server::{LoginServer, WorldServer};
11-
use crate::primary::traits::server::{RunOptions, Server};
122

13-
mod primary;
3+
use tine::{Options, Server};
144

155
#[tokio::main]
166
async fn main() -> AnyResult<()> {
17-
let options = Arc::new(RunOptions {
18-
srp: Arc::new(Mutex::new(Srp::new())),
19-
});
20-
21-
let run_login_server = || {
22-
let options = options.clone();
23-
tokio::spawn(async move {
24-
if let Err(err) = LoginServer::new().run(options).await {
25-
debug!("Error running Login Server: {}", err);
26-
}
27-
})
28-
};
29-
30-
let run_world_server = || {
31-
let options = options.clone();
32-
tokio::spawn(async move {
33-
if let Err(err) = WorldServer::new().run(options).await {
34-
debug!("Error running World Server: {}", err);
35-
}
36-
})
37-
};
38-
39-
join_all(vec![run_login_server(), run_world_server()]).await;
7+
Server::run(Options {
8+
login_port: 3724,
9+
world_port: 19999,
10+
..Options::default()
11+
})
12+
.await?;
4013

4114
Ok(())
4215
}

src/primary/crypto/srp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use sha1::Digest;
44

55
const MODULUS: &str = "894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7";
66

7-
#[derive(Debug)]
7+
#[derive(Debug, Default)]
88
pub struct Srp {
99
pub modulus: BigInt,
1010
pub generator: BigInt,
Lines changed: 9 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
use async_trait::async_trait;
2-
use rand::{random_range, Rng};
3-
use rand::distr::Alphanumeric;
2+
use rand::random_range;
43
use serde::{Deserialize, Serialize};
54
use tentacli_packet::{LoginPacket, Segment};
65
use tentacli_traits::types::opcodes::Opcode;
76
use tentacli_traits::types::realm::Realm;
87

9-
use crate::primary::server::WORLD_PORT;
108
use crate::primary::traits::packet_handler::PacketHandler;
119
use crate::primary::types::{HandlerInput, HandlerOutput, HandlerResult};
12-
use crate::primary::types::fields::realms::Realms;
1310

1411
#[derive(LoginPacket, Serialize, Deserialize, Debug)]
1512
pub struct RealmlistIncoming {
@@ -28,18 +25,15 @@ struct Outgoing {
2825
pub struct Handler;
2926
#[async_trait]
3027
impl PacketHandler for Handler {
31-
async fn handle(&mut self, _: &mut HandlerInput) -> HandlerResult {
32-
let realms = Self::generate_unique_realms();
33-
let realms_count = realms.len() as u16;
34-
28+
async fn handle(&mut self, input: &mut HandlerInput) -> HandlerResult {
3529
let realms_bytes = {
36-
#[derive(Segment, Serialize, Deserialize)]
30+
#[derive(Segment, Serialize)]
3731
struct RealmsSerializer {
38-
realms: Realms,
32+
realms: Vec<Realm>,
3933
}
4034

4135
RealmsSerializer {
42-
realms: Realms(realms.clone()),
36+
realms: vec![Self::generate_realm(input.server_info.world_port)],
4337
}
4438
.to_binary()
4539
.unwrap()
@@ -49,7 +43,7 @@ impl PacketHandler for Handler {
4943
Outgoing {
5044
size: (realms_bytes.len() + 8) as u16,
5145
unknown: 0,
52-
realms_count,
46+
realms_count: 1,
5347
realms: realms_bytes,
5448
unknown2: 0x0010,
5549
}
@@ -59,40 +53,17 @@ impl PacketHandler for Handler {
5953
}
6054

6155
impl Handler {
62-
fn generate_realm() -> Realm {
56+
fn generate_realm(port: u16) -> Realm {
6357
let mut realm = Realm::default();
6458

65-
let name: String = rand::rng()
66-
.sample_iter(Alphanumeric)
67-
.take(10)
68-
.map(char::from)
69-
.collect();
70-
7159
realm.icon = 1;
7260
realm.lock = 0;
7361
realm.flags = 1;
74-
realm.name = name;
75-
realm.address = format!("127.0.0.1:{}", WORLD_PORT);
62+
realm.name = String::from("TINE Aspect Server");
63+
realm.address = format!("127.0.0.1:{}", port);
7664
realm.timezone = 1;
7765
realm.server_id = random_range(0..=100);
7866

7967
realm
8068
}
81-
82-
fn generate_unique_realms() -> Vec<Realm> {
83-
let random_count: usize = random_range(1..=10);
84-
85-
let mut realms = Vec::new();
86-
let mut generated_names = std::collections::HashSet::new();
87-
88-
while realms.len() < random_count {
89-
let realm = Self::generate_realm();
90-
91-
if generated_names.insert(realm.name.clone()) {
92-
realms.push(realm);
93-
}
94-
}
95-
96-
realms
97-
}
9869
}

src/primary/server/login_server.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,24 @@ use tokio::io::{AsyncReadExt, BufReader};
77
use tokio::net::TcpStream;
88
use tokio::sync::Mutex;
99

10-
use crate::primary::server::{LOGIN_PORT, SERVER_HOST};
1110
use crate::primary::server::auth::{
1211
AuthProcessor, LoginChallengeIncoming, LoginProofIncoming, RealmlistIncoming,
1312
};
1413
use crate::primary::server::types::Packet;
14+
use crate::primary::traits::base_server::{BaseServer, Connection};
1515
use crate::primary::traits::processor::Processor;
16-
use crate::primary::traits::server::{Connection, Server};
1716
use crate::primary::types::ProcessorFunction;
17+
use crate::RunOptions;
1818

1919
pub struct LoginServer {}
20-
21-
#[async_trait]
22-
impl Server for LoginServer {
23-
fn new() -> Self {
20+
impl LoginServer {
21+
pub fn new() -> Self {
2422
Self {}
2523
}
24+
}
2625

26+
#[async_trait]
27+
impl BaseServer for LoginServer {
2728
async fn read_packet(socket: &mut TcpStream, _: Arc<Mutex<Connection>>) -> AnyResult<Packet> {
2829
let opcode = socket.read_u8().await?;
2930
let mut reader = BufReader::new(socket);
@@ -45,15 +46,11 @@ impl Server for LoginServer {
4546
vec![Box::new(AuthProcessor::get_handlers)]
4647
}
4748

48-
fn host<'a>() -> &'a str {
49-
SERVER_HOST
50-
}
51-
52-
fn port() -> u16 {
53-
LOGIN_PORT
54-
}
55-
5649
fn server_name<'a>() -> &'a str {
5750
"Login Server"
5851
}
52+
53+
fn port(options: Arc<RunOptions>) -> u16 {
54+
options.login_port
55+
}
5956
}

src/primary/server/mod.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ mod realm;
1212
pub mod types;
1313
mod world_server;
1414

15-
const SERVER_HOST: &str = "127.0.0.1";
16-
const LOGIN_PORT: u16 = 3724;
17-
const WORLD_PORT: u16 = 8999;
18-
1915
#[allow(dead_code)]
2016
type SessionKey = Vec<u8>;
2117
#[allow(dead_code)]

src/primary/server/world_server.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,27 @@ use tokio::io::{AsyncReadExt, AsyncWriteExt};
88
use tokio::net::TcpStream;
99
use tokio::sync::Mutex;
1010

11-
use crate::primary::server::{SERVER_HOST, WORLD_PORT};
1211
use crate::primary::server::auth::auth_challenge;
1312
use crate::primary::server::player::PlayerProcessor;
1413
use crate::primary::server::realm::RealmProcessor;
1514
use crate::primary::server::types::Packet;
15+
use crate::primary::traits::base_server::{BaseServer, Connection, RunOptions};
1616
use crate::primary::traits::processor::Processor;
17-
use crate::primary::traits::server::{Connection, RunOptions, Server};
1817
use crate::primary::types::ProcessorFunction;
1918

2019
const HEADER_SIZE: usize = 6;
2120
const OPCODE_SIZE: usize = 4;
2221

2322
pub struct WorldServer {}
24-
#[async_trait]
25-
impl Server for WorldServer {
26-
fn new() -> Self {
23+
24+
impl WorldServer {
25+
pub fn new() -> Self {
2726
Self {}
2827
}
28+
}
2929

30+
#[async_trait]
31+
impl BaseServer for WorldServer {
3032
async fn read_packet(
3133
socket: &mut TcpStream,
3234
connection: Arc<Mutex<Connection>>,
@@ -64,15 +66,11 @@ impl Server for WorldServer {
6466
]
6567
}
6668

67-
fn host<'a>() -> &'a str {
68-
SERVER_HOST
69-
}
70-
71-
fn port() -> u16 {
72-
WORLD_PORT
73-
}
74-
7569
fn server_name<'a>() -> &'a str {
7670
"World Server"
7771
}
72+
73+
fn port(options: Arc<RunOptions>) -> u16 {
74+
options.world_port
75+
}
7876
}

0 commit comments

Comments
 (0)