package main import ( "os" "regexp" "time" "strconv" "net/http" "html" ) var post_number = 1 var users = make(map[string]int) var reg, _ = regexp.Compile("

") var reg2, _ = regexp.Compile("((?s).+)") var reglt, _ = regexp.Compile("<") var reggt, _ = regexp.Compile(">") var nip, _ = time.LoadLocation("Asia/Tokyo") var notice = "

Posts are deleted every 7 days. 10 posts, up to 400 characters each, per user daily.

" func check(e error) { if e != nil { panic(e) } } func initial(w http.ResponseWriter, req *http.Request) { counter := 0 value := "false" for _, c := range req.Cookies() { counter++ value = c.Value } if value == "false" || counter == 0 { http.Redirect(w, req, "http://[200:c5b0:cfeb:5db:c054:d66d:eb6f:7412]/rosa/", http.StatusFound) } else { http.Redirect(w, req, "http://[200:c5b0:cfeb:5db:c054:d66d:eb6f:7412]/nun/", http.StatusFound) } } func click(w http.ResponseWriter, req *http.Request) { prior, err := strconv.ParseBool(req.FormValue("deco")) check(err) current := strconv.FormatBool(!prior) cookie := &http.Cookie{ Name: "clicked", Value: current, Path: "/", } http.SetCookie(w, cookie) http.Redirect(w, req, "http://[200:c5b0:cfeb:5db:c054:d66d:eb6f:7412]/bbs/", http.StatusFound) } func post(w http.ResponseWriter, req *http.Request) { if users[req.Header.Get("X-Real-IP")] < 10 { users[req.Header.Get("X-Real-IP")]++ new_post(req.FormValue("post")) } http.Redirect(w, req, "http://[200:c5b0:cfeb:5db:c054:d66d:eb6f:7412]/bbs/", http.StatusFound) } func new_post(input string) { orig, err := os.ReadFile("/mnt/c/server/data/rosa/index.html") check(err); origb, err := os.ReadFile("/mnt/c/server/data/nun/index.html") check(err); input = filter(input) output_time := new_post_time() output := reg.ReplaceAll(orig, []byte("

\n\n\t\t\n\t\t" + "

" + input + "

")) outputb := reg.ReplaceAll(origb, []byte("

\n\n\t\t\n\t\t" + "

" + input + "

")) err = os.WriteFile("/mnt/c/server/data/rosa/index.html", output, 0644) check(err) err = os.WriteFile("/mnt/c/server/data/nun/index.html", outputb, 0644) check(err) post_number++ } func filter(input string) string { if len(input) > 400 { input = input[:400] } input = html.EscapeString(input) return input } func new_post_time() string { now := time.Now().In(nip) return now.Format("1/2 15:04") + " | " + strconv.Itoa(post_number) } func reset_board() { orig, err := os.ReadFile("/mnt/c/server/data/rosa/index.html") check(err); origb, err := os.ReadFile("/mnt/c/server/data/nun/index.html") check(err); output := reg2.ReplaceAll(orig, []byte("\n\t\t" + notice + "\n\n\t")) outputb := reg2.ReplaceAll(origb, []byte("\n\t\t" + notice + "\n\n\t")) err = os.WriteFile("/mnt/c/server/data/rosa/index.html", output, 0644) check(err) err = os.WriteFile("/mnt/c/server/data/nun/index.html", outputb, 0644) check(err) post_number = 1 } func main() { go func() { for range time.Tick(168 * time.Hour) { reset_board() }}() go func() { for range time.Tick(24 * time.Hour) { users = make(map[string]int) }}() mux := http.NewServeMux() mux.HandleFunc("/bbs/", initial) mux.HandleFunc("/bbs/click/", click) mux.HandleFunc("/bbs/post/", post) if err := http.ListenAndServe(":8090", mux); err != nil { panic(err) } }