2022-10-22 17:38:39 +08:00
|
|
|
package runner
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2023-07-14 21:47:11 +08:00
|
|
|
"git.0x7f.app/WOJ/woj-server/internal/e"
|
2024-01-06 16:06:16 +08:00
|
|
|
"git.0x7f.app/WOJ/woj-server/pkg/file"
|
2022-10-22 17:38:39 +08:00
|
|
|
"go.uber.org/zap"
|
|
|
|
"os"
|
|
|
|
"path"
|
|
|
|
"path/filepath"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
Prefix = "./resource/runner"
|
2022-10-23 17:29:35 +08:00
|
|
|
ProblemDir = "./problem/"
|
2022-10-22 17:38:39 +08:00
|
|
|
ScriptsDir = "./scripts/"
|
2022-10-23 17:29:35 +08:00
|
|
|
UserDir = "./user/"
|
2022-10-22 17:38:39 +08:00
|
|
|
TmpDir = "./tmp/"
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
wd, err := os.Getwd()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
Prefix = path.Join(wd, Prefix)
|
|
|
|
ProblemDir = path.Join(Prefix, ProblemDir)
|
|
|
|
UserDir = path.Join(Prefix, UserDir)
|
|
|
|
TmpDir = path.Join(Prefix, TmpDir)
|
|
|
|
}
|
|
|
|
|
2024-01-06 19:47:16 +08:00
|
|
|
func (s *service) ProblemExists(version uint) bool {
|
|
|
|
problemPath := filepath.Join(ProblemDir, fmt.Sprintf("%d", version))
|
|
|
|
return file.Exist(problemPath)
|
|
|
|
}
|
|
|
|
|
2024-01-06 17:32:05 +08:00
|
|
|
func (s *service) check(version uint, user string, lang string) e.Status {
|
|
|
|
if !s.ProblemExists(version) {
|
|
|
|
s.log.Info("problem not exists", zap.Uint("version", version))
|
|
|
|
return e.RunnerProblemNotExist
|
|
|
|
}
|
|
|
|
|
2024-01-06 19:47:16 +08:00
|
|
|
userPath := filepath.Join(UserDir, user, fmt.Sprintf("%s.%s", user, lang))
|
|
|
|
if !file.Exist(userPath) {
|
2024-01-06 17:32:05 +08:00
|
|
|
s.log.Info("user program not exists", zap.String("user", user), zap.String("lang", lang))
|
|
|
|
return e.RunnerUserNotExist
|
|
|
|
}
|
|
|
|
|
|
|
|
return e.Success
|
|
|
|
}
|
|
|
|
|
2024-01-06 19:21:37 +08:00
|
|
|
func (s *service) getLangInfo(config *Config, lang string) (configLanguage, bool) {
|
|
|
|
for _, l := range config.Languages {
|
|
|
|
if l.Lang == lang {
|
|
|
|
return l, true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return configLanguage{}, false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *service) getLangScript(l *configLanguage, lang string) string {
|
|
|
|
if l.Type == "default" {
|
|
|
|
return "/woj/framework/template/default/" + lang + ".Makefile"
|
|
|
|
} else {
|
|
|
|
return "/woj/problem/judge/" + l.Script
|
|
|
|
}
|
|
|
|
}
|