working GalaxyService based on GenericEventService

This commit is contained in:
Fate-JH 2026-01-22 01:38:07 -05:00
parent 406e89ea50
commit be803f0d03
6 changed files with 56 additions and 145 deletions

View file

@ -19,7 +19,7 @@ trait GenericMessageEnvelope {
def response(outChannel: String): GenericResponseEnvelope
}
abstract class GenericEventService[OUT <: GenericResponseEnvelope](busName: String)
abstract class GenericEventService[IN <: GenericMessageEnvelope, OUT <: GenericResponseEnvelope](busName: String)
extends Actor {
protected lazy val log: Logger = org.log4s.getLogger(getClass.getSimpleName)
@ -47,7 +47,7 @@ abstract class GenericEventService[OUT <: GenericResponseEnvelope](busName: Stri
def receive: Receive =
commonJoinBehavior.orElse(commonLeaveBehavior)
.orElse {
case msg: GenericMessageEnvelope =>
case msg: IN =>
compose(msg)
case msg => ()

View file

@ -16,11 +16,11 @@ trait GenericMessageToSupportEnvelope
def response(outChannel: String): GenericResponseEnvelope = null
}
abstract class GenericEventServiceWithSupport[OUT <: GenericResponseEnvelope](
busName: String,
eventSupportServices: List[EventServiceSupport]
)
extends GenericEventService[OUT](busName) {
abstract class GenericEventServiceWithSupport[IN <: GenericMessageEnvelope, OUT <: GenericResponseEnvelope]
(
busName: String,
eventSupportServices: List[EventServiceSupport]
) extends GenericEventService[IN, OUT](busName) {
private val supportServices: Map[String, ActorRef] =
eventSupportServices

View file

@ -0,0 +1,41 @@
// Copyright (c) 2017-2026 PSForever
package net.psforever.services.galaxy
import net.psforever.objects.Vehicle
import net.psforever.objects.vehicles.VehicleManifest
import net.psforever.objects.zones.{HotSpotInfo, Zone}
import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.{BuildingInfoUpdateMessage, CaptureFlagUpdateMessage}
import net.psforever.services.base.SelfResponseMessage
import net.psforever.types.{PlanetSideEmpire, PlanetSideGUID}
object GalaxyAction {
final case class HotSpotUpdate(zone_id: Int, priority: Int, host_spot_info: List[HotSpotInfo]) extends SelfResponseMessage
final case class MapUpdate(msg: BuildingInfoUpdateMessage) extends SelfResponseMessage
final case class FlagMapUpdate(msg: CaptureFlagUpdateMessage) extends SelfResponseMessage
final case class TransferPassenger(
player_guid: PlanetSideGUID,
temp_channel: String,
vehicle: Vehicle,
vehicle_to_delete: PlanetSideGUID,
manifest: VehicleManifest
) extends SelfResponseMessage
final case class UpdateBroadcastPrivileges(
zoneId: Int,
gateMapId: Int,
fromFactions: Set[PlanetSideEmpire.Value],
toFactions: Set[PlanetSideEmpire.Value]
) extends SelfResponseMessage
final case class LockedZoneUpdate(zone: Zone, timeUntilUnlock: Long) extends SelfResponseMessage
final case class UnlockedZoneUpdate(zone: Zone) extends SelfResponseMessage
final case class LogStatusChange(name: String) extends SelfResponseMessage
final case class SendResponse(msg: PlanetSideGamePacket) extends SelfResponseMessage
}

View file

@ -1,42 +1,7 @@
// Copyright (c) 2017 PSForever
// Copyright (c) 2017-2026 PSForever
package net.psforever.services.galaxy
import akka.actor.Actor
import net.psforever.services.base.GenericEventBus
import net.psforever.services.Service
import net.psforever.services.base.GenericEventService
class GalaxyService extends Actor {
private[this] val log = org.log4s.getLogger
val GalaxyEvents = new GenericEventBus[GalaxyServiceResponse]
private def correctChannelName(channel: String): String = {
if (channel.isEmpty) {
s"/Galaxy"
} else {
s"/$channel/Galaxy"
}
}
def receive: Receive = {
case Service.Join(channel) =>
val path = correctChannelName(channel)
GalaxyEvents.subscribe(sender(), path)
case Service.Leave(None) =>
GalaxyEvents.unsubscribe(sender())
case Service.Leave(Some(channel)) =>
val path = s"/$channel/Galaxy"
GalaxyEvents.unsubscribe(sender(), path)
case Service.LeaveAll() =>
GalaxyEvents.unsubscribe(sender())
case msg @ GalaxyServiceMessage(forChannel, _) =>
GalaxyEvents.publish(msg.response(correctChannelName(forChannel)))
case msg =>
log.warn(s"Unhandled message $msg from ${sender()}")
}
}
class GalaxyService
extends GenericEventService[GalaxyServiceMessage, GalaxyServiceResponse](busName = "Galaxy")

View file

@ -1,14 +1,9 @@
// Copyright (c) 2017 PSForever
package net.psforever.services.galaxy
import net.psforever.objects.Vehicle
import net.psforever.objects.vehicles.VehicleManifest
import net.psforever.objects.zones.{HotSpotInfo, Zone}
import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.{BuildingInfoUpdateMessage, CaptureFlagUpdateMessage}
import net.psforever.services.Service
import net.psforever.services.base.{EventMessage, EventResponse, GenericMessageEnvelope, SelfResponseMessage}
import net.psforever.types.{PlanetSideEmpire, PlanetSideGUID}
import net.psforever.services.base.{EventMessage, GenericMessageEnvelope}
import net.psforever.types.PlanetSideGUID
final case class GalaxyServiceMessage(channel: String, msg: EventMessage)
extends GenericMessageEnvelope {
@ -20,59 +15,5 @@ final case class GalaxyServiceMessage(channel: String, msg: EventMessage)
}
object GalaxyServiceMessage {
def apply(actionMessage: GalaxyAction.Action): GalaxyServiceMessage = GalaxyServiceMessage("", actionMessage)
}
object GalaxyAction {
trait Action extends EventMessage
trait Response extends EventResponse
final case class HotSpotUpdate(zone_id: Int, priority: Int, host_spot_info: List[HotSpotInfo])
extends Action
with Response
with SelfResponseMessage
final case class MapUpdate(msg: BuildingInfoUpdateMessage)
extends Action
with Response
with SelfResponseMessage
final case class FlagMapUpdate(msg: CaptureFlagUpdateMessage) extends Action
with Response
with SelfResponseMessage
final case class TransferPassenger(
player_guid: PlanetSideGUID,
temp_channel: String,
vehicle: Vehicle,
vehicle_to_delete: PlanetSideGUID,
manifest: VehicleManifest
) extends Action
with Response
with SelfResponseMessage
final case class UpdateBroadcastPrivileges(
zoneId: Int,
gateMapId: Int,
fromFactions: Set[PlanetSideEmpire.Value],
toFactions: Set[PlanetSideEmpire.Value]
) extends Action
with Response
with SelfResponseMessage
final case class LockedZoneUpdate(zone: Zone, timeUntilUnlock: Long) extends Action
with Response
with SelfResponseMessage
final case class UnlockedZoneUpdate(zone: Zone) extends Action
with Response
with SelfResponseMessage
final case class LogStatusChange(name: String) extends Action
with Response
with SelfResponseMessage
final case class SendResponse(msg: PlanetSideGamePacket) extends Action
with Response
with SelfResponseMessage
def apply(actionMessage: EventMessage): GalaxyServiceMessage = GalaxyServiceMessage("", actionMessage)
}

View file

@ -1,12 +1,7 @@
// Copyright (c) 2017 PSForever
package net.psforever.services.galaxy
import net.psforever.objects.Vehicle
import net.psforever.objects.vehicles.VehicleManifest
import net.psforever.objects.zones.{HotSpotInfo, Zone}
import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.{BuildingInfoUpdateMessage, CaptureFlagUpdateMessage}
import net.psforever.types.{PlanetSideEmpire, PlanetSideGUID}
import net.psforever.types.PlanetSideGUID
import net.psforever.services.Service
import net.psforever.services.base.{EventResponse, GenericResponseEnvelope}
@ -14,34 +9,3 @@ final case class GalaxyServiceResponse(channel: String, reply: EventResponse)
extends GenericResponseEnvelope {
def exclude: PlanetSideGUID = Service.defaultPlayerGUID
}
object GalaxyResponse {
trait Response extends EventResponse
final case class HotSpotUpdate(zone_id: Int, priority: Int, host_spot_info: List[HotSpotInfo]) extends Response
final case class MapUpdate(msg: BuildingInfoUpdateMessage) extends Response
final case class FlagMapUpdate(msg: CaptureFlagUpdateMessage) extends Response
final case class TransferPassenger(
temp_channel: String,
vehicle: Vehicle,
vehicle_to_delete: PlanetSideGUID,
manifest: VehicleManifest
) extends Response
final case class UpdateBroadcastPrivileges(
zoneId: Int,
gateMapId: Int,
fromFactions: Set[PlanetSideEmpire.Value],
toFactions: Set[PlanetSideEmpire.Value]
) extends Response
final case class LockedZoneUpdate(zone: Zone, timeUntilUnlock: Long) extends Response
final case class UnlockedZoneUpdate(zone: Zone) extends Response
final case class LogStatusChange(name: String) extends Response
final case class SendResponse(msg: PlanetSideGamePacket) extends Response
}