From 76632b45439f088d6728603f511163a43010e494 Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 19 Jun 2025 19:20:21 -0400 Subject: [PATCH] conversion is now a formula --- Behavior/UnitConvert.cs | 4 +- Conversion/ConversionConfig.cs | 9 +- Conversion/Converter.cs | 33 +++--- .../DiscordInterface/DiscordInterface.cs | 2 +- assets/conversion.json | 101 +++++++++--------- vassago.csproj | 1 + 6 files changed, 81 insertions(+), 69 deletions(-) diff --git a/Behavior/UnitConvert.cs b/Behavior/UnitConvert.cs index 48fa654..d1e2188 100644 --- a/Behavior/UnitConvert.cs +++ b/Behavior/UnitConvert.cs @@ -19,8 +19,8 @@ public class UnitConvert : Behavior if (theseMatches != null && theseMatches.Count > 0 && theseMatches[0].Groups != null && theseMatches[0].Groups.Count == 5) { - decimal asNumeric = 0; - if (decimal.TryParse(theseMatches[0].Groups[1].Value, out asNumeric)) + double asNumeric = 0; + if (double.TryParse(theseMatches[0].Groups[1].Value, out asNumeric)) { Console.WriteLine("let's try and convert..."); Behaver.Instance.SendMessage(message.Channel.Id, Conversion.Converter.Convert(asNumeric, theseMatches[0].Groups[2].Value, theseMatches[0].Groups[4].Value.ToLower())); diff --git a/Conversion/ConversionConfig.cs b/Conversion/ConversionConfig.cs index 3f6461f..85e5b79 100644 --- a/Conversion/ConversionConfig.cs +++ b/Conversion/ConversionConfig.cs @@ -10,13 +10,14 @@ namespace vassago.Conversion public string Canonical { get; set; } public IEnumerable Aliases { get; set; } } - public class LinearPair + public class FormulaicPair { public string item1 { get; set; } public string item2 { get; set; } - public decimal factor { get; set; } + public string formulaforward {get; set; } + public string formulabackward {get; set; } } public IEnumerable Units { get; set; } - public IEnumerable LinearPairs { get; set; } + public IEnumerable FormulaicPairs { get; set; } } -} \ No newline at end of file +} diff --git a/Conversion/Converter.cs b/Conversion/Converter.cs index f3d4e20..73de75c 100644 --- a/Conversion/Converter.cs +++ b/Conversion/Converter.cs @@ -9,6 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Discord; using Discord.WebSocket; +using Jace; using Newtonsoft.Json; using QRCoder; @@ -16,12 +17,12 @@ namespace vassago.Conversion { public static class Converter { - private delegate decimal Convert1Way(decimal input); private static string currencyPath; private static ExchangePairs currencyConf = null; private static DateTime lastUpdatedCurrency = DateTime.UnixEpoch; - private static List> knownConversions = new List>(); + private static List, Func>> knownConversions = new List,Func>>(); private static Dictionary, string> knownAliases = new Dictionary, string>(new List, string>>()); + private static CalculationEngine engine = new CalculationEngine(); public static string DebugInfo() { var convertibles = knownConversions.Select(kc => kc.Item1).Union(knownConversions.Select(kc => kc.Item2)).Union( @@ -44,16 +45,16 @@ namespace vassago.Conversion } private static void loadStatic() { - knownConversions = new List>(); + knownConversions = new List, Func>>(); knownAliases = new Dictionary, string>(new List, string>>()); var convConf = JsonConvert.DeserializeObject(File.ReadAllText("assets/conversion.json").ToLower()); foreach (var unit in convConf.Units) { knownAliases.Add(unit.Aliases.ToList(), unit.Canonical); } - foreach (var lp in convConf.LinearPairs) + foreach (var lp in convConf.FormulaicPairs) { - AddLinearPair(lp.item1, lp.item2, lp.factor); + AddLinearPair(lp.item1, lp.item2, lp.formulaforward, lp.formulabackward ); } loadCurrency(); } @@ -78,12 +79,12 @@ namespace vassago.Conversion { knownAliases.Add(new List() { rate.Key.ToLower() }, rate.Key); } - AddLinearPair(currencyConf.Base, rate.Key, rate.Value); + AddLinearPair(currencyConf.Base, rate.Key, $"i1 * {rate.Value}", $"i1 / {rate.Value}"); } } } - public static string Convert(decimal numericTerm, string sourceunit, string destinationUnit) + public static string Convert(double numericTerm, string sourceunit, string destinationUnit) { //normalize units var normalizationAttemptSource = NormalizeUnit(sourceunit.ToLower()); @@ -264,12 +265,20 @@ namespace vassago.Conversion } return null; } - private static void AddLinearPair(string key1, string key2, decimal factor) + private static void AddLinearPair(string key1, string key2, string formulaForward, string formulaBackward) { - var reverseFactor = 1.0m / factor; - knownConversions.Add(new Tuple( - key1, key2, x => x * factor, y => y * reverseFactor - )); + knownConversions.Add(new Tuple, Func>( + key1, + key2, + (Func) engine.Formula(formulaForward) + .Parameter("i1", DataType.FloatingPoint) + .Result(DataType.FloatingPoint) + .Build(), + (Func) engine.Formula(formulaBackward) + .Parameter("i1", DataType.FloatingPoint) + .Result(DataType.FloatingPoint) + .Build() + )); } } } diff --git a/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs b/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs index c005f3d..b84bdad 100644 --- a/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs +++ b/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs @@ -171,7 +171,7 @@ public class DiscordInterface : ProtocolInterface case "freedomunits": try { - var amt = Convert.ToDecimal((double)(command.Data.Options.First(o => o.Name == "amount").Value)); + var amt = (double)(command.Data.Options.First(o => o.Name == "amount").Value); var src = (string)command.Data.Options.First(o => o.Name == "src-unit").Value; var dest = (string)command.Data.Options.First(o => o.Name == "dest-unit").Value; var conversionResult = Conversion.Converter.Convert(amt, src, dest); diff --git a/assets/conversion.json b/assets/conversion.json index 69d96b7..fa88f53 100644 --- a/assets/conversion.json +++ b/assets/conversion.json @@ -1416,61 +1416,62 @@ ] } ], - "linearPairs":[ - {"item1":"kg", "item2":"g", "factor":1000}, - {"item1":"lb", "item2":"oz", "factor":16}, - {"item1":"kg", "item2":"lb", "factor":2.204623}, - {"item1":"kg", "item2":"stone", "factor":0.157473}, + "FormulaicPairs":[ + {"item1":"°C", "item2":"℉", "formulaforward": "i1 * 1.8 + 32", "formulabackward": "(i1 - 32) / 1.8"}, - {"item1":"km", "item2":"m", "factor":1000}, - {"item1":"mi", "item2":"ft", "factor":5280}, - {"item1":"m", "item2":"in", "factor":39.37008}, - {"item1":"m", "item2":"cm", "factor":100}, - {"item1":"cm", "item2":"mm", "factor":10}, - {"item1":"m", "item2":"μm", "factor":1000000}, - {"item1":"km", "item2":"mi", "factor":0.6213712}, - {"item1":"ft", "item2":"in", "factor":12}, - {"item1":"yd", "item2":"ft", "factor":3}, - {"item1":"football field", "item2":"yd", "factor":100}, - {"item1":"chain", "item2":"yd", "factor":22}, - {"item1":"chain", "item2":"link", "factor":100}, - {"item1":"furlong", "item2":"mi", "factor":8}, - {"item1":"rod", "item2":"ft", "factor":16.5}, - {"item1":"AU", "item2":"ly", "factor": 0.0000158125}, - {"item1":"ly", "item2":"km", "factor": 946070000000}, - {"item1":"pc", "item2":"AU", "factor":206266.3}, - {"item1":"blue whale length", "item2": "m", "factor": 29.9}, - {"item1":"m", "item2": "ångström", "factor": 10000000000}, - {"item1":"smoot", "item2": "ft", "factor": 5.583333333333}, - {"item1":"uncle jordan", "item2": "cm", "factor":192.405}, + {"item1":"kg", "item2":"g", "formulaforward": "i1 * 1000", "formulabackward": "i1 / 1000"}, + {"item1":"lb", "item2":"oz", "formulaforward": "i1 * 16", "formulabackward": "i1 / 16"}, + {"item1":"kg", "item2":"lb", "formulaforward": "i1 * 2.204623", "formulabackward": "i1 / 2.204623"}, + {"item1":"kg", "item2":"stone", "formulaforward": "i1 * 0.157473", "formulabackward": "i1 / 0.157473"}, - {"item1":"floz", "item2":"mL", "factor":29.57344}, - {"item1":"L", "item2":"mL", "factor":1000}, - {"item1":"L", "item2":"floz", "factor":33.81402}, - {"item1":"hhd", "item2":"gal", "factor":54}, - {"item1":"barrel", "item2":"kilderkin", "factor":2}, - {"item1":"barrel", "item2":"firkin", "factor":4}, - {"item1":"firkin", "item2":"gal", "factor":10.8}, - {"item1":"pint", "item2":"floz", "factor":16}, - {"item1":"cup", "item2":"floz", "factor":8}, - {"item1":"gill", "item2":"floz", "factor":4}, - {"item1":"tbsp", "item2":"tsp", "factor":3}, - {"item1":"tbsp", "item2":"floz", "factor":0.5}, - {"item1":"gal", "item2":"floz", "factor":128}, - {"item1":"gal", "item2":"qt", "factor":4}, + {"item1":"km", "item2":"m", "formulaforward": "i1 * 1000", "formulabackward": "i1 / 1000"}, + {"item1":"mi", "item2":"ft", "formulaforward": "i1 * 5280", "formulabackward": "i1 / 5280"}, + {"item1":"m", "item2":"in", "formulaforward": "i1 * 39.37008", "formulabackward": "i1 / 39.37008"}, + {"item1":"m", "item2":"cm", "formulaforward": "i1 * 100", "formulabackward": "i1 / 100"}, + {"item1":"cm", "item2":"mm", "formulaforward": "i1 * 10", "formulabackward": "i1 / 10"}, + {"item1":"m", "item2":"μm", "formulaforward": "i1 * 1000000", "formulabackward": "i1 / 1000000"}, + {"item1":"km", "item2":"mi", "formulaforward": "i1 * 0.6213712", "formulabackward": "i1 / 0.6213712"}, + {"item1":"ft", "item2":"in", "formulaforward": "i1 * 12", "formulabackward": "i1 / 12"}, + {"item1":"yd", "item2":"ft", "formulaforward": "i1 * 3", "formulabackward": "i1 / 3"}, + {"item1":"football field", "item2":"yd", "formulaforward": "i1 * 100", "formulabackward": "i1 / 100"}, + {"item1":"chain", "item2":"yd", "formulaforward": "i1 * 22", "formulabackward": "i1 / 22"}, + {"item1":"chain", "item2":"link", "formulaforward": "i1 * 100", "formulabackward": "i1 / 100"}, + {"item1":"furlong", "item2":"mi", "formulaforward": "i1 * 8", "formulabackward": "i1 / 8"}, + {"item1":"rod", "item2":"ft", "formulaforward": "i1 * 16.5", "formulabackward": "i1 / 16.5"}, + {"item1":"AU", "item2":"ly", "formulaforward": "i1 * 0.0000158125", "formulabackward": "i1 / 0.0000158125"}, + {"item1":"ly", "item2":"km", "formulaforward": "i1 * 946070000000", "formulabackward": "i1 / 946070000000"}, + {"item1":"pc", "item2":"AU", "formulaforward": "i1 * 206266.3", "formulabackward": "i1 / 206266.3"}, + {"item1":"blue whale length", "item2": "m", "formulaforward": "i1 * 29.9", "formulabackward": "i1 / 29.9"}, + {"item1":"m", "item2": "ångström", "formulaforward": "i1 * 10000000000", "formulabackward": "i1 / 10000000000"}, + {"item1":"smoot", "item2": "ft", "formulaforward": "i1 * 5.583333333333", "formulabackward": "i1 / 5.583333333333"}, + {"item1":"uncle jordan", "item2": "cm", "formulaforward": "i1 * 192.405", "formulabackward": "i1 / 192.405"}, + + {"item1":"floz", "item2":"mL", "formulaforward": "i1 * 29.57344", "formulabackward": "i1 / 29.57344"}, + {"item1":"L", "item2":"mL", "formulaforward": "i1 * 1000", "formulabackward": "i1 / 1000"}, + {"item1":"L", "item2":"floz", "formulaforward": "i1 * 33.81402", "formulabackward": "i1 / 33.81402"}, + {"item1":"hhd", "item2":"gal", "formulaforward": "i1 * 54", "formulabackward": "i1 / 54"}, + {"item1":"barrel", "item2":"kilderkin", "formulaforward": "i1 * 2", "formulabackward": "i1 / 2"}, + {"item1":"barrel", "item2":"firkin", "formulaforward": "i1 * 4", "formulabackward": "i1 / 4"}, + {"item1":"firkin", "item2":"gal", "formulaforward": "i1 * 10.8", "formulabackward": "i1 / 10.8"}, + {"item1":"pint", "item2":"floz", "formulaforward": "i1 * 16", "formulabackward": "i1 / 16"}, + {"item1":"cup", "item2":"floz", "formulaforward": "i1 * 8", "formulabackward": "i1 / 8"}, + {"item1":"gill", "item2":"floz", "formulaforward": "i1 * 4", "formulabackward": "i1 / 4"}, + {"item1":"tbsp", "item2":"tsp", "formulaforward": "i1 * 3", "formulabackward": "i1 / 3"}, + {"item1":"tbsp", "item2":"floz", "formulaforward": "i1 * 0.5", "formulabackward": "i1 / 0.5"}, + {"item1":"gal", "item2":"floz", "formulaforward": "i1 * 128", "formulabackward": "i1 / 128"}, + {"item1":"gal", "item2":"qt", "formulaforward": "i1 * 4", "formulabackward": "i1 / 4"}, - {"item1":"acre", "item2":"yd^2", "factor":4840}, - {"item1":"yd^2", "item2":"m^2", "factor":0.836127}, + {"item1":"acre", "item2":"yd^2", "formulaforward": "i1 * 4840", "formulabackward": "i1 / 4840"}, + {"item1":"yd^2", "item2":"m^2", "formulaforward": "i1 * 0.836127", "formulabackward": "i1 / 0.836127"}, - {"item1":"mph", "item2":"knot", "factor":0.868976}, - {"item1":"mph", "item2":"kph", "factor":1.609343550606653}, + {"item1":"mph", "item2":"knot", "formulaforward": "i1 * 0.868976", "formulabackward": "i1 / 0.868976"}, + {"item1":"mph", "item2":"kph", "formulaforward": "i1 * 1.609343550606653", "formulabackward": "i1 / 1.609343550606653"}, - - {"item1":"kPa", "item2":"Pa", "factor":1000}, - {"item1":"Nm^2", "item2":"Pa", "factor":1}, - {"item1":"Pa", "item2":"bar", "factor":100}, - {"item1":"atm", "item2":"Pa", "factor":101325}, - {"item1":"bar", "item2":"psi", "factor":14.5038} + {"item1":"kPa", "item2":"Pa", "formulaforward": "i1 * 1000", "formulabackward": "i1 / 1000"}, + {"item1":"Nm^2", "item2":"Pa", "formulaforward": "i1 * 1", "formulabackward": "i1 / 1"}, + {"item1":"Pa", "item2":"bar", "formulaforward": "i1 * 100", "formulabackward": "i1 / 100"}, + {"item1":"atm", "item2":"Pa", "formulaforward": "i1 * 101325", "formulabackward": "i1 / 101325"}, + {"item1":"bar", "item2":"psi", "formulaforward": "i1 * 14.5038", "formulabackward": "i1 / 14.5038"} ] } diff --git a/vassago.csproj b/vassago.csproj index 15bfd46..84d33d3 100644 --- a/vassago.csproj +++ b/vassago.csproj @@ -15,6 +15,7 @@ + runtime; build; native; contentfiles; analyzers; buildtransitive