Exemple #1
0
 public static void AnswerTest()
 {
     loger = new Loger();
     var endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8088);
     QClient = new QueryClient(endPoint, loger);
     //client = new MyClient(endPoint, loger);
     //client.PacketProtocol = new TcpClientPacketProtocol(1024, 1024 * 4);
     QClient.PacketProtocol = new TcpClientPacketProtocol(1024, 1024 * 4);
     QClient.Connect();
    // client.Connect();
     Stopwatch sw = new Stopwatch();
     Console.WriteLine("连接服务器成功");
     int i = 0;
     string c = Console.ReadLine();
     if (!string.IsNullOrEmpty(c))
         allCount = int.Parse(c);
     sw.Start();//开始记录时间
     while (i <= allCount)
     {
         i++;
         var data = Encoding.UTF8.GetBytes("测试数据kjfl发送大法师大法是大法师大法是否阿斯发达说" + i);
        var t = QClient.QueryAsync(data);
        // client.SendAsync(data);
         t.Wait();
         //if (t.IsCompleted)
         //    Console.WriteLine(Encoding.UTF8.GetString(t.Result));
         //else
         //    Console.WriteLine(i+":错误");
        // Thread.Sleep(10);
     }
     sw.Stop();
     Console.WriteLine("{0}次同步查询完成,运行时间:{1} 秒{2}毫秒", i, sw.Elapsed.Seconds, sw.Elapsed.Milliseconds);
     Console.ReadLine();
 }
Exemple #2
0
        public static void CommonTest()
        {
            loger = new Loger();
            var endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8088);
            client = new MyClient(endPoint, loger);
            client.PacketProtocol = new TcpClientPacketProtocol(1024, 1024 * 4);
            client.Received += ReceiveCommond;
            client.Connect();

            Stopwatch sw = new Stopwatch();
            Console.WriteLine("连接服务器成功");
            int i = 0;
            string c = Console.ReadLine();
            if (!string.IsNullOrEmpty(c))
                allCount = int.Parse(c);
            sw.Start();//开始记录时间
            sb.Start();
            while (i <= allCount)
            {
                i++;
                var data = Encoding.UTF8.GetBytes("测试数据kjfl发送大法师大法是大法师大法是否阿斯发达说法是否大是大非阿斯顿飞啊的方式阿斯顿飞阿凡达是啊发送到啊发送方啊发送的发送方啊是否啊第三方啊是否啊是否的萨芬啊是否啊是否阿飞大师傅kdsfjlkasjdflkjasdfljaslkfdjlkasdfjlkajsdlk" + i);
                client.SendAsync(data);
            }
            sw.Stop();
            Console.WriteLine("发送{0}次数据完成,运行时间:{1} 秒{2}毫秒", i, sw.Elapsed.Seconds, sw.Elapsed.Milliseconds);
            Console.ReadLine();
        }
Exemple #3
0
 protected void Awake()
 {
     Loger.LogTag(TAG, "Awake");
 }
Exemple #4
0
 protected void Start()
 {
     Loger.LogTag(TAG, "Start");
 }
        private static void CreateUploadShellByCurl()
        {
            const string funcBlock = "AssetBundlesBuild:CreateUploadShellByCurl()";

            Loger.BuildStart(funcBlock);

            var filePath = $"{Application.dataPath}/../Shell/UploadABByCurl.sh";

            if (File.Exists(filePath))
            {
                File.Delete(filePath);
            }
            var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
            var sw = new StreamWriter(fs);

            // 写入文件头
            sw.WriteLine("#!/bin/bash");
            sw.Flush();

            sw.WriteLine("");
            sw.Flush();

            // 设定变量
            sw.WriteLine("# 上传根目录");
            sw.WriteLine("ROOT_DIR=bundles");
            sw.Flush();
            sw.WriteLine("# 本地上传路径");
            sw.WriteLine("UPLOAD_FROM_ROOT_DIR={0}/StreamingAssets", Application.dataPath);
            sw.WriteLine("");
            sw.Flush();
            sw.WriteLine("# 上传目标平台");
            sw.WriteLine("BUILD_TARGET={0}", BundlesResult.GetInstance().BuildTarget);
            sw.Flush();
            sw.WriteLine("# App Version");
            sw.WriteLine("APP_VERSION={0}", BundlesResult.GetInstance().AppVersion);
            sw.Flush();

            var resourceServer = SysSettings.GetInstance().data.network.resourceServer;

            sw.WriteLine("# 认证");
            sw.WriteLine("UPLOAD_SERVER_ROOT_URL=\"ftp://{0}:{1}\"", resourceServer.ipAddresss, resourceServer.portNo);
            sw.WriteLine("VERIFY_CODE={0}:{1}", resourceServer.accountId, resourceServer.pwd);
            sw.WriteLine("");
            sw.Flush();

            sw.WriteLine("# 检测上传目录");
            sw.WriteLine("# $1 上传目录");
            sw.WriteLine("checkUploadDir()");
            sw.WriteLine("{");
            sw.WriteLine("    # 检测URL");
            sw.WriteLine("    CHK_URL=${UPLOAD_SERVER_ROOT_URL}");
            sw.WriteLine("    ");
            sw.WriteLine("    # 目标文件夹名");
            sw.WriteLine("    CHK_DIRS=$1");
            sw.WriteLine("    CHK_DIRS_ARRAY=(${CHK_DIRS//\\// })");
            sw.WriteLine("    CHK_DIRS_SIZE=${#CHK_DIRS_ARRAY[@]}");
            sw.WriteLine("    if [ $CHK_DIRS_SIZE -ge 1 ]; then");
            sw.WriteLine("    ");
            sw.WriteLine("        # 检测目录");
            sw.WriteLine("        CHK_DIR=${CHK_DIRS_ARRAY[CHK_DIRS_SIZE-1]}");
            sw.WriteLine("        PREV_DIR=${CHK_DIRS}");
            sw.WriteLine("        ");
            sw.WriteLine("        # 检测");
            sw.WriteLine("        if [ -n $CHK_DIR ]; then ");
            sw.WriteLine("            # 取得之前目录");
            sw.WriteLine("            if [ $CHK_DIRS_SIZE -gt 1 ]; then");
            sw.WriteLine("                PREV_DIR=${CHK_DIRS/\\/$CHK_DIR/}");
            sw.WriteLine("            else");
            sw.WriteLine("                PREV_DIR=${CHK_DIRS/$CHK_DIR/}");
            sw.WriteLine("            fi");
            sw.WriteLine("            ");
            sw.WriteLine("            # 检测路径");
            sw.WriteLine("            if [ -z $PREV_DIR ]; then");
            sw.WriteLine("                CHK_URL=\"${CHK_URL}/\"");
            sw.WriteLine("            else");
            sw.WriteLine("                CHK_URL=\"${CHK_URL}/${PREV_DIR}/\"");
            sw.WriteLine("            fi");
            sw.WriteLine("            ");
            sw.WriteLine("            # 检测文件夹");
            sw.WriteLine("            CHK_INFO=`curl ${CHK_URL} -u ${VERIFY_CODE}`");
            sw.WriteLine("            # 已存在目录");
            sw.WriteLine("            EXIST_DIRS=(${CHK_INFO// / })");
            sw.WriteLine("            # 存在标识位");
            sw.WriteLine("            EXIST_FLG=0");
            sw.WriteLine("            for DIR in ${EXIST_DIRS[@]}");
            sw.WriteLine("            do");
            sw.WriteLine("                if [ \"${DIR}\" == \"${CHK_DIR}\" ]; then");
            sw.WriteLine("                    EXIST_FLG=1");
            sw.WriteLine("                    break");
            sw.WriteLine("                fi");
            sw.WriteLine("                ");
            sw.WriteLine("            done");
            sw.WriteLine("            ");
            sw.WriteLine("            if [ $EXIST_FLG -le 0 ]; then");
            sw.WriteLine("                curl ${CHK_URL} -u ${VERIFY_CODE} -X \"MKD ${CHK_DIR}\"");
            sw.WriteLine("                echo \"Create Directory : ${CHK_URL}${CHK_DIR}\"");
            sw.WriteLine("            fi");
            sw.WriteLine("            ");
            sw.WriteLine("        fi");
            sw.WriteLine("    else");
            sw.WriteLine("        echo \"[Error] The dirs for check is not invalid!!(Check Dir=${CHK_DIRS})\"");
            sw.WriteLine("    fi");
            sw.WriteLine("}");
            sw.WriteLine("");
            sw.Flush();

            sw.WriteLine("# # 文件上传函数");
            sw.WriteLine("# $1 远程上传目录");
            sw.WriteLine("# $2 本地上传文件路径");
            sw.WriteLine("uploadFile()");
            sw.WriteLine("{");
            sw.WriteLine("    # 远程上传目标目录");
            sw.WriteLine("    UPLOAD_DIR=$1");
            sw.WriteLine("    # 本地上传文件");
            sw.WriteLine("    LOCAL_FILE_PATH=$2");
            sw.WriteLine("    ");
            sw.WriteLine("    # 检测URL");
            sw.WriteLine("    UPLOAD_URL=${UPLOAD_SERVER_ROOT_URL}/${UPLOAD_DIR}");
            sw.WriteLine("    #curl ${UPLOAD_URL} -v -u ${VERIFY_CODE} -T \"${LOCAL_FILE_PATH}\"");
            sw.WriteLine("    echo \"${LOCAL_FILE_PATH}\"");
            sw.WriteLine("    curl ${UPLOAD_URL} -u ${VERIFY_CODE} -T \"${LOCAL_FILE_PATH}\"");
            sw.WriteLine("}");
            sw.WriteLine("");
            sw.Flush();

            sw.WriteLine("# 检测目录");
            sw.WriteLine("checkUploadDir $ROOT_DIR");
            sw.WriteLine("checkUploadDir $ROOT_DIR/$BUILD_TARGET");
            sw.WriteLine("checkUploadDir $ROOT_DIR/$BUILD_TARGET/$APP_VERSION");
            sw.WriteLine("");
            sw.Flush();

            sw.WriteLine("# 上传资源文件");
            var targets = BundlesResult.GetInstance().Targets;
            var normals = targets
                          .Where(iO => BundleType.Normal == iO.bundleType)
                          .OrderBy(iO => iO.no)
                          .ToArray();

            if (0 < normals.Length)
            {
                sw.WriteLine("# 检测一般文件目录");
                sw.WriteLine("checkUploadDir $ROOT_DIR/$BUILD_TARGET/$APP_VERSION/{0}", BundleType.Normal);

                sw.WriteLine("# 一般文件");
                foreach (var loop in normals)
                {
                    var fileName = BundlesResult.GetLocalBundleFileName(loop.id, loop.fileType);
                    sw.WriteLine("uploadFile $ROOT_DIR/$BUILD_TARGET/$APP_VERSION/{0}/ $UPLOAD_FROM_ROOT_DIR/{0}/{1}",
                                 BundleType.Normal, fileName);
                }
                sw.WriteLine("");
                sw.Flush();
            }

            var scenes = targets
                         .Where(iO => BundleType.Scene == iO.bundleType)
                         .OrderBy(iO => iO.no)
                         .ToArray();

            if (0 < scenes.Length)
            {
                sw.WriteLine("# 检测场景文件目录");
                sw.WriteLine("checkUploadDir $ROOT_DIR/$BUILD_TARGET/$APP_VERSION/{0}", BundleType.Scene);
                sw.WriteLine("# 场景文件");
                foreach (var loop in scenes)
                {
                    var fileName = BundlesResult.GetLocalBundleFileName(loop.id, loop.fileType);
                    sw.WriteLine("uploadFile $ROOT_DIR/$BUILD_TARGET/$APP_VERSION/{0}/ $UPLOAD_FROM_ROOT_DIR/{0}/{1}",
                                 BundleType.Scene, fileName);
                }
                sw.WriteLine("");
                sw.Flush();
            }

            if (0 < targets.Count)
            {
                sw.WriteLine("# 清空上传文件");
                sw.WriteLine("rm -rfv $UPLOAD_FROM_ROOT_DIR");
                sw.WriteLine("");
                sw.Flush();
            }

            sw.Close();
            sw.Dispose();

            fs.Close();
            fs.Dispose();

            Loger.BuildEnd();
        }
        public static void CreateShellOfRefreshCdn()
        {
            const string funcBlock = "AssetBundlesBuild:CreateShellOfRefreshCdn()";

            Loger.BuildStart(funcBlock);

            var cdn = SysSettings.GetInstance().data.network.cdnServer;

            if (null == cdn)
            {
                Loger.BuildErrorLog("CreateShellOfRefreshCDN()::CDN Server info is invalid!!!");
                Loger.BuildEnd();
                return;
            }

            var filePath = $"{Application.dataPath}/../Shell/RefreshCDN.sh";

            if (File.Exists(filePath))
            {
                File.Delete(filePath);
            }
            var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
            var sw = new StreamWriter(fs);

            // 写入文件头
            sw.WriteLine("#!/bin/bash");
            sw.Flush();

            sw.WriteLine("");
            sw.Flush();

            // 设定变量
            sw.WriteLine("# 用户名");
            if (string.IsNullOrEmpty(cdn.userName))
            {
                Loger.BuildErrorLog("CreateShellOfRefreshCDN()::The username of CDN Server info is invalid or empty!!!");
            }
            sw.WriteLine("username=\"{0}\"", cdn.userName);
            sw.WriteLine("# APIKey");
            if (string.IsNullOrEmpty(cdn.apiKey))
            {
                Loger.BuildErrorLog("CreateShellOfRefreshCDN()::The apikey of CDN Server info is invalid or empty!!!");
            }
            sw.WriteLine("apiKey=\"{0}\"", cdn.apiKey);
            sw.Flush();
            sw.WriteLine("# 刷新时间");
            sw.WriteLine("date=`env LANG=\"en_US.UTF-8\" date -u \"+%a, %d %b %Y %H:%M:%S GMT\"`");
            sw.WriteLine("# 密码");
            sw.WriteLine("password=`echo -en \"$date\" | openssl dgst -sha1 -hmac $apiKey -binary | openssl enc -base64`");
            sw.Flush();
            sw.WriteLine("# 开始刷新");
            if (string.IsNullOrEmpty(cdn.cdnUrl))
            {
                Loger.BuildErrorLog("CreateShellOfRefreshCDN()::The url of CDN Server info is invalid or empty!!!");
            }
            sw.WriteLine("curl -i --url \"{0}\" \\", cdn.cdnUrl);
            sw.WriteLine("-X \"POST\" \\");
            sw.WriteLine("-u \"$username:$password\" \\");
            sw.WriteLine("-H \"Date:$date\" \\");
            sw.WriteLine("-H \"Content-Type: application/json\" \\");
            sw.WriteLine("-d '{");
            sw.WriteLine("     \"urlAction\":\"delete\",");
            sw.WriteLine("     \"dirs\": [");
            for (var idx = 0; idx < cdn.refreshUrls.Count; ++idx)
            {
                sw.WriteLine(0 == idx
                                        ? $"         \"{cdn.refreshUrls[idx]}\""
                                        : $"       , \"{cdn.refreshUrls[idx]}\"");
            }
            sw.WriteLine("     ]");
            sw.WriteLine("   }'");
            sw.Flush();

            sw.Close();
            sw.Dispose();

            fs.Close();
            fs.Dispose();

            Loger.BuildEnd();
        }
        /// <summary>
        /// 打包资源文件
        /// </summary>
        /// <param name="iBuildTarget">打包目标.</param>
        /// <param name="iNeedCompress">压缩标识位.</param>
        private static void BuildAssetBundle(BuildTarget iBuildTarget, bool iNeedCompress = false)
        {
            const string funcBlock = "AssetBundlesBuild:BuildAssetBundle()";

            Loger.BuildStart(funcBlock);
            Loger.BuildLog($"BuildTarget:{iBuildTarget} NeedCompress:{iNeedCompress}");

            // 清空上传信息
            BundlesResult.GetInstance().Clear();
            // 打包名
            BundlesResult.GetInstance().BuildName = SysSettings.GetInstance().BuildName;
            // 打包名
            BundlesResult.GetInstance().AppVersion = SysSettings.GetInstance().BuildVersion;
            // 打包名
            BundlesResult.GetInstance().CheckMode = CheckMode.CustomMd5;
            // 设置上传的打包类型
            BundlesResult.GetInstance().BuildTarget = iBuildTarget.ToString();

            var bcConfig = BundlesConfig.GetInstance();

            if (null == bcConfig || 0 >= bcConfig.Resources.Count)
            {
                Loger.BuildErrorLog("BundlesConfig is invalid!!!");
                return;
            }

            // 清空依赖关系列表
            var bundlesMap = BundlesMap.GetInstance();

            if (null == bundlesMap)
            {
                Loger.BuildErrorLog("BundlesMap is invalid!!!");
                return;
            }
            bundlesMap.Clear();

            var allConfig = bcConfig.Resources;

            // make bundle config
            foreach (var bc in allConfig)
            {
                switch (bc.mode)
                {
                // filter file
                case BundleMode.OneDir:
                {
                    var bundleId = BundlesMap.GetBundleId(bc.path);
                    var bm       = BundlesMap.GetOrCreateBundlesMap(bundleId);

                    bm.id   = bundleId;
                    bm.path = bc.path;

                    // 取得当前目录的文件列表
                    var files = GetAllFiles(bc.path);

                    // 遍历文件列表
                    foreach (var file in files)
                    {
                        // .DS_Store文件
                        if (file.EndsWith(".DS_Store"))
                        {
                            continue;
                        }
                        // *.meta文件
                        if (file.EndsWith(".meta"))
                        {
                            continue;
                        }

                        // 若为忽略文件,则跳过
                        if (bcConfig.IsIgnoreFile(bc, file))
                        {
                            bm.RemoveIgnorFile(file);
                            continue;
                        }
                        bm.AddFile(file);
                    }

                    bundlesMap.Maps.Add(bm);
                    break;
                }

                case BundleMode.SceneOneToOne:
                {
                    // 取得当前目录的文件列表
                    var files = GetAllFiles(bc.path);

                    foreach (var file in files)
                    {
                        // .DS_Store文件
                        if (file.EndsWith(".DS_Store"))
                        {
                            continue;
                        }
                        // *.meta文件
                        if (file.EndsWith(".meta"))
                        {
                            continue;
                        }
                        // 若非场景文件,则跳过
                        if (file.EndsWith(".unity") == false)
                        {
                            continue;
                        }

                        // 若为忽略文件,则跳过
                        var bundleId = BundlesMap.GetBundleId(file);
                        var bm       = BundlesMap.GetOrCreateBundlesMap(bundleId);
                        if (bcConfig.IsIgnoreFile(bc, file))
                        {
                            bm.RemoveIgnorFile(file);
                            continue;
                        }

                        bm.id   = bundleId;
                        bm.path = bc.path;
                        bm.type = BundleType.Scene;
                        bm.AddFile(file);

                        bundlesMap.Maps.Add(bm);
                    }

                    break;
                }

                case BundleMode.FileOneToOne:
                {
                    // 取得当前目录的文件列表
                    var files = GetAllFiles(bc.path);

                    foreach (var file in files)
                    {
                        // .DS_Store文件
                        if (file.EndsWith(".DS_Store"))
                        {
                            continue;
                        }
                        // *.meta文件
                        if (file.EndsWith(".meta"))
                        {
                            continue;
                        }

                        // 若为忽略文件,则跳过
                        var bundleId = BundlesMap.GetBundleId(file);
                        var bm       = BundlesMap.GetOrCreateBundlesMap(bundleId);
                        if (bcConfig.IsIgnoreFile(bc, file))
                        {
                            bm.RemoveIgnorFile(file);
                            continue;
                        }

                        bm.id   = bundleId;
                        bm.path = bc.path;
                        bm.AddFile(file);

                        bundlesMap.Maps.Add(bm);
                    }

                    break;
                }

                case BundleMode.TopDirOneToOne:
                {
                    // 取得目录列表
                    var directories = Directory.GetDirectories(bc.path);
                    if (directories.Length <= 0)
                    {
                        Loger.BuildWarningLog($"The no subfolder in this path!!!(dir:{bc.path})");
                        continue;
                    }

                    foreach (var dir in directories)
                    {
                        // 取得当前目录的文件列表
                        var files = GetAllFiles(dir);

                        var bundleId = BundlesMap.GetBundleId(dir);
                        if (string.IsNullOrEmpty(bundleId))
                        {
                            continue;
                        }
                        var bm = BundlesMap.GetOrCreateBundlesMap(bundleId);
                        bm.id   = bundleId;
                        bm.path = bc.path;

                        foreach (var file in files)
                        {
                            // .DS_Store文件
                            if (file.EndsWith(".DS_Store"))
                            {
                                continue;
                            }
                            // *.meta文件
                            if (file.EndsWith(".meta"))
                            {
                                continue;
                            }

                            // 若为忽略文件,则跳过
                            if (bcConfig.IsIgnoreFile(bc, file))
                            {
                                bm.RemoveIgnorFile(file);
                                continue;
                            }

                            bm.AddFile(file);
                        }

                        bundlesMap.Maps.Add(bm);
                    }

                    break;
                }
                }
            }

            // 目录检测
            var checkDir = BundlesResult.GetInstance().BundlesOutputDir;

            if (Directory.Exists(checkDir) == false)
            {
                Directory.CreateDirectory(checkDir);
            }
            checkDir = BundlesResult.GetInstance().BundlesOutputDirOfNormal;
            if (Directory.Exists(checkDir) == false)
            {
                Directory.CreateDirectory(checkDir);
            }
            checkDir = BundlesResult.GetInstance().BundlesOutputDirOfScene;
            if (Directory.Exists(checkDir) == false)
            {
                Directory.CreateDirectory(checkDir);
            }

            var succeeded = false;
            AssetBundleManifest result = null;

            string[] allAssets = null;

            // 一般Bundles
            try {
                var targets = bundlesMap.GetAllNormalBundleTargets();
                const BuildAssetBundleOptions options = BuildAssetBundleOptions.None;
                result = BuildPipeline.BuildAssetBundles(
                    BundlesResult.GetInstance().BundlesOutputDirOfNormal,
                    targets,
                    options,
                    iBuildTarget);
                Loger.BuildLog(" -> BuildPipeline.BuildAssetBundles");
                if (result != null)
                {
                    allAssets = result.GetAllAssetBundles();
                    if (allAssets != null && targets.Length == allAssets.Length)
                    {
                        succeeded = true;
                    }
                }
            } catch (Exception exp) {
                Loger.BuildErrorLog($"BuildAssetBundles Detail : {exp.Message}");
                succeeded = false;
            }

            // 更新导出标志位
            if (succeeded)
            {
                Loger.BuildLog(" -> BundlesConfig.UpdateBundleStateWhenCompleted");

                var hashCodes = new Dictionary <string, string>();
                foreach (var asset in allAssets)
                {
                    var hashCode = result.GetAssetBundleHash(asset);
                    if (string.IsNullOrEmpty(hashCode.ToString()))
                    {
                        continue;
                    }
                    var fileSuffix = BundlesResult.GetInstance().FileSuffix;
                    var key        = asset;
                    if (string.IsNullOrEmpty(fileSuffix) == false)
                    {
                        fileSuffix = fileSuffix.ToLower();
                        fileSuffix = $".{fileSuffix}";
                        key        = key.Replace(fileSuffix, "");
                    }
                    hashCodes[key] = hashCode.ToString();
                }
                // 初始化检测信息(Hash Code)
                bundlesMap.PushBundleResult(BundleType.Normal, hashCodes);
                Loger.BuildLog(" -> BundlesMap.UpdateUploadList Normal");
            }

            // Scene Bundles
            var targetScenes = bundlesMap.GetAllSceneBundleTargets();

            if (targetScenes != null && targetScenes.Count > 0)
            {
                foreach (var scene in targetScenes)
                {
                    if (scene?.GetAllTargets() == null || scene.GetAllTargets().Length <= 0)
                    {
                        continue;
                    }
                    try {
                        var options = BuildOptions.BuildAdditionalStreamedScenes;
                        if (BuildMode.Debug == SysSettings.GetInstance().BuildMode)
                        {
                            options |= BuildOptions.Development;
                        }
                        var sceneState = BuildPipeline.BuildPlayer(
                            scene.GetAllTargets(),
                            BundlesResult.GetLocalSceneBundleFilePath(scene.BundleId),
                            iBuildTarget,
                            options);
                        Loger.BuildLog($" -> BuildPipeline.BuildStreamedSceneAssetBundle(State:{sceneState})");
                    } catch (Exception exp) {
                        Loger.BuildErrorLog($"BuildStreamedSceneAssetBundle Detail:{exp.Message}");
                        succeeded = false;
                    }
                }
            }

            // 更新导出标志位
            if (succeeded)
            {
                Loger.BuildLog(" -> BundlesConfig.UpdateBundleStateWhenCompleted");

                // 初始化检测信息(Hash Code)
                bundlesMap.PushBundleResult(BundleType.Scene);
                Loger.BuildLog(" -> BundlesMap.UpdateUploadList Scene");
            }

            SysSettings.GetInstance().ExportToJsonFile();
            Loger.BuildLog(" -> BuildInfo.ExportToJsonFile");
            Loger.BuildEnd();
        }
        private static void CreateUploadShellByFtp()
        {
            const string funcBlock = "AssetBundlesBuild:CreateUploadShellByFtp()";

            Loger.BuildStart(funcBlock);

            var filePath = $"{Application.dataPath}/../Shell/UploadABByFtp.sh";

            if (File.Exists(filePath))
            {
                File.Delete(filePath);
            }
            var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
            var sw = new StreamWriter(fs);

            // 写入文件头
            sw.WriteLine("#!/bin/bash");
            sw.Flush();

            sw.WriteLine("");
            sw.Flush();

            // 设定变量
            sw.WriteLine("# 上传根目录");
            sw.WriteLine("ROOT_DIR=bundles");
            sw.Flush();
            sw.WriteLine("# 本地上传路径");
            sw.WriteLine("UPLOAD_FROM_ROOT_DIR={0}/StreamingAssets", Application.dataPath);
            sw.WriteLine("");
            sw.Flush();
            sw.WriteLine("# 上传目标平台");
            sw.WriteLine("BUILD_TARGET={0}", BundlesResult.GetInstance().BuildTarget);
            sw.Flush();
            sw.WriteLine("# App Version");
            sw.WriteLine("APP_VERSION={0}", BundlesResult.GetInstance().AppVersion);
            sw.Flush();

            var resourceServer = SysSettings.GetInstance().data.network.resourceServer;

            sw.WriteLine("# 检测上传目录");
            sw.WriteLine("# $1 上传目录");
            sw.WriteLine("checkUploadDir()");
            sw.WriteLine("{");
            sw.WriteLine("ftp -n<<!");
            sw.WriteLine("open {0} {1}", resourceServer.ipAddresss, resourceServer.portNo);
            sw.WriteLine("user {0} {1}", resourceServer.accountId, resourceServer.pwd);
            sw.WriteLine("binary");
            sw.WriteLine("pwd");
            sw.WriteLine("mkdir $1");
            sw.WriteLine("prompt");
//			sw.WriteLine("ls -l");
            sw.WriteLine("close");
            sw.WriteLine("bye");
            sw.WriteLine("!");
            sw.WriteLine("}");
            sw.WriteLine("");
            sw.Flush();

            sw.WriteLine("# 文件上传函数(单个)");
            sw.WriteLine("# $1 本地上传目录");
            sw.WriteLine("# $2 上传目标目录");
            sw.WriteLine("# $3 上传目标文件");
            sw.WriteLine("uploadFile()");
            sw.WriteLine("{");
            sw.WriteLine("ftp -n<<!");
            sw.WriteLine("open {0} {1}", resourceServer.ipAddresss, resourceServer.portNo);
            sw.WriteLine("user {0} {1}", resourceServer.accountId, resourceServer.pwd);
            sw.WriteLine("binary");
            // 开启FTP被动模式上传
            sw.WriteLine("quote pasv");
            sw.WriteLine("passive");
            // 设置远程目录
            sw.WriteLine("cd $2");
            sw.WriteLine("pwd");
            // 设置本地目录
            sw.WriteLine("lcd $1");
            sw.WriteLine("prompt off");
            // 上传文件(单个)
            sw.WriteLine("put $3");
            sw.WriteLine("close");
            sw.WriteLine("bye");
            sw.WriteLine("!");
            sw.WriteLine("}");
            sw.WriteLine("");
            sw.Flush();

            sw.WriteLine("# 文件夹上传函数");
            sw.WriteLine("# $1 本地上传目录");
            sw.WriteLine("# $2 上传目标目录");
            sw.WriteLine("uploadDir()");
            sw.WriteLine("{");
            sw.WriteLine("ftp -n<<!");
            sw.WriteLine("open {0} {1}", resourceServer.ipAddresss, resourceServer.portNo);
            sw.WriteLine("user {0} {1}", resourceServer.accountId, resourceServer.pwd);
            sw.WriteLine("binary");
            // 开启FTP被动模式上传
            sw.WriteLine("quote pasv");
            sw.WriteLine("passive");
            // 设置远程目录
            sw.WriteLine("cd $2");
            sw.WriteLine("pwd");
            // 设置本地目录
            sw.WriteLine("lcd $1");
            sw.WriteLine("prompt off");
            // 上传文件(单个)
            sw.WriteLine("mput *");
            sw.WriteLine("close");
            sw.WriteLine("bye");
            sw.WriteLine("!");
            sw.WriteLine("}");
            sw.WriteLine("");
            sw.Flush();


            sw.WriteLine("# 检测目录");
            sw.WriteLine("checkUploadDir $ROOT_DIR");
            sw.WriteLine("checkUploadDir $ROOT_DIR/$BUILD_TARGET");
            sw.WriteLine("checkUploadDir $ROOT_DIR/$BUILD_TARGET/$APP_VERSION");
            sw.WriteLine("");
            sw.Flush();

            sw.WriteLine("# 上传资源文件");
            var targets = BundlesResult.GetInstance().Targets;
            var normals = targets
                          .Where(iO => BundleType.Normal == iO.bundleType)
                          .OrderBy(iO => iO.no)
                          .ToArray();

            if (0 < normals.Length)
            {
                sw.WriteLine("# 检测一般文件目录");
                sw.WriteLine("checkUploadDir $ROOT_DIR/$BUILD_TARGET/$APP_VERSION/{0}", BundleType.Normal);

                sw.WriteLine("# 一般文件");
                foreach (var loop in normals)
                {
                    var fileName = BundlesResult.GetLocalBundleFileName(loop.id, loop.fileType);
                    sw.WriteLine("uploadFile $UPLOAD_FROM_ROOT_DIR/{0} $ROOT_DIR/$BUILD_TARGET/$APP_VERSION/{0} {1}",
                                 BundleType.Normal, fileName);
                }
                sw.WriteLine("");
                sw.Flush();
            }

            var scenes = targets
                         .Where(iO => BundleType.Scene == iO.bundleType)
                         .OrderBy(iO => iO.no)
                         .ToArray();

            if (0 < scenes.Length)
            {
                sw.WriteLine("# 检测场景文件目录");
                sw.WriteLine("checkUploadDir $ROOT_DIR/$BUILD_TARGET/$APP_VERSION/{0}", BundleType.Scene);
                sw.WriteLine("# 场景文件");
                foreach (var loop in scenes)
                {
                    var fileName = BundlesResult.GetLocalBundleFileName(loop.id, loop.fileType);
                    sw.WriteLine("uploadFile $UPLOAD_FROM_ROOT_DIR/{0} $ROOT_DIR/$BUILD_TARGET/$APP_VERSION/{0} {1}",
                                 BundleType.Scene, fileName);
                }
                sw.WriteLine("");
                sw.Flush();
            }

            if (0 < targets.Count)
            {
                sw.WriteLine("# 清空上传文件");
                sw.WriteLine("rm -rfv $UPLOAD_FROM_ROOT_DIR");
                sw.WriteLine("");
                sw.Flush();
            }

            sw.Close();
            sw.Dispose();

            fs.Close();
            fs.Dispose();

            Loger.BuildEnd();
        }
Exemple #9
0
        /// <summary>
        /// 创建模型
        /// </summary>
        /// <param name="tables">数据表</param>
        /// <param name="action">进度条委托</param>
        /// <returns>创建模型数量</returns>
        private int CreateModelIdentifierConversion(IEnumerable <Table> tables, Action action)
        {
            var pathList = new List <string>();//记录文件路径防止冲突

            if (string.IsNullOrEmpty(_space))
            {
                _space = "Default.Models";
            }
            if (!BaseTool.IsValidPath(_path))//替换非法目录
            {
                _path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Models");
            }
            var ret           = 0;
            var classNameList = new List <string>();//记录类名防止冲突

            foreach (var table in tables)
            {
                var sb        = new StringBuilder();
                var sb1       = new StringBuilder();
                var className = string.Empty;
                if (!string.IsNullOrEmpty(table.TableName))
                {
                    if (table.TableName.LastIndexOf('_') != -1)
                    {
                        className = table.TableName.Split('_').Where(str => !string.IsNullOrEmpty(str)).Aggregate(className, (current, str) => current + str.Substring(0, 1).ToUpper() + str.Substring(1).ToLower());
                    }
                    else
                    {
                        className = table.TableName.Substring(0, 1).ToUpper() + table.TableName.Substring(1);
                    }
                    className = BaseTool.ReplaceIllegalCharacter(className);
                }
                else
                {
                    className = "_";
                }
                while (classNameList.Count(x => x.Equals(className)) > 0)
                {
                    className = $"_{className}";
                }
                classNameList.Add(className);
                sb.Append("using System;\r\nusing System.ComponentModel.DataAnnotations;\r\nusing System.ComponentModel.DataAnnotations.Schema;\r\n\r\nnamespace ");
                sb.Append(_space);
                sb.Append("\r\n{\r\n");
                if (!string.IsNullOrEmpty(table.TableComment))
                {
                    sb.Append("\t/// <summary>\r\n");
                    sb.Append("\t/// ").Append(Regex.Replace(table.TableComment, @"[\r\n]", "")).Append("\r\n");
                    sb.Append("\t/// </summary>\r\n");
                }
                sb.Append("\t[Table(\"").Append(table.TableName).Append("\")]\r\n");  //数据标记
                sb.Append("\tpublic class ");
                sb.Append(className);
                sb.Append("\r\n\t{\r\n");
                if (table.TableColumns.Length > 0)
                {
                    sb.Append("\t\t#region Model\r\n");
                    var order = 0;                                     //记录主键数量
                    var columnPropertieNameList = new List <string>(); //记录属性名称防止冲突
                    foreach (var column in table.TableColumns)
                    {
                        var propertieName = string.Empty;
                        if (!string.IsNullOrEmpty(column.ColumnName))
                        {
                            if (column.ColumnName.LastIndexOf('_') != -1)
                            {
                                propertieName = column.ColumnName.Split('_').Where(str => !string.IsNullOrEmpty(str)).Aggregate(propertieName, (current, str) => current + str.Substring(0, 1).ToUpper() + str.Substring(1).ToLower());
                            }
                            else
                            {
                                propertieName = column.ColumnName.Substring(0, 1).ToUpper() + column.ColumnName.Substring(1);
                            }
                            propertieName = BaseTool.ReplaceIllegalCharacter(propertieName);
                        }
                        else
                        {
                            propertieName = "_";
                        }
                        while (columnPropertieNameList.Count(x => x.Equals(propertieName)) > 0 || propertieName == className)
                        {
                            propertieName = $"_{propertieName}";
                        }
                        columnPropertieNameList.Add(propertieName);
                        if (!string.IsNullOrEmpty(column.Comments))
                        {
                            sb.Append("\t\t/// <summary>\r\n");
                            sb.Append("\t\t/// ").Append(Regex.Replace(column.Comments, @"[\r\n]", "")).Append("\r\n");
                            sb.Append("\t\t/// </summary>\r\n");
                        }
                        if (column.ConstraintType == "主键")
                        {
                            sb.Append("\t\t[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column(\"").Append(column.ColumnName).Append("\", Order = ").Append(order).Append(")]\r\n");
                            order++;
                        }
                        else
                        {
                            sb.Append("\t\t[Column(\"").Append(column.ColumnName).Append("\")]\r\n");
                        }
                        if (string.IsNullOrEmpty(column.DataType))
                        {
                            sb.Append("\t\tpublic string " + propertieName + "\r\n\t\t{\r\n");
                        }
                        else
                        {
                            switch (column.DataType.ToUpper())
                            {
                            case "INT":
                            {
                                sb.Append("\t\tpublic int? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "VARCHAR":
                            {
                                sb.Append("\t\tpublic string " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "CHAR":
                            {
                                sb.Append("\t\tpublic string " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "BLOB":
                            {
                                sb.Append("\t\tpublic byte? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "TEXT":
                            {
                                sb.Append("\t\tpublic string " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "INTEGER":
                            {
                                sb.Append("\t\tpublic long? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "TINYINT":
                            {
                                sb.Append("\t\tpublic byte? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "SMALLINT":
                            {
                                sb.Append("\t\tpublic short? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "MEDIUMINT":
                            {
                                sb.Append("\t\tpublic int? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "BIT":
                            {
                                sb.Append("\t\tpublic bool? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "BIGINT":
                            {
                                sb.Append("\t\tpublic long? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "FLOAT":
                            {
                                sb.Append("\t\tpublic float? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "DOUBLE":
                            {
                                sb.Append("\t\tpublic double? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "Decimal":
                            {
                                sb.Append("\t\tpublic decimal? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "BOOLEAN":
                            {
                                sb.Append("\t\tpublic bool? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "ID":
                            {
                                sb.Append("\t\tpublic long? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "DATE":
                            {
                                sb.Append("\t\tpublic DATE? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "TIME":
                            {
                                sb.Append("\t\tpublic DateTime? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "DATETIME":
                            {
                                sb.Append("\t\tpublic DateTime? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "TIMESTAMP":
                            {
                                sb.Append("\t\tpublic DateTime? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "YEAR":
                            {
                                sb.Append("\t\tpublic DateTime? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "MONEY":
                            {
                                sb.Append("\t\tpublic decimal? " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "IMAGE":
                            {
                                sb.Append("\t\tpublic string " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "NVARCHAR":
                            {
                                sb.Append("\t\tpublic string " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            case "JSON":
                            {
                                sb.Append("\t\tpublic string " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;

                            default:
                            {
                                sb.Append("\t\tpublic string " + propertieName + "\r\n\t\t{\r\n");
                            }
                            break;
                            }
                        }
                        sb.Append("\t\t\tset;\r\n");
                        sb.Append("\t\t\tget;\r\n");
                        sb.Append("\t\t}\r\n");
                        sb.Append("\r\n");
                        sb1.Append(propertieName);
                        sb1.Append("=\" + ");
                        sb1.Append(propertieName);
                        sb1.Append(" + \",");
                    }
                    if (sb1.Length >= 5)
                    {
                        sb1.Remove(sb1.Length - 5, 5);
                    }
                    sb.Append("\t\tpublic override string ToString()\r\n");
                    sb.Append("\t\t{\r\n");
                    sb.Append("\t\t\treturn \"");
                    sb.Append(sb1);
                    sb.Append(";");
                    sb.Append("\r\n");
                    sb.Append("\t\t}\r\n");
                    sb.Append("\t\t#endregion Model\r\n");
                }
                else
                {
                    sb.Append("\r\n\r\n");
                    Loger.Debug($"表中不包含用户可见的列:表名 = {table.TableName}");
                }
                sb.Append("\t}\r\n").Append("}");
                var filePath = BaseTool.ReservedWordsReplace(Path.Combine(_path, $"{className}.cs"));
                while (pathList.Count(x => filePath == x) > 0)
                {
                    filePath = $"_{filePath}";
                }
                pathList.Add(filePath);
                if (WriteFile(filePath, sb.ToString()))
                {
                    ret++;
                }
                action();
            }
            return(ret);
        }
        private void OnDownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                StatusDescription = LanguageUtils.ConvertLanguage(language, "更新被取消!", "Update cancelled!");
                return;
            }

            if (e.Error is WebException)
            {
                StatusDescription = LanguageUtils.ConvertLanguage(language, "请检测您的网络或防火墙设置!", "Please check your network or firewall settings!");
                return;
            }

            //下载完成
            _speedTimer.Dispose();
            _speedTimer   = null;
            IsDownloading = false;

            //验证文件
            var filePath = UpdateInfo.TempPath + UpdateInfo.FileName;

            StatusDescription = LanguageUtils.ConvertLanguage(language, "安全校验...", "Security check...");
            if (!VerifyFileMd5(filePath))
            {
                return;
            }

            //解压
            StatusDescription = LanguageUtils.ConvertLanguage(language, " 正在解压...", " Decompressing...");
            ZipFile.ExtractToDirectory(filePath, UpdateInfo.TempPath);
            File.Delete(filePath);
            Update32Or64Libs(UpdateInfo.TempPath);
            ProgressValue = +ProgressValue + 5;

            //更新
            StatusDescription = LanguageUtils.ConvertLanguage(language, " 正在更新...", " Updating...");
            IsCopying         = true;
            Utility.DirectoryCopy(UpdateInfo.TempPath, UpdateInfo.UnpackPath,
                                  true, true, o => InstallFileName = o);
            Utility.UpdateReg(Registry.LocalMachine, SubKey, "DisplayVersion",
                              UpdateInfo.NewVersion);
            ExecuteStrategy();
            IsCopying     = false;
            ProgressValue = +ProgressValue + 5;

            //启动平台
            StatusDescription = LanguageUtils.ConvertLanguage(language, " 启动平台...", " Start the platform...");
            Directory.Delete(UpdateInfo.TempPath, true);
            Loger.Print(string.Format("update version {0} to {1} succeeded. ",
                                      UpdateInfo.CurrentVersion, UpdateInfo.NewVersion));
            Thread.Sleep(500);
            try
            {
                Process.Start(UpdateInfo.UnpackPath + "/Recovery.exe");
            }
            catch (Exception ex)
            {
            }
            Application.Current.Dispatcher.Invoke(() => CloseWindowCmd.Execute(null));
        }
Exemple #11
0
        public void Start(string path)
        {
            //var jsonFile = Path.Combine(Directory.GetCurrentDirectory(), "Settings.json");
            var jsonFile = Path.Combine(path, "Settings.json");

            if (!File.Exists(jsonFile))
            {
                using (StreamWriter file = File.CreateText(jsonFile))
                {
                    var jsonText = JsonSerializer.Serialize(ServerSettings, new JsonSerializerOptions()
                    {
                        WriteIndented = true
                    });
                    file.WriteLine(jsonText);
                }

                Console.WriteLine("Created Settings.json, server was been stopped");
                Console.WriteLine($"RU: Настройте сервер, заполните {jsonFile}");
                Console.WriteLine("Enter some key");
                Console.ReadKey();
                return;
            }
            else
            {
                try
                {
                    using (var fs = new StreamReader(jsonFile, Encoding.UTF8))
                    {
                        var jsonString = fs.ReadToEnd();
                        ServerSettings = JsonSerializer.Deserialize <ServerSettings>(jsonString);
                    }

                    ServerSettings.WorkingDirectory = path;
                    var results = new List <ValidationResult>();
                    var context = new ValidationContext(ServerSettings);
                    if (!Validator.TryValidateObject(ServerSettings, context, results, true))
                    {
                        foreach (var error in results)
                        {
                            Console.WriteLine(error.ErrorMessage);
                            Loger.Log(error.ErrorMessage);
                        }

                        Console.ReadKey();
                        return;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine($"RU: Проверьте настройки сервера {jsonFile}");
                    Console.WriteLine("EN: Check Settings.json");
                    Console.ReadKey();
                    return;
                }
            }

            MainHelper.OffAllLog = false;
            Loger.PathLog        = path;
            Loger.IsServer       = true;

            var rep = Repository.Get;

            rep.SaveFileName = Path.Combine(path, "World.dat");
            rep.Load();
            CheckDiscrordUser();
            createFilesDictionary();

            //общее обслуживание
            rep.Timer.Add(1000, DoWorld);

            //сохранение, если были изменения
            rep.Timer.Add(ServerSettings.SaveInterval, () =>
            {
                rep.Save(true);
            });

            //ActiveClientCount = 0;

            Connect = new ConnectServer();
            Connect.ConnectionAccepted = ConnectionAccepted;

            Loger.Log($"Server starting on port: {ServerSettings.Port}");
            Connect.Start(null, ServerSettings.Port);
        }
Exemple #12
0
        /// <summary>
        /// Общее обслуживание мира
        /// </summary>
        private void DoWorld()
        {
            HashSet <string> allLogins = null;
            //Есть ли какие-то изменения в списках пользователей
            bool changeInPlayers = false;

            ///Обновляем кто кого видит

            foreach (var player in Repository.GetData.PlayersAll)
            {
                var pl = ChatManager.Instance.PublicChat.PartyLogin;
                if (pl.Count == Repository.GetData.PlayersAll.Count)
                {
                    continue;
                }

                changeInPlayers = true;

                if (player.IsAdmin ||
                    true    //todo переделать это на настройки сервера "в чате доступны все, без учета зон контакта"
                    )
                {
                    if (allLogins == null)
                    {
                        allLogins = new HashSet <string>(Repository.GetData.PlayersAll.Select(p => p.Public.Login));
                    }
                    lock (player)
                    {
                        ///админы видят всех: добавляем кого не хватает
                        var plAdd = new HashSet <string>(allLogins);
                        plAdd.ExceptWith(ChatManager.Instance.PublicChat.PartyLogin);

                        if (plAdd.Count > 0)
                        {
                            pl.AddRange(plAdd);
                        }
                    }
                }
                else
                {
                    ///определяем кого видят остальные
                    //админов
                    var plNeed = Repository.GetData.PlayersAll
                                 .Where(p => p.IsAdmin)
                                 .Select(p => p.Public.Login)
                                 .ToList();

                    //те, кто запустил спутники
                    //todo когда сделаем, то потом, может быть, стоит это убрать для тех кто не построил ещё хотя бы консоль связи

                    //и те кто географически рядом
                    //todo

                    //себя и system
                    if (!plNeed.Any(p => p == player.Public.Login))
                    {
                        plNeed.Add(player.Public.Login);
                    }
                    if (!plNeed.Any(p => p == "system"))
                    {
                        plNeed.Add("system");
                    }

                    ///синхронизируем
                    lock (player)
                    {
                        pl.RemoveAll((pp) => !plNeed.Any(p => p == pp));
                        pl.AddRange(plNeed.Where(p => !pl.Any(pp => p == pp)));
                    }
                }
            }

            /// Удаляем колонии за которые давно не заходили, игровое время которых меньше полугода и ценность в них меньше второй иконки

            var minCostForTrade = 25000; // эту цифру изменять вместе с CaravanOnline.GetFloatMenuOptions()

            foreach (var player in Repository.GetData.PlayersAll)
            {
                if (player.Public.LastSaveTime == DateTime.MinValue)
                {
                    continue;
                }
                if (player.Public.LastTick > 3600000 / 2)
                {
                    continue;
                }

                if ((DateTime.UtcNow - player.Public.LastOnlineTime).TotalDays < 7)
                {
                    continue;
                }
                if ((DateTime.UtcNow - player.LastUpdateTime).TotalDays < 7)
                {
                    continue;
                }
                if ((DateTime.UtcNow - player.Public.LastSaveTime).TotalDays < 7)
                {
                    continue;
                }

                if (player.IsAdmin)
                {
                    continue;
                }

                var costAll = player.CostWorldObjects();
                if (costAll.BaseCount + costAll.CaravanCount == 0)
                {
                    continue;
                }
                if (costAll.MarketValue + costAll.MarketValuePawn == 0)
                {
                    continue;                                                     //какой-то сбой отсутствия данных
                }
                if (costAll.MarketValue + costAll.MarketValuePawn > minCostForTrade)
                {
                    continue;
                }

                var msg = $"User {player.Public.Login} deleted settlements (game abandoned): " +
                          $"cost {costAll.MarketValue + costAll.MarketValuePawn}, " +
                          $"game days {player.Public.LastTick / 60000}, " +
                          $"last online (day) {(int)(DateTime.UtcNow - player.Public.LastOnlineTime).TotalDays} ";

                //блок удаления из AbandonHimSettlementCmd

                ChatManager.Instance.AddSystemPostToPublicChat(msg);

                Repository.DropUserFromMap(player.Public.Login);
                Repository.GetSaveData.DeletePlayerData(player.Public.Login);
                player.Public.LastSaveTime = DateTime.MinValue;
                Repository.Get.ChangeData  = true;
                Loger.Log("Server " + msg);
            }

            /// Завершение

            if (changeInPlayers)
            {
                Repository.GetData.UpdatePlayersAllDic();
            }
        }
Exemple #13
0
        private void createFilesDictionary()
        {
            if (!ServerSettings.IsModsWhitelisted)
            {
                return;
            }

            // 1. Создаем словарь со всеми файлами
            Loger.Log($"Calc hash {ServerSettings.ModsDirectory}");
            var modFiles = FileChecker.GenerateHashFiles(ServerSettings.ModsDirectory, Directory.GetDirectories(ServerSettings.ModsDirectory));

            Loger.Log($"Calc hash {ServerSettings.SteamWorkShopModsDir}");
            ///!!!!!!!!!!!!!!!! STEAM FOLDER CHECK SWITCH HERE  !!!!!!!!!!!!!!!
            // 1. Если будем использовать steamworkshop диреторию, эти две строчки ниже закомментировать
            // 2. remove JsobIgnrore atribbute in ServerSettings
            ServerSettings.SteamWorkShopModsDir = Environment.CurrentDirectory;
            ///!!!!!!!!!!!!!!!! STEAM FOLDER CHECK SWITCH HERE  !!!!!!!!!!!!!!!
            var steamFiles = FileChecker.GenerateHashFiles(ServerSettings.SteamWorkShopModsDir, new string[0]);

            ModFilesDict   = modFiles.ToDictionary(f => f.FileName);
            SteamFilesDict = steamFiles.ToDictionary(f => f.FileName);

            // 2. Создаем файлы со списком разрешенных папок, которые отправим клиенту
            var modsFolders = new ModelFileInfo() // 0
            {
                FileName = "ApprovedMods.txt",
                Hash     = FileChecker.CreateListFolder(ServerSettings.ModsDirectory)
            };
            var steamFolders = new ModelFileInfo() // 1
            {
                FileName = "ApprovedSteamWorkShop.txt",
                Hash     = FileChecker.CreateListFolder(ServerSettings.SteamWorkShopModsDir)
            };
            var modsConfigFileName = Path.Combine(ServerSettings.WorkingDirectory, "ModsConfig.xml");
            var modsConfig         = new ModelFileInfo() // 2
            {
                FileName = "ModsConfig.xml",
                Hash     = Encoding.UTF8.GetBytes(File.ReadAllText(modsConfigFileName))
            };

            // index: 0 - list Folders in Mods dir, 1 -list Folders in Steam dir , 2 - ModsConfig.xml
            ServerSettings.AppovedFolderAndConfig = new ModelModsFiles()
            {
                Files = new List <ModelFileInfo>()
                {
                    modsFolders,
                    steamFolders,
                    modsConfig,
                }
            };

            ServerSettings.ModsDirConfig = new ModelModsFiles()
            {
                IsSteam = false,
                Files   = new List <ModelFileInfo>()
                {
                    modsFolders
                },
                FoldersTree = FoldersTree.GenerateTree(ServerSettings.ModsDirectory),
            };

            ServerSettings.SteamDirConfig = new ModelModsFiles()
            {
                IsSteam = true,
                Files   = new List <ModelFileInfo>()
                {
                    steamFolders
                },
                FoldersTree = FoldersTree.GenerateTree(ServerSettings.SteamWorkShopModsDir),
            };
        }
Exemple #14
0
        public void Do(ConnectClient client)
        {
            Client = client;

            Loger.Log("Server ReceiveBytes1");

            ///установка условно защищенного соединения
            //Строго первый пакет: Передаем серверу КОткр
            var rc     = Client.ReceiveBytes();
            var crypto = new CryptoProvider();

            if (SessionClient.UseCryptoKeys)
            {
                crypto.OpenKey = Encoding.UTF8.GetString(rc);
            }

            //Строго первый ответ: Передаем клиенту КОткр(Сессия)
            SetKey();
            Loger.Log("Server SendMessage1");
            if (SessionClient.UseCryptoKeys)
            {
                Client.SendMessage(crypto.Encrypt(Key));
            }
            else
            {
                Client.SendMessage(Key);
            }

            //if (LogMessage != null) LogMessage("session Connected");

            Worker = new Service();

            ///рабочий цикл
            while (true)
            {
                //Loger.Log("Server Loop1");
                var rec = Client.ReceiveBytes();

                if (Worker.Player != null)
                {
                    Worker.Player.Public.LastOnlineTime = DateTime.UtcNow;
                }

                //отдельно обрабатываем пинг
                if (rec.Length == 1)
                {
                    if (rec[0] == 0x00)
                    {
                        Client.SendMessage(new byte[1] {
                            0x00
                        });
                    }
                    //отдельно обрабатываем запрос на обновление (ответ 0 - нет ничего, 1 - что-то есть)
                    else if (rec[0] == 0x01)
                    {
                        var exists = ServiceCheck();
                        Client.SendMessage(new byte[1] {
                            exists ? (byte)0x01 : (byte)0x00
                        });
                    }
                    continue;
                }

                //Loger.Log("Server Loop2");
                var rec2 = CryptoProvider.SymmetricDecrypt(rec, Key);
                //Loger.Log("Server " + Loger.Bytes(rec2));
                //Loger.Log("Server Loop3");
                var recObj = (ModelContainer)GZip.UnzipObjByte(rec2); //Deserialize
                //Loger.Log("Server Loop4");

                var sendObj = Service(recObj);

                //Loger.Log("Server Loop5");
                var ob = GZip.ZipObjByte(sendObj); //Serialize
                //Loger.Log("Server Loop6");
                var send = CryptoProvider.SymmetricEncrypt(ob, Key);
                //Loger.Log("Server Loop7");
                Client.SendMessage(send);
            }
        }
Exemple #15
0
        private ModelContainer Service(ModelContainer recObj)
        {
            var send = new ModelContainer();

            switch (recObj.TypePacket)
            {
            case 1:
                send.TypePacket = 2;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " Registration");
                send.Packet = Worker.Registration((ModelLogin)recObj.Packet);
                break;

            case 3:
                send.TypePacket = 4;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " Login");
                send.Packet = Worker.Login((ModelLogin)recObj.Packet);
                break;

            case 5:
                send.TypePacket = 6;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " Info");
                send.Packet = Worker.GetInfo((ModelInt)recObj.Packet);
                break;

            case 7:
                send.TypePacket = 8;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " CreatingWorld");
                send.Packet = Worker.CreatingWorld((ModelCreateWorld)recObj.Packet);
                break;

            case 11:
                send.TypePacket = 12;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " PlayInfo");
                send.Packet = Worker.PlayInfo((ModelPlayToServer)recObj.Packet);
                break;

            case 15:
                send.TypePacket = 16;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " SendThings");
                send.Packet = Worker.SendThings((ModelMailTrade)recObj.Packet);
                break;

            case 17:
                send.TypePacket = 18;
                send.Packet     = Worker.UpdateChat((ModelUpdateTime)recObj.Packet);
                break;

            case 19:
                send.TypePacket = 20;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " PostingChat");
                send.Packet = Worker.PostingChat((ModelPostingChat)recObj.Packet);
                break;

            case 21:
                send.TypePacket = 22;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " ExchengeEdit");
                send.Packet = Worker.ExchengeEdit((OrderTrade)recObj.Packet);
                break;

            case 23:
                send.TypePacket = 24;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " ExchengeBuy");
                send.Packet = Worker.ExchengeBuy((ModelOrderBuy)recObj.Packet);
                break;

            case 25:
                send.TypePacket = 26;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " ExchengeLoad");
                send.Packet = Worker.ExchengeLoad();
                break;

            case 27:
                send.TypePacket = 28;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " AttackInitiator");
                send.Packet = Worker.AttackOnlineInitiator((AttackInitiatorToSrv)recObj.Packet);
                break;

            case 29:
                send.TypePacket = 30;
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " AttackHost");
                send.Packet = Worker.AttackOnlineHost((AttackHostToSrv)recObj.Packet);
                break;

            default:
                Loger.Log("Server " + (Worker.Player == null ? "     " : Worker.Player.Public.Login.PadRight(5)) + " Error0");
                send.TypePacket = 0;
                break;
            }
            return(send);
        }