reply.proto

syntax = "proto3";

package bilibili.main.community.reply.v1;

import "google/protobuf/any.proto";

// 评论区
service Reply {
    // 主评论列表接口
    rpc MainList(MainListReq) returns (MainListReply);
    // 二级评论明细接口
    rpc DetailList(DetailListReq) returns (DetailListReply);
    // 对话评论树接口
    rpc DialogList(DialogListReq) returns (DialogListReply);
    // 评论预览接口
    rpc PreviewList (PreviewListReq) returns (PreviewListReply);
    // 评论搜索item前置发布接口
    rpc SearchItemPreHook(SearchItemPreHookReq) returns (SearchItemPreHookReply);
    // 评论搜索插入项目接口
    rpc SearchItem(SearchItemReq) returns (SearchItemReply);
}

// 广告
message CM {
    // 广告数据(需要解包)
    google.protobuf.Any source_content = 1;
}

// 对话评论树-请求
message DialogListReq {
    // 目标评论区id
    int64 oid = 1;
    // 目标评论区类型
    int64 type = 2;
    // 根评论rpid
    int64 root = 3;
    // 对话评论rpid
    int64 rpid = 4;
    // 页面游标
    CursorReq cursor = 5;
}

// 对话评论树-响应
message DialogListReply {
    // 页面游标
    CursorReply cursor = 1;
    // 评论区显示控制字段
    SubjectControl subject_control = 2;
    // 子评论列表
    repeated ReplyInfo replies = 3;
    // 评论区的活动
    Activity activity = 4;
}

// 来源标识
enum DetailListScene {
    REPLY = 0;    // 评论区展开
    MSG_FEED = 1; // 回复消息推送
}

// 二级评论明细-请求
message DetailListReq {
    // 目标评论区id
    int64 oid = 1;
    // 目标评论区类型
    int64 type = 2;
    // 根评论rpid
    int64 root = 3;
    // 目标评论rpid
    int64 rpid = 4;
    // 页面游标
    CursorReq cursor = 5;
    // 来源标识
    DetailListScene scene = 6;
}

// 二级评论明细-响应
message DetailListReply {
    // 页面游标
    CursorReply cursor = 1;
    // 评论区显示控制字段
    SubjectControl subject_control = 2;
    // 根评论信息(带二级评论)
    ReplyInfo root = 3;
    // 评论区的活动
    Activity activity = 4;
}

// 主评论列表-请求
message MainListReq {
    // 目标评论区id
    int64 oid = 1;
    // 目标评论区类型
    int64 type = 2;
    // 页面游标
    CursorReq cursor = 3;
    // 扩展数据json
    string extra = 4;
    // 广告扩展json
    string ad_extra = 5;
    // 目标评论rpid
    int64 rpid = 6;
}

// 评论区预览-请求
message PreviewListReq {
    // 目标评论区id
    int64 oid = 1;
    // 目标评论区类型
    int64 type = 2;
    // 页面游标
    CursorReq cursor = 3;
}

//
message ReplyExtra {
    //
    int64 season_id = 1;
    //
    int64 season_type = 2;
    //
    int64 ep_id = 3;
    //
    bool is_story = 4;
}

// 评论区预览-回复
message PreviewListReply {
    // 页面游标
    CursorReply cursor = 1;
    // 评论列表
    repeated ReplyInfo replies = 2;
    // 评论区显示控制字段
    SubjectControl subject_control = 3;
    // UP置顶评论
    ReplyInfo upTop = 4;
    // 管理员置顶评论
    ReplyInfo admin_top = 5;
    // 投票置顶评论
    ReplyInfo vote_top = 6;
}

// 主评论列表-响应
message MainListReply {
    // 页面游标
    CursorReply cursor = 1;
    // 评论列表
    repeated ReplyInfo replies = 2;
    // 评论区显示控制字段
    SubjectControl subject_control = 3;
    // UP置顶评论
    ReplyInfo up_top = 4;
    // 管理员置顶评论
    ReplyInfo admin_top = 5;
    // 投票置顶评论
    ReplyInfo vote_top = 6;
    // 评论区提示
    Notice notice = 7;
    // 抽奖评论
    Lottery lottery = 8;
    // 活动
    Activity activity = 9;
    // 精选评论区筛选后台信息
    UpSelection up_selection = 10;
    // 广告
    CM cm = 11;
    // 特效
    Effects effects = 12;
}

// 特效
message Effects {
    //
    string preloading = 1;
}

//
message UpSelection {
    // 待审评论数
    int64 pending_count = 1;
    // 忽略评论数
    int64 ignore_count = 2;
}

//
message Notice {
    //
    int64 id = 1;
    //
    string content = 2;
    //
    string link = 3;
}

// 活动
message Activity {
    // 活动id
    int64 activity_id = 1;
    // 活动状态
    // -1:待审 1:上线
    int64 activity_state = 2;
    // 参与活动的输入框文案
    string activity_placeholder = 3;
}

// 抽奖
message Lottery {
    // 抽奖id
    int64 lottery_id = 1;
    // 抽奖状态
    // 0:未开奖 1:开奖中 2:已开奖
    int64 lottery_status = 2;
    // 抽奖人mid
    int64 lottery_mid = 3;
    // 开奖时间
    int64 lottery_time = 4;
    //
    int64 oid = 5;
    //
    int64 type = 6;
    // 发送时间
    int64 ctime = 7;
    // 抽奖评论正文
    Content content = 8;
    // 用户信息
    Member member = 9;
    // 评论条目控制字段
    ReplyControl reply_control = 10;
}

// 排序方式
enum Mode {
    DEFAULT = 0;        //
    UNSPECIFIED = 1;    // 默认排序
    MAIN_LIST_TIME = 2; // 按时间
    MAIN_LIST_HOT = 3;  // 按热度
}

// 页面游标请求
message CursorReq {
    // 下页数据
    int64 next = 1;
    // 上页数据
    int64 prev = 2;
    // 排序方式
    Mode mode = 4;
}

// 页面游标回复
message CursorReply {
    // 下页数据
    int64 next = 1;
    // 上页数据
    int64 prev = 2;
    // 是否到顶
    bool isBegin = 3;
    // 是否到底
    bool isEnd = 4;
    // 排序方式
    // 2:时间 3:热度
    Mode mode = 5;
    // 当前排序mode在切换按钮上的展示文案 
    string mode_text = 6;
}

// 评论区控制字段
message SubjectControl {
    // UP主mid
    int64 up_mid = 1;
    // 自己是否为协管
    bool is_assist = 2;
    // 是否只读
    bool read_only = 3;
    // 是否有发起投票权限
    bool has_vote_access = 4;
    // 是否有发起抽奖权限
    bool has_lottery_access = 5;
    // 是否有被折叠评论
    bool has_folded_reply = 6;
    // 空评论区背景文案
    string bg_text = 7;
    // 是否被UP拉黑
    bool up_blocked = 8;
    // 是否有发起活动权限
    bool has_activity_access = 9;
    // 标题展示控制
    bool show_title = 10;
    // 是否显示UP主操作标志
    bool show_up_action = 11;
    // 是否显示评论区排序切换按钮
    int64 switcher_type = 12;
    // 是否禁止输入框
    bool input_disable = 13;
    // 根评论输入框背景文案
    string root_text = 14;
    // 子评论输入框背景文案
    string child_text = 15;
    // 评论总数
    int64 count = 16;
    // 评论区标题
    string title = 17;
    // 离开态输入框的文案
    string giveup_text = 18;
}

// 评论条目信息
message ReplyInfo {
    // 二级评论列表
    repeated ReplyInfo replies = 1;
    // 评论rpid
    int64 id = 2;
    // 评论区对象id
    int64 oid = 3;
    // 评论区类型
    int64 type = 4;
    // 发布者UID
    int64 mid = 5;
    // 根评论rpid
    int64 root = 6;
    // 父评论rpid
    int64 parent = 7;
    // 对话评论rpid
    int64 dialog = 8;
    // 点赞数
    int64 like = 9;
    // 发布时间
    int64 ctime = 10;
    // 回复数
    int64 count = 11;
    // 评论主体信息
    Content content = 12;
    // 发布者信息
    Member member = 13;
    // 评论控制字段
    ReplyControl reply_control = 14;
}

//评论主体信息
message Content {
    //评论文本
    string message = 1;
    //at到的用户信息
    map<string,Member> menber = 2;
    //需要渲染的表情转义
    map<string,Emote> emote = 3;
    //需要高亮的话题转义
    map<string,Topic> topic = 4;
    //需要高亮的超链转义
    map<string,Url> url = 5;
    //投票信息
    Vote vote = 6;
}

// 评论条目控制字段
message ReplyControl {
    // 操作行为标志
    // 0:无 1:已点赞 2:已点踩
    int64 action = 1;
    // 是否UP觉得很赞
    bool up_like = 2;
    // 是否存在UP回复
    bool up_reply = 3;
    // 是否显示关注按钮
    bool show_follow_btn = 4;
    // 是否协管
    bool is_assist = 5;
    // 是否展示标签
    string label_text = 6;
    // 是否关注
    bool following = 7;
    // 是否粉丝
    bool followed = 8;
    // 是否被自己拉黑
    bool blocked = 9;
    // 是否存在折叠的二级评论
    bool has_folded_reply = 10;
    // 是否折叠
    bool is_folded_reply = 11;
    // 是否UP置顶
    bool is_up_top = 12;
    // 是否管理置顶
    bool is_admin_top = 13;
    // 是否置顶投票评论
    bool is_vote_top = 14;
    // 最大收起显示行数
    int64 max_line = 15;
    // 该条评论可不可见
    bool invisible = 16;
    // 是否和up签订契约
    bool is_contractor = 17;
    // 是否是笔记评论
    bool is_note = 18;
}

// 超链项
message Url {
    // 标题
    string title = 1;
    //
    int64 state = 2;
    // 图标url
    string prefix_icon = 3;
    //
    string app_url_schema = 4;
    //
    string app_name = 5;
    //
    string app_package_name = 6;
    // 上报id
    string click_report = 7;
    //
    bool is_half_screen = 8;
    //
    string exposure_report = 9;
}

// 话题项
message Topic {
    // 跳转url
    string link = 1;
    // 话题id
    int64 id = 2;
}

// 表情项
message Emote {
    // 表情大小
    // 1:小 2:大
    int64 size = 1;
    // 表情url
    string url = 2;
}

// 投票信息
message Vote {
    // 投票id
    int64 id = 1;
    // 投票标题
    string title = 2;
    // 参与人数
    int64 count = 3;
}

// 用户信息
message Member {
    /**********基础信息**********/
    // 用户mid
    int64 mid = 1;
    // 昵称
    string name = 2;
    // 性别
    string sex = 3;
    // 头像url
    string face = 4;
    // 等级
    int64 level = 5;
    // 认证类型
    int64 official_verify_type = 6;
    /**********VIP相关**********/
    // 会员类型
    // 0:不是大会员 1:月度会员 2:年度大会员
    int64 vip_type = 7;
    // 会员状态
    int64 vip_status = 8;
    // 会员样式
    int64 vip_theme_type = 9;
    // 会员铭牌样式url
    string vip_label_path = 10;
    /**********装扮相关**********/
    // 头像框url
    string garb_pendant_image = 11;
    // 装扮卡url
    string garb_card_image = 12;
    // 有关注按钮时的装扮卡url
    string garb_card_image_with_focus = 13;
    // 专属装扮页面url
    string garb_card_jump_url = 14;
    // 专属装扮id
    string garb_card_number = 15;
    // 专属装扮id显示颜色
    string garb_card_fan_color = 16;
    // 是否为专属装扮卡
    bool garb_card_is_fan = 17;
    /**********粉丝勋章相关**********/
    // 粉丝勋章名
    string fans_medal_name = 18;
    // 粉丝勋章等级
    int64 fans_medal_level = 19;
    // 粉丝勋章显示颜色
    int64 fans_medal_color = 20;
    // 会员昵称颜色
    string vip_nickname_color = 21;
    // 会员角标
    // 0:无角标 1:粉色大会员角标 2:绿色小会员角标
    int32 vip_avatar_subscript = 22;
    // 会员标签文
    string vip_label_text = 23;
    // 会员标颜色
    string vip_label_theme = 24;
}

//
enum SearchItemType {
    DEFAULT_ITEM_TYPE = 0; //
    GOODS_VALUE = 1;       //
    VIDEO_VALUE = 2;       //
    ARTICLE_VALUE = 3;     //
}

//
enum SearchItemVideoSubType {
    UGC = 0; //
    PGC = 1; //
}

// 评论搜索item前置发布-请求
message SearchItemPreHookReq {
    // 目标评论区id
    int64 oid = 1;
    // 目标评论区类型
    int64 type = 2;
}

// 评论搜索item前置发布-响应
message SearchItemPreHookReply {
    // 输入框的文案
    string placeholder_text = 1;
    // 背景空白的时候的文案
    string background_text = 2;
    // 有权限的tab栏的顺序
    repeated SearchItemType ordered_type = 3;
}

// 评论搜索插入项目-请求
message SearchItemReq {
    //页面游标
    SearchItemCursorReq cursor = 1;
    //目标评论区id
    int64 oid = 2;
    //评论区类型
    int64 type = 3;
    //搜索关键词
    string keyword = 4;
}

//
message SearchItemReplyExtraInfo {
    //
    string event_id = 1;
}

// 评论搜索插入项目-回复
message SearchItemReply {
    //
    SearchItemCursorReply cursor = 1;
    // 搜索的结果
    repeated SearchItem items = 2;
    // 附加信息
    SearchItemReplyExtraInfo extra = 3;
}

// 评论搜索插入项目请求游标
message SearchItemCursorReq {
    // 下一页
    int64 next = 1;
    // tab类型
    SearchItemType item_type = 2;
}

// 评论搜索插入项目响应游标
message SearchItemCursorReply {
    // 是否有下一页
    bool has_next = 1;
    // 下页
    int64 next = 2;
}

// 评论搜索插入项目
message SearchItem {
    //
    string url = 1;
    // 项目
    oneof item {
        // 商品
        GoodsSearchItem goods = 2;
        // 视频
        VideoSearchItem video = 3;
        // 专栏
        ArticleSearchItem article = 4;
    }
}

// 商品项目
message GoodsSearchItem {
    // 商品id
    int64 id = 1;
    // 商品名
    string name = 2;
    // 价钱
    string price = 3;
    // 收入
    string income = 4;
    // 图片
    string img = 5;
    // 标签
    string label = 6;
}

// 视频项目
message VideoSearchItem {
    //
    SearchItemVideoSubType type = 1;
    //
    oneof video_item {
        // UGC视频
        UGCVideoSearchItem ugc = 2;
        // PGC视频
        PGCVideoSearchItem pgc = 3;
    }
}

// UGC视频项目
message UGCVideoSearchItem {
    // 标题
    string title = 1;
    // UP主昵称
    string up_nickname = 2;
    // 时长(单位为秒)
    int64 duration = 3;
    // 封面
    string cover = 4;
}

// PGC视频项目
message PGCVideoSearchItem {
    // 标题
    string title = 1;
    // 类别
    string category = 2;
    // 封面
    string cover = 3;
}

// 文章项目
message ArticleSearchItem {
    // 标题
    string title = 1;
    // UP主昵称
    string up_nickname = 2;
    // 封面
    repeated string covers = 3;
}