1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093 |
- package service
- import (
- "context"
- "encoding/json"
- "fmt"
- "strconv"
- "time"
- "go-common/app/admin/main/workflow/model"
- "go-common/app/admin/main/workflow/model/param"
- credit "go-common/app/job/main/credit/model"
- "go-common/library/log"
- "go-common/library/queue/databus/report"
- xtime "go-common/library/time"
- )
- func (s *Service) afterSetGrpResult(grp *param.GroupResParam, g *model.Group, tinyChalls map[int64]*model.TinyChall) {
- logging := func() {
- // write group log
- l := &model.WLog{
- AdminID: grp.AdminID,
- Admin: grp.AdminName,
- Oid: g.Oid,
- Business: g.Business,
- Target: g.ID,
- Module: model.WLogModuleGroup,
- Remark: fmt.Sprintf(`“工单编号 %d” %s 理由:%s`, g.ID, s.StateDescr(grp.Business, 0, grp.State), grp.Reason),
- Note: grp.Reason,
- }
- s.writeAuditLog(l)
- // write challenge log
- for _, c := range tinyChalls {
- l := &model.WLog{
- AdminID: grp.AdminID,
- Admin: grp.AdminName,
- Oid: g.Oid,
- Business: g.Business,
- Target: c.Cid,
- Module: model.WLogModuleChallenge,
- Remark: fmt.Sprintf(`“工单详情编号 %d” %s 理由:%s`, c.Cid, s.StateDescr(grp.Business, 0, grp.State), grp.Reason),
- Note: grp.Reason,
- }
- s.writeAuditLog(l)
- }
- }
- callback := func() {
- metas := s.dao.AllMetas(context.Background())
- meta, ok := metas[grp.Business]
- if !ok || meta.ItemType != "group" {
- return
- }
- // handle callback
- cb, ok := s.callbackCache[grp.Business]
- if !ok || cb == nil {
- return
- }
- mids := make([]int64, 0, len(tinyChalls))
- for _, c := range tinyChalls {
- mids = append(mids, c.Mid)
- }
- // origin callback
- if cb.URL != "" && cb.State == model.CallbackEnable {
- payload := &model.Payload{
- Verb: model.GroupSetResult,
- Actor: model.Actor{
- AdminID: grp.AdminID,
- },
- CTime: xtime.Time(time.Now().Unix()),
- Object: grp,
- Target: g,
- Influence: map[string]interface{}{
- "mids": mids,
- },
- }
- if err := s.SendCallbackRetry(context.Background(), cb, payload); err != nil {
- log.Error("Failed to s.SendCallbackRetry(%+v, %+v): %v", cb, payload, err)
- // continue
- }
- }
- }
- extra := func() {
- // extra condition
- switch grp.Business {
- case model.ArchiveComplain:
- s.notifyUsers(grp.Business, grp.Oid, grp.AdminID, tinyChalls, grp.IsMessage)
- default:
- }
- }
- logging()
- callback()
- extra()
- }
- func (s *Service) afterBatchSetGrpResult(bgrp *param.BatchGroupResParam, groups map[int64]*model.Group, tinyChalls map[int64]*model.TinyChall) {
- // record log
- logging := func() {
- for _, g := range groups {
- l := &model.WLog{
- AdminID: bgrp.AdminID,
- Admin: bgrp.AdminName,
- Oid: g.Oid,
- Business: g.Business,
- Target: g.ID,
- Module: model.WLogModuleGroup,
- Remark: fmt.Sprintf(`“工单编号 %d” %s 理由:%s`, g.ID, s.StateDescr(bgrp.Business, 0, bgrp.State), bgrp.Reason),
- Note: bgrp.Reason,
- }
- s.writeAuditLog(l)
- }
- for _, c := range tinyChalls {
- g, ok := groups[c.Gid]
- if !ok {
- log.Warn("Failed to retrive group by gid %d", c.Gid)
- continue
- }
- l := &model.WLog{
- AdminID: bgrp.AdminID,
- Admin: bgrp.AdminName,
- Oid: g.Oid,
- Business: g.Business,
- Target: c.Cid,
- Module: model.WLogModuleChallenge,
- Remark: fmt.Sprintf(`“工单详情编号 %d” 状态从 %s 修改为 %s 理由:%s`, c.Cid, s.StateDescr(bgrp.Business, 0, c.State), s.StateDescr(bgrp.Business, 0, bgrp.State), bgrp.Reason),
- Note: bgrp.Reason,
- }
- s.writeAuditLog(l)
- }
- }
- // origin callback
- callback := func() {
- metas := s.dao.AllMetas(context.Background())
- meta, ok := metas[bgrp.Business]
- if !ok || meta.ItemType != "group" {
- return
- }
- cb, ok := s.callbackCache[bgrp.Business]
- if !ok || cb == nil {
- return
- }
- toids := make([]int64, 0, len(groups))
- for _, g := range groups {
- toids = append(toids, g.Oid)
- }
- bgrp.Oids = toids
- gmids := make(map[int64][]int64, len(groups))
- for _, c := range tinyChalls {
- if _, ok := gmids[c.Gid]; !ok {
- gmids[c.Gid] = make([]int64, 0)
- }
- gmids[c.Gid] = append(gmids[c.Gid], c.Mid)
- }
- if cb.URL != "" && cb.State == model.CallbackEnable {
- for _, g := range groups {
- payload := &model.Payload{
- Verb: model.BatchGroupSetResult,
- Actor: model.Actor{
- AdminID: bgrp.AdminID,
- },
- CTime: xtime.Time(time.Now().Unix()),
- Object: bgrp,
- Target: g,
- Influence: map[string]interface{}{
- "mids": gmids[g.ID],
- },
- }
- if err := s.SendCallbackRetry(context.Background(), cb, payload); err != nil {
- log.Error("Failed to s.SendCallbackRetry(%+v, %+v): %v", cb, payload, err)
- // continue
- }
- }
- }
- }
- // extra condition
- extra := func() {
- switch bgrp.Business {
- case model.ArchiveComplain:
- oidToChalls := make(map[int64]map[int64]*model.TinyChall, len(groups))
- for _, c := range tinyChalls {
- g, ok := groups[c.Gid]
- if !ok {
- continue
- }
- if _, ok := oidToChalls[g.Oid]; !ok {
- oidToChalls[g.Oid] = make(map[int64]*model.TinyChall)
- }
- oidToChalls[g.Oid][c.Cid] = c
- }
- for oid, cs := range oidToChalls {
- s.notifyUsers(bgrp.Business, oid, bgrp.AdminID, cs, bgrp.IsMessage)
- }
- default:
- }
- }
- logging()
- callback()
- extra()
- }
- func (s *Service) afterSetChallResult(crp *param.ChallResParam, c *model.Chall) {
- logging := func() {
- // write challenge log
- l := &model.WLog{
- AdminID: crp.AdminID,
- Admin: crp.AdminName,
- Oid: c.Oid,
- Business: c.Business,
- Target: c.Cid,
- Module: model.WLogModuleChallenge,
- Remark: fmt.Sprintf(`“工单详情编号 %d” 处理状态从 %s 修改为 %s 理由:%s`, c.Cid, s.StateDescr(c.Business, 0, c.State), s.StateDescr(c.Business, 0, crp.State), crp.Reason),
- Note: crp.Reason,
- }
- s.writeAuditLog(l)
- }
- callback := func() {
- metas := s.dao.AllMetas(context.Background())
- meta, ok := metas[c.Business]
- if !ok || meta.ItemType != "challenge" {
- log.Warn("item type not exist or is not challenge, meta(%+v)", meta)
- return
- }
- // handle callback
- cb, ok := s.callbackCache[c.Business]
- if !ok || cb == nil {
- log.Error("can not find callback func, business(%d)", c.Business)
- return
- }
- mids := []int64{c.Mid}
- if cb.URL != "" && cb.State == model.CallbackEnable {
- payload := &model.Payload{
- Verb: model.ChallSetResult,
- Actor: model.Actor{
- AdminID: crp.AdminID,
- },
- CTime: xtime.Time(time.Now().Unix()),
- Object: crp,
- Target: c,
- Influence: map[string]interface{}{
- "mids": mids,
- },
- }
- if err := s.SendCallbackRetry(context.Background(), cb, payload); err != nil {
- log.Error("Failed to s.SendCallbackRetry(%+v, %+v): %v", cb, payload, err)
- // continue
- }
- }
- }
- extra := func() {
- // extra condition
- }
- logging()
- callback()
- extra()
- }
- func (s *Service) afterBatchSetChallResult(bcrp *param.BatchChallResParam, challs map[int64]*model.Chall) {
- // Record Log
- logging := func() {
- for _, c := range challs {
- l := &model.WLog{
- AdminID: bcrp.AdminID,
- Admin: bcrp.AdminName,
- Oid: c.Oid,
- Business: c.Business,
- Target: c.Cid,
- Module: model.WLogModuleChallenge,
- Remark: fmt.Sprintf(`“工单详情编号 %d” 状态从 %s 修改为 %s 理由:%s`, c.Cid, s.StateDescr(c.Business, 0, c.State), s.StateDescr(c.Business, 0, bcrp.State), bcrp.Reason),
- Note: bcrp.Reason,
- }
- s.writeAuditLog(l)
- }
- }
- // origin callback
- callback := func() {
- metas := s.dao.AllMetas(context.Background())
- for _, c := range challs {
- meta, ok := metas[c.Business]
- if !ok || meta.ItemType != "challenge" {
- return
- }
- cb, ok := s.callbackCache[c.Business]
- if !ok || cb == nil {
- return
- }
- mids := []int64{c.Mid}
- // origin callback
- if cb.URL != "" && cb.State == model.CallbackEnable {
- payload := &model.Payload{
- Verb: model.BatchChallSetResult,
- Actor: model.Actor{
- AdminID: bcrp.AdminID,
- },
- CTime: xtime.Time(time.Now().Unix()),
- Object: bcrp,
- Target: c,
- Influence: map[string]interface{}{
- "mids": mids,
- },
- }
- if err := s.SendCallbackRetry(context.Background(), cb, payload); err != nil {
- log.Error("Failed to s.SendCallbackRetry(%+v, %+v): %v", cb, payload, err)
- // continue
- }
- }
- }
- }
- extra := func() {
- // extra condition
- }
- logging()
- callback()
- extra()
- }
- func (s *Service) afterSetGroupRole(grsp *param.GroupRoleSetParam, groups map[int64]*model.Group) {
- // Record Log
- logging := func() {
- logs, err := s.LastLogStat(context.Background(), grsp.GID, []int{model.WLogModuleRoleShift}, []string{"int_1", "ctime", "int_2", "uid"})
- if err != nil {
- log.Error("s.LastLogStat() failed error:%v", err)
- return
- }
- for _, g := range groups {
- var (
- preTag *model.TagMeta
- newTag *model.TagMeta
- err error
- )
- if preTag, err = s.tag(g.Business, g.Tid); err != nil {
- log.Warn("s.tag(%d,%d) error(%v)", g.Business, g.Tid, err)
- err = nil
- preTag.Bid = g.Business
- preTag.Tid = g.Tid
- preTag.RID = g.Rid
- }
- if newTag, err = s.tag(g.Business, grsp.TID); err != nil {
- log.Warn("s.tag(%d,%d) error(%v)", g.Business, g.Tid, err)
- err = nil
- newTag.Bid = g.Business
- newTag.Tid = g.Tid
- }
- l := &model.WLog{
- AdminID: grsp.AdminID,
- Admin: grsp.AdminName,
- Oid: g.Oid,
- Business: g.Business,
- Target: g.ID,
- Module: model.WLogModuleRoleShift,
- Remark: fmt.Sprintf(`“工单编号 %d” 业务角色流转从 %d:%s 到 %d:%s, 管理 tag 从 %d:%s 变更到 %d:%s, 备注: %s`,
- g.ID, g.Rid, s.RidDesc(g.Business, g.Rid), grsp.RID, s.RidDesc(g.Business, grsp.RID), g.Tid, preTag.Name, grsp.TID, newTag.Name, grsp.Note),
- Note: grsp.Note,
- OpType: strconv.Itoa(int(model.RoleShift)),
- PreRid: strconv.Itoa(int(preTag.RID)),
- }
- if roleLog, ok := logs[g.ID]; !ok {
- l.TimeConsume = int64(time.Since(g.LastTime.Time()) / time.Second)
- } else {
- lastRoleTime, _ := time.ParseInLocation("2006-01-02 15:04:05", roleLog.CTime, time.Local)
- if lastRoleTime.After(g.LastTime.Time()) {
- l.TimeConsume = int64(time.Since(lastRoleTime) / time.Second)
- } else {
- l.TimeConsume = int64(time.Since(g.LastTime.Time()) / time.Second)
- }
- }
- s.writeAuditLog(l)
- }
- }
- logging()
- }
- // set state v3
- func (s *Service) afterSetGroupState(gssp *param.GroupStateSetParam, groups map[int64]*model.Group, tinyChalls map[int64]*model.TinyChall) {
- // record log
- logging := func() {
- logs, err := s.LastLogStat(context.Background(), gssp.ID, []int{model.WLogModuleRoleShift}, []string{"int_1", "ctime", "int_2", "uid"})
- if err != nil {
- log.Error("s.LastLogStat() failed error:%v", err)
- return
- }
- for _, g := range groups {
- l := &model.WLog{
- AdminID: gssp.AdminID,
- Admin: gssp.AdminName,
- Oid: g.Oid,
- Business: g.Business,
- Target: g.ID,
- Module: model.WLogModuleGroup,
- Remark: fmt.Sprintf(`“工单编号 %d” %s 理由:%s`, g.ID, s.StateDescr(g.Business, 0, gssp.State), gssp.Reason),
- Note: gssp.Reason,
- OpType: strconv.Itoa(int(gssp.State)),
- PreRid: strconv.Itoa(int(gssp.Rid)),
- Param: gssp,
- }
- if roleLog, ok := logs[g.ID]; !ok {
- l.TimeConsume = int64(time.Since(g.LastTime.Time()) / time.Second)
- } else {
- lastRoleTime, _ := time.ParseInLocation("2006-01-02 15:04:05", roleLog.CTime, time.Local)
- if lastRoleTime.After(g.LastTime.Time()) {
- l.TimeConsume = int64(time.Since(lastRoleTime) / time.Second)
- } else {
- l.TimeConsume = int64(time.Since(g.LastTime.Time()) / time.Second)
- }
- }
- if g.BusinessObject != nil {
- l.Mid = g.BusinessObject.Mid
- }
- s.writeAuditLog(l)
- }
- for _, c := range tinyChalls {
- g, ok := groups[c.Gid]
- if !ok {
- log.Warn("Failed to retrive group by gid %d", c.Gid)
- continue
- }
- l := &model.WLog{
- AdminID: gssp.AdminID,
- Admin: gssp.AdminName,
- Oid: g.Oid,
- Business: g.Business,
- Target: c.Cid,
- Module: model.WLogModuleChallenge,
- Remark: fmt.Sprintf(`“工单详情编号 %d” 状态从 %s 修改为 %s 理由:%s`, c.Cid, s.StateDescr(g.Business, 0, c.State), s.StateDescr(g.Business, 0, gssp.State), gssp.Reason),
- Note: gssp.Reason,
- Mid: c.Mid,
- }
- s.writeAuditLog(l)
- }
- }
- // origin callback
- callback := func() {
- cb, ok := s.callbackCache[gssp.Business]
- if !ok || cb == nil {
- return
- }
- gmids := make(map[int64][]int64, len(groups))
- for _, c := range tinyChalls {
- if _, ok := gmids[c.Gid]; !ok {
- gmids[c.Gid] = make([]int64, 0)
- }
- gmids[c.Gid] = append(gmids[c.Gid], c.Mid)
- }
- if cb.URL != "" && cb.State == model.CallbackEnable {
- //common
- payload := &model.Payload{
- Bid: int(gssp.Business),
- Verb: model.GroupSetState,
- Actor: model.Actor{
- AdminID: gssp.AdminID,
- AdminName: gssp.AdminName,
- },
- CTime: xtime.Time(time.Now().Unix()),
- Object: gssp,
- }
- // influence
- // 长短评
- if gssp.Business == model.ReviewShortComplain || gssp.Business == model.ReviewLongComplain {
- var reportMids = make([]int64, len(tinyChalls))
- for _, tc := range tinyChalls {
- reportMids = append(reportMids, tc.Mid)
- }
- payload.Influence = map[string]interface{}{
- "mids": reportMids,
- }
- }
- // target
- for _, g := range groups {
- payload.Targets = append(payload.Targets, g)
- }
- //todo: extra
- if err := s.SendCallbackRetry(context.Background(), cb, payload); err != nil {
- log.Error("Failed to s.SendCallbackRetry(%+v, %+v): %v", cb, payload, err)
- // continue
- }
- }
- }
- // notify user
- notify := func() {
- s.notifyUsersV4(gssp, groups, tinyChalls)
- }
- // 扣节操
- decreaseMoral := func() {
- if gssp.DecreaseMoral == 0 {
- return
- }
- var (
- gids []int64
- mids []int64
- )
- for _, g := range groups {
- gids = append(gids, g.ID)
- }
- // 被举报人 mid
- var (
- bus map[int64]*model.Business
- err error
- )
- if bus, err = s.dao.BusObjectByGids(context.Background(), gids); err != nil {
- log.Error("s.dao.BusObjectByGids(%v) error(%v)", gids, err)
- return
- }
- for _, b := range bus {
- mids = append(mids, b.Mid)
- }
- if err := s.dao.AddMoral(context.Background(), mids, gssp); err != nil {
- log.Error("s.dao.AddMoral(%v,%d) error(%v)", mids, gssp.DecreaseMoral, err)
- return
- }
- l := &model.WLog{
- AdminID: gssp.AdminID,
- Admin: gssp.AdminName,
- Module: model.WLogModuleAddMoral,
- Mids: mids,
- Param: gssp,
- }
- s.writeAuditLog(l)
- }
- // 封禁账号
- block := func() {
- if gssp.BlockDay == 0 {
- return
- }
- var (
- gids []int64
- mids []int64
- )
- for _, g := range groups {
- gids = append(gids, g.ID)
- }
- // 被举报人 mid
- var (
- bus map[int64]*model.Business
- err error
- )
- if bus, err = s.dao.BusObjectByGids(context.Background(), gids); err != nil {
- log.Error("s.dao.BusObjectByGids(%v) error(%v)", gids, err)
- return
- }
- for _, b := range bus {
- mids = append(mids, b.Mid)
- }
- if err := s.dao.AddBlock(context.Background(), mids, gssp); err != nil {
- log.Error("s.dao.AddBlock(%d,%v) error(%v)", mids, gssp, err)
- return
- }
- if err := s.dao.AddCreditBlockInfo(context.Background(), bus, gssp); err != nil {
- log.Error("s.dao.AddCreditBlockInfo(%d,%v) error(%v)", mids, gssp, err)
- return
- }
- l := &model.WLog{
- AdminID: gssp.AdminID,
- Admin: gssp.AdminName,
- Module: model.WLogModuleBlock,
- Mids: mids,
- Param: gssp,
- }
- s.writeAuditLog(l)
- }
- logging()
- callback()
- notify()
- decreaseMoral()
- block()
- }
- // only set group state
- func (s *Service) afterSimpleSetState(gspr *param.GroupStatePublicReferee, groups map[int64]*model.Group) {
- // record log
- logging := func() {
- for _, g := range groups {
- l := &model.WLog{
- AdminID: gspr.AdminID,
- Admin: gspr.AdminName,
- Oid: g.Oid,
- Business: g.Business,
- Target: g.ID,
- Module: model.WLogModulePublicReferee,
- Remark: fmt.Sprintf(`“工单编号 %d” %s 理由:%s`, g.ID, s.StateDescr(g.Business, 0, gspr.State), ""),
- OpType: strconv.Itoa(int(gspr.State)),
- }
- s.writeAuditLog(l)
- }
- }
- // callback
- callback := func() {
- cb, ok := s.callbackCache[gspr.Business]
- if !ok || cb == nil {
- return
- }
- gssp := ¶m.GroupStateSetParam{
- ID: gspr.ID,
- Business: gspr.Business,
- AdminID: gspr.AdminID,
- AdminName: gspr.AdminName,
- State: gspr.State,
- }
- if cb.URL != "" && cb.State == model.CallbackEnable {
- //common
- payload := &model.Payload{
- Bid: int(gssp.Business),
- Verb: model.GroupSetPublicReferee,
- Actor: model.Actor{
- AdminID: gssp.AdminID,
- AdminName: gssp.AdminName,
- },
- CTime: xtime.Time(time.Now().Unix()),
- Object: gssp,
- }
- // target
- for _, g := range groups {
- payload.Targets = append(payload.Targets, g)
- }
- if err := s.SendCallbackRetry(context.Background(), cb, payload); err != nil {
- log.Error("Failed to s.SendCallbackRetry(%+v, %+v): %v", cb, payload, err)
- // continue
- }
- }
- }
- logging()
- callback()
- }
- func (s *Service) afterSetBusinessState(challs []*model.Chall) {
- // todo: after set business state
- logging := func() {
- for _, c := range challs {
- l := &model.WLog{
- AdminID: c.AssigneeAdminID,
- Admin: c.AssigneeAdminName,
- Oid: c.Oid,
- Business: c.Business,
- Target: c.Cid,
- Module: model.WLogModuleReply,
- Mid: c.Mid,
- TypeID: c.TypeID,
- }
- s.writeAuditLog(l)
- }
- }
- logging()
- }
- func (s *Service) afterAddReply(ep *param.EventParam, c *model.Chall) {
- logging := func() {
- l := &model.WLog{
- AdminID: ep.AdminID,
- Admin: ep.AdminName,
- Oid: c.Oid,
- Business: c.Business,
- Target: c.Cid,
- Module: model.FeedBackTypeReply,
- Mid: c.Mid,
- Remark: ep.Content,
- Note: strconv.Itoa(int(ep.Event)),
- Meta: map[string]interface{}{
- "ep": ep,
- "challenge": c,
- },
- }
- s.writeReplyLog(l)
- }
- logging()
- }
- func (s *Service) afterAddMultiReply(bep *param.BatchEventParam, cs map[int64]*model.Chall) {
- loggin := func() {
- for _, cid := range bep.Cids {
- var (
- c *model.Chall
- ok bool
- )
- if c, ok = cs[cid]; !ok {
- continue
- }
- l := &model.WLog{
- AdminID: bep.AdminID,
- Admin: bep.AdminName,
- Oid: c.Oid,
- Business: c.Business,
- Target: c.Cid,
- Module: model.FeedBackTypeReply,
- Mid: c.Mid,
- Remark: bep.Content,
- Note: strconv.Itoa(int(bep.Event)),
- Meta: map[string]interface{}{
- "bep": bep,
- "challenge": cs,
- },
- }
- s.writeReplyLog(l)
- }
- }
- loggin()
- }
- func (s *Service) notifyUsers(business int8, oid int64, adminid int64, challs map[int64]*model.TinyChall, isDisposeMsg bool) (err error) {
- var makeDealMsgParam = model.DealArcComplainMsg
- var makeReceivedMsgParam = model.ReceivedArcComplainMsg
- mids := make([]int64, 0, len(challs))
- for _, c := range challs {
- mids = append(mids, int64(c.Mid))
- }
- if business == int8(model.ArchiveComplain) {
- // if challenge ctime < 10min, report appeal received
- var rChall = make([]*model.TinyChall, 0)
- var rMids = make([]int64, 0)
- for _, c := range challs {
- if time.Since(c.CTime.Time()) < time.Minute*10 {
- //todo: rmids send message archive complain received
- rChall = append(rChall, c)
- rMids = append(rMids, c.Mid)
- }
- }
- if len(rChall) > 0 {
- rmp := makeReceivedMsgParam(oid, rMids)
- if err = s.dao.SendMessage(context.Background(), rmp); err != nil {
- log.Error("Failed to s.dao.SendMessage(%v, %v, %+v): %v", oid, mids, rmp, err)
- err = nil
- }
- log.Info("send archive complain received message business(%d) oid(%d) mids(%v) mc(%s) message(%+v)", business, oid, mids, rmp.MC, rmp)
- // report archive complain received msg
- for _, tc := range rChall {
- report.Manager(&report.ManagerInfo{
- Uname: "",
- UID: 0,
- Business: 11,
- Type: 2,
- Oid: oid,
- Action: "notify_users_received",
- Ctime: time.Now(),
- Index: []interface{}{tc.Cid, tc.Gid, tc.Mid},
- Content: map[string]interface{}{
- "mid": tc.Mid,
- "message": rmp,
- },
- })
- }
- }
- }
- if !isDisposeMsg {
- return
- }
- time.Sleep(500 * time.Millisecond)
- mdmp := makeDealMsgParam(oid, mids)
- if err = s.dao.SendMessage(context.Background(), mdmp); err != nil {
- log.Error("Failed to s.dao.SendMessage(%v, %v, %+v): %v", oid, mids, mdmp, err)
- return
- }
- // group dispose report
- report.Manager(&report.ManagerInfo{
- Uname: "",
- UID: adminid,
- Business: 11,
- Type: 3,
- Oid: oid,
- Action: "notify_users_dispose",
- Ctime: time.Now(),
- Index: []interface{}{business},
- Content: map[string]interface{}{
- "mid": mids,
- "message": mdmp,
- },
- })
- log.Info("send message business(%d) oid(%d) mids(%v) mc(%s) message(%+v)", business, oid, mids, mdmp.MC, mdmp)
- return
- }
- func (s *Service) notifyUsersV4(gssp *param.GroupStateSetParam, groups map[int64]*model.Group, tinyChalls map[int64]*model.TinyChall) (err error) {
- // 稿件投诉补发已收到消息
- if gssp.Business == model.ArchiveComplain {
- for _, g := range groups {
- // if challenge ctime < 10min, report appeal received
- var rMids = make([]int64, 0)
- for _, c := range tinyChalls {
- if time.Since(c.CTime.Time()) < time.Minute*10 && c.Gid == g.ID {
- //todo: rmids send message archive complain received
- rMids = append(rMids, c.Mid)
- }
- }
- if len(rMids) > 0 {
- rmp := ¶m.MessageParam{
- Type: "json",
- Source: 1,
- DataType: 4,
- MC: model.ArcComplainRevMC,
- Title: "您的投诉已收到",
- Context: fmt.Sprintf("您对稿件(av%d)的举报我们已经收到。感谢您对 bilibili 社区秩序的维护,哔哩哔哩 (゜-゜)つロ 干杯~", g.Oid),
- MidList: rMids,
- }
- if err = s.dao.SendMessage(context.Background(), rmp); err != nil {
- log.Error("Failed to s.dao.SendMessage(%+v) mid(%v): %v", rmp, rMids, err)
- err = nil
- }
- log.Info("send archive complain received message gid(%d) oid(%d) mids(%v) message(%+v)", g.ID, g.Oid, rMids, rmp)
- // report archive complain received msg
- report.Manager(&report.ManagerInfo{
- Uname: "",
- UID: 0,
- Business: 11,
- Type: model.FeedBackTypeNotifyUserReceived,
- Oid: g.Oid,
- Action: "notify_users_received_v4",
- Ctime: time.Now(),
- Index: []interface{}{g.ID},
- Content: map[string]interface{}{
- "message": rmp,
- },
- })
- }
- }
- }
- time.Sleep(500 * time.Millisecond)
- // 通知举报人
- if gssp.IsMessage {
- mps := make(map[int64]*param.MessageParam) // map[oid]*mp or map[eid]*mp
- // all mids need to report
- cmids := make(map[int64][]int64) //map[gid][]mids
- for _, c := range tinyChalls {
- if _, ok := cmids[c.Gid]; !ok {
- cmids[c.Gid] = make([]int64, 0)
- }
- cmids[c.Gid] = append(cmids[c.Gid], c.Mid)
- }
- switch gssp.Business {
- case model.ArchiveComplain:
- for _, g := range groups {
- reportMids, ok := cmids[g.ID]
- if !ok {
- log.Warn("report mid not found gid(%d)", g.ID)
- continue
- }
- mp := ¶m.MessageParam{
- Type: "json",
- Source: 1,
- DataType: 4,
- MC: model.ArcComplainDealMC,
- Title: "您的投诉已被受理",
- Context: fmt.Sprintf("您对稿件(av%d)的投诉已被受理。感谢您对 bilibili 社区秩序的维护,哔哩哔哩 (゜-゜)つロ 干杯~ ", g.Oid),
- MidList: reportMids,
- }
- mps[g.ID] = mp
- }
- case model.ChannelComplain:
- for _, g := range groups {
- reportMids, ok := cmids[g.ID]
- if !ok {
- log.Warn("report mid not found gid(%d)", g.ID)
- continue
- }
- mp := ¶m.MessageParam{
- Type: "json",
- Source: 1,
- DataType: 4,
- MC: model.WkfNotifyMC,
- Title: "你的举报已成功处理",
- Context: fmt.Sprintf(`您在稿件【#{av%d}{"https://www.bilibili.com/video/av%d"}】举报的频道【%s】已处理,感谢反馈,点击进去查看`,
- g.Oid, g.Oid, g.BusinessObject.Title),
- MidList: reportMids,
- }
- mps[g.ID] = mp
- }
- case model.CommentComplain: // 评论举报
- var blockStr, isDel string
- if gssp.BlockDay == -1 {
- blockStr = "该用户已被永久封禁。"
- } else if gssp.BlockDay > 0 {
- blockStr = fmt.Sprintf("并被封禁%d天。", gssp.BlockDay)
- }
- if gssp.DisposeMode == 1 {
- isDel = "已被移除"
- } else {
- isDel = "已被处罚"
- }
- tMeta, _ := s.tag(gssp.Business, gssp.Tid)
- tName := tMeta.Name // 举报理由
- for _, g := range groups {
- if g.Fid == model.ReplyFidManga {
- continue
- }
- var extMap map[string]interface{}
- reportMids, ok := cmids[g.ID]
- if !ok {
- log.Warn("report mid not found gid(%d)", g.ID)
- continue
- }
- json.Unmarshal([]byte(g.BusinessObject.Extra), &extMap)
- extTitle, _ := extMap["title"].(string)
- extTitle = subString(extTitle, 0, 40)
- extLink, _ := extMap["link"].(string)
- content := fmt.Sprintf(`您好,您在#{%s}{%s}下举报的评论『%s』%s,%s 理由:%s。`+model.NotifyComRulesReport,
- extTitle, extLink, pretreat(g.BusinessObject.Title), isDel, blockStr, tName)
- mp := ¶m.MessageParam{
- Type: "json",
- Source: 1,
- DataType: 4,
- MC: model.WkfNotifyMC,
- Title: "举报处理结果通知",
- Context: content,
- MidList: reportMids,
- }
- mps[g.ID] = mp
- }
- }
- for gid, mp := range mps {
- if err = s.dao.SendMessage(context.Background(), mp); err != nil {
- log.Error("Failed to s.dao.SendMessage(%+v) mids(%v): %v", mp, err)
- continue
- }
- // group dispose report
- report.Manager(&report.ManagerInfo{
- Uname: gssp.AdminName,
- UID: gssp.AdminID,
- Business: 11,
- Type: model.FeedBackTypeNotifyUserDisposed,
- Action: "notify_users_v4_reporters",
- Ctime: time.Now(),
- Index: []interface{}{gssp.Business},
- Content: map[string]interface{}{
- "message": mp,
- },
- })
- log.Info("notifyUsersV4 success send to reporters message(%+v) gid(%d)", mp, gid)
- }
- }
- // 通知被举报人(up主)
- if gssp.IsMessageUper {
- mps := make(map[int64]*param.MessageParam) // map[oid]*mp or map[eid]*mp
- switch gssp.Business {
- case model.CommentComplain: //评论举报
- var (
- blockStr string
- disposeStr string
- )
- if gssp.BlockDay == -1 {
- blockStr = "本帐号已被永久封禁。"
- } else if gssp.BlockDay > 0 {
- blockStr = fmt.Sprintf("并被封禁%d天。", gssp.BlockDay)
- }
- if gssp.DisposeMode == 1 {
- disposeStr = "已被举报并移除"
- } else {
- disposeStr = "已被举报并处罚"
- }
- tMeta, _ := s.tag(gssp.Business, gssp.Tid)
- tName := tMeta.Name // 举报理由
- for _, g := range groups {
- if g.Fid == model.ReplyFidManga {
- continue
- }
- var extMap map[string]interface{}
- json.Unmarshal([]byte(g.BusinessObject.Extra), &extMap)
- extTitle, _ := extMap["title"].(string)
- extTitle = subString(extTitle, 0, 40)
- extLink, _ := extMap["link"].(string)
- content := fmt.Sprintf(`您好,您在#{%s}{%s}下发布的评论『%s』%s,%s 理由:%s。`, extTitle, extLink, pretreat(g.BusinessObject.Title), disposeStr, blockStr, tName)
- content = suffixContent(content, gssp)
- mp := ¶m.MessageParam{
- Type: "json",
- Source: 1,
- DataType: 4,
- MC: model.WkfNotifyMC,
- Title: "评论违规处理通知",
- Context: content,
- MidList: []int64{g.BusinessObject.Mid},
- }
- mps[g.ID] = mp
- }
- }
- for gid, mp := range mps {
- if err = s.dao.SendMessage(context.Background(), mp); err != nil {
- log.Error("Failed to s.dao.SendMessage(%+v) gid(%d): %v", mp, gid, err)
- continue
- }
- // group dispose report
- report.Manager(&report.ManagerInfo{
- Uname: gssp.AdminName,
- UID: gssp.AdminID,
- Business: 11,
- Type: 3,
- Action: "notify_users_v4_upers",
- Ctime: time.Now(),
- Index: []interface{}{gssp.Business},
- Content: map[string]interface{}{
- "mid": mp.MidList,
- "message": *mp,
- },
- })
- log.Info("notifyUsersV4 success send to uper message(%+v) gid(%d)", mp, gid)
- }
- }
- return
- }
- // 站内信评论内容预处理
- func pretreat(str string) string {
- str = subString(str, 0, 40)
- str = filterViolationMsg(str)
- return str
- }
- // 字符串截断
- func subString(str string, begin, length int) string {
- rs := []rune(str)
- lth := len(rs)
- if begin < 0 {
- begin = 0
- }
- if begin >= lth {
- begin = lth
- }
- end := begin + length
- if end > lth {
- end = lth
- }
- return string(rs[begin:end])
- }
- // 字符串加*
- func filterViolationMsg(msg string) string {
- s := []rune(msg)
- for i := 0; i < len(s); i++ {
- if i%3 != 0 {
- s[i] = '*'
- }
- }
- return string(s)
- }
- // 评论站内信后缀(被举报人)
- func suffixContent(content string, gssp *param.GroupStateSetParam) string {
- switch gssp.BlockReason {
- // 剧透, 广告, 抢楼, 刷屏
- case credit.ReasonSpoiler, credit.ReasonGarbageAds, credit.ReasonGrabFloor, credit.ReasonBrushScreen:
- content += model.NotifyComRules
- // 引战, 人身攻击
- case credit.ReasonLeadBattle, credit.ReasonPersonalAttacks:
- content += model.NotifyComProvoke
- default:
- content += model.NofityComProhibited
- }
- return content
- }
|