static void RankHandler( Player player, CommandReader cmd ) { string name = cmd.Next(); string newRankName = cmd.Next(); // Check arguments if( name == null || newRankName == null ) { CdRank.PrintUsage( player ); player.Message( "See &H/Ranks&S for list of ranks." ); return; } // Parse rank name Rank newRank = RankManager.FindRank( newRankName ); if( newRank == null ) { player.MessageNoRank( newRankName ); return; } if( name == "-" ) { if( player.LastUsedPlayerName != null ) { name = player.LastUsedPlayerName; } else { player.Message( "Cannot repeat player name: you haven't used any names yet." ); return; } } PlayerInfo targetInfo; // Find player by name if( name.StartsWith( "!" ) ) { name = name.Substring( 1 ); Player target = Server.FindPlayerExact( player, name, false ); if( target == null ) { player.MessageNoPlayer( name ); return; } targetInfo = target.Info; } else { targetInfo = PlayerDB.FindPlayerInfoExact( name ); } // Handle non-existent players if( targetInfo == null ) { if( !player.Can( Permission.EditPlayerDB ) ) { player.MessageNoPlayer( name ); return; } if( !Player.IsValidName( name ) ) { player.MessageInvalidPlayerName( name ); CdRank.PrintUsage( player ); return; } if( cmd.IsConfirmed ) { if( newRank > RankManager.DefaultRank ) { targetInfo = PlayerDB.AddFakeEntry( name, RankChangeType.Promoted ); } else { targetInfo = PlayerDB.AddFakeEntry( name, RankChangeType.Demoted ); } } else { Logger.Log( LogType.UserActivity, "Rank: Asked {0} to confirm adding unrecognized name \"{1}\" to the database.", player.Name, name ); player.Confirm( cmd, "Warning: Player \"{0}\" is not in the database (possible typo). Type the full name or", name ); return; } } try { player.LastUsedPlayerName = targetInfo.Name; targetInfo.ChangeRank( player, newRank, cmd.NextAll(), true, true, false ); } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); } }
public static PlayerInfo FindPlayerInfoOrPrintMatches([NotNull] Player player, [NotNull] string namePart, SearchOptions options) { if (player == null) { throw new ArgumentNullException("player"); } if (namePart == null) { throw new ArgumentNullException("namePart"); } CheckIfLoaded(); bool includeSelf = (options & SearchOptions.IncludeSelf) != 0; bool returnSelf = (options & SearchOptions.ReturnSelfIfOnlyMatch) != 0; // If name starts with '!', return matches for online players only if (namePart.Length > 1 && namePart[0] == '!') { namePart = namePart.Substring(1); Player targetPlayer = Server.FindPlayerOrPrintMatches(player, namePart, options); if (targetPlayer != null) { return(targetPlayer.Info); } else { player.Message("No online players found matching \"{0}\"", namePart); return(null); } } // Repeat last-used player name if (namePart == "-") { if (player.LastUsedPlayerName != null) { namePart = player.LastUsedPlayerName; } else { player.Message("Cannot repeat player name: you haven't used any names yet."); return(null); } } // Make sure player name is valid if (!Player.ContainsValidCharacters(namePart)) { player.MessageInvalidPlayerName(namePart); return(null); } // Search for exact matches first PlayerInfo target = FindPlayerInfoExact(namePart); // If no exact match was found, look for partial matches if (target == null || target == player.Info && !includeSelf) { PlayerInfo[] targets = FindPlayers(namePart); if (!includeSelf) { // special handling if IncludeSelf flag is not set if (targets.Length > 1) { targets = targets.Where(p => p != player.Info).ToArray(); } else if (!returnSelf && targets.Length == 1 && targets[0] == player.Info) { // special handling if ReturnSelfIfOnlyMatch flag is not set targets = new PlayerInfo[0]; } } if (targets.Length == 0) { // No matches player.MessageNoPlayer(namePart); return(null); } else if (targets.Length > 1) { // More than one match Array.Sort(targets, new PlayerInfoComparer(player)); player.MessageManyMatches("player", targets.Take(MatchesToPrint).ToArray()); return(null); } // else: one match! target = targets[0]; } // If a single name has been found, set it as LastUsedPlayerName if (includeSelf || target != player.Info) { player.LastUsedPlayerName = target.Name; } return(target); }
public static void RankHandler( Player player, Command cmd ) { string name = cmd.Next(); string newRankName = cmd.Next(); // Check arguments if( name == null || newRankName == null ) { CdRank.PrintUsage( player ); player.Message( "See &H/Ranks&S for list of ranks." ); return; } // Parse rank name Rank newRank = RankManager.FindRank( newRankName ); if( newRank == null ) { player.MessageNoRank( newRankName ); return; } // Parse player name if( name == "-" ) { if( player.LastUsedPlayerName != null ) { name = player.LastUsedPlayerName; } else { player.Message( "Cannot repeat player name: you haven't used any names yet." ); return; } } PlayerInfo targetInfo = PlayerDB.FindPlayerInfoExact( name ); if( targetInfo == null ) { if( !player.Can( Permission.EditPlayerDB ) ) { player.MessageNoPlayer( name ); return; } if( !Player.IsValidName( name ) ) { player.MessageInvalidPlayerName( name ); CdRank.PrintUsage( player ); return; } if( cmd.IsConfirmed ) { if( newRank > RankManager.DefaultRank ) { targetInfo = PlayerDB.AddFakeEntry( name, RankChangeType.Promoted ); } else { targetInfo = PlayerDB.AddFakeEntry( name, RankChangeType.Demoted ); } } else { player.Confirm( cmd, "Warning: Player \"{0}\" is not in the database (possible typo). Type the full name or", name ); return; } } try { player.LastUsedPlayerName = targetInfo.Name; //reset temprank values if (targetInfo.isTempRanked) { targetInfo.isTempRanked = false; targetInfo.tempRankTime = TimeSpan.FromSeconds(0); } targetInfo.ChangeRank( player, newRank, cmd.NextAll(), true, true, false ); } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); } }
public static PlayerInfo FindPlayerInfoOrPrintMatches([NotNull] Player player, [NotNull] string partialName) { if (player == null) { throw new ArgumentNullException("player"); } if (partialName == null) { throw new ArgumentNullException("partialName"); } CheckIfLoaded(); // If name starts with '!', return matches for online players only if (partialName.Length > 1 && partialName[0] == '!') { partialName = partialName.Substring(1); Player targetPlayer = Server.FindPlayerOrPrintMatches(player, partialName, false, true); if (targetPlayer != null) { return(targetPlayer.Info); } else { player.Message("No online players found matching \"{0}\"", partialName); return(null); } } // Repeat last-used player name if (partialName == "-") { if (player.LastUsedPlayerName != null) { partialName = player.LastUsedPlayerName; } else { player.Message("Cannot repeat player name: you haven't used any names yet."); return(null); } } // Make sure player name is valid if (!Player.ContainsValidCharacters(partialName)) { player.MessageInvalidPlayerName(partialName); return(null); } // Search for exact matches first PlayerInfo target = FindPlayerInfoExact(partialName); // If no exact match was found, look for partial matches if (target == null) { PlayerInfo[] targets = FindPlayers(partialName); if (targets.Length == 0) { // No matches player.MessageNoPlayer(partialName); return(null); } else if (targets.Length > 1) { // More than one match Array.Sort(targets, new PlayerInfoComparer(player)); player.MessageManyMatches("player", targets.Take(25).ToArray()); return(null); } // else: one match! target = targets[0]; } // If a single name has been found, set it as LastUsedPlayerName player.LastUsedPlayerName = target.Name; return(target); }