Skip to content

Commit

Permalink
Split up /players logic
Browse files Browse the repository at this point in the history
  • Loading branch information
UnknownShadow200 committed May 10, 2021
1 parent 5072048 commit 4694a91
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 54 deletions.
83 changes: 30 additions & 53 deletions MCGalaxy/Commands/Information/CmdPlayers.cs
Expand Up @@ -26,56 +26,38 @@ public sealed class CmdPlayers : Command2 {
public override string type { get { return CommandTypes.Information; } }

public override void Use(Player p, string message, CommandData data) {
int totalPlayers = 0;
if (message.Length > 0) {
Group grp = Matcher.FindRanks(p, message);
if (grp == null) return;

GroupPlayers rankPlayers = Make(p, data, grp, ref totalPlayers);
if (totalPlayers == 0) {
p.Message("There are no players of that rank online.");
} else {
Output(rankPlayers, p, false);
}
return;
}

List<GroupPlayers> allPlayers = new List<GroupPlayers>();
foreach (Group grp in Group.GroupList) {
allPlayers.Add(Make(p, data, grp, ref totalPlayers));
}
List<PlayerInfo.ListEntry> all = PlayerInfo.GetOnlineList(p, data.Rank);
if (message.Length > 0) { ListOfRank(p, message, all); return; }

if (totalPlayers == 1) {
p.Message("There is &a1 &Splayer online.");
} else {
p.Message("There are &a" + totalPlayers + " &Splayers online.");
int total = 0;
foreach (PlayerInfo.ListEntry e in all) {
total += e.players.Count;
}
p.Message("There are &a{0} &Splayer{1} online.",
total, total != 0 ? "s" : "");

for (int i = allPlayers.Count - 1; i >= 0; i--) {
Output(allPlayers[i], p, Server.Config.ListEmptyRanks);
for (int i = all.Count - 1; i >= 0; i--) {
Output(all[i], p, Server.Config.ListEmptyRanks);
}
}

struct GroupPlayers { public Group group; public StringBuilder builder; }
static GroupPlayers Make(Player p, CommandData data, Group group, ref int totalPlayers) {
GroupPlayers list;
list.group = group;
list.builder = new StringBuilder();
static void ListOfRank(Player p, string name, List<PlayerInfo.ListEntry> all) {
Group grp = Matcher.FindRanks(p, name);
if (grp == null) return;
PlayerInfo.ListEntry rank = all.Find(e => e.group == grp);

Player[] online = PlayerInfo.Online.Items;
foreach (Player pl in online) {
if (pl.group != group || !p.CanSee(pl, data.Rank)) continue;

totalPlayers++;
Append(p, list, pl);
if (rank == null || rank.players.Count == 0) {
p.Message("There are no {0} &Sonline.",
rank.group.GetFormattedName());
} else {
Output(rank, p, false);
}
return list;
return;
}

static void Append(Player target, GroupPlayers list, Player p) {
StringBuilder data = list.builder;
static void Append(Player target, StringBuilder data, Player p, Group group) {
data.Append(' ');
if (p.voice) { data.Append("&f+").Append(list.group.Color); }
if (p.voice) { data.Append("&f+").Append(group.Color); }
data.Append(Colors.StripUsed(target.FormatNick(p)));

if (p.hidden) data.Append("-hidden");
Expand All @@ -89,22 +71,17 @@ struct GroupPlayers { public Group group; public StringBuilder builder; }
data.Append(" (").Append(lvlName).Append("),");
}

static string GetPlural(string name) {
if (name.Length < 2) return name;
static void Output(PlayerInfo.ListEntry e, Player p, bool showWhenEmpty) {
if (e.players.Count == 0 && !showWhenEmpty) return;
StringBuilder data = new StringBuilder();

string last2 = name.Substring(name.Length - 2).ToLower();
if ((last2 != "ed" || name.Length <= 3) && last2[1] != 's')
return name + "s";
return name;
}

static void Output(GroupPlayers list, Player p, bool showWhenEmpty) {
StringBuilder data = list.builder;
if (data.Length == 0 && !showWhenEmpty) return;
if (data.Length > 0) data.Remove(data.Length - 1, 1);
foreach (Player pl in e.players) {
Append(p, data, pl, e.group);
}

string title = ":" + list.group.Color + GetPlural(list.group.Name) + ":";
p.Message(title + data.ToString());
// remove , from end
data.Remove(data.Length - 1, 1);
p.Message(":{0}:{1}", e.group.GetFormattedName(), data);
}

public override void Help(Player p) {
Expand Down
13 changes: 13 additions & 0 deletions MCGalaxy/Player/Group/Group.cs
Expand Up @@ -147,6 +147,8 @@ public sealed partial class Group {
return "&f" + rankName;
}

/// <summary> Returns the color of the group with the given permission level </summary>
/// <remarks> Returns white if no such group exists </remarks>
public static string GetColor(LevelPermission perm) {
Group grp = Find(perm);
if (grp != null) return grp.Color;
Expand All @@ -164,6 +166,17 @@ public sealed partial class Group {
return grp != null ? grp.Permission : defPerm;
}

static string GetPlural(string name) {
if (name.Length < 2) return name;

string last2 = name.Substring(name.Length - 2).ToLower();
if ((last2 != "ed" || name.Length <= 3) && last2[1] != 's')
return name + "s";
return name;
}

public string GetFormattedName() { return Color + GetPlural(Name); }


public static void Register(Group grp) {
GroupList.Add(grp);
Expand Down
2 changes: 1 addition & 1 deletion MCGalaxy/Player/List/PlayerList.cs
Expand Up @@ -91,7 +91,7 @@ public class PlayerList {
}

/// <summary> Outputs list of players using MultiPageOutput.Output. </summary>
/// <remarks> Names are formatted using PlayerInfo.GetColoredName(). </remarks>
/// <remarks> Names are formatted using Player.FormatNick(). </remarks>
public void Output(Player p, string group, string listCmd, string modifier) {
List<string> list = All();
if (list.Count == 0) {
Expand Down
25 changes: 25 additions & 0 deletions MCGalaxy/Player/PlayerInfo.cs
Expand Up @@ -137,5 +137,30 @@ public static class PlayerInfo {
}
return list;
}


public class ListEntry { public Group group; public List<Player> players; }
/// <summary> Returns all online players the given player can see, ordered by group </summary>
public static List<ListEntry> GetOnlineList(Player p, LevelPermission plRank) {
List<ListEntry> all = new List<ListEntry>();

foreach (Group group in Group.GroupList) {
all.Add(OnlineOfRank(p, plRank, group));
}
return all;
}

static ListEntry OnlineOfRank(Player p, LevelPermission plRank, Group group) {
ListEntry entry = new ListEntry();
entry.group = group;
entry.players = new List<Player>();

Player[] online = PlayerInfo.Online.Items;
foreach (Player pl in online) {
if (pl.group != group || !p.CanSee(pl, plRank)) continue;
entry.players.Add(pl);
}
return entry;
}
}
}

0 comments on commit 4694a91

Please sign in to comment.