summaryrefslogtreecommitdiff
path: root/game_server/src
diff options
context:
space:
mode:
Diffstat (limited to 'game_server/src')
-rw-r--r--game_server/src/backend_connection.rs31
-rw-r--r--game_server/src/gameserver.rs147
-rw-r--r--game_server/src/group.rs8
-rw-r--r--game_server/src/lobby.rs35
-rw-r--r--game_server/src/main.rs20
-rw-r--r--game_server/src/test_group.rs28
-rw-r--r--game_server/src/ws_test.html66
7 files changed, 0 insertions, 335 deletions
diff --git a/game_server/src/backend_connection.rs b/game_server/src/backend_connection.rs
deleted file mode 100644
index 9307c4a..0000000
--- a/game_server/src/backend_connection.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-use reqwest::{Response, Client, Url, UrlError, Error as ReqError};
-
-pub struct BackendConnection {
- host: String,
- client: Client,
- last_response: Option<Result<Response, ReqError>>
-}
-
-impl BackendConnection {
- pub fn new(host: &str) -> Self {
- BackendConnection {
- host: host.to_string(),
- client: Client::new(),
- last_response: None
- }
- }
-
- pub fn request(&mut self, location: &str) -> Result<(), UrlError> {
- Ok(self.last_response =
- Some(self.client.get(Url::parse(&format!("{}{}", self.host, location))?)
- .send()))
- }
-
- pub fn get_response(&self) -> &Option<Result<Response, ReqError>> {
- &self.last_response
- }
-
- pub fn host_name<'a>(&'a self) -> &'a str {
- &self.host
- }
-}
diff --git a/game_server/src/gameserver.rs b/game_server/src/gameserver.rs
deleted file mode 100644
index 9334a27..0000000
--- a/game_server/src/gameserver.rs
+++ /dev/null
@@ -1,147 +0,0 @@
-use websocket::{OwnedMessage,
- sync::Server,
- client::sync::Client,
- server::{NoTlsAcceptor, InvalidConnection,
- sync::AcceptResult}};
-use std::net::{SocketAddr, ToSocketAddrs, TcpStream};
-use std::sync::mpsc;
-use std::sync::mpsc::{Sender, Receiver};
-use super::lobby::Lobby;
-use super::backend_connection::BackendConnection;
-
-const PROTOCOL: &str = "tuesday";
-
-type Token = u32;
-
-#[derive(Debug)]
-pub enum GameServerError {
- BindError(std::io::Error),
- HandshakeRequestError,
- InvalidProtocolError,
- AcceptError(std::io::Error)
-}
-
-pub struct GameServer {
- addr: SocketAddr,
- lobby: Lobby,
- backend: BackendConnection,
-}
-
-pub struct GameClient {
- addr: SocketAddr,
- client: Client<TcpStream>,
-}
-
-impl GameClient {
- fn from_raw(client: Client<TcpStream>) -> Result<Self, ()> {
- let addr = client.peer_addr().map_err(|_| ())?;
- info!("got a client connection from: {}", addr);
- Ok(GameClient {
- addr,
- client,
- })
- }
-
- fn require_token(&mut self) -> Option<Token> {
- let message = self.client
- .recv_message()
- .ok()?;
- if let OwnedMessage::Text(text) = message {
- text.parse::<Token>().ok()
- } else {
- None
- }
- }
-}
-
-type ClientConnection = Result<GameClient, GameServerError>;
-
-impl GameServer {
- pub fn new<T: ToSocketAddrs>(addr: T) -> Self {
- let addr = addr.to_socket_addrs().unwrap().next().unwrap();
- debug!("ws address: {}", addr);
- info!("create lobby");
- let lobby = Lobby::new();
- let backend = BackendConnection::new("https://kobert.dev");
- info!("got a C# backend connection");
- GameServer {
- addr,
- lobby,
- backend,
- }
- }
-
- pub fn run(&self) -> Result<(), GameServerError> {
- let reader = self.read_clients();
- loop {
- let mut connection = reader.recv().unwrap()?;
- self.add_client(connection);
- }
- Ok(())
- }
-
- fn add_client(&self, mut client: GameClient) {
- std::thread::spawn(move || {
- println!("Token: {:?}", client.require_token());
- loop { std::thread::sleep(std::time::Duration::from_millis(100)); }
- });
- }
-
- fn read_clients(&self) -> Receiver<ClientConnection> {
- let (s, r): (Sender<ClientConnection>, Receiver<ClientConnection>)
- = mpsc::channel();
- let addr = self.addr;
- std::thread::spawn(move || {
- let result = Self::handle_requests(addr, &s).or_else(|e| s.send(Err(e)));
- });
- r
- }
-
- fn handle_requests(addr: SocketAddr, s: &Sender<ClientConnection>) -> Result<(), GameServerError> {
- let server = match Server::<NoTlsAcceptor>::bind(addr) {
- Ok(v) => v,
- Err(e) => {
- error!("websocket binding error");
- Err(GameServerError::BindError(e))?
- },
- };
- info!("webserver is being launched");
- for req in server {
- s.send(Ok(Self::handle_request(req)?)).unwrap();
- }
- info!("webserver is being shut down");
- Ok(())
- }
-
- fn handle_request(req: AcceptResult<TcpStream>) -> ClientConnection {
- match req {
- Ok(req) => {
- if !req.protocols().contains(&PROTOCOL.to_string()) {
- warn!("a client tried to connect without {} protocol", PROTOCOL);
- req.reject().unwrap();
- Err(GameServerError::InvalidProtocolError)
- } else {
- match req.use_protocol(PROTOCOL).accept() {
- Ok(client) => {
- match GameClient::from_raw(client) {
- Ok(client) => Ok(client),
- Err(_) => {
- error!("could not create a client");
- Err(GameServerError::HandshakeRequestError)
- }
- }
- },
- Err((_, e)) => {
- warn!("client handshake failed");
- Err(GameServerError::AcceptError(e))
- }
- }
- }
- },
- Err(e) => {
- warn!("invalid client request");
- Err(GameServerError::HandshakeRequestError)
- }
- }
- }
-}
diff --git a/game_server/src/group.rs b/game_server/src/group.rs
deleted file mode 100644
index 55e4fbf..0000000
--- a/game_server/src/group.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-pub type GroupId = u32;
-
-pub trait Group {
- fn id(&self) -> GroupId;
- fn name(&self) -> String;
-
- fn run(&self);
-}
diff --git a/game_server/src/lobby.rs b/game_server/src/lobby.rs
deleted file mode 100644
index fe3bdee..0000000
--- a/game_server/src/lobby.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-use std::collections::HashMap;
-
-use super::group::{Group, GroupId};
-
-pub struct Lobby {
- groups: HashMap<GroupId, Box<Group>>,
-}
-
-impl Lobby {
- pub fn new() -> Lobby {
- Self {
- groups: HashMap::new(),
- }
- }
-
- pub fn add_group(&mut self, group: Box<Group>) {
- self.groups.insert(group.id(), group);
- }
-
- pub fn iter<'a>(&'a self) -> GroupIterator<'a> {
- GroupIterator { groups: self.groups.values() }
- }
-}
-
-pub struct GroupIterator<'a> {
- groups: std::collections::hash_map::Values<'a, GroupId, Box<Group>>
-}
-
-impl<'a> Iterator for GroupIterator<'a> {
- type Item = &'a Box<Group>;
-
- fn next(&mut self) -> Option<Self::Item> {
- self.groups.next()
- }
-}
diff --git a/game_server/src/main.rs b/game_server/src/main.rs
deleted file mode 100644
index e129283..0000000
--- a/game_server/src/main.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-mod group;
-mod test_group;
-mod lobby;
-mod gameserver;
-mod backend_connection;
-
-#[macro_use] extern crate log;
-use pretty_env_logger;
-
-use backend_connection::BackendConnection;
-
-fn main() {
- pretty_env_logger::init();
-
- let addr = ("127.0.0.1", 5001);
- info!("create game server on {:?}", addr);
- let gameserver = gameserver::GameServer::new(addr);
- gameserver.run().unwrap();
-
-}
diff --git a/game_server/src/test_group.rs b/game_server/src/test_group.rs
deleted file mode 100644
index bd570e3..0000000
--- a/game_server/src/test_group.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-use super::group::{Group, GroupId};
-
-pub struct TestGroup {
- id: GroupId,
- name: String,
-}
-
-impl Group for TestGroup {
- fn id(&self) -> GroupId {
- self.id
- }
-
- fn name(&self) -> String {
- self.name.clone()
- }
-
- fn run(&self) {
- let id = self.id;
- let name = self.name.to_owned();
- std::thread::spawn(move || /*loop { println!("> group nr.{} wishes you: '{}'", id, name) }*/());
- }
-}
-
-impl TestGroup {
- pub fn new(id: GroupId, name: String) -> Self {
- TestGroup { id, name }
- }
-}
diff --git a/game_server/src/ws_test.html b/game_server/src/ws_test.html
deleted file mode 100644
index ea259b7..0000000
--- a/game_server/src/ws_test.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <title>WS Test</title>
- <style>
-.b {
- border-bottom: 1px solid black;
-}
- </style>
- </head>
- <body style='background: black; color: white'>
- <div id='cons'>connected</div><br>
- <button onclick='test_connection()'>Launch</button><br>
- <span>Server address: </span><input id='addr'></input>
- <div id='chat' style='background: rgb(20, 20, 20); padding-left: 20px; margin: 40px' />
- </body>
- <script>
-function get_addr() {
- return document.getElementById('addr').value;
-}
-
-function test_connection() {
- let a = 'ws://' + get_addr();
- add_text('create a new connection at "' + a + '"');
- const ws = new WebSocket(a, 'tuesday');
- ws.addEventListener('open', function (event) {
- add_text('connection established');
- toggle_connected(true);
- ws.send('1230123');
- });
- ws.addEventListener('error', function (event) {
- add_text('ws error occured: "' + event + '"');
- toggle_connected(false);
- });
- ws.addEventListener('close', function (event) {
- add_text('ws is closed now');
- toggle_connected(false);
- });
- ws.addEventListener('message', function (event) {
- add_text('got ws message: ' + event.data);
- });
-}
-
-function add_text(text, color='white') {
- let c = document.getElementById('chat');
- let n = document.createElement('span');
- n.setAttribute('class', 'b');
- n.style = 'color: ' + color;
- n.textContent = (new Date()).toTimeString().substring(0, 8) + '|> '+ text;
- c.appendChild(n);
- c.appendChild(document.createElement('br'));
-}
-function toggle_connected(con) {
- let c = document.getElementById('cons');
- if (con) {
- c.style = 'background: green'
- c.textContent = 'connected';
- } else {
- c.style = 'background: red'
- c.textContent = 'not connected';
- }
-}
-toggle_connected(false);
-add_text("JS loaded");
- </script>
-</html>