diff --git a/.codecov.yml b/.codecov.yml index 3c69d86ed..37159d819 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -75,23 +75,19 @@ ignore: - "src/main/scala/net/psforever/services/account/StoreIPAddress.scala" - "src/main/scala/net/psforever/services/avatar/AvatarAction.scala" - "src/main/scala/net/psforever/services/avatar/AvatarService.scala" - - "src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala" - "src/main/scala/net/psforever/services/base/bus" - "src/main/scala/net/psforever/services/base/envelope" - "src/main/scala/net/psforever/services/chat/ChatChannel.scala" - "src/main/scala/net/psforever/services/galaxy/GalaxyAction" - "src/main/scala/net/psforever/services/galaxy/GalaxyService" - - "src/main/scala/net/psforever/services/galaxy/GalaxyServiceResponse.scala" - "src/main/scala/net/psforever/services/hart/HartEvent.scala" - "src/main/scala/net/psforever/services/hart/HartTimerActions.scala" - "src/main/scala/net/psforever/services/local/LocalAction" - "src/main/scala/net/psforever/services/local/LocalService" - - "src/main/scala/net/psforever/services/local/LocalServiceResponse.scala" - "src/main/scala/net/psforever/services/teamwork/SquadServiceMessage.scala" - "src/main/scala/net/psforever/services/teamwork/SquadServiceResponse.scala" - "src/main/scala/net/psforever/services/vehicle/VehicleAction" - "src/main/scala/net/psforever/services/vehicle/VehicleService" - - "src/main/scala/net/psforever/services/vehicle/VehicleServiceResponse.scala" - "src/main/scala/net/psforever/services/Service.scala" - "src/main/scala/net/psforever/types" - "src/main/scala/net/psforever/util" diff --git a/src/main/scala/net/psforever/actors/session/AvatarActor.scala b/src/main/scala/net/psforever/actors/session/AvatarActor.scala index 96113546a..87c59aa42 100644 --- a/src/main/scala/net/psforever/actors/session/AvatarActor.scala +++ b/src/main/scala/net/psforever/actors/session/AvatarActor.scala @@ -12,6 +12,8 @@ import net.psforever.objects.avatar.ModePermissions import net.psforever.objects.avatar.scoring.{Assist, Death, EquipmentStat, KDAStat, Kill, Life, ScoreCard, SupportActivity} import net.psforever.objects.sourcing.{TurretSource, VehicleSource} import net.psforever.packet.game.ImplantAction +import net.psforever.services.avatar.AvatarStamp +import net.psforever.services.base.envelope.GenericResponseEnvelope import net.psforever.types.{ChatMessageType, StatisticalCategory, StatisticalElement} import net.psforever.zones.Zones import org.joda.time.{LocalDateTime, Seconds} @@ -3490,8 +3492,8 @@ class AvatarActor( value: Int ): Unit = { import akka.actor.typed.scaladsl.adapter.TypedActorRefOps - import net.psforever.services.avatar.AvatarServiceResponse - sessionActor.toClassic ! AvatarServiceResponse("", guid, AvatarAction.AvatarImplant(action, index, value)) + val resp = AvatarAction.AvatarImplant(action, index, value) + sessionActor.toClassic ! GenericResponseEnvelope(AvatarStamp, "", guid, resp) } private def buyImplantAction( diff --git a/src/main/scala/net/psforever/actors/session/csr/AvatarHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/csr/AvatarHandlerLogic.scala index 01b88bf05..1ef36f908 100644 --- a/src/main/scala/net/psforever/actors/session/csr/AvatarHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/csr/AvatarHandlerLogic.scala @@ -12,7 +12,8 @@ import net.psforever.objects.serverobject.containable.ContainableBehavior import net.psforever.objects.serverobject.mount.Mountable import net.psforever.objects.vital.RevivingActivity import net.psforever.packet.game.{AvatarImplantMessage, CreateShortcutMessage, HitHint, ImplantAction} -import net.psforever.services.avatar.{AvatarAction, AvatarServiceResponse} +import net.psforever.services.avatar.{AvatarAction, AvatarStamp} +import net.psforever.services.base.envelope.GenericResponseEnvelope import net.psforever.services.base.message.{ChangeAmmo, ChangeFireState_Start, ChangeFireState_Stop, ConcealPlayer, EventResponse, GenericObjectAction, HintsAtAttacker, ObjectDelete, PlanetsideAttribute, ReloadTool, SendResponse, SetEmpire, WeaponDryFire} import net.psforever.types.ImplantType @@ -60,11 +61,11 @@ class AvatarHandlerLogic(val ops: SessionAvatarHandlers, implicit val context: A /* special messages */ case AvatarAction.TeardownConnection() if player.spectator => context.self ! SessionActor.SetMode(CustomerServiceRepresentativeMode) - context.self.forward(AvatarServiceResponse(toChannel, guid, reply)) + context.self.forward(GenericResponseEnvelope(AvatarStamp, toChannel, guid, reply)) case AvatarAction.TeardownConnection() => context.self ! SessionActor.SetMode(NormalMode) - context.self.forward(AvatarServiceResponse(toChannel, guid, reply)) + context.self.forward(GenericResponseEnvelope(AvatarStamp, toChannel, guid, reply)) /* really common messages (very frequently, every life) */ case pstate @ AvatarAction.PlayerState( diff --git a/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala index f40fc771a..62acd99c1 100644 --- a/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala @@ -14,9 +14,10 @@ import net.psforever.objects.serverobject.pad.VehicleSpawnPad import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent import net.psforever.packet.game.{ChangeAmmoMessage, ChangeFireStateMessage_Start, ChangeFireStateMessage_Stop, ChatMsg, ChildObjectStateMessage, DeadState, DeployRequestMessage, DismountVehicleMsg, FrameVehicleStateMessage, GenericObjectActionMessage, HitHint, InventoryStateMessage, ObjectAttachMessage, ObjectCreateDetailedMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, PlanetsideAttributeMessage, ReloadMessage, ServerVehicleOverrideMsg, VehicleStateMessage, WeaponDryFireMessage} import net.psforever.services.Service +import net.psforever.services.base.envelope.GenericResponseEnvelope import net.psforever.services.base.message.{ChangeAmmo, ChangeFireState_Start, ChangeFireState_Stop, EventResponse, GenericObjectAction, HintsAtAttacker, ObjectDelete, PlanetsideAttribute, ReloadTool, SendResponse, WeaponDryFire} import net.psforever.services.local.support.CaptureFlagManager -import net.psforever.services.vehicle.{VehicleAction, VehicleServiceResponse} +import net.psforever.services.vehicle.{VehicleAction, VehicleStamp} import net.psforever.types.{BailType, ChatMessageType, PlanetSideGUID, Vector3} object VehicleHandlerLogic { @@ -256,11 +257,13 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: ) import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ - context.system.scheduler.scheduleOnce( - delay milliseconds, - context.self, - VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleAction.KickCargo(vehicle, speed=0, delay)) + val resp = GenericResponseEnvelope( + VehicleStamp, + toChannel, + PlanetSideGUID(0), + VehicleAction.KickCargo(vehicle, speed=0, delay) ) + context.system.scheduler.scheduleOnce(delay milliseconds, context.self, resp) case VehicleAction.KickCargo(cargo, _, _) if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive => diff --git a/src/main/scala/net/psforever/actors/session/spectator/VehicleHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/spectator/VehicleHandlerLogic.scala index bee65c613..182f32efe 100644 --- a/src/main/scala/net/psforever/actors/session/spectator/VehicleHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/spectator/VehicleHandlerLogic.scala @@ -8,8 +8,9 @@ import net.psforever.objects.equipment.Equipment import net.psforever.objects.serverobject.pad.VehicleSpawnPad import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent import net.psforever.packet.game.{ChangeAmmoMessage, ChangeFireStateMessage_Start, ChangeFireStateMessage_Stop, ChildObjectStateMessage, DeadState, DeployRequestMessage, DismountVehicleMsg, FrameVehicleStateMessage, GenericObjectActionMessage, InventoryStateMessage, ObjectAttachMessage, ObjectCreateDetailedMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, PlanetsideAttributeMessage, ReloadMessage, ServerVehicleOverrideMsg, VehicleStateMessage, WeaponDryFireMessage} +import net.psforever.services.base.envelope.GenericResponseEnvelope import net.psforever.services.base.message.{ChangeAmmo, ChangeFireState_Start, ChangeFireState_Stop, EventResponse, GenericObjectAction, ObjectDelete, PlanetsideAttribute, ReloadTool, SendResponse, WeaponDryFire} -import net.psforever.services.vehicle.{VehicleAction, VehicleServiceResponse} +import net.psforever.services.vehicle.{VehicleAction, VehicleStamp} import net.psforever.types.{BailType, PlanetSideGUID, Vector3} object VehicleHandlerLogic { @@ -205,11 +206,13 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: ) import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ - context.system.scheduler.scheduleOnce( - delay milliseconds, - context.self, - VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleAction.KickCargo(vehicle, speed=0, delay)) + val resp = GenericResponseEnvelope( + VehicleStamp, + toChannel, + PlanetSideGUID(0), + VehicleAction.KickCargo(vehicle, speed=0, delay) ) + context.system.scheduler.scheduleOnce(delay milliseconds, context.self, resp) case VehicleAction.KickCargo(cargo, _, _) if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive => diff --git a/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala index 88298edc1..2e613704b 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala @@ -8,8 +8,8 @@ import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, UniquePlayer} import net.psforever.packet.game.objectcreate.ConstructorData import net.psforever.objects.zones.exp import net.psforever.services.Service -import net.psforever.services.avatar.{AvatarAction, AvatarServiceResponse} -import net.psforever.services.base.envelope.MessageEnvelope +import net.psforever.services.avatar.{AvatarAction, AvatarStamp} +import net.psforever.services.base.envelope.{GenericResponseEnvelope, MessageEnvelope} import net.psforever.services.base.message.{EventResponse, SendResponse} import net.psforever.services.chat.OutfitChannel @@ -213,7 +213,8 @@ class SessionAvatarHandlers( def killedWhileMounted(obj: PlanetSideGameObject with Mountable, playerGuid: PlanetSideGUID): Unit = { val playerName = player.Name //boot cadaver from mount on client - context.self ! AvatarServiceResponse( + context.self ! GenericResponseEnvelope( + AvatarStamp, playerName, Service.defaultPlayerGUID, SendResponse(ObjectDetachMessage(obj.GUID, playerGuid, player.Position, Vector3.Zero)) diff --git a/src/main/scala/net/psforever/objects/serverobject/doors/DoorControl.scala b/src/main/scala/net/psforever/objects/serverobject/doors/DoorControl.scala index cd8b6a599..5f00c5d83 100644 --- a/src/main/scala/net/psforever/objects/serverobject/doors/DoorControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/doors/DoorControl.scala @@ -8,9 +8,10 @@ import net.psforever.objects.serverobject.affinity.{FactionAffinity, FactionAffi import net.psforever.objects.serverobject.locks.IFFLock import net.psforever.objects.serverobject.structures.PoweredAmenityControl import net.psforever.services.Service +import net.psforever.services.base.envelope.GenericResponseEnvelope import net.psforever.services.base.support.SupportActor import net.psforever.services.local.support.{DoorCloseActor, DoorMessage} -import net.psforever.services.local.{LocalAction, LocalServiceResponse} +import net.psforever.services.local.{LocalAction, LocalStamp} /** * An `Actor` that handles messages being dispatched to a specific `Door`. @@ -116,7 +117,8 @@ object DoorControl { ) } else { //the door should already open, but the requesting player does not see it as open - replyTo ! LocalServiceResponse( + replyTo ! GenericResponseEnvelope( + LocalStamp, player.Name, Service.defaultPlayerGUID, LocalAction.DoorOpens(door.Zone, door) diff --git a/src/main/scala/net/psforever/services/CavernRotationService.scala b/src/main/scala/net/psforever/services/CavernRotationService.scala index d912d427f..a337e5988 100644 --- a/src/main/scala/net/psforever/services/CavernRotationService.scala +++ b/src/main/scala/net/psforever/services/CavernRotationService.scala @@ -12,9 +12,9 @@ import net.psforever.objects.Default import net.psforever.objects.serverobject.structures.{Building, WarpGate} import net.psforever.objects.zones.Zone import net.psforever.packet.game.ChatMsg -import net.psforever.services.base.envelope.MessageEnvelope +import net.psforever.services.base.envelope.{GenericResponseEnvelope, MessageEnvelope} import net.psforever.services.base.message.SendResponse -import net.psforever.services.galaxy.{GalaxyAction, GalaxyServiceResponse} +import net.psforever.services.galaxy.{GalaxyAction, GalaxyStamp} import net.psforever.types.ChatMessageType import net.psforever.util.Config import net.psforever.zones.Zones @@ -559,14 +559,17 @@ class CavernRotationService( val (lockedZones, unlockedZones) = managedZones.partition(_.locked) //borrow GalaxyService response structure, but send to the specific endpoint math.max(0, monitor.start + monitor.duration - curr) unlockedZones.foreach { monitor => - sendToSession ! GalaxyServiceResponse("", GalaxyAction.UnlockedZoneUpdate(monitor.zone)) + val resp = GalaxyAction.UnlockedZoneUpdate(monitor.zone) + sendToSession ! GenericResponseEnvelope(GalaxyStamp, "", Service.defaultPlayerGUID, resp) } val sortedLocked = lockedZones.sortBy(z => z.start) sortedLocked.take(2).foreach { monitor => - sendToSession ! GalaxyServiceResponse("", GalaxyAction.LockedZoneUpdate(monitor.zone, math.max(0, monitor.start + monitor.duration - curr))) + val resp = GalaxyAction.LockedZoneUpdate(monitor.zone, math.max(0, monitor.start + monitor.duration - curr)) + sendToSession ! GenericResponseEnvelope(GalaxyStamp, "", Service.defaultPlayerGUID, resp) } sortedLocked.takeRight(2).foreach { monitor => - sendToSession ! GalaxyServiceResponse("", GalaxyAction.LockedZoneUpdate(monitor.zone, 0L)) + val resp = GalaxyAction.LockedZoneUpdate(monitor.zone, 0L) + sendToSession ! GenericResponseEnvelope(GalaxyStamp, "", Service.defaultPlayerGUID, resp) } } diff --git a/src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala b/src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala deleted file mode 100644 index a40827b99..000000000 --- a/src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2017 PSForever -package net.psforever.services.avatar - -import net.psforever.services.base.message.EventResponse -import net.psforever.types.PlanetSideGUID -import net.psforever.services.base.EventSystemStamp -import net.psforever.services.base.envelope.GenericResponseEnvelope - -final case class AvatarServiceResponse( - channel: String, - filter: PlanetSideGUID, - reply: EventResponse - ) extends GenericResponseEnvelope { - def stamp: EventSystemStamp = AvatarStamp -} diff --git a/src/main/scala/net/psforever/services/base/envelope/GenericResponseEnvelope.scala b/src/main/scala/net/psforever/services/base/envelope/GenericResponseEnvelope.scala index 001513b10..752fc9385 100644 --- a/src/main/scala/net/psforever/services/base/envelope/GenericResponseEnvelope.scala +++ b/src/main/scala/net/psforever/services/base/envelope/GenericResponseEnvelope.scala @@ -2,7 +2,7 @@ package net.psforever.services.base.envelope import net.psforever.services.base.EventSystemStamp -import net.psforever.services.base.message.{EventMessage, EventResponse} +import net.psforever.services.base.message.{EventMessage, EventResponse, SelfRespondingEvent} import net.psforever.types.PlanetSideGUID /** @@ -15,7 +15,7 @@ trait GenericResponseEnvelope /** marker indicating the routing through which the original message was processed */ def stamp: EventSystemStamp /** channel information tailored to the event system */ - def outChannel: String = stamp.routing(channel) + final def outChannel: String = stamp.routing(channel) } object GenericResponseEnvelope { @@ -32,6 +32,35 @@ object GenericResponseEnvelope { envelope.response(stamp) } + /** + * Fake a response envelope, as if processed by a specific event system. + * @param _stamp marker indicating the routing through which the original message was processed + * @param _channel set of subscribers on an event system bus the envelope should reach + * @param _filter a specific subscriber endpoint to be excluded + * @param _reply input payload transported by this envelope + * @return a faked but typically acceptable response envelope + */ + def apply(_stamp: EventSystemStamp, _channel: String, _filter: PlanetSideGUID, _reply: SelfRespondingEvent): GenericResponseEnvelope = { + apply(_stamp, _channel, _filter, _reply.asInstanceOf[EventResponse]) + } + + /** + * Fake a response envelope, as if processed by a specific event system. + * @param _stamp marker indicating the routing through which the original message was processed + * @param _channel set of subscribers on an event system bus the envelope should reach + * @param _filter a specific subscriber endpoint to be excluded + * @param _reply input payload transported by this envelope + * @return a faked but typically acceptable response envelope + */ + def apply(_stamp: EventSystemStamp, _channel: String, _filter: PlanetSideGUID, _reply: EventResponse): GenericResponseEnvelope = { + new GenericResponseEnvelope { + def channel: String = _channel + def filter: PlanetSideGUID = _filter + def reply: EventResponse = _reply + def stamp: EventSystemStamp = _stamp + } + } + /** * The `unapply`ed data from a response envelope resembles the data from includes the filter and the channel information. * @param obj response envelope diff --git a/src/main/scala/net/psforever/services/galaxy/GalaxyServiceResponse.scala b/src/main/scala/net/psforever/services/galaxy/GalaxyServiceResponse.scala deleted file mode 100644 index 8cd9cbdee..000000000 --- a/src/main/scala/net/psforever/services/galaxy/GalaxyServiceResponse.scala +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2017 PSForever -package net.psforever.services.galaxy - -import net.psforever.types.PlanetSideGUID -import net.psforever.services.Service -import net.psforever.services.base.message.EventResponse -import net.psforever.services.base.EventSystemStamp -import net.psforever.services.base.envelope.GenericResponseEnvelope - -final case class GalaxyServiceResponse(channel: String, reply: EventResponse) - extends GenericResponseEnvelope { - def filter: PlanetSideGUID = Service.defaultPlayerGUID - - def stamp: EventSystemStamp = GalaxyStamp -} diff --git a/src/main/scala/net/psforever/services/local/LocalServiceResponse.scala b/src/main/scala/net/psforever/services/local/LocalServiceResponse.scala deleted file mode 100644 index dae9ab60b..000000000 --- a/src/main/scala/net/psforever/services/local/LocalServiceResponse.scala +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2017 PSForever -package net.psforever.services.local - -import net.psforever.services.base.message.EventResponse -import net.psforever.types.PlanetSideGUID -import net.psforever.services.base.EventSystemStamp -import net.psforever.services.base.envelope.GenericResponseEnvelope - -final case class LocalServiceResponse( - channel: String, - filter: PlanetSideGUID, - reply: EventResponse - ) extends GenericResponseEnvelope { - def stamp: EventSystemStamp = LocalStamp -} diff --git a/src/main/scala/net/psforever/services/vehicle/VehicleServiceResponse.scala b/src/main/scala/net/psforever/services/vehicle/VehicleServiceResponse.scala deleted file mode 100644 index 1b6652e2d..000000000 --- a/src/main/scala/net/psforever/services/vehicle/VehicleServiceResponse.scala +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2017 PSForever -package net.psforever.services.vehicle - -import net.psforever.services.base.message.EventResponse -import net.psforever.types.PlanetSideGUID -import net.psforever.services.base.EventSystemStamp -import net.psforever.services.base.envelope.GenericResponseEnvelope - -final case class VehicleServiceResponse( - channel: String, - filter: PlanetSideGUID, - reply: EventResponse - ) extends GenericResponseEnvelope { - def stamp: EventSystemStamp = VehicleStamp -} diff --git a/src/test/scala/objects/DoorTest.scala b/src/test/scala/objects/DoorTest.scala index 2404e44ca..48191ec59 100644 --- a/src/test/scala/objects/DoorTest.scala +++ b/src/test/scala/objects/DoorTest.scala @@ -12,8 +12,9 @@ import net.psforever.objects.{Default, GlobalDefinitions, Player} import net.psforever.objects.serverobject.doors.{Door, DoorControl} import net.psforever.objects.serverobject.structures.{Building, StructureType} import net.psforever.objects.zones.{Zone, ZoneMap} +import net.psforever.services.base.envelope.GenericResponseEnvelope import net.psforever.services.local.support.DoorMessage -import net.psforever.services.local.{LocalAction, LocalServiceResponse} +import net.psforever.services.local.LocalAction import net.psforever.types._ import org.specs2.mutable.Specification @@ -106,7 +107,7 @@ class DoorControlAlreadyOpenTest extends ActorTest { door.Actor.tell(CommonMessages.Use(player), probe.ref) val reply = probe.receiveOne(1000 milliseconds) assert(reply match { - case LocalServiceResponse("test", _, LocalAction.DoorOpens(_, thisDoor)) => thisDoor eq door + case GenericResponseEnvelope("test", _, LocalAction.DoorOpens(_, thisDoor)) => thisDoor eq door case _ => false }) }