visitor.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 NewVisitorServer(c *gin.Context) {
  10. go kefuServerBackend()
  11. conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
  12. if err != nil {
  13. log.Print("upgrade:", err)
  14. return
  15. }
  16. //获取GET参数,创建WS
  17. vistorInfo := models.FindVisitorByVistorId(c.Query("visitor_id"))
  18. if vistorInfo.VisitorId == "" {
  19. c.JSON(200, gin.H{
  20. "code": 400,
  21. "msg": "访客不存在",
  22. })
  23. return
  24. }
  25. user := &User{
  26. Conn: conn,
  27. Name: vistorInfo.Name,
  28. Avator: vistorInfo.Avator,
  29. Id: vistorInfo.VisitorId,
  30. To_id: vistorInfo.ToId,
  31. }
  32. AddVisitorToList(user)
  33. for {
  34. //接受消息
  35. var receive []byte
  36. messageType, receive, err := conn.ReadMessage()
  37. if err != nil {
  38. for uid, visitor := range ClientList {
  39. if visitor.Conn == conn {
  40. log.Println("删除用户", uid)
  41. delete(ClientList, uid)
  42. models.UpdateVisitorStatus(uid, 0)
  43. userInfo := make(map[string]string)
  44. userInfo["uid"] = uid
  45. userInfo["name"] = visitor.Name
  46. msg := TypeMessage{
  47. Type: "userOffline",
  48. Data: userInfo,
  49. }
  50. str, _ := json.Marshal(msg)
  51. kefuConns := KefuList[visitor.To_id]
  52. if kefuConns != nil {
  53. for _, kefuConn := range kefuConns {
  54. kefuConn.Conn.WriteMessage(websocket.TextMessage, str)
  55. }
  56. }
  57. }
  58. }
  59. log.Println(err)
  60. return
  61. }
  62. message <- &Message{
  63. conn: conn,
  64. content: receive,
  65. context: c,
  66. messageType: messageType,
  67. }
  68. }
  69. }
  70. func AddVisitorToList(user *User) {
  71. //用户id对应的连接
  72. ClientList[user.Id] = user
  73. userInfo := make(map[string]string)
  74. userInfo["uid"] = user.Id
  75. userInfo["username"] = user.Name
  76. userInfo["avator"] = user.Avator
  77. msg := TypeMessage{
  78. Type: "userOnline",
  79. Data: userInfo,
  80. }
  81. str, _ := json.Marshal(msg)
  82. //新版
  83. mKefuConns := KefuList[user.To_id]
  84. if mKefuConns != nil {
  85. for _, kefu := range mKefuConns {
  86. kefu.Conn.WriteMessage(websocket.TextMessage, str)
  87. }
  88. }
  89. }