Fix period conversion exception

"Cannot convert to Seconds as this period contains months and months vary in length" during login
This commit is contained in:
Jakob Gillich 2020-08-26 21:12:12 +02:00
parent 06e63dd960
commit 20011691f0
3 changed files with 16 additions and 12 deletions

View file

@ -59,9 +59,10 @@ import net.psforever.types.{
import net.psforever.util.Database._
import net.psforever.persistence
import net.psforever.util.DefinitionUtil
import org.joda.time.{LocalDateTime, Period}
import org.joda.time.{LocalDateTime, Seconds}
import net.psforever.services.ServiceManager
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
import scala.collection.mutable
import scala.concurrent.{ExecutionContextExecutor, Future, Promise}
import scala.util.{Failure, Success}
@ -733,7 +734,8 @@ class AvatarActor(
case RefreshPurchaseTimes() =>
avatar.purchaseTimes.foreach {
case (name, purchaseTime) =>
val secondsSincePurchase = new Period(purchaseTime, LocalDateTime.now()).toStandardSeconds.getSeconds
val secondsSincePurchase = Seconds.secondsBetween(purchaseTime, LocalDateTime.now()).getSeconds
Avatar.purchaseCooldowns.find(_._1.Name == name) match {
case Some((obj, cooldown)) if cooldown.toSeconds - secondsSincePurchase > 0 =>
val faction: String = avatar.faction.toString.toLowerCase
@ -1096,7 +1098,7 @@ class AvatarActor(
val converter: CharacterSelectConverter = new CharacterSelectConverter
avatars.filter(!_.deleted) foreach { a =>
val secondsSinceLastLogin = new Period(a.lastLogin, LocalDateTime.now()).toStandardSeconds.getSeconds
val secondsSinceLastLogin = Seconds.secondsBetween(a.lastLogin, LocalDateTime.now()).getSeconds
val avatar = a.toAvatar
val player = new Player(avatar)

View file

@ -4612,7 +4612,7 @@ class SessionActor extends Actor with MDCContextAware {
ChatMessageType.UNK_225,
false,
"",
s"@TimeUntilNextUse^${cooldown.toStandardSeconds.getSeconds}",
s"@TimeUntilNextUse^${cooldown.getStandardSeconds}",
None
)
)

View file

@ -5,9 +5,10 @@ import net.psforever.objects.equipment.{EquipmentSize, EquipmentSlot}
import net.psforever.objects.loadouts.{Loadout, SquadLoadout}
import net.psforever.objects.{GlobalDefinitions, LockerContainer, LockerEquipment, OffhandEquipmentSlot}
import net.psforever.types._
import org.joda.time.{LocalDateTime, Period}
import org.joda.time.{Duration, LocalDateTime, Seconds}
import scala.collection.immutable.Seq
import scala.concurrent.duration.{FiniteDuration, _}
import scala.concurrent.duration._
object Avatar {
val purchaseCooldowns: Map[BasicDefinition, FiniteDuration] = Map(
@ -105,13 +106,14 @@ case class Avatar(
times: Map[String, LocalDateTime],
cooldowns: Map[BasicDefinition, FiniteDuration],
definition: BasicDefinition
): Option[Period] = {
): Option[Duration] = {
times.get(definition.Name) match {
case Some(purchaseTime) =>
val secondsSincePurchase = new Period(purchaseTime, LocalDateTime.now()).toStandardSeconds.getSeconds
val secondsSincePurchase = Seconds.secondsBetween(purchaseTime, LocalDateTime.now())
val duration = secondsSincePurchase.toStandardDuration
cooldowns.get(definition) match {
case Some(cooldown) if (cooldown.toSeconds - secondsSincePurchase) > 0 =>
Some(Period.seconds(cooldown.toSeconds.toInt - secondsSincePurchase))
case Some(cooldown) if (cooldown.toSeconds - secondsSincePurchase.getSeconds) > 0 =>
Some(duration)
case _ => None
}
case None =>
@ -120,12 +122,12 @@ case class Avatar(
}
/** Returns the remaining purchase cooldown or None if an object is not on cooldown */
def purchaseCooldown(definition: BasicDefinition): Option[Period] = {
def purchaseCooldown(definition: BasicDefinition): Option[Duration] = {
cooldown(purchaseTimes, Avatar.purchaseCooldowns, definition)
}
/** Returns the remaining use cooldown or None if an object is not on cooldown */
def useCooldown(definition: BasicDefinition): Option[Period] = {
def useCooldown(definition: BasicDefinition): Option[Duration] = {
cooldown(useTimes, Avatar.useCooldowns, definition)
}