// Copyright (c) 2015, Christopher "BlayTheNinth" Baker package net.blay09.mods.eirairc.handler; import net.blay09.mods.eirairc.ConnectionManager; import net.blay09.mods.eirairc.EiraIRC; import net.blay09.mods.eirairc.api.EiraIRCAPI; import net.blay09.mods.eirairc.api.event.ClientChatEvent; import net.blay09.mods.eirairc.api.irc.IRCChannel; import net.blay09.mods.eirairc.api.irc.IRCConnection; import net.blay09.mods.eirairc.api.irc.IRCContext; import net.blay09.mods.eirairc.api.irc.IRCUser; import net.blay09.mods.eirairc.command.base.IRCCommandHandler; import net.blay09.mods.eirairc.config.*; import net.blay09.mods.eirairc.config.settings.BotSettings; import net.blay09.mods.eirairc.config.settings.GeneralSettings; import net.blay09.mods.eirairc.net.NetworkHandler; import net.blay09.mods.eirairc.net.message.MessageRedirect; import net.blay09.mods.eirairc.util.*; import net.minecraft.client.Minecraft; import net.minecraft.command.ICommandSender; import net.minecraft.command.server.CommandBroadcast; import net.minecraft.command.server.CommandEmote; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IChatComponent; import net.minecraftforge.event.CommandEvent; import net.minecraftforge.event.ServerChatEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.player.AchievementEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.StringUtils; @SuppressWarnings("unused") public class MCEventHandler { @SubscribeEvent public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { for(ServerConfig serverConfig : ConfigurationHandler.getServerConfigs()) { IRCConnection connection = ConnectionManager.getConnection(serverConfig.getIdentifier()); if(connection != null) { for(ChannelConfig channelConfig : serverConfig.getChannelConfigs()) { IRCChannel channel = connection.getChannel(channelConfig.getName()); if (channel != null) { GeneralSettings generalSettings = ConfigHelper.getGeneralSettings(channel); BotSettings botSettings = ConfigHelper.getBotSettings(channel); String ircMessage = MessageFormat.formatMessage(botSettings.getMessageFormat().ircPlayerJoin, channel, event.player, "", MessageFormat.Target.IRC, MessageFormat.Mode.Message); if (!generalSettings.readOnly.get() && botSettings.relayMinecraftJoinLeave.get()) { channel.message(ircMessage); } if (channel.getTopic() != null) { IChatComponent chatComponent = MessageFormat.formatChatComponent(ConfigHelper.getBotSettings(channel).getMessageFormat().mcTopic, connection, channel, null, channel.getTopic(), MessageFormat.Target.Minecraft, MessageFormat.Mode.Message); event.player.addChatMessage(chatComponent); } if (generalSettings.autoWho.get()) { Utils.sendUserList(event.player, connection, channel); } } } } } // Send redirect configurations to client if(MinecraftServer.getServer() != null && MinecraftServer.getServer().isDedicatedServer()) { for (ServerConfig serverConfig : ConfigurationHandler.getServerConfigs()) { if (serverConfig.isRedirect()) { NetworkHandler.instance.sendTo(new MessageRedirect(serverConfig.toJsonObject().toString()), (EntityPlayerMP) event.player); } } } } @SubscribeEvent public void onServerCommand(CommandEvent event) { if (!event.command.canCommandSenderUseCommand(event.sender)) { return; } if(event.command instanceof CommandEmote) { if(event.sender instanceof EntityPlayer) { String emote = StringUtils.join(event.parameters, " ", 0, event.parameters.length).trim(); if(emote.length() == 0) { return; } IChatComponent chatComponent = new ChatComponentTranslation("* "); chatComponent.appendSibling(event.sender.getDisplayName()); chatComponent.appendText(" "); chatComponent.appendSibling(MessageFormat.createChatComponentForMessage(emote)); EnumChatFormatting emoteColor = SharedGlobalConfig.theme.emoteTextColor.get(); if(emoteColor != null) { chatComponent.getChatStyle().setColor(emoteColor); } Utils.addMessageToChat(chatComponent); if(!MinecraftServer.getServer().isSinglePlayer()) { relayChatServer(event.sender, emote, true, false, null); } event.setCanceled(true); } } else if(event.command instanceof CommandBroadcast) { for(ServerConfig serverConfig : ConfigurationHandler.getServerConfigs()) { IRCConnection connection = ConnectionManager.getConnection(serverConfig.getIdentifier()); if(connection != null) { for(ChannelConfig channelConfig : serverConfig.getChannelConfigs()) { IRCChannel channel = connection.getChannel(channelConfig.getName()); if (channel != null) { GeneralSettings generalSettings = ConfigHelper.getGeneralSettings(channel); BotSettings botSettings = ConfigHelper.getBotSettings(channel); String ircMessage = MessageFormat.formatMessage(botSettings.getMessageFormat().ircBroadcastMessage, channel, event.sender, StringUtils.join(event.parameters, " ", 0, event.parameters.length), MessageFormat.Target.IRC, MessageFormat.Mode.Message); if (!generalSettings.readOnly.get() && botSettings.relayBroadcasts.get()) { channel.message(ircMessage); } } } } } } } @SideOnly(Side.CLIENT) @SubscribeEvent public void onClientChat(ClientChatEvent event) { if(event.message.startsWith("/")) { if(event.message.startsWith("/me ") && event.message.length() > 4) { onClientEmote(event); } return; } EntityPlayer sender = Minecraft.getMinecraft().thePlayer; if(ConnectionManager.getConnectionCount() > 0 && IRCCommandHandler.onChatCommand(sender, event.message, false)) { event.setCanceled(true); return; } if(ClientGlobalConfig.clientBridge.get()) { relayChatClient(event.message, false, false, null); event.setCanceled(true); return; } IRCContext chatTarget = EiraIRC.instance.getChatSessionHandler().getChatTarget(); if(chatTarget == null) { return; } IRCUser ircSender = chatTarget.getConnection().getBotUser(); IChatComponent chatComponent; if(chatTarget instanceof IRCChannel) { BotSettings botSettings = ConfigHelper.getBotSettings(chatTarget); chatComponent = MessageFormat.formatChatComponent(botSettings.getMessageFormat().mcSendChannelMessage, chatTarget.getConnection(), chatTarget, ircSender, event.message, MessageFormat.Target.Minecraft, MessageFormat.Mode.Message); } else if(chatTarget instanceof IRCUser) { BotSettings botSettings = ConfigHelper.getBotSettings(chatTarget); chatComponent = MessageFormat.formatChatComponent(botSettings.getMessageFormat().mcSendPrivateMessage, chatTarget.getConnection(), chatTarget, ircSender, event.message, MessageFormat.Target.Minecraft, MessageFormat.Mode.Message); } else { return; } relayChatClient(event.message, false, false, chatTarget); EiraIRCAPI.getChatHandler().addChatMessage(chatComponent, chatTarget); event.setCanceled(true); } @SideOnly(Side.CLIENT) public void onClientEmote(ClientChatEvent event) { String text = event.message.substring(4); EntityPlayer sender = Minecraft.getMinecraft().thePlayer; if(ClientGlobalConfig.clientBridge.get()) { relayChatClient(text, true, false, null); event.setCanceled(true); return; } IRCContext chatTarget = EiraIRC.instance.getChatSessionHandler().getChatTarget(); if(chatTarget == null) { return; } IRCUser ircSender = chatTarget.getConnection().getBotUser(); EnumChatFormatting emoteColor; IChatComponent chatComponent; if(chatTarget instanceof IRCChannel) { emoteColor = ConfigHelper.getTheme(chatTarget).emoteTextColor.get(); BotSettings botSettings = ConfigHelper.getBotSettings(chatTarget); chatComponent = MessageFormat.formatChatComponent(botSettings.getMessageFormat().mcSendChannelEmote, chatTarget.getConnection(), chatTarget, ircSender, text, MessageFormat.Target.IRC, MessageFormat.Mode.Emote); } else if(chatTarget instanceof IRCUser) { emoteColor = ConfigHelper.getTheme(chatTarget).emoteTextColor.get(); BotSettings botSettings = ConfigHelper.getBotSettings(chatTarget); chatComponent = MessageFormat.formatChatComponent(botSettings.getMessageFormat().mcSendPrivateEmote, chatTarget.getConnection(), chatTarget, ircSender, text, MessageFormat.Target.IRC, MessageFormat.Mode.Emote); } else { return; } relayChatClient(text, true, false, chatTarget); if(emoteColor != null) { chatComponent.getChatStyle().setColor(emoteColor); } EiraIRCAPI.getChatHandler().addChatMessage(chatComponent, chatTarget); event.setCanceled(true); } @SubscribeEvent public void onServerChat(ServerChatEvent event) { IChatComponent senderComponent = event.player.getDisplayName(); EnumChatFormatting nameColor = IRCFormatting.getColorFormattingForPlayer(event.player); if(nameColor != null && nameColor != EnumChatFormatting.WHITE) { senderComponent.getChatStyle().setColor(nameColor); } event.setComponent(new ChatComponentTranslation("chat.type.text", senderComponent, MessageFormat.createChatComponentForMessage(event.message))); if(!MinecraftServer.getServer().isSinglePlayer()) { if(IRCCommandHandler.onChatCommand(event.player, event.message, true)) { event.setCanceled(true); return; } relayChatServer(event.player, event.message, false, false, null); } } @SideOnly(Side.CLIENT) public void relayChatClient(String message, boolean isEmote, boolean isNotice, IRCContext target) { if(target != null) { if(!ConfigHelper.getGeneralSettings(target).readOnly.get()) { if(isEmote) { if (isNotice) { target.ctcpNotice("ACTION " + message); } else { target.ctcpMessage("ACTION " + message); } } else { if (isNotice) { target.notice(message); } else { target.message(message); } } } else { ChatComponentBuilder.create().color('c').lang("eirairc:general.readOnly", target.getName()).send(); } } else { if(ClientGlobalConfig.clientBridge.get()) { String ircMessage = message; boolean isCtcp = false; if(isEmote) { isCtcp = true; ircMessage = "ACTION " + ircMessage; } for(ServerConfig serverConfig : ConfigurationHandler.getServerConfigs()) { IRCConnection connection = ConnectionManager.getConnection(serverConfig.getIdentifier()); if(connection != null) { for (ChannelConfig channelConfig : serverConfig.getChannelConfigs()) { IRCChannel channel = connection.getChannel(channelConfig.getName()); if (channel != null) { if (!ConfigHelper.getGeneralSettings(channel).readOnly.get()) { if (isCtcp) { if (isNotice) { channel.ctcpNotice(ircMessage); } else { channel.ctcpMessage(ircMessage); } } else { if (isNotice) { channel.notice(ircMessage); } else { channel.message(ircMessage); } } } } } } } } else { IRCContext chatTarget = EiraIRC.instance.getChatSessionHandler().getChatTarget(); if(chatTarget != null) { if(!ConfigHelper.getGeneralSettings(chatTarget).readOnly.get()) { if (isEmote) { if (isNotice) { chatTarget.ctcpNotice("ACTION " + message); } else { chatTarget.ctcpMessage("ACTION " + message); } } else { if (isNotice) { chatTarget.notice(message); } else { chatTarget.message(message); } } } else { ChatComponentBuilder.create().color('c').lang("eirairc:general.readOnly", chatTarget.getName()).send(); } } } } } public void relayChatServer(ICommandSender sender, String message, boolean isEmote, boolean isNotice, IRCContext target) { if(target != null) { if(!ConfigHelper.getGeneralSettings(target).readOnly.get()) { if(!isEmote && !isNotice && ConfigurationHandler.passesRemoteCommand(sender, message)) { target.message(message); return; } String format = MessageFormat.getMessageFormat(target, isEmote); String ircMessage = MessageFormat.formatMessage(format, target, sender, message, MessageFormat.Target.IRC, (isEmote ? MessageFormat.Mode.Emote : MessageFormat.Mode.Message)); if(isEmote) { if (isNotice) { target.ctcpNotice("ACTION " + ircMessage); } else { target.ctcpMessage("ACTION " + ircMessage); } } else { if (isNotice) { target.notice(ircMessage); } else { target.message(ircMessage); } } } } else { for(ServerConfig serverConfig : ConfigurationHandler.getServerConfigs()) { IRCConnection connection = ConnectionManager.getConnection(serverConfig.getIdentifier()); if(connection != null) { for(ChannelConfig channelConfig : serverConfig.getChannelConfigs()) { IRCChannel channel = connection.getChannel(channelConfig.getName()); if(channel != null) { String format = MessageFormat.getMessageFormat(channel, isEmote); String ircMessage = MessageFormat.formatMessage(format, channel, sender, message, MessageFormat.Target.IRC, (isEmote ? MessageFormat.Mode.Emote : MessageFormat.Mode.Message)); if (!ConfigHelper.getGeneralSettings(channel).readOnly.get()) { if(isEmote) { if (isNotice) { channel.ctcpNotice("ACTION " + ircMessage); } else { channel.ctcpMessage("ACTION " + ircMessage); } } else { if (isNotice) { channel.notice(ircMessage); } else { channel.message(ircMessage); } } } } } } } } } @SubscribeEvent public void onPlayerDeath(LivingDeathEvent event) { if(event.entityLiving instanceof EntityPlayer) { for(ServerConfig serverConfig : ConfigurationHandler.getServerConfigs()) { IRCConnection connection = ConnectionManager.getConnection(serverConfig.getIdentifier()); if(connection != null) { for (ChannelConfig channelConfig : serverConfig.getChannelConfigs()) { IRCChannel channel = connection.getChannel(channelConfig.getName()); if (channel != null) { GeneralSettings generalSettings = ConfigHelper.getGeneralSettings(channel); BotSettings botSettings = ConfigHelper.getBotSettings(channel); String name = Utils.getNickIRC((EntityPlayer) event.entityLiving, channel); String ircMessage = event.entityLiving.getCombatTracker().getDeathMessage().getUnformattedText(); ircMessage = ircMessage.replace(event.entityLiving.getName(), name); ircMessage = IRCFormatting.toIRC(ircMessage, !botSettings.convertColors.get()); if (!generalSettings.readOnly.get() && botSettings.relayDeathMessages.get()) { channel.message(ircMessage); } } } } } } } @SubscribeEvent public void onAchievement(AchievementEvent event) { if(((EntityPlayerMP) event.entityPlayer).getStatFile().hasAchievementUnlocked(event.achievement)) { // This is necessary because the Achievement event fires even if an achievement is already unlocked. return; } if(!((EntityPlayerMP) event.entityPlayer).getStatFile().canUnlockAchievement(event.achievement)) { // This is necessary because the Achievement event fires even if an achievement can not be unlocked yet. return; } for(ServerConfig serverConfig : ConfigurationHandler.getServerConfigs()) { IRCConnection connection = ConnectionManager.getConnection(serverConfig.getIdentifier()); if(connection != null) { for (ChannelConfig channelConfig : serverConfig.getChannelConfigs()) { IRCChannel channel = connection.getChannel(channelConfig.getName()); if (channel != null) { GeneralSettings generalSettings = ConfigHelper.getGeneralSettings(channel); BotSettings botSettings = ConfigHelper.getBotSettings(channel); String ircMessage = MessageFormat.formatMessage(botSettings.getMessageFormat().ircAchievement, channel, event.entityPlayer, event.achievement.getStatName().getUnformattedText(), MessageFormat.Target.IRC, MessageFormat.Mode.Emote); if (!generalSettings.readOnly.get() && botSettings.relayAchievements.get()) { channel.message(ircMessage); } } } } } } @SubscribeEvent public void onPlayerLogout(PlayerEvent.PlayerLoggedOutEvent event) { for(ServerConfig serverConfig : ConfigurationHandler.getServerConfigs()) { IRCConnection connection = ConnectionManager.getConnection(serverConfig.getIdentifier()); if(connection != null) { for (ChannelConfig channelConfig : serverConfig.getChannelConfigs()) { IRCChannel channel = connection.getChannel(channelConfig.getName()); if (channel != null) { GeneralSettings generalSettings = ConfigHelper.getGeneralSettings(channel); BotSettings botSettings = ConfigHelper.getBotSettings(channel); String ircMessage = MessageFormat.formatMessage(botSettings.getMessageFormat().ircPlayerLeave, channel, event.player, "", MessageFormat.Target.IRC, MessageFormat.Mode.Message); if (!generalSettings.readOnly.get() && botSettings.relayMinecraftJoinLeave.get()) { channel.message(ircMessage); } } } } } } public void onPlayerNickChange(EntityPlayer player, String oldNick) { String format = SharedGlobalConfig.botSettings.getMessageFormat().ircPlayerNickChange; format = format.replace("{OLDNICK}", oldNick); IChatComponent chatComponent = MessageFormat.formatChatComponent(format, null, player, "", MessageFormat.Target.Minecraft, MessageFormat.Mode.Emote); Utils.addMessageToChat(chatComponent); for(ServerConfig serverConfig : ConfigurationHandler.getServerConfigs()) { IRCConnection connection = ConnectionManager.getConnection(serverConfig.getIdentifier()); if(connection != null) { for(ChannelConfig channelConfig : serverConfig.getChannelConfigs()) { IRCChannel channel = connection.getChannel(channelConfig.getName()); if(channel != null) { if(!ConfigHelper.getGeneralSettings(channel).readOnly.get()) { format = ConfigHelper.getBotSettings(channel).getMessageFormat().ircPlayerNickChange; format = format.replace("{OLDNICK}", oldNick); channel.message(MessageFormat.formatMessage(format, channel, player, "", MessageFormat.Target.IRC, MessageFormat.Mode.Emote)); } } } } } } }