diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..2f35b19 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,29 @@ +--- +linters: + enable: + - asciicheck + - bodyclose + - dogsled + - dupl + - exhaustive + - gochecknoinits + - gocognit + - gocritic + - gocyclo + - goerr113 + - gofumpt + - goimports + - gomnd + - goprintffuncname + - gosec + - interfacer + - maligned + - misspell + - nakedret + - nestif + - nlreturn + - noctx + - unparam + - wsl + disable: + - gochecknoglobals diff --git a/auth.go b/auth.go index 00973c3..25a71c1 100644 --- a/auth.go +++ b/auth.go @@ -14,11 +14,17 @@ import ( ) var ( - // These are set via build flags but can be overriden via environment variables. + // These are set via build flags but can be overridden via environment variables. defaultClientID = "" defaultClientSecret = "" ) +const ( + httpReadTimeout = 5 * time.Second + httpWriteTimeout = 10 * time.Second + httpIdleTimeout = 120 * time.Second +) + type slackApp struct { clientID, clientSecret, redirectURI string scopes, userScopes []string @@ -45,9 +51,9 @@ func (app slackApp) listenForCode() (string, error) { // Also, should generate TLS certificate to use since https is a required scheme server := http.Server{ Addr: app.listenHost, - ReadTimeout: 5 * time.Second, - WriteTimeout: 10 * time.Second, - IdleTimeout: 120 * time.Second, + ReadTimeout: httpReadTimeout, + WriteTimeout: httpWriteTimeout, + IdleTimeout: httpIdleTimeout, } http.HandleFunc(app.listenPath, func(w http.ResponseWriter, r *http.Request) { diff --git a/config.go b/config.go index b8ef369..d90b0b7 100644 --- a/config.go +++ b/config.go @@ -10,9 +10,7 @@ import ( "path/filepath" ) -var ( - errUnknownDomain = errors.New("unknown domain") -) +var errUnknownDomain = errors.New("unknown domain") type configData struct { DefaultDomain string @@ -29,7 +27,7 @@ func getConfigFilePath(filename string) (string, error) { } configDir = filepath.Join(configDir, configApplicationName) - _ = os.MkdirAll(configDir, 0755) + _ = os.MkdirAll(configDir, 0o755) configFile := filepath.Join(configDir, filename) // Handle migration of old config file path @@ -46,6 +44,7 @@ func getConfigFilePath(filename string) (string, error) { if fileExists(legacyConfigFile) { log.Printf("Migrating config from %s to %s\n", legacyConfigFile, configFile) + err = os.Rename(legacyConfigFile, configFile) if err != nil { err = fmt.Errorf( @@ -98,7 +97,7 @@ func writeConfig(config configData) error { return fmt.Errorf("failed converting config to json: %w", err) } - if err = ioutil.WriteFile(configPath, contents, 0600); err != nil { + if err = ioutil.WriteFile(configPath, contents, 0o600); err != nil { return fmt.Errorf("error writing config to file: %w", err) } diff --git a/main.go b/main.go index a2ade43..9201cb8 100644 --- a/main.go +++ b/main.go @@ -10,23 +10,19 @@ import ( "github.com/slack-go/slack" ) -var ( - version = "dev" -) +var version = "dev" // statusInfo contains all args passed from the command line type statusInfo struct { - // status contents emoji, statusText string duration time.Duration snooze bool +} - // domain and login management - login, makeDefault bool - domain string - - // other - showVersion bool +// commandOptions contains non-status options passed to the command +type commandOptions struct { + login, makeDefault, showVersion bool + domain string } // getExipirationTime returns epoch time that status should expire from the duration. @@ -74,7 +70,7 @@ func readDurationArgs(args []string) ([]string, *time.Duration) { } // readFlags will read all flags off the command line. -func readFlags() statusInfo { +func readFlags() (statusInfo, commandOptions) { // Non-status flags login := flag.Bool("login", false, "login to a Slack workspace") domain := flag.String("domain", "", "domain to set status on") @@ -111,16 +107,16 @@ func readFlags() statusInfo { statusText := strings.Join(args, " ") return statusInfo{ - duration: *duration, - snooze: *snooze, - emoji: *emoji, - statusText: statusText, - - login: *login, - domain: *domain, - makeDefault: *makeDefault, - showVersion: *showVersion, - } + duration: *duration, + snooze: *snooze, + emoji: *emoji, + statusText: statusText, + }, commandOptions{ + login: *login, + domain: *domain, + makeDefault: *makeDefault, + showVersion: *showVersion, + } } // loginAndSave will return a client after a new login flow and save the results @@ -152,6 +148,7 @@ func loginAndSave(domain string) (*slack.Client, error) { // getClient returns a client either via the provided login or default login func getClient(domain string) (*slack.Client, error) { var accessToken string + var err error if domain == "" { @@ -170,21 +167,23 @@ func getClient(domain string) (*slack.Client, error) { } func main() { - args := readFlags() + status, options := readFlags() - if args.showVersion { + if options.showVersion { fmt.Println("version:", version) + return } var client *slack.Client + var err error // If the new-auth flag is present, force an auth flow - if args.login { - client, err = loginAndSave(args.domain) + if options.login { + client, err = loginAndSave(options.domain) } else { - client, err = getClient(args.domain) + client, err = getClient(options.domain) } // We encountered some error in logging in @@ -193,21 +192,21 @@ func main() { log.Fatal(fmt.Errorf("failed to get or save client: %w", err)) } - // If a domain is provided and asked to make deafult, save it to config - if args.makeDefault && args.domain != "" { - if err = saveDefaultLogin(args.domain); err != nil { - log.Fatal(fmt.Errorf("failed saving default domain %s: %w", args.domain, err)) + // If a domain is provided and asked to make default, save it to config + if options.makeDefault && options.domain != "" { + if err = saveDefaultLogin(options.domain); err != nil { + log.Fatal(fmt.Errorf("failed saving default domain %s: %w", options.domain, err)) } } - err = client.SetUserCustomStatus(args.statusText, args.emoji, args.getExpirationTime()) + err = client.SetUserCustomStatus(status.statusText, status.emoji, status.getExpirationTime()) if err != nil { fmt.Println("error setting status") panic(err) } - if args.snooze { - _, err = client.SetSnooze(int(args.duration.Minutes())) + if status.snooze { + _, err = client.SetSnooze(int(status.duration.Minutes())) if err != nil { fmt.Println("error setting snooze") panic(err)