public static BigInt GetBigInt(string key, BigInt defaultValue) { var str = PlayerPrefs.GetString(key, null); if (str == null) { return(defaultValue); } BigInt result; if (BigInt.TryParse(str, out result)) { return(result); } return(defaultValue); }
public static bool Invoke(Message message) { var split = message.Content.Split(' '); var root = split[0]; foreach (var info in AllCommands) { if (info.ValidateStrings?.Any(s => s == root) == true || info.Regex?.IsMatch(root) == true || info.MethodInfo.Name == root) { if (info.RequireAdmin && !Config.Instance.GetPlayerConfig(message.Sender).Admin) { throw new DoudizhuCommandParseException("你不是管理"); } var reqParameters = info.MethodInfo.GetParameters().SkipInject().ToArray(); var parameters = split.Skip(1).ToArray(); if (parameters.Length > reqParameters.Length) { throw new DoudizhuCommandParseException("参数数量过多"); } if (parameters.Length < reqParameters.Length - reqParameters.Count(p => p.IsOptional)) { throw new DoudizhuCommandParseException("参数不全"); } // input check for (var index = 0; index < parameters.Length; index++) { var param = parameters[index]; var reqparam = reqParameters[index]; if (string.IsNullOrWhiteSpace(param)) { throw new DoudizhuCommandParseException($"参数{index}为空, 需求为{GetParamHelp(reqparam)}"); } if (reqparam.ParameterType == typeof(Number) && !Number.TryParse(param, out _)) { throw new DoudizhuCommandParseException($"参数{index}不是数字, 需求为{GetParamHelp(reqparam)}"); } } var game = new Lazy <Game>(() => GamesManager.Games[message.Group]); var currentPlayer = new Lazy <Player>(() => game.Value.CurrentPlayer); var senderPlayer = new Lazy <Player>(() => game.Value.GetPlayer(message.Sender)); // attrib check var stateOnly = info.MethodInfo.GetCustomAttribute <StateOnlyAttribute>(); if (stateOnly != null) { if (!GamesManager.Games.ContainsKey(message.Group)) { throw new DoudizhuCommandParseException("该群没有游戏."); } if (stateOnly.GameState != game.Value.State) { throw new DoudizhuCommandParseException($"该命令需求游戏在以下状态{stateOnly.GameState}."); //TODO } } var playerOnly = info.MethodInfo.GetCustomAttribute <PlayerOnlyAttribute>(); if (playerOnly != null) { if (!GamesManager.Games.ContainsKey(message.Group)) { throw new DoudizhuCommandParseException("该群没有游戏."); } switch (playerOnly.PlayerState) { case PlayerState.InGame: if (senderPlayer.Value == null) { throw new DoudizhuCommandParseException("该命令需求你在游戏中."); } break; case PlayerState.CurrentPlayer: if (senderPlayer.Value == null || currentPlayer.Value != senderPlayer.Value) { throw new DoudizhuCommandParseException("该命令需求你是当前玩家."); } break; case PlayerState.ChooseLandlordPlayer: if (senderPlayer.Value != game.Value.GetPlayerByIndex(((ChooseLandlordData)game.Value.StateData).LandlordIndex)) { throw new DoudizhuCommandParseException("该命令需求你是当前玩家."); } break; default: throw new ArgumentOutOfRangeException(); } } // build params var iReqParams = info.MethodInfo.GetParameters(); Debug.Assert(iReqParams.Count(obj => obj.IsAttributeDefined <InjectAttribute>()) == 0 || iReqParams.Length == 0 || (iReqParams.First().IsAttributeDefined <InjectAttribute>() && iReqParams.Select((param, index) => new { param, index }) .Where(obj => obj.param.IsAttributeDefined <InjectAttribute>()) .Select(obj => obj.index) .ToArray().IsSequential(i => i))); var list = new List <object>(); var callbacks = new HashSet <Action>(); foreach (var pinfo in iReqParams.Where(p => p.IsAttributeDefined <InjectAttribute>())) { if (pinfo.ParameterType == typeof(Config)) { list.Add(Config.Instance); callbacks.Add(Config.Save); continue; } if (pinfo.ParameterType == typeof(Game)) { if (!GamesManager.Games.ContainsKey(message.Group)) { throw new DoudizhuCommandParseException("该群没有游戏, 请先使用[创建游戏]."); } list.Add(game.Value); continue; } if (pinfo.ParameterType == typeof(PlayerConfig)) { list.Add(Config.Instance.GetPlayerConfig(message.Sender)); callbacks.Add(Config.Save); continue; } if (pinfo.ParameterType.IsSubclassOf(typeof(StateData))) { list.Add(game.Value.StateData); continue; } if (pinfo.ParameterType == typeof(TargetSender)) { list.Add(message.Group.GetGroupSender()); continue; } if (pinfo.ParameterType == typeof(Player)) { list.Add(senderPlayer.Value); continue; } var attrib = pinfo.GetCustomAttribute <InjectAttribute>(); switch (attrib.Injectwhat) { case Injects.PlayerID: list.Add(message.Sender); continue; case Injects.GameID: list.Add(message.Group); continue; } Debug.Assert(1 + 1 != 2); } for (var index = 0; index < reqParameters.Length; index++) { var param = parameters.SafeGet(index); var reqparam = reqParameters[index]; if (reqparam.IsOptional && param == null) { list.Add(Type.Missing); continue; } if (reqparam.ParameterType == typeof(Number)) { list.Add(Number.Parse(param)); continue; } if (reqparam.ParameterType == typeof(string)) { list.Add(param); continue; } throw new NotSupportedException("Fork 您"); } var result = info.MethodInfo.Invoke(Activator.CreateInstance(info.MethodInfo.DeclaringType), list.ToArray()); if (result == null) { return(true); } switch (result) { case string s: message.Group.GetGroupSender().Send(s); break; default: throw new NotSupportedException("Fork 您"); } callbacks.ForEach(c => c()); // TODO return(true); } } return(false); }