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