You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

230 lines
6.0 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package main
import (
"context"
"encoding/json"
"fmt"
"io/fs"
"os"
"path/filepath"
//"time"
"github.com/estebangarcia21/subprocess"
"github.com/wailsapp/wails/v2/pkg/runtime"
"golang.org/x/sys/windows"
)
type Server struct {
Name string `json:"name"`
Dir string `json:"dir"`
Cmd string `json:"cmd"`
Url string `json:"url"`
Port string `json:"port"`
Run string `json:"run"`
}
// Запускает web-сервер (локальный)
func (s *Server) Start() {
os.Chdir(s.Dir)
//s := subprocess.New(".\\"+name+".exe")
p := subprocess.New(s.Cmd)
p.ExecAsync()
}
// App struct
type App struct {
ctx context.Context
}
// NewApp создает новый экземпляр App
func NewApp() *App {
app := &App{}
return app
}
// startup вызывается при запуске приложения
func (a *App) startup(ctx context.Context) {
a.ctx = ctx
runtime.WindowSetTitle(ctx, "v1.0.2")
runtime.WindowSetPosition(ctx, 1500, 80)
}
// GetProjects возвращает список последних проектов
func (a *App) GetProjects() []Project {
projects := getLastProjects()
runtime.LogInfo(a.ctx, fmt.Sprintf("projects: %v", projects))
return projects
}
type Disk struct {
Name string
Free uint64
}
func getFileCountAndSize(dir string) (int, int64, error) {
var fileCount int
var totalSize int64
err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() { // Проверяем, что это не каталог
fileCount++
totalSize += info.Size() // Добавляем размер файла
}
return nil
})
if err != nil {
return 0, 0, err
}
return fileCount, totalSize, nil
}
func (a *App) GetDownloads() string {
cnt, size, err := getFileCountAndSize("C:\\Users\\admin\\Downloads")
checkError("getDownloads", err)
info := fmt.Sprintf("%d (%d Mb)", cnt, size/1024/1024)
return info
}
// StartFarDownloads - запускает far
func (a *App) StartFarDownloads() string {
cmd := `far "D:\soft" "C:\Users\admin\Downloads"`
far := subprocess.New(cmd)
far.ExecAsync()
// runtime.LogInfo(a.ctx, "команда выполнена успешно")
return "ok"
}
// StartFarBooks - запускает far для fb2
func (a *App) StartFarBooks() string {
cmd := `far "D:\books\2\fb2" "D:\books\2\fb2\images"`
far := subprocess.New(cmd)
far.ExecAsync()
alacritty := subprocess.New("alacritty --working-directory D:/books/2/fb2")
alacritty.ExecAsync()
// runtime.LogInfo(a.ctx, "команда выполнена успешно")
return "ok"
}
// StartFarDisks - запускает far для работы с дисками
func (a *App) StartFarDisks() string {
cmd := `far "D:\" "C:\"`
far := subprocess.New(cmd)
far.ExecAsync()
// runtime.LogInfo(a.ctx, "команда выполнена успешно")
return "ok"
}
func (a *App) GetDisks() []Disk {
var disks = []Disk{}
var freeBytes, totalBytes, totalFreeBytes uint64
err := windows.GetDiskFreeSpaceEx(windows.StringToUTF16Ptr("C:\\"), &freeBytes, &totalBytes, &totalFreeBytes)
checkError("free space c:", err)
free_C := freeBytes / 1024 / 1024 / 1024
disks = append(disks, Disk{Name: "C:", Free: free_C})
err = windows.GetDiskFreeSpaceEx(windows.StringToUTF16Ptr("D:\\"), &freeBytes, &totalBytes, &totalFreeBytes)
checkError("free space d:", err)
free_D := freeBytes / 1024 / 1024 / 1024
disks = append(disks, Disk{Name: "D:", Free: free_D})
return disks
//fmt.Printf("Свободное место на диске: %dGB\n", freeGB)
}
// Greet returns a greeting for the given name
func (a *App) Greet(name string) string {
return fmt.Sprintf("Hello %s, It's show time!", name)
}
func startLocalServer(name, dir, cmd string) {
//os.Chdir("d:\\projects\\" + name);
os.Chdir(dir)
//s := subprocess.New(".\\"+name+".exe")
s := subprocess.New(cmd)
s.ExecAsync()
}
// StartServer - запускает сервер на выполнение
func (a *App) StartServer(s string) string {
runtime.LogInfo(a.ctx, s)
var server Server
if err := json.Unmarshal([]byte(s), &server); err != nil {
runtime.LogError(a.ctx, err.Error())
}
runtime.LogInfo(a.ctx, fmt.Sprintf("server: %v", server))
server.Url = fmt.Sprintf("http://localhost:%s", server.Port)
server.Start()
runtime.BrowserOpenURL(a.ctx, server.Url)
return "starting server"
}
// StartFar - запускает far
func (a *App) StartFar(s string) string {
runtime.LogInfo(a.ctx, s)
cmd := fmt.Sprintf("far \"%s\" \"%s\"", s, s)
far := subprocess.New(cmd)
err := far.Exec()
if err != nil {
runtime.LogError(a.ctx, err.Error())
}
runtime.LogInfo(a.ctx, fmt.Sprintf("команда выполнена успешно"))
return "ok"
}
func (a *App) Weed() {
os.Chdir("d:\\projects\\nano\\sw4-nano\\util")
//s := subprocess.New(".\\"+name+".exe")
cmd := "py scanpics.py"
s := subprocess.New(cmd)
err := s.Exec()
if err != nil {
runtime.LogError(a.ctx, err.Error())
}
runtime.LogInfo(a.ctx, "команда выполнена успешно")
}
func getCountPics(dir string) int {
pics, err := os.ReadDir(dir)
if err != nil {
return -1
}
return len(pics)
}
// The `getCountReady` function is counting the number of files (excluding directories) in a
// specified directory. It uses the `fs.WalkDir` function to walk through the file tree starting
// from the given directory within a file system. For each file encountered during the walk, it
// increments a counter if the file is not a directory. Finally, it returns the total count of
// files found in the directory.
func getCountReady(ctx context.Context, dir string) int {
root := dir
fileSystem := os.DirFS(root)
cnt := 0
fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
runtime.LogError(ctx, err.Error())
}
if !d.IsDir() {
cnt += 1
}
return nil
})
return cnt
}
func (a *App) GetStatus() string {
pics := getCountPics("d:\\pics")
ready := getCountReady(a.ctx, "d:\\pics-move")
return fmt.Sprintf("%d / %d", pics, ready)
}