mirror of
https://github.com/indig0fox/Arma3-AttendanceTracker.git/
synced 2025-12-08 09:51:47 -06:00
Compare commits
2 Commits
796f2e6818
...
1892805fe9
| Author | SHA1 | Date | |
|---|---|---|---|
|
1892805fe9
|
|||
|
5dc3b5cb03
|
2
.gitignore
vendored
2
.gitignore
vendored
@@ -9,3 +9,5 @@ hemtt
|
|||||||
hemtt.exe
|
hemtt.exe
|
||||||
*.biprivatekey
|
*.biprivatekey
|
||||||
*.bk
|
*.bk
|
||||||
|
|
||||||
|
releases/
|
||||||
|
|||||||
10
README
10
README
@@ -204,24 +204,24 @@ docker pull x1unix/go-mingw:1.20
|
|||||||
|
|
||||||
# version is semantic + build date + git hash
|
# version is semantic + build date + git hash
|
||||||
# e.g. 1.0.0-2021-05-30-1a2b3c4d
|
# e.g. 1.0.0-2021-05-30-1a2b3c4d
|
||||||
$versionSem = '0.2.0'
|
$versionSem = '1.1.0'
|
||||||
$dateStr = Get-Date -Format 'yyyyMMdd'
|
$dateStr = Get-Date -Format 'yyyyMMdd'
|
||||||
$version = "$versionSem-$dateStr-$(git rev-parse --short HEAD)"
|
$version = "$versionSem-$dateStr-$(git rev-parse --short HEAD)"
|
||||||
|
|
||||||
# Compile x64 Windows DLL
|
# Compile x64 Windows DLL
|
||||||
docker run --rm -it -v ${PWD}:/go/work -w /go/work x1unix/go-mingw:1.20 go build -o dist/AttendanceTracker_x64.dll -buildmode=c-shared -ldflags "-w -s -X main.EXTENSION_VERSION=$version" ./cmd
|
docker run --rm -it -v ${PWD}:/go/work -w /go/work -e GOARCH=amd64 -e CGO_ENABLED=1 x1unix/go-mingw:1.20 go build -o dist/AttendanceTracker_x64.dll -buildmode=c-shared -ldflags "-w -s -X main.EXTENSION_VERSION=$version" ./cmd
|
||||||
|
|
||||||
# Compile x86 Windows DLL
|
# Compile x86 Windows DLL
|
||||||
docker run --rm -it -v ${PWD}:/go/work -w /go/work -e GOARCH=386 x1unix/go-mingw:1.20 go build -o dist/AttendanceTracker.dll -buildmode=c-shared -ldflags "-w -s -X main.EXTENSION_VERSION=$version" ./cmd
|
docker run --rm -it -v ${PWD}:/go/work -w /go/work -e GOARCH=386 -e CGO_ENABLED=1 x1unix/go-mingw:1.20 go build -o dist/AttendanceTracker.dll -buildmode=c-shared -ldflags "-w -s -X main.EXTENSION_VERSION=$version" ./cmd
|
||||||
|
|
||||||
# Compile x64 Windows EXE
|
# Compile x64 Windows EXE
|
||||||
docker run --rm -it -v ${PWD}:/go/work -w /go/work x1unix/go-mingw:1.20 go build -o dist/AttendanceTracker_x64.exe -ldflags "-w -s -X main.EXTENSION_VERSION=$version" ./cmd
|
docker run --rm -it -v ${PWD}:/go/work -w /go/work -e GOARCH=amd64 -e CGO_ENABLED=1 x1unix/go-mingw:1.20 go build -o dist/AttendanceTracker_x64.exe -ldflags "-w -s -X main.EXTENSION_VERSION=$version" ./cmd
|
||||||
```
|
```
|
||||||
|
|
||||||
#### COMPILING FOR LINUX
|
#### COMPILING FOR LINUX
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker build -t indifox926/build-a3go:linux-so -f ./build/Dockerfile.build ./cmd
|
docker build -t indifox926/build-a3go:linux-so -f ./build/Dockerfile.build .
|
||||||
|
|
||||||
# Compile x64 Linux .so
|
# Compile x64 Linux .so
|
||||||
docker run --rm -it -v ${PWD}:/app -e GOOS=linux -e GOARCH=amd64 -e CGO_ENABLED=1 -e CC=gcc indifox926/build-a3go:linux-so go build -o dist/AttendanceTracker_x64.so -linkshared -ldflags "-w -s -X main.EXTENSION_VERSION=$version" ./cmd
|
docker run --rm -it -v ${PWD}:/app -e GOOS=linux -e GOARCH=amd64 -e CGO_ENABLED=1 -e CC=gcc indifox926/build-a3go:linux-so go build -o dist/AttendanceTracker_x64.so -linkshared -ldflags "-w -s -X main.EXTENSION_VERSION=$version" ./cmd
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#define MAJOR 0
|
#define MAJOR 1
|
||||||
#define MINOR 2
|
#define MINOR 1
|
||||||
#define PATCH 0
|
#define PATCH 0
|
||||||
#define BUILD 20231003
|
#define BUILD 20231003
|
||||||
|
|
||||||
#define VERSION 0.2
|
#define VERSION 1.1
|
||||||
#define VERSION_STR MAJOR##.##MINOR##.##PATCH##.##BUILD
|
#define VERSION_STR MAJOR##.##MINOR##.##PATCH##.##BUILD
|
||||||
#define VERSION_AR MAJOR,MINOR,PATCH,BUILD
|
#define VERSION_AR MAJOR,MINOR,PATCH,BUILD
|
||||||
11
extension/AttendanceTracker/build/Dockerfile.build
Normal file
11
extension/AttendanceTracker/build/Dockerfile.build
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# build Golang app for Linux
|
||||||
|
FROM golang:1.20
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# get gcc-multilib and gcc-mingw-w64
|
||||||
|
RUN apt update
|
||||||
|
RUN apt install -y gcc-multilib gcc-mingw-w64
|
||||||
|
|
||||||
|
CMD ["/bin/sh"]
|
||||||
|
|
||||||
Binary file not shown.
@@ -57,8 +57,35 @@ var (
|
|||||||
func init() {
|
func init() {
|
||||||
|
|
||||||
a3interface.SetVersion(EXTENSION_VERSION)
|
a3interface.SetVersion(EXTENSION_VERSION)
|
||||||
a3interface.RegisterRvExtensionChannels(RVExtensionChannels)
|
a3interface.NewRegistration(":START:").
|
||||||
a3interface.RegisterRvExtensionArgsChannels(RVExtensionArgsChannels)
|
SetDefaultResponse(`["Extension beginning init process"]`).
|
||||||
|
SetFunction(onStartCommand).
|
||||||
|
SetRunInBackground(true).
|
||||||
|
Register()
|
||||||
|
|
||||||
|
a3interface.NewRegistration(":MISSION:HASH:").
|
||||||
|
SetDefaultResponse(`["Retrieving mission hash"]`).
|
||||||
|
SetFunction(onMissionHashCommand).
|
||||||
|
SetRunInBackground(true).
|
||||||
|
Register()
|
||||||
|
|
||||||
|
a3interface.NewRegistration(":GET:SETTINGS:").
|
||||||
|
SetDefaultResponse(`["Retrieving settings"]`).
|
||||||
|
SetFunction(onGetSettingsCommand).
|
||||||
|
SetRunInBackground(true).
|
||||||
|
Register()
|
||||||
|
|
||||||
|
a3interface.NewRegistration(":LOG:MISSION:").
|
||||||
|
SetDefaultResponse(`["Logging mission data"]`).
|
||||||
|
SetArgsFunction(onLogMissionArgsCommand).
|
||||||
|
SetRunInBackground(true).
|
||||||
|
Register()
|
||||||
|
|
||||||
|
a3interface.NewRegistration(":LOG:PRESENCE:").
|
||||||
|
SetDefaultResponse(`["Logging presence data"]`).
|
||||||
|
SetArgsFunction(onLogPresenceArgsCommand).
|
||||||
|
SetRunInBackground(true).
|
||||||
|
Register()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
var err error
|
var err error
|
||||||
@@ -126,8 +153,6 @@ func init() {
|
|||||||
logger.Log.Error().Err(err).Msgf(`Error migrating database schema`)
|
logger.Log.Error().Err(err).Msgf(`Error migrating database schema`)
|
||||||
}
|
}
|
||||||
|
|
||||||
startA3CallHandlers()
|
|
||||||
|
|
||||||
initSuccess = true
|
initSuccess = true
|
||||||
a3interface.WriteArmaCallback(
|
a3interface.WriteArmaCallback(
|
||||||
EXTENSION_NAME,
|
EXTENSION_NAME,
|
||||||
@@ -138,23 +163,28 @@ func init() {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
func startA3CallHandlers() error {
|
func onStartCommand(
|
||||||
go func() {
|
ctx a3interface.ArmaExtensionContext,
|
||||||
for {
|
data string,
|
||||||
select {
|
) (string, error) {
|
||||||
case <-RVExtensionChannels[":START:"]:
|
|
||||||
logger.Log.Trace().Msgf(`RVExtension :START: requested`)
|
logger.Log.Trace().Msgf(`RVExtension :START: requested`)
|
||||||
if !initSuccess {
|
if !initSuccess {
|
||||||
logger.Log.Warn().Msgf(`Received another :START: command before init was complete, ignoring.`)
|
logger.Log.Warn().Msgf(`Received another :START: command before init was complete, ignoring.`)
|
||||||
continue
|
return "Initing!", nil
|
||||||
} else {
|
} else {
|
||||||
logger.RotateLogs()
|
logger.RotateLogs()
|
||||||
a3interface.WriteArmaCallback(
|
a3interface.WriteArmaCallback(
|
||||||
EXTENSION_NAME,
|
EXTENSION_NAME,
|
||||||
":READY:",
|
":READY:",
|
||||||
)
|
)
|
||||||
|
return "Ready!", nil
|
||||||
}
|
}
|
||||||
case <-RVExtensionChannels[":MISSION:HASH:"]:
|
}
|
||||||
|
|
||||||
|
func onMissionHashCommand(
|
||||||
|
ctx a3interface.ArmaExtensionContext,
|
||||||
|
data string,
|
||||||
|
) (string, error) {
|
||||||
logger.Log.Trace().Msgf(`RVExtension :MISSION:HASH: requested`)
|
logger.Log.Trace().Msgf(`RVExtension :MISSION:HASH: requested`)
|
||||||
timestamp, hash := getMissionHash()
|
timestamp, hash := getMissionHash()
|
||||||
a3interface.WriteArmaCallback(
|
a3interface.WriteArmaCallback(
|
||||||
@@ -163,12 +193,22 @@ func startA3CallHandlers() error {
|
|||||||
timestamp,
|
timestamp,
|
||||||
hash,
|
hash,
|
||||||
)
|
)
|
||||||
case <-RVExtensionChannels[":GET:SETTINGS:"]:
|
return fmt.Sprintf(
|
||||||
|
`[%q, %q]`,
|
||||||
|
timestamp,
|
||||||
|
hash,
|
||||||
|
), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func onGetSettingsCommand(
|
||||||
|
ctx a3interface.ArmaExtensionContext,
|
||||||
|
data string,
|
||||||
|
) (string, error) {
|
||||||
logger.Log.Trace().Msg(`Settings requested`)
|
logger.Log.Trace().Msg(`Settings requested`)
|
||||||
armaConfig, err := util.ConfigArmaFormat()
|
armaConfig, err := util.ConfigArmaFormat()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Log.Error().Err(err).Msg(`Error when marshaling arma config`)
|
logger.Log.Error().Err(err).Msg(`Error when marshaling arma config`)
|
||||||
continue
|
return "", err
|
||||||
}
|
}
|
||||||
logger.Log.Trace().Str("armaConfig", armaConfig).Send()
|
logger.Log.Trace().Str("armaConfig", armaConfig).Send()
|
||||||
a3interface.WriteArmaCallback(
|
a3interface.WriteArmaCallback(
|
||||||
@@ -176,18 +216,29 @@ func startA3CallHandlers() error {
|
|||||||
":GET:SETTINGS:",
|
":GET:SETTINGS:",
|
||||||
armaConfig,
|
armaConfig,
|
||||||
)
|
)
|
||||||
case v := <-RVExtensionArgsChannels[":LOG:MISSION:"]:
|
return armaConfig, nil
|
||||||
go func(data []string) {
|
|
||||||
writeWorldInfo(v[1])
|
|
||||||
writeMission(v[0])
|
|
||||||
}(v)
|
|
||||||
case v := <-RVExtensionArgsChannels[":LOG:PRESENCE:"]:
|
|
||||||
go writeAttendance(v[0])
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
return nil
|
func onLogMissionArgsCommand(
|
||||||
|
ctx a3interface.ArmaExtensionContext,
|
||||||
|
command string,
|
||||||
|
args []string,
|
||||||
|
) (string, error) {
|
||||||
|
go func(data []string) {
|
||||||
|
writeWorldInfo(data[1])
|
||||||
|
writeMission(data[0])
|
||||||
|
}(args)
|
||||||
|
|
||||||
|
return `["Logging mission data"]`, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func onLogPresenceArgsCommand(
|
||||||
|
ctx a3interface.ArmaExtensionContext,
|
||||||
|
command string,
|
||||||
|
args []string,
|
||||||
|
) (string, error) {
|
||||||
|
go writeAttendance(args[0])
|
||||||
|
return `["Logging presence data"]`, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// getMissionHash will return the current time in UTC and an md5 hash of that time
|
// getMissionHash will return the current time in UTC and an md5 hash of that time
|
||||||
@@ -313,8 +364,8 @@ func writeAttendance(data string) {
|
|||||||
var dbEvent Session
|
var dbEvent Session
|
||||||
db.Client().
|
db.Client().
|
||||||
Where(
|
Where(
|
||||||
"player_uid = ? AND mission_hash = ?",
|
"player_id = ? AND mission_hash = ?",
|
||||||
event.PlayerUID,
|
event.PlayerId,
|
||||||
event.MissionHash,
|
event.MissionHash,
|
||||||
).
|
).
|
||||||
Order("join_time_utc desc").
|
Order("join_time_utc desc").
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ go 1.20
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/go-sql-driver/mysql v1.7.1
|
github.com/go-sql-driver/mysql v1.7.1
|
||||||
github.com/indig0fox/a3go v0.2.0
|
github.com/indig0fox/a3go v0.3.1
|
||||||
github.com/rs/zerolog v1.30.0
|
github.com/rs/zerolog v1.30.0
|
||||||
github.com/spf13/viper v1.16.0
|
github.com/spf13/viper v1.16.0
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
||||||
|
|||||||
@@ -127,8 +127,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
|||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
github.com/indig0fox/a3go v0.2.0 h1:2r1fyUePCH9KLMBzVXBigkQT2zS39mpHZAm5egmIrNk=
|
github.com/indig0fox/a3go v0.3.1 h1:T1UxVrk7oicM5djyID+ppNuTc+0pEGbbGWS466eS29k=
|
||||||
github.com/indig0fox/a3go v0.2.0/go.mod h1:8htVwBiIAVKpT1Jyb+5dm7GuLAAevTXgw7UKxSlOawY=
|
github.com/indig0fox/a3go v0.3.1/go.mod h1:8htVwBiIAVKpT1Jyb+5dm7GuLAAevTXgw7UKxSlOawY=
|
||||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||||
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user