public void TestConverterts() { TypeConverter playerConverter = TypeConverterExtensions.GetConverter(typeof(IPlayer)); Assert.AreEqual(TestPlayer.Id, ((IPlayer)playerConverter.ConvertFromWithContext(Runtime.Container, TestPlayer.Id)).Id); }
/// <inheritdoc /> public object Get(int index, Type type) { if (type == null) { throw new ArgumentNullException(nameof(type)); } if (Length <= index) { throw new CommandIndexOutOfRangeException(index, Length); } if (index < 0) { throw new IndexOutOfRangeException(); } string arg = ToArray()[index]; bool isUserInfo = typeof(IUserInfo).IsAssignableFrom(type); bool isUser = typeof(IUser).IsAssignableFrom(type); //todo make type converters if (isUserInfo || isUser) { /* * The logic for getting IUser and IUserInfo is as follows: * If the name is supplied as usermanager:username, e.g. discord:Trojaner, it will search for valid "discord" user manager and return the "Trojaner" named user of it. * Otherwise (if the user manager does not exist or the format was not supplied), it will use the player manager and return the user for the given input. */ IUserManager targetUserManager = container.Resolve <IPlayerManager>(); string userName = arg; if (arg.Contains(":")) { var args = arg.Split(':'); string userManagerMapping = args.First(); foreach (var userMgr in container.ResolveAll <IUserManager>()) { if (userMgr.ServiceName.Equals(userManagerMapping, StringComparison.OrdinalIgnoreCase)) { userName = string.Join(":", args.Skip(1).ToArray()); targetUserManager = userMgr; break; } } } if (!isUserInfo) { return(targetUserManager.OnlineUsers .OrderBy(c => c.Name) .First(c => c.Name.Equals(userName, StringComparison.OrdinalIgnoreCase))); } return(targetUserManager.GetUser(userName)); } TypeConverter converter = TypeConverterExtensions.GetConverter(type); if (converter.CanConvertFrom(typeof(string))) { return(converter.ConvertFromWithContext(container, arg)); } throw new CommandParameterParseException(arg, type); }