Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions Intersect.Server/Web/Controllers/Api/V1/GuildController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -369,19 +369,19 @@ public IActionResult GuildVariableSet(Guid guildId, Guid variableId, [FromBody]

var variable = guild.GetVariable(variableDescriptor.Id, true);

var changed = false;
if (variable?.Value != null)
if (variable?.Value == null)
{
if (variable.Value.Value != valueBody.Value)
{
variable.Value.Value = valueBody.Value;
changed = true;
}
return InternalServerError("Variable value storage is missing.");
}

// ReSharper disable once InvertIf
if (changed)
if (!VariableValueHelper.TryConvertValue(variableDescriptor.DataType, valueBody.Value, out object convertedValue, out string error))
{
return BadRequest(error);
}

if (!VariableValueHelper.Equals(variableDescriptor.DataType, variable.Value, convertedValue))
{
variable.Value.Value = convertedValue;
guild.StartCommonEventsWithTriggerForAll(CommonEventTrigger.GuildVariableChange, string.Empty, variableId.ToString());
_ = guild.UpdatedVariables.AddOrUpdate(
variableId,
Expand Down
18 changes: 9 additions & 9 deletions Intersect.Server/Web/Controllers/Api/V1/PlayerController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -693,19 +693,19 @@ public IActionResult PlayerVariableSet(LookupKey lookupKey, Guid variableId, [Fr

var variable = player.GetVariable(variableDescriptor.Id, true);

var changed = false;
if (variable?.Value != null)
if (variable?.Value == null)
{
if (variable.Value.Value != valueBody.Value)
{
variable.Value.Value = valueBody.Value;
changed = true;
}
return InternalServerError("Variable value storage is missing.");
}

if (!VariableValueHelper.TryConvertValue(variableDescriptor.DataType, valueBody.Value, out object convertedValue, out string error))
{
return BadRequest(error);
}

// ReSharper disable once InvertIf
if (changed)
if (!VariableValueHelper.Equals(variableDescriptor.DataType, variable.Value, convertedValue))
{
variable.Value.Value = convertedValue;
player.StartCommonEventsWithTrigger(CommonEventTrigger.PlayerVariableChange, string.Empty, variableId.ToString());
using var context = DbInterface.CreatePlayerContext(false);
_ = context.Update(player);
Expand Down
18 changes: 9 additions & 9 deletions Intersect.Server/Web/Controllers/Api/V1/UserController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -626,19 +626,19 @@ public IActionResult UserVariableSet(LookupKey lookupKey, Guid variableId, [From

var variable = user.GetVariable(variableDescriptor.Id, true);

var changed = false;
if (variable?.Value != null)
if (variable?.Value == null)
{
if (variable.Value.Value != valueBody.Value)
{
variable.Value.Value = valueBody.Value;
changed = true;
}
return InternalServerError("Variable value storage is missing.");
}

if (!VariableValueHelper.TryConvertValue(variableDescriptor.DataType, valueBody.Value, out object convertedValue, out string error))
{
return BadRequest(error);
}

// ReSharper disable once InvertIf
if (changed)
if (!VariableValueHelper.Equals(variableDescriptor.DataType, variable.Value, convertedValue))
{
variable.Value.Value = convertedValue;
user.StartCommonEventsWithTriggerForAll(CommonEventTrigger.UserVariableChange, string.Empty, variableId.ToString());
_ = user.UpdatedVariables.AddOrUpdate(
variableId,
Expand Down
101 changes: 101 additions & 0 deletions Intersect.Server/Web/Controllers/Api/V1/VariableValueHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
using System.Globalization;
using Intersect.Enums;
using Intersect.Framework.Core.GameObjects.Variables;

namespace Intersect.Server.Web.Controllers.Api.V1;

internal static class VariableValueHelper
{
private const string InvalidValueErrorFormat = "Invalid value for variable of type {0}. Received: {1}";

public static bool Equals(VariableDataType dataType, VariableValue variableValue, object? value)
{
if (value == null)
{
return variableValue.Value == null;
}

return dataType switch
{
VariableDataType.Boolean => value is bool booleanValue && variableValue.Boolean == booleanValue,
VariableDataType.Integer => value is long longValue && variableValue.Integer == longValue,
VariableDataType.Number => value is double doubleValue && variableValue.Number.Equals(doubleValue),
VariableDataType.String => value is string stringValue && string.Equals(variableValue.String ?? string.Empty, stringValue, StringComparison.Ordinal),
_ => Equals(variableValue.Value, value),
};
}

public static bool TryConvertValue(
VariableDataType dataType,
object? value,
out object convertedValue,
out string? error
)
{
convertedValue = string.Empty;
error = null;

if (value == null)
{
if (dataType == VariableDataType.String)
{
return true;
}

error = FormatError(dataType, "null");
return false;
}

switch (dataType)
{
case VariableDataType.Boolean:
if (value is bool booleanValue)
{
convertedValue = booleanValue;
return true;
}

error = FormatError(dataType, value?.GetType()?.Name ?? "null");
return false;

case VariableDataType.Integer:
if (long.TryParse(value.ToString(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsedInt))
{
convertedValue = parsedInt;
return true;
}

error = FormatError(dataType, value?.GetType()?.Name ?? "null");
return false;

case VariableDataType.Number:
if (double.TryParse(value.ToString(), NumberStyles.Float, CultureInfo.InvariantCulture, out var parsedDouble))
{
convertedValue = parsedDouble;
return true;
}

error = FormatError(dataType, value?.GetType()?.Name ?? "null");
return false;

case VariableDataType.String:
if (value is string stringValue)
{
convertedValue = stringValue;
return true;
}

error = FormatError(dataType, value?.GetType()?.Name ?? "null");
return false;

default:
error = FormatError(dataType, value?.GetType()?.Name ?? "null");
return false;
}
}

private static string FormatError(VariableDataType dataType, string received)
{
return string.Format(CultureInfo.InvariantCulture, InvalidValueErrorFormat, dataType, received);
}
}
17 changes: 10 additions & 7 deletions Intersect.Server/Web/Controllers/Api/V1/VariablesController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,16 +102,19 @@ public IActionResult ServerVariableSet(Guid variableId, [FromBody] VariableValue
return NotFound($@"No server variable with id '{variableId}'.");
}

var changed = false;
if (variable.Value != null && variable.Value.Value != variableValue.Value)
if (variable.Value == null)
{
variable.Value.Value = variableValue.Value;
changed = true;
return InternalServerError("Variable value storage is missing.");
}

// ReSharper disable once InvertIf
if (changed)
if (!VariableValueHelper.TryConvertValue(variable.DataType, variableValue.Value, out object convertedValue, out string error))
{
return BadRequest(error);
}

if (!VariableValueHelper.Equals(variable.DataType, variable.Value, convertedValue))
{
variable.Value.Value = convertedValue;
Player.StartCommonEventsWithTriggerForAll(
CommonEventTrigger.ServerVariableChange,
"",
Expand All @@ -123,4 +126,4 @@ public IActionResult ServerVariableSet(Guid variableId, [FromBody] VariableValue

return Ok(variable);
}
}
}
Loading