2020-01-13 22:59:24 +00:00
|
|
|
import xerial.sbt.pack.PackPlugin._
|
|
|
|
|
|
2016-02-05 08:19:13 +00:00
|
|
|
lazy val commonSettings = Seq(
|
2016-05-03 08:04:36 +00:00
|
|
|
organization := "net.psforever",
|
2016-08-05 22:11:46 +00:00
|
|
|
version := "1.0.2-SNAPSHOT",
|
2020-05-26 20:16:22 +00:00
|
|
|
scalaVersion := "2.13.2",
|
ChatActor
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
2020-07-11 10:50:29 +00:00
|
|
|
Global / cancelable := false,
|
2020-07-14 03:54:05 +00:00
|
|
|
semanticdbEnabled := true,
|
|
|
|
|
semanticdbVersion := scalafixSemanticdb.revision,
|
|
|
|
|
scalacOptions := Seq(
|
|
|
|
|
"-unchecked",
|
|
|
|
|
"-feature",
|
|
|
|
|
"-deprecation",
|
|
|
|
|
"-encoding",
|
|
|
|
|
"utf8",
|
|
|
|
|
"-language:postfixOps",
|
|
|
|
|
"-Wunused:imports",
|
|
|
|
|
"-Xmacro-settings:materialize-derivations"
|
|
|
|
|
),
|
2020-01-08 13:33:25 +00:00
|
|
|
// 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"),
|
2019-10-21 20:29:36 +00:00
|
|
|
// Trick taken from https://groups.google.com/d/msg/scala-user/mxV9ok7J_Eg/kt-LnsrD0bkJ
|
2020-01-08 13:33:25 +00:00
|
|
|
// scaladoc flags: https://github.com/scala/scala/blob/2.11.x/src/scaladoc/scala/tools/nsc/doc/Settings.scala
|
2020-07-14 03:54:05 +00:00
|
|
|
scalacOptions in (Compile, doc) ++= Seq(
|
2019-10-21 20:29:36 +00:00
|
|
|
"-groups",
|
|
|
|
|
"-implicits",
|
2020-07-14 03:54:05 +00:00
|
|
|
"-doc-title",
|
|
|
|
|
"PSF-LoginServer - ",
|
|
|
|
|
"-doc-version",
|
|
|
|
|
"master",
|
|
|
|
|
"-doc-footer",
|
|
|
|
|
"Copyright PSForever",
|
2019-10-21 20:29:36 +00:00
|
|
|
// For non unidoc builds, you may need bd.getName before the template parameter
|
2020-07-14 03:54:05 +00:00
|
|
|
"-doc-source-url",
|
|
|
|
|
"https://github.com/psforever/PSF-LoginServer/blob/master/€{FILE_PATH}.scala",
|
|
|
|
|
"-sourcepath",
|
|
|
|
|
baseDirectory.value.getAbsolutePath // needed for scaladoc relative source paths
|
|
|
|
|
),
|
2020-05-11 13:24:10 +00:00
|
|
|
classLoaderLayeringStrategy := ClassLoaderLayeringStrategy.Flat,
|
2016-02-05 08:19:13 +00:00
|
|
|
resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots",
|
2016-07-27 02:31:54 +00:00
|
|
|
libraryDependencies ++= Seq(
|
2020-07-14 03:54:05 +00:00
|
|
|
"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",
|
2020-05-26 20:16:22 +00:00
|
|
|
"org.scoverage" %% "scalac-scoverage-plugin" % "1.4.1",
|
2020-07-14 03:54:05 +00:00
|
|
|
"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",
|
2020-07-14 17:07:14 +00:00
|
|
|
"commons-io" % "commons-io" % "2.6",
|
2020-07-22 17:50:17 +00:00
|
|
|
"com.github.scopt" %% "scopt" % "4.0.0-RC2",
|
|
|
|
|
"io.sentry" % "sentry-logback" % "1.7.30"
|
Let's Move Item, Together, Again (#445)
* mix-in code for akka messaging move item, currently testing on infantry only
* adjusted structure of COntainable so callbacks are separate from message-producing functions, are separate from message-sending functionality; massaged LockerContainer until it could support control agency and created a wrapper for its Equipment interfacing; the control structure starts and stops when PlayerControl starts and stops, and it converts whenever necessary
* added failsafe conditions to Containable, such as blocking certain messages while completing a MoveItem call, or blocking all messages to reset disruptive MoveItem calls; depiction message callbacks for Player, Locker, and Vehicle, to properly depict the manipulation of items; eliminated the old code from WSA
* added useful comments to Containable; moved functionality for deployables, and for container'ing, and dropping logic out from WSA and distributed it appropriately
* handling terminal operations - buying an exosuit and selecting an infantry loadout; starting work on support for more persistent equipment timers local to the avatar (that were removed in this update; see wsa changes)
* linked terminal page/message with routing policy
* tuning vehicle loadout management and display
* separated use time from purchase time and applied a system that limits either if that same event would recur too soon; tuning exosuit and loadout changes
* some ask timeout handling and comments
* normalizing item on ground interactions
* rearranging the project structure
* merged with master; commas removed
* fixing tests
* added description strings to Tasks; adjusted the completion conditions for some Tasks
* a failed purchase will not block future purchases; increased timeout on move-item tasks
* corpses, even one's own, should have properly moveable inventories
* for better persistence, until GlobalDefinitions is renovated, moved the object id->name map onto the avatar object, for the purpose of timers; replaced a use of values in GridInventory for a map conversion
* max loadouts and max exosuit switch use same cooldown now; hopefully better clarifcation regarding held arm position
* manual merge-rebase of master with hand reconstruction of WorldSessionActor and PlayerControl, and variations for other files necessary to maintain both inventory operations and login reliability
* test fixes; MAX exo-suit cooldown is now five minutes again
2020-06-04 20:39:08 +00:00
|
|
|
)
|
2016-02-05 08:19:13 +00:00
|
|
|
)
|
|
|
|
|
|
2016-07-25 22:34:40 +00:00
|
|
|
lazy val pscryptoSettings = Seq(
|
2016-07-27 01:32:31 +00:00
|
|
|
unmanagedClasspath in Test += (baseDirectory in ThisBuild).value / "pscrypto-lib",
|
2016-08-27 03:46:57 +00:00
|
|
|
unmanagedClasspath in Runtime += (baseDirectory in ThisBuild).value / "pscrypto-lib",
|
|
|
|
|
unmanagedClasspath in Compile += (baseDirectory in ThisBuild).value / "pscrypto-lib"
|
2016-07-27 01:32:31 +00:00
|
|
|
)
|
|
|
|
|
|
2020-01-13 22:59:24 +00:00
|
|
|
lazy val psloginPackSettings = Seq(
|
2020-07-23 18:23:11 +00:00
|
|
|
packMain := Map("ps-login" -> "net.psforever.pslogin.PsLogin"),
|
2016-07-27 01:32:31 +00:00
|
|
|
packArchivePrefix := "pslogin",
|
2020-07-22 17:50:17 +00:00
|
|
|
packJvmOpts := Map("ps-login" -> Seq("-Dstacktrace.app.packages=net.psforever")),
|
2020-07-14 03:54:05 +00:00
|
|
|
packExtraClasspath := Map("ps-login" -> Seq("${PROG_HOME}/pscrypto-lib", "${PROG_HOME}/config")),
|
2020-07-22 15:28:09 +00:00
|
|
|
packResourceDir += (baseDirectory.value / "pscrypto-lib" -> "pscrypto-lib"),
|
|
|
|
|
packResourceDir += (baseDirectory.value / "config" -> "config")
|
2016-07-25 22:34:40 +00:00
|
|
|
)
|
|
|
|
|
|
2020-07-14 03:54:05 +00:00
|
|
|
lazy val root = (project in file("."))
|
|
|
|
|
.configs(QuietTest)
|
|
|
|
|
.enablePlugins(PackPlugin)
|
|
|
|
|
.settings(commonSettings: _*)
|
|
|
|
|
.settings(psloginPackSettings: _*)
|
|
|
|
|
.enablePlugins(ScalaUnidocPlugin)
|
|
|
|
|
.aggregate(pslogin, common)
|
2020-07-23 18:23:11 +00:00
|
|
|
.dependsOn(pslogin, common)
|
2016-02-05 08:19:13 +00:00
|
|
|
|
2020-07-14 03:54:05 +00:00
|
|
|
lazy val pslogin = (project in file("pslogin"))
|
|
|
|
|
.configs(QuietTest)
|
|
|
|
|
.settings(commonSettings: _*)
|
|
|
|
|
.settings(
|
2019-10-22 18:35:17 +00:00
|
|
|
name := "pslogin",
|
|
|
|
|
// ActorTests have specific timing requirements and will be flaky if run in parallel
|
2019-12-13 18:48:15 +00:00
|
|
|
parallelExecution in Test := false,
|
|
|
|
|
// TODO(chord): remove exclusion when WorldSessionActor is refactored: https://github.com/psforever/PSF-LoginServer/issues/279
|
ChatActor
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
2020-07-11 10:50:29 +00:00
|
|
|
coverageExcludedPackages := "net.psforever.actors.session.SessionActor.*;net.psforever.zones.zonemaps.*",
|
2020-01-08 13:33:25 +00:00
|
|
|
// Copy all tests from Test -> QuietTest (we're only changing the run options)
|
|
|
|
|
inConfig(QuietTest)(Defaults.testTasks)
|
2020-07-14 03:54:05 +00:00
|
|
|
)
|
|
|
|
|
.settings(pscryptoSettings: _*)
|
|
|
|
|
.dependsOn(common)
|
2016-02-05 08:19:13 +00:00
|
|
|
|
2020-07-14 03:54:05 +00:00
|
|
|
lazy val common = (project in file("common"))
|
|
|
|
|
.configs(QuietTest)
|
|
|
|
|
.settings(commonSettings: _*)
|
|
|
|
|
.settings(
|
2020-01-08 13:33:25 +00:00
|
|
|
name := "common",
|
|
|
|
|
// Copy all tests from Test -> QuietTest (we're only changing the run options)
|
|
|
|
|
inConfig(QuietTest)(Defaults.testTasks)
|
2020-07-14 03:54:05 +00:00
|
|
|
)
|
|
|
|
|
.settings(pscryptoSettings: _*)
|
2020-01-08 13:33:25 +00:00
|
|
|
|
2020-07-14 03:54:05 +00:00
|
|
|
lazy val decodePackets = (project in file("tools/decode-packets"))
|
|
|
|
|
.enablePlugins(PackPlugin)
|
|
|
|
|
.settings(commonSettings: _*)
|
|
|
|
|
.settings(decodePacketsPackSettings: _*)
|
|
|
|
|
.settings(
|
2020-06-05 20:02:01 +00:00
|
|
|
libraryDependencies ++= Seq(
|
2020-07-14 17:07:14 +00:00
|
|
|
"org.scala-lang.modules" %% "scala-parallel-collections" % "0.2.0"
|
2020-06-05 20:02:01 +00:00
|
|
|
)
|
2020-07-14 03:54:05 +00:00
|
|
|
)
|
|
|
|
|
.dependsOn(common)
|
2020-06-05 20:02:01 +00:00
|
|
|
|
2020-07-14 03:54:05 +00:00
|
|
|
lazy val decodePacketsPackSettings = Seq(packMain := Map("psf-decode-packets" -> "DecodePackets"))
|
2020-06-09 22:32:02 +00:00
|
|
|
|
2020-01-08 13:33:25 +00:00
|
|
|
// Special test configuration for really quiet tests (used in CI)
|
2020-07-22 15:28:09 +00:00
|
|
|
lazy val QuietTest = config("quiet") extend Test
|