import net.pterodactylus.irc.Connection;
import net.pterodactylus.irc.ConnectionBuilder;
import net.pterodactylus.irc.DccReceiver;
+import net.pterodactylus.irc.event.ChannelJoined;
import net.pterodactylus.irc.event.ChannelMessageReceived;
import net.pterodactylus.irc.event.ConnectionEstablished;
import net.pterodactylus.irc.event.DccSendReceived;
import net.pterodactylus.xdcc.core.event.CoreStarted;
import net.pterodactylus.xdcc.data.Bot;
import net.pterodactylus.xdcc.data.Channel;
+import net.pterodactylus.xdcc.data.Download;
import net.pterodactylus.xdcc.data.Network;
import net.pterodactylus.xdcc.data.Pack;
import net.pterodactylus.xdcc.data.Server;
/** The event bus. */
private final EventBus eventBus;
+ /** The temporary directory to download files to. */
+ private final String temporaryDirectory;
+
+ /** The directory to move finished downloads to. */
+ private final String finalDirectory;
+
/** The channels that should be monitored. */
private final Collection<Channel> channels = Sets.newHashSet();
+ /** The channels that are currentlymonitored. */
+ private final Collection<Channel> joinedChannels = Sets.newHashSet();
+
+ /** The channels that are joined but not configured. */
+ private final Collection<Channel> extraChannels = Sets.newHashSet();
+
/** The current network connections. */
private final Map<Network, Connection> networkConnections = Collections.synchronizedMap(Maps.<Network, Connection>newHashMap());
/** The currently known bots. */
private final Table<Network, String, Bot> networkBots = HashBasedTable.create();
+ /** The current downloads. */
+ private final Map<String, Download> downloads = Maps.newHashMap();
+
/** The current DCC receivers. */
private final Collection<DccReceiver> dccReceivers = Sets.newHashSet();
*
* @param eventBus
* The event bus
+ * @param temporaryDirectory
+ * The directory to download files to
+ * @param finalDirectory
+ * The directory to move finished files to
*/
@Inject
- public Core(EventBus eventBus) {
+ public Core(EventBus eventBus, String temporaryDirectory, String finalDirectory) {
this.eventBus = eventBus;
+ this.temporaryDirectory = temporaryDirectory;
+ this.finalDirectory = finalDirectory;
}
//
}
/**
+ * Returns all currently joined channels.
+ *
+ * @return All currently joined channels
+ */
+ public Collection<Channel> joinedChannels() {
+ return ImmutableSet.copyOf(joinedChannels);
+ }
+
+ /**
+ * Returns all currently joined channels that are not configured.
+ *
+ * @return All currently joined but not configured channels
+ */
+ public Collection<Channel> extraChannels() {
+ return ImmutableSet.copyOf(extraChannels);
+ }
+
+ /**
* Returns all currently known bots.
*
* @return All currently known bots
return;
}
+ Download download = new Download(bot, pack);
+ downloads.put(pack.name(), download);
+
try {
connection.sendMessage(bot.name(), "XDCC SEND " + pack.id());
} catch (IOException ioe1) {
}
/**
+ * Shows a message when a channel was joined by us.
+ *
+ * @param channelJoined
+ * The channel joined event
+ */
+ @Subscribe
+ public void channelJoined(ChannelJoined channelJoined) {
+ if (channelJoined.connection().isSource(channelJoined.client())) {
+ Optional<Network> network = getNetwork(channelJoined.connection());
+ if (!network.isPresent()) {
+ return;
+ }
+
+ Optional<Channel> channel = getChannel(network.get(), channelJoined.channel());
+ if (!channel.isPresent()) {
+ /* it’s an extra channel. */
+ extraChannels.add(new Channel(network.get(), channelJoined.channel()));
+ logger.info(String.format("Joined extra Channel %s on %s.", channelJoined.channel(), network.get().name()));
+ return;
+ }
+
+ joinedChannels.add(channel.get());
+ logger.info(String.format("Joined Channel %s on %s.", channelJoined.channel(), network.get().name()));
+ }
+ }
+
+ /**
* If a message on a channel is received, it is parsed for pack information
* with is then added to a bot.
*
public void dccSendReceived(DccSendReceived dccSendReceived) {
logger.info(String.format("Starting download of %s.", dccSendReceived.filename()));
try {
- OutputStream fileOutputStream = new FileOutputStream(new File("/home/bombe/Temp", dccSendReceived.filename()));
- DccReceiver dccReceiver = new DccReceiver(dccSendReceived.inetAddress(), dccSendReceived.port(), dccSendReceived.filename(), dccSendReceived.filesize(), fileOutputStream);
+ File outputFile = new File(temporaryDirectory, dccSendReceived.filename());
+ OutputStream fileOutputStream = new FileOutputStream(outputFile);
+ DccReceiver dccReceiver = new DccReceiver(eventBus, dccSendReceived.inetAddress(), dccSendReceived.port(), dccSendReceived.filename(), dccSendReceived.filesize(), fileOutputStream);
dccReceivers.add(dccReceiver);
dccReceiver.start();
} catch (FileNotFoundException fnfe1) {
}
/**
+ * Returns the configured channel for the given network and name.
+ *
+ * @param network
+ * The network the channel is located on
+ * @param channelName
+ * The name of the channel
+ * @return The configured channel, or {@link Optional#absent()} if no
+ * configured channel matching the given network and name was found
+ */
+ public Optional<Channel> getChannel(Network network, String channelName) {
+ for (Channel channel : channels) {
+ if (channel.network().equals(network) && (channel.name().equals(channelName))) {
+ return Optional.of(channel);
+ }
+ }
+ return Optional.absent();
+ }
+
+ /**
* Parses {@link Pack} information from the given message.
*
* @param message