121
package main
import (
"encoding/json"
bolt "go.etcd.io/bbolt"
"math/rand"
"net/http"
"os"
"strings"
"time"
)
var urlDB *bolt.DB
var wordList []string
type urlStruc struct {
isCustom bool
creator string
date time.Time
path string
url string
uses int
}
func fec(err error) { // fatal error check
if err != nil {
println(err.Error())
urlDB.Close()
os.Exit(1)
}
}
func openFiles() {
b, err := os.ReadFile("wordlist")
fec(err)
if len(b) == 0 {
println("wordlist is empty")
os.Exit(1)
}
wordList = strings.Split(string(b), "\n")
var db *bolt.DB
db, err = bolt.Open("urls.db", 0600, nil)
fec(err)
fec(db.Update(func(tx *bolt.Tx) error {
_, err = tx.CreateBucketIfNotExists([]byte("urls"))
return err
}))
urlDB = db
}
func getWords() string {
word := func() string {
return wordList[rand.Intn(len(wordList))]
}
return word() + "-" + word() + "-" + word()
}
func readURL(words string) (urlStruc, error) {
var url urlStruc
var err error
err = urlDB.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("urls"))
return json.Unmarshal(b.Get([]byte(words)), &url)
})
return url, err
}
func checkURL(words string) bool {
url, err := readURL(words)
if err == nil && url.url != "" {
return true
}
return false
}
func writeURL(url urlStruc) error {
jsonUrl, err := json.Marshal(url)
if err != nil {
return err
}
return urlDB.Update(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("urls"))
return b.Put([]byte(url.path), jsonUrl)
})
}
func http404(w http.ResponseWriter) {
w.WriteHeader(404)
b, err := os.ReadFile("404.html")
if err != nil {
b = []byte("404 not found")
w.Header().Set("Content-Type", "text/plain")
} else {
w.Header().Set("Content-Type", "text/html")
}
w.Write(b)
}
func httpHandler(w http.ResponseWriter, r *http.Request) {
if len(r.URL.Path) > 1 {
path := strings.TrimSuffix(r.URL.Path[1:], "/")
var info bool = false
if strings.HasSuffix(path, "/info") {
info = true
path = strings.TrimSuffix(path, "/info")
}
url, err := readURL(path)
if url != "" {
http.Redirect(w, r, url, http.StatusFound)
return
}
http.Error(w, "404 not found", http.StatusNotFound)
return
}
}
func main() {
openFiles()
}