123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #include <iostream>
- #include <cstring>
- #include <poll.h>
- #include <readline/readline.h>
- #include <readline/history.h>
- #include <unistd.h>
- #include "server/GameServer.h"
- #include "server/network/Server.h"
- GameServer::GameServer()
- {
- rl_bind_key ('\t', rl_insert);
-
- static GameServer* pointer = this;
- rl_event_hook = []()
- {
- if(!pointer->serverCommands.isRunning())
- {
- rl_stuff_char('\n');
- }
- return 0;
- };
- }
- void GameServer::start(uint16_t port, uint16_t maxClients)
- {
- std::cout << port << std::endl;
- Server server(port, maxClients, *this);
- if(!server.isRunning())
- {
- return;
- }
-
- auto lastTime = std::chrono::steady_clock::now().time_since_epoch();
- auto lag = lastTime.zero();
-
- std::thread commandThread = std::thread(&GameServer::readFromConsole, this);
-
- while(serverCommands.isRunning())
- {
- auto time = std::chrono::steady_clock::now().time_since_epoch();
- lag += time - lastTime;
- lastTime = time;
- while(lag >= NANOS_PER_TICK)
- {
- lag -= NANOS_PER_TICK;
- tick();
- }
-
- auto waitTime = NANOS_PER_TICK - lag - MIN_NANO_SLEEP;
- if(waitTime > MIN_NANO_SLEEP)
- {
- std::this_thread::sleep_for(waitTime);
- }
- }
-
- commandThread.join();
- }
- void GameServer::onFullServerClientConnect(int socket) const
- {
- Stream answer;
- answer.write("Sorry, the server is full");
- answer.sendToSocket(socket);
- }
- void GameServer::onClientConnect(int socket) const
- {
- std::cout << socket << " has connected" << std::endl;
-
- Stream answer;
- answer.write("Welcome to the server.");
- answer.sendToSocket(socket);
- }
- void GameServer::onClientPackage(int socket, Stream& in) const
- {
- std::string s = "";
- while(in.hasData())
- {
- char c;
- in.read(&c, 1);
- s = c + s;
- }
- Stream answer;
- answer.write(s.data(), s.length());
- answer.sendToSocket(socket);
- }
- void GameServer::onClientDisconnect(int socket) const
- {
- std::cout << socket << " has disconnected" << std::endl;
-
- Stream answer;
- answer.write("Bye.");
- answer.sendToSocket(socket);
- }
- void GameServer::tick()
- {
- rl_clear_visible_line();
- handleCommandQueue();
- std::cout << "tick\n";
- rl_forced_update_display();
- }
- void GameServer::readFromConsole()
- {
- while(serverCommands.isRunning())
- {
- char* test = readline("> ");
- std::string command(test);
- if(command.size() != 0)
- {
- add_history(test);
- std::lock_guard<std::mutex> lg(comandQueueMutex);
- commandQueue.push_back(command);
- }
- free(test);
- }
- }
- void GameServer::handleCommandQueue()
- {
- std::lock_guard<std::mutex> lg(comandQueueMutex);
- for(std::string& s : commandQueue)
- {
- commandManager.execute(serverCommands, s);
- }
- commandQueue.clear();
- }
|