X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fxdcc%2Fcore%2FCore.java;h=e78c4f10095874b77f52819c18baf3354b499091;hb=dba342edc56ae069040f7a78eecf54dd1c3bab12;hp=e9d02610648641c98809283a0848e884be585f98;hpb=0cd950664899385a6d3b8750b557e244597453d0;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 e9d0261..e78c4f1 100644 --- a/src/main/java/net/pterodactylus/xdcc/core/Core.java +++ b/src/main/java/net/pterodactylus/xdcc/core/Core.java @@ -43,13 +43,15 @@ import net.pterodactylus.irc.event.ChannelMessageReceived; import net.pterodactylus.irc.event.ClientQuit; import net.pterodactylus.irc.event.ConnectionClosed; import net.pterodactylus.irc.event.ConnectionEstablished; +import net.pterodactylus.irc.event.ConnectionFailed; 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.NicknameChanged; -import net.pterodactylus.irc.event.PrivateNoticeReceived; import net.pterodactylus.irc.event.PrivateMessageReceived; +import net.pterodactylus.irc.event.PrivateNoticeReceived; +import net.pterodactylus.irc.event.ReplyReceived; import net.pterodactylus.irc.util.MessageCleaner; import net.pterodactylus.irc.util.RandomNickname; import net.pterodactylus.xdcc.core.event.BotAdded; @@ -147,6 +149,15 @@ public class Core extends AbstractExecutionThreadService { // /** + * Returns all currently known connections. + * + * @return All currently known connections + */ + public Collection connections() { + return networkConnections.values(); + } + + /** * Returns all configured channels. Due to various circumstances, configured * channels might not actually be joined. * @@ -249,6 +260,57 @@ public class Core extends AbstractExecutionThreadService { } } + /** + * Cancels the download of the given pack from the given bot. + * + * @param bot + * The bot the pack is being downloaded from + * @param pack + * The pack being downloaded + */ + public void cancelDownload(Bot bot, Pack pack) { + Optional download = getDownload(pack, bot); + if (!download.isPresent()) { + return; + } + + /* get connection. */ + Connection connection = networkConnections.get(bot.network()); + if (connection == null) { + /* request for unknown network? */ + return; + } + + /* remove download. */ + downloads.remove(pack.name(), download.get()); + + /* stop the DCC receiver. */ + if (download.get().dccReceiver() != null) { + download.get().dccReceiver().stop(); + } + + /* remove the request from the bot, too. */ + 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); + } + } + + /** + * Closes the given connection. + * + * @param connection + * The connection to close + */ + public void closeConnection(Connection connection) { + try { + connection.close(); + } catch (IOException ioe1) { + /* TODO */ + } + } + // // ABSTRACTIDLESERVICE METHODS // @@ -283,7 +345,11 @@ public class Core extends AbstractExecutionThreadService { Connection connection = networkConnections.get(channel.network()); if (connection.established()) { eventBus.post(new GenericMessage(String.format("Trying to join %s on %s.", channel.name(), channel.network().name()))); - connection.joinChannel(channel.name()); + try { + connection.joinChannel(channel.name()); + } catch (IOException ioe1) { + eventBus.post(new GenericMessage(String.format("Could not join %s on %s.", channel.name(), channel.network().name()))); + } } } } @@ -320,6 +386,44 @@ public class Core extends AbstractExecutionThreadService { } } + /** + * Removes the given connection and all its channels and bots. + * + * @param connection + * The connection to remove + */ + private void removeConnection(Connection connection) { + Optional network = getNetwork(connection); + if (!network.isPresent()) { + return; + } + + /* find all channels that need to be removed. */ + for (Collection channels : ImmutableList.of(joinedChannels, extraChannels)) { + for (Iterator channelIterator = channels.iterator(); channelIterator.hasNext(); ) { + Channel joinedChannel = channelIterator.next(); + if (!joinedChannel.network().equals(network.get())) { + continue; + } + + channelIterator.remove(); + } + } + + /* now remove all bots for that network. */ + Map bots = networkBots.row(network.get()); + int botCount = bots.size(); + int packCount = 0; + for (Bot bot : bots.values()) { + packCount += bot.packs().size(); + } + bots.clear(); + eventBus.post(new GenericMessage(String.format("Network %s disconnected, %d bots removed, %d packs removed.", network.get().name(), botCount, packCount))); + + /* now remove the network. */ + networkConnections.remove(network.get()); + } + // // EVENT HANDLERS // @@ -339,13 +443,17 @@ public class Core extends AbstractExecutionThreadService { /* found network? */ if (!network.isPresent()) { + eventBus.post(new GenericMessage(String.format("Connected to unknown network: %s", connectionEstablished.connection().hostname()))); return; } + eventBus.post(new GenericMessage(String.format("Connected to network %s.", network.get().name()))); + /* join all channels on this network. */ for (Channel channel : channels) { if (channel.network().equals(network.get())) { try { + 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); @@ -362,35 +470,17 @@ public class Core extends AbstractExecutionThreadService { */ @Subscribe public void connectionClosed(ConnectionClosed connectionClosed) { - Optional network = getNetwork(connectionClosed.connection()); - if (!network.isPresent()) { - return; - } - - /* find all channels that need to be removed. */ - for (Collection channels : ImmutableList.of(joinedChannels, extraChannels)) { - for (Iterator channelIterator = channels.iterator(); channelIterator.hasNext(); ) { - Channel joinedChannel = channelIterator.next(); - if (!joinedChannel.network().equals(network.get())) { - continue; - } - - channelIterator.remove(); - } - } - - /* now remove all bots for that network. */ - Map bots = networkBots.row(network.get()); - int botCount = bots.size(); - int packCount = 0; - for (Bot bot : bots.values()) { - packCount += bot.packs().size(); - } - bots.clear(); - eventBus.post(new GenericMessage(String.format("Network %s disconnected, %d bots removed, %d packs removed.", network.get().name(), botCount, packCount))); + removeConnection(connectionClosed.connection()); + } - /* now remove the network. */ - networkConnections.remove(network.get()); + /** + * Remove all data stored for a network if the connection fails. + * + * @param connectionFailed + * The connection failed event + */ + public void connectionFailed(ConnectionFailed connectionFailed) { + removeConnection(connectionFailed.connection()); } /** @@ -457,10 +547,7 @@ public class Core extends AbstractExecutionThreadService { return; } - Bot removedBot = networkBots.remove(network.get(), channelLeft.client().nick().get()); - if (removedBot != null) { - eventBus.post(new GenericMessage(String.format("Bot %s (%s) was removed, %d packs removed.", removedBot.name(), removedBot.network().name(), removedBot.packs().size()))); - } + networkBots.remove(network.get(), channelLeft.client().nick().get()); } /** @@ -476,10 +563,7 @@ public class Core extends AbstractExecutionThreadService { return; } - Bot removedBot = networkBots.remove(network.get(), clientQuit.client().nick().get()); - if (removedBot != null) { - eventBus.post(new GenericMessage(String.format("Bot %s (%s) was removed, %d packs removed.", removedBot.name(), removedBot.network().name(), removedBot.packs().size()))); - } + networkBots.remove(network.get(), clientQuit.client().nick().get()); } /** @@ -774,11 +858,38 @@ public class Core extends AbstractExecutionThreadService { } } + @Subscribe + public void replyReceived(ReplyReceived replyReceived) { + logger.log(Level.FINEST, String.format("%s: %s", replyReceived.connection().hostname(), replyReceived.reply())); + } + // // PRIVATE METHODS // /** + * Returns the download of the given pack from the given bot. + * + * @param pack + * The pack being downloaded + * @param bot + * The bot the pack is being downloaded from + * @return The download, or {@link Optional#absent()} if the download could not + * be found + */ + private Optional getDownload(Pack pack, Bot bot) { + if (!downloads.containsKey(pack.name())) { + return Optional.absent(); + } + for (Download download : Lists.newArrayList(downloads.get(pack.name()))) { + if (download.bot().equals(bot)) { + return Optional.of(download); + } + } + return Optional.absent(); + } + + /** * Searches all current connections for the given connection, returning the * associated network. *