auto.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "go-common/library/log"
  7. "go-common/library/xstr"
  8. )
  9. var (
  10. _video = 0
  11. _forbidDay = 10
  12. _breachReason = "非自制"
  13. _forbidReason = "投递非本人自制稿件2次"
  14. _dismissReason = "投递非本人自制稿件3次及以上"
  15. )
  16. // AutoBreach auto breach
  17. func (s *Service) AutoBreach(c context.Context, date string) (msg string, err error) {
  18. return s.autoAvBreach(c, date)
  19. }
  20. func (s *Service) autoAvBreach(c context.Context, date string) (msg string, err error) {
  21. avs, err := s.dao.GetAvBreachPre(c, _video, 1, date)
  22. if err != nil {
  23. log.Error("s.dao.GetAvBreachPre error(%v)", err)
  24. return
  25. }
  26. needBreach := make(map[int64]bool)
  27. for _, av := range avs {
  28. err = s.dao.DoAvBreach(c, av.MID, av.AvID, _video, _breachReason)
  29. if err != nil {
  30. log.Error("s.dao.DoAvBreach error(%v)", err)
  31. return
  32. }
  33. needBreach[av.AvID] = true
  34. }
  35. breach := make([]int64, 0)
  36. breachAvs, err := s.dao.GetAvBreachPre(c, _video, 2, date)
  37. if err != nil {
  38. log.Error("s.dao.GetAvBreachPre error(%v)", err)
  39. return
  40. }
  41. for _, av := range breachAvs {
  42. if needBreach[av.AvID] {
  43. breach = append(breach, av.AvID)
  44. }
  45. }
  46. msg = fmt.Sprintf("%s 自制转转载违规扣除稿件:%s", date, xstr.JoinInts(breach))
  47. return
  48. }
  49. // AutoPunish auto punish
  50. func (s *Service) AutoPunish(c context.Context) (msg string, err error) {
  51. return s.autoUpPunish(c)
  52. }
  53. // 每周一检查并处罚 只检查非自制
  54. func (s *Service) autoUpPunish(c context.Context) (msg string, err error) {
  55. now := time.Now()
  56. if now.Format(_layout) != getStartWeeklyDate(now).Format(_layout) {
  57. return
  58. }
  59. lastWeek := getStartWeeklyDate(getStartWeeklyDate(now).AddDate(0, 0, -1))
  60. avs, err := s.dao.GetAvBreach(c, "2018-10-15", now.AddDate(0, 0, -1).Format(_layout)) // 从2018-10-15上线开始计算扣除
  61. if err != nil {
  62. log.Error("s.dao.GetAvBreach error(%v)", err)
  63. return
  64. }
  65. blacks, err := s.listBlacklist(c, "")
  66. if err != nil {
  67. log.Error("s.listBlacklist error(%v)", err)
  68. return
  69. }
  70. mBlacks := make(map[int64]bool)
  71. for _, b := range blacks {
  72. mBlacks[b.AvID] = true
  73. }
  74. mids := make(map[int64]map[string]struct{})
  75. for _, av := range avs {
  76. if av.Reason != _breachReason {
  77. continue
  78. }
  79. if !mBlacks[av.AvID] {
  80. continue
  81. }
  82. date := getStartWeeklyDate(av.Date.Time()).Format(_layout)
  83. if _, ok := mids[av.MID]; !ok {
  84. mids[av.MID] = make(map[string]struct{})
  85. }
  86. mids[av.MID][date] = struct{}{}
  87. }
  88. forbidMIDs, dismissMIDs := make([]int64, 0), make([]int64, 0)
  89. for mid, times := range mids {
  90. // 当且仅当上周有发生过扣除才处罚up主,防止多次处罚
  91. if _, ok := times[lastWeek.Format(_layout)]; !ok {
  92. continue
  93. }
  94. if len(times) == 2 {
  95. err = s.autoForbid(c, mid)
  96. if err != nil {
  97. log.Error("s.autoForbid(%d) error(%v)", mid, err)
  98. return
  99. }
  100. forbidMIDs = append(forbidMIDs, mid)
  101. }
  102. if len(times) >= 3 {
  103. err = s.autoDismiss(c, mid)
  104. if err != nil {
  105. log.Error("s.autoDismiss(%d) error(%v)", mid, err)
  106. return
  107. }
  108. dismissMIDs = append(dismissMIDs, mid)
  109. }
  110. }
  111. msg = fmt.Sprintf("%s 自制转转载处罚up主: 封禁(%s), 清退(%s)", time.Now().Format(_layout), xstr.JoinInts(forbidMIDs), xstr.JoinInts(dismissMIDs))
  112. return
  113. }
  114. func (s *Service) autoForbid(c context.Context, mid int64) (err error) {
  115. accState, err := s.dao.GetUpStateByMID(c, mid)
  116. if err != nil {
  117. log.Error(" s.dao.GetUpStateByMID(%d) error(%v)", mid, err)
  118. return
  119. }
  120. if !(accState == 3 || accState == 7) {
  121. return
  122. }
  123. err = s.dao.DoUpForbid(c, mid, _forbidDay, _video, _forbidReason)
  124. if err != nil {
  125. log.Error("s.dao.DoUpForbid error(%v)", err)
  126. }
  127. return
  128. }
  129. func (s *Service) autoDismiss(c context.Context, mid int64) (err error) {
  130. accState, err := s.dao.GetUpStateByMID(c, mid)
  131. if err != nil {
  132. log.Error(" s.dao.GetUpStateByMID(%d) error(%v)", mid, err)
  133. return
  134. }
  135. if accState != 3 && accState != 7 {
  136. return
  137. }
  138. err = s.dao.DoUpDismiss(c, mid, _video, _dismissReason)
  139. if err != nil {
  140. log.Error("s.dao.DoUpDismiss error(%v)", err)
  141. }
  142. return
  143. }
  144. // AutoExamination auto examination
  145. func (s *Service) AutoExamination(c context.Context) (msg string, err error) {
  146. return s.autoExamination(c)
  147. }
  148. func (s *Service) autoExamination(c context.Context) (msg string, err error) {
  149. ups, err := s.getAllUps(c, 2000)
  150. if err != nil {
  151. log.Error("s.getAllUps error(%v)", err)
  152. return
  153. }
  154. mids := make([]int64, 0, len(ups))
  155. for mid, up := range ups {
  156. if up.AccountState != 2 || up.IsDeleted == 1 {
  157. continue
  158. }
  159. if up.Fans < 10000 && up.TotalPlayCount < 500000 {
  160. continue
  161. }
  162. mids = append(mids, mid)
  163. }
  164. scores, err := s.dao.GetUpCreditScore(c, mids)
  165. if err != nil {
  166. log.Error("s.dao.GetUpCreditScore error(%v)", err)
  167. return
  168. }
  169. passMID := make([]int64, 0, len(mids))
  170. for _, mid := range mids {
  171. if score, ok := scores[mid]; ok {
  172. if score < 100 {
  173. continue
  174. }
  175. }
  176. passMID = append(passMID, mid)
  177. }
  178. err = s.doUpPass(c, passMID, _video)
  179. if err != nil {
  180. log.Error("s.doUpPass error(%v)", err)
  181. return
  182. }
  183. msg = fmt.Sprintf("%s 自动过审up主: %s", time.Now().Format(_layout), xstr.JoinInts(passMID))
  184. return
  185. }
  186. func (s *Service) doUpPass(c context.Context, mids []int64, ctype int) (err error) {
  187. start, end := 0, 100
  188. for {
  189. if start >= len(mids) {
  190. break
  191. }
  192. if end > len(mids) {
  193. end = len(mids)
  194. }
  195. err = s.dao.DoUpPass(c, mids[start:end], _video)
  196. if err != nil {
  197. log.Error("s.dao.DoUpPass error(%v)", err)
  198. return
  199. }
  200. start = end
  201. end += 100
  202. }
  203. return
  204. }
  205. func getStartWeeklyDate(date time.Time) time.Time {
  206. for date.Weekday() != time.Monday {
  207. date = date.AddDate(0, 0, -1)
  208. }
  209. return date
  210. }