routes.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "html"
  4. "io"
  5. "strings"
  6. "time"
  7. "github.com/gin-gonic/gin"
  8. )
  9. func index(c *gin.Context) {
  10. c.Redirect(301, "/room/hn")
  11. }
  12. func roomGET(c *gin.Context) {
  13. roomid := c.ParamValue("roomid")
  14. nick := c.FormValue("nick")
  15. if len(nick) < 2 {
  16. nick = ""
  17. }
  18. if len(nick) > 13 {
  19. nick = nick[0:12] + "..."
  20. }
  21. c.HTML(200, "room_login.templ.html", gin.H{
  22. "roomid": roomid,
  23. "nick": nick,
  24. "timestamp": time.Now().Unix(),
  25. })
  26. }
  27. func roomPOST(c *gin.Context) {
  28. roomid := c.ParamValue("roomid")
  29. nick := c.FormValue("nick")
  30. message := c.PostFormValue("message")
  31. message = strings.TrimSpace(message)
  32. validMessage := len(message) > 1 && len(message) < 200
  33. validNick := len(nick) > 1 && len(nick) < 14
  34. if !validMessage || !validNick {
  35. c.JSON(400, gin.H{
  36. "status": "failed",
  37. "error": "the message or nickname is too long",
  38. })
  39. return
  40. }
  41. post := gin.H{
  42. "nick": html.EscapeString(nick),
  43. "message": html.EscapeString(message),
  44. }
  45. messages.Add("inbound", 1)
  46. room(roomid).Submit(post)
  47. c.JSON(200, post)
  48. }
  49. func streamRoom(c *gin.Context) {
  50. roomid := c.ParamValue("roomid")
  51. listener := openListener(roomid)
  52. ticker := time.NewTicker(1 * time.Second)
  53. defer closeListener(roomid, listener)
  54. defer ticker.Stop()
  55. c.Stream(func(w io.Writer) bool {
  56. select {
  57. case msg := <-listener:
  58. messages.Add("outbound", 1)
  59. c.SSEvent("message", msg)
  60. case <-ticker.C:
  61. c.SSEvent("stats", Stats())
  62. }
  63. return true
  64. })
  65. }