X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fxdcc%2Fcore%2FCore.java;h=272076c4bddd15525e67f7f0530247592448064e;hb=67092b8d7109812ba079965503bb61b11f5655c6;hp=171683b9a71892438a3b8476080333776e5507c4;hpb=c45f3f052f1ade1291732bc92e14e6c741a564ff;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 171683b..272076c 100644 --- a/src/main/java/net/pterodactylus/xdcc/core/Core.java +++ b/src/main/java/net/pterodactylus/xdcc/core/Core.java @@ -18,6 +18,8 @@ package net.pterodactylus.xdcc.core; import static java.lang.String.format; +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; @@ -34,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import net.pterodactylus.irc.Connection; import net.pterodactylus.irc.ConnectionBuilder; @@ -41,6 +44,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; @@ -65,12 +69,12 @@ import net.pterodactylus.xdcc.core.event.GenericMessage; import net.pterodactylus.xdcc.core.event.MessageReceived; import net.pterodactylus.xdcc.data.Bot; import net.pterodactylus.xdcc.data.Channel; +import net.pterodactylus.xdcc.data.ConnectedNetwork; import net.pterodactylus.xdcc.data.Download; 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; @@ -102,6 +106,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; @@ -174,13 +180,25 @@ public class Core extends AbstractExecutionThreadService { * * @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); - } - }))); + public Collection connectedNetworks() { + return networkConnections.entrySet().stream().map((entry) -> { + Network network = entry.getKey(); + Collection bots = networkBots.row(network).values(); + int packCount = bots.stream().mapToInt((bot) -> bot.packs().size()).reduce((a, b) -> a + b).getAsInt(); + return new ConnectedNetwork(network, entry.getValue().hostname(), + entry.getValue().port(), entry.getValue().nickname(), + channels.stream() + .filter((channel) -> channel.network() + .equals(network)) + .map(Channel::name) + .collect(Collectors.toList()), + extraChannels.stream() + .filter((channel) -> channel.network() + .equals(network)) + .map(Channel::name) + .collect(Collectors.toList()), + bots.size(), packCount); + }).collect(Collectors.toList()); } /** @@ -367,6 +385,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()) { @@ -423,6 +446,9 @@ public class Core extends AbstractExecutionThreadService { if (!network.isPresent()) { return; } + if (!connection.established()) { + return; + } /* find all channels that need to be removed. */ for (Collection channels : ImmutableList.of(joinedChannels, extraChannels)) { @@ -532,6 +558,7 @@ 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())); } @@ -544,9 +571,29 @@ public class Core extends AbstractExecutionThreadService { 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 a day.", + channel.get()))); + return; + } + eventBus.post(new GenericMessage( - format("Could not join %s/%s: %s", channelNotJoined.channel(), - network.get(), channelNotJoined.reason()))); + format("Could not join %s: %s", channelNotJoined.channel(), + channelNotJoined.reason()))); } /** @@ -598,9 +645,22 @@ public class Core extends AbstractExecutionThreadService { /* 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/%s by %s: %s", - kickedFromChannel.channel(), network.get(), + "Kicked from %s by %s: %s", + kickedFromChannel.channel(), kickedFromChannel.kicker(), kickedFromChannel.reason().or("") ))); @@ -716,7 +776,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()))); } /**