#![feature(if_let_guard)] use log::debug; use spacetimedb::{ReducerContext, Table, reducer}; use crate::tables::*; mod reducers; mod tables; #[reducer] pub fn clear_all(ctx: &ReducerContext) { for row in ctx.db.player().iter() { ctx.db.player().delete(row); } for row in ctx.db.lobby().iter() { ctx.db.lobby().delete(row); } for row in ctx.db.bot().iter() { ctx.db.bot().delete(row); } for row in ctx.db.wall().iter() { ctx.db.wall().delete(row); } for row in ctx.db.tile().iter() { ctx.db.tile().delete(row); } } #[reducer(client_connected)] pub fn connect(ctx: &ReducerContext) -> Result<(), String> { let player = if let Some(player) = ctx.db.logged_out_player().identity().find(ctx.sender) { let player = ctx.db.player().insert(player); ctx.db.logged_out_player().identity().delete(ctx.sender); player } else { ctx.db.player().try_insert(Player { identity: ctx.sender, id: 0, name: None, lobby_id: 0, ready: false, sort: true, })? }; debug!("player connected: {:?}", player); Ok(()) } #[reducer(client_disconnected)] pub fn disconnect(ctx: &ReducerContext) -> Result<(), String> { let player = ctx .db .player() .identity() .find(ctx.sender) .ok_or_else(|| format!("can't find player {}", ctx.sender))?; ctx.db.logged_out_player().insert(player); ctx.db.player().identity().delete(ctx.sender); 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()) // } // }