diff --git a/.gitignore b/.gitignore index 6967f49..33a98e9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ target/ .bsp/ .idea/ +.bloop/ +.metals/ +cs project/target/ local.conf \ No newline at end of file diff --git a/build.sbt b/build.sbt index 4dfd3f2..1c74de0 100644 --- a/build.sbt +++ b/build.sbt @@ -1,18 +1,21 @@ name := "GensocDiscordBot" -version := "0.1" +version := "0.2" -scalaVersion := "2.13.6" +scalaVersion := "2.13.11" idePackagePrefix := Some("social.gensokyo.discordbot") Compile / mainClass := Some("social.gensokyo.discordbot.DiscordBot") resolvers += Resolver.JCenterRepository +resolvers += "dv8tion" at "https://m2.dv8tion.net/releases" +resolvers ++= Resolver.sonatypeOssRepos("snapshots") + libraryDependencies ++= Seq( - "net.katsstuff" %% "ackcord" % "0.17.1" , - "net.katsstuff" %% "ackcord-core" % "0.17.1", - "net.katsstuff" %% "ackcord-commands" % "0.17.1", - "net.katsstuff" %% "ackcord-lavaplayer-core" % "0.17.1", + "net.katsstuff" %% "ackcord" % "0.18.1" , + "net.katsstuff" %% "ackcord-core" % "0.18.1", + "net.katsstuff" %% "ackcord-commands" % "0.18.1", + "net.katsstuff" %% "ackcord-lavaplayer-core" % "0.18.1", "com.typesafe.slick" %% "slick" % "3.3.3", "com.typesafe.slick" %% "slick-hikaricp" % "3.3.3", "org.slf4j" % "slf4j-nop" % "1.7.32" diff --git a/project/build.properties b/project/build.properties index 215ddd2..8fd7d2e 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version = 1.5.5 \ No newline at end of file +sbt.version = 1.9.0 diff --git a/project/plugins.sbt b/project/plugins.sbt index 2cb3f55..d508229 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,3 +1,4 @@ addSbtPlugin("org.jetbrains" % "sbt-ide-settings" % "1.1.0") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.0.0") -addSbtPlugin("org.scalariform" % "sbt-scalariform" % "1.8.3") \ No newline at end of file +addSbtPlugin("org.scalariform" % "sbt-scalariform" % "1.8.3") +addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.6.0") diff --git a/src/main/scala/GensokyoBot.scala b/src/main/scala/GensokyoBot.scala index 8a3a663..77576eb 100644 --- a/src/main/scala/GensokyoBot.scala +++ b/src/main/scala/GensokyoBot.scala @@ -6,17 +6,20 @@ import slick.jdbc.JdbcBackend.Database import scala.concurrent.ExecutionContext.Implicits.global +import social.gensokyo.discordbot.listeners.Messages class GensokyoBot(token: String)(implicit db: Database) { val clientSettings: ClientSettings = ClientSettings(token) clientSettings.createClient().map(client => { client.onEventSideEffectsIgnore { - case APIMessage.Ready(_) => println("Now Ready") + case APIMessage.Ready(_, _, _) => println("Now Ready") case _ => } val reactionListeners = new Reactions(client.requests)(client) + val messageListeners = new Messages(client.requests)(client) client.registerListener(reactionListeners.onUserReactAddRole) client.registerListener(reactionListeners.onUserReactRemoveRole) + client.registerListener(messageListeners.onUserMessage) client.login(); }) } diff --git a/src/main/scala/constants/YuyukoReplies.scala b/src/main/scala/constants/YuyukoReplies.scala new file mode 100644 index 0000000..b171776 --- /dev/null +++ b/src/main/scala/constants/YuyukoReplies.scala @@ -0,0 +1,36 @@ +package social.gensokyo.discordbot +package constants + +object YuyukoReplies { + private val replies: Array[String] = Array( + "Huh?", + "What? Dinner?", + "Mmm, food.", + "What?", + "Dinner!!", + "God I'm so hungry.", + "Dinner, NOW!", + "Do you ever just... think about food?", + "If you're not going to feed me then I suggest you to not bother me again.", + "I want some fried rice", + "I want some ramen noodles", + "I want some shrimp tempira", + "I want some okonomiyaki", + "I want some sushi", + "I want some eggplant tempura", + "I want some miso soup", + "I want some shortcake", + "I want some cheesecake", + "I want some bananas", + "I want Mystia for dinner.", + "I want Kutaka for dinner.", + "I sure would love a milkshake right now", + "Who? Me? No, I'm not really gluttonous. I just like to eat a lot.", + "Hmmm... I wonder what's for dinner", + "If eating food was illegal I wouldn't know what to do... Wait, of course not, I'd just keep eating food.", + "Are you here to feed me? No? Drop dead.", + "Either you feed me, or I'll eat you.") + + def getLine: Option[String] = + replies.lift(scala.util.Random.between(0, replies.length - 1)) +} diff --git a/src/main/scala/listeners/Messages.scala b/src/main/scala/listeners/Messages.scala new file mode 100644 index 0000000..231e0a5 --- /dev/null +++ b/src/main/scala/listeners/Messages.scala @@ -0,0 +1,21 @@ +package social.gensokyo.discordbot +package listeners + +import ackcord.{ APIMessage, DiscordClient, EventListener, EventsController, TextChannelEventListenerMessage } +import ackcord.requests.{ CreateMessage, CreateMessageData, Requests } +import akka.NotUsed +import constants.YuyukoReplies + +class Messages(requests: Requests)(implicit client: DiscordClient) extends EventsController(requests) { + val onUserMessage: EventListener[APIMessage.MessageCreate, NotUsed] = TextChannelEvent.on[APIMessage.MessageCreate].withRequestOpt { m => + m.event.message.content match { + case text if text.toLowerCase().contains("yuyuko") => + YuyukoReplies.getLine.map { line => + CreateMessage(m.channel.id, CreateMessageData( + content = line, + replyTo = Option(m.event.message.id))) + } + case _ => None + } + } +} diff --git a/src/main/scala/listeners/Reactions.scala b/src/main/scala/listeners/Reactions.scala index ad0e23d..149e380 100644 --- a/src/main/scala/listeners/Reactions.scala +++ b/src/main/scala/listeners/Reactions.scala @@ -5,18 +5,19 @@ import ackcord.requests._ import ackcord.syntax._ import ackcord.data.{ Guild, PartialEmoji, RoleId } -import ackcord.{ APIMessage, DiscordClient, EventsController, TextChannelEventListenerMessage } +import ackcord.{ APIMessage, DiscordClient, EventListener, EventsController, TextChannelEventListenerMessage } import ackcord.requests.{ AddGuildMemberRole, Requests } +import akka.NotUsed import social.gensokyo.discordbot.roleassign.RoleAssign class Reactions(requests: Requests)(implicit client: DiscordClient) extends EventsController(requests) { - def getEmojiName(emoji: PartialEmoji): Option[String] = emoji match { - case PartialEmoji(None, emojiName) => emojiName - case PartialEmoji(Some(_), emojiName) => emojiName.map(en => s":$en:") + private def getEmojiName(emoji: PartialEmoji): Option[String] = emoji match { + case PartialEmoji(None, emojiName, None) => emojiName + case PartialEmoji(Some(_), emojiName, None) => emojiName.map(en => s":$en:") case _ => None } - val onUserReactAddRole = TextChannelEvent.on[APIMessage.MessageReactionAdd].withRequestOpt { m => + val onUserReactAddRole: EventListener[APIMessage.MessageReactionAdd, NotUsed] = TextChannelEvent.on[APIMessage.MessageReactionAdd].withRequestOpt { m => m.event.messageId match { case id if id.toString == RoleAssign.textId => getEmojiName(m.event.emoji) @@ -30,7 +31,7 @@ case _ => None } } - val onUserReactRemoveRole = TextChannelEvent.on[APIMessage.MessageReactionRemove].withRequestOpt { m => + val onUserReactRemoveRole: EventListener[APIMessage.MessageReactionRemove, NotUsed] = TextChannelEvent.on[APIMessage.MessageReactionRemove].withRequestOpt { m => m.event.messageId match { case id if id.toString == RoleAssign.textId => getEmojiName(m.event.emoji)