/// <summary> Finds player by name pattern. </summary> /// <param name="pattern"> Pattern to search for. /// Asterisk (*) matches zero or more characters. /// Question mark (?) matches exactly one character. </param> /// <param name="limit"> Maximum number of results to return. </param> /// <returns> A sequence of zero or more PlayerInfos whose names match the pattern. </returns> public IEnumerable <PlayerInfo> FindByPattern(string pattern, int limit) { if (pattern == null) { throw new ArgumentNullException("pattern"); } string regexString = "^" + RegexNonNameChars.Replace(pattern, "").Replace("*", ".*").Replace("?", ".") + "$"; Regex regex = new Regex(regexString, RegexOptions.IgnoreCase); List <PlayerInfo> result = new List <PlayerInfo>(); using (PlayerDB.GetReadLock()) { int total = PlayerDB.List.Count; for (int i = 0; i < total; i++) { if (regex.IsMatch(PlayerDB.List[i].Name)) { result.Add(PlayerDB.List[i]); if (result.Count >= limit) { break; } } } } return(result.ToArray()); }
/// <summary> Finds players by partial name (prefix). </summary> /// <param name="partialName"> Full or partial name of the player. </param> /// <param name="limit"> Maximum number of results to return. </param> /// <returns> A sequence of zero or more PlayerInfos whose names start with partialName. </returns> public IEnumerable <PlayerInfo> FindByPartialName(string partialName, int limit) { if (partialName == null) { throw new ArgumentNullException("partialName"); } using (PlayerDB.GetReadLock()) { return(trie.GetList(partialName, limit).ToArray()); } }
static void MassRankHandler(Player player, CommandReader cmd) { string fromRankName = cmd.Next(); string toRankName = cmd.Next(); string reason = cmd.NextAll(); if (fromRankName == null || toRankName == null) { CdMassRank.PrintUsage(player); return; } Rank fromRank = RankManager.FindRank(fromRankName); if (fromRank == null) { player.MessageNoRank(fromRankName); return; } Rank toRank = RankManager.FindRank(toRankName); if (toRank == null) { player.MessageNoRank(toRankName); return; } if (fromRank == toRank) { player.Message("Ranks must be different"); return; } int playerCount; using (PlayerDB.GetReadLock()) { playerCount = PlayerDB.List.Count(t => t.Rank == fromRank); } string verb = (fromRank > toRank ? "demot" : "promot"); if (!cmd.IsConfirmed) { player.Confirm(cmd, "MassRank: {0}e {1} players?", verb.UppercaseFirst(), playerCount); return; } player.Message("MassRank: {0}ing {1} players...", verb, playerCount); int affected = PlayerDB.MassRankChange(player, fromRank, toRank, reason); player.Message("MassRank: done, {0} records affected.", affected); }
/// <summary> Finds players by IP address. </summary> /// <param name="address"> Player's IP address. </param> /// <param name="limit"> Maximum number of results to return. </param> /// <returns> A sequence of zero or more PlayerInfos who have logged in from given IP. </returns> public IEnumerable <PlayerInfo> FindByIP(IPAddress address, int limit) { if (address == null) { throw new ArgumentNullException("address"); } List <PlayerInfo> result = new List <PlayerInfo>(); using (PlayerDB.GetReadLock()) { int total = PlayerDB.List.Count; for (int i = 0; i < total; i++) { if (PlayerDB.List[i].LastIP.Equals(address)) { result.Add(PlayerDB.List[i]); if (result.Count >= limit) { break; } } } return(result.ToArray()); } }