You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

event_handle.go 3.8 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package wechat
  2. import (
  3. "code.gitea.io/gitea/models"
  4. "code.gitea.io/gitea/modules/notification"
  5. "code.gitea.io/gitea/modules/redis/redis_client"
  6. "code.gitea.io/gitea/modules/redis/redis_key"
  7. "encoding/json"
  8. "encoding/xml"
  9. "strings"
  10. "time"
  11. )
  12. //<xml>
  13. // <ToUserName><![CDATA[toUser]]></ToUserName>
  14. // <FromUserName><![CDATA[FromUser]]></FromUserName>
  15. // <CreateTime>123456789</CreateTime>
  16. // <MsgType><![CDATA[event]]></MsgType>
  17. // <Event><![CDATA[SCAN]]></Event>
  18. // <EventKey><![CDATA[SCENE_VALUE]]></EventKey>
  19. // <Ticket><![CDATA[TICKET]]></Ticket>
  20. //</xml>
  21. type WechatMsg struct {
  22. ToUserName string
  23. FromUserName string
  24. CreateTime int64
  25. MsgType string
  26. Event string
  27. EventKey string
  28. Ticket string
  29. Content string
  30. MsgId string
  31. MsgDataId string
  32. Idx string
  33. }
  34. type MsgReply struct {
  35. XMLName xml.Name `xml:"xml"`
  36. ToUserName string
  37. FromUserName string
  38. CreateTime int64
  39. MsgType string
  40. Content string
  41. }
  42. type TextMsgReply struct {
  43. XMLName xml.Name `xml:"xml"`
  44. ToUserName string
  45. FromUserName string
  46. CreateTime int64
  47. MsgType string
  48. Content string
  49. }
  50. type ImageMsgReply struct {
  51. XMLName xml.Name `xml:"xml"`
  52. ToUserName string
  53. FromUserName string
  54. CreateTime int64
  55. MsgType string
  56. Image ImageContent
  57. }
  58. type VoiceMsgReply struct {
  59. XMLName xml.Name `xml:"xml"`
  60. ToUserName string
  61. FromUserName string
  62. CreateTime int64
  63. MsgType string
  64. Voice VoiceContent
  65. }
  66. type VideoMsgReply struct {
  67. XMLName xml.Name `xml:"xml"`
  68. ToUserName string
  69. FromUserName string
  70. CreateTime int64
  71. MsgType string
  72. Video VideoContent
  73. }
  74. type MusicMsgReply struct {
  75. XMLName xml.Name `xml:"xml"`
  76. ToUserName string
  77. FromUserName string
  78. CreateTime int64
  79. MsgType string
  80. Music MusicContent
  81. }
  82. type NewsMsgReply struct {
  83. XMLName xml.Name `xml:"xml"`
  84. ToUserName string
  85. FromUserName string
  86. CreateTime int64
  87. MsgType string
  88. ArticleCount int
  89. Articles ArticleItem
  90. }
  91. type ArticleItem struct {
  92. Item []ArticlesContent
  93. }
  94. type ImageContent struct {
  95. MediaId string
  96. }
  97. type VoiceContent struct {
  98. MediaId string
  99. }
  100. type VideoContent struct {
  101. MediaId string
  102. Title string
  103. Description string
  104. }
  105. type MusicContent struct {
  106. Title string
  107. Description string
  108. MusicUrl string
  109. HQMusicUrl string
  110. ThumbMediaId string
  111. }
  112. type ArticlesContent struct {
  113. XMLName xml.Name `xml:"item"`
  114. Title string
  115. Description string
  116. PicUrl string
  117. Url string
  118. }
  119. const (
  120. WECHAT_EVENT_SUBSCRIBE = "subscribe"
  121. WECHAT_EVENT_SCAN = "SCAN"
  122. )
  123. const (
  124. WECHAT_MSG_TYPE_TEXT = "text"
  125. WECHAT_MSG_TYPE_EVENT = "event"
  126. )
  127. func HandleScanEvent(we WechatMsg) string {
  128. eventKey := we.EventKey
  129. if eventKey == "" {
  130. return ""
  131. }
  132. sceneStr := strings.TrimPrefix(eventKey, "qrscene_")
  133. key := redis_key.WechatBindingUserIdKey(sceneStr)
  134. val, _ := redis_client.Get(key)
  135. if val == "" {
  136. return ""
  137. }
  138. qrCache := new(QRCode4BindCache)
  139. json.Unmarshal([]byte(val), qrCache)
  140. if qrCache.Status == BIND_STATUS_UNBIND {
  141. err := BindWechat(qrCache.UserId, we.FromUserName)
  142. if err != nil {
  143. if err, ok := err.(WechatBindError); ok {
  144. return err.Reply
  145. }
  146. return BIND_REPLY_FAILED_DEFAULT
  147. }
  148. qrCache.Status = BIND_STATUS_BOUND
  149. jsonStr, _ := json.Marshal(qrCache)
  150. redis_client.Setex(redis_key.WechatBindingUserIdKey(sceneStr), string(jsonStr), 60*time.Second)
  151. }
  152. u, err := models.GetUserByID(qrCache.UserId)
  153. if err == nil {
  154. notification.NotifyWechatBind(u, we.FromUserName)
  155. }
  156. return BIND_REPLY_SUCCESS
  157. }
  158. func HandleSubscribeEvent(we WechatMsg) *WechatReplyContent {
  159. r, err := LoadReplyFromCacheAndDisk(SubscribeReply)
  160. if err != nil || len(r) == 0 {
  161. return nil
  162. }
  163. return r[0]
  164. }