mirror of https://github.com/gin-gonic/gin.git
97 lines
1.9 KiB
Go
97 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"html"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func rateLimit(c *gin.Context) {
|
|
ip := c.ClientIP()
|
|
value := int(ips.Add(ip, 1))
|
|
if value%50 == 0 {
|
|
fmt.Printf("ip: %s, count: %d\n", ip, value)
|
|
}
|
|
if value >= 200 {
|
|
if value%200 == 0 {
|
|
fmt.Println("ip blocked")
|
|
}
|
|
c.Abort()
|
|
c.String(http.StatusServiceUnavailable, "you were automatically banned :)")
|
|
}
|
|
}
|
|
|
|
func index(c *gin.Context) {
|
|
c.Redirect(http.StatusMovedPermanently, "/room/hn")
|
|
}
|
|
|
|
func roomGET(c *gin.Context) {
|
|
roomid := c.Param("roomid")
|
|
nick := c.Query("nick")
|
|
if len(nick) < 2 {
|
|
nick = ""
|
|
}
|
|
if len(nick) > 13 {
|
|
nick = nick[0:12] + "..."
|
|
}
|
|
c.HTML(http.StatusOK, "room_login.templ.html", gin.H{
|
|
"roomid": roomid,
|
|
"nick": nick,
|
|
"timestamp": time.Now().Unix(),
|
|
})
|
|
|
|
}
|
|
|
|
func roomPOST(c *gin.Context) {
|
|
roomid := c.Param("roomid")
|
|
nick := c.Query("nick")
|
|
message := c.PostForm("message")
|
|
message = strings.TrimSpace(message)
|
|
|
|
validMessage := len(message) > 1 && len(message) < 200
|
|
validNick := len(nick) > 1 && len(nick) < 14
|
|
if !validMessage || !validNick {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"status": "failed",
|
|
"error": "the message or nickname is too long",
|
|
})
|
|
return
|
|
}
|
|
|
|
post := gin.H{
|
|
"nick": html.EscapeString(nick),
|
|
"message": html.EscapeString(message),
|
|
}
|
|
messages.Add("inbound", 1)
|
|
room(roomid).Submit(post)
|
|
c.JSON(http.StatusOK, post)
|
|
}
|
|
|
|
func streamRoom(c *gin.Context) {
|
|
roomid := c.Param("roomid")
|
|
listener := openListener(roomid)
|
|
ticker := time.NewTicker(1 * time.Second)
|
|
users.Add("connected", 1)
|
|
defer func() {
|
|
closeListener(roomid, listener)
|
|
ticker.Stop()
|
|
users.Add("disconnected", 1)
|
|
}()
|
|
|
|
c.Stream(func(w io.Writer) bool {
|
|
select {
|
|
case msg := <-listener:
|
|
messages.Add("outbound", 1)
|
|
c.SSEvent("message", msg)
|
|
case <-ticker.C:
|
|
c.SSEvent("stats", Stats())
|
|
}
|
|
return true
|
|
})
|
|
}
|