/* * This file is part of laurelin/server * Copyright (C) 2023 Jonni Liljamo * * Licensed under GPL-3.0-only. * See LICENSE for licensing information. */ use bevy_ecs::{ event::EventReader, system::{Res, ResMut}, }; use bevy_log::info; use laurelin_shared::{ api::user::{login, register, ResponseLogin, ResponseRegister}, server::{ channels::AfterAuthChannel, messages::{AfterAuth, Auth}, }, }; use naia_bevy_server::{ events::{AuthEvents, ConnectEvent, DisconnectEvent, ErrorEvent, TickEvent}, Server, }; use crate::{Config, Global, RuntimeTemp}; mod message; pub(crate) use message::message_events; pub(crate) fn auth_events( mut ev: EventReader, mut server: Server, config: Res, mut temp: ResMut, ) { for events in ev.iter() { for (user_key, auth) in events.read::() { // TODO: accept a third type of authentication: existing session // the client passes a cookie that it had stored, // and we verify it with the api, returning the very same aa details. match auth.username { Some(username) => { // register let wrapped = register(&config.api_address, &username, &auth.email, &auth.password); match wrapped.response { ResponseRegister::Error(_) => server.reject_connection(&user_key), ResponseRegister::Ok(user) => { server.accept_connection(&user_key); temp.afterauth_details .insert(user_key, (user, wrapped.cookie)); } } } None => { // login let wrapped = login(&config.api_address, &auth.email, &auth.password); match wrapped.response { ResponseLogin::Error(_) => server.reject_connection(&user_key), ResponseLogin::Ok(user) => { server.accept_connection(&user_key); temp.afterauth_details .insert(user_key, (user, wrapped.cookie)); } } } } } } } pub(crate) fn connect_events( mut ev: EventReader, mut server: Server, mut temp: ResMut, mut global: ResMut, ) { for ConnectEvent(user_key) in ev.iter() { let address = server.user(user_key).address(); info!("Naia Server connected to: {:?}", address); // TODO: handle let aa_details = temp.afterauth_details.get(user_key).unwrap(); server.send_message::( &user_key, &AfterAuth { id: aa_details.0.id.to_string().clone(), username: aa_details.0.username.clone(), cookie: aa_details.1.clone(), }, ); global .user_to_session_map .insert(*user_key, aa_details.1.clone()); temp.afterauth_details.remove(&user_key); } } pub(crate) fn disconnect_events(mut ev: EventReader, mut global: ResMut) { for DisconnectEvent(user_key, user) in ev.iter() { info!("Naia Server disconnected from: {:?}", user.address); global.user_to_session_map.remove(user_key); } } pub(crate) fn error_events(mut ev: EventReader) { for ErrorEvent(error) in ev.iter() { info!("Naia Server Error: {:?}", error); } } pub(crate) fn tick_events(mut ev: EventReader, mut server: Server) { let mut has_ticked = false; for TickEvent(server_tick) in ev.iter() { has_ticked = true; // Handle messages coming from clients let mut _messages = server.receive_tick_buffer_messages(server_tick); } if has_ticked { // Update scopes of entities // Not sure if this will come into play, // but see naia/demos/bevy/server/src/systems/events.rs::tick_events //for (_, user_key, entity) in server.scope_checks() { // ... //} } }