finalization
This commit is contained in:
		| @@ -2,6 +2,8 @@ | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using Newtonsoft.Json; | ||||
| using NLog; | ||||
| using System; | ||||
| @@ -28,19 +30,31 @@ namespace NadekoBot.Modules.Searches | ||||
|  | ||||
|                 try | ||||
|                 { | ||||
|                     Units = JsonConvert.DeserializeObject<List<JsonUnit>>(File.ReadAllText("units.json")); | ||||
|                     using (var uow = DbHandler.UnitOfWork()) | ||||
|                     { | ||||
|                         //need to do this the first time                  | ||||
|                         if (uow.ConverterUnits.Empty()) | ||||
|                         { | ||||
|                             var content = JsonConvert.DeserializeObject<List<MeasurementUnit>>(File.ReadAllText("units.json")).Select(u => new ConvertUnit() | ||||
|                             { | ||||
|                                 Modifier = u.Modifier, | ||||
|                                 UnitType = u.UnitType, | ||||
|                                 InternalTrigger = string.Join("|", u.Triggers) | ||||
|                             }); | ||||
|  | ||||
|                             uow.ConverterUnits.AddRange(content.ToArray()); | ||||
|                             uow.Complete(); | ||||
|                         } | ||||
|                         Units = uow.ConverterUnits.GetAll().ToList(); | ||||
|                     } | ||||
|                 } | ||||
|                 catch (Exception e) | ||||
|                 { | ||||
|                     _log.Warn("Could not load units: " + e.Message); | ||||
|  | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|  | ||||
|             public List<JsonUnit> Units { get; set; } | ||||
|  | ||||
|  | ||||
|             public List<ConvertUnit> Units { get; set; } | ||||
|  | ||||
|             [Command("updatecur")] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
| @@ -49,9 +63,9 @@ namespace NadekoBot.Modules.Searches | ||||
|                 var channel = msg.Channel as IGuildChannel; | ||||
|                 var currencyRates = await UpdateCurrencyRates(); | ||||
|                 var unitTypeString = "currency"; | ||||
|                 var baseType = new JsonUnit() | ||||
|                 var baseType = new ConvertUnit() | ||||
|                 { | ||||
|                     Triggers = new List<string>() { currencyRates.Base }, | ||||
|                     Triggers = new[] { currencyRates.Base }, | ||||
|                     Modifier = decimal.One, | ||||
|                     UnitType = unitTypeString | ||||
|                 }; | ||||
| @@ -60,22 +74,31 @@ namespace NadekoBot.Modules.Searches | ||||
|                     Units.Add(baseType); | ||||
|                 else | ||||
|                     Units[baseIndex] = baseType; | ||||
|                 foreach (var rate in currencyRates.ConversionRates) | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 { | ||||
|                     var u = new JsonUnit() | ||||
|                     foreach (var rate in currencyRates.ConversionRates) | ||||
|                     { | ||||
|                         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; | ||||
|                         var u = new ConvertUnit() | ||||
|                         { | ||||
|                             Triggers = new[] { 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); | ||||
|                             uow.ConverterUnits.Add(u); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             Units[toUpdate] = u; | ||||
|                             uow.ConverterUnits.Update(u); | ||||
|                         } | ||||
|                         uow.Complete(); | ||||
|                     } | ||||
|                 } | ||||
|                 File.WriteAllText("units.json", JsonConvert.SerializeObject(Units, Formatting.Indented)); | ||||
|                 await msg.Reply("done"); | ||||
|             } | ||||
|             [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
| @@ -162,8 +185,9 @@ namespace NadekoBot.Modules.Searches | ||||
|                     if (originUnit.UnitType == "currency") | ||||
|                     { | ||||
|                         res = (value * targetUnit.Modifier) / originUnit.Modifier; | ||||
|                     } else | ||||
|                     res = (value * originUnit.Modifier) / targetUnit.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())); | ||||
| @@ -190,89 +214,11 @@ namespace NadekoBot.Modules.Searches | ||||
|             public Dictionary<string, decimal> ConversionRates { get; set; } | ||||
|         } | ||||
|  | ||||
|  | ||||
|         public class JsonUnit | ||||
|         public class MeasurementUnit | ||||
|         { | ||||
|             public List<string> Triggers { get; set; } | ||||
|             public string UnitType { get; set; } | ||||
|             public decimal Modifier { get; set; } | ||||
|         } | ||||
|  | ||||
|  | ||||
|         #region GetXML | ||||
|         /* | ||||
|         public class UnitCollection | ||||
|         { | ||||
|             public List<UnitType> UnitTypes; | ||||
|  | ||||
|             public UnitCollection(string content) | ||||
|             { | ||||
|                 using (var xmlReader = XmlReader.Create(File.OpenRead("units.xml"), new XmlReaderSettings() { IgnoreComments = true, IgnoreWhitespace = true })) | ||||
|                 { | ||||
|                     XmlDocument doc = new XmlDocument(); | ||||
|                     doc.Load(xmlReader); | ||||
|  | ||||
|                     UnitTypes = new List<UnitType>(); | ||||
|                     foreach (XmlNode node in doc.LastChild.ChildNodes) | ||||
|                     { //units/ | ||||
|                         UnitType type = new UnitType() | ||||
|                         { | ||||
|                             Name = node.Name | ||||
|                         }; | ||||
|                         var units = new List<Unit>(); | ||||
|                         foreach (XmlNode unitNode in node.ChildNodes) | ||||
|                         { | ||||
|                             var curNode = unitNode.FirstChild; | ||||
|                             Unit u = new Unit() | ||||
|                             { | ||||
|                                 Key = curNode.InnerText, | ||||
|                                 Singular = (curNode = curNode.NextSibling).InnerText, | ||||
|                                 Plural = (curNode = curNode.NextSibling).InnerText, | ||||
|                                 Symbol = (curNode = curNode.NextSibling).InnerText, | ||||
|                                 Source = curNode.NextSibling.NextSibling.InnerText | ||||
|                             }; | ||||
|                             List<Factor> factors = new List<Factor>(); | ||||
|                             foreach (XmlNode factorNode in curNode.NextSibling.ChildNodes) | ||||
|                             { | ||||
|                                 Factor f = new Factor() | ||||
|                                 { | ||||
|                                     Modifier = factorNode.FirstChild.InnerText.Replace(" ", "") | ||||
|                                 }; | ||||
|                                 f.From = factorNode.Attributes.GetNamedItem("from").InnerText; | ||||
|                                 factors.Add(f); | ||||
|                             } | ||||
|                             u.Factors = factors; | ||||
|                             units.Add(u); | ||||
|                         } | ||||
|                         type.Units = units; | ||||
|                         UnitTypes.Add(type); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             public class UnitType | ||||
|             { | ||||
|                 public string Name { get; set; } | ||||
|                 public List<Unit> Units { get; set; } | ||||
|             } | ||||
|  | ||||
|             public class Unit | ||||
|             { | ||||
|                 public string Key { get; set; } | ||||
|                 public string Plural { get; set; } | ||||
|                 public string Singular { get; set; } | ||||
|                 public string Symbol { get; set; } | ||||
|                 public List<Factor> Factors { get; set; } | ||||
|                 public string Source { get; set; } | ||||
|             } | ||||
|  | ||||
|             public class Factor | ||||
|             { | ||||
|                 public string From { get; set; } | ||||
|                 public string Modifier { get; set; } | ||||
|             } | ||||
|         } | ||||
|         */ | ||||
|         #endregion | ||||
|     } | ||||
| } | ||||
| @@ -17,6 +17,7 @@ namespace NadekoBot.Services.Database | ||||
|         ISelfAssignedRolesRepository SelfAssignedRoles { get; } | ||||
|         IBotConfigRepository BotConfig { get; } | ||||
|         IRepeaterRepository Repeaters { get; } | ||||
|         IUnitConverterRepository ConverterUnits { get; } | ||||
|  | ||||
|         int Complete(); | ||||
|         Task<int> CompleteAsync(); | ||||
|   | ||||
							
								
								
									
										38
									
								
								src/NadekoBot/Services/Database/Models/ConvertUnit.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/NadekoBot/Services/Database/Models/ConvertUnit.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
| using System.ComponentModel.DataAnnotations.Schema; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| { | ||||
|     public class ConvertUnit : DbEntity | ||||
|     { | ||||
|         public ConvertUnit() { } | ||||
|         [NotMapped] | ||||
|         private string[] _triggersValue; | ||||
|         [NotMapped] | ||||
|         public string[] Triggers | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return _triggersValue ?? (_triggersValue = InternalTrigger.Split('|')); | ||||
|             } | ||||
|             set | ||||
|             { | ||||
|                 _triggersValue = value; | ||||
|                 InternalTrigger = string.Join("|", _triggersValue); | ||||
|             } | ||||
|         } | ||||
|         //protected or private? | ||||
|         /// <summary> | ||||
|         /// DO NOT CALL THIS | ||||
|         /// </summary> | ||||
|         [EditorBrowsable(EditorBrowsableState.Never)] | ||||
|         public string InternalTrigger { get; set; } | ||||
|         public string UnitType { get; set; } | ||||
|         public decimal Modifier { get; set; } | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -20,6 +20,7 @@ namespace NadekoBot.Services.Database | ||||
|         public DbSet<BotConfig> BotConfig { get; set; } | ||||
|         public DbSet<Repeater> Repeaters { get; set; } | ||||
|         public DbSet<Currency> Currency { get; set; } | ||||
|         public DbSet<ConvertUnit> ConversionUnits { get; set; } | ||||
|  | ||||
|         protected override void OnModelCreating(ModelBuilder modelBuilder) | ||||
|         { | ||||
| @@ -83,6 +84,7 @@ namespace NadekoBot.Services.Database | ||||
|                 .HasIndex(c => c.UserId) | ||||
|                 .IsUnique(); | ||||
|             #endregion | ||||
|              | ||||
|         } | ||||
|         protected abstract override void OnConfiguring(DbContextOptionsBuilder optionsBuilder); | ||||
|     } | ||||
|   | ||||
| @@ -0,0 +1,14 @@ | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Repositories | ||||
| { | ||||
|     public interface IUnitConverterRepository : IRepository<ConvertUnit> | ||||
|     { | ||||
|         void AddOrUpdate(Func<ConvertUnit, bool> check, ConvertUnit toAdd, Func<ConvertUnit, ConvertUnit> toUpdate); | ||||
|         bool Empty(); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,28 @@ | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
|  | ||||
| namespace NadekoBot.Services.Database.Repositories.Impl | ||||
| { | ||||
|     public class UnitConverterRepository : Repository<ConvertUnit>, IUnitConverterRepository | ||||
|     { | ||||
|         public UnitConverterRepository(DbContext context) : base(context) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         public void AddOrUpdate(Func<ConvertUnit, bool> check, ConvertUnit toAdd, Func<ConvertUnit, ConvertUnit> toUpdate) | ||||
|         { | ||||
|            var existing = _set.FirstOrDefault(check); | ||||
|             if (existing != null) | ||||
|             { | ||||
|                 existing = toUpdate.Invoke(existing); | ||||
|             } | ||||
|             else _set.Add(toAdd); | ||||
|         } | ||||
|  | ||||
|         public bool Empty() => !_set.Any(); | ||||
|     } | ||||
| } | ||||
| @@ -38,6 +38,8 @@ namespace NadekoBot.Services.Database | ||||
|  | ||||
|         private ICurrencyRepository _currency; | ||||
|         public ICurrencyRepository Currency => _currency ?? (_currency = new CurrencyRepository(_context)); | ||||
|         private IUnitConverterRepository _conUnits; | ||||
|         public IUnitConverterRepository ConverterUnits => _conUnits ?? (_conUnits = new UnitConverterRepository(_context)); | ||||
|  | ||||
|         public UnitOfWork(NadekoContext context) | ||||
|         { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user