gin/examples/realtime-advanced/routes.go

97 lines
1.9 KiB
Go
Raw Normal View History

2015-05-13 18:54:54 +00:00
package main
import (
2015-05-14 18:50:06 +00:00
"fmt"
2015-05-13 18:54:54 +00:00
"html"
"io"
"net/http"
2015-05-14 15:01:02 +00:00
"strings"
2015-05-13 18:54:54 +00:00
"time"
"github.com/gin-gonic/gin"
)
2015-05-14 18:25:55 +00:00
func rateLimit(c *gin.Context) {
ip := c.ClientIP()
2015-05-14 20:49:42 +00:00
value := int(ips.Add(ip, 1))
2015-05-14 20:52:37 +00:00
if value%50 == 0 {
2015-05-14 20:49:42 +00:00
fmt.Printf("ip: %s, count: %d\n", ip, value)
2015-05-14 18:52:45 +00:00
}
2015-05-14 20:52:37 +00:00
if value >= 200 {
if value%200 == 0 {
2015-05-14 18:50:06 +00:00
fmt.Println("ip blocked")
2015-05-14 18:25:55 +00:00
}
2015-05-14 20:49:42 +00:00
c.Abort()
c.String(http.StatusServiceUnavailable, "you were automatically banned :)")
2015-05-14 18:25:55 +00:00
}
}
2015-05-13 18:54:54 +00:00
func index(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, "/room/hn")
2015-05-13 18:54:54 +00:00
}
func roomGET(c *gin.Context) {
2015-05-26 10:15:43 +00:00
roomid := c.Param("roomid")
nick := c.Query("nick")
2015-05-13 18:54:54 +00:00
if len(nick) < 2 {
nick = ""
}
if len(nick) > 13 {
nick = nick[0:12] + "..."
}
c.HTML(http.StatusOK, "room_login.templ.html", gin.H{
2015-05-13 18:54:54 +00:00
"roomid": roomid,
"nick": nick,
"timestamp": time.Now().Unix(),
})
}
func roomPOST(c *gin.Context) {
2015-05-26 10:15:43 +00:00
roomid := c.Param("roomid")
nick := c.Query("nick")
message := c.PostForm("message")
2015-05-14 15:01:02 +00:00
message = strings.TrimSpace(message)
2015-05-13 18:54:54 +00:00
validMessage := len(message) > 1 && len(message) < 200
validNick := len(nick) > 1 && len(nick) < 14
if !validMessage || !validNick {
c.JSON(http.StatusBadRequest, gin.H{
2015-05-13 18:54:54 +00:00
"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)
2015-05-13 18:54:54 +00:00
}
func streamRoom(c *gin.Context) {
2015-05-26 10:15:43 +00:00
roomid := c.Param("roomid")
2015-05-13 18:54:54 +00:00
listener := openListener(roomid)
ticker := time.NewTicker(1 * time.Second)
2015-05-14 16:16:00 +00:00
users.Add("connected", 1)
defer func() {
closeListener(roomid, listener)
ticker.Stop()
users.Add("disconnected", 1)
}()
2015-05-13 18:54:54 +00:00
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
})
}