change build toolchain to sbt

This commit is contained in:
A.C.Sukazyo Eyre 2023-12-11 20:35:39 +08:00
parent 961edd93f3
commit ac828d777d
Signed by: Eyre_S
GPG Key ID: C17CE40291207874
20 changed files with 244 additions and 605 deletions

7
.gitignore vendored
View File

@ -4,14 +4,15 @@
.vscode/ .vscode/
.gradle/ .gradle/
.settings/ .settings/
.metals/
.bloop/
.bsp/
#build #build
/build/ /build/
/bin/ /bin/
/out/ /out/
.metals/ /target
.bloop/
.project
lcoal.properties lcoal.properties
# debug dir # debug dir

View File

@ -1,18 +1,19 @@
FROM eclipse-temurin:20-jdk as build FROM sbtscala/scala-sbt:eclipse-temurin-jammy-21.0.1_12_1.9.7_3.3.1 as build
LABEL authors="A.C.Sukazyo Eyre" LABEL authors="A.C.Sukazyo Eyre"
COPY . /app/source/ COPY . /app/source/
WORKDIR /app WORKDIR /app
ARG DOCKER_BUILD=yes
RUN cd ./source \ RUN cd ./source \
&& ./gradlew shadowJar -PdockerBuild \ && sbt assembly \
&& cd .. \ && cd .. \
&& cp ./source/build/libs/morny-coeur-docker-build.jar ./morny-coeur.jar && cp ./source/target/morny-coeur-docker-build.jar ./morny-coeur.jar
#&& rm -r ./source \ #&& rm -r ./source \
#&& rm -r /root/.gradle \ #&& rm -r /root/.gradle \
FROM eclipse-temurin:20-jre FROM eclipse-temurin:21-jre
COPY --from=build /app/morny-coeur.jar /app/morny-coeur.jar COPY --from=build /app/morny-coeur.jar /app/morny-coeur.jar
WORKDIR /app WORKDIR /app

View File

@ -1,249 +0,0 @@
plugins {
id 'scala'
id 'java-library'
id 'application'
id 'maven-publish'
id "io.github.ysohda.scalatest" version "0.32.1"
id 'com.github.johnrengelman.shadow' version '8.1.1'
id 'com.github.gmazzo.buildconfig' version '4.1.2'
id 'org.ajoberstar.grgit' version '5.2.0'
}
import org.ajoberstar.grgit.Status
import java.nio.charset.Charset
import java.nio.charset.StandardCharsets
final boolean proj_git = grgit != null
final String proj_store = MORNY_CODE_STORE
final String proj_commit = proj_git ? grgit.head().id : null
final String proj_commit_path = MORNY_COMMIT_PATH
final boolean proj_clean = isCleanBuild()
if (!proj_git)
println "[MornyBuild] git repository not available for current working space! git version tag will be disabled."
else if (isCleanBuild()) {
println "git: clean build at ${grgit.head().id}"
}
else {
final Status status = grgit.status()
println "git: non-clean-build"
if (!status.unstaged.allChanges.empty) {
println "git: unstaged changes"
listChanges(status.unstaged)
}
if (!status.staged.allChanges.empty) {
println "git: staged changes"
listChanges(status.staged)
}
}
final String proj_group = 'cc.sukazyo'
final String proj_package = "${proj_group}.cono.morny"
final String proj_archive_name = MORNY_ARCHIVE_NAME
final String proj_application_main = "${proj_package}.ServerMain"
final String proj_version_base = VERSION
final String proj_version_delta = VERSION_DELTA
final boolean proj_version_use_delta = Boolean.parseBoolean(USE_DELTA)
final String proj_version = proj_version_base + (proj_version_use_delta ? "-δ${proj_version_delta}" : "")
final String proj_version_full = proj_version + (proj_git ?
"+git.${proj_commit.substring(0, 8)}" + (proj_clean ? "" : ".δ") : "")
final String proj_version_codename = CODENAME
final long proj_code_time = proj_clean ? grgit.head().dateTime.toInstant().toEpochMilli() : System.currentTimeMillis()
final JavaVersion proj_java = JavaVersion.VERSION_17
final Charset proj_file_encoding = StandardCharsets.UTF_8
final proj_scala_api = 3
//final proj_scala_lib = proj_scala_api+'.4.0-RC1-bin-20230901-89e8dba-NIGHTLY'
final proj_scala_lib = proj_scala_api + '.3.1'
String publish_local_url = null
String publish_remote_url = null
String publish_remote_username = null
String publish_remote_password = null
if (project.hasProperty("publishLocalArchiveRepoUrl")) publish_local_url = publishLocalArchiveRepoUrl
if (project.hasProperty("publishMvnRepoUrl")) {
publish_remote_url = publishMvnRepoUrl
publish_remote_username = publishMvnRepoUsername
publish_remote_password = publishMvnRepoPassword
}
group proj_group
version proj_version_full
repositories {
mavenCentral()
maven { name '-ws'; url 'https://mvn.sukazyo.cc/releases' }
}
dependencies {
api group: 'org.scala-lang', name: 'scala3-library_3', version: proj_scala_lib
final scala = (String name) -> "${name}_$proj_scala_api"
compileOnlyApi group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: lib_spotbugs_v
implementation group: 'cc.sukazyo', name: 'messiva', version: lib_messiva_v
implementation group: 'cc.sukazyo', name: 'resource-tools', version: lib_resourcetools_v
implementation group: 'com.github.pengrad', name: 'java-telegram-bot-api', version: lib_javatelegramapi_v
implementation group: 'com.softwaremill.sttp.client3', name: scala('core'), version: lib_sttp_v
implementation group: 'com.softwaremill.sttp.client3', name: scala('okhttp-backend'), version: lib_sttp_v
runtimeOnly group: 'com.squareup.okhttp3', name: 'okhttp', version: lib_okhttp_v
implementation group: 'com.google.code.gson', name: 'gson', version: lib_gson_v
implementation group: 'io.circe', name: scala('circe-core'), version: lib_circe_v
implementation group: 'io.circe', name: scala('circe-generic'), version: lib_circe_v
implementation group: 'io.circe', name: scala('circe-parser'), version: lib_circe_v
implementation group: 'org.jsoup', name: 'jsoup', version: '1.16.2'
implementation group: 'com.cronutils', name: 'cron-utils', version: lib_cron_utils_v
// used for disable slf4j
// due to the slf4j api have been used in the following libraries:
// - cron-utils
runtimeOnly group: 'org.slf4j', name: 'slf4j-nop', version: lib_slf4j_v
testRuntimeOnly group: 'org.slf4j', name: 'slf4j-nop', version: lib_slf4j_v
testImplementation group: 'cc.sukazyo', name: 'resource-tools', version: lib_resourcetools_v
testImplementation group: 'org.scalatest', name: scala('scalatest'), version: lib_scalatest_v
testImplementation group: 'org.scalatest', name: scala('scalatest-freespec'), version: lib_scalatest_v
testRuntimeOnly group: 'org.scala-lang.modules', name: scala('scala-xml'), version: lib_scalamodule_xml_v
// for generating HTML report: required by gradle-scalatest plugin
testRuntimeOnly group: 'com.vladsch.flexmark', name: 'flexmark-all', version: '0.64.6'
}
java {
withSourcesJar()
}
sourceSets {
main {
java { destinationDirectory.set file("build/classes/main") }
scala { destinationDirectory.set file("build/classes/main") }
}
test {
java { destinationDirectory.set file("build/classes/test") }
scala { destinationDirectory.set file("build/classes/test") }
}
}
tasks.withType(JavaCompile).configureEach {
sourceCompatibility proj_java.getMajorVersion()
targetCompatibility proj_java.getMajorVersion()
options.encoding = proj_file_encoding.name()
}
tasks.withType(ScalaCompile).configureEach {
sourceCompatibility proj_java.getMajorVersion()
targetCompatibility proj_java.getMajorVersion()
scalaCompileOptions.additionalParameters.add "-language:postfixOps"
scalaCompileOptions.additionalParameters.addAll ("-Xmax-inlines", "256")
scalaCompileOptions.encoding = proj_file_encoding.name()
options.encoding = proj_file_encoding.name()
}
tasks.withType(Javadoc).configureEach {
options.encoding = proj_file_encoding.name()
}
//tasks.withType(ScalaDoc).configureEach {
//}
test {
}
application {
mainClass = proj_application_main
}
buildConfig {
packageName(proj_package)
buildConfigField('String', 'VERSION', "\"${proj_version}\"")
buildConfigField('String', 'VERSION_FULL', "\"${proj_version_full}\"")
buildConfigField('String', 'VERSION_BASE', "\"${proj_version_base}\"")
buildConfigField('String', 'VERSION_DELTA', proj_version_use_delta ? "\"${proj_version_delta}\"" : "null")
buildConfigField('String', 'CODENAME', "\"${proj_version_codename}\"")
buildConfigField('long', 'CODE_TIMESTAMP', "${proj_code_time}L")
buildConfigField('String', 'COMMIT', proj_git ? "\"${proj_commit}\"" : "null")
buildConfigField('boolean', 'CLEAN_BUILD', "${proj_clean}")
buildConfigField('String', 'CODE_STORE', proj_store == "" ? "null" : "\"${proj_store}\"")
buildConfigField('String', 'COMMIT_PATH', proj_commit_path == "" ? "null" : "\"${proj_commit_path}\"")
}
tasks.withType(Jar).configureEach {
archiveBaseName.set proj_archive_name
}
shadowJar {
archiveClassifier.set "fat"
if (project.hasProperty("dockerBuild")) {
println "shadow-jar: using docker build name"
archiveVersion.set ""
archiveClassifier.set "docker-build"
}
}
@SuppressWarnings('GrMethodMayBeStatic')
boolean isCleanBuild () {
if (grgit == null) return false
Set<String> changes = grgit.status().unstaged.allChanges + grgit.status().staged.allChanges
for (String file in changes) {
if (file.startsWith("src/")) return false
if (file == "build.gradle") return false
if (file == "gradle.properties") return false
}
return true
}
void listChanges (Status.Changes listing) {
for (String file in listing.added)
println " add: ${file}"
for (String file in listing.modified)
println " mod: ${file}"
for (String file in listing.removed)
println " del: ${file}"
}
publishing {
repositories {
if (publish_local_url != null) maven {
name 'archives'
url publish_local_url
}
if (publish_remote_url != null) maven {
name '-ws-'
url publish_remote_url
credentials {
username publish_remote_username
password publish_remote_password
}
}
}
publications {
//noinspection GroovyAssignabilityCheck
main(MavenPublication) {
//noinspection GroovyAssignabilityCheck
from components.java
//noinspection GroovyAssignabilityCheck
groupId = proj_group
//noinspection GroovyAssignabilityCheck
artifactId = proj_archive_name
//noinspection GroovyAssignabilityCheck
version = proj_version
}
}
}

78
build.sbt Normal file
View File

@ -0,0 +1,78 @@
ThisBuild / organization := "cc.sukazyo"
ThisBuild / organizationName := "A.C. Sukazyo Eyre"
ThisBuild / scalaVersion := "3.3.1"
resolvers ++= Seq(
"-ws-releases" at "https://mvn.sukazyo.cc/releases"
)
lazy val root = (project in file("."))
.enablePlugins(BuildInfoPlugin)
.settings(
name := "Coeur Morny Cono",
version := MornyProject.version,
crossPaths := false,
moduleName := MornyProject.app_archive_name,
Compile / packageDoc / publishArtifact := false,
artifactName := {(sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
val classifier = artifact.classifier match {
case Some(value) => s"-$value"
case None => ""
}
s"${module.name}-${MornyProject.version_full}$classifier.${artifact.extension}"
},
Compile / mainClass := Some(MornyProject.app_application_main),
libraryDependencies ++= MornyProject.dependencies,
buildInfoPackage := MornyProject.app_package,
buildInfoObject := "BuildConfig",
buildInfoKeys ++= Seq(
BuildInfoKey[String]("VERSION", MornyProject.version),
BuildInfoKey[String]("VERSION_FULL", MornyProject.version_full),
BuildInfoKey[String]("VERSION_BASE", MornyProject.version_base),
BuildInfoKey[Option[String]]("VERSION_DELTA", MornyProject.version_delta),
BuildInfoKey[String]("CODENAME", MornyProject.version_codename),
BuildInfoKey.action[Long]("CODE_TIMESTAMP") { MornyProject.code_time },
BuildInfoKey.action[String]("COMMIT") { MornyProject.git_commit },
BuildInfoKey.action[Boolean]("CLEAN_BUILD") { MornyProject.git_is_clean },
BuildInfoKey[String]("CODE_STORE", MornyProject.git_store),
BuildInfoKey[String]("COMMIT_PATH", MornyProject.git_store_path),
),
scalacOptions ++= Seq(
"-language:postfixOps",
"-encoding", MornyProject.source_encoding
),
javacOptions ++= Seq(
"-encoding", MornyProject.source_encoding,
"-source", "17",
"-target", "17"
),
assemblyMergeStrategy := {
case module if module endsWith "module-info.class" => MergeStrategy.concat
case module_kt if module_kt endsWith ".kotlin_module" => MergeStrategy.concat
case x =>
val oldStrategy = (ThisBuild / assemblyMergeStrategy).value
oldStrategy(x)
},
assembly / artifact := (assembly / artifact).value
.withClassifier(Some("fat")),
addArtifact(assembly / artifact, assembly),
if (System.getenv("DOCKER_BUILD") != null) {
assembly / assemblyJarName := {
sLog.value info "environment DOCKER_BUILD checked"
sLog.value info "assembly will output for docker build (morny-coeur-docker-build.jar)"
"morny-coeur-docker-build.jar"
}
} else Nil,
publishTo := MornyProject.publishTo,
credentials ++= MornyProject.publishCredentials,
)

View File

@ -1,32 +0,0 @@
## Core
MORNY_ARCHIVE_NAME = morny-coeur
MORNY_CODE_STORE = https://github.com/Eyre-S/Coeur-Morny-Cono
MORNY_COMMIT_PATH = https://github.com/Eyre-S/Coeur-Morny-Cono/commit/%s
VERSION = 1.3.0
USE_DELTA = false
VERSION_DELTA =
CODENAME = guanggu
# dependencies
lib_spotbugs_v = 4.7.3
lib_scalamodule_xml_v = 2.2.0
lib_messiva_v = 0.2.0
lib_resourcetools_v = 0.2.2
lib_slf4j_v = 2.0.9
lib_javatelegramapi_v = 6.2.0
lib_sttp_v = 3.9.0
lib_okhttp_v = 4.11.0
lib_gson_v = 2.10.1
lib_circe_v = 0.14.6
lib_cron_utils_v = 9.2.0
lib_scalatest_v = 3.2.17

Binary file not shown.

View File

@ -1,5 +0,0 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

185
gradlew vendored
View File

@ -1,185 +0,0 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MSYS* | MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

89
gradlew.bat vendored
View File

@ -1,89 +0,0 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

3
project/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/target
/project
metals.sbt

View File

@ -0,0 +1,62 @@
import sbt.*
//noinspection TypeAnnotation
object MornyConfiguration {
val MORNY_ARCHIVE_NAME = "morny-coeur"
val MORNY_CODE_STORE = "https://github.com/Eyre-S/Coeur-Morny-Cono"
val MORNY_COMMIT_PATH = "https://github.com/Eyre-S/Coeur-Morny-Cono/commit/%s"
val VERSION = "2.0.0-alpha1"
val VERSION_DELTA: Option[String] = None
val CODENAME = "guanggu"
val SNAPSHOT = true
val dependencies = Seq(
"com.github.spotbugs" % "spotbugs-annotations" % "4.7.3" % Compile,
"cc.sukazyo" % "messiva" % "0.2.0",
"cc.sukazyo" % "resource-tools" % "0.2.2",
"com.github.pengrad" % "java-telegram-bot-api" % "6.2.0",
"com.softwaremill.sttp.client3" %% "core" % "3.9.0",
"com.softwaremill.sttp.client3" %% "okhttp-backend" % "3.9.0",
"com.squareup.okhttp3" % "okhttp" % "4.11.0" % Runtime,
"com.google.code.gson" % "gson" % "2.10.1",
"io.circe" %% "circe-core" % "0.14.6",
"io.circe" %% "circe-generic" % "0.14.6",
"io.circe" %% "circe-parser" % "0.14.6",
"org.jsoup" % "jsoup" % "1.16.2",
"com.cronutils" % "cron-utils" % "9.2.0",
// used for disable slf4j
// due to the slf4j api have been used in the following libraries:
// - cron-utils
"org.slf4j" % "slf4j-nop" % "2.0.9" % Runtime,
"org.scalatest" %% "scalatest" % "3.2.17" % Test,
"org.scalatest" %% "scalatest-freespec" % "3.2.17" % Test,
)
val publishTo: Some[Resolver] = {
//noinspection SimplifyBooleanMatch
SNAPSHOT match {
case true => Some("-ws-snapshots" at "https://mvn.sukazyo.cc/snapshots")
case false => Some("-ws-releases" at "https://mvn.sukazyo.cc/releases")
}
// Some(Resolver.file("build", file("./target/artifacts")))
// None
}
val publishCredentials: Seq[Credentials] = {
Seq(Credentials(Path.userHome / ".sbt" / ("workshop-mvn"+".credentials")))
// Nil
}
}

View File

@ -0,0 +1,53 @@
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.revwalk.RevWalk
import org.eclipse.jgit.storage.file.FileRepositoryBuilder
import java.io.File
//noinspection TypeAnnotation
object MornyProject {
val _git_repo = new FileRepositoryBuilder()
.setGitDir(new File(".git"))
.setWorkTree(new File(""))
.readEnvironment()
.build()
val _git = new Git(_git_repo)
def _git_head = _git_repo.resolve("HEAD")
def _git_head_commit = new RevWalk(_git_repo).parseCommit(_git_head)
val git_exists = true
val git_store = MornyConfiguration.MORNY_CODE_STORE
def git_commit = _git_head_commit.getName
def git_commit_time = _git_head_commit.getCommitTime*1000L
val git_store_path = MornyConfiguration.MORNY_COMMIT_PATH
// todo: is clean for project should only take care of app src and build src
def git_is_clean = _git.status.call.isClean
// todo: git status log
val app_group = "cc.sukazyo"
val app_package = s"$app_group.cono.morny"
val app_archive_name = MornyConfiguration.MORNY_ARCHIVE_NAME
val app_application_main = s"$app_package.ServerMain"
val version_base = MornyConfiguration.VERSION
val version_delta = MornyConfiguration.VERSION_DELTA
val version_is_snapshot = MornyConfiguration.SNAPSHOT
val version = Seq(
version_base,
version_delta match { case Some(value) => "δ" + value case None => null},
if (version_is_snapshot) "SNAPSHOT" else null
).filterNot(f => f == null).mkString("-")
def version_full = version + (if (!git_exists) "" else
s"+git${git_commit take 8}${if (git_is_clean) "" else ".δ"}")
val version_codename = MornyConfiguration.CODENAME
def code_time = if (git_is_clean) git_commit_time else System.currentTimeMillis
val dependencies = MornyConfiguration.dependencies
def publishTo = MornyConfiguration.publishTo
val publishCredentials = MornyConfiguration.publishCredentials
val source_encoding = "utf-8"
}

1
project/build.properties Normal file
View File

@ -0,0 +1 @@
sbt.version=1.9.4

3
project/plugins.sbt Normal file
View File

@ -0,0 +1,3 @@
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0")
addSbtPlugin("com.github.sbt" % "sbt-git" % "2.0.1")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.5")

View File

@ -1,2 +0,0 @@
rootProject.name = "Coeur Morny Cono"

View File

@ -2,6 +2,7 @@ package cc.sukazyo.cono.morny
import cc.sukazyo.cono.morny.internal.BuildConfigField import cc.sukazyo.cono.morny.internal.BuildConfigField
import cc.sukazyo.cono.morny.Log.{exceptionLog, logger} import cc.sukazyo.cono.morny.Log.{exceptionLog, logger}
import cc.sukazyo.cono.morny.util.EpochDateTime.EpochMillis
import cc.sukazyo.cono.morny.util.FileUtils import cc.sukazyo.cono.morny.util.FileUtils
import java.io.IOException import java.io.IOException
@ -13,24 +14,20 @@ object MornySystem {
@BuildConfigField val VERSION: String = BuildConfig.VERSION @BuildConfigField val VERSION: String = BuildConfig.VERSION
@BuildConfigField val VERSION_FULL: String = BuildConfig.VERSION_FULL @BuildConfigField val VERSION_FULL: String = BuildConfig.VERSION_FULL
@BuildConfigField val VERSION_BASE: String = BuildConfig.VERSION_BASE @BuildConfigField val VERSION_BASE: String = BuildConfig.VERSION_BASE
@BuildConfigField val VERSION_DELTA: String = BuildConfig.VERSION_DELTA @BuildConfigField val VERSION_DELTA: Option[String] = BuildConfig.VERSION_DELTA
@BuildConfigField val GIT_COMMIT: Option[String] = Some(BuildConfig.COMMIT)
@BuildConfigField val CODE_TIMESTAMP: EpochMillis = BuildConfig.CODE_TIMESTAMP
@BuildConfigField val CODENAME: String = BuildConfig.CODENAME @BuildConfigField val CODENAME: String = BuildConfig.CODENAME
@BuildConfigField val CODE_STORE: String = BuildConfig.CODE_STORE @BuildConfigField val CODE_STORE: String = BuildConfig.CODE_STORE
//noinspection ScalaWeakerAccess //noinspection ScalaWeakerAccess
@BuildConfigField val COMMIT_PATH: String = BuildConfig.COMMIT_PATH @BuildConfigField val COMMIT_PATH: String = BuildConfig.COMMIT_PATH
@BuildConfigField
def isUseDelta: Boolean = VERSION_DELTA ne null
@BuildConfigField
def isGitBuild: Boolean = BuildConfig.COMMIT ne null
@BuildConfigField @BuildConfigField
def isCleanBuild: Boolean = BuildConfig.CLEAN_BUILD def isCleanBuild: Boolean = BuildConfig.CLEAN_BUILD
def currentCodePath: String|Null = def currentCodePath: String|Null =
if ((COMMIT_PATH eq null) || (!isGitBuild)) null if ((COMMIT_PATH eq null) || (GIT_COMMIT isEmpty)) null
else COMMIT_PATH.formatted(BuildConfig.COMMIT) else COMMIT_PATH.formatted(GIT_COMMIT get)
def getJarMD5: String = { def getJarMD5: String = {
try { try {

View File

@ -94,7 +94,7 @@ object ServerMain {
/// ///
if (showHello) logger info MornyAbout.MORNY_PREVIEW_IMAGE_ASCII if (showHello) logger info MornyAbout.MORNY_PREVIEW_IMAGE_ASCII
if (mode_echoHello) return; if (mode_echoHello) return
if (unknownArgs.nonEmpty) logger warn if (unknownArgs.nonEmpty) logger warn
s"""Can't understand arg to some meaning s"""Can't understand arg to some meaning
@ -117,18 +117,18 @@ object ServerMain {
s"""Morny Cono Version s"""Morny Cono Version
|- version : |- version :
| Morny ${MornySystem.CODENAME toUpperCase} | Morny ${MornySystem.CODENAME toUpperCase}
| ${MornySystem.VERSION_BASE}${if (MornySystem.isUseDelta) "-δ"+MornySystem.VERSION_DELTA else ""} | ${MornySystem.VERSION_BASE}${MornySystem.VERSION_DELTA match{case Some(d) => "-δ" + d case None => ""}}
|- md5hash : |- md5hash :
| ${MornySystem.getJarMD5} | ${MornySystem.getJarMD5}
|- gitstat : |- gitstat :
|${ if (MornySystem.isGitBuild) { |${ MornySystem.GIT_COMMIT match { case Some(commit) =>
s""" on commit ${if (MornySystem.isCleanBuild) "- clean-build" else "<δ/non-clean-build>"} s""" on commit ${if (MornySystem.isCleanBuild) "- clean-build" else "<δ/non-clean-build>"}
| ${BuildConfig.COMMIT}""" | $commit"""
.stripMargin .stripMargin
} else " <non-git-build>"} case None => " <non-git-build>" }}
|- buildtd : |- buildtd :
| ${BuildConfig.CODE_TIMESTAMP} | ${MornySystem.CODE_TIMESTAMP}
| ${CommonFormat.formatDate(BuildConfig.CODE_TIMESTAMP, 0)} [UTC]""" | ${CommonFormat.formatDate(MornySystem.CODE_TIMESTAMP, 0)} [UTC]"""
.stripMargin .stripMargin
return return
@ -138,7 +138,7 @@ object ServerMain {
s"""ServerMain.java Loaded >>> s"""ServerMain.java Loaded >>>
|- version ${MornySystem.VERSION_FULL} |- version ${MornySystem.VERSION_FULL}
|- Morny ${MornySystem.CODENAME toUpperCase} |- Morny ${MornySystem.CODENAME toUpperCase}
|- <${MornySystem.getJarMD5}> [${BuildConfig.CODE_TIMESTAMP}]""".stripMargin |- <${MornySystem.getJarMD5}> [${MornySystem.CODE_TIMESTAMP}]""".stripMargin
// due to [[MornyFormatterConsole]] will use a localized time, it will output to the log // due to [[MornyFormatterConsole]] will use a localized time, it will output to the log
logger info s"logging time will use time-zone ${tz.getID} ($tz_offset)" logger info s"logging time will use time-zone ${tz.getID} ($tz_offset)"

View File

@ -1,6 +1,6 @@
package cc.sukazyo.cono.morny.bot.command package cc.sukazyo.cono.morny.bot.command
import cc.sukazyo.cono.morny.{BuildConfig, MornyCoeur, MornySystem} import cc.sukazyo.cono.morny.{MornyCoeur, MornySystem}
import cc.sukazyo.cono.morny.data.MornyInformation.* import cc.sukazyo.cono.morny.data.MornyInformation.*
import cc.sukazyo.cono.morny.data.TelegramStickers import cc.sukazyo.cono.morny.data.TelegramStickers
import cc.sukazyo.cono.morny.util.CommonFormat.{formatDate, formatDuration} import cc.sukazyo.cono.morny.util.CommonFormat.{formatDate, formatDuration}
@ -103,19 +103,19 @@ class MornyInformation (using coeur: MornyCoeur) extends ITelegramCommand {
} }
private[command] def echoVersion (using event: Update): Unit = { private[command] def echoVersion (using event: Update): Unit = {
val versionDeltaHTML = if (MornySystem.isUseDelta) s"-δ<code>${h(MornySystem.VERSION_DELTA)}</code>" else "" val versionDeltaHTML = MornySystem.VERSION_DELTA match {case Some(d) => s"-δ<code>${h(d)}</code>" case None => ""}
val versionGitHTML = if (MornySystem.isGitBuild) s"git $getVersionGitTagHTML" else "" val versionGitHTML = if (MornySystem.GIT_COMMIT nonEmpty) s"git $getVersionGitTagHTML" else ""
coeur.account exec new SendMessage( coeur.account exec new SendMessage(
event.message.chat.id, event.message.chat.id,
// language=html // language=html
s"""version: s"""version:
|- Morny <code>${h(MornySystem.CODENAME toUpperCase)}</code> |- Morny <code>${h(MornySystem.CODENAME toUpperCase)}</code>
|- <code>${h(MornySystem.VERSION_BASE)}</code>$versionDeltaHTML${if (MornySystem.isGitBuild) "\n- " + versionGitHTML else ""} |- <code>${h(MornySystem.VERSION_BASE)}</code>$versionDeltaHTML${if (MornySystem.GIT_COMMIT nonEmpty) "\n- " + versionGitHTML else ""}
|coeur md5_hash: |coeur md5_hash:
|- <code>${h(MornySystem.getJarMD5)}</code> |- <code>${h(MornySystem.getJarMD5)}</code>
|coding timestamp: |coding timestamp:
|- <code>${BuildConfig.CODE_TIMESTAMP}</code> |- <code>${MornySystem.CODE_TIMESTAMP}</code>
|- <code>${h(formatDate(BuildConfig.CODE_TIMESTAMP, 0))} [UTC]</code> |- <code>${h(formatDate(MornySystem.CODE_TIMESTAMP, 0))} [UTC]</code>
|""".stripMargin |""".stripMargin
).replyToMessageId(event.message.messageId).parseMode(ParseMode HTML) ).replyToMessageId(event.message.messageId).parseMode(ParseMode HTML)
} }
@ -137,8 +137,8 @@ class MornyInformation (using coeur: MornyCoeur) extends ITelegramCommand {
|coeur version: |coeur version:
|- $getVersionAllFullTagHTML |- $getVersionAllFullTagHTML
|- <code>${h(MornySystem.getJarMD5)}</code> |- <code>${h(MornySystem.getJarMD5)}</code>
|- <code>${h(formatDate(BuildConfig.CODE_TIMESTAMP, 0))} [UTC]</code> |- <code>${h(formatDate(MornySystem.CODE_TIMESTAMP, 0))} [UTC]</code>
|- [<code>${BuildConfig.CODE_TIMESTAMP}</code>] |- [<code>${MornySystem.CODE_TIMESTAMP}</code>]
|continuous: |continuous:
|- <code>${h(formatDuration(System.currentTimeMillis - coeur.coeurStartTimestamp))}</code> |- <code>${h(formatDuration(System.currentTimeMillis - coeur.coeurStartTimestamp))}</code>
|- [<code>${System.currentTimeMillis - coeur.coeurStartTimestamp}</code>] |- [<code>${System.currentTimeMillis - coeur.coeurStartTimestamp}</code>]

View File

@ -1,6 +1,6 @@
package cc.sukazyo.cono.morny.data package cc.sukazyo.cono.morny.data
import cc.sukazyo.cono.morny.{BuildConfig, MornyAbout, MornySystem} import cc.sukazyo.cono.morny.{MornyAbout, MornySystem}
import java.net.InetAddress import java.net.InetAddress
import java.rmi.UnknownHostException import java.rmi.UnknownHostException
@ -9,21 +9,23 @@ object MornyInformation {
//noinspection ScalaWeakerAccess //noinspection ScalaWeakerAccess
def getVersionGitTagHTML: String = { def getVersionGitTagHTML: String = {
if (!MornySystem.isGitBuild) return "" MornySystem.GIT_COMMIT match
val g = StringBuilder() case None => ""
val cm = BuildConfig.COMMIT substring(0, 8) case Some(commit) =>
val cp = MornySystem.currentCodePath val g = StringBuilder()
if (cp == null) g ++= s"<code>$cm</code>" val cm = commit substring(0, 8)
else g ++= s"<a href='$cp'>$cm</a>" val cp = MornySystem.currentCodePath
if (!MornySystem.isCleanBuild) g ++= ".<code>δ</code>" if (cp == null) g ++= s"<code>$cm</code>"
g toString else g ++= s"<a href='$cp'>$cm</a>"
if (!MornySystem.isCleanBuild) g ++= ".<code>δ</code>"
g toString
} }
def getVersionAllFullTagHTML: String = { def getVersionAllFullTagHTML: String = {
val v = StringBuilder() val v = StringBuilder()
v ++= s"<code>${MornySystem VERSION_BASE}</code>" v ++= s"<code>${MornySystem VERSION_BASE}</code>"
if (MornySystem isUseDelta) v ++= s"-δ<code>${MornySystem VERSION_DELTA}</code>" if (MornySystem.VERSION_DELTA nonEmpty) v ++= s"-δ<code>${MornySystem.VERSION_DELTA.get}</code>"
if (MornySystem isGitBuild) v ++= "+git." ++= getVersionGitTagHTML if (MornySystem.GIT_COMMIT nonEmpty) v ++= "+git." ++= getVersionGitTagHTML
v ++= s"*<code>${MornySystem.CODENAME toUpperCase}</code>" v ++= s"*<code>${MornySystem.CODENAME toUpperCase}</code>"
v toString v toString
} }