routes.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. users.Add("connected", 1)
  54. defer func() {
  55. closeListener(roomid, listener)
  56. ticker.Stop()
  57. users.Add("disconnected", 1)
  58. }()
  59. c.Stream(func(w io.Writer) bool {
  60. select {
  61. case msg := <-listener:
  62. messages.Add("outbound", 1)
  63. c.SSEvent("message", msg)
  64. case <-ticker.C:
  65. c.SSEvent("stats", Stats())
  66. }
  67. return true
  68. })
  69. }