LOADING

加载过慢请开启缓存 浏览器默认开启

PCSMT-Code

这里是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();
}