ntfy/util/util.go

78 lines
1.6 KiB
Go
Raw Normal View History

2021-10-29 17:58:14 +00:00
package util
import (
2021-11-08 14:24:34 +00:00
"fmt"
2021-10-29 17:58:14 +00:00
"math/rand"
"os"
2021-12-07 21:03:01 +00:00
"sync"
2021-10-29 17:58:14 +00:00
"time"
)
const (
randomStringCharset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
)
var (
2021-12-07 21:03:01 +00:00
random = rand.New(rand.NewSource(time.Now().UnixNano()))
randomMutex = sync.Mutex{}
2021-10-29 17:58:14 +00:00
)
2021-12-07 16:45:15 +00:00
// FileExists checks if a file exists, and returns true if it does
2021-10-29 17:58:14 +00:00
func FileExists(filename string) bool {
stat, _ := os.Stat(filename)
return stat != nil
}
2021-12-09 03:13:59 +00:00
// InStringList returns true if needle is contained in haystack
func InStringList(haystack []string, needle string) bool {
for _, s := range haystack {
if s == needle {
return true
}
}
return false
}
2021-10-29 17:58:14 +00:00
// RandomString returns a random string with a given length
func RandomString(length int) string {
2021-12-07 21:03:01 +00:00
randomMutex.Lock() // Who would have thought that random.Intn() is not thread-safe?!
defer randomMutex.Unlock()
2021-10-29 17:58:14 +00:00
b := make([]byte, length)
for i := range b {
b[i] = randomStringCharset[random.Intn(len(randomStringCharset))]
}
return string(b)
}
2021-11-08 14:24:34 +00:00
// DurationToHuman converts a duration to a human readable format
func DurationToHuman(d time.Duration) (str string) {
if d == 0 {
return "0"
}
d = d.Round(time.Second)
days := d / time.Hour / 24
if days > 0 {
str += fmt.Sprintf("%dd", days)
}
d -= days * time.Hour * 24
hours := d / time.Hour
if hours > 0 {
str += fmt.Sprintf("%dh", hours)
}
d -= hours * time.Hour
minutes := d / time.Minute
if minutes > 0 {
str += fmt.Sprintf("%dm", minutes)
}
d -= minutes * time.Minute
seconds := d / time.Second
if seconds > 0 {
str += fmt.Sprintf("%ds", seconds)
}
return
}