Add support for new chat colors (#379)
* Add backwards-compatible support for new chat color system * Use default * Set LangVersion properly * Add backwards compatible ctors in TorchChatMessage * Fix not setting Font if it's not MyFontEnum * Use correct color mappings
This commit is contained in:
@@ -6,9 +6,12 @@ using System.Threading.Tasks;
|
||||
using Sandbox.Engine.Multiplayer;
|
||||
using Sandbox.Game.Gui;
|
||||
using Sandbox.Game.Multiplayer;
|
||||
using Torch.Utils;
|
||||
using VRage.Game;
|
||||
using VRage.Network;
|
||||
using VRage.Replication;
|
||||
using VRageMath;
|
||||
using VRageRender;
|
||||
|
||||
namespace Torch.API.Managers
|
||||
{
|
||||
@@ -17,13 +20,31 @@ namespace Torch.API.Managers
|
||||
/// </summary>
|
||||
public struct TorchChatMessage
|
||||
{
|
||||
private const string DEFAULT_FONT = MyFontEnum.Blue;
|
||||
|
||||
#region Backwards compatibility
|
||||
|
||||
[Obsolete]
|
||||
public TorchChatMessage(string author, string message, string font = DEFAULT_FONT)
|
||||
: this(author, message, default, font) { }
|
||||
|
||||
[Obsolete]
|
||||
public TorchChatMessage(string author, ulong authorSteamId, string message, ChatChannel channel, long target, string font = DEFAULT_FONT)
|
||||
: this(author, authorSteamId, message, channel, target, default, font) { }
|
||||
|
||||
[Obsolete]
|
||||
public TorchChatMessage(ulong authorSteamId, string message, ChatChannel channel, long target, string font = DEFAULT_FONT)
|
||||
: this(authorSteamId, message, channel, target, default, font) { }
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new torch chat message with the given author and message.
|
||||
/// </summary>
|
||||
/// <param name="author">Author's name</param>
|
||||
/// <param name="message">Message</param>
|
||||
/// <param name="font">Font</param>
|
||||
public TorchChatMessage(string author, string message, string font = MyFontEnum.Blue)
|
||||
public TorchChatMessage(string author, string message, Color color, string font = DEFAULT_FONT)
|
||||
{
|
||||
Timestamp = DateTime.Now;
|
||||
AuthorSteamId = null;
|
||||
@@ -32,6 +53,7 @@ namespace Torch.API.Managers
|
||||
Channel = ChatChannel.Global;
|
||||
Target = 0;
|
||||
Font = font;
|
||||
Color = color == default ? ColorUtils.TranslateColor(font) : color;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -41,7 +63,7 @@ namespace Torch.API.Managers
|
||||
/// <param name="authorSteamId">Author's steam ID</param>
|
||||
/// <param name="message">Message</param>
|
||||
/// <param name="font">Font</param>
|
||||
public TorchChatMessage(string author, ulong authorSteamId, string message, ChatChannel channel, long target, string font = MyFontEnum.Blue)
|
||||
public TorchChatMessage(string author, ulong authorSteamId, string message, ChatChannel channel, long target, Color color, string font = DEFAULT_FONT)
|
||||
{
|
||||
Timestamp = DateTime.Now;
|
||||
AuthorSteamId = authorSteamId;
|
||||
@@ -50,6 +72,7 @@ namespace Torch.API.Managers
|
||||
Channel = channel;
|
||||
Target = target;
|
||||
Font = font;
|
||||
Color = color == default ? ColorUtils.TranslateColor(font) : color;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -58,7 +81,7 @@ namespace Torch.API.Managers
|
||||
/// <param name="authorSteamId">Author's steam ID</param>
|
||||
/// <param name="message">Message</param>
|
||||
/// <param name="font">Font</param>
|
||||
public TorchChatMessage(ulong authorSteamId, string message, ChatChannel channel, long target, string font = MyFontEnum.Blue)
|
||||
public TorchChatMessage(ulong authorSteamId, string message, ChatChannel channel, long target, Color color, string font = DEFAULT_FONT)
|
||||
{
|
||||
Timestamp = DateTime.Now;
|
||||
AuthorSteamId = authorSteamId;
|
||||
@@ -67,6 +90,7 @@ namespace Torch.API.Managers
|
||||
Channel = channel;
|
||||
Target = target;
|
||||
Font = font;
|
||||
Color = color == default ? ColorUtils.TranslateColor(font) : color;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -97,6 +121,10 @@ namespace Torch.API.Managers
|
||||
/// The font, or null if default.
|
||||
/// </summary>
|
||||
public readonly string Font;
|
||||
/// <summary>
|
||||
/// The chat message color.
|
||||
/// </summary>
|
||||
public readonly Color Color;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@@ -4,7 +4,9 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VRage.Collections;
|
||||
using VRage.Game;
|
||||
using VRage.Network;
|
||||
using VRageMath;
|
||||
|
||||
namespace Torch.API.Managers
|
||||
{
|
||||
@@ -34,14 +36,18 @@ namespace Torch.API.Managers
|
||||
void SendMessageAsOther(ulong authorId, string message, ulong targetSteamId = 0);
|
||||
|
||||
|
||||
[Obsolete("Use the other overload with a Color parameter.")]
|
||||
void SendMessageAsOther(string author, string message, string font, ulong targetSteamId = 0);
|
||||
|
||||
/// <summary>
|
||||
/// Sends a scripted message with the given author and message to the given player, or all players by default.
|
||||
/// </summary>
|
||||
/// <param name="author">Author name</param>
|
||||
/// <param name="message">The message to send</param>
|
||||
/// <param name="color">Name color</param>
|
||||
/// <param name="font">Font to use</param>
|
||||
/// <param name="targetSteamId">Player to send the message to, or everyone by default</param>
|
||||
void SendMessageAsOther(string author, string message, string font, ulong targetSteamId = 0);
|
||||
void SendMessageAsOther(string author, string message, Color color = default, ulong targetSteamId = 0, string font = MyFontEnum.White);
|
||||
|
||||
/// <summary>
|
||||
/// Mute user from global chat.
|
||||
|
@@ -12,6 +12,7 @@
|
||||
<TargetFrameworkProfile />
|
||||
<NuGetPackageImportStamp>
|
||||
</NuGetPackageImportStamp>
|
||||
<LangVersion>7.3</LangVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
@@ -193,6 +194,8 @@
|
||||
<Compile Include="Session\ITorchSessionManager.cs" />
|
||||
<Compile Include="Session\TorchSessionState.cs" />
|
||||
<Compile Include="TorchGameState.cs" />
|
||||
<Compile Include="Utils\ColorUtils.cs" />
|
||||
<Compile Include="Utils\StringUtils.cs" />
|
||||
<Compile Include="WebAPI\JenkinsQuery.cs" />
|
||||
<Compile Include="WebAPI\PluginQuery.cs" />
|
||||
</ItemGroup>
|
||||
@@ -202,7 +205,6 @@
|
||||
<ItemGroup>
|
||||
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(SolutionDir)\TransformOnBuild.targets" />
|
||||
</Project>
|
40
Torch.API/Utils/ColorUtils.cs
Normal file
40
Torch.API/Utils/ColorUtils.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using System.Windows.Media;
|
||||
using VRage.Game;
|
||||
using Color = VRageMath.Color;
|
||||
|
||||
namespace Torch.Utils
|
||||
{
|
||||
public static class ColorUtils
|
||||
{
|
||||
/// <summary>
|
||||
/// Convert the old "font" or a RGB hex code to a Color.
|
||||
/// </summary>
|
||||
public static Color TranslateColor(string font)
|
||||
{
|
||||
if (StringUtils.IsFontEnum(font))
|
||||
{
|
||||
// RGB values copied from Fonts.sbc
|
||||
switch (font)
|
||||
{
|
||||
case MyFontEnum.Blue:
|
||||
return new Color(220, 244, 252);
|
||||
case MyFontEnum.Red:
|
||||
return new Color(227, 65, 65);
|
||||
case MyFontEnum.Green:
|
||||
return new Color(101, 182, 193);
|
||||
case MyFontEnum.DarkBlue:
|
||||
return new Color(94, 115, 127);
|
||||
default:
|
||||
return Color.White;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// VRage color doesn't have its own hex code parser and I don't want to write one
|
||||
var conv = (System.Windows.Media.Color)(ColorConverter.ConvertFromString(font) ??
|
||||
System.Windows.Media.Color.FromRgb(255, 255, 255));
|
||||
return new Color(conv.R, conv.G, conv.B);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
73
Torch.API/Utils/StringUtils.cs
Normal file
73
Torch.API/Utils/StringUtils.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Torch.Utils
|
||||
{
|
||||
/// <summary>
|
||||
/// Utility methods for strings
|
||||
/// </summary>
|
||||
public static class StringUtils
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines a common prefix for the given set of strings
|
||||
/// </summary>
|
||||
/// <param name="set">Set of strings</param>
|
||||
/// <returns>Common prefix</returns>
|
||||
public static string CommonPrefix(IEnumerable<string> set)
|
||||
{
|
||||
StringBuilder builder = null;
|
||||
foreach (string other in set)
|
||||
{
|
||||
if (builder == null)
|
||||
builder = new StringBuilder(other);
|
||||
if (builder.Length > other.Length)
|
||||
builder.Remove(other.Length, builder.Length - other.Length);
|
||||
for (var i = 0; i < builder.Length; i++)
|
||||
if (builder[i] != other[i])
|
||||
{
|
||||
builder.Remove(i, builder.Length - i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return builder?.ToString() ?? "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines a common suffix for the given set of strings
|
||||
/// </summary>
|
||||
/// <param name="set">Set of strings</param>
|
||||
/// <returns>Common suffix</returns>
|
||||
public static string CommonSuffix(IEnumerable<string> set)
|
||||
{
|
||||
StringBuilder builder = null;
|
||||
foreach (string other in set)
|
||||
{
|
||||
if (builder == null)
|
||||
builder = new StringBuilder(other);
|
||||
if (builder.Length > other.Length)
|
||||
builder.Remove(0, builder.Length - other.Length);
|
||||
for (var i = 0; i < builder.Length; i++)
|
||||
{
|
||||
if (builder[builder.Length - 1 - i] != other[other.Length - 1 - i])
|
||||
{
|
||||
builder.Remove(0, builder.Length - i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return builder?.ToString() ?? "";
|
||||
}
|
||||
|
||||
private static string[] FontEnumValues => _fontEnumValues ?? (_fontEnumValues = typeof(VRage.Game.MyFontEnum).GetFields(BindingFlags.Public | BindingFlags.Static).Where(x => x.IsLiteral && !x.IsInitOnly).Select(x => (string)x.GetValue(null)).ToArray());
|
||||
|
||||
private static string[] _fontEnumValues;
|
||||
public static bool IsFontEnum(string str)
|
||||
{
|
||||
return FontEnumValues.Contains(str);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user