git repos / oastat_static_web_generator

src/oastat_static_web_generator.cpp

raw · blame · history

#include <iostream>
#include <boost/program_options.hpp>
#include <cppdb/frontend.h>
#include "command_arguments.hpp"
#include "pages/pages.hpp"
#include "common/common.hpp"

#ifndef VERSIONNUMBER
#define VERSIONNUMBER "0.1.0"
#endif

CommandArguments cmdargs;

const char* const SAGO_CONNECTION_STRING = "SAGO_CONNECTION_STRING";


static void create_dir_recursive(const std::string& path) {
	std::string command = std::string("mkdir -p \"")+path+"\"";
	int ret = std::system(command.c_str());
	if (ret != 0) {
		std::cerr << "Failed to create: " << path << "\n";
	}
}

static void copy_static_files(const std::string& source, const std::string& destination) {
	std::string command = "cp -r \""+source+"\"/* \""+destination+"/\"";
	int ret = std::system(command.c_str());
	if (ret != 0) {
		std::cerr << "copy with: " << command << "\n";
	}
}

class PrintStartEndTimer {
	std::string name;
	public:
	explicit PrintStartEndTimer(const std::string& name) {
		this->name = name;
		std::time_t t = std::time(0);
		std::tm* now = std::localtime(&t);
		std::cerr << "start_" << name << ": " << getTimeStamp(*now) << "\n";
	}

	~PrintStartEndTimer() {
		std::time_t t = std::time(0);
		std::tm* now = std::localtime(&t);
		std::cerr << "end_" << name << ": " << getTimeStamp(*now) << "\n";
	}

};


void write_files(cppdb::session& database) {
	PrintStartEndTimer t("write_files");
	write_html_index(database, cmdargs.output_dir);
	// Generate map pages
	std::vector<std::string> map_list = get_most_played_maps(database);
	for (const std::string& mapname : map_list) {
		write_html_map(database, mapname, cmdargs.output_dir);
	}
	// Generate recent game pages (called from index generation now, but ensuring all are written)
	std::vector<OastatGame> games;
	getRecentGames(database, games);
	for (const OastatGame& game : games) {
		write_html_game(database, game, cmdargs.output_dir);
	}
}




void write_current_time(cppdb::session& database) {
	cppdb::statement st = database.prepare("SELECT now()");
	cppdb::result res = st.query();
	if(res.next()) {
		std::string value;
		res >> value;
		std::cout << value << "\n";
	}
}

int main(int argc, const char* argv[]) {
	boost::program_options::options_description desc("Options");
	desc.add_options()
	("version", "Print version information and quit")
	("help,h", "Print basic usage information to stdout and quit")
	("output-dir", boost::program_options::value<std::string>(), "The directory to write the output to.")
	;
	boost::program_options::variables_map vm;
	boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);
	boost::program_options::notify(vm);
	if (vm.count("help")) {
		std::cout << desc << "\n";
		std::cout << "\n" << "Connection details are read from the environemtn variable \"" << SAGO_CONNECTION_STRING << "\". ";
		std::cout << "The string must be in CppDb format. \n";
		std::cout << "Like: \"export " << SAGO_CONNECTION_STRING << "=mysql:database=oastat;username=openarena\"\n";
		return 0;
	}
	if (vm.count("version")) {
		std::cout << "oastat_static_web_generator " << VERSIONNUMBER << "\n";
		return 0;
	}
	if (vm.count("output-dir")) {
		cmdargs.output_dir = vm["output-dir"].as<std::string>();
	}
	const char* connectstring_env = getenv(SAGO_CONNECTION_STRING);
	if (connectstring_env) {
		cmdargs.connectstring = connectstring_env;
	}
	cppdb::session database(cmdargs.connectstring);
	write_current_time(database);
	create_dir_recursive(cmdargs.output_dir+"/static");
	create_dir_recursive(cmdargs.output_dir+"/game");
	create_dir_recursive(cmdargs.output_dir+"/map");
	copy_static_files("static_content", cmdargs.output_dir+"/static");
	write_files(database);
	return 0;
}