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" + output_time + " \n\t\t" +
"" + input + "
"))
outputb := reg.ReplaceAll(origb, []byte("\n\n\t\t" + output_time + " \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)
}
}