Added Temperature, case insensitivity
This commit is contained in:
		@@ -40,7 +40,7 @@ namespace NadekoBot.Modules.Searches
 | 
			
		||||
 | 
			
		||||
            public List<JsonUnit> Units { get; set; }
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            [Command("updatecur")]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
@@ -55,70 +55,141 @@ namespace NadekoBot.Modules.Searches
 | 
			
		||||
                    Modifier = decimal.One,
 | 
			
		||||
                    UnitType = unitTypeString
 | 
			
		||||
                };
 | 
			
		||||
                var baseIndex = Units.FindIndex(x => x.UnitType == "currency" && x.Modifier == baseType.Modifier);
 | 
			
		||||
                if (baseIndex == -1)
 | 
			
		||||
                    Units.Add(baseType);
 | 
			
		||||
                else
 | 
			
		||||
                    Units[baseIndex] = baseType;
 | 
			
		||||
                foreach (var rate in currencyRates.ConversionRates)
 | 
			
		||||
                {
 | 
			
		||||
                    Units.Add(new JsonUnit() {
 | 
			
		||||
                        Triggers = new List<string>() { rate.Key},
 | 
			
		||||
                    var u = new JsonUnit()
 | 
			
		||||
                    {
 | 
			
		||||
                        Triggers = new List<string>() { rate.Key },
 | 
			
		||||
                        UnitType = unitTypeString,
 | 
			
		||||
                        Modifier = rate.Value
 | 
			
		||||
                    });
 | 
			
		||||
                    };
 | 
			
		||||
                    var lower = u.Triggers.First().ToLowerInvariant();
 | 
			
		||||
                    var toUpdate = Units.FindIndex(x => x.UnitType == "currency" && x.Triggers.First().ToLowerInvariant() == lower);
 | 
			
		||||
                    if (toUpdate == -1)
 | 
			
		||||
                        Units.Add(u);
 | 
			
		||||
                    else
 | 
			
		||||
                        Units[toUpdate] = u;
 | 
			
		||||
                }
 | 
			
		||||
                File.WriteAllText("units.json", JsonConvert.SerializeObject(Units, Formatting.Indented));
 | 
			
		||||
                await msg.Reply("done");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task ConvertList(IUserMessage msg)
 | 
			
		||||
            public async Task ConvertListE(IUserMessage msg) //extended and bugged list
 | 
			
		||||
            {
 | 
			
		||||
                var sb = new StringBuilder("Units that can be used by the converter: ");
 | 
			
		||||
                var channel = msg.Channel as IGuildChannel;
 | 
			
		||||
 | 
			
		||||
                var sb = new StringBuilder("Units that can be used by the converter: \n");
 | 
			
		||||
                var res = Units.GroupBy(x => x.UnitType);
 | 
			
		||||
                foreach (var group in res)
 | 
			
		||||
                {
 | 
			
		||||
                    sb.AppendLine($"{group.Key}: ```xl");
 | 
			
		||||
                    foreach (var el in group)
 | 
			
		||||
                    {
 | 
			
		||||
                        sb.AppendLine(string.Join(",", el.Triggers));
 | 
			
		||||
                        sb.Append($" [{string.Join(",", el.Triggers)}] ");
 | 
			
		||||
                    }
 | 
			
		||||
                    sb.AppendLine("```");
 | 
			
		||||
                }
 | 
			
		||||
                await msg.ReplyLong(sb.ToString());
 | 
			
		||||
                await msg.ReplyLong(sb.ToString(), "```xl", "```", "```xl");
 | 
			
		||||
            }
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task ConvertList(IUserMessage msg)
 | 
			
		||||
            {
 | 
			
		||||
                var sb = new StringBuilder("Units that can be used by the converter: \n");
 | 
			
		||||
                var res = Units.GroupBy(x => x.UnitType);
 | 
			
		||||
                foreach (var group in res)
 | 
			
		||||
                {
 | 
			
		||||
                    sb.AppendLine($"{group.Key}: ```xl");
 | 
			
		||||
                    sb.AppendLine(string.Join(",", group.Select(x => x.Triggers.FirstOrDefault()).OrderBy(x => x)));
 | 
			
		||||
                    sb.AppendLine("```");
 | 
			
		||||
                }
 | 
			
		||||
                await msg.ReplyLong(sb.ToString(), "```xl", "```", "```xl");
 | 
			
		||||
            }
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
            public async Task Convert(IUserMessage msg, string origin, string target, decimal value)
 | 
			
		||||
            {
 | 
			
		||||
                var originUnit = Units.Find(x => x.Triggers.Contains(origin));
 | 
			
		||||
                var targetUnit = Units.Find(x => x.Triggers.Contains(target));
 | 
			
		||||
                var originUnit = Units.Find(x => x.Triggers.Select(y => y.ToLowerInvariant()).Contains(origin.ToLowerInvariant()));
 | 
			
		||||
                var targetUnit = Units.Find(x => x.Triggers.Select(y => y.ToLowerInvariant()).Contains(target.ToLowerInvariant()));
 | 
			
		||||
                if (originUnit == null || targetUnit == null)
 | 
			
		||||
                {
 | 
			
		||||
                    await msg.Reply(string.Format("Cannot convert {0} to {1}: units not found", originUnit.Triggers.First(), targetUnit.Triggers.First()));
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (originUnit.UnitType != targetUnit.UnitType)
 | 
			
		||||
                {
 | 
			
		||||
                    await msg.Reply(string.Format("Cannot convert {0} to {1}: types of unit are not equal", originUnit.Triggers.First(), targetUnit.Triggers.First()));
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                decimal res = (value * originUnit.Modifier)  / targetUnit.Modifier;
 | 
			
		||||
                decimal res;
 | 
			
		||||
                if (originUnit.Triggers == targetUnit.Triggers) res = value;
 | 
			
		||||
                else if (originUnit.UnitType == "temperature")
 | 
			
		||||
                {
 | 
			
		||||
                    //don't really care too much about efficiency, so just convert to Kelvin, then to target
 | 
			
		||||
                    switch (originUnit.Triggers.First().ToUpperInvariant())
 | 
			
		||||
                    {
 | 
			
		||||
                        case "C":
 | 
			
		||||
                            res = value + (decimal)273.15; //celcius!
 | 
			
		||||
                            break;
 | 
			
		||||
                        case "F":
 | 
			
		||||
                            res = (value + (decimal)459.67) * ((decimal)5 / 9);
 | 
			
		||||
                            break;
 | 
			
		||||
                        default:
 | 
			
		||||
                            res = value;
 | 
			
		||||
                            break;
 | 
			
		||||
                    }
 | 
			
		||||
                    //from Kelvin to target
 | 
			
		||||
                    switch (targetUnit.Triggers.First())
 | 
			
		||||
                    {
 | 
			
		||||
                        case "C":
 | 
			
		||||
                            res = value - (decimal)273.15; //celcius!
 | 
			
		||||
                            break;
 | 
			
		||||
                        case "F":
 | 
			
		||||
                            res = res * ((decimal)9 / 5) - (decimal)458.67;
 | 
			
		||||
                            break;
 | 
			
		||||
                        default:
 | 
			
		||||
                            break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    //I just love currency
 | 
			
		||||
                    if (originUnit.UnitType == "currency")
 | 
			
		||||
                    {
 | 
			
		||||
                        res = (value * targetUnit.Modifier) / originUnit.Modifier;
 | 
			
		||||
                    } else
 | 
			
		||||
                    res = (value * originUnit.Modifier) / targetUnit.Modifier;
 | 
			
		||||
                }
 | 
			
		||||
                res = Math.Round(res, 2);
 | 
			
		||||
                await msg.Reply(string.Format("{0} {1} is equal to {2} {3}", value, originUnit.Triggers.First(), res, targetUnit.Triggers.First()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            public static async Task<Rates> UpdateCurrencyRates()
 | 
			
		||||
        public static async Task<Rates> UpdateCurrencyRates()
 | 
			
		||||
        {
 | 
			
		||||
            using (var http = new HttpClient())
 | 
			
		||||
            {
 | 
			
		||||
                using (var http = new HttpClient())
 | 
			
		||||
                {
 | 
			
		||||
                    var res = await http.GetStringAsync("http://api.fixer.io/latest").ConfigureAwait(false);
 | 
			
		||||
                    return  JsonConvert.DeserializeObject<Rates>(res);
 | 
			
		||||
                }
 | 
			
		||||
                var res = await http.GetStringAsync("http://api.fixer.io/latest").ConfigureAwait(false);
 | 
			
		||||
                return JsonConvert.DeserializeObject<Rates>(res);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public class Rates
 | 
			
		||||
        {
 | 
			
		||||
            [JsonProperty("base")]
 | 
			
		||||
            public string Base { get; set; }
 | 
			
		||||
            [JsonProperty("date")]
 | 
			
		||||
            public DateTime Date { get; set; }
 | 
			
		||||
            [JsonProperty("rates")]
 | 
			
		||||
            public Dictionary<string, decimal> ConversionRates { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            public class Rates
 | 
			
		||||
            {
 | 
			
		||||
                [JsonProperty("base")]
 | 
			
		||||
                public string Base { get; set; }
 | 
			
		||||
                [JsonProperty("date")]
 | 
			
		||||
                public DateTime Date { get; set; }
 | 
			
		||||
                [JsonProperty("rates")]
 | 
			
		||||
                public Dictionary<string, decimal> ConversionRates { get; set; }
 | 
			
		||||
            }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        public class JsonUnit
 | 
			
		||||
        {
 | 
			
		||||
@@ -127,6 +198,7 @@ namespace NadekoBot.Modules.Searches
 | 
			
		||||
            public decimal Modifier { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        #region GetXML
 | 
			
		||||
        /*
 | 
			
		||||
        public class UnitCollection
 | 
			
		||||
 
 | 
			
		||||
@@ -945,5 +945,37 @@
 | 
			
		||||
    ],
 | 
			
		||||
    "UnitType": "currency",
 | 
			
		||||
    "Modifier": 16.0537
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "Triggers": [
 | 
			
		||||
      "K",
 | 
			
		||||
      "kelvin"
 | 
			
		||||
    ],
 | 
			
		||||
    "UnitType": "temperature",
 | 
			
		||||
    "Modifier": 0.00
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "Triggers": [
 | 
			
		||||
      "F",
 | 
			
		||||
      "fahrenheit"
 | 
			
		||||
    ],
 | 
			
		||||
    "UnitType": "temperature",
 | 
			
		||||
    "Modifier": 0.00
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "Triggers": [
 | 
			
		||||
      "C",
 | 
			
		||||
      "Celcius",
 | 
			
		||||
      "Centigrade"
 | 
			
		||||
    ],
 | 
			
		||||
    "UnitType": "temperature",
 | 
			
		||||
    "Modifier": 0.00
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "Triggers": [
 | 
			
		||||
      "EUR"
 | 
			
		||||
    ],
 | 
			
		||||
    "UnitType": "currency",
 | 
			
		||||
    "Modifier": 1.0
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
		Reference in New Issue
	
	Block a user