diff --git a/client/guild.go b/client/guild.go index 1638cda3..894f284e 100644 --- a/client/guild.go +++ b/client/guild.go @@ -5,6 +5,7 @@ import ( "github.com/Mrs4s/MiraiGo/topic" "math/rand" "sort" + "strconv" "time" "github.com/Mrs4s/MiraiGo/client/pb/qweb" @@ -589,6 +590,76 @@ func (s *GuildService) GetTopicChannelFeeds(guildId, channelId uint64) ([]*topic return feeds, nil } +func (s *GuildService) PostTopicChannelFeed(guildId, channelId uint64, feed *topic.Feed) error { + guild := s.FindGuild(guildId) + if guild == nil { + return errors.New("guild not found") + } + channelInfo := guild.FindChannel(channelId) + if channelInfo == nil { + return errors.New("channel not found") + } + if channelInfo.ChannelType != ChannelTypeTopic { + return errors.New("channel type error") + } + feed.Poster = &topic.FeedPoster{ + TinyIdStr: strconv.FormatUint(s.TinyId, 10), + Nickname: s.Nickname, + } + feed.GuildId = guildId + feed.ChannelId = channelId + req, _ := proto.Marshal(&channel.StPublishFeedReq{ + ExtInfo: &channel.StCommonExt{ + MapInfo: []*channel.CommonEntry{ + { + proto.String("clientkey"), proto.String("GuildMain" + utils.RandomStringRange(14, "0123456789")), + }, + }, + }, + From: proto.Int32(0), + JsonFeed: proto.String(feed.ToSendingPayload(s.c.Uin)), + }) + payload, _ := proto.Marshal(&qweb.QWebReq{ + Seq: proto.Int64(s.c.nextQWebSeq()), + Qua: proto.String("V1_AND_SQ_8.8.50_2324_YYB_D"), + DeviceInfo: proto.String(s.c.getWebDeviceInfo()), + BusiBuff: req, + TraceId: proto.String(fmt.Sprintf("%v_%v_%v", s.c.Uin, time.Now().Format("0102150405"), rand.Int63())), + Extinfo: []*qweb.COMMEntry{ + { + Key: proto.String("fc-appid"), + Value: proto.String("96"), + }, + { + Key: proto.String("environment_id"), + Value: proto.String("production"), + }, + { + Key: proto.String("tiny_id"), + Value: proto.String(fmt.Sprint(s.TinyId)), + }, + }, + }) + seq := s.c.nextSeq() + packet := packets.BuildUniPacket(s.c.Uin, seq, "QChannelSvr.trpc.qchannel.commwriter.ComWriter.PublishFeed", 1, s.c.OutGoingPacketSessionId, []byte{}, s.c.sigInfo.d2Key, payload) + rsp, err := s.c.sendAndWaitDynamic(seq, packet) + if err != nil { + return errors.New("send packet error") + } + pkg := new(qweb.QWebRsp) + body := new(channel.StPublishFeedRsp) + if err = proto.Unmarshal(rsp, pkg); err != nil { + return errors.Wrap(err, "failed to unmarshal protobuf message") + } + if err = proto.Unmarshal(pkg.BusiBuff, body); err != nil { + return errors.Wrap(err, "failed to unmarshal protobuf message") + } + if body.Feed != nil && body.Feed.Id != nil { + return nil + } + return errors.New("post feed error") +} + /* need analysis func (s *GuildService) fetchChannelListState(guildId uint64, channels []*ChannelInfo) { seq := s.c.nextSeq() diff --git a/client/pb/channel/GuildWriter.pb.go b/client/pb/channel/GuildWriter.pb.go new file mode 100644 index 00000000..82e52b0f --- /dev/null +++ b/client/pb/channel/GuildWriter.pb.go @@ -0,0 +1,765 @@ +// Code generated by protoc-gen-golite. DO NOT EDIT. +// source: pb/channel/GuildWriter.proto + +package channel + +type StAlterFeedReq struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Feed *StFeed `protobuf:"bytes,2,opt"` + BusiReqData []byte `protobuf:"bytes,3,opt"` + MBitmap *uint64 `protobuf:"varint,4,opt"` + From *int32 `protobuf:"varint,5,opt"` + Src *int32 `protobuf:"varint,6,opt"` + AlterFeedExtInfo []*CommonEntry `protobuf:"bytes,7,rep"` + JsonFeed *string `protobuf:"bytes,8,opt"` + ClientContent *StClientContent `protobuf:"bytes,9,opt"` +} + +func (x *StAlterFeedReq) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StAlterFeedReq) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StAlterFeedReq) GetBusiReqData() []byte { + if x != nil { + return x.BusiReqData + } + return nil +} + +func (x *StAlterFeedReq) GetMBitmap() uint64 { + if x != nil && x.MBitmap != nil { + return *x.MBitmap + } + return 0 +} + +func (x *StAlterFeedReq) GetFrom() int32 { + if x != nil && x.From != nil { + return *x.From + } + return 0 +} + +func (x *StAlterFeedReq) GetSrc() int32 { + if x != nil && x.Src != nil { + return *x.Src + } + return 0 +} + +func (x *StAlterFeedReq) GetAlterFeedExtInfo() []*CommonEntry { + if x != nil { + return x.AlterFeedExtInfo + } + return nil +} + +func (x *StAlterFeedReq) GetJsonFeed() string { + if x != nil && x.JsonFeed != nil { + return *x.JsonFeed + } + return "" +} + +func (x *StAlterFeedReq) GetClientContent() *StClientContent { + if x != nil { + return x.ClientContent + } + return nil +} + +type StAlterFeedRsp struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Feed *StFeed `protobuf:"bytes,2,opt"` + BusiRspData []byte `protobuf:"bytes,3,opt"` +} + +func (x *StAlterFeedRsp) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StAlterFeedRsp) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StAlterFeedRsp) GetBusiRspData() []byte { + if x != nil { + return x.BusiRspData + } + return nil +} + +type StClientContent struct { + ClientImageContents []*StClientImageContent `protobuf:"bytes,1,rep"` + ClientVideoContents []*StClientVideoContent `protobuf:"bytes,2,rep"` +} + +func (x *StClientContent) GetClientImageContents() []*StClientImageContent { + if x != nil { + return x.ClientImageContents + } + return nil +} + +func (x *StClientContent) GetClientVideoContents() []*StClientVideoContent { + if x != nil { + return x.ClientVideoContents + } + return nil +} + +type StClientImageContent struct { + TaskId *string `protobuf:"bytes,1,opt"` + PicId *string `protobuf:"bytes,2,opt"` + Url *string `protobuf:"bytes,3,opt"` +} + +func (x *StClientImageContent) GetTaskId() string { + if x != nil && x.TaskId != nil { + return *x.TaskId + } + return "" +} + +func (x *StClientImageContent) GetPicId() string { + if x != nil && x.PicId != nil { + return *x.PicId + } + return "" +} + +func (x *StClientImageContent) GetUrl() string { + if x != nil && x.Url != nil { + return *x.Url + } + return "" +} + +type StClientVideoContent struct { + TaskId *string `protobuf:"bytes,1,opt"` + VideoId *string `protobuf:"bytes,2,opt"` + VideoUrl *string `protobuf:"bytes,3,opt"` + CoverUrl *string `protobuf:"bytes,4,opt"` +} + +func (x *StClientVideoContent) GetTaskId() string { + if x != nil && x.TaskId != nil { + return *x.TaskId + } + return "" +} + +func (x *StClientVideoContent) GetVideoId() string { + if x != nil && x.VideoId != nil { + return *x.VideoId + } + return "" +} + +func (x *StClientVideoContent) GetVideoUrl() string { + if x != nil && x.VideoUrl != nil { + return *x.VideoUrl + } + return "" +} + +func (x *StClientVideoContent) GetCoverUrl() string { + if x != nil && x.CoverUrl != nil { + return *x.CoverUrl + } + return "" +} + +type StDelFeedReq struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Feed *StFeed `protobuf:"bytes,2,opt"` + From *int32 `protobuf:"varint,3,opt"` + Src *int32 `protobuf:"varint,4,opt"` +} + +func (x *StDelFeedReq) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StDelFeedReq) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StDelFeedReq) GetFrom() int32 { + if x != nil && x.From != nil { + return *x.From + } + return 0 +} + +func (x *StDelFeedReq) GetSrc() int32 { + if x != nil && x.Src != nil { + return *x.Src + } + return 0 +} + +type StDelFeedRsp struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` +} + +func (x *StDelFeedRsp) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +type StDoCommentReq struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + CommentType *uint32 `protobuf:"varint,2,opt"` + Comment *StComment `protobuf:"bytes,3,opt"` + Feed *StFeed `protobuf:"bytes,4,opt"` + From *int32 `protobuf:"varint,5,opt"` + BusiReqData []byte `protobuf:"bytes,6,opt"` + Src *int32 `protobuf:"varint,7,opt"` +} + +func (x *StDoCommentReq) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StDoCommentReq) GetCommentType() uint32 { + if x != nil && x.CommentType != nil { + return *x.CommentType + } + return 0 +} + +func (x *StDoCommentReq) GetComment() *StComment { + if x != nil { + return x.Comment + } + return nil +} + +func (x *StDoCommentReq) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StDoCommentReq) GetFrom() int32 { + if x != nil && x.From != nil { + return *x.From + } + return 0 +} + +func (x *StDoCommentReq) GetBusiReqData() []byte { + if x != nil { + return x.BusiReqData + } + return nil +} + +func (x *StDoCommentReq) GetSrc() int32 { + if x != nil && x.Src != nil { + return *x.Src + } + return 0 +} + +type StDoCommentRsp struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Comment *StComment `protobuf:"bytes,2,opt"` + BusiRspData []byte `protobuf:"bytes,3,opt"` +} + +func (x *StDoCommentRsp) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StDoCommentRsp) GetComment() *StComment { + if x != nil { + return x.Comment + } + return nil +} + +func (x *StDoCommentRsp) GetBusiRspData() []byte { + if x != nil { + return x.BusiRspData + } + return nil +} + +type StDoLikeReq struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + LikeType *uint32 `protobuf:"varint,2,opt"` + Like *StLike `protobuf:"bytes,3,opt"` + Feed *StFeed `protobuf:"bytes,4,opt"` + BusiReqData []byte `protobuf:"bytes,5,opt"` + Comment *StComment `protobuf:"bytes,6,opt"` + Reply *StReply `protobuf:"bytes,7,opt"` + From *int32 `protobuf:"varint,8,opt"` + Src *int32 `protobuf:"varint,9,opt"` + EmotionReaction *StEmotionReactionInfo `protobuf:"bytes,10,opt"` +} + +func (x *StDoLikeReq) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StDoLikeReq) GetLikeType() uint32 { + if x != nil && x.LikeType != nil { + return *x.LikeType + } + return 0 +} + +func (x *StDoLikeReq) GetLike() *StLike { + if x != nil { + return x.Like + } + return nil +} + +func (x *StDoLikeReq) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StDoLikeReq) GetBusiReqData() []byte { + if x != nil { + return x.BusiReqData + } + return nil +} + +func (x *StDoLikeReq) GetComment() *StComment { + if x != nil { + return x.Comment + } + return nil +} + +func (x *StDoLikeReq) GetReply() *StReply { + if x != nil { + return x.Reply + } + return nil +} + +func (x *StDoLikeReq) GetFrom() int32 { + if x != nil && x.From != nil { + return *x.From + } + return 0 +} + +func (x *StDoLikeReq) GetSrc() int32 { + if x != nil && x.Src != nil { + return *x.Src + } + return 0 +} + +func (x *StDoLikeReq) GetEmotionReaction() *StEmotionReactionInfo { + if x != nil { + return x.EmotionReaction + } + return nil +} + +type StDoLikeRsp struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Like *StLike `protobuf:"bytes,2,opt"` + BusiRspData []byte `protobuf:"bytes,3,opt"` + EmotionReaction *StEmotionReactionInfo `protobuf:"bytes,4,opt"` +} + +func (x *StDoLikeRsp) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StDoLikeRsp) GetLike() *StLike { + if x != nil { + return x.Like + } + return nil +} + +func (x *StDoLikeRsp) GetBusiRspData() []byte { + if x != nil { + return x.BusiRspData + } + return nil +} + +func (x *StDoLikeRsp) GetEmotionReaction() *StEmotionReactionInfo { + if x != nil { + return x.EmotionReaction + } + return nil +} + +type StDoReplyReq struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + ReplyType *uint32 `protobuf:"varint,2,opt"` + Reply *StReply `protobuf:"bytes,3,opt"` + Comment *StComment `protobuf:"bytes,4,opt"` + Feed *StFeed `protobuf:"bytes,5,opt"` + From *int32 `protobuf:"varint,6,opt"` + BusiReqData []byte `protobuf:"bytes,7,opt"` + Src *int32 `protobuf:"varint,8,opt"` +} + +func (x *StDoReplyReq) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StDoReplyReq) GetReplyType() uint32 { + if x != nil && x.ReplyType != nil { + return *x.ReplyType + } + return 0 +} + +func (x *StDoReplyReq) GetReply() *StReply { + if x != nil { + return x.Reply + } + return nil +} + +func (x *StDoReplyReq) GetComment() *StComment { + if x != nil { + return x.Comment + } + return nil +} + +func (x *StDoReplyReq) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StDoReplyReq) GetFrom() int32 { + if x != nil && x.From != nil { + return *x.From + } + return 0 +} + +func (x *StDoReplyReq) GetBusiReqData() []byte { + if x != nil { + return x.BusiReqData + } + return nil +} + +func (x *StDoReplyReq) GetSrc() int32 { + if x != nil && x.Src != nil { + return *x.Src + } + return 0 +} + +type StDoReplyRsp struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Reply *StReply `protobuf:"bytes,2,opt"` + BusiRspData []byte `protobuf:"bytes,3,opt"` +} + +func (x *StDoReplyRsp) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StDoReplyRsp) GetReply() *StReply { + if x != nil { + return x.Reply + } + return nil +} + +func (x *StDoReplyRsp) GetBusiRspData() []byte { + if x != nil { + return x.BusiRspData + } + return nil +} + +type StDoSecurityReq struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Feed *StFeed `protobuf:"bytes,2,opt"` + Comment *StComment `protobuf:"bytes,3,opt"` + Reply *StReply `protobuf:"bytes,4,opt"` + Poster *StUser `protobuf:"bytes,5,opt"` + SecType *int32 `protobuf:"varint,6,opt"` +} + +func (x *StDoSecurityReq) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StDoSecurityReq) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StDoSecurityReq) GetComment() *StComment { + if x != nil { + return x.Comment + } + return nil +} + +func (x *StDoSecurityReq) GetReply() *StReply { + if x != nil { + return x.Reply + } + return nil +} + +func (x *StDoSecurityReq) GetPoster() *StUser { + if x != nil { + return x.Poster + } + return nil +} + +func (x *StDoSecurityReq) GetSecType() int32 { + if x != nil && x.SecType != nil { + return *x.SecType + } + return 0 +} + +type StDoSecurityRsp struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` +} + +func (x *StDoSecurityRsp) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +type StModifyFeedReq struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Feed *StFeed `protobuf:"bytes,2,opt"` + MBitmap *uint64 `protobuf:"varint,3,opt"` + From *int32 `protobuf:"varint,4,opt"` + Src *int32 `protobuf:"varint,5,opt"` + ModifyFeedExtInfo []*CommonEntry `protobuf:"bytes,6,rep"` +} + +func (x *StModifyFeedReq) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StModifyFeedReq) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StModifyFeedReq) GetMBitmap() uint64 { + if x != nil && x.MBitmap != nil { + return *x.MBitmap + } + return 0 +} + +func (x *StModifyFeedReq) GetFrom() int32 { + if x != nil && x.From != nil { + return *x.From + } + return 0 +} + +func (x *StModifyFeedReq) GetSrc() int32 { + if x != nil && x.Src != nil { + return *x.Src + } + return 0 +} + +func (x *StModifyFeedReq) GetModifyFeedExtInfo() []*CommonEntry { + if x != nil { + return x.ModifyFeedExtInfo + } + return nil +} + +type StModifyFeedRsp struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Feed *StFeed `protobuf:"bytes,2,opt"` + BusiRspData []byte `protobuf:"bytes,3,opt"` +} + +func (x *StModifyFeedRsp) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StModifyFeedRsp) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StModifyFeedRsp) GetBusiRspData() []byte { + if x != nil { + return x.BusiRspData + } + return nil +} + +type StPublishFeedReq struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Feed *StFeed `protobuf:"bytes,2,opt"` + BusiReqData []byte `protobuf:"bytes,3,opt"` + From *int32 `protobuf:"varint,4,opt"` + Src *int32 `protobuf:"varint,5,opt"` + StoreFeedExtInfo []*CommonEntry `protobuf:"bytes,6,rep"` + JsonFeed *string `protobuf:"bytes,7,opt"` + ClientContent *StClientContent `protobuf:"bytes,8,opt"` +} + +func (x *StPublishFeedReq) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StPublishFeedReq) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StPublishFeedReq) GetBusiReqData() []byte { + if x != nil { + return x.BusiReqData + } + return nil +} + +func (x *StPublishFeedReq) GetFrom() int32 { + if x != nil && x.From != nil { + return *x.From + } + return 0 +} + +func (x *StPublishFeedReq) GetSrc() int32 { + if x != nil && x.Src != nil { + return *x.Src + } + return 0 +} + +func (x *StPublishFeedReq) GetStoreFeedExtInfo() []*CommonEntry { + if x != nil { + return x.StoreFeedExtInfo + } + return nil +} + +func (x *StPublishFeedReq) GetJsonFeed() string { + if x != nil && x.JsonFeed != nil { + return *x.JsonFeed + } + return "" +} + +func (x *StPublishFeedReq) GetClientContent() *StClientContent { + if x != nil { + return x.ClientContent + } + return nil +} + +type StPublishFeedRsp struct { + ExtInfo *StCommonExt `protobuf:"bytes,1,opt"` + Feed *StFeed `protobuf:"bytes,2,opt"` + BusiRspData []byte `protobuf:"bytes,3,opt"` +} + +func (x *StPublishFeedRsp) GetExtInfo() *StCommonExt { + if x != nil { + return x.ExtInfo + } + return nil +} + +func (x *StPublishFeedRsp) GetFeed() *StFeed { + if x != nil { + return x.Feed + } + return nil +} + +func (x *StPublishFeedRsp) GetBusiRspData() []byte { + if x != nil { + return x.BusiRspData + } + return nil +} diff --git a/client/pb/channel/GuildWriter.proto b/client/pb/channel/GuildWriter.proto new file mode 100644 index 00000000..fb641d74 --- /dev/null +++ b/client/pb/channel/GuildWriter.proto @@ -0,0 +1,154 @@ +syntax = "proto2"; + +package channel; + +option go_package = "pb/channel;channel"; + +import "pb/channel/GuildFeedCloudMeta.proto"; +import "pb/channel/GuildChannelBase.proto"; + +message StAlterFeedReq { + optional StCommonExt extInfo = 1; + optional StFeed feed = 2; + optional bytes busiReqData = 3; + optional uint64 mBitmap = 4; + optional int32 from = 5; + optional int32 src = 6; + repeated CommonEntry alterFeedExtInfo = 7; + optional string jsonFeed = 8; + optional StClientContent clientContent = 9; +} + +message StAlterFeedRsp { + optional StCommonExt extInfo = 1; + optional StFeed feed = 2; + optional bytes busiRspData = 3; +} + +message StClientContent { + repeated StClientImageContent clientImageContents = 1; + repeated StClientVideoContent clientVideoContents = 2; +} + +message StClientImageContent { + optional string taskId = 1; + optional string picId = 2; + optional string url = 3; +} + +message StClientVideoContent { + optional string taskId = 1; + optional string videoId = 2; + optional string videoUrl = 3; + optional string coverUrl = 4; +} + +message StDelFeedReq { + optional StCommonExt extInfo = 1; + optional StFeed feed = 2; + optional int32 from = 3; + optional int32 src = 4; +} + +message StDelFeedRsp { + optional StCommonExt extInfo = 1; +} + +message StDoCommentReq { + optional StCommonExt extInfo = 1; + optional uint32 commentType = 2; + optional StComment comment = 3; + optional StFeed feed = 4; + optional int32 from = 5; + optional bytes busiReqData = 6; + optional int32 src = 7; +} + +message StDoCommentRsp { + optional StCommonExt extInfo = 1; + optional StComment comment = 2; + optional bytes busiRspData = 3; +} + +message StDoLikeReq { + optional StCommonExt extInfo = 1; + optional uint32 likeType = 2; + optional StLike like = 3; + optional StFeed feed = 4; + optional bytes busiReqData = 5; + optional StComment comment = 6; + optional StReply reply = 7; + optional int32 from = 8; + optional int32 src = 9; + optional StEmotionReactionInfo emotionReaction = 10; +} + +message StDoLikeRsp { + optional StCommonExt extInfo = 1; + optional StLike like = 2; + optional bytes busiRspData = 3; + optional StEmotionReactionInfo emotionReaction = 4; +} + +message StDoReplyReq { + optional StCommonExt extInfo = 1; + optional uint32 replyType = 2; + optional StReply reply = 3; + optional StComment comment = 4; + optional StFeed feed = 5; + optional int32 from = 6; + optional bytes busiReqData = 7; + optional int32 src = 8; +} + +message StDoReplyRsp { + optional StCommonExt extInfo = 1; + optional StReply reply = 2; + optional bytes busiRspData = 3; +} + +message StDoSecurityReq { + optional StCommonExt extInfo = 1; + optional StFeed feed = 2; + optional StComment comment = 3; + optional StReply reply = 4; + optional StUser poster = 5; + optional int32 secType = 6; +} + +message StDoSecurityRsp { + optional StCommonExt extInfo = 1; +} + +message StModifyFeedReq { + optional StCommonExt extInfo = 1; + optional StFeed feed = 2; + optional uint64 mBitmap = 3; + optional int32 from = 4; + optional int32 src = 5; + repeated CommonEntry modifyFeedExtInfo = 6; +} + +message StModifyFeedRsp { + optional StCommonExt extInfo = 1; + optional StFeed feed = 2; + optional bytes busiRspData = 3; +} + +message StPublishFeedReq { + optional StCommonExt extInfo = 1; + optional StFeed feed = 2; + optional bytes busiReqData = 3; + optional int32 from = 4; + optional int32 src = 5; + repeated CommonEntry storeFeedExtInfo = 6; + optional string jsonFeed = 7; + optional StClientContent clientContent = 8; +} + +message StPublishFeedRsp { + optional StCommonExt extInfo = 1; + optional StFeed feed = 2; + optional bytes busiRspData = 3; +} +