routes.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package main
  2. import (
  3. "fmt"
  4. "html"
  5. "io"
  6. "strings"
  7. "time"
  8. "github.com/gin-gonic/gin"
  9. )
  10. func rateLimit(c *gin.Context) {
  11. ip := c.ClientIP()
  12. value := int(ips.Add(ip, 1))
  13. if value%10 == 0 {
  14. fmt.Printf("ip: %s, count: %d\n", ip, value)
  15. }
  16. if value >= 100 {
  17. if value%100 == 0 {
  18. fmt.Println("ip blocked")
  19. }
  20. c.Abort()
  21. c.String(503, "you were automatically banned :)")
  22. }
  23. }
  24. func index(c *gin.Context) {
  25. c.Redirect(301, "/room/hn")
  26. }
  27. func roomGET(c *gin.Context) {
  28. roomid := c.ParamValue("roomid")
  29. nick := c.FormValue("nick")
  30. if len(nick) < 2 {
  31. nick = ""
  32. }
  33. if len(nick) > 13 {
  34. nick = nick[0:12] + "..."
  35. }
  36. c.HTML(200, "room_login.templ.html", gin.H{
  37. "roomid": roomid,
  38. "nick": nick,
  39. "timestamp": time.Now().Unix(),
  40. })
  41. }
  42. func roomPOST(c *gin.Context) {
  43. roomid := c.ParamValue("roomid")
  44. nick := c.FormValue("nick")
  45. message := c.PostFormValue("message")
  46. message = strings.TrimSpace(message)
  47. validMessage := len(message) > 1 && len(message) < 200
  48. validNick := len(nick) > 1 && len(nick) < 14
  49. if !validMessage || !validNick {
  50. c.JSON(400, gin.H{
  51. "status": "failed",
  52. "error": "the message or nickname is too long",
  53. })
  54. return
  55. }
  56. post := gin.H{
  57. "nick": html.EscapeString(nick),
  58. "message": html.EscapeString(message),
  59. }
  60. messages.Add("inbound", 1)
  61. room(roomid).Submit(post)
  62. c.JSON(200, post)
  63. }
  64. func streamRoom(c *gin.Context) {
  65. roomid := c.ParamValue("roomid")
  66. listener := openListener(roomid)
  67. ticker := time.NewTicker(1 * time.Second)
  68. users.Add("connected", 1)
  69. defer func() {
  70. closeListener(roomid, listener)
  71. ticker.Stop()
  72. users.Add("disconnected", 1)
  73. }()
  74. c.Stream(func(w io.Writer) bool {
  75. select {
  76. case msg := <-listener:
  77. messages.Add("outbound", 1)
  78. c.SSEvent("message", msg)
  79. case <-ticker.C:
  80. c.SSEvent("stats", Stats())
  81. }
  82. return true
  83. })
  84. }