diff --git a/cmd/commands/run/watch.go b/cmd/commands/run/watch.go index 4452b61..6a081cd 100644 --- a/cmd/commands/run/watch.go +++ b/cmd/commands/run/watch.go @@ -178,6 +178,7 @@ func AutoBuild(files []string, isgenerate bool) { icmd.Env = append(os.Environ(), "GOGC=off") err = icmd.Run() if err != nil { + utils.Notify("", "Failed to generate the docs.") beeLogger.Log.Errorf("Failed to generate the docs.") return } @@ -202,6 +203,7 @@ func AutoBuild(files []string, isgenerate bool) { bcmd.Stderr = &stderr err = bcmd.Run() if err != nil { + utils.Notify(stderr.String(), "Build Failed") beeLogger.Log.Errorf("Failed to build the application: %s", stderr.String()) return } diff --git a/config/conf.go b/config/conf.go index ed1a0d7..db7a6bc 100644 --- a/config/conf.go +++ b/config/conf.go @@ -47,7 +47,9 @@ var defaultConf = `{ "database": { "driver": "mysql" }, - "enable_reload": false + "enable_reload": false, + "enable_notification": true + } ` var Conf struct { @@ -77,7 +79,8 @@ var Conf struct { Driver string Conn string } - EnableReload bool `json:"enable_reload" yaml:"enable_reload"` + EnableReload bool `json:"enable_reload" yaml:"enable_reload"` + EnableNotification bool `json:"enable_notification" yaml:"enable_notification"` } func init() { diff --git a/utils/notification.go b/utils/notification.go new file mode 100644 index 0000000..0043f93 --- /dev/null +++ b/utils/notification.go @@ -0,0 +1,75 @@ +package utils + +import ( + "fmt" + "os/exec" + "strconv" + "strings" + + "runtime" + + "github.com/beego/bee/config" +) + +const appName = "Beego" + +func Notify(text, title string) { + if !config.Conf.EnableNotification { + return + } + switch runtime.GOOS { + case "darwin": + osxNotify(text, title) + case "linux": + windowsNotify(text, title) + case "windows": + linuxNotify(text, title) + } +} + +func osxNotify(text, title string) { + cmd := &exec.Cmd{} + if existTerminalNotifier() { + cmd = exec.Command("terminal-notifier", "-title", appName, "-message", text, "-subtitle", title) + } else if MacOSVersionSupport() { + notification := fmt.Sprintf("display notification \"%s\" with title \"%s\" subtitle \"%s\"", text, appName, title) + cmd = exec.Command("osascript", "-e", notification) + } else { + cmd = exec.Command("growlnotify", "-n", appName, "-m", title) + } + cmd.Run() +} + +func windowsNotify(text, title string) { + exec.Command("growlnotify", "/i:", "", "/t:", title, text).Run() +} + +func linuxNotify(text, title string) { + exec.Command("notify-send", "-i", "", title, text) +} + +func existTerminalNotifier() bool { + cmd := exec.Command("which", "terminal-notifier") + err := cmd.Start() + if err != nil { + return false + } else { + err = cmd.Wait() + if err != nil { + return false + } + } + return true +} + +func MacOSVersionSupport() bool { + cmd := exec.Command("sw_vers", "-productVersion") + check, _ := cmd.Output() + version := strings.Split(string(check), ".") + major, _ := strconv.Atoi(version[0]) + minor, _ := strconv.Atoi(version[1]) + if major < 10 || (major == 10 && minor < 9) { + return false + } + return true +}