more typed actors

This commit is contained in:
Evgenii Alekseev 2022-01-19 12:19:55 +03:00
parent dc882b74bf
commit fee87ddbc8
5 changed files with 112 additions and 100 deletions

View File

@ -8,30 +8,32 @@
*/ */
package me.arcanis.ffxivbis.service.database.impl package me.arcanis.ffxivbis.service.database.impl
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors import akka.actor.typed.scaladsl.Behaviors
import me.arcanis.ffxivbis.messages._ import me.arcanis.ffxivbis.messages._
import me.arcanis.ffxivbis.service.database.Database import me.arcanis.ffxivbis.service.database.Database
trait DatabaseBiSHandler { this: Database => trait DatabaseBiSHandler { this: Database =>
def bisHandler: DatabaseMessage.Handler = { def bisHandler(msg: BisDatabaseMessage): Behavior[DatabaseMessage] =
case AddPieceToBis(playerId, piece, client) => msg match {
run(profile.insertPieceBiS(playerId, piece))(_ => client ! ()) case AddPieceToBis(playerId, piece, client) =>
Behaviors.same run(profile.insertPieceBiS(playerId, piece))(_ => client ! ())
Behaviors.same
case GetBiS(partyId, maybePlayerId, client) => case GetBiS(partyId, maybePlayerId, client) =>
run { run {
getParty(partyId, withBiS = true, withLoot = false) getParty(partyId, withBiS = true, withLoot = false)
.map(filterParty(_, maybePlayerId)) .map(filterParty(_, maybePlayerId))
}(client ! _) }(client ! _)
Behaviors.same Behaviors.same
case RemovePieceFromBiS(playerId, piece, client) => case RemovePieceFromBiS(playerId, piece, client) =>
run(profile.deletePieceBiS(playerId, piece))(_ => client ! ()) run(profile.deletePieceBiS(playerId, piece))(_ => client ! ())
Behaviors.same Behaviors.same
case RemovePiecesFromBiS(playerId, client) => case RemovePiecesFromBiS(playerId, client) =>
run(profile.deletePiecesBiS(playerId))(_ => client ! ()) run(profile.deletePiecesBiS(playerId))(_ => client ! ())
Behaviors.same Behaviors.same
} }
} }

View File

@ -11,7 +11,7 @@ package me.arcanis.ffxivbis.service.database.impl
import akka.actor.typed.scaladsl.{AbstractBehavior, ActorContext} import akka.actor.typed.scaladsl.{AbstractBehavior, ActorContext}
import akka.actor.typed.{Behavior, DispatcherSelector} import akka.actor.typed.{Behavior, DispatcherSelector}
import com.typesafe.config.Config import com.typesafe.config.Config
import me.arcanis.ffxivbis.messages.DatabaseMessage import me.arcanis.ffxivbis.messages.{BisDatabaseMessage, DatabaseMessage, LootDatabaseMessage, PartyDatabaseMessage, UserDatabaseMessage}
import me.arcanis.ffxivbis.service.database.Database import me.arcanis.ffxivbis.service.database.Database
import me.arcanis.ffxivbis.storage.DatabaseProfile import me.arcanis.ffxivbis.storage.DatabaseProfile
@ -32,8 +32,12 @@ class DatabaseImpl(context: ActorContext[DatabaseMessage])
override val config: Config = context.system.settings.config override val config: Config = context.system.settings.config
override val profile: DatabaseProfile = new DatabaseProfile(executionContext, config) override val profile: DatabaseProfile = new DatabaseProfile(executionContext, config)
override def onMessage(msg: DatabaseMessage): Behavior[DatabaseMessage] = handle(msg) override def onMessage(msg: DatabaseMessage): Behavior[DatabaseMessage] =
msg match {
case msg: BisDatabaseMessage => bisHandler(msg)
case msg: LootDatabaseMessage => lootHandler(msg)
case msg: PartyDatabaseMessage => partyHandler(msg)
case msg: UserDatabaseMessage => userHandler(msg)
}
private def handle: DatabaseMessage.Handler =
bisHandler.orElse(lootHandler).orElse(partyHandler).orElse(userHandler)
} }

View File

@ -8,6 +8,7 @@
*/ */
package me.arcanis.ffxivbis.service.database.impl package me.arcanis.ffxivbis.service.database.impl
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors import akka.actor.typed.scaladsl.Behaviors
import me.arcanis.ffxivbis.messages._ import me.arcanis.ffxivbis.messages._
import me.arcanis.ffxivbis.models.Loot import me.arcanis.ffxivbis.models.Loot
@ -17,28 +18,29 @@ import java.time.Instant
trait DatabaseLootHandler { this: Database => trait DatabaseLootHandler { this: Database =>
def lootHandler: DatabaseMessage.Handler = { def lootHandler(msg: LootDatabaseMessage): Behavior[DatabaseMessage] =
case AddPieceTo(playerId, piece, isFreeLoot, client) => msg match {
val loot = Loot(-1, piece, Instant.now, isFreeLoot) case AddPieceTo(playerId, piece, isFreeLoot, client) =>
run(profile.insertPiece(playerId, loot))(_ => client ! ()) val loot = Loot(-1, piece, Instant.now, isFreeLoot)
Behaviors.same run(profile.insertPiece(playerId, loot))(_ => client ! ())
Behaviors.same
case GetLoot(partyId, maybePlayerId, client) => case GetLoot(partyId, maybePlayerId, client) =>
run { run {
getParty(partyId, withBiS = false, withLoot = true) getParty(partyId, withBiS = false, withLoot = true)
.map(filterParty(_, maybePlayerId)) .map(filterParty(_, maybePlayerId))
}(client ! _) }(client ! _)
Behaviors.same Behaviors.same
case RemovePieceFrom(playerId, piece, isFreeLoot, client) => case RemovePieceFrom(playerId, piece, isFreeLoot, client) =>
run(profile.deletePiece(playerId, piece, isFreeLoot))(_ => client ! ()) run(profile.deletePiece(playerId, piece, isFreeLoot))(_ => client ! ())
Behaviors.same Behaviors.same
case SuggestLoot(partyId, piece, client) => case SuggestLoot(partyId, piece, client) =>
run { run {
getParty(partyId, withBiS = true, withLoot = true) getParty(partyId, withBiS = true, withLoot = true)
.map(_.suggestLoot(piece)) .map(_.suggestLoot(piece))
}(client ! _) }(client ! _)
Behaviors.same Behaviors.same
} }
} }

View File

@ -8,6 +8,7 @@
*/ */
package me.arcanis.ffxivbis.service.database.impl package me.arcanis.ffxivbis.service.database.impl
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors import akka.actor.typed.scaladsl.Behaviors
import me.arcanis.ffxivbis.messages._ import me.arcanis.ffxivbis.messages._
import me.arcanis.ffxivbis.models.{BiS, Player} import me.arcanis.ffxivbis.models.{BiS, Player}
@ -17,50 +18,51 @@ import scala.concurrent.Future
trait DatabasePartyHandler { this: Database => trait DatabasePartyHandler { this: Database =>
def partyHandler: DatabaseMessage.Handler = { def partyHandler(msg: PartyDatabaseMessage): Behavior[DatabaseMessage] =
case AddPlayer(player, client) => msg match {
run(profile.insertPlayer(player))(_ => client ! ()) case AddPlayer(player, client) =>
Behaviors.same run(profile.insertPlayer(player))(_ => client ! ())
Behaviors.same
case GetParty(partyId, client) => case GetParty(partyId, client) =>
run(getParty(partyId, withBiS = true, withLoot = true))(client ! _) run(getParty(partyId, withBiS = true, withLoot = true))(client ! _)
Behaviors.same Behaviors.same
case GetPartyDescription(partyId, client) => case GetPartyDescription(partyId, client) =>
run(profile.getPartyDescription(partyId))(client ! _) run(profile.getPartyDescription(partyId))(client ! _)
Behaviors.same Behaviors.same
case GetPlayer(playerId, client) => case GetPlayer(playerId, client) =>
run { run {
profile profile
.getPlayerFull(playerId) .getPlayerFull(playerId)
.flatMap { maybePlayerData => .flatMap { maybePlayerData =>
Future.traverse(maybePlayerData.toSeq) { playerData => Future.traverse(maybePlayerData.toSeq) { playerData =>
for { for {
bis <- profile.getPiecesBiS(playerId) bis <- profile.getPiecesBiS(playerId)
loot <- profile.getPieces(playerId) loot <- profile.getPieces(playerId)
} yield Player( } yield Player(
playerData.id, playerData.id,
playerId.partyId, playerId.partyId,
playerId.job, playerId.job,
playerId.nick, playerId.nick,
BiS(bis.map(_.piece)), BiS(bis.map(_.piece)),
loot, loot,
playerData.link, playerData.link,
playerData.priority playerData.priority
) )
}
} }
} .map(_.headOption)
.map(_.headOption) }(client ! _)
}(client ! _) Behaviors.same
Behaviors.same
case RemovePlayer(playerId, client) => case RemovePlayer(playerId, client) =>
run(profile.deletePlayer(playerId))(_ => client ! ()) run(profile.deletePlayer(playerId))(_ => client ! ())
Behaviors.same Behaviors.same
case UpdateParty(description, client) => case UpdateParty(description, client) =>
run(profile.insertPartyDescription(description))(_ => client ! ()) run(profile.insertPartyDescription(description))(_ => client ! ())
Behaviors.same Behaviors.same
} }
} }

View File

@ -8,32 +8,34 @@
*/ */
package me.arcanis.ffxivbis.service.database.impl package me.arcanis.ffxivbis.service.database.impl
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors import akka.actor.typed.scaladsl.Behaviors
import me.arcanis.ffxivbis.messages._ import me.arcanis.ffxivbis.messages._
import me.arcanis.ffxivbis.service.database.Database import me.arcanis.ffxivbis.service.database.Database
trait DatabaseUserHandler { this: Database => trait DatabaseUserHandler { this: Database =>
def userHandler: DatabaseMessage.Handler = { def userHandler(msg: UserDatabaseMessage): Behavior[DatabaseMessage] =
case AddUser(user, isHashedPassword, client) => msg match {
val toInsert = if (isHashedPassword) user else user.withHashedPassword case AddUser(user, isHashedPassword, client) =>
run(profile.insertUser(toInsert))(_ => client ! ()) val toInsert = if (isHashedPassword) user else user.withHashedPassword
Behaviors.same run(profile.insertUser(toInsert))(_ => client ! ())
Behaviors.same
case DeleteUser(partyId, username, client) => case DeleteUser(partyId, username, client) =>
run(profile.deleteUser(partyId, username))(_ => client ! ()) run(profile.deleteUser(partyId, username))(_ => client ! ())
Behaviors.same Behaviors.same
case Exists(partyId, client) => case Exists(partyId, client) =>
run(profile.exists(partyId))(client ! _) run(profile.exists(partyId))(client ! _)
Behaviors.same Behaviors.same
case GetUser(partyId, username, client) => case GetUser(partyId, username, client) =>
run(profile.getUser(partyId, username))(client ! _) run(profile.getUser(partyId, username))(client ! _)
Behaviors.same Behaviors.same
case GetUsers(partyId, client) => case GetUsers(partyId, client) =>
run(profile.getUsers(partyId))(client ! _) run(profile.getUsers(partyId))(client ! _)
Behaviors.same Behaviors.same
} }
} }