Skip to content

Commit

Permalink
GH-2004 Events to handle guild chat (#2004) (#2006)
Browse files Browse the repository at this point in the history
* Use Option for nullable fields in events, and remove deprecated events and methods

* Super fancy cool javadocs which everyone will ready I'm 100% convinced

* Add GuildChatEvent and GuildPreChatEvent

* Fix checkstyle

* Fix checkstyle

Co-authored-by: Kamilkime <kamilkime@pm.me>
  • Loading branch information
P3ridot and Kamilkime committed Jun 22, 2022
1 parent 91fbbcd commit b8faf02
Show file tree
Hide file tree
Showing 3 changed files with 158 additions and 30 deletions.
@@ -0,0 +1,62 @@
package net.dzikoysk.funnyguilds.event.guild;

import java.util.Collections;
import java.util.Set;
import net.dzikoysk.funnyguilds.guild.Guild;
import net.dzikoysk.funnyguilds.user.User;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class GuildChatEvent extends GuildEvent {

private static final HandlerList handlers = new HandlerList();
private final Type type;
private final Set<Guild> receivers;
private final String message;

@Override
public @NotNull HandlerList getHandlers() {
return handlers;
}

public static HandlerList getHandlerList() {
return handlers;
}

public GuildChatEvent(EventCause eventCause, @Nullable User doer, Guild guild, Type type, Set<Guild> receivers, String message) {
super(eventCause, doer, guild);
this.type = type;
this.receivers = Collections.unmodifiableSet(receivers);
this.message = message;
}

public Type getType() {
return this.type;
}

public Set<Guild> getReceivers() {
return this.receivers;
}

public String getMessage() {
return this.message;
}

@Override
public void setCancelled(boolean cancelled) {
throw new UnsupportedOperationException("GuildChatEvent cannot be cancelled, use GuildPreChatEvent");
}

@Override
public String getDefaultCancelMessage() {
throw new UnsupportedOperationException("GuildChatEvent cannot be cancelled, use GuildPreChatEvent");
}

public static enum Type {
PRIVATE,
ALLY,
ALL
}

}
@@ -0,0 +1,55 @@
package net.dzikoysk.funnyguilds.event.guild;

import java.util.HashSet;
import java.util.Set;
import net.dzikoysk.funnyguilds.guild.Guild;
import net.dzikoysk.funnyguilds.user.User;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class GuildPreChatEvent extends GuildEvent {

private static final HandlerList handlers = new HandlerList();
private final GuildChatEvent.Type type;
private final Set<Guild> receivers;
private String message;

@Override
public @NotNull HandlerList getHandlers() {
return handlers;
}

public static HandlerList getHandlerList() {
return handlers;
}

public GuildPreChatEvent(EventCause eventCause, @Nullable User doer, Guild guild, GuildChatEvent.Type type, Set<Guild> receivers, String message) {
super(eventCause, doer, guild);
this.type = type;
this.receivers = new HashSet<>(receivers);
this.message = message;
}

public GuildChatEvent.Type getType() {
return this.type;
}

public Set<Guild> getReceivers() {
return this.receivers;
}

public String getMessage() {
return this.message;
}

public void setMessage(String message) {
this.message = message;
}

@Override
public String getDefaultCancelMessage() {
return "[FunnyGuilds] Guild chat event has been cancelled by the server!";
}

}
@@ -1,11 +1,15 @@
package net.dzikoysk.funnyguilds.listener;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import net.dzikoysk.funnyguilds.FunnyGuilds;
import net.dzikoysk.funnyguilds.config.NumberRange;
import net.dzikoysk.funnyguilds.event.FunnyEvent.EventCause;
import net.dzikoysk.funnyguilds.event.SimpleEventHandler;
import net.dzikoysk.funnyguilds.event.guild.GuildChatEvent;
import net.dzikoysk.funnyguilds.event.guild.GuildChatEvent.Type;
import net.dzikoysk.funnyguilds.event.guild.GuildPreChatEvent;
import net.dzikoysk.funnyguilds.feature.hooks.HookUtils;
import net.dzikoysk.funnyguilds.guild.Guild;
import net.dzikoysk.funnyguilds.rank.DefaultTops;
Expand Down Expand Up @@ -33,7 +37,7 @@ public void onChat(AsyncPlayerChatEvent event) {

User user = userOption.get();
boolean isGuildChat = user.getGuild()
.map(guild -> this.sendGuildMessage(player, guild, event.getMessage()))
.map(guild -> this.sendGuildMessage(user, player, guild, event.getMessage()))
.orElseGet(false);

if (isGuildChat) {
Expand Down Expand Up @@ -69,54 +73,53 @@ public void onChat(AsyncPlayerChatEvent event) {
event.setFormat(formatter.format(event.getFormat()));
}

private boolean sendGuildMessage(Player player, Guild guild, String message) {
if (this.sendMessageToAllGuilds(player, guild, message)) {
private boolean sendGuildMessage(User user, Player player, Guild guild, String message) {
if (this.sendMessageToAllGuilds(user, player, guild, message)) {
return true;
}

if (this.sendMessageToGuildAllies(player, guild, message)) {
if (this.sendMessageToGuildAllies(user, player, guild, message)) {
return true;
}

return this.sendMessageToGuildMembers(player, guild, message);
return this.sendMessageToGuildMembers(user, player, guild, message);
}

private void spy(Player player, Guild playerGuild, String message) {
String spyMessage = this.formatChatDesign(player, playerGuild, this.config.chatSpyDesign.getValue(), message);

PandaStream.of(Bukkit.getOnlinePlayers())
.flatMap(onlinePlayer -> this.userManager.findByPlayer(onlinePlayer))
.filter(user -> user.getCache().isSpy())
.forEach(user -> user.sendMessage(spyMessage));
private boolean sendMessageToGuildMembers(User user, Player player, Guild guild, String message) {
return this.sendMessageToGuilds(user, player, guild, this.config.chatPrivDesign.getValue(), this.config.chatPriv,
message, Collections.singleton(guild), Type.PRIVATE);
}

private boolean sendMessageToGuildMembers(Player player, Guild guild, String message) {
return this.sendMessageToGuilds(player, guild, this.config.chatPrivDesign.getValue(), this.config.chatPriv,
message, Collections.singletonList(guild));
}

private boolean sendMessageToGuildAllies(Player player, Guild guild, String message) {
private boolean sendMessageToGuildAllies(User user, Player player, Guild guild, String message) {
Set<Guild> allies = new HashSet<>(guild.getAllies());
allies.add(guild);

return this.sendMessageToGuilds(player, guild, this.config.chatAllyDesign.getValue(), this.config.chatAlly, message, allies);
return this.sendMessageToGuilds(user, player, guild, this.config.chatAllyDesign.getValue(), this.config.chatAlly,
message, allies, Type.ALLY);
}

private boolean sendMessageToAllGuilds(Player player, Guild guild, String message) {
return this.sendMessageToGuilds(player, guild, this.config.chatGlobalDesign.getValue(), this.config.chatGlobal,
message, this.guildManager.getGuilds());
private boolean sendMessageToAllGuilds(User user, Player player, Guild guild, String message) {
return this.sendMessageToGuilds(user, player, guild, this.config.chatGlobalDesign.getValue(), this.config.chatGlobal,
message, this.guildManager.getGuilds(), Type.ALL);
}

private boolean sendMessageToGuilds(Player player, Guild playerGuild, String chatDesign, String prefix, String message,
Collection<Guild> receivers) {
private boolean sendMessageToGuilds(User user, Player player, Guild playerGuild, String chatDesign, String prefix, String message,
Set<Guild> receivers, Type type) {
int prefixLength = prefix.length();

if (message.length() > prefixLength && message.substring(0, prefixLength).equalsIgnoreCase(prefix)) {
String subMessage = message.substring(prefixLength).trim();
String resultMessage = this.formatChatDesign(player, playerGuild, chatDesign, subMessage);
String resultMessage = this.formatChatDesign(user, player, playerGuild, chatDesign, subMessage);

GuildPreChatEvent preChatEvent = new GuildPreChatEvent(EventCause.USER, user, playerGuild, type, receivers, resultMessage);
if (!SimpleEventHandler.handle(preChatEvent)) {
return true;
}

this.spy(player, playerGuild, subMessage);
receivers.forEach(guild -> sendMessageToGuild(guild, resultMessage));
this.spy(user, player, playerGuild, subMessage);
preChatEvent.getReceivers().forEach(guild -> sendMessageToGuild(guild, resultMessage));

SimpleEventHandler.handle(new GuildChatEvent(EventCause.USER, user, playerGuild, type, receivers, resultMessage));

return true;
}
Expand All @@ -130,8 +133,16 @@ private static void sendMessageToGuild(Guild guild, String message) {
.forEach(member -> member.sendMessage(message));
}

private String formatChatDesign(Player player, Guild playerGuild, String chatDesign, String message) {
User user = this.userManager.findByUuid(player.getUniqueId()).orNull();
private void spy(User user, Player player, Guild playerGuild, String message) {
String spyMessage = this.formatChatDesign(user, player, playerGuild, this.config.chatSpyDesign.getValue(), message);

PandaStream.of(Bukkit.getOnlinePlayers())
.flatMap(onlinePlayer -> this.userManager.findByPlayer(onlinePlayer))
.filter(onlineUser -> onlineUser.getCache().isSpy())
.forEach(onlineUser -> onlineUser.sendMessage(spyMessage));
}

private String formatChatDesign(User user, Player player, Guild playerGuild, String chatDesign, String message) {
FunnyFormatter formatter = new FunnyFormatter()
.register("{PLAYER}", player.getName())
.register("{TAG}", playerGuild.getTag())
Expand Down

0 comments on commit b8faf02

Please sign in to comment.