Newer
Older
yuyuko-bot / src / main / scala / listeners / Reactions.scala
package social.gensokyo.discordbot
package listeners

import ackcord.EventListenerMessage.findCache
import ackcord.requests._
import ackcord.syntax._
import ackcord.data.{ Guild, PartialEmoji, RoleId }
import ackcord.{ APIMessage, DiscordClient, EventsController, TextChannelEventListenerMessage }
import ackcord.requests.{ AddGuildMemberRole, Requests }
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:")
    case _ => None
  }

  val onUserReactAddRole = TextChannelEvent.on[APIMessage.MessageReactionAdd].withRequestOpt { m =>
    m.event.messageId match {
      case id if id.toString == RoleAssign.textId =>
        getEmojiName(m.event.emoji)
          .flatMap { emojiName =>
            RoleAssign.getRole(emojiName).flatMap { roleId =>
              m.event.guild.map { guild =>
                AddGuildMemberRole(guild.id, m.event.userId, RoleId(roleId))
              }
            }
          }
      case _ => None
    }
  }
  val onUserReactRemoveRole = TextChannelEvent.on[APIMessage.MessageReactionRemove].withRequestOpt { m =>
    m.event.messageId match {
      case id if id.toString == RoleAssign.textId =>
        getEmojiName(m.event.emoji)
          .flatMap { emojiName =>
            RoleAssign.getRole(emojiName).flatMap { roleId =>
              m.event.guild.map { guild =>
                RemoveGuildMemberRole(guild.id, m.event.userId, RoleId(roleId))
              }
            }
          }
      case _ => None
    }
  }
}