let regularly_call_fun f v = let () = Sys.set_signal Sys.sigalrm (Sys.Signal_handle (fun _ -> f ())) in let (_ : Unix.interval_timer_status) = Unix.setitimer Unix.ITIMER_REAL { Unix.it_interval = v; Unix.it_value = v } in () let update_offline_user_state () = (* TODO *) () let update_online_user_state () = Hashtbl.filter_map_inplace (fun _user_id state -> Some (Shared.State.auto_update state)) User.state_ht let to_repeat () = update_online_user_state (); update_offline_user_state () let () = regularly_call_fun to_repeat (Shared.Time.s_to_float Shared.State.auto_update_rate) let () = let logger = if App.log then Dream.logger else Fun.id in Dream.run ~port:App.port @@ logger @@ Dream.sql_pool Db.db_uri @@ Dream.sql_sessions ~lifetime:3600. @@ Dream.router Dream. [ get "/assets/**" Asset.get ; get "/" Home.get ; get "/island" Island.get ; get "/island/ws" (fun request -> Dream.websocket @@ Ws.handle_client request ) ; get "/login" Login.get ; post "/login" Login.post ; get "logout" Logout.get ; get "/register" Register.get ; post "/register" Register.post ]