mirror of
https://github.com/BeamMP/BeamMP-Server.git
synced 2025-07-01 23:35:41 +00:00
server input
This commit is contained in:
parent
71a84b4f1b
commit
3bdc75b0c0
@ -1,8 +1,9 @@
|
|||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.10)
|
||||||
project(Server)
|
project(Server)
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
|
||||||
file(GLOB source_files "src/*.cpp" "src/*/*.cpp" "include/*.h" "include/*/*.h" "include/*.hpp" "include/*/*.hpp")
|
file(GLOB source_files "src/*.cpp" "src/*/*.cpp" "include/*.h" "include/*/*.h" "include/*.hpp" "include/*/*.hpp")
|
||||||
add_executable(${PROJECT_NAME} ${source_files})
|
add_executable(${PROJECT_NAME} ${source_files})
|
||||||
target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
|
target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
|
||||||
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "BeamMP-Server")
|
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "BeamMP-Server")
|
||||||
target_link_libraries(${PROJECT_NAME} libcurl_a urlmon ws2_32 lua53 zlibstatic)
|
target_link_libraries(${PROJECT_NAME} libcurl_a urlmon ws2_32 lua53 zlibstatic)
|
@ -5,6 +5,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
void InitLog();
|
void InitLog();
|
||||||
|
void ConsoleOut(const std::string& msg);
|
||||||
void except(const std::string& toPrint);
|
void except(const std::string& toPrint);
|
||||||
void debug(const std::string& toPrint);
|
void debug(const std::string& toPrint);
|
||||||
void error(const std::string& toPrint);
|
void error(const std::string& toPrint);
|
||||||
|
@ -49,11 +49,13 @@ public:
|
|||||||
void SetLastWrite(fs::file_time_type time);
|
void SetLastWrite(fs::file_time_type time);
|
||||||
bool IsRegistered(const std::string&Event);
|
bool IsRegistered(const std::string&Event);
|
||||||
void SetPluginName(const std::string&Name);
|
void SetPluginName(const std::string&Name);
|
||||||
|
void Execute(const std::string& Command);
|
||||||
void SetFileName(const std::string&Name);
|
void SetFileName(const std::string&Name);
|
||||||
fs::file_time_type GetLastWrite();
|
fs::file_time_type GetLastWrite();
|
||||||
std::string GetPluginName();
|
std::string GetPluginName();
|
||||||
std::string GetFileName();
|
std::string GetFileName();
|
||||||
bool StopThread = false;
|
bool StopThread = false;
|
||||||
|
bool Console = false;
|
||||||
lua_State* GetState();
|
lua_State* GetState();
|
||||||
char* GetOrigin();
|
char* GetOrigin();
|
||||||
std::mutex Lock;
|
std::mutex Lock;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
///
|
///
|
||||||
#pragma once
|
#pragma once
|
||||||
void InitServer(int argc, char* argv[]);
|
void InitServer(int argc, char* argv[]);
|
||||||
|
void ConsoleInit();
|
||||||
void InitConfig();
|
void InitConfig();
|
||||||
void InitLua();
|
void InitLua();
|
||||||
void InitRes();
|
void InitRes();
|
||||||
|
93
src/Console.cpp
Normal file
93
src/Console.cpp
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
///
|
||||||
|
/// Created by Anonymous275 on 10/29/2020
|
||||||
|
///
|
||||||
|
|
||||||
|
#include "Lua/LuaSystem.hpp"
|
||||||
|
#include <windows.h>
|
||||||
|
#include "Logger.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <conio.h>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
std::vector<std::string> QConsoleOut;
|
||||||
|
std::string CInputBuff;
|
||||||
|
std::mutex MLock;
|
||||||
|
Lua* LuaConsole;
|
||||||
|
void HandleInput(const std::string& cmd){
|
||||||
|
if (cmd == "exit") {
|
||||||
|
exit(0);
|
||||||
|
}else LuaConsole->Execute(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessOut(){
|
||||||
|
static size_t len = 2;
|
||||||
|
if(QConsoleOut.empty() && len == CInputBuff.length())return;
|
||||||
|
printf("%c[2K\r", 27);
|
||||||
|
for(const std::string& msg : QConsoleOut)
|
||||||
|
if(!msg.empty())std::cout << msg;
|
||||||
|
MLock.lock();
|
||||||
|
QConsoleOut.clear();
|
||||||
|
MLock.unlock();
|
||||||
|
std::cout << "> " << CInputBuff;
|
||||||
|
len = CInputBuff.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleOut(const std::string& msg){
|
||||||
|
MLock.lock();
|
||||||
|
QConsoleOut.emplace_back(msg);
|
||||||
|
MLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[noreturn]] void OutputRefresh(){
|
||||||
|
while(true){
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||||
|
ProcessOut();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void SetupConsole(){
|
||||||
|
DWORD outMode = 0;
|
||||||
|
HANDLE stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
if (stdoutHandle == INVALID_HANDLE_VALUE){
|
||||||
|
error("Invalid handle");
|
||||||
|
std::this_thread::sleep_for(std::chrono::seconds(3));
|
||||||
|
exit(GetLastError());
|
||||||
|
}
|
||||||
|
if (!GetConsoleMode(stdoutHandle, &outMode)){
|
||||||
|
error("Invalid console mode");
|
||||||
|
std::this_thread::sleep_for(std::chrono::seconds(3));
|
||||||
|
exit(GetLastError());
|
||||||
|
}
|
||||||
|
// Enable ANSI escape codes
|
||||||
|
outMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
|
||||||
|
if (!SetConsoleMode(stdoutHandle, outMode)) {
|
||||||
|
error("failed to set console mode");
|
||||||
|
std::this_thread::sleep_for(std::chrono::seconds(3));
|
||||||
|
exit(GetLastError());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[[noreturn]] void ReadCin(){
|
||||||
|
while (true){
|
||||||
|
int In = _getch();
|
||||||
|
if (In == 13) {
|
||||||
|
if(!CInputBuff.empty()) {
|
||||||
|
HandleInput(CInputBuff);
|
||||||
|
CInputBuff.clear();
|
||||||
|
}
|
||||||
|
}else if(In == 8){
|
||||||
|
if(!CInputBuff.empty())CInputBuff.pop_back();
|
||||||
|
}else CInputBuff += char(In);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void ConsoleInit(){
|
||||||
|
SetupConsole();
|
||||||
|
LuaConsole = new Lua();
|
||||||
|
LuaConsole->Console = true;
|
||||||
|
LuaConsole->Init();
|
||||||
|
printf("> ");
|
||||||
|
std::thread In(ReadCin);
|
||||||
|
In.detach();
|
||||||
|
std::thread Out(OutputRefresh);
|
||||||
|
Out.detach();
|
||||||
|
}
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
std::string CustomIP;
|
std::string CustomIP;
|
||||||
std::string GetSVer(){
|
std::string GetSVer(){
|
||||||
static std::string r = Sec("0.63.5");
|
static std::string r = Sec("0.64");
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
std::string GetCVer(){
|
std::string GetCVer(){
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "Lua/LuaSystem.hpp"
|
#include "Lua/LuaSystem.hpp"
|
||||||
#include "Security/Enc.h"
|
#include "Security/Enc.h"
|
||||||
#include "Client.hpp"
|
#include "Client.hpp"
|
||||||
|
#include "Settings.h"
|
||||||
#include "Network.h"
|
#include "Network.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -38,7 +39,9 @@ Lua* GetScript(lua_State *L){
|
|||||||
}
|
}
|
||||||
void SendError(lua_State *L,const std::string&msg){
|
void SendError(lua_State *L,const std::string&msg){
|
||||||
Lua* S = GetScript(L);
|
Lua* S = GetScript(L);
|
||||||
std::string a = S->GetFileName().substr(S->GetFileName().find('\\'));
|
std::string a;
|
||||||
|
if(S == nullptr)a = Sec("Console");
|
||||||
|
else a = S->GetFileName().substr(S->GetFileName().find('\\'));
|
||||||
warn(a + Sec(" | Incorrect Call of ") + msg);
|
warn(a + Sec(" | Incorrect Call of ") + msg);
|
||||||
}
|
}
|
||||||
int Trigger(Lua*lua,const std::string& R, LuaArg*arg){
|
int Trigger(Lua*lua,const std::string& R, LuaArg*arg){
|
||||||
@ -76,7 +79,14 @@ int TriggerLuaEvent(const std::string& Event,bool local,Lua*Caller,LuaArg* arg,b
|
|||||||
}
|
}
|
||||||
return R;
|
return R;
|
||||||
}
|
}
|
||||||
|
bool ConsoleCheck(lua_State *L, int r){
|
||||||
|
if (r != LUA_OK){
|
||||||
|
std::string msg = lua_tostring(L, -1);
|
||||||
|
warn(Sec("Console | ") + msg);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
bool CheckLua(lua_State *L, int r){
|
bool CheckLua(lua_State *L, int r){
|
||||||
if (r != LUA_OK){
|
if (r != LUA_OK){
|
||||||
std::string msg = lua_tostring(L, -1);
|
std::string msg = lua_tostring(L, -1);
|
||||||
@ -348,9 +358,8 @@ int lua_RemoteEvent(lua_State *L){
|
|||||||
}
|
}
|
||||||
int ID = int(lua_tointeger(L,1));
|
int ID = int(lua_tointeger(L,1));
|
||||||
std::string Packet = "E:" + std::string(lua_tostring(L,2)) + ":" + std::string(lua_tostring(L,3));
|
std::string Packet = "E:" + std::string(lua_tostring(L,2)) + ":" + std::string(lua_tostring(L,3));
|
||||||
if(ID == -1){
|
if(ID == -1)SendToAll(nullptr,Packet,true,true);
|
||||||
SendToAll(nullptr,Packet,true,true);
|
else{
|
||||||
}else{
|
|
||||||
Client *c = GetClient(ID);
|
Client *c = GetClient(ID);
|
||||||
if(c == nullptr){
|
if(c == nullptr){
|
||||||
SendError(L,Sec("TriggerClientEvent invalid Player ID"));
|
SendError(L,Sec("TriggerClientEvent invalid Player ID"));
|
||||||
@ -360,6 +369,91 @@ int lua_RemoteEvent(lua_State *L){
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
int lua_ServerExit(lua_State *L){
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
int lua_Set(lua_State *L){
|
||||||
|
int Args = lua_gettop(L);
|
||||||
|
if(Args != 2){
|
||||||
|
SendError(L,Sec("set invalid argument count expected 2 got ") + std::to_string(Args));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(!lua_isnumber(L,1)){
|
||||||
|
SendError(L,Sec("set invalid argument [1] expected number"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Lua* Src = GetScript(L);
|
||||||
|
std::string Name;
|
||||||
|
if(Src == nullptr)Name = Sec("Console");
|
||||||
|
else Name = Src->GetPluginName();
|
||||||
|
int C = int(lua_tointeger(L,1));
|
||||||
|
switch(C){
|
||||||
|
case 0: //debug
|
||||||
|
if(lua_isboolean(L,2)){
|
||||||
|
Debug = lua_toboolean(L,2);
|
||||||
|
info(Name + Sec(" | Debug -> ") + (Debug?"true":"false"));
|
||||||
|
}
|
||||||
|
else SendError(L,Sec("set invalid argument [2] expected boolean for ID : 0"));
|
||||||
|
break;
|
||||||
|
case 1: //private
|
||||||
|
if(lua_isboolean(L,2)){
|
||||||
|
Private = lua_toboolean(L,2);
|
||||||
|
info(Name + Sec(" | Private -> ") + (Private?"true":"false"));
|
||||||
|
}
|
||||||
|
else SendError(L,Sec("set invalid argument [2] expected boolean for ID : 1"));
|
||||||
|
break;
|
||||||
|
case 2: //max cars
|
||||||
|
if(lua_isnumber(L,2)){
|
||||||
|
MaxCars = int(lua_tointeger(L,2));
|
||||||
|
info(Name + Sec(" | MaxCars -> ") + std::to_string(MaxCars));
|
||||||
|
}
|
||||||
|
else SendError(L,Sec("set invalid argument [2] expected number for ID : 2"));
|
||||||
|
break;
|
||||||
|
case 3: //max players
|
||||||
|
if(lua_isnumber(L,2)){
|
||||||
|
MaxPlayers = int(lua_tointeger(L,2));
|
||||||
|
info(Name + Sec(" | MaxPlayers -> ") + std::to_string(MaxPlayers));
|
||||||
|
}
|
||||||
|
else SendError(L,Sec("set invalid argument [2] expected number for ID : 3"));
|
||||||
|
break;
|
||||||
|
case 4: //Map
|
||||||
|
if(lua_isstring(L,2)){
|
||||||
|
MapName = lua_tostring(L,2);
|
||||||
|
info(Name + Sec(" | MapName -> ") + MapName);
|
||||||
|
}
|
||||||
|
else SendError(L,Sec("set invalid argument [2] expected string for ID : 4"));
|
||||||
|
break;
|
||||||
|
case 5: //Name
|
||||||
|
if(lua_isstring(L,2)){
|
||||||
|
ServerName = lua_tostring(L,2);
|
||||||
|
info(Name + Sec(" | ServerName -> ") + ServerName);
|
||||||
|
}
|
||||||
|
else SendError(L,Sec("set invalid argument [2] expected string for ID : 5"));
|
||||||
|
break;
|
||||||
|
case 6: //Desc
|
||||||
|
if(lua_isstring(L,2)){
|
||||||
|
ServerDesc = lua_tostring(L,2);
|
||||||
|
info(Name + Sec(" | ServerDesc -> ") + ServerDesc);
|
||||||
|
}
|
||||||
|
else SendError(L,Sec("set invalid argument [2] expected string for ID : 6"));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
warn(Sec("Invalid config ID : ") + std::to_string(C));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
extern "C" {
|
||||||
|
int lua_Print(lua_State *L) {
|
||||||
|
int Arg = lua_gettop(L);
|
||||||
|
for (int i = 1; i <= Arg; i++){
|
||||||
|
ConsoleOut(lua_tostring(L, i) + std::string("\n"));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Lua::Init(){
|
void Lua::Init(){
|
||||||
luaL_openlibs(luaState);
|
luaL_openlibs(luaState);
|
||||||
lua_register(luaState,"TriggerGlobalEvent",lua_TriggerEventG);
|
lua_register(luaState,"TriggerGlobalEvent",lua_TriggerEventG);
|
||||||
@ -378,10 +472,17 @@ void Lua::Init(){
|
|||||||
lua_register(luaState,"StopThread",lua_StopThread);
|
lua_register(luaState,"StopThread",lua_StopThread);
|
||||||
lua_register(luaState,"DropPlayer",lua_dropPlayer);
|
lua_register(luaState,"DropPlayer",lua_dropPlayer);
|
||||||
lua_register(luaState,"GetPlayerHWID",lua_HWID);
|
lua_register(luaState,"GetPlayerHWID",lua_HWID);
|
||||||
|
lua_register(luaState,"exit",lua_ServerExit);
|
||||||
lua_register(luaState,"Sleep",lua_Sleep);
|
lua_register(luaState,"Sleep",lua_Sleep);
|
||||||
Reload();
|
lua_register(luaState,"print",lua_Print);
|
||||||
|
lua_register(luaState,"Set",lua_Set);
|
||||||
|
if(!Console)Reload();
|
||||||
|
}
|
||||||
|
void Lua::Execute(const std::string& Command){
|
||||||
|
if(ConsoleCheck(luaState,luaL_dostring(luaState,Command.c_str()))){
|
||||||
|
lua_settop(luaState, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Lua::Reload(){
|
void Lua::Reload(){
|
||||||
if(CheckLua(luaState,luaL_dofile(luaState,FileName.c_str()))){
|
if(CheckLua(luaState,luaL_dofile(luaState,FileName.c_str()))){
|
||||||
CallFunction(this,Sec("onInit"), nullptr);
|
CallFunction(this,Sec("onInit"), nullptr);
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
std::string getDate() {
|
std::string getDate() {
|
||||||
typedef std::chrono::duration<int, std::ratio_multiply<std::chrono::hours::period, std::ratio<24>>::type> days;
|
typedef std::chrono::duration<int, std::ratio_multiply<std::chrono::hours::period, std::ratio<24>>::type> days;
|
||||||
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
|
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
|
||||||
@ -43,6 +45,7 @@ void InitLog(){
|
|||||||
error(Sec("logger file init failed!"));
|
error(Sec("logger file init failed!"));
|
||||||
}else LFS.close();
|
}else LFS.close();
|
||||||
}
|
}
|
||||||
|
std::mutex LogLock;
|
||||||
void addToLog(const std::string& Line){
|
void addToLog(const std::string& Line){
|
||||||
std::ofstream LFS;
|
std::ofstream LFS;
|
||||||
LFS.open (Sec("Server.log"), std::ios_base::app);
|
LFS.open (Sec("Server.log"), std::ios_base::app);
|
||||||
@ -50,31 +53,41 @@ void addToLog(const std::string& Line){
|
|||||||
LFS.close();
|
LFS.close();
|
||||||
}
|
}
|
||||||
void info(const std::string& toPrint) {
|
void info(const std::string& toPrint) {
|
||||||
|
LogLock.lock();
|
||||||
std::string Print = getDate() + Sec("[INFO] ") + toPrint + "\n";
|
std::string Print = getDate() + Sec("[INFO] ") + toPrint + "\n";
|
||||||
std::cout << Print;
|
ConsoleOut(Print);
|
||||||
addToLog(Print);
|
addToLog(Print);
|
||||||
|
LogLock.unlock();
|
||||||
}
|
}
|
||||||
void debug(const std::string& toPrint) {
|
void debug(const std::string& toPrint) {
|
||||||
if(!Debug)return;
|
if(!Debug)return;
|
||||||
|
LogLock.lock();
|
||||||
std::string Print = getDate() + Sec("[DEBUG] ") + toPrint + "\n";
|
std::string Print = getDate() + Sec("[DEBUG] ") + toPrint + "\n";
|
||||||
std::cout << Print;
|
ConsoleOut(Print);
|
||||||
addToLog(Print);
|
addToLog(Print);
|
||||||
|
LogLock.unlock();
|
||||||
}
|
}
|
||||||
void warn(const std::string& toPrint){
|
void warn(const std::string& toPrint){
|
||||||
|
LogLock.lock();
|
||||||
std::string Print = getDate() + Sec("[WARN] ") + toPrint + "\n";
|
std::string Print = getDate() + Sec("[WARN] ") + toPrint + "\n";
|
||||||
std::cout << Print;
|
ConsoleOut(Print);
|
||||||
addToLog(Print);
|
addToLog(Print);
|
||||||
|
LogLock.unlock();
|
||||||
}
|
}
|
||||||
void error(const std::string& toPrint) {
|
void error(const std::string& toPrint) {
|
||||||
static int ECounter = 0;
|
static int ECounter = 0;
|
||||||
|
LogLock.lock();
|
||||||
std::string Print = getDate() + Sec("[ERROR] ") + toPrint + "\n";
|
std::string Print = getDate() + Sec("[ERROR] ") + toPrint + "\n";
|
||||||
std::cout << Print;
|
ConsoleOut(Print);
|
||||||
addToLog(Print);
|
addToLog(Print);
|
||||||
if(ECounter > 10)exit(7);
|
if(ECounter > 10)exit(7);
|
||||||
ECounter++;
|
ECounter++;
|
||||||
|
LogLock.unlock();
|
||||||
}
|
}
|
||||||
void except(const std::string& toPrint) {
|
void except(const std::string& toPrint) {
|
||||||
|
LogLock.lock();
|
||||||
std::string Print = getDate() + Sec("[EXCEP] ") + toPrint + "\n";
|
std::string Print = getDate() + Sec("[EXCEP] ") + toPrint + "\n";
|
||||||
std::cout << Print;
|
ConsoleOut(Print);
|
||||||
addToLog(Print);
|
addToLog(Print);
|
||||||
|
LogLock.unlock();
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
std::thread t1(loop);
|
#ifdef DEBUG
|
||||||
t1.detach();
|
std::thread t1(loop);
|
||||||
|
t1.detach();
|
||||||
|
#endif
|
||||||
|
ConsoleInit();
|
||||||
InitServer(argc,argv);
|
InitServer(argc,argv);
|
||||||
InitConfig();
|
InitConfig();
|
||||||
InitLua();
|
InitLua();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user