2016-12-02 07:38:54 +00:00
|
|
|
package main
|
2016-12-03 13:45:08 +00:00
|
|
|
import "fmt"
|
|
|
|
import "time"
|
2016-12-02 07:38:54 +00:00
|
|
|
import "encoding/base64"
|
|
|
|
import "crypto/rand"
|
|
|
|
|
|
|
|
// Generate a cryptographically secure set of random bytes..
|
|
|
|
func GenerateSafeString(length int) (string, error) {
|
|
|
|
rb := make([]byte,length)
|
|
|
|
_, err := rand.Read(rb)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return base64.URLEncoding.EncodeToString(rb), nil
|
2016-12-03 13:45:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func relative_time(in string) (string, error) {
|
|
|
|
layout := "2006-01-02 15:04:05"
|
|
|
|
t, err := time.Parse(layout, in)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
diff := time.Since(t)
|
|
|
|
hours := diff.Hours()
|
|
|
|
seconds := diff.Seconds()
|
|
|
|
switch {
|
|
|
|
case (hours / 24) > 7:
|
|
|
|
return t.Format("Mon Jan 2 2006"), err
|
|
|
|
case int(hours / 24) == 1:
|
|
|
|
return "1 day ago", err
|
|
|
|
case int(hours / 24) > 1:
|
|
|
|
return fmt.Sprintf("%d days ago", int(hours / 24)), err
|
|
|
|
case seconds <= 1:
|
|
|
|
return "a moment ago", err
|
|
|
|
case seconds < 60:
|
|
|
|
return fmt.Sprintf("%d seconds ago", int(seconds)), err
|
|
|
|
case seconds < 120:
|
|
|
|
return "a minute ago", err
|
|
|
|
case seconds < 3600:
|
|
|
|
return fmt.Sprintf("%d minutes ago", int(seconds / 60)), err
|
|
|
|
case seconds < 7200:
|
|
|
|
return "an hour ago", err
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("%d hours ago", int(seconds / 60 / 60)), err
|
|
|
|
}
|
2016-12-02 07:38:54 +00:00
|
|
|
}
|