Add documentation

This commit is contained in:
ElementG9 2020-07-08 22:11:58 -06:00
parent 25119b5ca9
commit 64cedcfa56
6 changed files with 46 additions and 7 deletions

View File

@ -1,5 +1,11 @@
extern crate chrono; // logger.rs
extern crate colorful; // author: Garen Tyler
// description:
// A global logger for Composition.
// The Logger struct makes it easy to create useful server logs.
extern crate chrono; // Used because std::time sucks.
extern crate toml; // Colorful console logging is fun.
use chrono::prelude::*; use chrono::prelude::*;
use colorful::{Color, Colorful}; use colorful::{Color, Colorful};
@ -7,13 +13,15 @@ use std::fs::File;
use std::fs::OpenOptions; use std::fs::OpenOptions;
use std::io::prelude::*; use std::io::prelude::*;
// Uses chrono::Local to get a timestamp in YYYY-MM-DD HH:MM:SS format, in local time.
pub fn get_timestring() -> String { pub fn get_timestring() -> String {
Local::now().format("%Y-%m-%d %H:%M:%S").to_string() Local::now().format("%Y-%m-%d %H:%M:%S").to_string()
} }
// Just a helper function to avoid repeating myself.
pub fn log(logtype: &str, logmessage: &str) -> String { pub fn log(logtype: &str, logmessage: &str) -> String {
format!("{} [{}] - {}", get_timestring(), logtype, logmessage) format!("{} [{}] - {}", get_timestring(), logtype, logmessage)
} }
// So I can do logger::new("log.txt") instead of logger::Logger::new("log.txt").
pub fn new(logfile: &str) -> Logger { pub fn new(logfile: &str) -> Logger {
Logger::new(logfile) Logger::new(logfile)
} }
@ -28,27 +36,33 @@ impl Logger {
logfile: logfile.to_owned(), logfile: logfile.to_owned(),
} }
} }
// For logging something important, like the server port.
pub fn important(&self, s: &str) { pub fn important(&self, s: &str) {
let l = log("IMPORTANT", s); let l = log("IMPORTANT", s);
println!("{}", l.clone().color(Color::Green)); println!("{}", l.clone().color(Color::Green));
self.append(&l); self.append(&l);
} }
// For everything that doesn't fit into any of the other categories.
pub fn info(&self, s: &str) { pub fn info(&self, s: &str) {
let l = log("INFO", s); let l = log("INFO", s);
// Not sure whether I want normal logs to be user controlled color or white.
// println!("{}", l.clone().color(Color::White)); // println!("{}", l.clone().color(Color::White));
println!("{}", l.clone()); println!("{}", l.clone());
self.append(&l); self.append(&l);
} }
// For warnings.
pub fn warn(&self, s: &str) { pub fn warn(&self, s: &str) {
let l = log("WARN", s); let l = log("WARN", s);
println!("{}", l.clone().color(Color::LightYellow)); println!("{}", l.clone().color(Color::LightYellow));
self.append(&l); self.append(&l);
} }
// For errors.
pub fn error(&self, s: &str) { pub fn error(&self, s: &str) {
let l = log("ERROR", s); let l = log("ERROR", s);
println!("{}", l.clone().color(Color::LightRed)); println!("{}", l.clone().color(Color::LightRed));
self.append(&l); self.append(&l);
} }
// Append to the logfile.
pub fn append(&self, s: &str) { pub fn append(&self, s: &str) {
let a = || -> std::io::Result<()> { let a = || -> std::io::Result<()> {
let mut file = OpenOptions::new() let mut file = OpenOptions::new()
@ -63,18 +77,21 @@ impl Logger {
self.logger_error(&format!("Could not write to log file {}", self.logfile)); self.logger_error(&format!("Could not write to log file {}", self.logfile));
} }
} }
// Clear the logfile. Adds an important note to the file that it was cleared.
pub fn clear(&self) { pub fn clear(&self) {
if std::fs::remove_file(&self.logfile).is_err() { if std::fs::remove_file(&self.logfile).is_err() {
self.logger_error(&format!("Could not write to log file {}", self.logfile)); self.logger_error(&format!("Could not write to log file {}", self.logfile));
} }
self.important(&format!("Cleared log file {}", self.logfile)); self.important(&format!("Cleared log file {}", self.logfile));
} }
// Read the logfile into a String.
pub fn read(&self) -> std::io::Result<String> { pub fn read(&self) -> std::io::Result<String> {
let mut f = File::open(&self.logfile)?; let mut f = File::open(&self.logfile)?;
let mut buffer = String::new(); let mut buffer = String::new();
f.read_to_string(&mut buffer)?; f.read_to_string(&mut buffer)?;
Ok(buffer) Ok(buffer)
} }
// For a critical logger error. This doesn't append to the logfile.
pub fn logger_error(&self, error_message: &str) { pub fn logger_error(&self, error_message: &str) {
let l = log("ERROR", error_message); let l = log("ERROR", error_message);
println!("{}", l.clone().color(Color::LightRed)); println!("{}", l.clone().color(Color::LightRed));

View File

@ -3,9 +3,7 @@
#[macro_use] #[macro_use]
extern crate lazy_static; extern crate lazy_static;
extern crate ozelot;
extern crate serde; extern crate serde;
extern crate toml;
pub mod logger; pub mod logger;
pub mod mctypes; pub mod mctypes;
pub mod net; pub mod net;
@ -24,11 +22,11 @@ fn main() {
log.info("Network thread started"); log.info("Network thread started");
net::start_listening(); net::start_listening();
}); });
// Loop the main thread for now. // Loop the main thread for now.
loop {} loop {}
} }
// Not in it's own config module because of name conflicts.
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct Config { pub struct Config {
pub port: u16, pub port: u16,

View File

@ -1,6 +1,13 @@
// mctypes.rs
// author: Garen Tyler
// description:
// A recreation of all the types necessary in the protocol.
// Directly taken from https://wiki.vg/Protocol#Data_types.
use std::io::prelude::*; use std::io::prelude::*;
use std::net::TcpStream; use std::net::TcpStream;
// Helper functions.
pub fn read_byte(t: &mut TcpStream) -> std::io::Result<u8> { pub fn read_byte(t: &mut TcpStream) -> std::io::Result<u8> {
let mut buffer = [0u8; 1]; let mut buffer = [0u8; 1];
t.read_exact(&mut buffer)?; t.read_exact(&mut buffer)?;
@ -25,6 +32,7 @@ pub fn get_bytes(v: Vec<u8>, l: usize) -> Box<[u8]> {
} }
a.into_boxed_slice() a.into_boxed_slice()
} }
// Makes returning errors shorter.
pub fn io_error(s: &str) -> std::io::Error { pub fn io_error(s: &str) -> std::io::Error {
use std::io::{Error, ErrorKind}; use std::io::{Error, ErrorKind};
Error::new(ErrorKind::Other, s) Error::new(ErrorKind::Other, s)

View File

@ -1,3 +1,8 @@
// net.rs
// author: Garen Tyler
// description:
// The module with everything to do with networkng.
use crate::{config, log}; use crate::{config, log};
use std::net::{TcpListener, TcpStream}; use std::net::{TcpListener, TcpStream};
@ -62,7 +67,7 @@ fn handle_client(t: TcpStream) -> std::io::Result<()> {
"protocol": 578 "protocol": 578
}, },
"players": { "players": {
"max": 2147483647, "max": 420,
"online": 69, "online": 69,
"sample": [ "sample": [
{ {

View File

@ -1,3 +1,8 @@
// old_net.rs
// author: Garen Tyler
// description:
// This was the original implementation of net.rs. Only use as a reference.
pub static SERVER_LISTENER_ADDRESS: &str = "127.0.0.1:25565"; pub static SERVER_LISTENER_ADDRESS: &str = "127.0.0.1:25565";
pub static SOCKET_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(5); pub static SOCKET_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(5);
extern crate serde; extern crate serde;

View File

@ -1,3 +1,9 @@
// protocol.rs
// author: Garen Tyler
// description:
// This module contains all the packet structs.
// Not all of them are implemented, and new ones will be added as necessary.
use crate::mctypes::*; use crate::mctypes::*;
use std::net::TcpStream; use std::net::TcpStream;