summaryrefslogtreecommitdiff
path: root/src/com/redstoner/misc/Utils.java
blob: 80f5a8b1cf1ae20a3b6b6d952bb2019d38a79966 (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
package com.redstoner.misc;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import com.redstoner.annotations.Version;

/** The utils class containing utility functions. Those include but are not limited to sending formatted messages, broadcasts and more.
 * 
 * @author Pepich */
@Version(major = 4, minor = 0, revision = 0, compatible = 1)
public final class Utils
{
	/** The @SimpleDateFormat used for getting the current date. */
	public static SimpleDateFormat dateFormat = new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss]");
	
	/** Hidden constructor. Do not instantiate UTILS classes! :) */
	private Utils()
	{}
	
	/** This will send a message to the specified recipient. It will generate the module prefix.
	 * 
	 * @param recipient Whom to sent the message to.
	 * @param message The message to sent. Will default to &7 (light_grey) if not specified otherwise. */
	public static void sendMessage(CommandSender recipient, String message)
	{
		sendMessage(recipient, null, message);
	}
	
	/** This will send a message to the specified recipient. It will generate the module prefix. Also, this will be logged to console as a warning.
	 * 
	 * @param recipient Whom to sent the message to.
	 * @param message The message to sent. Will default to &7 (light_grey) if not specified otherwise. */
	public static void sendErrorMessage(CommandSender recipient, String message)
	{
		sendErrorMessage(recipient, null, message);
	}
	
	/** This will send a message to the specified recipient. It will generate the module prefix if you want it to.
	 * 
	 * @param recipient Whom to sent the message to.
	 * @param prefix The prefix for the message. If null, the default prefix will be used: &8[&2MODULE&8]
	 * @param message The message to sent. Will default to &7 (light_grey) if not specified otherwise. */
	public static void sendMessage(CommandSender recipient, String prefix, String message)
	{
		if (prefix == null)
			prefix = "§8[§2" + getCaller() + "§8]: ";
		recipient.sendMessage(prefix + "§7" + message);
	}
	
	/** This will send a message to the specified recipient. It will generate the module prefix if you want it to. Also, this will be logged to console as a warning.
	 * 
	 * @param recipient Whom to sent the message to.
	 * @param prefix The prefix for the message. If null, the default prefix will be used: &8[&cMODULE&8]
	 * @param message The message to sent. Will default to &7 (light_grey) if not specified otherwise. */
	public static void sendErrorMessage(CommandSender recipient, String prefix, String message)
	{
		if (prefix == null)
			prefix = "§8[§c" + getCaller() + "§8]: ";
		recipient.sendMessage(prefix + "§7" + message);
	}
	
	/** Invokes sendMessage. This method will additionally translate alternate color codes for you.
	 * 
	 * @param recipient Whom to sent the message to.
	 * @param prefix The prefix for the message. If null, the default prefix will be used: &8[&cMODULE&8]
	 * @param message The message to sent. Will default to &7 (light_grey) if not specified otherwise.
	 * @param alternateColorCode The alternate color code indicator to use. If set to '&' then "&7" would be translated to "§7". Works with any char. */
	public static void sendMessage(CommandSender recipient, String prefix, String message, char alternateColorCode)
	{
		if (prefix == null)
			prefix = "§8[§2" + getCaller() + "§8]: ";
		sendMessage(recipient, colorify(prefix, alternateColorCode), colorify(message, alternateColorCode));
	}
	
	/** Invokes sendErrorMessage. This method will additionally translate alternate color codes for you.
	 * 
	 * @param recipient Whom to sent the message to.
	 * @param prefix The prefix for the message. If null, the default prefix will be used: &8[&cMODULE&8]
	 * @param message The message to sent. Will default to &7 (light_grey) if not specified otherwise.
	 * @param alternateColorCode The alternate color code indicator to use. If set to '&' then "&7" would be translated to "§7". Works with any char. */
	public static void sendErrorMessage(CommandSender recipient, String prefix, String message, char alternateColorCode)
	{
		if (prefix == null)
			prefix = "§8[§c" + getCaller() + "§8]: ";
		sendErrorMessage(recipient, colorify(prefix, '&'), colorify(message, '&'));
	}
	
	/** This method broadcasts a message to all players (and console) that are allowed by the filter. Set the filter to NULL to broadcast to everyone.</br>
	 * This will not be logged to console except when you return true in the filter.
	 * 
	 * @param message the message to be sent around
	 * @param filter the BroadcastFilter to be applied.</br>
	 *        Write a class implementing the interface and pass it to this method, the "sendTo()" method will be called for each recipient.
	 * @param alternateColorCode The alternate color code indicator to use. If set to '&' then "&7" would be translated to "§7". Works with any char.
	 * @return the amount of people that received the message. */
	public static int broadcast(String prefix, String message, BroadcastFilter filter, char alternateColorCode)
	{
		if (prefix == null)
			prefix = "§8[§2" + getCaller() + "§8]: ";
		message = colorify(message, alternateColorCode);
		return broadcast(prefix, message, filter);
	}
	
	/** This method broadcasts a message to all players and console that are allowed by the filter. Set the filter to NULL to broadcast to everyone.</br>
	 * If you want to, you can set a message that will be logged to console. Set to null to not log anything.</br>
	 * You can still allow console in the filter to log the original message.
	 * 
	 * @param prefix The prefix for the message. Set to NULL to let it auto generate.
	 * @param message the message to be sent around
	 * @param filter the BroadcastFilter to be applied.</br>
	 *        Write a class implementing the interface and pass it to this method, the "sendTo()" method will be called for each recipient.
	 * @param logmessage the log message to appear in console. Set to null to not log this (you can still log the original message by returning true in the filter).
	 * @return the amount of people that received the message. */
	public static int broadcast(String prefix, String message, BroadcastFilter filter)
	{
		if (prefix == null)
			prefix = "§8[§2" + getCaller() + "§8]: ";
		if (filter == null)
		{
			for (Player p : Bukkit.getOnlinePlayers())
				p.sendMessage(prefix + message);
			Bukkit.getConsoleSender().sendMessage(prefix + message);
			return Bukkit.getOnlinePlayers().size() + 1;
		}
		else
		{
			int count = 0;
			for (Player p : Bukkit.getOnlinePlayers())
				if (filter.sendTo(p))
				{
					p.sendMessage(prefix + message);
					count++;
				}
			if (filter.sendTo(Bukkit.getConsoleSender()))
			{
				Bukkit.getConsoleSender().sendMessage(prefix + message);
				count++;
			}
			return count;
		}
	}
	
	/** Deprecated. Use Utils.info(message) instead.
	 * 
	 * @param message The message to be put into console. Prefixes are automatically generated. */
	@Deprecated
	public static void log(String message)
	{
		info(message);
	}
	
	/** Prints an info message into console. Supports "&" color codes.
	 * 
	 * @param message The message to be put into console. Prefixes are automatically generated. Color defaults to grey. */
	public static void info(String message)
	{
		String classname = getCaller();
		String prefix = "§8[§2" + classname + "§8]: ";
		Bukkit.getConsoleSender().sendMessage(colorify(prefix + "§7" + message, Bukkit.getConsoleSender(), '&'));
	}
	
	/** Prints a warning message into console. Supports "&" color codes.
	 * 
	 * @param message The message to be put into console. Prefixes are automatically generated. Color defaults to grey. */
	public static void warn(String message)
	{
		String classname = getCaller();
		String prefix = "§e[WARN]: §8[§e" + classname + "§8]: ";
		Bukkit.getConsoleSender().sendMessage(colorify(prefix + "§7" + message, Bukkit.getConsoleSender(), '&'));
	}
	
	/** Used to make an error output to console. Supports "&" color codes.
	 * 
	 * @param message The message to be put into console. Prefixes are automatically generated. Color defaults to red. */
	public static void error(String message)
	{
		String classname = getCaller();
		String prefix = "§c[ERROR]: §8[§c" + classname + "§8]: ";
		Bukkit.getConsoleSender().sendMessage(colorify(prefix + "§7" + message, Bukkit.getConsoleSender(), '&'));
	}
	
	/** This method will find the next parent caller and return their class name, omitting package names.
	 * 
	 * @return the Name of the calling class. */
	private static final String getCaller()
	{
		StackTraceElement[] stackTrace = (new Exception()).getStackTrace();
		String classname = "Utils";
		for (int i = 0; classname.equals("Utils"); i++)
		{
			classname = stackTrace[i].getClassName().replaceAll(".*\\.", "");
		}
		return classname;
	}
	
	/** This method will find the next parent caller and return their class name, omitting package names.
	 * 
	 * @param directCaller used to prevent this method from returning the caller itself. Null if supposed to be ignored.
	 * @return the name of the calling class. */
	public static final String getCaller(String... directCaller)
	{
		if (directCaller == null || directCaller.length == 0)
			return getCaller();
		StackTraceElement[] stackTrace = (new Exception()).getStackTrace();
		String classname = "Utils";
		List<String> callers = Arrays.asList(directCaller);
		for (int i = 0; callers.contains(classname) || classname.equals("Utils"); i++)
		{
			classname = stackTrace[i].getClassName().replaceAll(".*\\.", "");
		}
		return classname;
	}
	
	/** Displays the module header to the recipient.</br>
	 * Format: &2--=[ %MODULE% ]=--
	 * 
	 * @param recipient Whom to display the header to. */
	public static void sendModuleHeader(CommandSender recipient)
	{
		sendModuleHeader(recipient, getCaller());
	}
	
	/** Displays the module header to the recipient.</br>
	 * Format: &2--=[ %HEADER% ]=--
	 * 
	 * @param recipient Whom to display the header to.
	 * @param header The module name. */
	public static void sendModuleHeader(CommandSender recipient, String header)
	{
		recipient.sendMessage("§2--=[ " + header + " ]=--");
	}
	
	/** Provides a uniform way of getting the date for all modules.
	 * 
	 * @return The current date in the format "[dd-mm-yyyy hh:mm:ss]" */
	public static String getDate()
	{
		Date date = new Date(System.currentTimeMillis());
		return dateFormat.format(date);
	}
	
	/** Provides a uniform way of getting the (display)name of a @CommandSender.
	 * 
	 * @param sender The @CommandSender to get the name of.
	 * @return The DisplayName of the @CommandSender or if not a @Player, the name in blue. */
	public static String getName(CommandSender sender)
	{
		if (sender instanceof Player)
			return ((Player) sender).getDisplayName();
		else
			return "§9" + sender.getName();
	}
	
	/** Provides a uniform way of getting the UUID of a @CommandSender.
	 * 
	 * @param sender The @CommandSender to get the UUID of.
	 * @return The UUID of the @CommandSender or if not a player, "CONSOLE" in blue. */
	public static String getID(CommandSender sender)
	{
		String id;
		if (sender instanceof Player)
			id = ((Player) sender).getUniqueId().toString();
		else
			id = "CONSOLE";
		return id;
	}
	
	/** This method "colorifies" a message.
	 * 
	 * @param message the message to be colored.
	 * @return the colorified message. */
	public static String colorify(String message, char alternateColorcode)
	{
		return colorify(message, Bukkit.getConsoleSender(), alternateColorcode);
	}
	
	/** This method "colorifies" a message using proper permissions.
	 * 
	 * @param message the message to be colored.
	 * @param sender the @CommandSender whose permissions shall be applied.
	 * @return the colorified message. */
	public static String colorify(String message, CommandSender sender, char alternateColorcode)
	{
		if (sender.hasPermission("essentials.chat.color"))
			message = message.replaceAll(alternateColorcode + "([0-9a-fA-FrR])", "§$1");
		if (sender.hasPermission("essentials.chat.format"))
			message = message.replaceAll(alternateColorcode + "(l-oL-OrR)", "§$1");
		if (sender.hasPermission("essentials.chat.magic"))
			message = message.replaceAll(alternateColorcode + "([kKrR])", "§$1");
		return message.replace(alternateColorcode + "§", alternateColorcode + "");
	}
}