summaryrefslogtreecommitdiffstats
path: root/Essentials/src/com/earth2me/essentials/commands/Commandnick.java
blob: e9e258085ac03174a02c4e6463847d21bdbdb136 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package com.earth2me.essentials.commands;

import com.earth2me.essentials.CommandSource;
import static com.earth2me.essentials.I18n.tl;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.FormatUtil;
import java.util.Locale;
import net.ess3.api.events.NickChangeEvent;
import org.bukkit.Server;
import org.bukkit.entity.Player;


public class Commandnick extends EssentialsLoopCommand
{
	public Commandnick()
	{
		super("nick");
	}

	@Override
	public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception
	{
		if (args.length < 1)
		{
			throw new NotEnoughArgumentsException();
		}
		if (!ess.getSettings().changeDisplayName())
		{
			throw new Exception(tl("nickDisplayName"));
		}

		if (args.length > 1 && user.isAuthorized("essentials.nick.others"))
		{
			final String[] nickname = formatNickname(user, args[1]).split(" ");
			loopOfflinePlayers(server, user.getSource(), false, true, args[0], nickname);
			user.sendMessage(tl("nickChanged"));
		}
		else
		{
			final String[] nickname = formatNickname(user, args[0]).split(" ");
			updatePlayer(server, user.getSource(), user, nickname);
		}
	}

	@Override
	public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception
	{
		if (args.length < 2)
		{
			throw new NotEnoughArgumentsException();
		}
		if (!ess.getSettings().changeDisplayName())
		{
			throw new Exception(tl("nickDisplayName"));
		}
		final String[] nickname = formatNickname(null, args[1]).split(" ");
		loopOfflinePlayers(server, sender, false, true, args[0], nickname);
		sender.sendMessage(tl("nickChanged"));
	}

	@Override
	protected void updatePlayer(final Server server, final CommandSource sender, final User target, final String[] args) throws NotEnoughArgumentsException
	{
		final String nick = args[0];
		if (target.getName().equalsIgnoreCase(nick))
		{
			setNickname(server, sender, target, nick);
			target.sendMessage(tl("nickSet", target.getDisplayName()));
		}
		else if ("off".equalsIgnoreCase(nick))
		{
			setNickname(server, sender, target, null);
			target.sendMessage(tl("nickNoMore"));
		}
		else if (nickInUse(server, target, nick))
		{
			throw new NotEnoughArgumentsException(tl("nickInUse"));
		}
		else
		{
			setNickname(server, sender, target, nick);
			target.sendMessage(tl("nickSet", target.getDisplayName()));
		}
	}

	private String formatNickname(final User user, final String nick) throws Exception
	{
		String newNick = user == null ? FormatUtil.replaceFormat(nick) : FormatUtil.formatString(user, "essentials.nick", nick);
		if (!newNick.matches("^[a-zA-Z_0-9\u00a7]+$"))
		{
			throw new Exception(tl("nickNamesAlpha"));
		}
		else if (newNick.length() > ess.getSettings().getMaxNickLength())
		{
			throw new Exception(tl("nickTooLong"));
		}
		else if (FormatUtil.stripFormat(newNick).length() < 1)
		{
			throw new Exception(tl("nickNamesAlpha"));
		}
		return newNick;
	}

	private boolean nickInUse(final Server server, final User target, String nick)
	{
		final String lowerNick = FormatUtil.stripFormat(nick.toLowerCase(Locale.ENGLISH));
		for (final Player onlinePlayer : server.getOnlinePlayers())
		{
			if (target.getBase().getName().equals(onlinePlayer.getName()))
			{
				continue;
			}
			final String matchNick = FormatUtil.stripFormat(onlinePlayer.getDisplayName().replace(ess.getSettings().getNicknamePrefix(), ""));
			if (lowerNick.equals(matchNick.toLowerCase(Locale.ENGLISH))
				|| lowerNick.equals(onlinePlayer.getName().toLowerCase(Locale.ENGLISH)))
			{
				return true;
			}
		}
		if (ess.getUser(lowerNick) != null && ess.getUser(lowerNick) != target) {
				return true;
		}
		return false;
	}

	private void setNickname(final Server server, final CommandSource sender, final User target, final String nickname)
	{
		final User controller = sender.isPlayer() ? ess.getUser(sender.getPlayer()) : null;
		final NickChangeEvent nickEvent = new NickChangeEvent(controller, target, nickname);
		server.getPluginManager().callEvent(nickEvent);
		if (!nickEvent.isCancelled())
		{
			target.setNickname(nickname);
			target.setDisplayNick();
		}
	}
}