#![feature(if_let_guard)] use log::{debug, trace}; use spacetimedb::{ReducerContext, Table, reducer}; mod reducers; mod tables; use crate::tables::*; #[reducer(client_connected)] pub fn connect(ctx: &ReducerContext) -> Result<(), String> { let player = if let Some(player) = ctx.db.logged_out_user().identity().find(ctx.sender()) { let player = ctx.db.user().insert(player); ctx.db.logged_out_user().identity().delete(ctx.sender()); player } else { debug!("inserting new user with identity {:?}", ctx.sender()); ctx.db.user().try_insert(User { identity: ctx.sender(), name: String::new(), config_id: 0, lobby_id: 0, })? }; debug!("user connected: {:?}", player); Ok(()) } #[reducer(client_disconnected)] pub fn disconnect(ctx: &ReducerContext) -> Result<(), String> { let user = ctx .db .user() .identity() .find(ctx.sender()) .ok_or_else(|| format!("can't find player {} to disconnect", ctx.sender()))?; let user = ctx.db.logged_out_user().insert(user); if !ctx.db.user().identity().delete(ctx.sender()) { Err(format!("can't delete user: {user:?}"))? } debug!("user disconnected: {:?}", user); Ok(()) } // #[reducer(init)] // pub fn init(_ctx: &ReducerContext) { // // Called when the module is initially published // } // #[reducer(client_connected)] // pub fn identity_connected(_ctx: &ReducerContext) { // // Called everytime a new client connects // } // #[reducer] // pub fn add(ctx: &ReducerContext, name: String) { // ctx.db.player().insert(Player { name }); // } // #[reducer] // pub fn say_hello(ctx: &ReducerContext) { // for person in ctx.db.person().iter() { // log::info!("Hello, {}!", person.name); // } // log::info!("Hello, World!"); // } // #[reducer] // pub fn set_name(ctx: &ReducerContext, name: String) -> Result<(), String> { // if name.is_empty() { // return Err("names must not be empty".into()); // } // if let Some(player) = ctx.db.player().identity().find(ctx.sender()) { // ctx.db.player().identity().update(Player { // name: Some(name), // ..player // }); // Ok(()) // } else { // Err("cannot set name for unknown user".into()) // } // }