这里是PCSMT的功能代码库
Server List
void ServerList(std::string args) {
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
//获取列表服务器名数量
ServerNameNumber = InitializationServerName();
Output("服务器列表:");
//输出服务器列表
//std::cout << ServerNameNumber << std::endl;
for (int OutputServerName = 0; OutputServerName < ServerNameNumber; OutputServerName++)
{
Output(std::to_string(OutputServerName) + ADot + ServerName[OutputServerName].c_str());
}
LogFile.close();
}
Start Server
void ToStartServer(std::string args) {
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
//将输入的转换为整形
int ServerNamePositionTotals = std::atoi(args.c_str());
Output("启动服务器:" + ServerName[ServerNamePositionTotals]);
//将std::string ServerPosition转换到const char* ServerNamePosition
std::string cdServerPosition = CD + ServerFolder[ServerNamePositionTotals];
std::string startServer = StartString + ServerFolder[ServerNamePositionTotals] + StartBatch;
//执行命令
system(cdServerPosition.c_str());
int excuteResult = system(startServer.c_str());
while (excuteResult != 0)
{
Output("执行启动脚本失败!");
return;
}
Output("执行启动脚本成功!");
Output("当前启动服务器:" + ServerName[ServerNamePositionTotals]);
LogFile.close();
}
Add Server
Add Server
void AddServer(std::string args) {
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
const char* ServerPath = args.c_str();
//std::wstring StartBarchWstring(StartBatch.begin(), StartBatch.end());
//std::wstring midServerPath(args.begin(), args.end());
//std::wstring ServerPositionFolder = midServerPath + StartBarchWstring;
const int ServerAbsolutePathLong = 512;
char ServerAbsolutePath[ServerAbsolutePathLong]{};
//获取当前程序的绝对路径
GetCurrentDirectory(ServerAbsolutePathLong, ServerAbsolutePath);
//LPCWSTR ServerAbsolutePositionFolder = ServerPositionFolder.c_str();
//GetFullPathName(ServerAbsolutePositionFolder, MAX_PATH, ServerAbsolutePath, NULL);
std::string getServerName;
for (char get : args)
{
if (get != '.' && get != '/') {
getServerName += get;
}
}
Output("服务器名:" + getServerName);
CheckPCSMTFolder();
//如果有./PCSMT/ServerPosition.txt文件就打开,没有则创建
//存储ServerPosition
std::fstream ServerAddress(ADot + PCSMTPositionFolder + ServerPositionTxt, std::ios::out | std::ios::app);
//检查文件是否打开
if (!ServerAddress.is_open())
{
Output("服务器路径存储错误!打开文件时发生错误");
ServerAddress.close();
}
else {
//std::cout << args << StartBatch << std::endl;
//std::cout << ServerPath << StartBatch << std::endl;
Output("服务器路径:");
Output(ServerAbsolutePath + RightSlash + getServerName + StartBatch);
ServerAddress << ServerAbsolutePath << RightSlash + getServerName << StartBatch << std::endl;
ServerAddress.close();
//检查Start.bat文件的存在并写入Start.bat中
CheckStartBatch(ServerAbsolutePath + RightSlash + getServerName);
//输出信息
Output("服务器路径存储完成!");
}
//存储ServerName
ServerAddress.open(ADot + PCSMTPositionFolder + ServerNameTxt, std::ios::out | std::ios::app);
if (!ServerAddress.is_open())
{
Output("服务器名存储错误!打开文件时发生错误");
ServerAddress.close();
}
else {
ServerAddress << getServerName << std::endl;
ServerAddress.close();
Output("服务器名存储完成!");
}
ServerAddress.open(ADot + PCSMTPositionFolder + ServerFolderTxt, std::ios::out | std::ios::app);
if (!ServerAddress.is_open())
{
Output("服务器所在文件夹存储错误!打开文件时发生错误");
ServerAddress.close();
}
else {
Output("服务器所在文件夹:");
Output(ServerAbsolutePath + RightSlash + getServerName);
ServerAddress << ServerAbsolutePath << RightSlash + getServerName << std::endl;
ServerAddress.close();
Output("服务器所在文件夹存储完成!");
}
InitializationServerPosition();
InitializationServerName();
InitializationServerFolder();
LogFile.close();
}
Initialization
int InitializationServerPosition()
{
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
const int MaxServerTotals = 512;
int ReadServerPostionContent = 0;
std::string ServerPositionReaded[MaxServerTotals];
std::ifstream ReadServerPosition;
//打开文件
ReadServerPosition.open(ADot + PCSMTPositionFolder + ServerPositionTxt, std::ios::in);
if (ReadServerPosition.is_open() == false)
{
Output("文件打开失败!");
return 0;
}
Output("读取文件" + ServerPositionTxt + "中!");
while (std::getline(ReadServerPosition, ServerPositionReaded[ReadServerPostionContent]))
{
Output("读取服务器地址:" + ServerPositionReaded[ReadServerPostionContent]);
ServerPosition[ReadServerPostionContent] = ServerPositionReaded[ReadServerPostionContent];
//return ServerPositionReaded[ReadServerPostionContent];
ReadServerPostionContent++;
}
LogFile.close();
return ReadServerPostionContent;
}
int InitializationServerName()
{
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
const int MaxServerTotals = 512;
int ReadServerNameContent = 0;
std::string ServerNameReaded[MaxServerTotals];
std::ifstream ReadServerName;
//打开文件
ReadServerName.open(ADot + PCSMTPositionFolder + ServerNameTxt, std::ios::in);
if (ReadServerName.is_open() == false)
{
Output("文件打开失败!");
return 0;
}
Output("读取文件" + ServerNameTxt + "中!");
while (std::getline(ReadServerName, ServerNameReaded[ReadServerNameContent]))
{
Output("读取服务器名:" + ServerNameReaded[ReadServerNameContent]);
ServerName[ReadServerNameContent] = ServerNameReaded[ReadServerNameContent];
//std::cout << ReadServerNameContent << std::endl;
ReadServerNameContent++;
}
LogFile.close();
return ReadServerNameContent;
}
int InitializationServerFolder()
{
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
const int MaxServerTotals = 512;
int ReadServerFolderContent = 0;
std::string ServerFolderReaded[MaxServerTotals];
std::ifstream ReadServerFolder;
//打开文件
ReadServerFolder.open(ADot + PCSMTPositionFolder + ServerFolderTxt, std::ios::in);
if (ReadServerFolder.is_open() == false)
{
Output("文件打开失败!");
return 0;
}
Output("读取文件" + ServerFolderTxt + "中!");
while (std::getline(ReadServerFolder, ServerFolderReaded[ReadServerFolderContent]))
{
Output("读取服务器所在文件夹:" + ServerFolderReaded[ReadServerFolderContent]);
ServerFolder[ReadServerFolderContent] = ServerFolderReaded[ReadServerFolderContent];
//std::cout << ReadServerFolderContent << std::endl;
ReadServerFolderContent++;
}
LogFile.close();
return ReadServerFolderContent;
}
Check Start Batch
void CheckStartBatch(std::string StartBatchpath)
{
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
ServerCoreFileName = FindFilesWithExtension(StartBatchpath, ".jar");
std::string StartBatchPath = StartBatchpath + "/Start.bat";
if (ServerCoreFileName == "")
{
return;
}
else {
// 尝试打开文件
std::fstream StartBatch;
StartBatch.open(StartBatchPath);
// 检查文件是否成功打开
if (!StartBatch.is_open())
{
Output("未发现Start.bat文件!");
Output("创建Start.bat文件!");
StartBatch.open(StartBatchPath, std::fstream::out | std::fstream::trunc);
//检查文件是否创建
if (StartBatch.is_open()) {
Output("创建并打开了Start.bat文件。");
//创建并配置Start.bat文件
StartBatch << "cd " + StartBatchpath << std::endl;
StartBatch << "java -jar -Xms" + XmsRam + " -Xmx" + XmxRam + " -jar " + ServerCoreFileName << std::endl;
Output("配置成功!");
StartBatch.close(); // 操作完成后关闭文件
}
else {
Output("尝试创建文件失败!");
}
}
else {
//绑定并配置Start.bat文件
Output("已绑定Start.bat文件!");
StartBatch << "cd " + StartBatchpath << std::endl;
StartBatch << "java -jar -Xms" + XmsRam + " -Xmx" + XmxRam + " -jar " + ServerCoreFileName << std::endl;
Output("配置成功!");
StartBatch.close(); // 操作完成后关闭文件
}
}
LogFile.close();
}
Check PCSMT Folder
void CheckPCSMTFolder()
{
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
std::string PCSMTFolderPosition = ADot + PCSMTPositionFolder;
if (_access(PCSMTFolderPosition.c_str(), 0) == -1)
{
Output("文件夹不存在,创建中...");
int serverposition = _mkdir(PCSMTFolderPosition.c_str());
Output("创建完成!");
}
else {
Output("检查完毕!文件夹存在!");
}
LogFile.close();
}
Help
void Help(std::string args) {
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
int HelpLoop = HelpQuantity;
int HelpPosition = 0;
//将Help内定义的文本检查输出
for (size_t HelpPosition = 0; HelpPosition < HelpCommandName[HelpPosition].size(); ++HelpPosition) {
if (HelpCommandName[HelpPosition] == " ") {
continue; // 如果当前元素是空格字符串,则跳过
}
//输出信息
Output(HelpCommandName[HelpPosition] + TabKey + HelpCommandRole[HelpPosition] + TabKey + HelpCommandUsage[HelpPosition]);
}
LogFile.close();
}
Start
void Start(std::string args) {
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
//std::cout << "Start " << args << " units" << std::endl;
//将输入转换为const char*类型的常量
std::string ServerPathString = StartString + args;
const char *ServerPathChar = ServerPathString.c_str();
//使用system函数进行打开文件
system(ServerPathChar);
//输出信息
Output("打开文件:");
LogFile.close();
}
Register Server Commands
// 创建一个映射,用于存储指令和对应的函数
std::map<std::string, StartServer> StartServerCommand;
//注册指令
void registerServerCommand(const std::string& CommandName, StartServer servercmd) {
StartServerCommand[CommandName] = servercmd;
}
// 执行指令
void excuteServerCommand(const std::string& scLine) {
std::ofstream LogFile(LogOutputPath, std::ios::out | std::ios::app);
auto Output = [&](const std::string& text) {
std::cout << text << std::endl;
LogFile << text << std::endl;
};
std::istringstream server(scLine);
std::string servercommand;
server >> servercommand;
if (StartServerCommand.find(servercommand) != StartServerCommand.end()) {
std::string serverargs;
server >> serverargs;
StartServerCommand[servercommand](serverargs);
}
else {
//输出错误信息
Output("Unkown command: " + servercommand);
Output("使用“help”以查询指令");
}
LogFile.close();
}