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); } })); }
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)); }
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)); }
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); }
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)); } }
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); } })); }
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); } })); }
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); }
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); }