From 0d290d093021f446e896fa4f0e0605420d0e87db Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=90=D0=BD=D0=B0=D1=82=D0=BE=D0=BB=D0=B8=D0=B9=20=D0=A2?=
 =?UTF-8?q?=D1=83=D1=85=D1=82=D0=B0=D1=80=D0=BE=D0=B2?= <admin@tad17.ru>
Date: Mon, 10 Mar 2025 19:28:25 +0500
Subject: [PATCH] v1.0.3

---
 app.go                            | 68 +++++++++++++++++++++++-
 frontend/src/App.svelte           | 86 ++++++++++++++++++++++++++++---
 frontend/wailsjs/go/main/App.d.ts |  6 +++
 frontend/wailsjs/go/main/App.js   | 12 +++++
 frontend/wailsjs/go/models.ts     | 14 +++++
 go.mod                            |  2 +-
 6 files changed, 178 insertions(+), 10 deletions(-)

diff --git a/app.go b/app.go
index 83b71d9..9ddea31 100644
--- a/app.go
+++ b/app.go
@@ -7,11 +7,12 @@ import (
 	"io/fs"
 	"os"
 
-	//"path/filepath"
+	"path/filepath"
 	//"time"
 
 	"github.com/estebangarcia21/subprocess"
 	"github.com/wailsapp/wails/v2/pkg/runtime"
+	"golang.org/x/sys/windows"
 )
 
 type Server struct {
@@ -65,6 +66,69 @@ func (a *App) GetProjects() []Project {
 	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)
+	err := far.Exec()
+	if err != nil {
+		runtime.LogError(a.ctx, err.Error())
+	}
+	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)
@@ -94,7 +158,7 @@ func (a *App) StartServer(s string) string {
 	return "starting server"
 }
 
-// StartServer - запускает сервер на выполнение
+// StartFar - запускает far
 func (a *App) StartFar(s string) string {
 	runtime.LogInfo(a.ctx, s)
 	cmd := fmt.Sprintf("far \"%s\" \"%s\"", s, s)
diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte
index 39162b5..a27a38f 100644
--- a/frontend/src/App.svelte
+++ b/frontend/src/App.svelte
@@ -1,6 +1,14 @@
 <script>
 import logo from "./assets/images/logo-universal.png";
-import { GetStatus, Weed, GetProjects, StartFar } from "../wailsjs/go/main/App.js";
+import { 
+	GetStatus, 
+	Weed, 
+	GetProjects, 
+	StartFar, 
+	GetDisks,
+	GetDownloads,
+  StartFarDownloads} from "../wailsjs/go/main/App.js";
+
 import { StartServer } from "../wailsjs/go/main/App.js";
 import TailwindCss from "./TailwindCSS.svelte";
 import servers from "./servers.js";
@@ -9,12 +17,37 @@ import servers from "./servers.js";
 let resultText = "Ваше имя 👇";
 let local = servers;
 let projects = [];
+let disks = [];
+let downloads = "";
 let cnt_pic = "0";
+let normal = true;
+let pics = true; 
+
+function get_disks() {
+	console.log("get disks")
+	GetDisks().then((result) => {
+		console.log("получена информация о дисках:", result)
+		disks = result;
+    normal = (disks[0].Free > 10) && (disks[1].Free > 50);
+	})
+}
+
+function get_downloads() {
+	console.log("get downloads")
+	GetDownloads().then((result) => {
+		console.log("получена информация о downloads:", result)
+		downloads = result
+	})
+}
 
 function start_far(project) {
   StartFar(project.last_directory_path)
 }
 
+function far_downloads() {
+  StartFarDownloads()
+}
+
 function start_server(server) {
 	let s = JSON.stringify(server);
 	console.log(s);
@@ -34,6 +67,12 @@ function weed() {
 }
 
 function get_status() {
+	console.log("запрос downloads");
+	get_downloads()
+
+	console.log("запрос дисков");
+	get_disks()
+
 	console.log("запрос статуса");
 	GetStatus().then((result) => {
 		console.log("result:", result);
@@ -57,6 +96,17 @@ get_status();
 
 <TailwindCss />
 
+<div class="container mx-auto pt-4 mb-4">
+  <div class="disk-panel text-neutral-300">
+  {#each disks as disk}
+  	<div>
+  		{disk.Name} 
+		<span class={normal ? 'info' : 'danger'}>{disk.Free} Gb</span>
+  	</div>
+  {/each}
+  </div>
+</div>
+
 <div class="container mx-auto pt-4 mb-4">
   <h1 class="text-blue-200 text-2xl">СЕРВЕРА</h1>
   {#each local as server}
@@ -92,11 +142,20 @@ get_status();
         </button>
         
         <div class="text-neutral-300">
-          <span>
-            {cnt_pic}
-          </span>
+          <span class={pics ? 'warning' : 'info'}>{cnt_pic}</span>
         </div>
       </div> 
+	<div class="flex justify-between px-4">
+		<button 
+          class="text-teal-600 hover:text-teal-200 hover:font-normal hover:underline hover:underline-offset-2 cursor-pointer"
+          on:click={far_downloads}
+        >
+          Download
+        </button>
+        <div class="text-neutral-300">
+          <span class="info">{downloads}</span>
+        </div>
+	</div>
     </div>  
   </div>
 </div>
@@ -115,7 +174,7 @@ get_status();
       </button>
 
       <div class="text-neutral-300">
-          <span> {project.name} </span>
+          <span class="info"> {project.name} </span>
       </div>
     </div>
   {/each}
@@ -129,8 +188,8 @@ get_status();
     p-2 rounded-full">
   <svg 
     xmlns="http://www.w3.org/2000/svg" 
-    width="36" 
-    height="36" 
+    width="24" 
+    height="24" 
     viewBox="0 0 24 24" 
     fill="none" 
     stroke="currentColor" 
@@ -143,4 +202,17 @@ get_status();
 </button>
 
 <style>
+.disk-panel {
+	display: flex;
+	justify-content: space-around;
+}
+.info {
+	color: lightgreen; 
+}
+.danger {
+	color: red; 
+}
+.warning {
+	color: orange; 
+}
 </style>
diff --git a/frontend/wailsjs/go/main/App.d.ts b/frontend/wailsjs/go/main/App.d.ts
index 468a314..c526b89 100644
--- a/frontend/wailsjs/go/main/App.d.ts
+++ b/frontend/wailsjs/go/main/App.d.ts
@@ -2,6 +2,10 @@
 // This file is automatically generated. DO NOT EDIT
 import {main} from '../models';
 
+export function GetDisks():Promise<Array<main.Disk>>;
+
+export function GetDownloads():Promise<string>;
+
 export function GetProjects():Promise<Array<main.Project>>;
 
 export function GetStatus():Promise<string>;
@@ -10,6 +14,8 @@ export function Greet(arg1:string):Promise<string>;
 
 export function StartFar(arg1:string):Promise<string>;
 
+export function StartFarDownloads():Promise<string>;
+
 export function StartServer(arg1:string):Promise<string>;
 
 export function Weed():Promise<void>;
diff --git a/frontend/wailsjs/go/main/App.js b/frontend/wailsjs/go/main/App.js
index 9869d7e..a0671d6 100644
--- a/frontend/wailsjs/go/main/App.js
+++ b/frontend/wailsjs/go/main/App.js
@@ -2,6 +2,14 @@
 // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
 // This file is automatically generated. DO NOT EDIT
 
+export function GetDisks() {
+  return window['go']['main']['App']['GetDisks']();
+}
+
+export function GetDownloads() {
+  return window['go']['main']['App']['GetDownloads']();
+}
+
 export function GetProjects() {
   return window['go']['main']['App']['GetProjects']();
 }
@@ -18,6 +26,10 @@ export function StartFar(arg1) {
   return window['go']['main']['App']['StartFar'](arg1);
 }
 
+export function StartFarDownloads() {
+  return window['go']['main']['App']['StartFarDownloads']();
+}
+
 export function StartServer(arg1) {
   return window['go']['main']['App']['StartServer'](arg1);
 }
diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts
index 3d7da98..a419be9 100644
--- a/frontend/wailsjs/go/models.ts
+++ b/frontend/wailsjs/go/models.ts
@@ -1,5 +1,19 @@
 export namespace main {
 	
+	export class Disk {
+	    Name: string;
+	    Free: number;
+	
+	    static createFrom(source: any = {}) {
+	        return new Disk(source);
+	    }
+	
+	    constructor(source: any = {}) {
+	        if ('string' === typeof source) source = JSON.parse(source);
+	        this.Name = source["Name"];
+	        this.Free = source["Free"];
+	    }
+	}
 	export class Project {
 	    name: string;
 	    last_directory: string;
diff --git a/go.mod b/go.mod
index 4d8ad0d..3537b66 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@ go 1.23.1
 require (
 	github.com/estebangarcia21/subprocess v0.0.0-20230526204252-a1a6de4773be
 	github.com/wailsapp/wails/v2 v2.10.1
+	golang.org/x/sys v0.30.0
 )
 
 require (
@@ -32,6 +33,5 @@ require (
 	github.com/wailsapp/mimetype v1.4.1 // indirect
 	golang.org/x/crypto v0.33.0 // indirect
 	golang.org/x/net v0.35.0 // indirect
-	golang.org/x/sys v0.30.0 // indirect
 	golang.org/x/text v0.22.0 // indirect
 )