mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-01-19 18:44:45 +00:00
77 lines
2.3 KiB
Scala
77 lines
2.3 KiB
Scala
// Copyright (c) 2016 PSForever.net to present
|
|
import java.net.{InetAddress, InetSocketAddress}
|
|
|
|
import akka.actor.{Actor, ActorLogging, ActorRef, Identify, MDCContextAware}
|
|
import psforever.net._
|
|
import scodec.Attempt.{Failure, Successful}
|
|
import scodec.bits._
|
|
|
|
class LoginSessionActor extends Actor with MDCContextAware {
|
|
private[this] val log = org.log4s.getLogger
|
|
|
|
var leftRef : ActorRef = ActorRef.noSender
|
|
var rightRef : ActorRef = ActorRef.noSender
|
|
|
|
def receive = Initializing
|
|
|
|
def Initializing : Receive = {
|
|
case HelloFriend(right) =>
|
|
leftRef = sender()
|
|
rightRef = right.asInstanceOf[ActorRef]
|
|
|
|
context.become(Started)
|
|
case _ =>
|
|
log.error("Unknown message")
|
|
context.stop(self)
|
|
}
|
|
|
|
def Started : Receive = {
|
|
case ctrl @ ControlPacket(opcode, pkt) =>
|
|
handleControlPkt(pkt)
|
|
case game @ GamePacket(opcode, seq, pkt) =>
|
|
handleGamePkt(pkt)
|
|
case default => failWithError(s"Invalid message received $default")
|
|
}
|
|
|
|
def handleControlPkt(pkt : PlanetSideControlPacket) = {
|
|
pkt match {
|
|
case SlottedMetaPacket(innerPacket) =>
|
|
PacketCoding.DecodePacket(innerPacket) match {
|
|
case Successful(p) =>
|
|
log.trace("RECV[INNER]: " + p)
|
|
|
|
val packet = LoginRespMessage("AAAABBBBCCCCDDDD",
|
|
hex"00000000 18FABE0C 00000000 00000000",
|
|
0, 1, 2, 685276011,
|
|
"AAAAAAAA", 0, false
|
|
)
|
|
|
|
sendResponse(PacketCoding.CreateGamePacket(0, packet))
|
|
|
|
val msg = VNLWorldStatusMessage("Welcome to PlanetSide! ",
|
|
Vector(
|
|
WorldInformation("PSForever", WorldStatus.Up, ServerType.Development,
|
|
Vector(WorldConnectionInfo(new InetSocketAddress(InetAddress.getByName("127.0.0.1"), 51000))), EmpireNeed.TR)
|
|
))
|
|
|
|
sendResponse(PacketCoding.CreateGamePacket(0, msg))
|
|
case Failure(e) => log.error("Failed to decode inner packet " + e)
|
|
}
|
|
}
|
|
}
|
|
|
|
def handleGamePkt(pkt : PlanetSideGamePacket) = {
|
|
|
|
}
|
|
|
|
def failWithError(error : String) = {
|
|
log.error(error)
|
|
sendResponse(PacketCoding.CreateControlPacket(ConnectionClose()))
|
|
}
|
|
|
|
def sendResponse(cont : PlanetSidePacketContainer) = {
|
|
log.trace("LOGIN SEND: " + cont)
|
|
rightRef ! cont
|
|
}
|
|
}
|