176 lines
4.3 KiB
Go
Raw Normal View History

package main
import (
2017-02-22 21:13:07 +10:30
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"path/filepath"
"strings"
"time"
_ "image/gif"
_ "image/jpeg"
_ "image/png"
2017-02-22 21:13:07 +10:30
"github.com/pborman/getopt"
// "github.com/skratchdot/open-golang/open"
"github.com/tardisx/discord-auto-upload/config"
daulog "github.com/tardisx/discord-auto-upload/log"
"github.com/tardisx/discord-auto-upload/uploads"
"github.com/tardisx/discord-auto-upload/version"
2021-01-31 18:48:48 +10:30
"github.com/tardisx/discord-auto-upload/web"
)
2021-01-31 18:48:48 +10:30
var lastCheck = time.Now()
2017-02-22 21:13:07 +10:30
var newLastCheck = time.Now()
func main() {
2017-02-22 21:13:07 +10:30
parseOptions()
// log.Print("Opening web browser")
// open.Start("http://localhost:9090")
web.StartWebServer()
2017-07-26 22:40:21 +09:30
checkUpdates()
daulog.SendLog(fmt.Sprintf("Waiting for images to appear in %s", config.Config.Path), daulog.LogTypeInfo)
2017-02-22 21:13:07 +10:30
// wander the path, forever
for {
2021-02-07 11:42:13 +10:30
if checkPath(config.Config.Path) {
err := filepath.Walk(config.Config.Path,
func(path string, f os.FileInfo, err error) error { return checkFile(path, f, err) })
if err != nil {
log.Fatal("could not watch path", err)
}
lastCheck = newLastCheck
2017-02-22 21:13:07 +10:30
}
daulog.SendLog(fmt.Sprintf("sleeping for %ds before next check of %s", config.Config.Watch, config.Config.Path), daulog.LogTypeDebug)
time.Sleep(time.Duration(config.Config.Watch) * time.Second)
2017-07-27 12:18:02 +09:30
}
}
2021-02-07 11:42:13 +10:30
func checkPath(path string) bool {
2017-02-22 21:13:07 +10:30
src, err := os.Stat(path)
if err != nil {
log.Printf("Problem with path '%s': %s", path, err)
2021-02-07 11:42:13 +10:30
return false
2017-02-22 21:13:07 +10:30
}
if !src.IsDir() {
log.Printf("Problem with path '%s': is not a directory", path)
2021-02-07 11:42:13 +10:30
return false
2017-02-22 21:13:07 +10:30
}
2021-02-07 11:42:13 +10:30
return true
}
2017-02-22 21:13:07 +10:30
func checkUpdates() {
type GithubRelease struct {
2021-06-04 10:41:23 +09:30
HTMLURL string `json:"html_url"`
TagName string `json:"tag_name"`
Name string `json:"name"`
Body string `json:"body"`
2017-02-22 21:13:07 +10:30
}
daulog.SendLog("checking for new version", daulog.LogTypeInfo)
2017-02-22 21:13:07 +10:30
client := &http.Client{Timeout: time.Second * 5}
resp, err := client.Get("https://api.github.com/repos/tardisx/discord-auto-upload/releases/latest")
if err != nil {
daulog.SendLog(fmt.Sprintf("WARNING: Update check failed: %v", err), daulog.LogTypeError)
return
2017-02-22 21:13:07 +10:30
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("could not check read update response")
}
var latest GithubRelease
err = json.Unmarshal(body, &latest)
if err != nil {
log.Fatal("could not parse JSON: ", err)
}
// pre v0.11.0 version (ie before semver) did a simple string comparison,
// but since "0.10.0" < "v0.11.0" they should still get prompted to upgrade
// ok
if version.NewVersionAvailable(latest.TagName) {
fmt.Printf("You are currently on version %s, but version %s is available\n", version.CurrentVersion, latest.TagName)
2017-02-22 21:13:07 +10:30
fmt.Println("----------- Release Info -----------")
fmt.Println(latest.Body)
fmt.Println("------------------------------------")
fmt.Println("Upgrade at https://github.com/tardisx/discord-auto-upload/releases/latest")
2021-06-04 10:41:23 +09:30
daulog.SendLog(fmt.Sprintf("New version available: %s - download at https://github.com/tardisx/discord-auto-upload/releases/latest", latest.TagName), daulog.LogTypeInfo)
2017-02-22 21:13:07 +10:30
}
2021-06-17 18:47:59 +09:30
daulog.SendLog("already running latest version", daulog.LogTypeInfo)
}
func parseOptions() {
2017-02-22 21:13:07 +10:30
// Declare the flags to be used
helpFlag := getopt.BoolLong("help", 'h', "help")
versionFlag := getopt.BoolLong("version", 'v', "show version")
getopt.SetParameters("")
2017-02-22 21:13:07 +10:30
getopt.Parse()
2017-02-22 21:13:07 +10:30
if *helpFlag {
getopt.PrintUsage(os.Stderr)
os.Exit(0)
}
2017-02-21 12:28:26 +10:30
2017-02-22 21:13:07 +10:30
if *versionFlag {
fmt.Println("dau - https://github.com/tardisx/discord-auto-upload")
fmt.Printf("Version: %s\n", version.CurrentVersion)
2017-02-22 21:13:07 +10:30
os.Exit(0)
}
2021-02-07 11:42:13 +10:30
// grab the config
config.LoadOrInit()
}
func checkFile(path string, f os.FileInfo, err error) error {
2017-02-22 21:13:07 +10:30
if f.ModTime().After(lastCheck) && f.Mode().IsRegular() {
if fileEligible(path) {
2017-02-22 21:13:07 +10:30
// process file
processFile(path)
2017-02-22 21:13:07 +10:30
}
2017-02-22 21:13:07 +10:30
if newLastCheck.Before(f.ModTime()) {
newLastCheck = f.ModTime()
}
}
2017-02-22 21:13:07 +10:30
return nil
}
func fileEligible(file string) bool {
if config.Config.Exclude != "" && strings.Contains(file, config.Config.Exclude) {
return false
}
2017-02-22 21:13:07 +10:30
extension := strings.ToLower(filepath.Ext(file))
if extension == ".png" || extension == ".jpg" || extension == ".gif" {
return true
}
2017-02-22 21:13:07 +10:30
return false
}
func processFile(file string) {
daulog.SendLog("Sending to uploader", daulog.LogTypeInfo)
uploads.AddFile(file)
}