Beispiel #1
0
        public void PlayerDisconnected(string xuid, ServerInfo serverInstance)
        {
            Player playerFound = serverInstance.KnownPlayers.FirstOrDefault(ply => ply.XUID == xuid);

            playerFound.LastDisconnectTime = DateTime.Now.Ticks.ToString();
            InstanceProvider.GetConfigManager().SaveKnownPlayerDatabase(serverInstance);
        }
        public static async Task FetchBuild(string path, string version)
        {
            string ZipDir = $@"{Program.ServiceDirectory}\Server\MCSFiles\Update_{version}.zip";

            if (!Directory.Exists($@"{Program.ServiceDirectory}\Server\MCSFiles"))
            {
                Directory.CreateDirectory($@"{Program.ServiceDirectory}\Server\MCSFiles");
            }
            if (File.Exists(ZipDir))
            {
                File.Delete(ZipDir);
            }
            if ((string)InstanceProvider.GetHostInfo().GetGlobalValue("AcceptedMojangLic") == "false")
            {
                InstanceProvider.GetServiceLogger().AppendLine("------First time download detected------\n");
                InstanceProvider.GetServiceLogger().AppendLine("You will need to agree to the Minecraft End User License Agreement");
                InstanceProvider.GetServiceLogger().AppendLine("in order to continue. Visit https://account.mojang.com/terms");
                InstanceProvider.GetServiceLogger().AppendLine("to view terms. Type \"Yes\" and press enter to confirm that");
                InstanceProvider.GetServiceLogger().AppendLine("you agree to said terms.");
                Console.Write("Do you agree to the terms? ");
                Console.Out.Flush();
                if (Console.ReadLine() != "Yes")
                {
                    return;
                }
                InstanceProvider.GetHostInfo().SetGlobalProperty("AcceptedMojangLic", "true");
                InstanceProvider.GetConfigManager().SaveGlobalFile();
                InstanceProvider.GetServiceLogger().AppendLine("Now downloading latest build of Minecraft Bedrock Server. Please wait...");
            }
            using (var httpClient = new HttpClient())
            {
                using (var request = new HttpRequestMessage(HttpMethod.Get, path))
                {
                    using (Stream contentStream = await(await httpClient.SendAsync(request)).Content.ReadAsStreamAsync(), stream = new FileStream(ZipDir, FileMode.Create, FileAccess.Write, FileShare.None, 256000, true))
                    {
                        try
                        {
                            await contentStream.CopyToAsync(stream);
                        }
                        catch (Exception e)
                        {
                            InstanceProvider.GetServiceLogger().AppendLine($"Download zip resulted in error: {e.StackTrace}");
                        }
                        httpClient.Dispose();
                        request.Dispose();
                        contentStream.Dispose();
                    }
                }
            }
        }
Beispiel #3
0
        public void PlayerConnected(string username, string xuid, ServerInfo serverInstance)
        {
            Player playerFound = serverInstance.KnownPlayers.FirstOrDefault(ply => ply.XUID == xuid);

            if (playerFound != null)
            {
                playerFound.LastConnectedTime = DateTime.Now.Ticks.ToString();
                if (playerFound.FirstConnectedTime == null)
                {
                    playerFound.FirstConnectedTime = playerFound.LastConnectedTime;
                }
                InstanceProvider.GetConfigManager().SaveKnownPlayerDatabase(serverInstance);
            }
            else
            {
                playerFound = new Player(xuid, username)
                {
                    FirstConnectedTime = DateTime.Now.Ticks.ToString()
                };
                playerFound.LastConnectedTime = playerFound.FirstConnectedTime;
                serverInstance.KnownPlayers.Add(playerFound);
                InstanceProvider.GetConfigManager().SaveKnownPlayerDatabase(serverInstance);
            }
        }
Beispiel #4
0
        private void IncomingListener()
        {
            keepalive = true;
            InstanceProvider.GetServiceLogger().AppendLine("Established connection! Listening for incoming packets!");
            int AvailBytes = 0;
            int byteCount  = 0;

            while (InstanceProvider.GetClientServiceAlive())
            {
                try
                {
                    byte[] buffer = new byte[4];
                    AvailBytes = client.Client.Available;
                    while (AvailBytes != 0) // Recieve data from client.
                    {
                        byteCount = stream.Read(buffer, 0, 4);
                        int expectedLen = BitConverter.ToInt32(buffer, 0);
                        buffer    = new byte[expectedLen];
                        byteCount = stream.Read(buffer, 0, expectedLen);
                        NetworkMessageSource      msgSource = (NetworkMessageSource)buffer[0];
                        NetworkMessageDestination msgDest   = (NetworkMessageDestination)buffer[1];
                        NetworkMessageTypes       msgType   = (NetworkMessageTypes)buffer[2];
                        NetworkMessageStatus      msgStatus = (NetworkMessageStatus)buffer[3];
                        string   data      = GetOffsetString(buffer);
                        string[] dataSplit = null;
                        switch (msgDest)
                        {
                        case NetworkMessageDestination.Server:

                            JsonParser message;
                            switch (msgType)
                            {
                            case NetworkMessageTypes.PropUpdate:

                                message = JsonParser.Deserialize(data);
                                List <Property> propList = message.Value.ToObject <List <Property> >();
                                Property        prop     = propList.First(p => p.KeyName == "server-name");
                                InstanceProvider.GetBedrockServer(prop.Value).serverInfo.ServerPropList = propList;
                                InstanceProvider.GetConfigManager().SaveServerProps(InstanceProvider.GetBedrockServer(prop.Value).serverInfo, true);
                                InstanceProvider.GetConfigManager().LoadConfigs();
                                InstanceProvider.GetBedrockServer(prop.Value).CurrentServerStatus = BedrockServer.ServerStatus.Stopping;
                                while (InstanceProvider.GetBedrockServer(prop.Value).CurrentServerStatus == BedrockServer.ServerStatus.Stopping)
                                {
                                    Thread.Sleep(100);
                                }
                                InstanceProvider.GetBedrockServer(prop.Value).StartControl(InstanceProvider.GetBedrockService()._hostControl);
                                SendData(NetworkMessageSource.Server, NetworkMessageDestination.Client, NetworkMessageTypes.PropUpdate);

                                break;

                            case NetworkMessageTypes.Restart:

                                RestartServer(data, false);
                                break;

                            case NetworkMessageTypes.Backup:

                                RestartServer(data, true);
                                break;

                            case NetworkMessageTypes.Command:

                                dataSplit = data.Split(';');
                                InstanceProvider.GetBedrockServer(dataSplit[0]).StdInStream.WriteLine(dataSplit[1]);
                                InstanceProvider.GetServiceLogger().AppendLine($"Sent command {dataSplit[1]} to stdInput stream");

                                break;
                            }
                            break;

                        case NetworkMessageDestination.Service:
                            switch (msgType)
                            {
                            case NetworkMessageTypes.Connect:

                                InstanceProvider.GetHostInfo().ServiceLog = InstanceProvider.GetServiceLogger().Log;
                                string jsonString    = JsonParser.Serialize(JsonParser.FromValue(InstanceProvider.GetHostInfo()));
                                byte[] stringAsBytes = GetBytes(jsonString);
                                SendData(stringAsBytes, NetworkMessageSource.Service, NetworkMessageDestination.Client, NetworkMessageTypes.Connect);
                                heartbeatRecieved = false;

                                break;

                            case NetworkMessageTypes.Disconnect:

                                DisconnectClient();

                                break;

                            case NetworkMessageTypes.Heartbeat:

                                if (InstanceProvider.GetHeartbeatThreadAlive())
                                {
                                    heartbeatRecieved = true;
                                }
                                else
                                {
                                    InstanceProvider.InitHeartbeatThread(new ThreadStart(SendBackHeatbeatSignal)).Start();
                                    Thread.Sleep(500);
                                    heartbeatRecieved = true;
                                }

                                break;

                            case NetworkMessageTypes.ConsoleLogUpdate:

                                StringBuilder srvString = new StringBuilder();
                                string[]      split     = data.Split('|');
                                for (int i = 0; i < split.Length; i++)
                                {
                                    dataSplit = split[i].Split(';');
                                    string srvName = dataSplit[0];
                                    int    srvTextLen;
                                    int    clientCurLen;
                                    int    loop;
                                    if (srvName != "Service")
                                    {
                                        ServerLogger srvText = InstanceProvider.GetBedrockServer(srvName).serverInfo.ConsoleBuffer;
                                        srvTextLen   = srvText.Count();
                                        clientCurLen = int.Parse(dataSplit[1]);
                                        loop         = clientCurLen;
                                        while (loop < srvTextLen)
                                        {
                                            srvString.Append($"{srvName};{srvText.FromIndex(loop)};{loop}|");
                                            loop++;
                                        }
                                    }
                                    else
                                    {
                                        ServiceLogger srvText = InstanceProvider.GetServiceLogger();
                                        srvTextLen   = srvText.Count();
                                        clientCurLen = int.Parse(dataSplit[1]);
                                        loop         = clientCurLen;
                                        while (loop < srvTextLen)
                                        {
                                            srvString.Append($"{srvName};{srvText.FromIndex(loop)};{loop}|");
                                            loop++;
                                        }
                                    }
                                }
                                if (srvString.Length > 1)
                                {
                                    srvString.Remove(srvString.Length - 1, 1);
                                    stringAsBytes = GetBytes(srvString.ToString());
                                    SendData(stringAsBytes, NetworkMessageSource.Server, NetworkMessageDestination.Client, NetworkMessageTypes.ConsoleLogUpdate);
                                }
                                break;
                            }
                            break;
                        }
                        AvailBytes = client.Client.Available;
                    }
                    Thread.Sleep(200);
                }
                catch (OutOfMemoryException)
                {
                    InstanceProvider.GetServiceLogger().AppendLine("");
                }
                catch (ObjectDisposedException e)
                {
                    InstanceProvider.GetServiceLogger().AppendLine("Client was disposed! Killing thread...");
                    break;
                }
                catch (ThreadAbortException) { }

                catch (JsonException e)
                {
                    InstanceProvider.GetServiceLogger().AppendLine($"Error parsing json array: {e.Message}");
                    InstanceProvider.GetServiceLogger().AppendLine($"Stacktrace: {e.InnerException}");
                }
                catch (Exception e)
                {
                    //InstanceProvider.GetServiceLogger().AppendLine($"Error: {e.Message} {e.StackTrace}");
                    //InstanceProvider.GetServiceLogger().AppendLine($"Error: {e.Message}: {AvailBytes}, {byteCount}\n{e.StackTrace}");
                }
                AvailBytes = client.Client.Available;
                if (InstanceProvider.GetClientService().ThreadState == ThreadState.Aborted)
                {
                    keepalive = false;
                }
            }
            InstanceProvider.GetServiceLogger().AppendLine("IncomingListener thread exited.");
        }