forked from ProgrammerDan/BanStick
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #3 from Maxopoly/master
Banstick association exclusions by Maxopoly
- Loading branch information
Showing
11 changed files
with
863 additions
and
211 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
54 changes: 54 additions & 0 deletions
54
src/main/java/com/programmerdan/minecraft/banstick/commands/GetAltsCommand.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
package com.programmerdan.minecraft.banstick.commands; | ||
|
||
import com.programmerdan.minecraft.banstick.data.BSPlayer; | ||
import java.util.Set; | ||
import java.util.UUID; | ||
import org.bukkit.ChatColor; | ||
import org.bukkit.command.Command; | ||
import org.bukkit.command.CommandExecutor; | ||
import org.bukkit.command.CommandSender; | ||
|
||
public class GetAltsCommand implements CommandExecutor { | ||
|
||
public static String name = "getalts"; | ||
|
||
@Override | ||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { | ||
if (args.length != 1) { | ||
sender.sendMessage(ChatColor.RED + "You must specify a single player name or uuid"); | ||
return false; | ||
} | ||
UUID uuid = UntangleCommand.resolveName(args [0]); | ||
if (uuid == null) { | ||
sender.sendMessage(ChatColor.RED + "Could not parse player: " + args [0]); | ||
return false; | ||
} | ||
BSPlayer player = BSPlayer.byUUID(uuid); | ||
if (player == null) { | ||
sender.sendMessage(ChatColor.RED + "Player with uuid is not known: " + uuid.toString()); | ||
return false; | ||
} | ||
Set<BSPlayer> directAssoc = player.getTransitiveSharedPlayers(true); | ||
Set<BSPlayer> ignoredAssoc = player.getTransitiveSharedPlayers(false); | ||
StringBuilder sb = new StringBuilder(); | ||
sb.append(ChatColor.GOLD + "Directly associated accounts for " + player.getName() + " are: "); | ||
for(BSPlayer alt : directAssoc) { | ||
sb.append(alt.getName()); | ||
sb.append(" "); | ||
} | ||
sender.sendMessage(sb.toString()); | ||
sb = new StringBuilder(); | ||
sb.append(ChatColor.GOLD + "Associated accounts split off through exclusions are: "); | ||
for(BSPlayer alt : ignoredAssoc) { | ||
if (directAssoc.contains(alt)) { | ||
continue; | ||
} | ||
sb.append(alt.getName()); | ||
sb.append(" "); | ||
} | ||
sender.sendMessage(sb.toString()); | ||
return true; | ||
} | ||
|
||
|
||
} |
119 changes: 119 additions & 0 deletions
119
src/main/java/com/programmerdan/minecraft/banstick/commands/UntangleCommand.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
package com.programmerdan.minecraft.banstick.commands; | ||
|
||
import com.programmerdan.minecraft.banstick.data.BSExclusion; | ||
import com.programmerdan.minecraft.banstick.data.BSPlayer; | ||
import java.util.HashSet; | ||
import java.util.Set; | ||
import java.util.UUID; | ||
import org.bukkit.Bukkit; | ||
import org.bukkit.ChatColor; | ||
import org.bukkit.OfflinePlayer; | ||
import org.bukkit.command.Command; | ||
import org.bukkit.command.CommandExecutor; | ||
import org.bukkit.command.CommandSender; | ||
import org.bukkit.entity.Player; | ||
import vg.civcraft.mc.namelayer.NameAPI; | ||
|
||
public class UntangleCommand implements CommandExecutor { | ||
|
||
public static String name = "untangle"; | ||
|
||
@Override | ||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { | ||
if (args.length == 0) { | ||
sender.sendMessage(ChatColor.RED + "You must specify player names or uuids"); | ||
return true; | ||
} | ||
Set<BSPlayer> subGraphPlayers = new HashSet<>(); | ||
Set<BSPlayer> allGraphPlayers = new HashSet<>(); | ||
// parse uuids out of the command | ||
for (String arg : args) { | ||
UUID uuid = resolveName(arg); | ||
if (uuid == null) { | ||
sender.sendMessage(ChatColor.RED + "Could not parse player: " + arg); | ||
return false; | ||
} | ||
subGraphPlayers.add(BSPlayer.byUUID(uuid)); | ||
} | ||
// Determine all nodes (players) in the graph (association network) we are creating a subgraph off | ||
for (BSPlayer player : subGraphPlayers) { | ||
allGraphPlayers.addAll(player.getTransitiveSharedPlayers(true)); | ||
} | ||
|
||
int delCounter = 0; | ||
// Delete all preexisting exclusions within this graph | ||
for (BSPlayer playerOuter : allGraphPlayers) { | ||
for (BSPlayer playerInner : allGraphPlayers) { | ||
BSExclusion excl = playerOuter.getExclusionWith(playerInner); | ||
if (excl != null) { | ||
excl.delete(); | ||
delCounter++; | ||
} | ||
} | ||
} | ||
|
||
int createCounter = 0; | ||
// create exclusions between all players in the new subgraph and all players not in the new subgraph | ||
Set<BSPlayer> outsideSubGraphPlayers = new HashSet<>(allGraphPlayers); | ||
outsideSubGraphPlayers.removeAll(subGraphPlayers); | ||
for (BSPlayer inside : subGraphPlayers) { | ||
for (BSPlayer outside : outsideSubGraphPlayers) { | ||
BSExclusion excl = BSExclusion.create(inside, outside); | ||
inside.addExclusion(excl); | ||
outside.addExclusion(excl); | ||
createCounter++; | ||
} | ||
} | ||
sender.sendMessage(ChatColor.GREEN + String.format( | ||
"Added exclusions to group containing %d players. %d exclusions were created and %d exclusions were deleted", | ||
allGraphPlayers.size(), createCounter, delCounter)); | ||
StringBuilder sb = new StringBuilder(); | ||
for(BSPlayer player : subGraphPlayers) { | ||
sb.append(player.getName()); | ||
sb.append(":"); | ||
sb.append(player.getUUID()); | ||
sb.append(" "); | ||
} | ||
sender.sendMessage(ChatColor.GREEN + String.format("First group created contains %d players: %s", subGraphPlayers.size(), sb.toString())); | ||
|
||
sb = new StringBuilder(); | ||
for(BSPlayer player : outsideSubGraphPlayers) { | ||
sb.append(player.getName()); | ||
sb.append(":"); | ||
sb.append(player.getUUID()); | ||
sb.append(" "); | ||
} | ||
sender.sendMessage(ChatColor.GREEN + String.format("Second group created contains %d players: %s", outsideSubGraphPlayers.size(), sb.toString())); | ||
return true; | ||
} | ||
|
||
public static UUID resolveName(String input) { | ||
UUID playerId = null; | ||
if (input.length() <= 16) { | ||
// interpret as player name | ||
try { | ||
return NameAPI.getUUID(input); | ||
} catch (NoClassDefFoundError ncde) { | ||
} | ||
if (playerId == null) { | ||
Player match = Bukkit.getPlayer(input); | ||
if (match != null) { | ||
return match.getUniqueId(); | ||
} else { | ||
OfflinePlayer offPlay = Bukkit.getOfflinePlayer(input); | ||
if (offPlay != null) { | ||
return offPlay.getUniqueId(); | ||
} | ||
} | ||
} | ||
} else if (input.length() == 36) { | ||
try { | ||
playerId = UUID.fromString(input); | ||
} catch (IllegalArgumentException iae) { | ||
return null; | ||
} | ||
} | ||
return null; | ||
} | ||
|
||
} |
Oops, something went wrong.