1
0
mirror of https://github.com/taigrr/crocgui synced 2025-01-18 04:03:16 -08:00
crocgui/main.go
2021-02-13 13:37:57 -06:00

160 lines
4.1 KiB
Go

package main
import (
"fmt"
"log"
"os"
"path/filepath"
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
"github.com/schollz/croc/v8/src/croc"
"github.com/schollz/croc/v8/src/utils"
)
func sendTabItem(w fyne.Window) *container.TabItem {
status := widget.NewLabel("")
prog := widget.NewProgressBar()
prog.Hide()
topline := widget.NewLabel("Pick a file to send")
return container.NewTabItemWithIcon("Send", theme.MailSendIcon(),
container.NewVBox(
topline,
widget.NewButtonWithIcon("File", theme.FileIcon(), func() {
dialog.ShowFileOpen(func(f fyne.URIReadCloser, e error) {
if e != nil {
return
}
randomName := utils.GetRandomName()
sender, err := croc.New(croc.Options{
IsSender: true,
SharedSecret: randomName,
Debug: false,
RelayAddress: "10.0.1.1:9009",
RelayPorts: []string{"9009", "9010", "9011", "9012", "9013"},
RelayPassword: "pass123",
Stdout: false,
NoPrompt: true,
DisableLocal: true,
})
var filename string
if err != nil {
log.Println(err)
} else if f != nil {
status.SetText("Receive Code: " + randomName)
fi, _ := os.Stat(f.URI().Path())
filename = filepath.Base(fi.Name())
topline.SetText(fmt.Sprintf("Sending file: %s", filename))
totalsize := fi.Size()
prog.Max = float64(totalsize)
prog.Show()
donechan := make(chan bool)
go func() {
ticker := time.NewTicker(time.Millisecond * 100)
for {
select {
case <-ticker.C:
prog.SetValue(float64(sender.TotalSent))
case <-donechan:
ticker.Stop()
return
}
}
}()
serr := sender.Send(croc.TransferOptions{
PathToFiles: []string{f.URI().Path()},
})
donechan <- true
prog.Hide()
prog.SetValue(0)
topline.SetText("Pick a file to send")
if serr != nil {
log.Println("Send failed:", serr)
} else {
status.SetText(fmt.Sprintf("Sent file %s", filename))
}
}
}, w)
}),
prog,
status,
))
}
func recvTabItem() *container.TabItem {
status := widget.NewLabel("")
prog := widget.NewProgressBar()
prog.Hide()
recvEntry := widget.NewEntry()
topline := widget.NewLabel("Enter code to download")
return container.NewTabItemWithIcon("Receive", theme.DownloadIcon(),
container.NewVBox(
topline,
widget.NewForm(&widget.FormItem{Text: "Receive Code", Widget: recvEntry}),
widget.NewButtonWithIcon("Download", theme.DownloadIcon(), func() {
receiver, err := croc.New(croc.Options{
IsSender: false,
SharedSecret: recvEntry.Text,
Debug: false,
RelayAddress: "10.0.1.1:9009",
RelayPassword: "pass123",
Stdout: false,
NoPrompt: true,
DisableLocal: true,
})
if err != nil {
log.Println("Receive setup error:", err)
}
prog.Show()
donechan := make(chan bool)
var filename string
go func() {
ticker := time.NewTicker(time.Millisecond * 100)
for {
gotInfo := false
select {
case <-ticker.C:
if !gotInfo && receiver.Step2FileInfoTransfered {
gotInfo = true
fi := receiver.FilesToTransfer[0]
filename = filepath.Base(fi.Name)
topline.SetText(fmt.Sprintf("Receiving file: %s", filename))
prog.Max = float64(fi.Size)
}
prog.SetValue(float64(receiver.TotalSent))
case <-donechan:
ticker.Stop()
return
}
}
}()
rerr := receiver.Receive()
donechan <- true
prog.Hide()
prog.SetValue(0)
topline.SetText("Enter code to download")
if rerr != nil {
status.Text = "Receive failed: " + rerr.Error()
} else {
status.Text = fmt.Sprintf("Received file %s", filename)
}
}),
prog,
status,
))
}
func main() {
a := app.NewWithID("com.github.howeyc.crocgui")
w := a.NewWindow("croc")
w.SetContent(container.NewAppTabs(sendTabItem(w), recvTabItem()))
w.ShowAndRun()
}