X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fxdcc%2Fcore%2FCore.java;h=d13b48602d2def0008c65d6075a77d9cca745130;hb=c8396748e78e3faa9316d7de6b6a8c58e584f1c1;hp=d02e6799cd463fadf3fe1c59a80233ea3d3df7b6;hpb=ba0bbd652e91e951e9fadb88a5ad25fe6e4dea11;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 d02e679..d13b486 100644 --- a/src/main/java/net/pterodactylus/xdcc/core/Core.java +++ b/src/main/java/net/pterodactylus/xdcc/core/Core.java @@ -17,6 +17,7 @@ package net.pterodactylus.xdcc.core; +import static net.pterodactylus.xdcc.data.Channel.TO_NETWORK; import static net.pterodactylus.xdcc.data.Download.FILTER_RUNNING; import java.io.File; @@ -69,6 +70,7 @@ import net.pterodactylus.xdcc.data.Network; import net.pterodactylus.xdcc.data.Pack; import net.pterodactylus.xdcc.data.Server; +import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; @@ -158,6 +160,29 @@ public class Core extends AbstractExecutionThreadService { } /** + * Returns all defined networks. + * + * @return All defined networks + */ + public Collection networks() { + return FluentIterable.from(channels).transform(TO_NETWORK).toSet(); + } + + /** + * Returns all connected networks. + * + * @return All connected networks + */ + public Collection connectedNetworks() { + return Lists.newArrayList(Optional.presentInstances(FluentIterable.from(networkConnections.values()).transform(new Function>() { + @Override + public Optional apply(Connection connection) { + return getNetwork(connection); + } + }))); + } + + /** * Returns all configured channels. Due to various circumstances, configured * channels might not actually be joined. * @@ -261,6 +286,43 @@ 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; + } + + /* stop the DCC receiver. */ + if (download.get().dccReceiver() != null) { + download.get().dccReceiver().stop(); + } else { + /* remove download if it hasn’t started yet. */ + downloads.remove(pack.name(), download.get()); + } + + /* 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 @@ -308,7 +370,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()))); + } } } } @@ -402,13 +468,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); @@ -502,10 +572,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()); } /** @@ -521,10 +588,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()); } /** @@ -829,6 +893,28 @@ public class Core extends AbstractExecutionThreadService { // /** + * 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. *