X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fxdcc%2Fcore%2FCore.java;h=68628d70bbce5d0f39912558eb8a0b0b7e501d74;hb=f5fcfe1bbd91b46e873a870a0548349002a0c626;hp=d875a5b21d2f0cb5ef38db28b10a37a203b7fea3;hpb=2789ac815443aff72512e4770aebb53cea9006a6;p=xudocci.git diff --git a/src/main/java/net/pterodactylus/xdcc/core/Core.java b/src/main/java/net/pterodactylus/xdcc/core/Core.java index d875a5b..68628d7 100644 --- a/src/main/java/net/pterodactylus/xdcc/core/Core.java +++ b/src/main/java/net/pterodactylus/xdcc/core/Core.java @@ -17,6 +17,11 @@ package net.pterodactylus.xdcc.core; +import static java.lang.String.format; +import static java.lang.System.currentTimeMillis; +import static java.util.concurrent.TimeUnit.HOURS; +import static net.pterodactylus.irc.event.ChannelNotJoined.Reason.banned; +import static net.pterodactylus.irc.event.ChannelNotJoined.Reason.registeredNicknamesOnly; import static net.pterodactylus.irc.util.MessageCleaner.getDefaultInstance; import static net.pterodactylus.xdcc.data.Channel.TO_NETWORK; import static net.pterodactylus.xdcc.data.Download.FILTER_RUNNING; @@ -33,8 +38,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; import net.pterodactylus.irc.Connection; import net.pterodactylus.irc.ConnectionBuilder; @@ -42,6 +45,7 @@ import net.pterodactylus.irc.DccReceiver; import net.pterodactylus.irc.event.ChannelJoined; import net.pterodactylus.irc.event.ChannelLeft; import net.pterodactylus.irc.event.ChannelMessageReceived; +import net.pterodactylus.irc.event.ChannelNotJoined; import net.pterodactylus.irc.event.ClientQuit; import net.pterodactylus.irc.event.ConnectionClosed; import net.pterodactylus.irc.event.ConnectionEstablished; @@ -50,6 +54,7 @@ import net.pterodactylus.irc.event.DccAcceptReceived; import net.pterodactylus.irc.event.DccDownloadFailed; import net.pterodactylus.irc.event.DccDownloadFinished; import net.pterodactylus.irc.event.DccSendReceived; +import net.pterodactylus.irc.event.KickedFromChannel; import net.pterodactylus.irc.event.NicknameChanged; import net.pterodactylus.irc.event.PrivateMessageReceived; import net.pterodactylus.irc.event.PrivateNoticeReceived; @@ -88,6 +93,7 @@ import com.google.common.eventbus.Subscribe; import com.google.common.io.Closeables; import com.google.common.util.concurrent.AbstractExecutionThreadService; import com.google.inject.Inject; +import org.apache.log4j.Logger; /** * The core of XDCC Downloader. @@ -101,6 +107,8 @@ public class Core extends AbstractExecutionThreadService { /** The event bus. */ private final EventBus eventBus; + private final ChannelBanManager channelBanManager = + new ChannelBanManager(); /** The temporary directory to download files to. */ private final String temporaryDirectory; @@ -281,7 +289,7 @@ public class Core extends AbstractExecutionThreadService { try { connection.sendMessage(bot.name(), "XDCC SEND " + pack.id()); } catch (IOException ioe1) { - logger.log(Level.WARNING, "Could not send message to bot!", ioe1); + logger.warn("Could not send message to bot!", ioe1); } } @@ -318,7 +326,7 @@ public class Core extends AbstractExecutionThreadService { try { connection.sendMessage(bot.name(), String.format("XDCC %s", (download.get().dccReceiver() != null) ? "CANCEL" : "REMOVE")); } catch (IOException ioe1) { - logger.log(Level.WARNING, String.format("Could not cancel DCC from %s (%s)!", bot.name(), bot.network().name()), ioe1); + logger.warn(String.format("Could not cancel DCC from %s (%s)!", bot.name(), bot.network().name()), ioe1); } } @@ -366,6 +374,11 @@ public class Core extends AbstractExecutionThreadService { continue; } + /* are we banned from this channel? */ + if (channelBanManager.isBanned(channel)) { + continue; + } + connectNetwork(channel.network()); Connection connection = networkConnections.get(channel.network()); if (connection.established()) { @@ -481,7 +494,7 @@ public class Core extends AbstractExecutionThreadService { eventBus.post(new GenericMessage(String.format("Trying to join %s on %s...", channel.name(), network.get().name()))); connectionEstablished.connection().joinChannel(channel.name()); } catch (IOException ioe1) { - logger.log(Level.WARNING, String.format("Could not join %s on %s!", channel.name(), network.get().name()), ioe1); + logger.warn(String.format("Could not join %s on %s!", channel.name(), network.get().name()), ioe1); } } } @@ -531,11 +544,44 @@ public class Core extends AbstractExecutionThreadService { return; } + channelBanManager.unban(channel.get()); joinedChannels.add(channel.get()); logger.info(String.format("Joined Channel %s on %s.", channelJoined.channel(), network.get().name())); } } + @Subscribe + public void channelNotJoined(ChannelNotJoined channelNotJoined) { + Optional network = getNetwork(channelNotJoined.connection()); + if (!network.isPresent()) { + return; + } + + Optional channel = getChannel(network.get(), channelNotJoined.channel()); + if (!channel.isPresent()) { + eventBus.post(new GenericMessage(format("Could not join %s but didn’t try to join, either.", channel.get()))); + return; + } + + if (channelNotJoined.reason() == registeredNicknamesOnly) { + channels.remove(channel.get()); + eventBus.post(new GenericMessage( + format("Not trying to join %s anymore.", channel.get()))); + return; + } + if (channelNotJoined.reason() == banned) { + channelBanManager.ban(channel.get()); + eventBus.post(new GenericMessage( + format("Banned from %s, suspending join for day.", + channel.get()))); + return; + } + + eventBus.post(new GenericMessage( + format("Could not join %s: %s", channelNotJoined.channel(), + channelNotJoined.reason()))); + } + /** * Removes bots that leave a channel, or channels when it’s us that’s leaving. * @@ -576,6 +622,41 @@ public class Core extends AbstractExecutionThreadService { networkBots.remove(network.get(), channelLeft.client().nick().get()); } + @Subscribe + public void kickedFromChannel(KickedFromChannel kickedFromChannel) { + Optional network = getNetwork(kickedFromChannel.connection()); + if (!network.isPresent()) { + return; + } + + /* have we been kicked? */ + if (nicknameMatchesConnection(kickedFromChannel.connection(), kickedFromChannel.kickee())) { + Optional channel = getChannel(network.get(), kickedFromChannel.channel()); + if (!channel.isPresent()) { + /* maybe it was an extra channel? */ + channel = getExtraChannel(network.get(), kickedFromChannel.channel()); + if (!channel.isPresent()) { + /* okay, whatever. */ + return; + } + + extraChannels.remove(channel); + } else { + channels.remove(channel.get()); + } + eventBus.post(new GenericMessage(format( + "Kicked from %s by %s: %s", + kickedFromChannel.channel(), + kickedFromChannel.kicker(), + kickedFromChannel.reason().or("") + ))); + } + } + + private boolean nicknameMatchesConnection(Connection connection, String nickname) { + return connection.nickname().equalsIgnoreCase(nickname); + } + /** * Removes a client (which may be a bot) from the table of known bots. * @@ -654,7 +735,7 @@ public class Core extends AbstractExecutionThreadService { /* add pack. */ bot.addPack(pack.get()); - logger.fine(String.format("Bot %s now has %d packs.", bot, bot.packs().size())); + logger.debug(String.format("Bot %s now has %d packs.", bot, bot.packs().size())); } /** @@ -681,7 +762,7 @@ public class Core extends AbstractExecutionThreadService { return; } - eventBus.post(new GenericMessage(String.format("Notice from %s (%s): %s", privateNoticeReceived.reply().source().get(), network.get(), privateNoticeReceived.text()))); + eventBus.post(new GenericMessage(String.format("Notice from %s (%s): %s", privateNoticeReceived.source(), network.get(), privateNoticeReceived.text()))); } /** @@ -809,7 +890,7 @@ public class Core extends AbstractExecutionThreadService { File outputFile = new File(temporaryDirectory, dccAcceptReceived.filename()); if (outputFile.length() != dccAcceptReceived.position()) { eventBus.post(new GenericError(String.format("Download %s from %s does not start at the right position!"))); - logger.log(Level.WARNING, String.format("Download %s from %s: have %d bytes but wants to resume from %d!", dccAcceptReceived.filename(), dccAcceptReceived.source(), outputFile.length(), dccAcceptReceived.position())); + logger.warn(String.format("Download %s from %s: have %d bytes but wants to resume from %d!", dccAcceptReceived.filename(), dccAcceptReceived.source(), outputFile.length(), dccAcceptReceived.position())); downloads.removeAll(download.pack().name()); return; @@ -838,7 +919,7 @@ public class Core extends AbstractExecutionThreadService { Collection requestedDownload = FluentIterable.from(downloads.get(dccDownloadFinished.dccReceiver().filename())).filter(FILTER_RUNNING).toSet(); if (requestedDownload.isEmpty()) { /* this seems wrong. */ - logger.warning("Download finished but could not be located."); + logger.warn("Download finished but could not be located."); return; } Download download = requestedDownload.iterator().next(); @@ -852,7 +933,7 @@ public class Core extends AbstractExecutionThreadService { downloads.removeAll(download.pack().name()); } catch (IOException ioe1) { /* TODO - handle all the errors. */ - logger.log(Level.WARNING, String.format("Could not move file %s to directory %s.", download.filename(), finalDirectory), ioe1); + logger.warn(String.format("Could not move file %s to directory %s.", download.filename(), finalDirectory), ioe1); } } @@ -869,7 +950,7 @@ public class Core extends AbstractExecutionThreadService { Collection requestedDownload = FluentIterable.from(downloads.get(dccDownloadFailed.dccReceiver().filename())).filter(FILTER_RUNNING).toSet(); if (requestedDownload.isEmpty()) { /* this seems wrong. */ - logger.warning("Download finished but could not be located."); + logger.warn("Download finished but could not be located."); return; } Download download = requestedDownload.iterator().next(); @@ -886,7 +967,7 @@ public class Core extends AbstractExecutionThreadService { @Subscribe public void replyReceived(ReplyReceived replyReceived) { - logger.log(Level.FINEST, String.format("%s: %s", replyReceived.connection().hostname(), replyReceived.reply())); + logger.trace(String.format("%s: %s", replyReceived.connection().hostname(), replyReceived.reply())); } //