mirror of
https://github.com/clockworkpi/LauncherGoDev.git
synced 2025-12-13 00:18:52 +01:00
164 lines
3.5 KiB
Go
164 lines
3.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"path/filepath"
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/zyxar/argo/rpc"
|
|
|
|
//"database/sql"
|
|
//_"github.com/mattn/go-sqlite3"
|
|
)
|
|
|
|
// The RPC server might send notifications to the client.
|
|
// Notifications is unidirectional, therefore the client which receives the notification must not respond to it.
|
|
// The method signature of a notification is much like a normal method request but lacks the id key
|
|
|
|
func fileExists(filename string) bool {
|
|
info, err := os.Stat(filename)
|
|
if os.IsNotExist(err) {
|
|
return false
|
|
}
|
|
return !info.IsDir()
|
|
}
|
|
|
|
func System(cmd string) string {
|
|
ret := ""
|
|
out, err := exec.Command("bash", "-c", cmd).Output()
|
|
if err != nil {
|
|
if _, ok := err.(*exec.ExitError); ok {
|
|
//exit code !=0 ,but it can be ignored
|
|
} else {
|
|
fmt.Println(err)
|
|
}
|
|
} else {
|
|
ret = string(out)
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
type AppNotifier struct{}
|
|
|
|
func (AppNotifier) OnDownloadStart(events []rpc.Event) { log.Printf("%s started.", events) }
|
|
func (AppNotifier) OnDownloadPause(events []rpc.Event) { log.Printf("%s paused.", events) }
|
|
func (AppNotifier) OnDownloadStop(events []rpc.Event) { log.Printf("%s stopped.", events) }
|
|
|
|
func (AppNotifier) OnDownloadComplete(events []rpc.Event) {
|
|
log.Printf("AppNotifier %s completed.", events)
|
|
|
|
rpcc_, err := rpc.New(context.Background(), rpcURI, rpcSecret, time.Second,nil)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
return
|
|
}
|
|
defer rpcc_.Close()
|
|
|
|
for _,v := range events {
|
|
gid := v.Gid
|
|
msg, err := rpcc_.TellStatus(gid)
|
|
if err == nil {
|
|
log.Printf("%+v\n",msg)
|
|
if msg.Status == "complete" {
|
|
go InstallGame(msg)
|
|
}else if msg.Status == "error" {
|
|
log.Println(msg.ErrorMessage)
|
|
for _,v := range msg.Files {
|
|
if fileExists(v.Path) {
|
|
e := os.Remove(v.Path)
|
|
if e != nil {
|
|
log.Fatal(e)
|
|
}
|
|
}
|
|
if fileExists( v.Path + ".aria2" ) {
|
|
e := os.Remove(v.Path + ".aria2")
|
|
if e != nil {
|
|
log.Fatal(e)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}else {
|
|
log.Println("TellStatus err: ",err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (AppNotifier) OnDownloadError(events []rpc.Event) {
|
|
log.Printf("%s error.", events)
|
|
}
|
|
|
|
func (AppNotifier) OnBtDownloadComplete(events []rpc.Event) {
|
|
|
|
log.Printf("bt %s completed.", events)
|
|
|
|
}
|
|
|
|
|
|
|
|
func InstallGame(msg rpc.StatusInfo) {
|
|
|
|
if len(msg.Files) <= 0 {
|
|
return
|
|
}
|
|
|
|
ret := msg.Files[0].URIs
|
|
home_path,_ := os.UserHomeDir()
|
|
|
|
remote_file_url := ret[0].URI
|
|
|
|
parts := strings.Split(remote_file_url,"raw.githubusercontent.com")
|
|
if len(parts) < 1 {
|
|
return
|
|
}
|
|
|
|
menu_file := parts[1]
|
|
local_menu_file := fmt.Sprintf("%s/aria2download%s",home_path,menu_file)
|
|
local_menu_file_path := filepath.Dir(local_menu_file)
|
|
|
|
if fileExists(local_menu_file) {
|
|
gametype := "launcher"
|
|
|
|
if strings.HasSuffix(local_menu_file,".tar.gz") {
|
|
gametype = "launcher"
|
|
}
|
|
|
|
if strings.HasSuffix(local_menu_file,".p8.png") {
|
|
gametype = "pico8"
|
|
}
|
|
|
|
if strings.HasSuffix(local_menu_file,".tic") {
|
|
gametype = "tic80"
|
|
}
|
|
|
|
if gametype == "launcher" {
|
|
_cmd := fmt.Sprintf( "tar zxvf '%s' -C %s",local_menu_file, local_menu_file_path)
|
|
fmt.Println(_cmd)
|
|
System(_cmd)
|
|
}
|
|
|
|
if gametype == "pico8" {
|
|
_cmd := fmt.Sprintf("cp -rf '%s' ~/.lexaloffle/pico-8/carts/", local_menu_file)
|
|
fmt.Println(_cmd)
|
|
System(_cmd)
|
|
}
|
|
|
|
if gametype == "tic80" {
|
|
_cmd := fmt.Sprintf("cp -rf '%s' ~/games/TIC-80/",local_menu_file)
|
|
fmt.Println(_cmd)
|
|
System(_cmd)
|
|
}
|
|
|
|
}else {
|
|
fmt.Println(local_menu_file, " not found")
|
|
}
|
|
|
|
}
|
|
|