TotalFreedomMod/discord/src/main/java/me/totalfreedom/discord/listener/AdminChatListener.java

126 lines
5.2 KiB
Java

package me.totalfreedom.discord.listener;
import com.google.common.base.Strings;
import discord4j.core.event.domain.message.MessageCreateEvent;
import discord4j.core.object.entity.Attachment;
import discord4j.core.object.entity.Guild;
import discord4j.core.object.entity.Member;
import discord4j.core.object.entity.Message;
import me.totalfreedom.discord.Bot;
import me.totalfreedom.discord.TFD4J;
import me.totalfreedom.discord.util.SnowflakeEntry;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.api.event.AdminChatEvent;
import me.totalfreedom.totalfreedommod.rank.Displayable;
import me.totalfreedom.totalfreedommod.rank.GroupProvider;
import me.totalfreedom.totalfreedommod.rank.Title;
import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
public class AdminChatListener
{
private static final Key identifier = Key.key("tfd4j", "discord_admin_chat");
//--
private final Bot bot;
private final TFD4J tfd4j;
public AdminChatListener(TFD4J tfd4j)
{
this.tfd4j = tfd4j;
this.bot = tfd4j.getBot();
}
public void adminChatBound()
{
tfd4j.getBot()
.getClient()
.getEventDispatcher()
.on(MessageCreateEvent.class)
.filter(m -> m.getMessage()
.getChannelId()
.equals(SnowflakeEntry.ADMIN_CHAT_CHANNEL_ID.getSnowflake()))
.filter(m -> !m.getMessage()
.getAuthor()
.orElseThrow()
.getId()
.equals(tfd4j.getBot().getClient().getSelfId()))
.doOnError(FLog::severe)
.subscribe(this::createMessageSpec);
}
public void createMessageSpec(MessageCreateEvent m)
{
Member member = m.getMember().orElseThrow(IllegalAccessError::new);
Component name = Component.text(member.getDisplayName());
Message msg = m.getMessage();
TextComponent attachments = Component.empty();
for (Attachment attachment : msg.getAttachments())
{
attachments = attachments.append(
Component.text("[Media] ", NamedTextColor.YELLOW)
.clickEvent(ClickEvent.openUrl(attachment.getUrl()))
.hoverEvent(HoverEvent.showText(Component.text(attachment.getUrl()))));
}
TextComponent message = Component.text(msg.getContent()).append(msg.getAttachments().isEmpty() ?
Component.empty() : Component.space().append(attachments));
TotalFreedomMod.getPlugin().cm.adminChat(identifier, FUtil.miniMessage("<dark_gray>[<dark_aqua>Discord</dark_aqua>] </dark_gray>"), name, getDisplay(member), message, true);
}
public Displayable getDisplay(Member member)
{
Guild server = tfd4j.getBot().getGuildById().block();
// Server Owner
if (server == null) throw new IllegalStateException();
return member.getRoles()
.filter(role -> SnowflakeEntry.acceptableRoleIDs().contains(role.getId()))
.map(role ->
{
if (role.getId().equals(SnowflakeEntry.OWNER_ROLE_ID.getSnowflake()))
{
return Title.OWNER;
} else if (role.getId().equals(SnowflakeEntry.DEVELOPER_ROLE_ID.getSnowflake()))
{
return Title.DEVELOPER;
} else if (role.getId().equals(SnowflakeEntry.EXECUTIVE_ROLE_ID.getSnowflake()))
{
return Title.EXECUTIVE;
} else if (role.getId().equals(SnowflakeEntry.ASSISTANT_EXECUTIVE_ROLE_ID.getSnowflake()))
{
return Title.ASST_EXEC;
} else if (role.getId().equals(SnowflakeEntry.SENIOR_ADMIN_ROLE_ID.getSnowflake()))
{
return GroupProvider.SENIOR_ADMIN.getGroup();
} else if (role.getId().equals(SnowflakeEntry.ADMIN_ROLE_ID.getSnowflake()))
{
return GroupProvider.ADMIN.getGroup();
} else if (role.getId().equals(SnowflakeEntry.MASTERBUILDER_ROLE_ID.getSnowflake()))
{
return GroupProvider.MASTER_BUILDER.getGroup();
} else
{
return GroupProvider.OP.getGroup(); // This should never be reached.
}
}).blockFirst();
}
public static Key getIdentifier()
{
return identifier;
}
}