chatcontroller.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package controller
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "github.com/gorilla/websocket"
  7. "net/http"
  8. "strconv"
  9. "trading-go/model"
  10. "trading-go/response"
  11. )
  12. var UP = websocket.Upgrader{
  13. CheckOrigin: func(r *http.Request) bool {
  14. return true
  15. },
  16. ReadBufferSize: 1024,
  17. WriteBufferSize: 1024,
  18. }
  19. type client struct {
  20. conn *websocket.Conn
  21. pip chan *model.Message
  22. }
  23. var Conns map[uint]*client
  24. func init() {
  25. Conns = make(map[uint]*client)
  26. }
  27. // 发送消息
  28. func send(conn *websocket.Conn, uid uint) {
  29. pip := Conns[uid].pip
  30. defer func() {
  31. delete(Conns, uid)
  32. }()
  33. for {
  34. data := <-pip
  35. err := data.Save()
  36. if err != nil {
  37. fmt.Println(err.Error())
  38. break
  39. }
  40. msg, err := json.Marshal(data)
  41. if err != nil {
  42. fmt.Println("link closed")
  43. break
  44. }
  45. if data.MsgType == 1 {
  46. err = conn.WriteMessage(data.MsgType, msg)
  47. if err != nil {
  48. fmt.Println(err.Error())
  49. break
  50. }
  51. } else if data.MsgType == 2 {
  52. err = conn.WriteMessage(websocket.TextMessage, msg)
  53. if err != nil {
  54. fmt.Println(err.Error())
  55. break
  56. }
  57. }
  58. }
  59. }
  60. // 接收消息
  61. func reception(conn *websocket.Conn, uid uint) {
  62. defer func() {
  63. delete(Conns, uid)
  64. }()
  65. for {
  66. var msg model.Message
  67. err := conn.ReadJSON(&msg)
  68. if err != nil {
  69. fmt.Println(err.Error())
  70. break
  71. }
  72. err = msg.Save()
  73. if err != nil {
  74. fmt.Println(err.Error())
  75. break
  76. }
  77. if v, ok := Conns[msg.To]; ok {
  78. v.pip <- &msg
  79. } else {
  80. }
  81. }
  82. }
  83. //func broadcast(data model.Message) {
  84. // for _, conn := range Conns {
  85. // msg, err := json.Marshal(data)
  86. // if err != nil {
  87. // fmt.Println(err.Error())
  88. // break
  89. // }
  90. // err = conn.conn.WriteMessage(data.MsgType, msg)
  91. // if err != nil {
  92. // fmt.Println(err.Error())
  93. // break
  94. // }
  95. // }
  96. //}
  97. //func heartBeat(conn *websocket.Conn, uid uint) {
  98. // defer func() {
  99. // delete(Conns, uid)
  100. // }()
  101. // for {
  102. // msg := model.Message{
  103. // MsgType: 4,
  104. // From: 0,
  105. // To: uid,
  106. // Time: uint(time.Now().Unix()),
  107. // Content: "alive",
  108. // }
  109. // data, err := json.Marshal(msg)
  110. // if err != nil {
  111. // fmt.Println(err.Error())
  112. // break
  113. // }
  114. // err = conn.WriteMessage(websocket.TextMessage, data)
  115. // if err != nil {
  116. // fmt.Println(err.Error())
  117. // break
  118. // }
  119. // time.Sleep(time.Second * 5)
  120. // }
  121. //}
  122. func Chat(w http.ResponseWriter, rq *http.Request, uid uint) {
  123. // 升级为websocket
  124. conn, err := UP.Upgrade(w, rq, nil)
  125. if err != nil {
  126. response.Fail(w, err.Error(), http.StatusUpgradeRequired)
  127. return
  128. }
  129. pip := make(chan *model.Message, 1024)
  130. client := client{
  131. conn: conn,
  132. pip: pip,
  133. }
  134. Conns[uid] = &client
  135. go send(conn, uid)
  136. go reception(conn, uid)
  137. //go heartBeat(conn, uid)
  138. response.Success(w, "success", nil)
  139. }
  140. // LinkToServer
  141. // @Tags 聊天模块
  142. // @Summary 与服务端进行websocket连接,请使用postman测试
  143. // @Success 200 {object} response.Response
  144. // @Router /chat [get]
  145. func LinkToServer(c *gin.Context) {
  146. uid, err := strconv.Atoi(c.Query("uid"))
  147. if err != nil {
  148. response.Fail(c.Writer, "failed", 500)
  149. return
  150. }
  151. Chat(c.Writer, c.Request, uint(uid))
  152. }
  153. // GetMsgFromPaged
  154. // @Tags 聊天模块
  155. // @Summary 获取未过期且来源为特定用户的聊天记录
  156. // @Success 200 {object} response.Response
  157. // @Param page path int true "页数"
  158. // @Param pageSize path int true "一页的大小"
  159. // @Param uid query string true "用户id"
  160. // @Router /chat/from/{page}/{pageSize} [get]
  161. func GetMsgFromPaged(c *gin.Context) {
  162. id := c.Query("uid")
  163. p := c.Param("page")
  164. pS := c.Param("pageSize")
  165. page, err := strconv.Atoi(p)
  166. pageSize, err := strconv.Atoi(pS)
  167. if err != nil {
  168. response.Fail(c.Writer, err.Error(), 500)
  169. return
  170. }
  171. uid, err := strconv.ParseUint(id, 10, 64)
  172. if err != nil {
  173. msg := err.Error()
  174. response.Fail(c.Writer, msg, 500)
  175. return
  176. }
  177. rsp, err := model.Message{}.GetFrom(uint(uid), page, pageSize)
  178. if err != nil {
  179. response.Fail(c.Writer, err.Error(), 500)
  180. return
  181. }
  182. response.Success(c.Writer, "success", rsp)
  183. }
  184. // GetMsgToPaged
  185. // @Tags 聊天模块
  186. // @Summary 获取未过期且目标为特定用户的聊天记录
  187. // @Param page path int true "页数"
  188. // @Param pageSize path int true "一页的大小"
  189. // @Param uid query string true "用户id"
  190. // @Success 200 {object} response.Response
  191. // @Router /chat/to/{page}/{pageSize} [get]
  192. func GetMsgToPaged(c *gin.Context) {
  193. id := c.Query("uid")
  194. p := c.Param("page")
  195. pS := c.Param("pageSize")
  196. page, err := strconv.Atoi(p)
  197. pageSize, err := strconv.Atoi(pS)
  198. if err != nil {
  199. response.Fail(c.Writer, err.Error(), 500)
  200. return
  201. }
  202. uid, err := strconv.ParseUint(id, 10, 64)
  203. if err != nil {
  204. msg := err.Error()
  205. response.Fail(c.Writer, msg, 500)
  206. return
  207. }
  208. rsp, err := model.Message{}.GetTo(uint(uid), page, pageSize)
  209. if err != nil {
  210. response.Fail(c.Writer, err.Error(), 500)
  211. return
  212. }
  213. response.Success(c.Writer, "success", rsp)
  214. }
  215. // GetMsg
  216. // @Tags 聊天模块
  217. // @Summary 获取与特定用户相关的所有聊天记录
  218. // @Param uid query string true "用户id"
  219. // @Success 200 {object} response.Response
  220. // @Router /chat/msg/ [get]
  221. func GetMsg(c *gin.Context) {
  222. var ms model.Message
  223. id := c.Query("uid")
  224. uid, err := strconv.ParseUint(id, 10, 64)
  225. if err != nil {
  226. msg := err.Error()
  227. response.Fail(c.Writer, msg, 500)
  228. return
  229. }
  230. msgs, err := ms.GetMsg(uint(uid))
  231. if err != nil {
  232. msg := err.Error()
  233. response.Fail(c.Writer, msg, 500)
  234. return
  235. }
  236. response.Success(c.Writer, "success", msgs)
  237. }
  238. // GetMsgLatest
  239. // @Tags 聊天模块
  240. // @Summary 获取与特定用户相关的最后一条聊天记录
  241. // @Param uid query string true "用户id"
  242. // @Param target query string true "对象id"
  243. // @Success 200 {object} response.Response
  244. // @Router /chat/latest [get]
  245. func GetMsgLatest(c *gin.Context) {
  246. var ms model.Message
  247. id := c.Query("uid")
  248. uid, err := strconv.ParseUint(id, 10, 64)
  249. if err != nil {
  250. msg := err.Error()
  251. response.Fail(c.Writer, msg, 500)
  252. return
  253. }
  254. t := c.Query("target")
  255. target, err := strconv.ParseUint(t, 10, 64)
  256. if err != nil {
  257. msg := err.Error()
  258. response.Fail(c.Writer, msg, 500)
  259. return
  260. }
  261. msg, err := ms.GetLatestMsg(uint(uid), uint(target))
  262. if err != nil {
  263. msg := err.Error()
  264. response.Fail(c.Writer, msg, 400)
  265. return
  266. }
  267. response.Success(c.Writer, "success", msg)
  268. }