finalization
This commit is contained in:
parent
d4ae9e712a
commit
0bf79cb888
@ -2,6 +2,8 @@
|
|||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using NadekoBot.Attributes;
|
using NadekoBot.Attributes;
|
||||||
using NadekoBot.Extensions;
|
using NadekoBot.Extensions;
|
||||||
|
using NadekoBot.Services;
|
||||||
|
using NadekoBot.Services.Database.Models;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NLog;
|
using NLog;
|
||||||
using System;
|
using System;
|
||||||
@ -28,19 +30,31 @@ namespace NadekoBot.Modules.Searches
|
|||||||
|
|
||||||
try
|
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)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
_log.Warn("Could not load units: " + e.Message);
|
_log.Warn("Could not load units: " + e.Message);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<JsonUnit> Units { get; set; }
|
public List<ConvertUnit> Units { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[Command("updatecur")]
|
[Command("updatecur")]
|
||||||
[RequireContext(ContextType.Guild)]
|
[RequireContext(ContextType.Guild)]
|
||||||
@ -49,9 +63,9 @@ namespace NadekoBot.Modules.Searches
|
|||||||
var channel = msg.Channel as IGuildChannel;
|
var channel = msg.Channel as IGuildChannel;
|
||||||
var currencyRates = await UpdateCurrencyRates();
|
var currencyRates = await UpdateCurrencyRates();
|
||||||
var unitTypeString = "currency";
|
var unitTypeString = "currency";
|
||||||
var baseType = new JsonUnit()
|
var baseType = new ConvertUnit()
|
||||||
{
|
{
|
||||||
Triggers = new List<string>() { currencyRates.Base },
|
Triggers = new[] { currencyRates.Base },
|
||||||
Modifier = decimal.One,
|
Modifier = decimal.One,
|
||||||
UnitType = unitTypeString
|
UnitType = unitTypeString
|
||||||
};
|
};
|
||||||
@ -60,22 +74,31 @@ namespace NadekoBot.Modules.Searches
|
|||||||
Units.Add(baseType);
|
Units.Add(baseType);
|
||||||
else
|
else
|
||||||
Units[baseIndex] = baseType;
|
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 },
|
var u = new ConvertUnit()
|
||||||
UnitType = unitTypeString,
|
{
|
||||||
Modifier = rate.Value
|
Triggers = new[] { rate.Key },
|
||||||
};
|
UnitType = unitTypeString,
|
||||||
var lower = u.Triggers.First().ToLowerInvariant();
|
Modifier = rate.Value
|
||||||
var toUpdate = Units.FindIndex(x => x.UnitType == "currency" && x.Triggers.First().ToLowerInvariant() == lower);
|
};
|
||||||
if (toUpdate == -1)
|
var lower = u.Triggers.First().ToLowerInvariant();
|
||||||
Units.Add(u);
|
var toUpdate = Units.FindIndex(x => x.UnitType == "currency" && x.Triggers.First().ToLowerInvariant() == lower);
|
||||||
else
|
if (toUpdate == -1)
|
||||||
Units[toUpdate] = u;
|
{
|
||||||
|
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");
|
await msg.Reply("done");
|
||||||
}
|
}
|
||||||
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
|
[LocalizedCommand, LocalizedDescription, LocalizedSummary]
|
||||||
@ -162,8 +185,9 @@ namespace NadekoBot.Modules.Searches
|
|||||||
if (originUnit.UnitType == "currency")
|
if (originUnit.UnitType == "currency")
|
||||||
{
|
{
|
||||||
res = (value * targetUnit.Modifier) / originUnit.Modifier;
|
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);
|
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()));
|
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 Dictionary<string, decimal> ConversionRates { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MeasurementUnit
|
||||||
public class JsonUnit
|
|
||||||
{
|
{
|
||||||
public List<string> Triggers { get; set; }
|
public List<string> Triggers { get; set; }
|
||||||
public string UnitType { get; set; }
|
public string UnitType { get; set; }
|
||||||
public decimal Modifier { 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; }
|
ISelfAssignedRolesRepository SelfAssignedRoles { get; }
|
||||||
IBotConfigRepository BotConfig { get; }
|
IBotConfigRepository BotConfig { get; }
|
||||||
IRepeaterRepository Repeaters { get; }
|
IRepeaterRepository Repeaters { get; }
|
||||||
|
IUnitConverterRepository ConverterUnits { get; }
|
||||||
|
|
||||||
int Complete();
|
int Complete();
|
||||||
Task<int> CompleteAsync();
|
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<BotConfig> BotConfig { get; set; }
|
||||||
public DbSet<Repeater> Repeaters { get; set; }
|
public DbSet<Repeater> Repeaters { get; set; }
|
||||||
public DbSet<Currency> Currency { get; set; }
|
public DbSet<Currency> Currency { get; set; }
|
||||||
|
public DbSet<ConvertUnit> ConversionUnits { get; set; }
|
||||||
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
{
|
{
|
||||||
@ -83,6 +84,7 @@ namespace NadekoBot.Services.Database
|
|||||||
.HasIndex(c => c.UserId)
|
.HasIndex(c => c.UserId)
|
||||||
.IsUnique();
|
.IsUnique();
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
protected abstract override void OnConfiguring(DbContextOptionsBuilder optionsBuilder);
|
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;
|
private ICurrencyRepository _currency;
|
||||||
public ICurrencyRepository Currency => _currency ?? (_currency = new CurrencyRepository(_context));
|
public ICurrencyRepository Currency => _currency ?? (_currency = new CurrencyRepository(_context));
|
||||||
|
private IUnitConverterRepository _conUnits;
|
||||||
|
public IUnitConverterRepository ConverterUnits => _conUnits ?? (_conUnits = new UnitConverterRepository(_context));
|
||||||
|
|
||||||
public UnitOfWork(NadekoContext context)
|
public UnitOfWork(NadekoContext context)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user