mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-03-06 21:50:22 +00:00
101 lines
2.6 KiB
Scala
101 lines
2.6 KiB
Scala
// Copyright (c) 2016 PSForever.net to present
|
|
|
|
import java.net.InetSocketAddress
|
|
|
|
import akka.actor._
|
|
import org.log4s.MDC
|
|
import scodec.bits._
|
|
|
|
import akka.actor.{ActorContext, ActorRef, PoisonPill}
|
|
import com.github.nscala_time.time.Imports._
|
|
import MDCContextAware.Implicits._
|
|
|
|
sealed trait SessionState
|
|
final case class New() extends SessionState
|
|
final case class Related() extends SessionState
|
|
final case class Handshaking() extends SessionState
|
|
final case class Established() extends SessionState
|
|
final case class Closing() extends SessionState
|
|
final case class Closed() extends SessionState
|
|
|
|
|
|
class Session(val sessionId : Long,
|
|
val socketAddress : InetSocketAddress,
|
|
returnActor : ActorRef,
|
|
sessionPipeline : List[SessionPipeline])
|
|
(implicit val context: ActorContext, implicit val self : ActorRef) {
|
|
|
|
var state : SessionState = New()
|
|
val sessionCreatedTime : DateTime = DateTime.now
|
|
var sessionEndedTime : DateTime = DateTime.now
|
|
|
|
val pipeline = sessionPipeline.map { actor =>
|
|
val a = context.actorOf(actor.props, actor.nameTemplate + sessionId.toString)
|
|
context.watch(a)
|
|
a
|
|
}
|
|
|
|
pipeline.head ! HelloFriend(sessionId, pipeline.tail.head)
|
|
|
|
// statistics
|
|
var bytesSent : Long = 0
|
|
var bytesReceived : Long = 0
|
|
var inboundPackets : Long = 0
|
|
var outboundPackets : Long = 0
|
|
|
|
var lastInboundEvent : Long = System.nanoTime()
|
|
var lastOutboundEvent : Long = System.nanoTime()
|
|
|
|
var inboundPacketRate : Double = 0.0
|
|
var outboundPacketRate : Double = 0.0
|
|
var inboundBytesPerSecond : Double = 0.0
|
|
var outboundBytesPerSecond : Double = 0.0
|
|
|
|
def receive(packet : RawPacket) : Unit = {
|
|
bytesReceived += packet.data.size
|
|
inboundPackets += 1
|
|
lastInboundEvent = System.nanoTime()
|
|
|
|
pipeline.head !> packet
|
|
}
|
|
|
|
def send(packet : ByteVector) : Unit = {
|
|
bytesSent += packet.size
|
|
outboundPackets += 1
|
|
lastOutboundEvent = System.nanoTime()
|
|
|
|
returnActor ! SendPacket(packet, socketAddress)
|
|
}
|
|
|
|
def dropSession(graceful : Boolean) = {
|
|
pipeline.foreach(context.unwatch)
|
|
pipeline.foreach(_ ! PoisonPill)
|
|
|
|
sessionEndedTime = DateTime.now
|
|
setState(Closed())
|
|
}
|
|
|
|
def getState = state
|
|
|
|
def setState(newState : SessionState) : Unit = {
|
|
state = newState
|
|
}
|
|
def getPipeline : List[ActorRef] = pipeline
|
|
|
|
def getTotalBytes = {
|
|
bytesSent + bytesReceived
|
|
}
|
|
|
|
def timeSinceLastInboundEvent = {
|
|
(System.nanoTime() - lastInboundEvent)/1000000
|
|
}
|
|
|
|
def timeSinceLastOutboundEvent = {
|
|
(System.nanoTime() - lastOutboundEvent)/1000000
|
|
}
|
|
|
|
|
|
override def toString : String = {
|
|
s"Session($sessionId, $getTotalBytes)"
|
|
}
|
|
}
|