private static void CheckClient(object sender, ClientIdT clid)
        {
            var        cl    = (Ts3FullClient)sender;
            ClientUidT cluid = Clientlib.ClientGetUidFromClid(cl, clid);

            Console.WriteLine($"clid={clid} cluid={cluid}");
            if (done.Contains(cluid))
            {
                return;
            }
            var dbid   = uint.Parse(cl.Send("clientgetdbidfromuid", new CommandParameter("cluid", cluid)).FirstOrDefault()["cldbid"]);
            var friend = TSSettings.isFriend(cluid);

            Console.WriteLine($"#{clid} dbid={dbid} cluid={cluid} friend={friend}");
            switch (friend)
            {
            case FriendStatus.Blocked:
                Clientlib.SetAllChannelGroup(cl, banCGID, dbid, cids);
                break;

            case FriendStatus.Friend:
                Clientlib.SetAllChannelGroup(cl, modCGID, dbid, cids);
                break;

            default:
                break;
            }
            done.Add(cluid);
        }
 static void Dispose()
 {
     if (isExit)
     {
         return;
     }
     isExit = true;
     lock (clients) {
         var _clients = clients.ToArray();
         foreach (var client in _clients)
         {
             client.OnConnected           -= OnConnected;
             client.OnDisconnected        -= OnDisconnected;
             client.OnErrorEvent          -= OnErrorEvent;
             client.OnTextMessageReceived -= OnTextMessageReceived;
             client.OnClientMoved         -= OnClientMoved;
             client.OnClientEnterView     -= OnClientEnterView;
             client?.Disconnect();
             Thread.Sleep(int.Parse(cfg["general"]["DisconnectSleepMS"]));
         }
     }
     TSSettings.CloseDB();
 }
        static void Main()
        {
            AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);
            clients  = new List <Ts3FullClient>();
            channels = File.ReadAllLines(chanfile);
            var parser = new FileIniDataParser();

            cfg = parser.ReadFile(cfgfile);
            RandomNick rndnick = new RandomNick();

            rndnick.Init();
            TSSettings.OpenDB();
            Console.CancelKeyPress += (s, e) => {
                if (e.SpecialKey == ConsoleSpecialKey.ControlC)
                {
                    e.Cancel = true;
                    Dispose();
                    Environment.Exit(0);
                }
            };
            con.Address  = cfg["general"]["Address"];
            con.Password = cfg["general"]["ServerPassword"];
            ownerUID     = cfg["general"]["OwnerUID"];

            /*
             * adminCGID = uint.Parse(cfg["general"]["adminCGID"]);
             * modCGID = uint.Parse(cfg["general"]["modCGID"]);
             * banCGID = uint.Parse(cfg["general"]["banCGID"]);
             */
            if (!File.Exists(idfile))
            {
                using (File.Create(idfile)) { }
            }
            ids = File.ReadAllLines(idfile);
            for (int i = 0; i < channels.Length; i++)
            {
                if (isExit)
                {
                    return;
                }
                con.Username = rndnick.GetRandomNick();                 //cfg["general"]["Nickname"];
                var client = new Ts3FullClient(EventDispatchType.DoubleThread);
                client.OnConnected           += OnConnected;
                client.OnDisconnected        += OnDisconnected;
                client.OnErrorEvent          += OnErrorEvent;
                client.OnTextMessageReceived += OnTextMessageReceived;
                client.OnClientMoved         += OnClientMoved;
                client.OnClientEnterView     += OnClientEnterView;
                var          _identity = ids.Select(x => x.Split(',')).ToList();
                IdentityData ID;
                try {
                    ID = Ts3Crypt.LoadIdentity(_identity[i][0], ulong.Parse(_identity[i][1]));
                    if (i > 0)
                    {
                        Thread.Sleep(int.Parse(cfg["general"]["ConnectSleepMS"]));
                    }
                } catch (Exception) {
                    ID = Ts3Crypt.GenerateNewIdentity(int.Parse(cfg["general"]["MinLVL"]));
                    File.AppendAllText(idfile, ID.PrivateKeyString + "," + ID.ValidKeyOffset + "\r\n");
                }
                Console.WriteLine("#" + i + " UID: " + ID.ClientUid);
                con.Identity = ID;
                //Array values = Enum.GetValues(typeof(VersionSign));
                //Random random = new Random();
                //con.VersionSign = (VersionSign)values.GetValue(random.Next(values.Length));
                //var t = typeof(VersionSign).GetFields();
                con.VersionSign = VersionSign.VER_WIN_3_UNKNOWN;
                //con.VersionSign = new VersionSign("YaTQA-3.9pre [Build: 32503680000]", "ServerQuery", String.Empty);
                con.HWID = $"{Clientlib.RandomString(32)},{Clientlib.RandomString(32)}";
                Console.WriteLine("#" + i + " HWID: " + con.HWID);
                client.Connect(con);
                clients.Add(client);
            }
            AntiAFK = new Timer(OnTick, "on", 114 * 10000, 114 * 10000);
            Console.WriteLine("End");
            Console.ReadLine();
            Dispose();
        }