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
89 changes: 63 additions & 26 deletions Rocket/Rocket.API/Collections/TranslationList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ namespace Rocket.API.Collections
{
[Serializable]
[XmlType(AnonymousType = false, IncludeInSchema = true, TypeName = "Translation")]


public class TranslationListEntry
{
[XmlAttribute]
Expand All @@ -23,6 +25,12 @@ public TranslationListEntry(string id, string value)
public TranslationListEntry() { }
}







public static class TranslationListExtension{
public static void AddUnknownEntries(this TranslationList defaultTranslations, IAsset<TranslationList> translations)
{
Expand All @@ -42,35 +50,45 @@ public static void AddUnknownEntries(this TranslationList defaultTranslations, I
[XmlRoot("Translations")]
[XmlType(AnonymousType = false, IncludeInSchema = true, TypeName = "Translation")]
[Serializable]
public class TranslationList : IDefaultable, IEnumerable<TranslationListEntry>


public class TranslationList : IDefaultable, ICollection<TranslationListEntry>
{
public TranslationList() { }

protected List<TranslationListEntry> translations = new List<TranslationListEntry>();

public IEnumerator<TranslationListEntry> GetEnumerator()
{
return translations.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
public int Count => translations.Count;

public bool IsReadOnly => false;

public string Translate(string translationKey, params object[] placeholder)
{
return translations.GetEnumerator();
}
string value = this[translationKey];
if (String.IsNullOrEmpty(value)) return translationKey;

if (value.Contains("{") && value.Contains("}") && placeholder != null && placeholder.Length != 0)
{
for (int i = 0; i < placeholder.Length; i++)
{
if (placeholder[i] == null) placeholder[i] = "NULL";
}
value = String.Format(value, placeholder);
}
return value;
}
public void Add(Object o)
{
translations.Add((TranslationListEntry)o);
}

public void Add(string key, string value)
{
translations.Add(new TranslationListEntry(key, value));
}

public void AddRange(IEnumerable<TranslationListEntry> collection)
{
translations.AddRange(collection);
}

public void AddRange(TranslationList collection)
{
translations.AddRange(collection.translations);
Expand All @@ -87,26 +105,45 @@ public string this[string key]
translations.ForEach(k => { if (k.Id == key) k.Value = value; });
}
}
public virtual void LoadDefaults()
{

public string Translate(string translationKey, params object[] placeholder)
}
public IEnumerator<TranslationListEntry> GetEnumerator()
{
string value = this[translationKey];
if (String.IsNullOrEmpty(value)) return translationKey;

if (value.Contains("{") && value.Contains("}") && placeholder != null && placeholder.Length != 0)
{
for (int i = 0; i < placeholder.Length; i++)
{
if (placeholder[i] == null) placeholder[i] = "NULL";
}
value = String.Format(value, placeholder);
}
return value;
return translations.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return translations.GetEnumerator();
}

public virtual void LoadDefaults()
public void Add(TranslationListEntry item)
{
translations.Add(item);
}

public void Clear()
{
translations.Clear();
}

public bool Contains(TranslationListEntry item)
{

return translations.Contains(item);
}

public void CopyTo(TranslationListEntry[] array, int arrayIndex)
{
translations.CopyTo(array, arrayIndex);
}

public bool Remove(TranslationListEntry item)
{
return translations.Remove(item);
}
}



}
79 changes: 79 additions & 0 deletions Rocket/Rocket.Core/Assets/JsonFileAsset.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
using Rocket.Core.Assets;
using System;
using System.IO;
using Rocket.API;
using System.Xml.Serialization;
using SDG.Framework.IO.Serialization;
using Newtonsoft.Json;
using SDG.Framework.IO.Deserialization;

namespace Rocket.Core.Assets
{
public class JsonFileAsset<T> : Asset<T> where T : class, IDefaultable
{
private JSONDeserializer deserializer;
private string file;
T defaultInstance;

public JsonFileAsset(string file, Type[] extraTypes = null, T defaultInstance = null)
{

this.deserializer = new JSONDeserializer();
this.file = file;
this.defaultInstance = defaultInstance;
Load();
}

public override T Save()
{

try
{
string directory = Path.GetDirectoryName(file);
if (!String.IsNullOrEmpty(directory) && !Directory.Exists(directory)) Directory.CreateDirectory(directory);


if (instance == null)
{
if (defaultInstance == null)
{
instance = Activator.CreateInstance<T>();
instance.LoadDefaults();
}
else
{
instance = defaultInstance;
}
}
File.WriteAllText(file,JsonConvert.SerializeObject(instance, Formatting.Indented));
return instance;

}
catch (Exception ex)
{
throw new Exception(String.Format("Failed to serialize JSONFileAsset: {0}", file), ex);
}
}

public override void Load(AssetLoaded<T> callback = null)
{
try
{
if (!String.IsNullOrEmpty(file) && File.Exists(file))
{
instance = deserializer.deserialize<T>(file);
}

Save();

if (callback != null)
callback(this);
}
catch (Exception ex)
{
throw new Exception(String.Format("Failed to deserialize JSONFileAsset: {0}", file), ex);
}
}

}
}
6 changes: 3 additions & 3 deletions Rocket/Rocket.Core/Environment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ public static void Initialize()
public static readonly string LogBackupFile = "Rocket.{0}.log";
public static readonly string PermissionFile = "Permissions.config.xml";
public static readonly string CommandsFile = "Commands.config.xml";


public static readonly string PluginTranslationFileTemplate = "{0}.{1}.translation.xml";
public static readonly string PluginConfigurationFileTemplate = "{0}.configuration.xml";

public static readonly string PluginTranslationFileTemplate = "{0}.{1}.translation.{2}";
public static readonly string PluginConfigurationFileTemplate = "{0}.configuration.{1}";

public static readonly string WebConfigurationTemplate = "{0}?configuration={1}&instance={2}";
}
Expand Down
31 changes: 31 additions & 0 deletions Rocket/Rocket.Core/Extensions/JsonExtension.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using Newtonsoft.Json;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Rocket.Core.Extensions
{
public class JsonExtension : JsonConverter
{
private readonly string _comment;
public JsonExtension(string comment)
{
_comment = comment;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(value);
writer.WriteComment(_comment); // append comment
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType) => true;
public override bool CanRead => false;
}
}
61 changes: 48 additions & 13 deletions Rocket/Rocket.Core/Plugins/RocketPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Rocket.Core.Extensions;
using Rocket.Core.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
Expand All @@ -19,13 +20,13 @@ public class RocketPlugin<RocketPluginConfiguration> : RocketPlugin, IRocketPlug

public RocketPlugin() : base()
{
string configurationFile = Path.Combine(Directory, string.Format(Core.Environment.PluginConfigurationFileTemplate, Name));
string configurationFile = Path.Combine(Directory, string.Format(Core.Environment.PluginConfigurationFileTemplate, Name, Core.R.Settings.Instance.UseJsonForPlugins ? "json":"xml"));

string url = "";

if (Core.R.Settings.Instance.WebConfigurations.Enabled) {
url = string.Format(Environment.WebConfigurationTemplate, Core.R.Settings.Instance.WebConfigurations.Url, Name, R.Implementation.InstanceId);
}else if (File.Exists(configurationFile)) {
}else if (File.Exists(configurationFile)) {
url = File.ReadAllLines(configurationFile).First().Trim();
}

Expand All @@ -36,7 +37,20 @@ public RocketPlugin() : base()
}
else
{
configuration = new XMLFileAsset<RocketPluginConfiguration>(configurationFile);
if(!Core.R.Settings.Instance.UseJsonForPlugins)
{
configuration = new XMLFileAsset<RocketPluginConfiguration>(configurationFile);
}
else
{
configuration = new JsonFileAsset<RocketPluginConfiguration>(configurationFile);
}






}
}

Expand All @@ -54,8 +68,22 @@ public class RocketPlugin : MonoBehaviour, IRocketPlugin
public delegate void PluginLoading(IRocketPlugin plugin, ref bool cancelLoading);
public static event PluginLoading OnPluginLoading;

private XMLFileAsset<TranslationList> translations;
public IAsset<TranslationList> Translations { get { return translations; } }

private XMLFileAsset<TranslationList> translationsXml;



private JsonFileAsset<TranslationList> translationsJson;

public IAsset<TranslationList> Translations { get
{
if(Core.R.Settings.Instance.UseJsonForPlugins)
return translationsJson;
else
return translationsXml;
}
}


private PluginState state = PluginState.Unloaded;
public PluginState State
Expand Down Expand Up @@ -88,8 +116,14 @@ public RocketPlugin()

if (DefaultTranslations != null | DefaultTranslations.Count() != 0)
{
translations = new XMLFileAsset<TranslationList>(Path.Combine(Directory,String.Format(Environment.PluginTranslationFileTemplate, Name, R.Settings.Instance.LanguageCode)), new Type[] { typeof(TranslationList), typeof(TranslationListEntry) }, DefaultTranslations);
DefaultTranslations.AddUnknownEntries(translations);
if(!Core.R.Settings.Instance.UseJsonForPlugins)
translationsXml = new XMLFileAsset<TranslationList>(Path.Combine(Directory,String.Format(Environment.PluginTranslationFileTemplate, Name, R.Settings.Instance.LanguageCode, Core.R.Settings.Instance.UseJsonForPlugins ? "json" : "xml")), new Type[] { typeof(TranslationList), typeof(TranslationListEntry) }, DefaultTranslations);
else
translationsJson = new JsonFileAsset<TranslationList>(Path.Combine(Directory, String.Format(Environment.PluginTranslationFileTemplate, Name, R.Settings.Instance.LanguageCode, Core.R.Settings.Instance.UseJsonForPlugins ? "json" : "xml")), new Type[] { typeof(TranslationList),typeof(TranslationListEntry)}, DefaultTranslations);



DefaultTranslations.AddUnknownEntries(Translations);
}
}

Expand All @@ -98,11 +132,11 @@ public static bool IsDependencyLoaded(string plugin)
return Rocket.Core.R.Plugins.GetPlugin(plugin) != null;
}

public delegate void ExecuteDependencyCodeDelegate(IRocketPlugin plugin);
public delegate void ExecuteDependencyCodeDelegate(IRocketPlugin plugin);
public static void ExecuteDependencyCode(string plugin,ExecuteDependencyCodeDelegate a)
{
IRocketPlugin p = Rocket.Core.R.Plugins.GetPlugin(plugin);
if (p != null)
if (p != null)
a(p);
}

Expand All @@ -120,7 +154,7 @@ public void ReloadPlugin()
public virtual void LoadPlugin()
{
Logging.Logger.Log("\n[loading] " + Name, ConsoleColor.Cyan);
translations.Load();
Translations.Load();
R.Commands.RegisterFromAssembly(Assembly);

try
Expand All @@ -140,7 +174,7 @@ public virtual void LoadPlugin()
Logging.Logger.LogError("Failed to unload " + Name + ":" + ex1.ToString());
}
}

bool cancelLoading = false;
if (OnPluginLoading != null)
{
Expand Down Expand Up @@ -210,4 +244,5 @@ public void TryRemoveComponent<T>() where T : Component
gameObject.TryRemoveComponent<T>();
}
}
}

}
Loading