Инициализация проекта

Стабильный рабочий проект.
This commit is contained in:
Falknat
2025-10-02 06:02:45 +07:00
commit 7a87617282
47 changed files with 6057 additions and 0 deletions

131
Backend/tools/cmd_go.go Normal file
View File

@@ -0,0 +1,131 @@
//go:build windows
package tools
import (
"bufio"
"fmt"
"os"
"os/exec"
"syscall"
"unsafe"
)
var (
kernel32 = syscall.NewLazyDLL("kernel32.dll")
procSetConsoleMode = kernel32.NewProc("SetConsoleMode")
procGetConsoleMode = kernel32.NewProc("GetConsoleMode")
procCreateMutex = kernel32.NewProc("CreateMutexW")
procCloseHandle = kernel32.NewProc("CloseHandle")
)
const ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
var mutexHandle syscall.Handle
func init() {
enableVirtualTerminal()
}
func enableVirtualTerminal() {
handle := os.Stdout.Fd()
var mode uint32
// Получаем текущий режим консоли
_, _, _ = procGetConsoleMode.Call(uintptr(handle), uintptr(unsafe.Pointer(&mode)))
// Добавляем флаг поддержки ANSI
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING
// Устанавливаем новый режим
_, _, _ = procSetConsoleMode.Call(uintptr(handle), uintptr(mode))
}
func RunBatScript(script string) (string, error) {
// Создание временного файла
tmpFile, err := os.CreateTemp("", "script-*.bat")
if err != nil {
return "", fmt.Errorf("ошибка создания temp-файла: %w", err)
}
defer os.Remove(tmpFile.Name())
// Запись скрипта в файл
if _, err := tmpFile.WriteString(script); err != nil {
return "", fmt.Errorf("ошибка записи в temp-файл: %w", err)
}
tmpFile.Close()
// Выполняем файл через cmd
cmd := exec.Command("cmd", "/C", tmpFile.Name())
output, err := cmd.CombinedOutput()
return string(output), err
}
// Функция для логирования вывода процесса в консоль
func Logs_console(process *exec.Cmd, check bool) error {
if check {
// Настраиваем pipes для захвата вывода
stdout, err := process.StdoutPipe()
CheckError(err)
stderr, err := process.StderrPipe()
CheckError(err)
// Запускаем процесс
process.Start()
// Захватываем stdout и stderr для вывода логов
go func() {
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}()
go func() {
scanner := bufio.NewScanner(stderr)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}()
} else {
// Просто запускаем процесс без логирования
return process.Start()
}
return nil
}
// CheckSingleInstance проверяет, не запущена ли программа уже через мьютекс
func CheckSingleInstance() bool {
mutexName, _ := syscall.UTF16PtrFromString("Global\\vServer_SingleInstance")
handle, _, err := procCreateMutex.Call(
0,
0,
uintptr(unsafe.Pointer(mutexName)),
)
if handle == 0 {
return false // не удалось создать мьютекс
}
mutexHandle = syscall.Handle(handle)
// Если GetLastError возвращает ERROR_ALREADY_EXISTS (183), значит мьютекс уже существует
if err.(syscall.Errno) == 183 {
return false // программа уже запущена
}
return true // успешно создали мьютекс, программа не запущена
}
// ReleaseMutex освобождает мьютекс при завершении программы
func ReleaseMutex() {
if mutexHandle != 0 {
procCloseHandle.Call(uintptr(mutexHandle))
mutexHandle = 0
}
}