Skip to content

Commit ff3dcb2

Browse files
committed
Add nick example
1 parent 6094cd8 commit ff3dcb2

File tree

12 files changed

+234
-4
lines changed

12 files changed

+234
-4
lines changed

api/src/main/java/qetz/locker/Outfit.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.common.base.Preconditions;
66
import lombok.AccessLevel;
77
import lombok.RequiredArgsConstructor;
8+
import org.bukkit.entity.Player;
89

910
import java.util.UUID;
1011

@@ -42,6 +43,18 @@ public WrappedGameProfile toGameProfile() {
4243
return profile;
4344
}
4445

46+
public static Outfit originalOutfit(Player player) {
47+
var property = player.getPlayerProfile().getProperties().stream()
48+
.filter(current -> current.getName().equals(skinKey))
49+
.findFirst()
50+
.orElseThrow();
51+
return new Outfit(
52+
player.getName(),
53+
Skin.with(property.getValue(), property.getSignature()),
54+
player.getUniqueId()
55+
);
56+
}
57+
4558
public static Outfit fromGameProfile(WrappedGameProfile profile) {
4659
Preconditions.checkNotNull(profile, "profile");
4760
return new Outfit(

core/src/main/java/qetz/locker/LockerModule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public static LockerModule withPlugin(Plugin plugin) {
1717

1818
@Override
1919
protected void configure() {
20-
bind(PaperLocker.class).toInstance(PaperLocker.create());
20+
bind(PaperLocker.class).toInstance(PaperLocker.withPlugin(plugin));
2121
bind(Plugin.class).toInstance(plugin);
2222
}
2323
}

core/src/main/java/qetz/locker/PaperLocker.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,22 @@
44
import com.google.common.collect.Maps;
55
import lombok.AccessLevel;
66
import lombok.RequiredArgsConstructor;
7+
import org.bukkit.Bukkit;
8+
import org.bukkit.plugin.Plugin;
79

810
import java.util.Map;
911
import java.util.Optional;
1012
import java.util.UUID;
1113

1214
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
1315
public final class PaperLocker implements Locker {
14-
static PaperLocker create() {
15-
return new PaperLocker(Maps.newHashMap());
16+
static PaperLocker withPlugin(Plugin plugin) {
17+
Preconditions.checkNotNull(plugin, "plugin");
18+
return new PaperLocker(Maps.newHashMap(), plugin);
1619
}
1720

1821
private final Map<UUID, Look> looks;
22+
private final Plugin plugin;
1923

2024
private LookFactory factory;
2125

@@ -58,10 +62,21 @@ public Optional<Look> findById(UUID id) {
5862
return Optional.ofNullable(looks.get(id));
5963
}
6064

65+
@SuppressWarnings("ConstantConditions")
6166
@Override
6267
public void changeLook(UUID id, Look look) {
6368
Preconditions.checkNotNull(id, "id");
6469
Preconditions.checkNotNull(look, "look");
70+
if (!looks.containsKey(id)) {
71+
return;
72+
}
73+
var target = Bukkit.getPlayer(id);
74+
for (var player : Bukkit.getOnlinePlayers()) {
75+
player.hidePlayer(plugin, target);
76+
}
6577
looks.put(id, look);
78+
for (var player : Bukkit.getOnlinePlayers()) {
79+
player.showPlayer(plugin, target);
80+
}
6681
}
6782
}

examples/src/main/java/qetz/locker/example/ExampleModule.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.bukkit.plugin.Plugin;
88
import qetz.locker.Locker;
99
import qetz.locker.component.LockerProvider;
10+
import qetz.locker.example.nick.NickModule;
1011

1112
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
1213
public final class ExampleModule extends AbstractModule {
@@ -19,6 +20,8 @@ public static ExampleModule withPlugin(Plugin plugin) {
1920

2021
@Override
2122
protected void configure() {
23+
install(NickModule.create());
24+
2225
bind(Plugin.class).toInstance(plugin);
2326
bind(Locker.class).toProvider(LockerProvider.create());
2427
}

examples/src/main/java/qetz/locker/example/ExamplePlugin.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import org.bukkit.plugin.java.JavaPlugin;
66
import qetz.locker.Locker;
77
import qetz.locker.component.OriginalLookFactory;
8+
import qetz.locker.example.nick.NickCommand;
9+
import qetz.locker.example.nick.NickRegistryListener;
810

911
public final class ExamplePlugin extends JavaPlugin {
1012
private Injector injector;
@@ -16,8 +18,22 @@ public void onLoad() {
1618

1719
@Override
1820
public void onEnable() {
21+
registerLockFactory();
22+
registerNickFeature();
23+
}
24+
25+
private void registerLockFactory() {
1926
var locker = injector.getInstance(Locker.class);
2027
var factory = injector.getInstance(OriginalLookFactory.class);
2128
locker.registerFactory(factory);
2229
}
30+
31+
@SuppressWarnings("ConstantConditions")
32+
private void registerNickFeature() {
33+
getCommand("nick").setExecutor(injector.getInstance(NickCommand.class));
34+
getServer().getPluginManager().registerEvents(
35+
injector.getInstance(NickRegistryListener.class),
36+
this
37+
);
38+
}
2339
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package qetz.locker.example.nick;
2+
3+
import com.google.inject.Inject;
4+
import lombok.AccessLevel;
5+
import lombok.RequiredArgsConstructor;
6+
import org.bukkit.ChatColor;
7+
import org.bukkit.command.Command;
8+
import org.bukkit.command.CommandExecutor;
9+
import org.bukkit.command.CommandSender;
10+
import org.bukkit.entity.Player;
11+
import org.jetbrains.annotations.NotNull;
12+
import qetz.locker.Locker;
13+
import qetz.locker.Outfit;
14+
import qetz.locker.component.SingleLook;
15+
16+
import java.util.UUID;
17+
18+
@RequiredArgsConstructor(access = AccessLevel.PRIVATE, onConstructor_ = @Inject)
19+
public final class NickCommand implements CommandExecutor {
20+
private final NickedLookRepository repository;
21+
private final NickRegistry registry;
22+
private final Locker locker;
23+
24+
private static final String permission = "user.nick";
25+
26+
@Override
27+
public boolean onCommand(
28+
@NotNull CommandSender sender,
29+
@NotNull Command command,
30+
@NotNull String label,
31+
@NotNull String[] options
32+
) {
33+
if (!(sender instanceof Player)) {
34+
return false;
35+
}
36+
var player = (Player) sender;
37+
if (!player.hasPermission(permission)) {
38+
return false;
39+
}
40+
var id = player.getUniqueId();
41+
var nicked = registry.isNicked(id);
42+
changeLook(player, id, nicked);
43+
44+
if (nicked) {
45+
registry.remove(id);
46+
player.sendMessage(ChatColor.RED + "You unnicked yourself.");
47+
} else {
48+
registry.add(id);
49+
player.sendMessage(ChatColor.GREEN + "You nicked yourself.");
50+
}
51+
return true;
52+
}
53+
54+
private void changeLook(Player player, UUID id, boolean nicked) {
55+
var originalOutfit = Outfit.originalOutfit(player);
56+
var newLook = !nicked
57+
? repository.create(permission, originalOutfit)
58+
: SingleLook.withOutfit(originalOutfit);
59+
locker.changeLook(id, newLook);
60+
}
61+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package qetz.locker.example.nick;
2+
3+
import com.google.inject.AbstractModule;
4+
import lombok.AccessLevel;
5+
import lombok.RequiredArgsConstructor;
6+
7+
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
8+
public final class NickModule extends AbstractModule {
9+
public static NickModule create() {
10+
return new NickModule();
11+
}
12+
13+
@Override
14+
protected void configure() {
15+
bind(NickRegistry.class).toInstance(NickRegistry.empty());
16+
}
17+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package qetz.locker.example.nick;
2+
3+
import com.google.common.base.Preconditions;
4+
import com.google.common.collect.Lists;
5+
import lombok.AccessLevel;
6+
import lombok.RequiredArgsConstructor;
7+
8+
import java.util.Collection;
9+
import java.util.UUID;
10+
11+
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
12+
public final class NickRegistry {
13+
public static NickRegistry empty() {
14+
return new NickRegistry(Lists.newArrayList());
15+
}
16+
17+
private final Collection<UUID> nicked;
18+
19+
public void add(UUID target) {
20+
Preconditions.checkNotNull(target, "target");
21+
nicked.add(target);
22+
}
23+
24+
public void remove(UUID target) {
25+
Preconditions.checkNotNull(target, "target");
26+
nicked.remove(target);
27+
}
28+
29+
public boolean isNicked(UUID target) {
30+
Preconditions.checkNotNull(target, "target");
31+
return nicked.contains(target);
32+
}
33+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package qetz.locker.example.nick;
2+
3+
import com.google.inject.Inject;
4+
import lombok.AccessLevel;
5+
import lombok.RequiredArgsConstructor;
6+
import org.bukkit.event.EventHandler;
7+
import org.bukkit.event.Listener;
8+
import org.bukkit.event.player.PlayerQuitEvent;
9+
10+
@RequiredArgsConstructor(access = AccessLevel.PRIVATE, onConstructor_ = @Inject)
11+
public final class NickRegistryListener implements Listener {
12+
private final NickRegistry registry;
13+
14+
@EventHandler
15+
private void removeFromRegistry(PlayerQuitEvent quit) {
16+
registry.remove(quit.getPlayer().getUniqueId());
17+
}
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package qetz.locker.example.nick;
2+
3+
import com.google.inject.ImplementedBy;
4+
import qetz.locker.Outfit;
5+
import qetz.locker.component.NickedLook;
6+
7+
@ImplementedBy(StaticNickedLookRepository.class)
8+
public interface NickedLookRepository {
9+
NickedLook create(String bypassPermission, Outfit original);
10+
}

0 commit comments

Comments
 (0)