visitor.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package controller
  2. import (
  3. "encoding/json"
  4. "git.wanbits.cc/sin/flytalk/config"
  5. "git.wanbits.cc/sin/flytalk/models"
  6. "git.wanbits.cc/sin/flytalk/tools"
  7. "git.wanbits.cc/sin/flytalk/user/provider/twong"
  8. "github.com/gin-gonic/gin"
  9. "github.com/gorilla/websocket"
  10. "log"
  11. "strconv"
  12. )
  13. func PostVisitor(c *gin.Context) {
  14. name := c.PostForm("name")
  15. avator := c.PostForm("avator")
  16. toId := c.PostForm("to_id")
  17. id := c.PostForm("id")
  18. refer := c.PostForm("refer")
  19. city := c.PostForm("city")
  20. client_ip := c.PostForm("client_ip")
  21. if name == "" || avator == "" || toId == "" || id == "" || refer == "" || city == "" || client_ip == "" {
  22. c.JSON(200, gin.H{
  23. "code": 400,
  24. "msg": "error",
  25. })
  26. return
  27. }
  28. kefuInfo := models.FindUser(toId)
  29. if kefuInfo.ID == 0 {
  30. c.JSON(200, gin.H{
  31. "code": 400,
  32. "msg": "用户不存在",
  33. })
  34. return
  35. }
  36. models.CreateVisitor(name, avator, c.ClientIP(), toId, id, refer, city, client_ip)
  37. userInfo := make(map[string]string)
  38. userInfo["uid"] = id
  39. userInfo["username"] = name
  40. userInfo["avator"] = avator
  41. msg := TypeMessage{
  42. Type: "userOnline",
  43. Data: userInfo,
  44. }
  45. str, _ := json.Marshal(msg)
  46. kefuConns := kefuList[toId]
  47. if kefuConns != nil {
  48. for k, kefuConn := range kefuConns {
  49. log.Println(k, "xxxxxxxx")
  50. kefuConn.WriteMessage(websocket.TextMessage, str)
  51. }
  52. }
  53. c.JSON(200, gin.H{
  54. "code": 200,
  55. "msg": "ok",
  56. })
  57. }
  58. // post /visitor_login
  59. // 访客第一次连接时请求
  60. func PostVisitorLogin(c *gin.Context) {
  61. suid := c.PostForm("uid")
  62. uid, err := strconv.ParseUint(suid, 10, 64)
  63. if err != nil || uid <= 0 {
  64. c.JSON(200, gin.H{
  65. "code": 400,
  66. "msg": "参数错误",
  67. })
  68. return
  69. }
  70. ipcity := tools.ParseIp(c.ClientIP())
  71. toId := c.PostForm("to_id")
  72. refer := c.PostForm("refer")
  73. var city string
  74. if ipcity != nil {
  75. city = ipcity.CountryName + ipcity.RegionName + ipcity.CityName
  76. } else {
  77. city = "未知地区"
  78. }
  79. client_ip := c.ClientIP() // c.PostForm("client_ip")
  80. ut := twong.NewTwongUser()
  81. v, err := ut.GetVisitorInfo(uid)
  82. if err != nil {
  83. c.JSON(200, gin.H{
  84. "code": 400,
  85. "msg": err.Error(),
  86. })
  87. return
  88. }
  89. //log.Println(name,avator,c.ClientIP(),toId,id,refer,city,client_ip)
  90. if v.Name == "" || v.Avator == "" || toId == "" || v.VisitorId == "" || city == "" || client_ip == "" {
  91. c.JSON(200, gin.H{
  92. "code": 400,
  93. "msg": "error",
  94. })
  95. return
  96. }
  97. if refer == "" {
  98. refer = "app"
  99. }
  100. // 找到客服信息
  101. kefuInfo := models.FindUser(toId)
  102. if kefuInfo.ID == 0 {
  103. c.JSON(200, gin.H{
  104. "code": 400,
  105. "msg": "客服不存在",
  106. })
  107. return
  108. }
  109. // 插入或更新 访客信息
  110. models.CreateVisitor(v.Name, v.Avator,
  111. client_ip, toId, v.VisitorId, refer, city, client_ip)
  112. visitor := models.FindVisitorByVistorId(v.VisitorId)
  113. visitor.ToId = toId
  114. c.JSON(200, gin.H{
  115. "code": 200,
  116. "msg": "ok",
  117. "result": visitor,
  118. })
  119. }
  120. func GetVisitor(c *gin.Context) {
  121. visitorId := c.Query("visitorId")
  122. vistor := models.FindVisitorByVistorId(visitorId)
  123. c.JSON(200, gin.H{
  124. "code": 200,
  125. "msg": "ok",
  126. "result": vistor,
  127. })
  128. }
  129. // @Summary 获取访客列表接口
  130. // @Produce json
  131. // @Accept multipart/form-data
  132. // @Param page query string true "分页"
  133. // @Param token header string true "认证token"
  134. // @Success 200 {object} controller.Response
  135. // @Failure 200 {object} controller.Response
  136. // @Router /visitors [get]
  137. func GetVisitors(c *gin.Context) {
  138. page, _ := strconv.Atoi(c.Query("page"))
  139. kefuId, _ := c.Get("kefu_name")
  140. vistors := models.FindVisitorsByKefuId(page, config.PAGE_SIZE_VISITOR, kefuId.(string))
  141. count := models.CountVisitorsByKefuId(kefuId.(string))
  142. c.JSON(200, gin.H{
  143. "code": 200,
  144. "msg": "ok",
  145. "result": gin.H{
  146. "list": vistors,
  147. "count": count,
  148. "pagesize": config.PageSize,
  149. },
  150. })
  151. }
  152. // @Summary 获取访客聊天信息接口
  153. // @Produce json
  154. // @Accept multipart/form-data
  155. // @Param visitorId query string true "访客ID"
  156. // @Param token header string true "认证token"
  157. // @Success 200 {object} controller.Response
  158. // @Failure 200 {object} controller.Response
  159. // @Router /messages [get]
  160. func GetVisitorMessage(c *gin.Context) {
  161. visitorId := c.Query("visitorId")
  162. kefuId := c.Query("kefuId")
  163. messages := models.FindMessagesByVisitorAndKefuId(visitorId, kefuId)
  164. result := make([]map[string]interface{}, 0)
  165. for _, message := range messages {
  166. item := make(map[string]interface{})
  167. var visitor models.Visitor
  168. var kefu models.User
  169. if visitor.Name == "" || kefu.Name == "" {
  170. kefu = models.FindUser(message.KefuId)
  171. visitor = models.FindVisitorByVistorId(message.VisitorId)
  172. }
  173. item["time"] = message.CreatedAt.Format("2006-01-02 15:04:05")
  174. item["content"] = message.Content
  175. item["mes_type"] = message.MesType
  176. item["visitor_name"] = visitor.Name
  177. item["visitor_avator"] = visitor.Avator
  178. item["kefu_name"] = kefu.Nickname
  179. item["kefu_avator"] = kefu.Avator
  180. result = append(result, item)
  181. }
  182. models.ReadMessageByVisitorId(visitorId)
  183. c.JSON(200, gin.H{
  184. "code": 200,
  185. "msg": "ok",
  186. "result": result,
  187. })
  188. }
  189. // @Summary 获取在线访客列表接口
  190. // @Produce json
  191. // @Success 200 {object} controller.Response
  192. // @Failure 200 {object} controller.Response
  193. // @Router /visitors_online [get]
  194. func GetVisitorOnlines(c *gin.Context) {
  195. users := make([]map[string]string, 0)
  196. visitorIds := make([]string, 0)
  197. for uid, visitor := range clientList {
  198. userInfo := make(map[string]string)
  199. userInfo["uid"] = uid
  200. userInfo["name"] = visitor.name
  201. userInfo["avator"] = visitor.avator
  202. users = append(users, userInfo)
  203. visitorIds = append(visitorIds, visitor.id)
  204. }
  205. //查询最新消息
  206. messages := models.FindLastMessage(visitorIds)
  207. temp := make(map[string]string, 0)
  208. for _, mes := range messages {
  209. temp[mes.VisitorId] = mes.Content
  210. }
  211. for _, user := range users {
  212. user["last_message"] = temp[user["uid"]]
  213. }
  214. tcps := make([]string, 0)
  215. for ip, _ := range clientTcpList {
  216. tcps = append(tcps, ip)
  217. }
  218. c.JSON(200, gin.H{
  219. "code": 200,
  220. "msg": "ok",
  221. "result": gin.H{
  222. "ws": users,
  223. "tcp": tcps,
  224. },
  225. })
  226. }