package ua.com.minersstudios.util.misc;
// TODO: To reorganise code for it to work.
import org.projectlombok.lombok.*;
import org.jetbrains.annotations.Nullable;
import net.kyori.adventure.text.Component;
@UtilityClass
public class IngameChatMessageFactory
{
public enum Chat {GLOBAL, LOCAL}
public enum RolePlayActionType {DO, IT, ME, TODO}
/**
* Send message to the game chat.
* @param playerInfo PlayerInfo object
* @param location sender's location
* @param chat chat to use
* @param message message to be sent
* @deprecated
*/
// TODO: Will be replaced when new API comes out.
@Deprecated
public void sendMessageToChat(
@NonNull PlayerInfo playerInfo,
@Nullable Location location,
@NonNull Chat chat,
@NonNull Component message)
{
ConfigCache configCache = Util.getConfigCache();
if (chat == Chat.LOCAL && location != null)
{
Component localMessage = space()
.append(playerInfo.getDefaultName())
.append(text(" : "))
.color(CHAT_MESSAGE_COLOR_PRIMARY)
.hoverEvent(HoverEvent.showText(text("Натисніть, щоб написати приватне повідомлення цьому гравцю", NamedTextColor.GRAY)))
.clickEvent(ClickEvent.suggestCommand("/pm {} ", playerInfo.getID())))
.append(message)
.color(CHAT_MESSAGE_COLOR_SECONDARY);
String stringLocalMessage = serializeLegacyComponent(localMessage);
sendLocalMessage(localMessage, location, configCache.localChatRadius);
Bukkit.getScheduler().runTaskAsynchronously(new Util(),
() -> sendMessage(getTextChannelById(configCache.discordLocalChannelId), stringLocalMessage));
sendInfo(stringLocalMessage);
return;
}
if (chat != Chat.GLOBAL) return;
// TODO: prefix to config.
Component globalMessage = space()
.append(text("[WM] ")
.append(playerInfo.getDefaultName()
.append(text(" : ")))
.color(CHAT_MESSAGE_COLOR_PRIMARY)
.hoverEvent(HoverEvent.showText(text("Натисніть, щоб написати приватне повідомлення цьому гравцю", NamedTextColor.GRAY)))
.clickEvent(ClickEvent.suggestCommand("/pm {} ", playerInfo.getID())))
.append(message)
.color(CHAT_MESSAGE_COLOR_SECONDARY);
String stringGlobalMessage = serializeLegacyComponent(globalMessage);
sendGlobalMessage(globalMessage);
Bukkit.getScheduler().runTaskAsynchronously(new MSUtil(), () ->
{
sendMessage(getTextChannelById(configCache.discordGlobalChannelId), stringGlobalMessage.replaceFirst("\\[WM]", ""));
sendMessage(getTextChannelById(configCache.discordLocalChannelId), stringGlobalMessage);
});
sendInfo(stringGlobalMessage);
}
/**
* Send a private message.
* @param sender private message sender
* @param receiver private message receiver
* @param message private message
* @return True if sender or receiver equals null.
* @deprecated
*/
@Deprecated
public boolean sendPrivateMessage(
@NonNull PlayerInfo sender,
@NonNull PlayerInfo receiver,
@NonNull Component message)
{
CommandSender commandSender = sender == MSUtil.getConsolePlayerInfo()
? Bukkit.getConsoleSender()
: sender.getOnlinePlayer();
Player receiverPlayer = receiver.getOnlinePlayer();
if (commandSender != null && receiverPlayer != null)
{
String privateMessage = serializeLegacyComponent(sender.getDefaultName()
.append(text(String.format(" -> {} : ", receiver.getDefaultName()))
.color(CHAT_MESSAGE_COLOR_PRIMARY)
.append(message.color(CHAT_MESSAGE_COLOR_SECONDARY)));
commandSender.sendMessage(
Badges.SPEECH.append(text("Ви -> ")
.append(receiver.getDefaultName()
.append(text(" : ")))
.hoverEvent(HoverEvent.showText(text("Натисніть, щоб написати приватне повідомлення цьому гравцю", NamedTextColor.GRAY)))
.clickEvent(ClickEvent.suggestCommand("/pm " + receiver.getID() + " ")))
.color(CHAT_MESSAGE_COLOR_PRIMARY))
.append(message.color(CHAT_MESSAGE_COLOR_SECONDARY)));
receiverPlayer.sendMessage(
Badges.SPEECH.append(sender.getDefaultName().append(text(" -> Вам : "))
.color(CHAT_MESSAGE_COLOR_PRIMARY)
.hoverEvent(HoverEvent.showText(text("Натисніть, щоб написати приватне повідомлення цьому гравцю", NamedTextColor.GRAY)))
.clickEvent(ClickEvent.suggestCommand("/pm " + sender.getID() + " ")))
.append(message.color(CHAT_MESSAGE_COLOR_SECONDARY)));
Bukkit.getScheduler().runTaskAsynchronously(new MSUtil(),
() -> sendMessage(getTextChannelById(MSUtil.getConfigCache().discordLocalChannelId), privateMessage));
sendInfo(privateMessage);
return true;
}
return false;
}
/**
* Send roleplay event message to chat.
* @param sender player
* @param speech speech
* @param action action
* @param rolePlayActionType roleplay action type
* @deprecated
*/
@Deprecated
public static void sendRPEventMessage(
@NonNull Player sender,
@NonNull Component speech,
@NonNull Component action,
@NonNull RolePlayActionType rolePlayActionType)
{
ConfigCache configCache = MSUtil.getConfigCache();
PlayerInfoMap playerInfoMap = configCache.playerInfoMap;
PlayerInfo playerInfo = playerInfoMap.getPlayerInfo(sender);
Component fullMessage =
switch (rolePlayActionType)
{
case DO ->
text("* ", RP_MESSAGE_COLOR_PRIMARY)
.append(action.color(RP_MESSAGE_COLOR_SECONDARY))
.append(text(" * | ", RP_MESSAGE_COLOR_PRIMARY))
.append(playerInfo.getGrayIDGoldName());
case IT ->
text("* ", RP_MESSAGE_COLOR_PRIMARY)
.append(action.color(RP_MESSAGE_COLOR_SECONDARY))
.append(text(" *", RP_MESSAGE_COLOR_PRIMARY));
case TODO ->
text("* ")
.color(RP_MESSAGE_COLOR_PRIMARY)
.append(speech
.color(RP_MESSAGE_COLOR_SECONDARY))
.append(text(" - ")
.append(text(playerInfo.getPlayerFile().getPronouns().getSaidMessage())))
.color(RP_MESSAGE_COLOR_PRIMARY)
.append(space())
.append(playerInfo.getGrayIDGoldName())
.append(text(", ", RP_MESSAGE_COLOR_PRIMARY))
.append(action
.color(RP_MESSAGE_COLOR_SECONDARY))
.append(text(" *", RP_MESSAGE_COLOR_PRIMARY));
default ->
text("* ", RP_MESSAGE_COLOR_PRIMARY)
.append(playerInfo.getGrayIDGoldName())
.append(space()
.append(action.color(RP_MESSAGE_COLOR_SECONDARY)))
.append(text(" *", RP_MESSAGE_COLOR_PRIMARY));
};
sendLocalMessage(Badges.YELLOW_EXCLAMATION_MARK.append(fullMessage), sender.getLocation(), configCache.localChatRadius);
Bukkit.getScheduler().runTaskAsynchronously(new MSUtil(),
() -> sendMessage(getTextChannelById(configCache.discordLocalChannelId), serializeLegacyComponent(fullMessage)));
sendInfo(serializeLegacyComponent(fullMessage));
}
@Deprecated
public void sendRPEventMessage(
@NonNull Player player,
@NonNull Component action,
@NonNull RolePlayActionType rolePlayActionType)
{
sendRPEventMessage(player, Component.empty(), action, rolePlayActionType);
}
/**
* Send a death message.
* @param killed who killed
* @param killer by who
* @deprecated
*/
@Deprecated
public static void sendDeathMessage(
@NonNull Player killed,
@Nullable Player killer)
{
ConfigCache configCache = MSUtil.getConfigCache();
PlayerInfoMap playerInfoMap = configCache.playerInfoMap;
Location deathLocation = killed.getLocation();
PlayerInfo killedInfo = playerInfoMap.getPlayerInfo(killed);
PlayerInfo killerInfo = killer == null
? null
: playerInfoMap.getPlayerInfo(killer);
Component deathMessage = killerInfo == null
? space()
.append(killedInfo.getGoldenName()
.append(space()))
.append(text(killedInfo.getPlayerFile().getPronouns().getDeathMessage()))
.color(JOIN_MESSAGE_COLOR_PRIMARY)
: space()
.append(killerInfo.getGoldenName()
.append(space()))
.append(text(killerInfo.getPlayerFile().getPronouns().getKillMessage())
.color(JOIN_MESSAGE_COLOR_PRIMARY)
.append(space()))
.append(killedInfo.getGoldenName());
String stringDeathMessage = serializeLegacyComponent(deathMessage);
killedInfo.setLastDeathLocation(deathLocation);
sendGlobalMessage(deathMessage);
Bukkit.getScheduler().runTaskAsynchronously(new MSUtil(), () ->
{
sendActionMessage(killed, getTextChannelById(configCache.discordGlobalChannelId), stringDeathMessage, 16757024);
sendActionMessage(killed, getTextChannelById(configCache.discordLocalChannelId), stringDeathMessage, 16757024);
});
sendInfo(stringDeathMessage);
sendInfo(text(String.format(
"Світ та координати смерті гравця: \"{}\" ({}) : {} {} {} {}",
killedInfo.getDefaultName(), killed.getName,
deathLocation.getWorld().getName(),
deathLocation.getBlockX(), deathLocation.getBlockY(), deathLocation.getBlockZ()))
);
}
/**
* Send a message about joining the server.
* @param playerInfo PlayerInfo object of joined player
* @deprecated
*/
// Refactor code to remove PlayerInfo.
@Deprecated
public void sendJoinMessage(@NonNull PlayerInfo playerInfo)
{
Player player = playerInfo.getOnlinePlayer();
if (player == null || !playerInfo.isOnline(true)) return;
ConfigCache configCache = MSUtil.getConfigCache();
Component joinMessage = playerInfo.getGoldenName()
.append(space()))
.append(text(playerInfo.getPlayerFile().getPronouns().getJoinMessage()))
.color(JOIN_MESSAGE_COLOR_PRIMARY);
String stringJoinMessage = serializeLegacyComponent(joinMessage);
sendGlobalMessage(joinMessage);
Bukkit.getScheduler().runTaskAsynchronously(new MSUtil(), () ->
{
sendActionMessage(player, getTextChannelById(configCache.discordGlobalChannelId), stringJoinMessage, 65280);
sendActionMessage(player, getTextChannelById(configCache.discordLocalChannelId), stringJoinMessage, 65280);
});
sendInfo(stringJoinMessage);
}
/**
* Send message about leaving the server.
* @param playerInfo playerInfo
* @param player player
* @deprecated
*/
@Deprecated
public void sendQuitMessage(
@NonNull PlayerInfo playerInfo,
@NonNull Player player)
{
if (!playerInfo.isOnline()) return;
ConfigCache configCache = MSUtil.getConfigCache();
Component quitMessage = playerInfo.getGoldenName()
.append(space()))
.append(text(playerInfo.getPlayerFile().getPronouns().getQuitMessage()))
.color(JOIN_MESSAGE_COLOR_PRIMARY);
String stringQuitMessage = serializeLegacyComponent(quitMessage);
sendGlobalMessage(quitMessage);
Bukkit.getScheduler().runTaskAsynchronously(new MSUtil(), () ->
{
// TODO: Move channel id to config.
sendActionMessage(player, getTextChannelById(configCache.discordGlobalChannelId), stringQuitMessage, 16711680);
sendActionMessage(player, getTextChannelById(configCache.discordLocalChannelId), stringQuitMessage, 16711680);
});
sendInfo(stringQuitMessage);
}
@Deprecated
private void sendActionMessage(
@NonNull Player player,
TextChannel textChannel,
@NonNull String actionMessage,
int colorRaw)
{
if (DiscordUtil.getJda() == null) return;
DiscordUtil.queueMessage(textChannel,
DiscordSRV.translateMessage(
new MessageFormat(
"",
actionMessage,
"",
DiscordSRV.getAvatarUrl(player),
"",
"",
"",
"",
"",
"",
"",
null,
colorRaw,
null,
false,
DiscordUtil.getJda().getSelfUser().getEffectiveAvatarUrl(),
DiscordSRV.getPlugin().getMainGuild() == null
? DiscordUtil.getJda().getSelfUser().getName()
: DiscordSRV.getPlugin().getMainGuild().getSelfMember().getEffectiveName()),
(content, needsEscape) -> PlaceholderUtil.replacePlaceholdersToDiscord(content, player)), true);
}
private final class Colors
{
// TODO: Move color values to config.
private final TextColor
CHAT_MESSAGE_COLOR_PRIMARY = TextColor.fromHexString("#aba494"),
CHAT_MESSAGE_COLOR_SECONDARY = TextColor.fromHexString("#f1f0e3"),
JOIN_MESSAGE_COLOR_PRIMARY = TextColor.fromHexString("#ffef93"),
JOIN_MESSAGE_COLOR_SECONDARY = TextColor.fromHexString("#fcf5c7"),
RP_MESSAGE_COLOR_PRIMARY = TextColor.fromHexString("#ffaa00"),
RP_MESSAGE_COLOR_SECONDARY = TextColor.fromHexString("#ffc369");
}
}