github.com/hrntknr/ntf@v1.0.2-0.20220725163249-d52a7861d93d/functions.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "log" 7 "os" 8 "os/exec" 9 "strconv" 10 "strings" 11 "time" 12 13 "github.com/adrg/xdg" 14 "github.com/hrntknr/ntf/backends" 15 "github.com/spf13/cobra" 16 ) 17 18 func doneFunc(cmd *cobra.Command, args []string) { 19 cfg, err := getConfig() 20 if err != nil { 21 log.Fatal(err) 22 } 23 backends.OverrideConfigs(&cfg, cmd) 24 var title string 25 if cmd.Flags().Lookup("title").Changed { 26 title = cmd.Flags().Lookup("title").Value.String() 27 } else { 28 title, err = getContext() 29 if err != nil { 30 log.Fatal(err) 31 } 32 } 33 if len(args) < 1 { 34 log.Fatal("no argument") 35 } 36 execCmd := exec.Command(args[0], args[1:]...) 37 execCmd.Stdout = os.Stdout 38 execCmd.Stderr = os.Stderr 39 execCmd.Stdin = os.Stdin 40 start := time.Now() 41 execCmd.Run() 42 elapsed := time.Since(start) 43 var msg string 44 status := execCmd.ProcessState.ExitCode() == 0 45 if status { 46 msg = fmt.Sprintf("`%s` success in %s", strings.Join(args, " "), formatDuration(elapsed)) 47 } else { 48 msg = fmt.Sprintf("`%s` failed (code %d) in %s", strings.Join(args, " "), execCmd.ProcessState.ExitCode(), formatDuration(elapsed)) 49 } 50 if err := backends.Send(cfg, title, msg, &status); err != nil { 51 log.Fatal(err) 52 } 53 } 54 55 func sendFunc(cmd *cobra.Command, args []string) { 56 cfg, err := getConfig() 57 if err != nil { 58 log.Fatal(err) 59 } 60 backends.OverrideConfigs(&cfg, cmd) 61 var title string 62 if cmd.Flags().Lookup("title").Changed { 63 title = cmd.Flags().Lookup("title").Value.String() 64 } else { 65 title, err = getContext() 66 if err != nil { 67 log.Fatal(err) 68 } 69 } 70 if len(args) < 1 { 71 log.Fatal("no argument") 72 } 73 if err := backends.Send(cfg, title, strings.Join(args, " "), nil); err != nil { 74 log.Fatal(err) 75 } 76 } 77 78 func shellIntegrationFunc(cmd *cobra.Command, args []string) { 79 shellPath := xdg.DataHome + "/ntf/ntf-shell-hook.sh" 80 if _, err := os.Stat(shellPath); os.IsNotExist(err) { 81 if err := os.MkdirAll(xdg.DataHome+"/ntf", 0755); err != nil { 82 log.Fatal(err) 83 } 84 if err := ioutil.WriteFile(shellPath, ntf_shell_hook, 0755); err != nil { 85 log.Fatal(err) 86 } 87 } 88 fmt.Println( 89 strings.Join([]string{ 90 "export AUTO_NTF_DONE_LONGER_THAN=${AUTO_NTF_DONE_LONGER_THAN:=10}", 91 fmt.Sprintf("source %s", shellPath), 92 "# To use ntf's shell integration, run this and add it to your shell's rc file:", 93 "# eval \"$(ntf shell-integration)\"", 94 }, "\n"), 95 ) 96 } 97 98 func shellDoneFunc(cmd *cobra.Command, args []string) { 99 cfg, err := getConfig() 100 if err != nil { 101 log.Fatal(err) 102 } 103 backends.OverrideConfigs(&cfg, cmd) 104 var title string 105 if cmd.Flags().Lookup("title").Changed { 106 title = cmd.Flags().Lookup("title").Value.String() 107 } else { 108 title, err = getContext() 109 if err != nil { 110 log.Fatal(err) 111 } 112 } 113 if len(args) < 3 { 114 log.Fatal("invalid arguments") 115 } 116 code, err := strconv.Atoi(args[0]) 117 if err != nil { 118 log.Fatal(err) 119 } 120 duration, err := strconv.Atoi(args[1]) 121 if err != nil { 122 log.Fatal(err) 123 } 124 command := strings.Join(args[2:], " ") 125 status := code == 0 126 if status { 127 msg := fmt.Sprintf("`%s` success in %s", command, formatDuration(time.Second*time.Duration(duration))) 128 if err := backends.Send(cfg, title, msg, &status); err != nil { 129 log.Fatal(err) 130 } 131 } else { 132 msg := fmt.Sprintf("`%s` failed (code %d) in %s", command, code, formatDuration(time.Second*time.Duration(duration))) 133 if err := backends.Send(cfg, title, msg, &status); err != nil { 134 log.Fatal(err) 135 } 136 } 137 }