private static async Task <int> GenerateNewServerSettingsId()
 {
     return(await AmazonDynamoDBFactory.ExecuteInTransactionContext(async (client, context) =>
     {
         Random random = new Random();
         for (int tries = 0; tries < 5; tries++)
         {
             byte[] buf = new byte[4];
             random.NextBytes(buf);
             int generatedId = BitConverter.ToInt32(buf, 0);
             ServerSetting serverSetting = new ServerSetting
             {
                 TableId = TABLE_ID,
                 Id = generatedId
             };
             serverSetting = await context.LoadAsync(serverSetting);
             //QueryResponse response = await GetServerSettingBySpecificProperty("Id", generatedId);
             if (serverSetting == null)
             {
                 return generatedId;
             }
         }
         throw new Exception("Was not able to generate a Unique Id for ServerSetting!");
     }));
 }
 private static async Task CreateRightsForNewServerSettings(ServerSetting serverSettings, User user, string token)
 {
     await AddOrUpdateServerSettingRight("GetServerSettings", serverSettings.Id, user.Uuid, token);
     await AddOrUpdateServerSettingRight("EditServerSettings", serverSettings.Id, user.Uuid, token);
     await AddOrUpdateServerSettingRight("DeleteServerSettings", serverSettings.Id, user.Uuid, token);
     await AddOrUpdateServerSettingRight("UseServerSettings", serverSettings.Id, user.Uuid, token);
 }
        internal async static Task AddServerSettings(WebSocketHandler webSocketHandler)
        {
            Command resonseCommand = await ModifyServerSettings(async() =>
            {
                ServerSetting serverSettings = JsonConvert.DeserializeObject <ServerSetting>(webSocketHandler.ReceivedCommand.CommandData.ToString());
                return(await AddServerSetting(serverSettings, webSocketHandler.User, webSocketHandler.ConnectedUserToken));
            },
                                                                "AddServerSettings",
                                                                webSocketHandler);

            await webSocketHandler.Send(resonseCommand);
        }
        internal async static Task GetServerSettingsById(WebSocketHandler webSocketHandler)
        {
            ServerSetting serverSettings = JsonConvert.DeserializeObject <ServerSetting>(webSocketHandler.ReceivedCommand.CommandData.ToString());
            Command       resonseCommand = await GetServerSettings(async() =>
            {
                return(await GetServerSettingsByIdAndUser(webSocketHandler.User, serverSettings.Id));
            },
                                                                   "GetServerSettings",
                                                                   webSocketHandler,
                                                                   serverSettings.Id);

            await webSocketHandler.Send(resonseCommand);
        }
        private static async Task <ModifySettingsResponse> EditServerSetting(ServerSetting serverSettings, User user, string token)
        {
            ServerSetting dbServerSetting = await AmazonDynamoDBFactory.ExecuteInTransactionContext(async (client, context) =>
            {
                serverSettings.TableId = TABLE_ID;
                return(await context.LoadAsync(serverSettings));
            });

            return(await AmazonDynamoDBFactory.ExecuteInTransactionContext(async (client, context) =>
            {
                try
                {
                    if (dbServerSetting == null)
                    {
                        return new ModifySettingsResponse(ModifySettingsResult.SETTING_NOT_FOUND);
                    }
                    if (SDaysTDieServerHandler.IsServerRunningBySeed(dbServerSetting.WorldGenSeed))
                    {
                        return new ModifySettingsResponse(ModifySettingsResult.SERVER_MUST_BE_STOPPED);
                    }
                    QueryResponse response = await GetServerSettingBySpecificProperty("WorldGenSeed", serverSettings.WorldGenSeed);
                    if (response.Items.Count > 0 && Convert.ToInt32(response.Items[0]["Id"].N.ToString()) != dbServerSetting.Id)
                    {
                        return new ModifySettingsResponse(ModifySettingsResult.GAME_SEED_ALREADY_EXISTS);
                    }
                    string oldUserId = dbServerSetting.UserUuid;
                    GetUsersResponse getUsersResponse = await BesteUser.GetUser(JsonConvert.SerializeObject(user, Formatting.None, new JsonSerializerSettings {
                        NullValueHandling = NullValueHandling.Ignore
                    }));
                    if (getUsersResponse.Result != GetUsersResult.SUCCESS)
                    {
                        return new ModifySettingsResponse(ModifySettingsResult.USER_NOT_FOUND);
                    }
                    User dbUser = getUsersResponse.Users[0];
                    serverSettings.UserUuid = dbUser.Uuid;
                    serverSettings.CopyAllButId(dbServerSetting);
                    if (oldUserId != getUsersResponse.Users[0].Uuid)
                    {
                        await AddOrUpdateServerSettingRight("EditServerSettings", serverSettings.Id, dbUser.Uuid, token);
                    }
                    await context.SaveAsync(dbServerSetting);
                    return new ModifySettingsResponse(ModifySettingsResult.SETTING_EDITED);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString() + "\n" + ex.StackTrace);
                    return new ModifySettingsResponse(ModifySettingsResult.EXCEPTION);
                }
            }));
        }
예제 #6
0
 public virtual void CopyAllButId(ServerSetting target)
 {
     target.ServerName            = ServerName;
     target.ServerDescription     = ServerDescription;
     target.ServerPassword        = ServerPassword;
     target.ServerPort            = ServerPort;
     target.TelnetPort            = TelnetPort;
     target.TelnetPassword        = TelnetPassword;
     target.TerminalWindowEnabled = TerminalWindowEnabled;
     target.GameWorld             = GameWorld;
     target.WorldGenSeed          = WorldGenSeed;
     target.GameName = GameName;
     target.UserUuid = UserUuid;
 }
        private static async Task <GetSettingsResponse> GetServerSettingsOfUser(User user)
        {
            QueryResponse response = await GetServerSettingBySpecificProperty("UserUuid", user.Uuid);

            List <ServerSetting> serverSettings = new List <ServerSetting>();

            response.Items.ForEach(item =>
            {
                ServerSetting serverSetting = ServerSetting.FromDynamoDbDictionary(item);
                serverSetting.IsRunning     = SDaysTDieServerHandler.IsServerRunningBySeed(serverSetting.WorldGenSeed);
                serverSettings.Add(serverSetting);
            });
            return(new GetSettingsResponse(GetSettingsResult.OK, serverSettings));
        }
예제 #8
0
 public virtual void FromServerSetting(ServerSetting source)
 {
     ServerName            = source.ServerName;
     ServerDescription     = source.ServerDescription;
     ServerPassword        = source.ServerPassword;
     ServerPort            = source.ServerPort;
     TelnetPort            = source.TelnetPort;
     TelnetPassword        = source.TelnetPassword;
     TerminalWindowEnabled = source.TerminalWindowEnabled;
     GameWorld             = (GameWorld)Enum.Parse(typeof(GameWorld), source.GameWorld);
     WorldGenSeed          = source.WorldGenSeed;
     GameName = source.GameName;
     UserUuid = source.UserUuid;
     GameMod  = source.GameMod;
 }
        internal static async Task <GetSettingsResponse> GetServerSettingsByIdAndUser(User user, int serverSettingId)
        {
            ServerSetting dbServerSetting = await AmazonDynamoDBFactory.ExecuteInTransactionContext(async (client, context) =>
            {
                ServerSetting serverSetting = new ServerSetting
                {
                    TableId = TABLE_ID,
                    Id      = serverSettingId
                };
                return(await context.LoadAsync(serverSetting));
            });

            List <ServerSetting> serverSettings = new List <ServerSetting> {
                dbServerSetting
            };

            return(new GetSettingsResponse(GetSettingsResult.OK, serverSettings));
        }
예제 #10
0
        internal async static Task <StopServerResponse> TryStopServer(ServerSetting serverSetting)
        {
            StopServerResponse response = null;
            KeyValuePair <string, SDaysTDieServer> keyValuePair = SDaysTDieServersByUserIds.FirstOrDefault(x => x.Value.ServerSettings.WorldGenSeed == serverSetting.WorldGenSeed);
            SDaysTDieServer  sDaysTDieServer  = keyValuePair.Value;
            StopServerResult stopServerResult = StopServerResult.STOPPING;

            void SDaysTDieServer_OnSDaysTDieServerStoppedHandler(SDaysTDieServer sender, SDaysTDieServer.OnSDaysTDieServerStoppedEventArgs e)
            {
                if (e.Message == "*** Shutdown successful ***" || e.Message == "*** Server already down! ***")
                {
                    stopServerResult = StopServerResult.SERVER_STOPPED;
                }
                else if (e.Message == "*** Shutdown done with killing process ***")
                {
                    stopServerResult = StopServerResult.SERVER_KILLED;
                }
            }

            sDaysTDieServer.OnSDaysTDieServerStoppedHandler += SDaysTDieServer_OnSDaysTDieServerStoppedHandler;
            keyValuePair.Value.Stop();

            async Task <StopServerResponse> CheckServerStopped()
            {
                for (int tryShutDownCounter = 40; tryShutDownCounter > 0; tryShutDownCounter--)
                {
                    if (stopServerResult != StopServerResult.STOPPING)
                    {
                        SDaysTDieServersByUserIds.Remove(keyValuePair.Key);
                        return(new StopServerResponse(stopServerResult));
                    }
                    await Task.Delay(1000);
                }
                return(new StopServerResponse(StopServerResult.FAILED_UNKNOWN_REASON));
            }

            response = await CheckServerStopped();

            sDaysTDieServer.OnSDaysTDieServerStoppedHandler -= SDaysTDieServer_OnSDaysTDieServerStoppedHandler;

            return(response);
        }
예제 #11
0
        private static ConnectTelnetResponse TryConnectTelnet(WebSocketHandler webSocketHandler)
        {
            ServerSetting serverSetting = JsonConvert.DeserializeObject <ServerSetting>(webSocketHandler.ReceivedCommand.CommandData.ToString());

            if (HasUserStartServerAndUseSettingsRights(webSocketHandler, serverSetting) == false)
            {
                return(new ConnectTelnetResponse(ConnectTelnetResult.RIGHT_VIOLATION));
            }

            if (IsServerOfSettingsRunning(serverSetting))
            {
                SDaysTDieServer sDaysTDieServer = SDaysTDieServersByUserIds[serverSetting.UserUuid];
                sDaysTDieServer.ConnectWebsocketHandler(webSocketHandler);
                return(new ConnectTelnetResponse(ConnectTelnetResult.OK));
            }
            else
            {
                return(new ConnectTelnetResponse(ConnectTelnetResult.SERVER_NOT_RUNNING));
            }
        }
예제 #12
0
        private static async Task <StartServerResponse> TryStartServer(WebSocketHandler webSocketHandler)
        {
            StartServerResponse response      = null;
            ServerSetting       serverSetting = JsonConvert.DeserializeObject <ServerSetting>(webSocketHandler.ReceivedCommand.CommandData.ToString());

            if (!HasUserStartServerAndUseSettingsRights(webSocketHandler, serverSetting))
            {
                return(new StartServerResponse(StartServerResult.RIGHT_VIOLATION));
            }

            GetSettingsResponse getSettingsResponse = await ServerSettingsHandler.GetServerSettingsByIdAndUser(webSocketHandler, webSocketHandler.User, serverSetting.Id);

            if (getSettingsResponse.Result != GetSettingsResult.OK)
            {
                return(ExtractNotOKGetSettingsResult(response, getSettingsResponse));
            }
            else
            {
                return(StartServerBySettingsResponse(getSettingsResponse));
            }
        }
        private static async Task <ModifySettingsResponse> AddServerSetting(ServerSetting serverSettings, User user, string token)
        {
            return(await AmazonDynamoDBFactory.ExecuteInTransactionContext(async (client, context) =>
            {
                try
                {
                    QueryResponse response = await GetServerSettingBySpecificProperty("WorldGenSeed", serverSettings.WorldGenSeed);
                    if (response.Items.Count > 0)
                    {
                        return new ModifySettingsResponse(ModifySettingsResult.GAME_SEED_ALREADY_EXISTS);
                    }
                    GetUsersResponse getUsersResponse = await BesteUser.GetUser(JsonConvert.SerializeObject(user, Formatting.None, new JsonSerializerSettings {
                        NullValueHandling = NullValueHandling.Ignore
                    }));
                    if (getUsersResponse.Result != GetUsersResult.SUCCESS)
                    {
                        return new ModifySettingsResponse(ModifySettingsResult.USER_NOT_FOUND);
                    }
                    serverSettings.TableId = TABLE_ID;
                    serverSettings.UserUuid = getUsersResponse.Users[0].Uuid;
                    serverSettings.ServerConfigFilepath = "";
                    serverSettings.ServerPort = 0;
                    serverSettings.TelnetPassword = "";
                    serverSettings.TelnetPort = 0;
                    serverSettings.TerminalWindowEnabled = false;
                    serverSettings.Id = await GenerateNewServerSettingsId();

                    await CreateRightsForNewServerSettings(serverSettings, user, token);

                    await context.SaveAsync(serverSettings);
                    return new ModifySettingsResponse(ModifySettingsResult.SETTING_ADDED);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString() + "\n" + ex.StackTrace);
                    return new ModifySettingsResponse(ModifySettingsResult.EXCEPTION);
                }
            }));
        }
예제 #14
0
        internal async static Task StopServer(WebSocketHandler webSocketHandler)
        {
            ServerSetting serverSetting = JsonConvert.DeserializeObject <ServerSetting>(webSocketHandler.ReceivedCommand.CommandData.ToString());

            StopServerResponse response = null;

            if (!IsServerOfSettingsRunning(serverSetting))
            {
                response = new StopServerResponse(StopServerResult.SERVER_NOT_RUNNING);
            }
            else if (!HasUserStartServerAndUseSettingsRights(webSocketHandler, serverSetting))
            {
                response = new StopServerResponse(StopServerResult.RIGHT_VIOLATION);
            }
            else
            {
                response = await TryStopServer(serverSetting);
            }

            Command command = new Command("StopServerResponse", response);
            await webSocketHandler.Send(command);
        }
        private static async Task <ModifySettingsResponse> DeleteServerSetting(ServerSetting serverSettings, User user, string connectedUserToken)
        {
            ServerSetting dbServerSetting = await AmazonDynamoDBFactory.ExecuteInTransactionContext(async (client, context) =>
            {
                serverSettings.TableId = TABLE_ID;
                return(await context.LoadAsync(serverSettings));
            });

            return(await AmazonDynamoDBFactory.ExecuteInTransactionContext(async (client, context) =>
            {
                try
                {
                    if (dbServerSetting == null)
                    {
                        return new ModifySettingsResponse(ModifySettingsResult.SETTING_NOT_FOUND);
                    }
                    if (SDaysTDieServerHandler.IsServerRunningBySeed(dbServerSetting.WorldGenSeed))
                    {
                        return new ModifySettingsResponse(ModifySettingsResult.SERVER_MUST_BE_STOPPED);
                    }
                    await AmazonDynamoDBFactory.ExecuteInTransactionContext(async(clientDelete, contextDelete) =>
                    {
                        await contextDelete.DeleteAsync(dbServerSetting);
                    });
                    await AmazonDynamoDBFactory.ExecuteInTransactionContext(async(clientDelete, contextDelete) =>
                    {
                        await DeleteAllRightsByServerSettingId(dbServerSetting.Id);
                    });
                    return new ModifySettingsResponse(ModifySettingsResult.SETTING_DELETED);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString() + "\n" + ex.StackTrace);
                    return new ModifySettingsResponse(ModifySettingsResult.EXCEPTION);
                }
            }));
        }
예제 #16
0
        private static bool IsServerOfSettingsRunning(ServerSetting serverSettings)
        {
            KeyValuePair <string, SDaysTDieServer> keyValuePair = SDaysTDieServersByUserIds.FirstOrDefault(x => x.Value.ServerSettings.WorldGenSeed == serverSettings.WorldGenSeed);

            return(keyValuePair.Key != "" && keyValuePair.Key != null);
        }
예제 #17
0
        private static bool HasUserStartServerAndUseSettingsRights(WebSocketHandler webSocketHandler, ServerSetting serverSetting)
        {
            if (!ServerSettingsHandler.RightControl.IsGranted(webSocketHandler.ConnectedUserToken, "UseServerSettings", "ServerSetting", serverSetting.Id) &&
                !ServerSettingsHandler.RightControl.IsGranted(webSocketHandler.ConnectedUserToken, "UseServerSettings", "ServerSetting"))
            {
                return(false);
            }

            if (!RightControl.IsGranted(webSocketHandler.ConnectedUserToken, "StartServer", "ServerHandler", null))
            {
                return(false);
            }

            return(true);
        }