use of com.easterlyn.user.User in project Easterlyn by Easterlyn.
the class ChannelManagementListener method onPlayerQuit.
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
RegisteredServiceProvider<EasterlynCore> easterlynProvider = chat.getServer().getServicesManager().getRegistration(EasterlynCore.class);
if (easterlynProvider == null) {
return;
}
User user = easterlynProvider.getProvider().getUserManager().getUser(event.getPlayer().getUniqueId());
List<String> savedChannels = user.getStorage().getStringList(EasterlynChat.USER_CHANNELS);
List<String> channels = savedChannels.stream().filter(channelName -> {
Channel channel = chat.getChannels().get(channelName);
if (channel == null) {
return false;
}
channel.getMembers().remove(user.getUniqueId());
return true;
}).collect(Collectors.toList());
if (channels.size() != savedChannels.size()) {
user.getStorage().set(EasterlynChat.USER_CHANNELS, channels);
if (!channels.contains(user.getStorage().getString(EasterlynChat.USER_CURRENT))) {
user.getStorage().set(EasterlynChat.USER_CURRENT, null);
}
}
}
use of com.easterlyn.user.User in project Easterlyn by Easterlyn.
the class MuteListener method cancelIfMute.
private void cancelIfMute(Player player, Cancellable cancellable) {
RegisteredServiceProvider<EasterlynCore> easterlynProvider = Bukkit.getServer().getServicesManager().getRegistration(EasterlynCore.class);
if (easterlynProvider == null) {
return;
}
User user = easterlynProvider.getProvider().getUserManager().getUser(player.getUniqueId());
if (user.getStorage().getLong(EasterlynChat.USER_MUTE, 0L) > System.currentTimeMillis()) {
cancellable.setCancelled(true);
}
}
use of com.easterlyn.user.User in project Easterlyn by Easterlyn.
the class EasterlynChat method register.
@Override
protected void register(EasterlynCore plugin) {
StringUtil.addQuoteConsumer(new StaticQuoteConsumer(CHANNEL_PATTERN) {
@Override
public void addComponents(@NotNull ParsedText components, @NotNull Supplier<Matcher> matcherSupplier) {
Matcher matcher = matcherSupplier.get();
String channelName = matcher.group(1);
Channel channel = getChannels().get(channelName.toLowerCase().substring(1));
TextComponent component;
if (channel != null) {
component = channel.getMention();
} else {
int end = matcher.end(1);
component = new TextComponent(matcher.group().substring(0, end));
component.setColor(Colors.CHANNEL);
component.setUnderlined(true);
component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(TextComponent.fromLegacyText(Colors.COMMAND + "/join " + Colors.CHANNEL + channelName))));
component.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/join " + channelName));
}
components.addComponent(component);
String trailingPunctuation = matcher.group(2);
if (trailingPunctuation != null && !trailingPunctuation.isEmpty()) {
components.addText(trailingPunctuation, component.getHoverEvent(), component.getClickEvent());
}
}
});
IssuerAwareContextResolver<Channel, BukkitCommandExecutionContext> channelContext = context -> {
String firstArg = context.getFirstArg();
// Current channel or unspecified, defaulting to current
if (context.hasFlag(ChannelFlag.CURRENT) || (context.hasFlag(ChannelFlag.LISTENING_OR_CURRENT) || context.hasFlag(ChannelFlag.VISIBLE_OR_CURRENT)) && (firstArg == null || firstArg.indexOf('#') != 0)) {
if (!context.getIssuer().isPlayer()) {
// Console never has a current channel
throw new InvalidCommandArgument(CoreLang.NO_CONSOLE);
}
String channelName = plugin.getUserManager().getUser(context.getPlayer().getUniqueId()).getStorage().getString(USER_CURRENT);
Channel channel = channels.get(channelName);
if (channel == null) {
throw new InvalidCommandArgument(MessageKey.of("chat.common.no_current_channel"));
}
return channel;
}
// Channel name must be specified for anything beyond this point, pop argument
context.popFirstArg();
if (firstArg == null) {
throw new InvalidCommandArgument(MessageKey.of("chat.common.no_specified_channel"));
}
if (firstArg.length() == 0 || firstArg.charAt(0) != '#') {
throw new InvalidCommandArgument(MessageKey.of("chat.commands.channel.create.error.naming_conventions"));
}
Channel channel = channels.get(firstArg.substring(1).toLowerCase());
if (channel == null) {
throw new InvalidCommandArgument(MessageKey.of("chat.common.no_matching_channel"), "{value}", firstArg);
}
User user;
if (context.getIssuer().isPlayer()) {
user = getCore().getUserManager().getUser(context.getIssuer().getUniqueId());
} else {
user = null;
}
if (context.hasFlag(ChannelFlag.VISIBLE) || context.hasFlag(ChannelFlag.VISIBLE_OR_CURRENT)) {
if (user == null || !channel.isPrivate() || channel.isWhitelisted(user)) {
return channel;
}
throw new InvalidCommandArgument(MessageKey.of("chat.common.no_channel_access"), "{value}", channel.getDisplayName());
}
if (context.hasFlag(ChannelFlag.LISTENING) || context.hasFlag(ChannelFlag.LISTENING_OR_CURRENT)) {
if (user == null) {
return channel;
}
List<String> channels = user.getStorage().getStringList(EasterlynChat.USER_CHANNELS);
if (!channels.contains(channel.getName())) {
throw new InvalidCommandArgument(MessageKey.of("chat.common.not_listening_to_channel"), "{value}", channel.getDisplayName());
}
return channel;
}
if (user == null) {
throw new InvalidCommandArgument(CoreLang.NO_CONSOLE);
}
if (context.hasFlag(ChannelFlag.NOT_LISTENING)) {
List<String> channels = user.getStorage().getStringList(EasterlynChat.USER_CHANNELS);
if (channels.contains(channel.getName())) {
throw new InvalidCommandArgument(MessageKey.of("chat.common.listening_to_channel"), "{value}", channel.getDisplayName());
}
return channel;
}
ReportableEvent.call("Missing Channel context flag!", 10);
throw new InvalidCommandArgument(CoreLang.ERROR_LOGGED);
};
plugin.getCommandManager().getCommandContexts().registerIssuerAwareContext(Channel.class, channelContext);
plugin.getCommandManager().getCommandContexts().registerIssuerAwareContext(NormalChannel.class, context -> {
Channel channel = channelContext.getContext(context);
if (!(channel instanceof NormalChannel)) {
throw new InvalidCommandArgument(MessageKey.of("chat.common.channel_not_modifiable"));
}
return (NormalChannel) channel;
});
// TODO ACF is removing leading # from channel display names in completions
plugin.getCommandManager().getCommandCompletions().registerCompletion("channels", getUserHandler(user -> channels.values().stream().distinct().filter(channel -> channel.isWhitelisted(user)).map(Channel::getDisplayName).collect(Collectors.toSet())));
plugin.getCommandManager().getCommandCompletions().setDefaultCompletion("channels", Channel.class, NormalChannel.class);
plugin.getCommandManager().getCommandCompletions().registerCompletion("channelsJoinable", getUserHandler(user -> {
List<String> channelsJoined = user.getStorage().getStringList(EasterlynChat.USER_CHANNELS);
return channels.values().stream().distinct().filter(channel -> !channelsJoined.contains(channel.getName()) && channel.isWhitelisted(user)).map(Channel::getDisplayName).collect(Collectors.toSet());
}));
plugin.getCommandManager().getCommandCompletions().registerCompletion("channelsListening", getUserHandler(user -> user.getStorage().getStringList(EasterlynChat.USER_CHANNELS)));
plugin.getCommandManager().getCommandCompletions().registerCompletion("channelsModerated", getUserHandler(user -> channels.values().stream().distinct().filter(channel -> channel.isModerator(user)).map(Channel::getDisplayName).collect(Collectors.toSet())));
plugin.getCommandManager().getCommandCompletions().registerCompletion("channelsOwned", getUserHandler(user -> channels.values().stream().distinct().filter(channel -> channel.isOwner(user)).map(Channel::getDisplayName).collect(Collectors.toSet())));
plugin.getLocaleManager().addLocaleSupplier(this);
plugin.registerCommands(this, getClassLoader(), "com.easterlyn.chat.command");
}
use of com.easterlyn.user.User in project Easterlyn by Easterlyn.
the class ChannelCommand method delete.
@Subcommand("delete")
@Description("{@@chat.commands.channel.delete.description}")
@Syntax("<#channel>")
@CommandCompletion("@channelsOwned")
public void delete(@Flags(CoreContexts.SELF) User user, @Flags(ChannelFlag.VISIBLE_OR_CURRENT) NormalChannel channel, @Optional String name) {
if (!channel.isOwner(user)) {
core.getLocaleManager().sendMessage(user.getPlayer(), "chat.common.requires_owner");
return;
}
if (!channel.getDisplayName().equals(name)) {
core.getLocaleManager().sendMessage(user.getPlayer(), "chat.commands.channel.delete.error.confirm");
return;
}
chat.getChannels().remove(channel.getName());
channel.getMembers().stream().map(uuid -> core.getUserManager().getUser(uuid)).forEach(member -> {
List<String> channels = member.getStorage().getStringList(EasterlynChat.USER_CHANNELS);
channels.remove(channel.getName());
member.getStorage().set(EasterlynChat.USER_CHANNELS, channels);
String currentChannelName = member.getStorage().getString(EasterlynChat.USER_CURRENT);
if (channel.getName().equals(currentChannelName) || currentChannelName == null) {
if (channels.contains(EasterlynChat.DEFAULT.getName())) {
member.getStorage().set(EasterlynChat.USER_CURRENT, EasterlynChat.DEFAULT.getName());
}
}
Player player = member.getPlayer();
if (player == null) {
return;
}
BaseComponent component = new TextComponent();
component.addExtra(channel.getMention());
String locale = core.getLocaleManager().getLocale(player);
for (TextComponent textComponent : StringUtil.toJSON(core.getLocaleManager().getValue("chat.commands.channel.delete.success", locale))) {
component.addExtra(textComponent);
}
player.spigot().sendMessage(component);
});
}
use of com.easterlyn.user.User in project Easterlyn by Easterlyn.
the class CoreContexts method register.
public static void register(EasterlynCore plugin) {
ContextResolver<Long, BukkitCommandExecutionContext> longResolver = context -> {
String firstArg = context.popFirstArg();
Matcher matcher = INTEGER_PATTERN.matcher(firstArg);
if (matcher.find()) {
try {
return Long.valueOf(matcher.group(1));
} catch (NumberFormatException e) {
throw new InvalidCommandArgument(CoreLang.WHOLE_NUMBER);
}
}
firstArg = firstArg.toUpperCase();
if (firstArg.matches("[IVXLCDM]+")) {
return (long) NumberUtil.intFromRoman(firstArg);
}
throw new InvalidCommandArgument(CoreLang.WHOLE_NUMBER);
};
plugin.getCommandManager().getCommandContexts().registerContext(long.class, longResolver);
plugin.getCommandManager().getCommandContexts().registerContext(Long.class, longResolver);
ContextResolver<Integer, BukkitCommandExecutionContext> intResolver = context -> Math.toIntExact(longResolver.getContext(context));
plugin.getCommandManager().getCommandContexts().registerContext(int.class, intResolver);
plugin.getCommandManager().getCommandContexts().registerContext(Integer.class, intResolver);
plugin.getCommandManager().getCommandContexts().registerContext(UUID.class, context -> {
String firstArg = context.popFirstArg();
if (firstArg == null) {
// TODO lang
throw new InvalidCommandArgument("UUID required");
}
try {
return UUID.fromString(firstArg);
} catch (IllegalArgumentException e) {
throw new InvalidCommandArgument("UUID required");
}
// TODO allow fetching by player after
});
plugin.getCommandManager().getCommandContexts().registerIssuerAwareContext(BukkitCommandIssuer.class, CommandExecutionContext::getIssuer);
plugin.getCommandManager().getCommandContexts().registerIssuerAwareContext(Player.class, new IssuerAwareContextResolver<>() {
@Override
public Player getContext(BukkitCommandExecutionContext context) throws InvalidCommandArgument {
// noinspection unchecked
if (context.hasFlag(SELF) || context.hasFlag(ONLINE_WITH_PERM) && context.getIssuer().isPlayer() && context.getCmd().getRequiredPermissions().stream().noneMatch(perm -> context.getIssuer().hasPermission(perm.toString().replace(".self", ".other")))) {
return getSelf(context.getIssuer());
}
if (context.hasFlag(ONLINE)) {
return getOnline(context.getIssuer(), context.popFirstArg());
}
if (context.hasFlag(OFFLINE)) {
return getOffline(context.getIssuer(), context.popFirstArg());
}
// Default/ONLINE_WITH_PERM behavior: Attempt to match online, fall through to self.
Player player = null;
String firstArg = context.getFirstArg();
if (firstArg != null && firstArg.length() > 3) {
try {
player = getOnline(context.getIssuer(), firstArg);
} catch (InvalidCommandArgument ignored) {
// If user is not specified, fall through to self.
}
}
if (player != null) {
context.popFirstArg();
return player;
}
return getSelf(context.getIssuer());
}
@NotNull
private Player getSelf(@NotNull BukkitCommandIssuer issuer) throws InvalidCommandArgument {
if (issuer.isPlayer()) {
return issuer.getPlayer();
}
throw new InvalidCommandArgument(CoreLang.NO_CONSOLE);
}
@NotNull
private Player getOnline(@NotNull BukkitCommandIssuer issuer, @Nullable String argument) throws InvalidCommandArgument {
if (argument == null) {
throw new InvalidCommandArgument(CoreLang.INVALID_PLAYER, "{value}", "null");
}
Player player = PlayerUtil.matchOnlinePlayer(issuer.getIssuer(), argument);
if (player == null) {
throw new InvalidCommandArgument(CoreLang.INVALID_PLAYER, "{value}", argument);
}
return player;
}
@NotNull
private Player getOffline(@NotNull BukkitCommandIssuer issuer, @Nullable String argument) throws InvalidCommandArgument {
if (argument == null) {
throw new InvalidCommandArgument(CoreLang.INVALID_PLAYER, "{value}", "null");
}
Player player;
try {
player = PlayerUtil.matchPlayer(issuer.getIssuer(), argument, true, plugin);
} catch (IllegalAccessException e) {
ReportableEvent.call("Called PlayerUtil#matchPlayer on the main thread while executing!", e, 5);
player = PlayerUtil.matchOnlinePlayer(issuer.getIssuer(), argument);
}
if (player == null) {
throw new InvalidCommandArgument(CoreLang.INVALID_PLAYER, "{value}", argument);
}
return player;
}
});
plugin.getCommandManager().getCommandContexts().registerIssuerAwareContext(ConsoleCommandSender.class, context -> {
if (!(context.getIssuer().getIssuer() instanceof ConsoleCommandSender)) {
throw new InvalidCommandArgument(CoreLang.ONLY_CONSOLE);
}
return (ConsoleCommandSender) context.getIssuer().getIssuer();
});
plugin.getCommandManager().getCommandContexts().registerIssuerAwareContext(User.class, context -> {
Player player = (Player) plugin.getCommandManager().getCommandContexts().getResolver(Player.class).getContext(context);
return plugin.getUserManager().getUser(player.getUniqueId());
});
plugin.getCommandManager().getCommandContexts().registerContext(Date.class, context -> {
String firstArg = context.popFirstArg();
long duration = NumberUtil.parseDuration(firstArg);
return new Date(Math.addExact(System.currentTimeMillis(), duration));
});
plugin.getCommandManager().getCommandContexts().registerContext(ChatColor.class, new ContextResolver<>() {
@Override
public ChatColor getContext(BukkitCommandExecutionContext context1) throws InvalidCommandArgument {
ChatColor matched = Colors.getOrDefault(context1.popFirstArg(), null);
if (matched == null) {
invalid(context1);
}
if (matched == ChatColor.RESET || !context1.hasFlag("colour") && !context1.hasFlag("format")) {
// Reset is a special case - used to clear colour settings
return matched;
}
boolean format = matched == ChatColor.BOLD || matched == ChatColor.UNDERLINE || matched == ChatColor.STRIKETHROUGH || matched == ChatColor.MAGIC;
if (context1.hasFlag("colour") && format || context1.hasFlag("format") && !format) {
invalid(context1);
}
return matched;
}
private void invalid(BukkitCommandExecutionContext context1) {
throw new InvalidCommandArgument(MessageKeys.PLEASE_SPECIFY_ONE_OF, "{valid}", Arrays.stream(org.bukkit.ChatColor.values()).filter(chatColor -> context1.hasFlag("format") ? chatColor.isFormat() : !context1.hasFlag("colour") || chatColor.isColor()).map(Enum::name).collect(Collectors.joining(", ", "[", "]")));
}
});
// TODO lang for invalid args
plugin.getCommandManager().getCommandContexts().registerIssuerAwareContext(World.class, context -> {
String worldName = context.getFirstArg();
if (worldName == null) {
if (context.isOptional() && context.getIssuer().isPlayer()) {
return context.getIssuer().getPlayer().getWorld();
}
throw new InvalidCommandArgument("No world specified!");
}
World world = plugin.getServer().getWorld(worldName.toLowerCase());
if (world == null) {
if (context.isOptional() && context.getIssuer().isPlayer()) {
return context.getIssuer().getPlayer().getWorld();
}
throw new InvalidCommandArgument("No world specified!");
}
context.popFirstArg();
return world;
});
}
Aggregations