mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-01-19 18:44:45 +00:00
This removes roughly 1k LOC from WorldSessionActor and moves them to a new ChatActor. That was the initial goal anyway, but it wasn't that simple. There was no clear location to put this new actor, I didn't want to put it in pslogin since it isn't part of the "login server" (and neither is WSA). But since the new actor would have to talk to WSA and common does not depend on pslogin, I had a choice of putting more actors in pslogin or putting everything in common. I chose the latter. ChatActor and SessionActor (formerly WorldSessionActor) now live in `common/actors/session`. Since WSA also depends on other actors in pslogin, most of the pslogin code was moved to either common/login or common/util. PsLogin as the main entry point remains in pslogin since having the main code compile to a library has some advantages, and it will allow us to produce binaries for distinct login/world servers in the future if desired. For a second take, I'd suggest moving common to /src in the root directory. This change is enabled by a new immutable `Zone` object that is passed from SessionActor to ChatActor. Most of its members are still mutable references, and the code at the moment does depend on this being the case. Changes to the session object in SessionActor are forwarded through a SetZone message to ChatActor. As we split out more code into actors, we could use EventBus or typed Topic's instead. Also included is a reworked ChatService that was converted to a typed actor and uses the built-in Receptionist facility for service discovery. By receiving the session object from ChatActor, it can be much smarter about who to send messages to, rather than sending all messages to everyone and having them figure it out. But as this session object is not updated, it can only use static properties like player name and faction and not fluid properties like position. The following chat commands were added: command, note, gmbroadcast, [nc|tr|vs|broadcast, gmtell, gmpopup and !whitetext
146 lines
6.8 KiB
Scala
146 lines
6.8 KiB
Scala
import xerial.sbt.pack.PackPlugin._
|
|
|
|
lazy val commonSettings = Seq(
|
|
organization := "net.psforever",
|
|
version := "1.0.2-SNAPSHOT",
|
|
scalaVersion := "2.13.2",
|
|
Global / cancelable := false,
|
|
semanticdbEnabled := true,
|
|
semanticdbVersion := scalafixSemanticdb.revision,
|
|
scalacOptions := Seq(
|
|
"-unchecked",
|
|
"-feature",
|
|
"-deprecation",
|
|
"-encoding",
|
|
"utf8",
|
|
"-language:postfixOps",
|
|
"-Wunused:imports",
|
|
"-Xmacro-settings:materialize-derivations"
|
|
),
|
|
// Quiet test options
|
|
// https://github.com/etorreborre/specs2/blob/8305db76c5084e4b3ce5827ce23117f6fb6beee4/common/shared/src/main/scala/org/specs2/main/Report.scala#L94
|
|
// https://etorreborre.github.io/specs2/guide/SPECS2-2.4.17/org.specs2.guide.Runners.html
|
|
testOptions in QuietTest += Tests.Argument(TestFrameworks.Specs2, "showOnly", "x!"),
|
|
// http://www.scalatest.org/user_guide/using_the_runner
|
|
testOptions in QuietTest += Tests.Argument(TestFrameworks.ScalaTest, "-oCEHILMNOPQRX"),
|
|
// Trick taken from https://groups.google.com/d/msg/scala-user/mxV9ok7J_Eg/kt-LnsrD0bkJ
|
|
// scaladoc flags: https://github.com/scala/scala/blob/2.11.x/src/scaladoc/scala/tools/nsc/doc/Settings.scala
|
|
scalacOptions in (Compile, doc) ++= Seq(
|
|
"-groups",
|
|
"-implicits",
|
|
"-doc-title",
|
|
"PSF-LoginServer - ",
|
|
"-doc-version",
|
|
"master",
|
|
"-doc-footer",
|
|
"Copyright PSForever",
|
|
// For non unidoc builds, you may need bd.getName before the template parameter
|
|
"-doc-source-url",
|
|
"https://github.com/psforever/PSF-LoginServer/blob/master/€{FILE_PATH}.scala",
|
|
"-sourcepath",
|
|
baseDirectory.value.getAbsolutePath // needed for scaladoc relative source paths
|
|
),
|
|
classLoaderLayeringStrategy := ClassLoaderLayeringStrategy.Flat,
|
|
resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots",
|
|
libraryDependencies ++= Seq(
|
|
"com.typesafe.akka" %% "akka-actor" % "2.6.6",
|
|
"com.typesafe.akka" %% "akka-slf4j" % "2.6.6",
|
|
"com.typesafe.akka" %% "akka-protobuf-v3" % "2.6.6",
|
|
"com.typesafe.akka" %% "akka-stream" % "2.6.6",
|
|
"com.typesafe.akka" %% "akka-testkit" % "2.6.6" % "test",
|
|
"com.typesafe.akka" %% "akka-actor-typed" % "2.6.6",
|
|
"com.typesafe.akka" %% "akka-cluster-typed" % "2.6.6",
|
|
"com.typesafe.scala-logging" %% "scala-logging" % "3.9.2",
|
|
"org.specs2" %% "specs2-core" % "4.9.4" % "test",
|
|
"org.scalatest" %% "scalatest" % "3.1.2" % "test",
|
|
"org.scodec" %% "scodec-core" % "1.11.7",
|
|
"net.java.dev.jna" % "jna" % "5.5.0",
|
|
"com.typesafe.akka" %% "akka-slf4j" % "2.6.5",
|
|
"ch.qos.logback" % "logback-classic" % "1.2.3",
|
|
"org.log4s" %% "log4s" % "1.8.2",
|
|
"org.fusesource.jansi" % "jansi" % "1.12",
|
|
"org.scoverage" %% "scalac-scoverage-plugin" % "1.4.1",
|
|
"com.github.nscala-time" %% "nscala-time" % "2.24.0",
|
|
"com.github.t3hnar" %% "scala-bcrypt" % "4.1",
|
|
"org.scala-graph" %% "graph-core" % "1.13.1",
|
|
"io.kamon" %% "kamon-bundle" % "2.1.0",
|
|
"io.kamon" %% "kamon-apm-reporter" % "2.1.0",
|
|
"org.json4s" %% "json4s-native" % "3.6.8",
|
|
"com.typesafe.akka" %% "akka-stream" % "2.6.5",
|
|
"io.getquill" %% "quill-jasync-postgres" % "3.5.2",
|
|
"org.flywaydb" % "flyway-core" % "6.5.0",
|
|
"org.postgresql" % "postgresql" % "42.2.14",
|
|
"com.typesafe" % "config" % "1.4.0",
|
|
"com.github.pureconfig" %% "pureconfig" % "0.13.0",
|
|
"com.beachape" %% "enumeratum" % "1.6.1",
|
|
"joda-time" % "joda-time" % "2.10.6",
|
|
"commons-io" % "commons-io" % "2.6",
|
|
"com.github.scopt" %% "scopt" % "4.0.0-RC2"
|
|
)
|
|
)
|
|
|
|
lazy val pscryptoSettings = Seq(
|
|
unmanagedClasspath in Test += (baseDirectory in ThisBuild).value / "pscrypto-lib",
|
|
unmanagedClasspath in Runtime += (baseDirectory in ThisBuild).value / "pscrypto-lib",
|
|
unmanagedClasspath in Compile += (baseDirectory in ThisBuild).value / "pscrypto-lib"
|
|
)
|
|
|
|
lazy val psloginPackSettings = Seq(
|
|
packMain := Map("ps-login" -> "net.psforever.pslogin.PsLogin"),
|
|
packArchivePrefix := "pslogin",
|
|
packExtraClasspath := Map("ps-login" -> Seq("${PROG_HOME}/pscrypto-lib", "${PROG_HOME}/config")),
|
|
packResourceDir += (baseDirectory.value / "pscrypto-lib" -> "pscrypto-lib"),
|
|
packResourceDir += (baseDirectory.value / "config" -> "config"),
|
|
packResourceDir += (baseDirectory.value / "pslogin/src/main/resources" -> "config")
|
|
)
|
|
|
|
lazy val root = (project in file("."))
|
|
.configs(QuietTest)
|
|
.enablePlugins(PackPlugin)
|
|
.settings(commonSettings: _*)
|
|
.settings(psloginPackSettings: _*)
|
|
.enablePlugins(ScalaUnidocPlugin)
|
|
.aggregate(pslogin, common)
|
|
.dependsOn(pslogin, common)
|
|
|
|
lazy val pslogin = (project in file("pslogin"))
|
|
.configs(QuietTest)
|
|
.settings(commonSettings: _*)
|
|
.settings(
|
|
name := "pslogin",
|
|
// ActorTests have specific timing requirements and will be flaky if run in parallel
|
|
parallelExecution in Test := false,
|
|
// TODO(chord): remove exclusion when WorldSessionActor is refactored: https://github.com/psforever/PSF-LoginServer/issues/279
|
|
coverageExcludedPackages := "net.psforever.actors.session.SessionActor.*;net.psforever.zones.zonemaps.*",
|
|
// Copy all tests from Test -> QuietTest (we're only changing the run options)
|
|
inConfig(QuietTest)(Defaults.testTasks)
|
|
)
|
|
.settings(pscryptoSettings: _*)
|
|
.dependsOn(common)
|
|
|
|
lazy val common = (project in file("common"))
|
|
.configs(QuietTest)
|
|
.settings(commonSettings: _*)
|
|
.settings(
|
|
name := "common",
|
|
// Copy all tests from Test -> QuietTest (we're only changing the run options)
|
|
inConfig(QuietTest)(Defaults.testTasks)
|
|
)
|
|
.settings(pscryptoSettings: _*)
|
|
|
|
lazy val decodePackets = (project in file("tools/decode-packets"))
|
|
.enablePlugins(PackPlugin)
|
|
.settings(commonSettings: _*)
|
|
.settings(decodePacketsPackSettings: _*)
|
|
.settings(
|
|
libraryDependencies ++= Seq(
|
|
"org.scala-lang.modules" %% "scala-parallel-collections" % "0.2.0"
|
|
)
|
|
)
|
|
.dependsOn(common)
|
|
|
|
lazy val decodePacketsPackSettings = Seq(packMain := Map("psf-decode-packets" -> "DecodePackets"))
|
|
|
|
// Special test configuration for really quiet tests (used in CI)
|
|
lazy val QuietTest = config("quiet") extend (Test)
|