syntax = "proto3";

package bilibili.broadcast.message.ogv;

option java_multiple_files = true;

// 播放状态
enum PlayStatus {
  // 暂停
  Pause = 0;
  // 播放
  Play = 1;
  // 终止
  End = 2;
}

// 房间类型
enum RoomType {
  // 私密
  Private = 0;
  // 公开
  Open = 1;
}

// 信息通知发送领域
enum MessageDomain {
  // 默认
  DefaultDomain = 0;
  // 房间用户
  RoomMid = 1;
  // 系统通知
  SystemInfo = 2;
}

// 通知信息类型
enum MessageType {
  // 默认
  DefaultType = 0;
  // 房间用户
  ChatMessage = 1;
  // 系统通知
  SystemMessage = 2;
}

// 触发通知类型
enum TriggerType {
  // 默认
  DefaultTrigger = 0;
  // 关注、取消关注
  Relation = 1;
}

// 房间人员变更事件
message RoomMemberChangeEvent {
  // 房间id
  int64 room_id = 1;
  // 房主id
  int64 owner_id = 2;
  // 房间成员列表
  repeated UserInfoProto members = 3;
  // 提示信息
  MessageProto message = 4;
}

// 播放进度同步事件
message ProgressSyncEvent {
  // 房间id
  int64 room_id = 1;
  // 播放中的season_id
  int64 season_id = 2;
  // 播放中的episode_id
  int64 episode_id = 3;
  // 播放状态
  PlayStatus status = 4;
  // 房主播放进度
  int64 progress = 5;
  // 提示信息
  MessageProto message = 6;
}

// 房间状态更新
message RoomUpdateEvent {
  // 房间id
  int64 room_id = 1;
  // 房间变更状态
  RoomType type = 2;
  // 提示信息
  MessageProto message = 3;
}

// 房间销毁通知
message RoomDestroyEvent {
  // 房间id
  int64 room_id = 1;
  // 提示信息
  MessageProto message = 4;
}

// 房间触发通知
message RoomTriggerEvent {
  // 操作人
  int64 mid = 1;
  // 提示信息
  MessageProto message = 2;
  // 触发类型
  TriggerType trigger = 3;
}

//用户信息
message UserInfoProto {
  // 用户id
  int64 mid = 1;
  // 用户头像url
  string face = 2;
  // 昵称
  string nickname = 3;
  // 等级
  int32 level = 4;
  // 签名
  string sign = 5;
  // 大会员信息
  VipProto vip = 6;
  // 身份认证信息
  OfficialProto official = 7;
  // 挂件信息
  PendantProto pendant = 8;
  // 设备buvid
  string buvid = 9;
}

//通知信息
message MessageProto {
  // 可带占位符匹配的消息体 ep "还没有其他小伙伴，[去邀请>]<https://big.bilibili.com/mobile/giftIndex?mid=123>"
  string content = 1;
  // 消息体类型
  // 0:json格式的文本消息 1:支持全文本可点(破冰)
  int32 content_type = 2;
}

//大会员信息
message VipProto {
  int32 type = 1;
  int32 status = 2;
  int64 due_date = 3;
  int32 vip_pay_type = 4;
  int32 theme_type = 5;
  // 大会员角标
  // 0:无角标 1:粉色大会员角标 2:绿色小会员角标
  int32 avatar_subscript = 6;
  // 昵称色值，可能为空，色值示例：#FFFB9E60
  string nickname_color = 7;
}

//认证信息
message OfficialProto {
  int32 role = 1;
  string title = 2;
  string desc = 3;
  int32 type = 4;
}

//挂件信息
message PendantProto {
  int32 pid = 1;
  string name = 2;
  string image = 3;
  int64 expire = 4;
  string image_enhance = 5;
}

// 通用信息通知
message MessageEvent {
  // 房间id
  int64 room_id = 1;
  // 消息id
  int64 msg_id = 2;
  // 消息发送服务端时间 时间戳 单位秒
  int64 ts = 3;
  // 信息通知发送主体id
  int64 oid = 4;
  // 信息通知发送领域
  MessageDomain domain = 5;
  // 通知信息类型
  MessageType type = 6;
  // 提示信息
  MessageProto message = 7;
  // 消息发送用户信息
  UserInfoProto user = 8;
  // 消息id str类型
  string msg_id2 = 9;
}

// 聊天信息清除通知
message RemoveChatEvent {
  // 房间id
  int64 room_id = 1;
  // 撤回的聊天信息id
  int64 msg_id = 2;
  // 提示信息
  MessageProto message = 3;
}

// "一起看"房间事件
message FreyaEventBody {
  // 房间id
  int64 room_id = 1;
  // 接收事件消息的白名单用户
  repeated int64 white_mid = 2;
  // 不处理信息的黑名单用户 优先级低于白名单 当白名单有数据时 忽略黑名单
  repeated int64 ignore_mid = 3;
  //命令类型
  oneof event {
    // 房间人员变更事件
    RoomMemberChangeEvent member_change = 4;
    // 播放进度同步事件
    ProgressSyncEvent progress = 5;
    // 房间状态更新
    RoomUpdateEvent room_update = 6;
    // 通用信息通知
    MessageEvent message = 7;
    // 聊天信息清除通知
    RemoveChatEvent remove_chat = 8;
    // 房间销毁通知
    RoomDestroyEvent room_destroy = 9;
    // 房间触发通知
    RoomTriggerEvent room_trigger = 10;
  }
  // 消息序列号
  int64 sequence_id = 100;
}