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  }