Updated ;cfi and cfw descriptions to say they don't affect bot owner, fixed .convert and .calc?
This commit is contained in:
		
							
								
								
									
										67
									
								
								src/NadekoBot/Modules/Utility/Commands/CalcCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								src/NadekoBot/Modules/Utility/Commands/CalcCommand.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | using Discord; | ||||||
|  | using Discord.Commands; | ||||||
|  | using NadekoBot.Attributes; | ||||||
|  | using NadekoBot.Extensions; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Reflection; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace NadekoBot.Modules.Utility | ||||||
|  | { | ||||||
|  |     [Group] | ||||||
|  |     public partial class Utility | ||||||
|  |     { | ||||||
|  |         [NadekoCommand, Usage, Description, Aliases] | ||||||
|  |         [RequireContext(ContextType.Guild)] | ||||||
|  |         public static async Task Calculate(IUserMessage msg, [Remainder] string expression) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 var expr = new NCalc.Expression(expression, NCalc.EvaluateOptions.IgnoreCase); | ||||||
|  |                 expr.EvaluateParameter += Expr_EvaluateParameter; | ||||||
|  |                 var result = expr.Evaluate(); | ||||||
|  |                 await msg.Reply(string.Format("Your expression evaluated to: {0}", expr.Error ?? result)); | ||||||
|  |             } | ||||||
|  |             catch (Exception e) | ||||||
|  |             { | ||||||
|  |                 await msg.Reply($"Your expression failed to evaluate: {e.Message} "); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private static void Expr_EvaluateParameter(string name, NCalc.ParameterArgs args) | ||||||
|  |         { | ||||||
|  |             switch (name.ToLowerInvariant()) { | ||||||
|  |                 case "pi": args.Result= Math.PI; | ||||||
|  |                     break; | ||||||
|  |                 case "e": args.Result = Math.E; | ||||||
|  |                     break;     | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         [NadekoCommand, Usage, Description, Aliases] | ||||||
|  |         [RequireContext(ContextType.Guild)] | ||||||
|  |         public async Task CalcOps(IUserMessage msg) | ||||||
|  |         { | ||||||
|  |             StringBuilder builder = new StringBuilder(); | ||||||
|  |             var selection = typeof(Math).GetTypeInfo().GetMethods().Except(typeof(object).GetTypeInfo().GetMethods()).Select(x => | ||||||
|  |             { | ||||||
|  |                 var name = x.Name; | ||||||
|  |                 if (x.GetParameters().Any()) | ||||||
|  |                 { | ||||||
|  |                     name += " (" + string.Join(", ", x.GetParameters().Select(y => y.IsOptional ? $"[{y.ParameterType.Name + " " + y.Name }]" : y.ParameterType.Name + " " + y.Name)) + ")"; | ||||||
|  |                 } | ||||||
|  |                 return name; | ||||||
|  |             }); | ||||||
|  |             foreach (var method in selection) builder.AppendLine(method); | ||||||
|  |             await msg.ReplyLong(builder.ToString()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     class ExpressionContext | ||||||
|  |     { | ||||||
|  |         public double Pi { get; set; } = Math.PI; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										180
									
								
								src/NadekoBot/Modules/Utility/Commands/UnitConversion.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								src/NadekoBot/Modules/Utility/Commands/UnitConversion.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,180 @@ | |||||||
|  | using Discord; | ||||||
|  | using Discord.Commands; | ||||||
|  | using NadekoBot.Attributes; | ||||||
|  | using NadekoBot.Extensions; | ||||||
|  | using NadekoBot.Modules.Utility.Commands.Models; | ||||||
|  | using NadekoBot.Services; | ||||||
|  | using NadekoBot.Services.Database.Models; | ||||||
|  | using Newtonsoft.Json; | ||||||
|  | using NLog; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.IO; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Net.Http; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using System.Xml; | ||||||
|  |  | ||||||
|  | namespace NadekoBot.Modules.Utility | ||||||
|  | { | ||||||
|  |     public partial class Utility | ||||||
|  |     { | ||||||
|  |         [Group] | ||||||
|  |         public class UnitConverterCommands | ||||||
|  |         { | ||||||
|  |             private Logger _log; | ||||||
|  |             private static Timer _timer; | ||||||
|  |             public static TimeSpan Span = new TimeSpan(12, 0, 0); | ||||||
|  |             public UnitConverterCommands() | ||||||
|  |             { | ||||||
|  |                 _log = LogManager.GetCurrentClassLogger(); | ||||||
|  |  | ||||||
|  |                 try | ||||||
|  |                 { | ||||||
|  |                     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); | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                  | ||||||
|  |                  | ||||||
|  |                 _timer = new Timer(new TimerCallback(UpdateCurrency), null, 0,(int)Span.TotalMilliseconds); | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             public void UpdateCurrency(object stateInfo) | ||||||
|  |             { | ||||||
|  |                 var currencyRates = UpdateCurrencyRates().Result; | ||||||
|  |                 var unitTypeString = "currency"; | ||||||
|  |                 using (var uow = DbHandler.UnitOfWork()) | ||||||
|  |                 { | ||||||
|  |                     var toRemove = Units.Where(u => u.UnitType == unitTypeString); | ||||||
|  |                     Units.RemoveAll(u => u.UnitType == unitTypeString); | ||||||
|  |                     uow.ConverterUnits.RemoveRange(toRemove.ToArray()); | ||||||
|  |                     var baseType = new ConvertUnit() | ||||||
|  |                     { | ||||||
|  |                         Triggers = new[] { currencyRates.Base }, | ||||||
|  |                         Modifier = decimal.One, | ||||||
|  |                         UnitType = unitTypeString | ||||||
|  |                     }; | ||||||
|  |                     uow.ConverterUnits.Add(baseType); | ||||||
|  |                     Units.Add(baseType); | ||||||
|  |                     var range = currencyRates.ConversionRates.Select(u => new ConvertUnit() | ||||||
|  |                     { | ||||||
|  |                         InternalTrigger = u.Key, | ||||||
|  |                         Modifier = u.Value, | ||||||
|  |                         UnitType = unitTypeString | ||||||
|  |                     }).ToArray(); | ||||||
|  |                     uow.ConverterUnits.AddRange(range); | ||||||
|  |                     Units.AddRange(range); | ||||||
|  |  | ||||||
|  |                     uow.Complete(); | ||||||
|  |                 } | ||||||
|  |                 _log.Info("Updated Currency"); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             public List<ConvertUnit> Units { get; set; } | ||||||
|  |             [NadekoCommand, Usage, Description, Aliases] | ||||||
|  |             [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(),  breakOn: new[] { "```xl\n", "\n" }); | ||||||
|  |             } | ||||||
|  |             [NadekoCommand, Usage, Description, Aliases] | ||||||
|  |             public async Task Convert(IUserMessage msg, string origin, string target, decimal value) | ||||||
|  |             { | ||||||
|  |                 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", origin, target)); | ||||||
|  |                     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; | ||||||
|  |                 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 + 273.15m; //celcius! | ||||||
|  |                             break; | ||||||
|  |                         case "F": | ||||||
|  |                             res = (value + 459.67m) * (5 / 9); | ||||||
|  |                             break; | ||||||
|  |                         default: | ||||||
|  |                             res = value; | ||||||
|  |                             break; | ||||||
|  |                     } | ||||||
|  |                     //from Kelvin to target | ||||||
|  |                     switch (targetUnit.Triggers.First()) | ||||||
|  |                     { | ||||||
|  |                         case "C": | ||||||
|  |                             res = value - 273.15m; //celcius! | ||||||
|  |                             break; | ||||||
|  |                         case "F": | ||||||
|  |                             res = res * (9 / 5) - 458.67m; | ||||||
|  |                             break; | ||||||
|  |                         default: | ||||||
|  |                             break; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     if (originUnit.UnitType == "currency") | ||||||
|  |                     { | ||||||
|  |                         res = (value * targetUnit.Modifier) / originUnit.Modifier; | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                         res = (value * originUnit.Modifier) / targetUnit.Modifier; | ||||||
|  |                 } | ||||||
|  |                 res = Math.Round(res, 4); | ||||||
|  |  | ||||||
|  |                 await msg.Reply(string.Format("{0} {1} is equal to {2} {3}", value, (originUnit.Triggers.First() + "s").SnPl(value.IsInteger() ? (int)value : 2), res, (targetUnit.Triggers.First() + "s").SnPl(res.IsInteger() ? (int)res : 2))); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public static async Task<Rates> UpdateCurrencyRates() | ||||||
|  |         { | ||||||
|  |             using (var http = new HttpClient()) | ||||||
|  |             { | ||||||
|  |                 var res = await http.GetStringAsync("http://api.fixer.io/latest").ConfigureAwait(false); | ||||||
|  |                 return JsonConvert.DeserializeObject<Rates>(res); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										11
									
								
								src/NadekoBot/Modules/Utility/Models/MeasurementUnit.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/NadekoBot/Modules/Utility/Models/MeasurementUnit.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | using System.Collections.Generic; | ||||||
|  |  | ||||||
|  | namespace NadekoBot.Modules.Utility.Commands.Models | ||||||
|  | { | ||||||
|  |     public class MeasurementUnit | ||||||
|  |     { | ||||||
|  |         public List<string> Triggers { get; set; } | ||||||
|  |         public string UnitType { get; set; } | ||||||
|  |         public decimal Modifier { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								src/NadekoBot/Modules/Utility/Models/Rates.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/NadekoBot/Modules/Utility/Models/Rates.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | using Newtonsoft.Json; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  |  | ||||||
|  | namespace NadekoBot.Modules.Utility.Commands.Models | ||||||
|  | { | ||||||
|  |     public class Rates | ||||||
|  |     { | ||||||
|  |         public string Base { get; set; } | ||||||
|  |         public DateTime Date { get; set; } | ||||||
|  |         [JsonProperty("rates")] | ||||||
|  |         public Dictionary<string, decimal> ConversionRates { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								src/NadekoBot/Resources/CommandStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										10
									
								
								src/NadekoBot/Resources/CommandStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							| @@ -1122,7 +1122,7 @@ namespace NadekoBot.Resources { | |||||||
|         } |         } | ||||||
|          |          | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         ///    Looks up a localized string similar to Toggles automatic deleting of invites posted in the channel. Does not negate the .srvrfilterinv enabled setting.. |         ///    Looks up a localized string similar to Toggles automatic deleting of invites posted in the channel. Does not negate the .srvrfilterinv enabled setting. Does not affect Bot Owner.. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public static string chnlfilterinv_desc { |         public static string chnlfilterinv_desc { | ||||||
|             get { |             get { | ||||||
| @@ -1149,7 +1149,7 @@ namespace NadekoBot.Resources { | |||||||
|         } |         } | ||||||
|          |          | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         ///    Looks up a localized string similar to Toggles automatic deleting of messages containing banned words on the channel. Does not negate the .srvrfilterwords enabled setting.. |         ///    Looks up a localized string similar to Toggles automatic deleting of messages containing banned words on the channel. Does not negate the .srvrfilterwords enabled setting. Does not affect bot owner.. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public static string chnlfilterwords_desc { |         public static string chnlfilterwords_desc { | ||||||
|             get { |             get { | ||||||
| @@ -2310,7 +2310,7 @@ namespace NadekoBot.Resources { | |||||||
|         } |         } | ||||||
|          |          | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         ///    Looks up a localized string similar to Adds or removes (if it exists) a word from the list of filtered words.. |         ///    Looks up a localized string similar to Adds or removes (if it exists) a word from the list of filtered words. Use` ;sfw` or `;cfw` to toggle filtering.. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public static string filterword_desc { |         public static string filterword_desc { | ||||||
|             get { |             get { | ||||||
| @@ -6387,7 +6387,7 @@ namespace NadekoBot.Resources { | |||||||
|         } |         } | ||||||
|          |          | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         ///    Looks up a localized string similar to Toggles automatic deleting of invites posted in the server.. |         ///    Looks up a localized string similar to Toggles automatic deleting of invites posted in the server. Does not affect Bot Owner.. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public static string srvrfilterinv_desc { |         public static string srvrfilterinv_desc { | ||||||
|             get { |             get { | ||||||
| @@ -6414,7 +6414,7 @@ namespace NadekoBot.Resources { | |||||||
|         } |         } | ||||||
|          |          | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         ///    Looks up a localized string similar to Toggles automatic deleting of messages containing forbidden words on the server.. |         ///    Looks up a localized string similar to Toggles automatic deleting of messages containing forbidden words on the server. Does not affect Bot Owner.. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public static string srvrfilterwords_desc { |         public static string srvrfilterwords_desc { | ||||||
|             get { |             get { | ||||||
|   | |||||||
| @@ -958,7 +958,7 @@ | |||||||
|     <value>chnlfilterinv cfi</value> |     <value>chnlfilterinv cfi</value> | ||||||
|   </data> |   </data> | ||||||
|   <data name="chnlfilterinv_desc" xml:space="preserve"> |   <data name="chnlfilterinv_desc" xml:space="preserve"> | ||||||
|     <value>Toggles automatic deleting of invites posted in the channel. Does not negate the .srvrfilterinv enabled setting.</value> |     <value>Toggles automatic deleting of invites posted in the channel. Does not negate the .srvrfilterinv enabled setting. Does not affect Bot Owner.</value> | ||||||
|   </data> |   </data> | ||||||
|   <data name="chnlfilterinv_usage" xml:space="preserve"> |   <data name="chnlfilterinv_usage" xml:space="preserve"> | ||||||
|     <value>`;cfi`</value> |     <value>`;cfi`</value> | ||||||
| @@ -967,7 +967,7 @@ | |||||||
|     <value>srvrfilterinv sfi</value> |     <value>srvrfilterinv sfi</value> | ||||||
|   </data> |   </data> | ||||||
|   <data name="srvrfilterinv_desc" xml:space="preserve"> |   <data name="srvrfilterinv_desc" xml:space="preserve"> | ||||||
|     <value>Toggles automatic deleting of invites posted in the server.</value> |     <value>Toggles automatic deleting of invites posted in the server. Does not affect Bot Owner.</value> | ||||||
|   </data> |   </data> | ||||||
|   <data name="srvrfilterinv_usage" xml:space="preserve"> |   <data name="srvrfilterinv_usage" xml:space="preserve"> | ||||||
|     <value>`;sfi`</value> |     <value>`;sfi`</value> | ||||||
| @@ -976,7 +976,7 @@ | |||||||
|     <value>chnlfilterwords cfw</value> |     <value>chnlfilterwords cfw</value> | ||||||
|   </data> |   </data> | ||||||
|   <data name="chnlfilterwords_desc" xml:space="preserve"> |   <data name="chnlfilterwords_desc" xml:space="preserve"> | ||||||
|     <value>Toggles automatic deleting of messages containing banned words on the channel. Does not negate the .srvrfilterwords enabled setting.</value> |     <value>Toggles automatic deleting of messages containing banned words on the channel. Does not negate the .srvrfilterwords enabled setting. Does not affect bot owner.</value> | ||||||
|   </data> |   </data> | ||||||
|   <data name="chnlfilterwords_usage" xml:space="preserve"> |   <data name="chnlfilterwords_usage" xml:space="preserve"> | ||||||
|     <value>`;cfw`</value> |     <value>`;cfw`</value> | ||||||
| @@ -985,7 +985,7 @@ | |||||||
|     <value>fw</value> |     <value>fw</value> | ||||||
|   </data> |   </data> | ||||||
|   <data name="filterword_desc" xml:space="preserve"> |   <data name="filterword_desc" xml:space="preserve"> | ||||||
|     <value>Adds or removes (if it exists) a word from the list of filtered words.</value> |     <value>Adds or removes (if it exists) a word from the list of filtered words. Use` ;sfw` or `;cfw` to toggle filtering.</value> | ||||||
|   </data> |   </data> | ||||||
|   <data name="filterword_usage" xml:space="preserve"> |   <data name="filterword_usage" xml:space="preserve"> | ||||||
|     <value>`;fw poop`</value> |     <value>`;fw poop`</value> | ||||||
| @@ -1003,7 +1003,7 @@ | |||||||
|     <value>srvrfilterwords sfw</value> |     <value>srvrfilterwords sfw</value> | ||||||
|   </data> |   </data> | ||||||
|   <data name="srvrfilterwords_desc" xml:space="preserve"> |   <data name="srvrfilterwords_desc" xml:space="preserve"> | ||||||
|     <value>Toggles automatic deleting of messages containing forbidden words on the server.</value> |     <value>Toggles automatic deleting of messages containing forbidden words on the server. Does not affect Bot Owner.</value> | ||||||
|   </data> |   </data> | ||||||
|   <data name="srvrfilterwords_usage" xml:space="preserve"> |   <data name="srvrfilterwords_usage" xml:space="preserve"> | ||||||
|     <value>`;sfw`</value> |     <value>`;sfw`</value> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user