X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fxdcc%2Fcore%2FCore.java;h=9d5dcb7a9877c7bf63805d599a03ee652e137fc6;hb=db7e9612fa189cee9f4b9086e00d87c4d6c58bbf;hp=1f15af0da8ef3ee285fba998bc1f3068c764d769;hpb=ff99325d519095f49576105b7cd4b330b3bc8902;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 1f15af0..9d5dcb7 100644 --- a/src/main/java/net/pterodactylus/xdcc/core/Core.java +++ b/src/main/java/net/pterodactylus/xdcc/core/Core.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.io.OutputStream; import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -38,12 +39,14 @@ import net.pterodactylus.irc.event.ChannelJoined; import net.pterodactylus.irc.event.ChannelLeft; 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.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.util.MessageCleaner; import net.pterodactylus.irc.util.RandomNickname; @@ -64,6 +67,7 @@ import net.pterodactylus.xdcc.data.Server; import com.google.common.base.Optional; import com.google.common.collect.HashBasedTable; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -326,6 +330,45 @@ public class Core extends AbstractExecutionThreadService { } /** + * Remove all data stored for a network if the connection is closed. + * + * @param connectionClosed + * The connection closed event + */ + @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))); + + /* now remove the network. */ + networkConnections.remove(network.get()); + } + + /** * Shows a message when a channel was joined by us. * * @param channelJoined @@ -491,6 +534,22 @@ public class Core extends AbstractExecutionThreadService { } /** + * Sends a message to all console when a notice was received. + * + * @param privateNoticeReceived + * The notice received event + */ + @Subscribe + public void privateNoticeReceived(PrivateNoticeReceived privateNoticeReceived) { + Optional network = getNetwork(privateNoticeReceived.connection()); + if (!network.isPresent()) { + return; + } + + eventBus.post(new GenericMessage(String.format("Notice from %s (%s): %s", privateNoticeReceived.reply().source(), network.get(), privateNoticeReceived.text()))); + } + + /** * Starts a DCC download. * * @param dccSendReceived @@ -524,7 +583,7 @@ public class Core extends AbstractExecutionThreadService { } /* remove download. */ - downloads.remove(download); + downloads.remove(download.pack().name()); return; } @@ -571,7 +630,7 @@ public class Core extends AbstractExecutionThreadService { 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())); - downloads.remove(download); + downloads.remove(download.pack().name()); return; } OutputStream outputStream = new FileOutputStream(outputFile, true); @@ -605,7 +664,7 @@ public class Core extends AbstractExecutionThreadService { file.renameTo(new File(finalDirectory, download.pack().name())); eventBus.post(new DownloadFinished(download)); dccReceivers.remove(dccDownloadFinished.dccReceiver()); - downloads.remove(download); + downloads.remove(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); @@ -630,7 +689,7 @@ public class Core extends AbstractExecutionThreadService { Closeables.close(download.outputStream(), true); eventBus.post(new DownloadFailed(download)); dccReceivers.remove(dccDownloadFailed.dccReceiver()); - downloads.remove(download); + downloads.remove(download.pack().name()); } catch (IOException ioe1) { /* swallow silently. */ }