ddnet/src/engine/server/server.h
H-M-H 1314085928 restructured sqlconnection
reading from and writing to several different servers is now possible
TODO:
-handle Exceptions properly (try another sqlserver)
-if everything fails while writing write the insert to a file
2016-02-20 15:33:35 +01:00

323 lines
8.6 KiB
C++

/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
#ifndef ENGINE_SERVER_SERVER_H
#define ENGINE_SERVER_SERVER_H
#include <engine/server.h>
#include <engine/map.h>
#include <engine/shared/demo.h>
#include <engine/shared/protocol.h>
#include <engine/shared/snapshot.h>
#include <engine/shared/network.h>
#include <engine/server/register.h>
#include <engine/shared/console.h>
#include <base/math.h>
#include <engine/shared/mapchecker.h>
#include <engine/shared/econ.h>
#include <engine/shared/netban.h>
#if defined (CONF_SQL)
#include "sql_connector.h"
#include "sql_server.h"
#endif
class CSnapIDPool
{
enum
{
MAX_IDS = 16*1024,
};
class CID
{
public:
short m_Next;
short m_State; // 0 = free, 1 = alloced, 2 = timed
int m_Timeout;
};
CID m_aIDs[MAX_IDS];
int m_FirstFree;
int m_FirstTimed;
int m_LastTimed;
int m_Usage;
int m_InUsage;
public:
CSnapIDPool();
void Reset();
void RemoveFirstTimeout();
int NewID();
void TimeoutIDs();
void FreeID(int ID);
};
class CServerBan : public CNetBan
{
class CServer *m_pServer;
template<class T> int BanExt(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason);
public:
class CServer *Server() const { return m_pServer; }
void InitServerBan(class IConsole *pConsole, class IStorage *pStorage, class CServer* pServer);
virtual int BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason);
virtual int BanRange(const CNetRange *pRange, int Seconds, const char *pReason);
static void ConBanExt(class IConsole::IResult *pResult, void *pUser);
};
class CServer : public IServer
{
class IGameServer *m_pGameServer;
class IConsole *m_pConsole;
class IStorage *m_pStorage;
#if defined (CONF_SQL)
CSqlServer* m_apSqlReadServers[MAX_SQLSERVERS];
CSqlServer* m_apSqlWriteServers[MAX_SQLSERVERS];;
#endif
public:
class IGameServer *GameServer() { return m_pGameServer; }
class IConsole *Console() { return m_pConsole; }
class IStorage *Storage() { return m_pStorage; }
enum
{
AUTHED_NO=0,
AUTHED_HELPER,
AUTHED_MOD,
AUTHED_ADMIN,
MAX_RCONCMD_SEND=16,
};
class CClient
{
public:
enum
{
STATE_EMPTY = 0,
STATE_AUTH,
STATE_CONNECTING,
STATE_READY,
STATE_INGAME,
SNAPRATE_INIT=0,
SNAPRATE_FULL,
SNAPRATE_RECOVER
};
class CInput
{
public:
int m_aData[MAX_INPUT_SIZE];
int m_GameTick; // the tick that was chosen for the input
};
// connection state info
int m_State;
int m_Latency;
int m_SnapRate;
float m_Traffic;
int64 m_TrafficSince;
int m_LastAckedSnapshot;
int m_LastInputTick;
CSnapshotStorage m_Snapshots;
CInput m_LatestInput;
CInput m_aInputs[200]; // TODO: handle input better
int m_CurrentInput;
char m_aName[MAX_NAME_LENGTH];
char m_aClan[MAX_CLAN_LENGTH];
int m_Country;
int m_Score;
int m_Authed;
int m_LastAuthed;
int m_AuthTries;
const IConsole::CCommandInfo *m_pRconCmdToSend;
void Reset();
// DDRace
NETADDR m_Addr;
};
CClient m_aClients[MAX_CLIENTS];
int IdMap[MAX_CLIENTS * VANILLA_MAX_CLIENTS];
CSnapshotDelta m_SnapshotDelta;
CSnapshotBuilder m_SnapshotBuilder;
CSnapIDPool m_IDPool;
CNetServer m_NetServer;
CEcon m_Econ;
CServerBan m_ServerBan;
IEngineMap *m_pMap;
int64 m_GameStartTime;
//int m_CurrentGameTick;
int m_RunServer;
int m_MapReload;
bool m_ReloadedWhenEmpty;
int m_RconClientID;
int m_RconAuthLevel;
int m_PrintCBIndex;
int64 m_Lastheartbeat;
//static NETADDR4 master_server;
char m_aCurrentMap[64];
unsigned m_CurrentMapCrc;
unsigned char *m_pCurrentMapData;
unsigned int m_CurrentMapSize;
int m_GeneratedRconPassword;
CDemoRecorder m_aDemoRecorder[MAX_CLIENTS+1];
CRegister m_Register;
CMapChecker m_MapChecker;
int m_RconRestrict;
bool m_ServerInfoHighLoad;
int64 m_ServerInfoFirstRequest;
int m_ServerInfoNumRequests;
CServer();
int TrySetClientName(int ClientID, const char *pName);
virtual void SetClientName(int ClientID, const char *pName);
virtual void SetClientClan(int ClientID, char const *pClan);
virtual void SetClientCountry(int ClientID, int Country);
virtual void SetClientScore(int ClientID, int Score);
void Kick(int ClientID, const char *pReason);
void DemoRecorder_HandleAutoStart();
bool DemoRecorder_IsRecording();
//int Tick()
int64 TickStartTime(int Tick);
//int TickSpeed()
int Init();
void InitRconPasswordIfEmpty();
void SetRconCID(int ClientID);
bool IsAuthed(int ClientID);
int GetClientInfo(int ClientID, CClientInfo *pInfo);
void GetClientAddr(int ClientID, char *pAddrStr, int Size);
const char *ClientName(int ClientID);
const char *ClientClan(int ClientID);
int ClientCountry(int ClientID);
bool ClientIngame(int ClientID);
int MaxClients() const;
virtual int SendMsg(CMsgPacker *pMsg, int Flags, int ClientID);
int SendMsgEx(CMsgPacker *pMsg, int Flags, int ClientID, bool System);
void DoSnapshot();
static int NewClientCallback(int ClientID, void *pUser);
static int NewClientNoAuthCallback(int ClientID, bool Reset, void *pUser);
static int DelClientCallback(int ClientID, const char *pReason, void *pUser);
static int ClientRejoinCallback(int ClientID, void *pUser);
void SendMap(int ClientID);
void SendConnectionReady(int ClientID);
void SendRconLine(int ClientID, const char *pLine);
static void SendRconLineAuthed(const char *pLine, void *pUser, bool Highlighted = false);
void SendRconCmdAdd(const IConsole::CCommandInfo *pCommandInfo, int ClientID);
void SendRconCmdRem(const IConsole::CCommandInfo *pCommandInfo, int ClientID);
void UpdateClientRconCommands();
void ProcessClientPacket(CNetChunk *pPacket);
void SendServerInfoConnless(const NETADDR *pAddr, int Token, bool Extended);
void SendServerInfo(const NETADDR *pAddr, int Token, bool Extended=false, int Offset=0, bool Short=false);
void UpdateServerInfo();
void PumpNetwork();
char *GetMapName();
int LoadMap(const char *pMapName);
void SaveDemo(int ClientID, float Time);
void StartRecord(int ClientID);
void StopRecord(int ClientID);
bool IsRecording(int ClientID);
void InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, IConsole *pConsole);
int Run();
static void ConTestingCommands(IConsole::IResult *pResult, void *pUser);
static void ConRescue(IConsole::IResult *pResult, void *pUser);
static void ConKick(IConsole::IResult *pResult, void *pUser);
static void ConStatus(IConsole::IResult *pResult, void *pUser);
static void ConShutdown(IConsole::IResult *pResult, void *pUser);
static void ConRecord(IConsole::IResult *pResult, void *pUser);
static void ConStopRecord(IConsole::IResult *pResult, void *pUser);
static void ConMapReload(IConsole::IResult *pResult, void *pUser);
static void ConLogout(IConsole::IResult *pResult, void *pUser);
#if defined (CONF_SQL)
// console commands for sqlmasters
static void ConAddSqlServer(IConsole::IResult *pResult, void *pUserData);
static void ConDumpSqlServers(IConsole::IResult *pResult, void *pUserData);
static void CreateTablesThread(void *pData);
#endif
static void ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
static void ConchainMaxclientsperipUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
static void ConchainCommandAccessUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
static void ConchainConsoleOutputLevelUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
void LogoutByAuthLevel(int AuthLevel);
static void ConchainRconPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
static void ConchainRconModPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
static void ConchainRconHelperPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
void RegisterCommands();
virtual int SnapNewID();
virtual void SnapFreeID(int ID);
virtual void *SnapNewItem(int Type, int ID, int Size);
void SnapSetStaticsize(int ItemType, int Size);
// DDRace
void GetClientAddr(int ClientID, NETADDR *pAddr);
int m_aPrevStates[MAX_CLIENTS];
char *GetAnnouncementLine(char const *FileName);
unsigned m_AnnouncementLastLine;
void RestrictRconOutput(int ClientID) { m_RconRestrict = ClientID; }
virtual int* GetIdMap(int ClientID);
};
#endif