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

176 lines
3.6 KiB
Go

package campaignuser
import (
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_campaign_user"
"gits.branchcn.com/backend/joybuywork/proto/go_proto/workerr"
"gorm.io/gen"
)
type ChatList struct {
logic.Logic
Req *pb.ChatListReq
Res *pb.ChatListRes
newChat bool
}
func (s *ChatList) Run() error {
return logic.Run(s)
}
func (s *ChatList) Exec() (err error) {
cpn, user, err := s.user()
if err != nil {
return
}
chat, err := s.chat(cpn, user)
if err != nil {
return
}
return s.list(chat)
}
func (s *ChatList) user() (cpn *model.FissionCampaign, user *model.FissionUser, err error) {
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil || cpn.IsDel == mtype.Yes {
err = workerr.NotFound("not found cpn")
return
}
user, err = finder.FissionUser(s.Ctx, cpn.ID, s.Req.GetUserId())
if err != nil {
err = s.BE().CacheError(err)
return
}
return
}
func (s *ChatList) chat(cpn *model.FissionCampaign, user *model.FissionUser) (chat *model.FissionChat, err error) {
chat, err = cache.NewFissionChat(s.Ctx).FindByUniq(user.CampaignID, user.ID)
if err != nil {
err = s.BE().CacheError(err)
return
}
if chat.Character != "" {
return
}
temp, err := cache.NewFissionTemp(s.Ctx).FindById(cpn.TemplateID)
if err != nil {
err = s.BE().CacheError(err)
return
}
if temp == nil {
return
}
group, err := cache.NewFissionTempGroup(s.Ctx).FindById(temp.GroupID)
if err != nil {
err = s.BE().CacheError(err)
return
}
var character string
switch group.Mark {
case "cat":
character = "你是一只聪明的小猫"
case "panda_sister":
character = "你是一只可爱的小熊猫妹妹"
case "panda_brother":
character = "你是一只暖心的小熊猫哥哥"
default:
character = "你是一只聪明的小狗"
}
m := s.GetDao().FissionChat
_, err = m.WithContext(s.Ctx).Where(m.ID.Eq(chat.ID)).UpdateSimple(m.Character.Value(character))
if err != nil {
err = s.BE().MysqlError(err)
return
}
s.AddAfterRun(func() (err error) {
return cache.NewFissionChat(s.Ctx).Clear(chat)
})
chat.Character = character
s.newChat = true
return
}
func (s *ChatList) list(chat *model.FissionChat) (err error) {
m := s.GetDao().FissionChatMsg
var cond = []gen.Condition{
m.ChatID.Eq(chat.ID),
}
if s.Req.GetLastId() > 0 {
cond = append(cond, m.ID.Lt(s.Req.GetLastId()))
}
list, err := m.WithContext(s.Ctx).Where(cond...).Limit(int(s.Req.GetPerPage())).Order(m.ID.Desc()).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if s.newChat && len(list) == 0 {
msg := withdefault.FissionChatMsg(&model.FissionChatMsg{
CampaignID: chat.CampaignID,
UserID: chat.UserID,
ChatID: chat.ID,
Source: mtype.FissionChatMsgSourceSystem,
MsgType: mtype.FissionChatMsgTypeFix,
Val: "",
}, mtype.ChatMsgVal{Text: "chat:sys_guide"})
if err = m.WithContext(s.Ctx).Create(msg); err != nil {
err = s.BE().MysqlError(err)
return
}
list = append(list, msg)
}
var data = make([]*pb.ChatListRes_One, 0, len(list))
for _, v := range list {
var one = &pb.ChatListRes_One{
Content: "",
Source: v.Source,
MsgType: int32(v.MsgType),
CreatedAt: v.CreatedAt,
MsgId: v.ID,
}
val := v.GetVal()
switch v.MsgType {
case mtype.FissionChatMsgTypeText, mtype.FissionChatMsgTypeFix:
one.Content = val.Text
}
data = append(data, one)
}
s.Res.List = data
return
}