user.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package ws
  2. import (
  3. "encoding/json"
  4. "git.wanbits.cc/sin/flytalk/models"
  5. "github.com/gin-gonic/gin"
  6. "github.com/gorilla/websocket"
  7. "log"
  8. )
  9. func NewKefuServer(c *gin.Context) {
  10. kefuId, _ := c.Get("kefu_name")
  11. kefuInfo := models.FindUser(kefuId.(string))
  12. if kefuInfo.ID == 0 {
  13. c.JSON(200, gin.H{
  14. "code": 400,
  15. "msg": "用户不存在",
  16. })
  17. return
  18. }
  19. go kefuServerBackend()
  20. conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
  21. if err != nil {
  22. log.Print("upgrade:", err)
  23. return
  24. }
  25. //获取GET参数,创建WS
  26. var kefu User
  27. kefu.Id = kefuInfo.Name
  28. kefu.Name = kefuInfo.Nickname
  29. kefu.Avator = kefuInfo.Avator
  30. kefu.Conn = conn
  31. AddKefuToList(&kefu)
  32. for {
  33. //接受消息
  34. var receive []byte
  35. messageType, receive, err := conn.ReadMessage()
  36. if err != nil {
  37. log.Println(err)
  38. return
  39. }
  40. message <- &Message{
  41. conn: conn,
  42. content: receive,
  43. context: c,
  44. messageType: messageType,
  45. }
  46. }
  47. }
  48. func AddKefuToList(kefu *User) {
  49. var newKefuConns = []*User{kefu}
  50. kefuConns := KefuList[kefu.Id]
  51. if kefuConns != nil {
  52. for _, kefu := range kefuConns {
  53. msg := TypeMessage{
  54. Type: "pong",
  55. }
  56. str, _ := json.Marshal(msg)
  57. err := kefu.Conn.WriteMessage(websocket.TextMessage, str)
  58. if err != nil {
  59. newKefuConns = append(newKefuConns, kefu)
  60. }
  61. }
  62. }
  63. log.Println(newKefuConns)
  64. KefuList[kefu.Id] = newKefuConns
  65. }
  66. //后端广播发送消息
  67. func kefuServerBackend() {
  68. for {
  69. message := <-message
  70. var typeMsg TypeMessage
  71. json.Unmarshal(message.content, &typeMsg)
  72. conn := message.conn
  73. if typeMsg.Type == nil || typeMsg.Data == nil {
  74. continue
  75. }
  76. msgType := typeMsg.Type.(string)
  77. log.Println("客户端:", string(message.content))
  78. switch msgType {
  79. //心跳
  80. case "ping":
  81. msg := TypeMessage{
  82. Type: "pong",
  83. }
  84. str, _ := json.Marshal(msg)
  85. Mux.Lock()
  86. conn.WriteMessage(websocket.TextMessage, str)
  87. Mux.Unlock()
  88. }
  89. }
  90. }