1#include <drogon/HttpAppFramework.h>
2#include <boost/algorithm/string/join.hpp>
3#include <boost/program_options.hpp>
4#include <boost/range/adaptor/transformed.hpp>
5#include "controllers/games_controller.h"
6#include "controllers/rooms_controller.h"
7#include "controllers/sessions_controller.h"
8#include "controllers/state_controller.h"
9#include "controllers/statistics_controller.h"
10#include "model/games/games_storage.h"
11#include "model/logic/game_logic_manager.h"
12#include "model/rooms/rooms_storage.h"
13#include "model/sessions/sessions_storage.h"
14#include "model/statistics/statistics_manager.h"
16namespace cavoke::server {
17void run(
const model::GamesStorageConfig &games_storage_config) {
21 std::cout <<
"Initialize models..." << std::endl;
23 std::make_shared<model::GamesStorage>(games_storage_config);
24 auto game_logic_manager =
25 std::make_shared<model::GameLogicManager>(games_storage);
26 auto game_state_storage = std::make_shared<model::GameStateStorage>();
27 auto sessions_storage = std::make_shared<model::SessionsStorage>(
28 game_logic_manager, games_storage, game_state_storage);
29 auto statistics_manager = std::make_shared<model::StatisticsManager>(
30 sessions_storage, games_storage);
32 std::make_shared<model::RoomsStorage>(sessions_storage);
35 std::cout <<
"Initialize controllers..." << std::endl;
36 auto games_controller =
37 std::make_shared<controllers::GamesController>(games_storage);
38 auto state_controller = std::make_shared<controllers::StateController>(
39 games_storage, game_logic_manager, game_state_storage,
41 auto sessions_controller =
42 std::make_shared<controllers::SessionsController>(
43 games_storage, game_logic_manager, game_state_storage,
45 auto statistics_controller =
46 std::make_shared<controllers::StatisticsController>(games_storage,
48 auto rooms_controller = std::make_shared<controllers::RoomsController>(
49 rooms_storage, games_storage, sessions_storage);
51 auto &app = drogon::app();
54 app.registerController(games_controller);
55 app.registerController(state_controller);
56 app.registerController(sessions_controller);
57 app.registerController(statistics_controller);
58 app.registerController(rooms_controller);
61 app.registerBeginningAdvice([]() {
62 auto dbclient = drogon::app().getDbClient();
63 dbclient->connectionInfo();
64 std::cout <<
"Database connection: "
65 << (dbclient ==
nullptr
67 : hide_password(dbclient->connectionInfo()))
70 auto listeners = drogon::app().getListeners();
75 listeners | boost::adaptors::transformed(
76 [](
const trantor::InetAddress &e) {
80 std::cout <<
"Listening at " << ips <<
"... " << std::endl;
84 auto corsValue = nlohmann::to_nlohmann(drogon::app().getCustomConfig())
86 app.registerPostHandlingAdvice(
87 [corsValue](
const drogon::HttpRequestPtr &req,
88 const drogon::HttpResponsePtr &resp) {
90 resp->addHeader(
"Access-Control-Allow-Origin", corsValue);
98namespace po = boost::program_options;
100int main(
int argc,
char *argv[]) {
101 po::options_description desc(
"Allowed options");
102 auto add_desc_options = desc.add_options();
103 add_desc_options(
"help,h",
"Print help");
104 add_desc_options(
"config-file,c", po::value<std::string>(),
105 "File with game storage configuration");
106 add_desc_options(
"port,p", po::value<uint16_t>()->default_value(8080),
107 "TCP/IP port number for connection");
109 po::variables_map vm;
110 po::store(po::parse_command_line(argc, argv, desc), vm);
113 if (vm.count(
"help")) {
114 std::cout << desc <<
"\n";
119 if (vm.count(
"config-file")) {
122 std::string file = vm[
"config-file"].as<std::string>();
123 drogon::app().loadConfigFile(file);
124 games_storage_config =
125 nlohmann::to_nlohmann(drogon::app().getCustomConfig())
128 std::cout <<
"Server configuration loaded from: '" << file <<
"'\n";
129 }
catch (
const std::exception &err) {
131 <<
"Failed to load games storage configuration from file: "
132 << err.what() <<
'\n';
138 <<
"No server configuration file specified. Using a default "
139 "one.\nWARNING: No database requests will succeed.\nPlease use "
140 "`-c` option to specify config file.\n";
142 games_storage_config = {
"../../local_server/games",
"logic",
143 "client.zip",
"config.json"};
146 if (vm.count(
"port")) {
147 uint16_t port = vm.at(
"port").as<uint16_t>();
148 drogon::app().addListener(
"0.0.0.0", port);
151 cavoke::server::run(games_storage_config);