diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.scala b/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.scala index 5994da7..4f3f035 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.scala +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.scala @@ -24,7 +24,7 @@ object DiscordPlayerSender { }).useConstructor(user, channel, player, module)) } -abstract class DiscordPlayerSender(val user: User, val channel: MessageChannel, var player: Player, val module: Nothing) extends DiscordSenderBase(user, channel) with IMCPlayer[DiscordPlayerSender] { +abstract class DiscordPlayerSender(user: User, channel: MessageChannel, var player: Player, val module: Nothing) extends DiscordSenderBase(user, channel) with IMCPlayer[DiscordPlayerSender] { val vanillaCmdListener = new VCMDWrapper(VCMDWrapper.createListener(this, player, module)) override def getVanillaCmdListener: VCMDWrapper = this.vanillaCmdListener diff --git a/src/main/java/buttondevteam/discordplugin/broadcaster/PlayerListWatcher.scala b/src/main/java/buttondevteam/discordplugin/broadcaster/PlayerListWatcher.scala index 7e563d1..55f409c 100644 --- a/src/main/java/buttondevteam/discordplugin/broadcaster/PlayerListWatcher.scala +++ b/src/main/java/buttondevteam/discordplugin/broadcaster/PlayerListWatcher.scala @@ -72,7 +72,7 @@ object PlayerListWatcher { else lookupConstructor = null mock = Mockito.mock(dplc, Mockito.withSettings.defaultAnswer(new Answer[AnyRef]() { // Cannot call super constructor @throws[Throwable] - override def answer(invocation: InvocationOnMock): Any = { + override def answer(invocation: InvocationOnMock): AnyRef = { val method = invocation.getMethod if (!(method.getName == "sendMessage")) { if (method.getName == "sendAll") { diff --git a/src/main/java/buttondevteam/discordplugin/fun/FunModule.scala b/src/main/java/buttondevteam/discordplugin/fun/FunModule.scala index fa95622..0cd0c6c 100644 --- a/src/main/java/buttondevteam/discordplugin/fun/FunModule.scala +++ b/src/main/java/buttondevteam/discordplugin/fun/FunModule.scala @@ -107,7 +107,7 @@ class FunModule extends Component[DiscordPlugin] with Listener { * Answers for a recognized question. Selected randomly. */ final private val serverReadyAnswers: ConfigData[util.ArrayList[String]] = - getConfig.getData("serverReadyAnswers", () => Lists.newArrayList(FunModule.serverReadyStrings): _*) + getConfig.getData("serverReadyAnswers", () => Lists.newArrayList(FunModule.serverReadyStrings: _*)) private def createUsableServerReadyStrings(): Unit = IntStream.range(0, serverReadyAnswers.get.size).forEach((i: Int) => FunModule.usableServerReadyStrings.add(i.toShort)) diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatCustom.scala b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatCustom.scala index a9b4dec..e84b9d9 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatCustom.scala +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatCustom.scala @@ -44,12 +44,14 @@ object MCChatCustom { MCChatUtils.lastmsgfromd.remove(channel.asLong) val count = lastmsgCustom.size lastmsgCustom.filterInPlace(lmd => { - if (lmd.channel.getId.asLong != channel.asLong) return true - lmd.mcchannel match { - case room: ChatRoom => room.leaveRoom(lmd.dcp) - case _ => + if (lmd.channel.getId.asLong != channel.asLong) true + else { + lmd.mcchannel match { + case room: ChatRoom => room.leaveRoom(lmd.dcp) + case _ => + } + false } - false }) lastmsgCustom.size < count } diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.scala b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.scala index 9339529..9b65bb7 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.scala +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.scala @@ -148,13 +148,14 @@ class MCChatListener(val module: MinecraftChatModule) extends Listener { && e.getGroupID() == lmd.groupID) { //Check if this is the group we want to test - #58 if (e.shouldSendTo(lmd.dcp)) { //Check original user's permissions doit(lmd) + true } else { lmd.channel.createMessage("The user no longer has permission to view the channel, connection removed.").subscribe - return false //If the user no longer has permission, remove the connection + false //If the user no longer has permission, remove the connection } } - true + else true }) } } catch { @@ -382,7 +383,7 @@ class MCChatListener(val module: MinecraftChatModule) extends Listener { false } else { - val cmb = ChatMessage.builder(dsender, user, dmessage + getAttachmentText()).fromCommand(false) + val cmb = ChatMessage.builder(dsender, user, dmessage + getAttachmentText).fromCommand(false) if (clmd != null) TBMCChatAPI.SendChatMessage(cmb.permCheck(clmd.dcp).build, clmd.mcchannel) else @@ -415,7 +416,7 @@ class MCChatListener(val module: MinecraftChatModule) extends Listener { val cmd = dmessage.substring(1) val cmdlowercased = cmd.toLowerCase if (dsender.isInstanceOf[DiscordSender] && notWhitelisted(cmdlowercased)) { // Command not whitelisted - dsender.sendMessage("Sorry, you can only access these commands from here:\n" + whitelistedCommands() + + dsender.sendMessage("Sorry, you can only access these commands from here:\n" + whitelistedCommands + (if (user.getConnectedID(classOf[TBMCPlayer]) == null) "\nTo access your commands, first please connect your accounts, using /connect in " + DPUtils.botmention + "\nThen y" else "\nY") + "ou can access all of your regular commands (even offline) in private chat: DM me `mcchat`!") diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.scala b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.scala index 019493f..d285553 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.scala +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatUtils.scala @@ -22,7 +22,7 @@ import reactor.core.scala.publisher.SMono import java.net.InetAddress import java.util -import java.util._ +import java.util.UUID import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.AtomicInteger import java.util.logging.Level @@ -137,12 +137,11 @@ object MCChatUtils { */ def forCustomAndAllMCChat(action: SMono[MessageChannel] => SMono[_], @Nullable toggle: ChannelconBroadcast, hookmsg: Boolean): SMono[_] = { if (notEnabled) return SMono.empty - val list = - List(if (!GeneralEventBroadcasterModule.isHooked || !hookmsg) - forPublicPrivateChat(action) else SMono.empty) ++ - (if (toggle == null) MCChatCustom.lastmsgCustom - else MCChatCustom.lastmsgCustom.filter(cc => (cc.toggles & (1 << toggle.id)) != 0)) - .map(_.channel).map(SMono.just).map(action) + val list = List(if (!GeneralEventBroadcasterModule.isHooked || !hookmsg) + forPublicPrivateChat(action) else SMono.empty) ++ + (if (toggle == null) MCChatCustom.lastmsgCustom + else MCChatCustom.lastmsgCustom.filter(cc => (cc.toggles & (1 << toggle.id)) != 0)) + .map(_.channel).map(SMono.just).map(action) SMono.whenDelayError(list) } diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.scala b/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.scala index d3b2ea3..21377c8 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.scala +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.scala @@ -1,6 +1,6 @@ package buttondevteam.discordplugin.mcchat -import buttondevteam.discordplugin.DPUtils.FluxExtensions +import buttondevteam.discordplugin.DPUtils.{FluxExtensions, MonoExtensions} import buttondevteam.discordplugin._ import buttondevteam.lib.TBMCSystemChatEvent import buttondevteam.lib.player.{TBMCPlayer, TBMCPlayerBase, TBMCYEEHAWEvent} @@ -15,8 +15,7 @@ import org.bukkit.event.player.PlayerLoginEvent.Result import org.bukkit.event.player._ import org.bukkit.event.server.{BroadcastMessageEvent, TabCompleteEvent} import org.bukkit.event.{EventHandler, EventPriority, Listener} -import reactor.core.publisher.Flux -import reactor.core.scala.publisher.SMono +import reactor.core.scala.publisher.{SFlux, SMono} class MCListener(val module: MinecraftChatModule) extends Listener { final private val muteRole = DPUtils.roleData(module.getConfig, "muteRole", "Muted") @@ -35,8 +34,8 @@ class MCListener(val module: MinecraftChatModule) extends Listener { val p = e.getPlayer val dp = TBMCPlayerBase.getPlayer(p.getUniqueId, classOf[TBMCPlayer]).getAs(classOf[DiscordPlayer]) if (dp != null) - DiscordPlugin.dc.getUserById(Snowflake.of(dp.getDiscordID)).flatMap(user => - user.getPrivateChannel.flatMap(chan => module.chatChannelMono.flatMap(cc => { + DiscordPlugin.dc.getUserById(Snowflake.of(dp.getDiscordID)).^^().flatMap(user => + user.getPrivateChannel.^^().flatMap(chan => module.chatChannelMono.flatMap(cc => { MCChatUtils.addSender(MCChatUtils.OnlineSenders, dp.getDiscordID, DiscordPlayerSender.create(user, chan, p, module)) MCChatUtils.addSender(MCChatUtils.OnlineSenders, dp.getDiscordID, DiscordPlayerSender.create(user, cc, p, module)) //Stored per-channel SMono.empty @@ -130,8 +129,8 @@ class MCListener(val module: MinecraftChatModule) extends Listener { val t = event.getBuffer.substring(i + 1) //0 if not found if (!t.startsWith("@")) return val token = t.substring(1) - val x = DiscordPlugin.mainServer.getMembers.flatMap((m) => Flux.just(m.getUsername, m.getNickname.orElse(""))) - .filter((s) => s.startsWith(token)).map((s) => "@" + s).doOnNext(event.getCompletions.add(_)).blockLast + val x = DiscordPlugin.mainServer.getMembers.^^().flatMap(m => SFlux.just(m.getUsername, m.getNickname.orElse(""))) + .filter(_.startsWith(token)).map("@" + _).doOnNext(event.getCompletions.add(_)).blockLast() } @EventHandler def onCommandSend(event: PlayerCommandSendEvent): Boolean = event.getCommands.add("g") diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.scala b/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.scala index ea51472..121130a 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.scala +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.scala @@ -129,6 +129,7 @@ class MinecraftChatModule extends Component[DiscordPlugin] { UUID.fromString(chcon.getString("mcuid")), chcon.getString("mcname"), this) MCChatCustom.addCustomChat(ch.asInstanceOf[MessageChannel], groupid, mcch.get, user, dcp, toggles, brtoggles.asScala.map(TBMCSystemChatEvent.BroadcastTarget.get).filter(Objects.nonNull).toSet) + () }) } } diff --git a/src/main/java/buttondevteam/discordplugin/role/GameRoleModule.scala b/src/main/java/buttondevteam/discordplugin/role/GameRoleModule.scala index 95648ec..25e7e61 100644 --- a/src/main/java/buttondevteam/discordplugin/role/GameRoleModule.scala +++ b/src/main/java/buttondevteam/discordplugin/role/GameRoleModule.scala @@ -1,6 +1,7 @@ package buttondevteam.discordplugin.role import buttondevteam.core.ComponentManager +import buttondevteam.discordplugin.DPUtils.{FluxExtensions, MonoExtensions} import buttondevteam.discordplugin.{DPUtils, DiscordPlugin} import buttondevteam.lib.architecture.{Component, ComponentMetadata} import discord4j.core.`object`.entity.Role @@ -8,10 +9,10 @@ import discord4j.core.`object`.entity.channel.MessageChannel import discord4j.core.event.domain.role.{RoleCreateEvent, RoleDeleteEvent, RoleEvent, RoleUpdateEvent} import discord4j.rest.util.Color import org.bukkit.Bukkit -import reactor.core.publisher.Mono +import reactor.core.scala.publisher.SMono import java.util.Collections -import java.util.stream.Collectors +import scala.jdk.CollectionConverters.SeqHasAsJava /** * Automatically collects roles with a certain color. @@ -23,31 +24,31 @@ import java.util.stream.Collectors if (grm == null) return val GameRoles = grm.GameRoles val logChannel = grm.logChannel.get - val notMainServer = (r: Role) => r.getGuildId.asLong != DiscordPlugin.mainServer.getId.asLong + val notMainServer = (_: Role).getGuildId.asLong != DiscordPlugin.mainServer.getId.asLong roleEvent match { case roleCreateEvent: RoleCreateEvent => Bukkit.getScheduler.runTaskLaterAsynchronously(DiscordPlugin.plugin, () => { - def foo(): Unit = { - val role = roleCreateEvent.getRole - if (notMainServer(role)) return - grm.isGameRole(role).flatMap((b: Boolean) => { - def foo(b: Boolean): Mono[_] = { - if (!b) return Mono.empty //Deleted or not a game role + val role = roleCreateEvent.getRole + if (!notMainServer(role)) { + grm.isGameRole(role).flatMap(b => { + if (!b) SMono.empty //Deleted or not a game role + else { GameRoles.add(role.getName) - if (logChannel != null) return logChannel.flatMap((ch: MessageChannel) => ch.createMessage("Added " + role.getName + " as game role. If you don't want this, change the role's color from the game role color.")) - Mono.empty + if (logChannel != null) + logChannel.flatMap(_.createMessage("Added " + role.getName + " as game role." + + " If you don't want this, change the role's color from the game role color.").^^()) + else + SMono.empty } - - foo(b) }).subscribe + () } - - foo() }, 100) case roleDeleteEvent: RoleDeleteEvent => val role = roleDeleteEvent.getRole.orElse(null) if (role == null) return if (notMainServer(role)) return - if (GameRoles.remove(role.getName) && logChannel != null) logChannel.flatMap((ch: MessageChannel) => ch.createMessage("Removed " + role.getName + " as a game role.")).subscribe + if (GameRoles.remove(role.getName) && logChannel != null) + logChannel.flatMap(_.createMessage("Removed " + role.getName + " as a game role.").^^()).subscribe case roleUpdateEvent: RoleUpdateEvent => if (!roleUpdateEvent.getOld.isPresent) { grm.logWarn("Old role not stored, cannot update game role!") @@ -56,20 +57,25 @@ import java.util.stream.Collectors val or = roleUpdateEvent.getOld.get if (notMainServer(or)) return val cr = roleUpdateEvent.getCurrent - grm.isGameRole(cr).flatMap((b: Boolean) => { - def foo(b: Boolean): Mono[_] = { - if (!b) if (GameRoles.remove(or.getName) && logChannel != null) return logChannel.flatMap((ch: MessageChannel) => ch.createMessage("Removed " + or.getName + " as a game role because its color changed.")) - else { - if (GameRoles.contains(or.getName) && or.getName == cr.getName) return Mono.empty - val removed = GameRoles.remove(or.getName) //Regardless of whether it was a game role - GameRoles.add(cr.getName) //Add it because it has no color - if (logChannel != null) if (removed) return logChannel.flatMap((ch: MessageChannel) => ch.createMessage("Changed game role from " + or.getName + " to " + cr.getName + ".")) - else return logChannel.flatMap((ch: MessageChannel) => ch.createMessage("Added " + cr.getName + " as game role because it has the color of one.")) - } - Mono.empty + grm.isGameRole(cr).flatMap(isGameRole => { + if (!isGameRole) + if (GameRoles.remove(or.getName) && logChannel != null) + logChannel.flatMap(_.createMessage("Removed " + or.getName + " as a game role because its color changed.").^^()) + else + SMono.empty + else if (GameRoles.contains(or.getName) && or.getName == cr.getName) + SMono.empty + else { + val removed = GameRoles.remove(or.getName) //Regardless of whether it was a game role + GameRoles.add(cr.getName) //Add it because it has no color + if (logChannel != null) + if (removed) + logChannel.flatMap((ch: MessageChannel) => ch.createMessage("Changed game role from " + or.getName + " to " + cr.getName + ".").^^()) + else + logChannel.flatMap((ch: MessageChannel) => ch.createMessage("Added " + cr.getName + " as game role because it has the color of one.").^^()) + else + SMono.empty } - - foo(b) }).subscribe case _ => } @@ -82,7 +88,7 @@ import java.util.stream.Collectors override protected def enable(): Unit = { getPlugin.manager.registerCommand(command) - GameRoles = DiscordPlugin.mainServer.getRoles.filterWhen(this.isGameRole _).map(_.getName).collect(Collectors.toList).block + GameRoles = DiscordPlugin.mainServer.getRoles.^^().filterWhen(this.isGameRole).map(_.getName).collectSeq().block().asJava } override protected def disable(): Unit = getPlugin.manager.unregisterCommand(command) @@ -97,11 +103,12 @@ import java.util.stream.Collectors */ final private val roleColor = getConfig.getConfig[Color]("roleColor").`def`(Color.of(149, 165, 166)).getter((rgb: Any) => Color.of(Integer.parseInt(rgb.asInstanceOf[String].substring(1), 16))).setter((color: Color) => String.format("#%08x", color.getRGB)).buildReadOnly - private def isGameRole(r: Role): Mono[Boolean] = { - if (r.getGuildId.asLong != DiscordPlugin.mainServer.getId.asLong) return Mono.just(false) //Only allow on the main server + private def isGameRole(r: Role): SMono[Boolean] = { + if (r.getGuildId.asLong != DiscordPlugin.mainServer.getId.asLong) return SMono.just(false) //Only allow on the main server val rc = roleColor.get if (r.getColor equals rc) - DiscordPlugin.dc.getSelf.flatMap((u) => u.asMember(DiscordPlugin.mainServer.getId)).flatMap((m) => m.hasHigherRoles(Collections.singleton(r.getId))).defaultIfEmpty(false) //Below one of our roles - else Mono.just(false) + DiscordPlugin.dc.getSelf.flatMap(u => u.asMember(DiscordPlugin.mainServer.getId)).^^() + .flatMap(_.hasHigherRoles(Collections.singleton(r.getId)).^^().asInstanceOf).defaultIfEmpty(false) //Below one of our roles + else SMono.just(false) } } \ No newline at end of file