some improvements in loot system

This commit is contained in:
Evgenii Alekseev 2019-11-04 15:19:18 +03:00
parent 0a71a98482
commit 6e8b64feef
22 changed files with 61 additions and 47 deletions

View File

@ -0,0 +1,5 @@
update loot set piece = 'left ring' where piece = 'leftRing';
update loot set piece = 'right ring' where piece = 'rightRing';
update bis set piece = 'left ring' where piece = 'leftRing';
update bis set piece = 'right ring' where piece = 'rightRing';

View File

@ -0,0 +1,5 @@
update loot set piece = 'left ring' where piece = 'leftRing';
update loot set piece = 'right ring' where piece = 'rightRing';
update bis set piece = 'left ring' where piece = 'leftRing';
update bis set piece = 'right ring' where piece = 'rightRing';

View File

@ -13,12 +13,12 @@ import akka.http.scaladsl.Http
import akka.stream.ActorMaterializer import akka.stream.ActorMaterializer
import com.typesafe.scalalogging.StrictLogging import com.typesafe.scalalogging.StrictLogging
import me.arcanis.ffxivbis.http.RootEndpoint import me.arcanis.ffxivbis.http.RootEndpoint
import me.arcanis.ffxivbis.service.{Ariyala, PartyService}
import me.arcanis.ffxivbis.service.impl.DatabaseImpl import me.arcanis.ffxivbis.service.impl.DatabaseImpl
import me.arcanis.ffxivbis.service.{Ariyala, PartyService}
import me.arcanis.ffxivbis.storage.Migration import me.arcanis.ffxivbis.storage.Migration
import scala.concurrent.{Await, ExecutionContext}
import scala.concurrent.duration.Duration import scala.concurrent.duration.Duration
import scala.concurrent.{Await, ExecutionContext}
import scala.util.{Failure, Success} import scala.util.{Failure, Success}
class Application extends Actor with StrictLogging { class Application extends Actor with StrictLogging {

View File

@ -11,7 +11,7 @@ package me.arcanis.ffxivbis.http
import akka.actor.ActorRef import akka.actor.ActorRef
import akka.pattern.ask import akka.pattern.ask
import akka.util.Timeout import akka.util.Timeout
import me.arcanis.ffxivbis.models.{BiS, Job, Piece} import me.arcanis.ffxivbis.models.{BiS, Job}
import me.arcanis.ffxivbis.service.Ariyala import me.arcanis.ffxivbis.service.Ariyala
import scala.concurrent.{ExecutionContext, Future} import scala.concurrent.{ExecutionContext, Future}

View File

@ -11,8 +11,8 @@ package me.arcanis.ffxivbis.http
import akka.actor.ActorRef import akka.actor.ActorRef
import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.model.headers._
import akka.http.scaladsl.server.AuthenticationFailedRejection._ import akka.http.scaladsl.server.AuthenticationFailedRejection._
import akka.http.scaladsl.server._
import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server._
import akka.pattern.ask import akka.pattern.ask
import akka.util.Timeout import akka.util.Timeout
import me.arcanis.ffxivbis.models.{Permission, User} import me.arcanis.ffxivbis.models.{Permission, User}

View File

@ -13,16 +13,15 @@ import akka.http.scaladsl.model.{HttpEntity, StatusCodes}
import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server._ import akka.http.scaladsl.server._
import akka.util.Timeout import akka.util.Timeout
import com.typesafe.scalalogging.StrictLogging
import io.swagger.v3.oas.annotations.enums.ParameterIn import io.swagger.v3.oas.annotations.enums.ParameterIn
import io.swagger.v3.oas.annotations.media.{ArraySchema, Content, Schema} import io.swagger.v3.oas.annotations.media.{ArraySchema, Content, Schema}
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.{Operation, Parameter}
import io.swagger.v3.oas.annotations.parameters.RequestBody import io.swagger.v3.oas.annotations.parameters.RequestBody
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.security.SecurityRequirement import io.swagger.v3.oas.annotations.security.SecurityRequirement
import javax.ws.rs.{Consumes, GET, POST, PUT, Path, Produces} import io.swagger.v3.oas.annotations.{Operation, Parameter}
import me.arcanis.ffxivbis.http.{Authorization, BiSHelper} import javax.ws.rs._
import me.arcanis.ffxivbis.http.api.v1.json._ import me.arcanis.ffxivbis.http.api.v1.json._
import me.arcanis.ffxivbis.http.{Authorization, BiSHelper}
import me.arcanis.ffxivbis.models.PlayerId import me.arcanis.ffxivbis.models.PlayerId
import scala.util.{Failure, Success} import scala.util.{Failure, Success}

View File

@ -15,13 +15,13 @@ import akka.http.scaladsl.server._
import akka.util.Timeout import akka.util.Timeout
import io.swagger.v3.oas.annotations.enums.ParameterIn import io.swagger.v3.oas.annotations.enums.ParameterIn
import io.swagger.v3.oas.annotations.media.{ArraySchema, Content, Schema} import io.swagger.v3.oas.annotations.media.{ArraySchema, Content, Schema}
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.{Operation, Parameter}
import io.swagger.v3.oas.annotations.parameters.RequestBody import io.swagger.v3.oas.annotations.parameters.RequestBody
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.security.SecurityRequirement import io.swagger.v3.oas.annotations.security.SecurityRequirement
import javax.ws.rs.{Consumes, GET, POST, PUT, Path, Produces} import io.swagger.v3.oas.annotations.{Operation, Parameter}
import me.arcanis.ffxivbis.http.{Authorization, LootHelper} import javax.ws.rs._
import me.arcanis.ffxivbis.http.api.v1.json._ import me.arcanis.ffxivbis.http.api.v1.json._
import me.arcanis.ffxivbis.http.{Authorization, LootHelper}
import me.arcanis.ffxivbis.models.PlayerId import me.arcanis.ffxivbis.models.PlayerId
import scala.util.{Failure, Success} import scala.util.{Failure, Success}

View File

@ -15,13 +15,13 @@ import akka.http.scaladsl.server._
import akka.util.Timeout import akka.util.Timeout
import io.swagger.v3.oas.annotations.enums.ParameterIn import io.swagger.v3.oas.annotations.enums.ParameterIn
import io.swagger.v3.oas.annotations.media.{ArraySchema, Content, Schema} import io.swagger.v3.oas.annotations.media.{ArraySchema, Content, Schema}
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.{Operation, Parameter}
import io.swagger.v3.oas.annotations.parameters.RequestBody import io.swagger.v3.oas.annotations.parameters.RequestBody
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.security.SecurityRequirement import io.swagger.v3.oas.annotations.security.SecurityRequirement
import javax.ws.rs.{Consumes, GET, POST, Path, Produces} import io.swagger.v3.oas.annotations.{Operation, Parameter}
import me.arcanis.ffxivbis.http.{Authorization, PlayerHelper} import javax.ws.rs._
import me.arcanis.ffxivbis.http.api.v1.json._ import me.arcanis.ffxivbis.http.api.v1.json._
import me.arcanis.ffxivbis.http.{Authorization, PlayerHelper}
import me.arcanis.ffxivbis.models.PlayerId import me.arcanis.ffxivbis.models.PlayerId
import scala.util.{Failure, Success} import scala.util.{Failure, Success}

View File

@ -15,13 +15,13 @@ import akka.http.scaladsl.server._
import akka.util.Timeout import akka.util.Timeout
import io.swagger.v3.oas.annotations.enums.ParameterIn import io.swagger.v3.oas.annotations.enums.ParameterIn
import io.swagger.v3.oas.annotations.media.{ArraySchema, Content, Schema} import io.swagger.v3.oas.annotations.media.{ArraySchema, Content, Schema}
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.{Operation, Parameter}
import io.swagger.v3.oas.annotations.parameters.RequestBody import io.swagger.v3.oas.annotations.parameters.RequestBody
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.security.SecurityRequirement import io.swagger.v3.oas.annotations.security.SecurityRequirement
import javax.ws.rs.{Consumes, DELETE, GET, POST, PUT, Path, Produces} import io.swagger.v3.oas.annotations.{Operation, Parameter}
import me.arcanis.ffxivbis.http.{Authorization, UserHelper} import javax.ws.rs._
import me.arcanis.ffxivbis.http.api.v1.json._ import me.arcanis.ffxivbis.http.api.v1.json._
import me.arcanis.ffxivbis.http.{Authorization, UserHelper}
import me.arcanis.ffxivbis.models.Permission import me.arcanis.ffxivbis.models.Permission
import scala.util.{Failure, Success} import scala.util.{Failure, Success}

View File

@ -37,6 +37,7 @@ class BasePartyView(override val storage: ActorRef)(implicit timeout: Timeout)
object BasePartyView { object BasePartyView {
import scalatags.Text import scalatags.Text
import scalatags.Text.all._ import scalatags.Text.all._
import scalatags.Text.tags2.{title => titleTag}
def root(partyId: String): Text.TypedTag[String] = def root(partyId: String): Text.TypedTag[String] =
a(href:=s"/party/$partyId", title:="root")("root") a(href:=s"/party/$partyId", title:="root")("root")
@ -45,7 +46,7 @@ object BasePartyView {
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" +
html(lang:="en", html(lang:="en",
head( head(
title:=s"Party $partyId", titleTag(s"Party $partyId"),
link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css") link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css")
), ),

View File

@ -86,12 +86,13 @@ class BiSView(override val storage: ActorRef, ariyala: ActorRef)(implicit timeou
object BiSView { object BiSView {
import scalatags.Text.all._ import scalatags.Text.all._
import scalatags.Text.tags2.{title => titleTag}
def template(partyId: String, party: Seq[Player], error: Option[String]): String = def template(partyId: String, party: Seq[Player], error: Option[String]): String =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" +
html(lang:="en", html(lang:="en",
head( head(
title:="Best in slot", titleTag("Best in slot"),
link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css") link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css")
), ),

View File

@ -14,7 +14,7 @@ import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server._ import akka.http.scaladsl.server._
import akka.util.Timeout import akka.util.Timeout
import me.arcanis.ffxivbis.http.UserHelper import me.arcanis.ffxivbis.http.UserHelper
import me.arcanis.ffxivbis.models.{Party, Permission, User} import me.arcanis.ffxivbis.models.{Permission, User}
import scala.util.{Failure, Success} import scala.util.{Failure, Success}
@ -54,12 +54,13 @@ class IndexView(storage: ActorRef)(implicit timeout: Timeout)
object IndexView { object IndexView {
import scalatags.Text.all._ import scalatags.Text.all._
import scalatags.Text.tags2.{title => titleTag}
def template: String = def template: String =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" +
html( html(
head( head(
title:="FFXIV loot helper", titleTag("FFXIV loot helper"),
link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css") link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css")
), ),

View File

@ -71,12 +71,13 @@ class LootSuggestView(override val storage: ActorRef)(implicit timeout: Timeout)
object LootSuggestView { object LootSuggestView {
import scalatags.Text.all._ import scalatags.Text.all._
import scalatags.Text.tags2.{title => titleTag}
def template(partyId: String, party: Seq[PlayerIdWithCounters], piece: Option[Piece], error: Option[String]): String = def template(partyId: String, party: Seq[PlayerIdWithCounters], piece: Option[Piece], error: Option[String]): String =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" +
html(lang:="en", html(lang:="en",
head( head(
title:="Suggest loot", titleTag("Suggest loot"),
link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css") link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css")
), ),

View File

@ -79,12 +79,13 @@ class LootView (override val storage: ActorRef)(implicit timeout: Timeout)
object LootView { object LootView {
import scalatags.Text.all._ import scalatags.Text.all._
import scalatags.Text.tags2.{title => titleTag}
def template(partyId: String, party: Seq[Player], error: Option[String]): String = def template(partyId: String, party: Seq[Player], error: Option[String]): String =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" +
html(lang:="en", html(lang:="en",
head( head(
title:="Loot", titleTag("Loot"),
link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css") link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css")
), ),

View File

@ -14,7 +14,7 @@ import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server.Route import akka.http.scaladsl.server.Route
import akka.util.Timeout import akka.util.Timeout
import me.arcanis.ffxivbis.http.{Authorization, PlayerHelper} import me.arcanis.ffxivbis.http.{Authorization, PlayerHelper}
import me.arcanis.ffxivbis.models.{BiS, Job, Player, PlayerId, PlayerIdWithCounters} import me.arcanis.ffxivbis.models._
import scala.concurrent.{ExecutionContext, Future} import scala.concurrent.{ExecutionContext, Future}
@ -74,12 +74,13 @@ class PlayerView(override val storage: ActorRef, ariyala: ActorRef)(implicit tim
object PlayerView { object PlayerView {
import scalatags.Text.all._ import scalatags.Text.all._
import scalatags.Text.tags2.{title => titleTag}
def template(partyId: String, party: Seq[PlayerIdWithCounters], error: Option[String]): String = def template(partyId: String, party: Seq[PlayerIdWithCounters], error: Option[String]): String =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" +
html(lang:="en", html(lang:="en",
head( head(
title:="Party", titleTag("Party"),
link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css") link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css")
), ),

View File

@ -77,12 +77,13 @@ class UserView(override val storage: ActorRef)(implicit timeout: Timeout)
object UserView { object UserView {
import scalatags.Text.all._ import scalatags.Text.all._
import scalatags.Text.tags2.{title => titleTag}
def template(partyId: String, users: Seq[User], error: Option[String]) = def template(partyId: String, users: Seq[User], error: Option[String]) =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" +
html(lang:="en", html(lang:="en",
head( head(
title:="Users", titleTag("Users"),
link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css") link(rel:="stylesheet", `type`:="text/css", href:="/static/styles.css")
), ),

View File

@ -50,8 +50,8 @@ case class BiS(weapon: Option[Piece],
"ears" -> ears, "ears" -> ears,
"neck" -> neck, "neck" -> neck,
"wrist" -> wrist, "wrist" -> wrist,
"leftRing" -> leftRing, "left ring" -> leftRing,
"rightRing" -> rightRing "right ring" -> rightRing
) + (name -> piece) ) + (name -> piece)
BiS(params) BiS(params)
} }
@ -70,8 +70,8 @@ object BiS {
data.get("ears").flatten, data.get("ears").flatten,
data.get("neck").flatten, data.get("neck").flatten,
data.get("wrist").flatten, data.get("wrist").flatten,
data.get("leftRing").flatten, data.get("left ring").flatten,
data.get("rightRing").flatten) data.get("right ring").flatten)
def apply(): BiS = BiS(Seq.empty) def apply(): BiS = BiS(Seq.empty)

View File

@ -108,9 +108,7 @@ object Piece {
case "ears" => Ears(isTome, job) case "ears" => Ears(isTome, job)
case "neck" => Neck(isTome, job) case "neck" => Neck(isTome, job)
case "wrist" => Wrist(isTome, job) case "wrist" => Wrist(isTome, job)
case "ring" => Ring(isTome, job) case ring @ ("ring" | "left ring" | "right ring") => Ring(isTome, job, ring)
case "leftring" => Ring(isTome, job).copy(piece = "leftRing")
case "rightring" => Ring(isTome, job).copy(piece = "rightRing")
case "accessory upgrade" => AccessoryUpgrade case "accessory upgrade" => AccessoryUpgrade
case "body upgrade" => BodyUpgrade case "body upgrade" => BodyUpgrade
case "weapon upgrade" => WeaponUpgrade case "weapon upgrade" => WeaponUpgrade
@ -119,5 +117,6 @@ object Piece {
lazy val available: Seq[String] = Seq("weapon", lazy val available: Seq[String] = Seq("weapon",
"head", "body", "hands", "waist", "legs", "feet", "head", "body", "hands", "waist", "legs", "feet",
"ears", "neck", "wrist", "leftRing", "rightRing") "ears", "neck", "wrist", "left ring", "right ring",
"accessory upgrade", "body upgrade", "weapon upgrade")
} }

View File

@ -11,8 +11,8 @@ package me.arcanis.ffxivbis.service
import java.nio.file.Paths import java.nio.file.Paths
import akka.actor.{Actor, Props} import akka.actor.{Actor, Props}
import akka.http.scaladsl.model._
import akka.http.scaladsl.Http import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.pattern.pipe import akka.pattern.pipe
import akka.stream.ActorMaterializer import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Keep, Sink} import akka.stream.scaladsl.{Keep, Sink}
@ -128,8 +128,8 @@ object Ariyala {
private def remapKey(key: String): Option[String] = key match { private def remapKey(key: String): Option[String] = key match {
case "mainhand" => Some("weapon") case "mainhand" => Some("weapon")
case "chest" => Some("body") case "chest" => Some("body")
case "ringLeft" => Some("leftRing") case "ringLeft" => Some("left ring")
case "ringRight" => Some("rightRing") case "ringRight" => Some("right ring")
case "head" | "hands" | "waist" | "legs" | "feet" | "ears" | "neck" | "wrist" => Some(key) case "head" | "hands" | "waist" | "legs" | "feet" | "ears" | "neck" | "wrist" => Some(key)
case _ => None case _ => None
} }

View File

@ -9,7 +9,7 @@
package me.arcanis.ffxivbis.storage package me.arcanis.ffxivbis.storage
import me.arcanis.ffxivbis.models.{Job, Loot, Piece} import me.arcanis.ffxivbis.models.{Job, Loot, Piece}
import slick.lifted.{ForeignKeyQuery, Index, PrimaryKey} import slick.lifted.ForeignKeyQuery
import scala.concurrent.Future import scala.concurrent.Future

View File

@ -9,7 +9,6 @@
package me.arcanis.ffxivbis.storage package me.arcanis.ffxivbis.storage
import me.arcanis.ffxivbis.models.{BiS, Job, Player, PlayerId} import me.arcanis.ffxivbis.models.{BiS, Job, Player, PlayerId}
import slick.lifted.{Index, PrimaryKey}
import scala.concurrent.Future import scala.concurrent.Future

View File

@ -15,8 +15,8 @@ object Fixtures {
Ears(isTome = false, Job.DNC), Ears(isTome = false, Job.DNC),
Neck(isTome = true, Job.DNC), Neck(isTome = true, Job.DNC),
Wrist(isTome = false, Job.DNC), Wrist(isTome = false, Job.DNC),
Ring(isTome = true, Job.DNC, "leftRing"), Ring(isTome = true, Job.DNC, "left ring"),
Ring(isTome = true, Job.DNC, "rightRing") Ring(isTome = true, Job.DNC, "right ring")
) )
) )
@ -30,8 +30,8 @@ object Fixtures {
lazy val lootLegs: Piece = Legs(isTome = false, Job.AnyJob) lazy val lootLegs: Piece = Legs(isTome = false, Job.AnyJob)
lazy val lootEars: Piece = Ears(isTome = false, Job.AnyJob) lazy val lootEars: Piece = Ears(isTome = false, Job.AnyJob)
lazy val lootRing: Piece = Ring(isTome = true, Job.AnyJob) lazy val lootRing: Piece = Ring(isTome = true, Job.AnyJob)
lazy val lootLeftRing: Piece = Ring(isTome = true, Job.AnyJob, "leftRing") lazy val lootLeftRing: Piece = Ring(isTome = true, Job.AnyJob, "left ring")
lazy val lootRightRing: Piece = Ring(isTome = true, Job.AnyJob, "rightRing") lazy val lootRightRing: Piece = Ring(isTome = true, Job.AnyJob, "right ring")
lazy val lootUpgrade: Piece = BodyUpgrade lazy val lootUpgrade: Piece = BodyUpgrade
lazy val loot: Seq[Piece] = Seq(lootBody, lootHands, lootLegs, lootUpgrade) lazy val loot: Seq[Piece] = Seq(lootBody, lootHands, lootLegs, lootUpgrade)