import { KeepLiveWS } from "tiny-bilibili-ws/browser";
import { KeepLiveTCP, TCPOptions, WS_OP } from "tiny-bilibili-ws";

//#region src/types/const.d.ts
declare enum GuardLevel {
  /** 无 */
  None = 0,
  /** 总督 */
  Zongdu = 1,
  /** 提督 */
  Tidu = 2,
  /** 舰长 */
  Jianzhang = 3,
}
//#endregion
//#region src/types/app.d.ts
interface User {
  /** 用户uid */
  uid: number;
  /** 用户名 */
  uname: string;
  /** 用户头像 */
  face?: string;
  /** 用户牌子·*/
  badge?: {
    /** 是否点亮 */
    active: boolean;
    /** 牌子名称 */
    name: string;
    /** 牌子等级 */
    level: number;
    /** 牌子颜色 */
    color: string;
    /** 渐变色牌子，当用户长时间未消费，则会变为灰色，即 `#c0c0c0` */
    gradient?: [string, string, string];
    /** 主播信息 */
    anchor: {
      /** 主播uid */
      uid: number;
      /** 主播用户名 */
      uname: string;
      /** 主播房间号 */
      room_id: number;
      /** 是否为本直播间 */
      is_same_room?: boolean;
    };
  };
  /** 用户身份 */
  identity?: {
    /** 直播榜单排名 */
    rank: 0 | 1 | 2 | 3;
    /** 大航海信息 */
    guard_level: GuardLevel;
    /** 房管 */
    room_admin: boolean;
  };
}
interface Message<T> {
  /** 消息id */
  id: string;
  /** 接收消息的时间，毫秒时间戳 */
  timestamp: number;
  /** 消息类型 */
  type: string;
  /** 消息内容 */
  body: T;
  /** 原始消息内容 */
  raw: any;
}
//#endregion
//#region src/parser/HEARTBEAT.d.ts
interface AttentionChangeMsg {
  /** 直播间热度 */
  attention: number;
}
type Handler$18 = {
  /** 直播间热度变化 */
  onAttentionChange: (msg: Message<AttentionChangeMsg>) => void;
};
//#endregion
//#region src/parser/LIVE.d.ts
interface LiveStartMsg {
  /** 开播平台 */
  live_platform: string;
  /** 房间号 */
  room_id: number;
}
type Handler$17 = {
  /** 直播开始消息 */
  onLiveStart: (msg: Message<LiveStartMsg>) => void;
};
//#endregion
//#region src/parser/PREPARING.d.ts
interface LiveEndMsg {
  /** 房间号 */
  room_id: number;
}
type Handler$16 = {
  /** 直播结束消息 */
  onLiveEnd: (msg: Message<LiveEndMsg>) => void;
};
//#endregion
//#region src/parser/ANCHOR_LOT_AWARD.d.ts
interface AnchorLotteryEndMsg {
  /** 天选抽奖id */
  id: number;
  /** 天选奖品信息 */
  award: {
    /** 奖品图片 */
    image: string;
    /** 奖品名称 */
    name: string;
    /** 是否为虚拟礼物奖品 */
    virtual: boolean;
  };
  /** 中奖用户列表 */
  winner: ({
    /** 用户uid */
    uid: number;
    /** 用户昵称 */
    uname: string;
    /** 用户头像 */
    face: number;
    /** 用户粉丝勋章等级 */
    level: number;
    /** 中奖数量 */
    num: number;
  })[];
}
type Handler$15 = {
  /** 主播天选时刻抽奖结果 */
  onAnchorLotteryEnd: (msg: Message<AnchorLotteryEndMsg>) => void;
};
//#endregion
//#region src/parser/ANCHOR_LOT_START.d.ts
interface AnchorLotteryStartMsg {
  /** 天选抽奖id */
  id: number;
  /** 开始时间，秒级时间戳 */
  start_time: number;
  /** 持续时间，秒 */
  duration: number;
  /** 天选奖品信息 */
  award: {
    /** 奖品图片 */
    image: string;
    /** 奖品名称 */
    name: string;
    /** 奖品数量 */
    num: number;
    /** 是否为虚拟礼物奖品 */
    virtual: boolean;
    /** 虚拟奖品价值描述，实物奖品为空 */
    price_text: string;
  };
  /** 抽奖要求 */
  require: {
    /** 口令弹幕内容，无需弹幕为空字符串 */
    danmu: string;
    /** 需送主播礼物，无需送礼为空 */
    gift: {
      /** 礼物id */
      id: string;
      /** 礼物名称 */
      name: string;
      /** 礼物数量 */
      num: number;
      /** 单个礼物价值，除以1000为RMB */
      price: number;
    } | null;
    /** 抽奖参与人群要求，无要求为空 */
    user: {
      /** 参与人群限制（关注/粉丝勋章/大航海） */
      type: 'follow' | 'medal' | 'guard';
      /** 参与人群限制等级，如粉丝勋章等级 */
      value: number;
      /** 参与人群限制描述 */
      text: string;
    } | null;
  };
}
type Handler$14 = {
  /** 主播天选时刻抽奖开启 */
  onAnchorLotteryStart: (msg: Message<AnchorLotteryStartMsg>) => void;
};
//#endregion
//#region src/parser/DANMU_MSG.d.ts
interface DanmuMsg {
  user: User;
  /** 弹幕内容 */
  content: string;
  /** 弹幕类型：1 2 3：普通弹幕；4：底部弹幕；5：顶部弹幕 */
  type: number;
  /** 弹幕颜色 */
  content_color: string;
  /** 发送时间，毫秒时间戳 */
  timestamp: number;
  /** 是否为天选抽奖弹幕 */
  lottery: boolean;
  /** 表情弹幕内容 */
  emoticon?: {
    id: string;
    height: number;
    width: number;
    url: string;
  };
  /** 弹幕内小表情映射，key为表情文字，如"[妙]" */
  in_message_emoticon?: Record<string, {
    id: string;
    emoticon_id: number;
    height: number;
    width: number;
    url: string;
    description: string;
  }>;
}
type Handler$13 = {
  /** 收到普通弹幕消息 */
  onIncomeDanmu: (msg: Message<DanmuMsg>) => void;
};
//#endregion
//#region src/parser/GUARD_BUY.d.ts
interface GuardBuyMsg {
  user: User;
  /** 礼物id */
  gift_id: number;
  /** 礼物名称 */
  gift_name: string;
  /** 大航海信息 */
  guard_level: GuardLevel;
  /** 价格，RMB */
  price: number;
  /** 等级生效时间 */
  start_time: number;
  /** 等级过期时间 */
  end_time: number;
}
type Handler$12 = {
  /** 舰长上舰消息 */
  onGuardBuy: (msg: Message<GuardBuyMsg>) => void;
};
//#endregion
//#region src/parser/INTERACT_WORD_ENTRY_EFFECT.d.ts
type UserAction = 'enter' | 'follow' | 'share' | 'like' | 'unknown';
interface UserActionMsg {
  user: User;
  /** 事件类型 */
  action: UserAction;
  /** 事件时间，毫秒时间戳 */
  timestamp: number;
}
type Handler$11 = {
  /** 用户进入、关注、分享、点赞直播间 */
  onUserAction: (msg: Message<UserActionMsg>) => void;
};
//#endregion
//#region src/parser/LIKE_INFO_V3_UPDATE.d.ts
interface LikedChangeMsg {
  /** 直播间点赞人数 */
  count: number;
}
type Handler$10 = {
  /** 累计点赞人数变化 */
  onLikedChange: (msg: Message<LikedChangeMsg>) => void;
};
//#endregion
//#region src/parser/ONLINE_RANK_COUNT.d.ts
interface RankCountChangeMsg {
  /** 高能用户人数 */
  count: number;
}
type Handler$9 = {
  /** 高能用户人数变化 */
  onRankCountChange: (msg: Message<RankCountChangeMsg>) => void;
};
//#endregion
//#region src/parser/POPULARITY_RED_POCKET_START.d.ts
interface RedPocketStartMsg {
  /** 红包抽奖id */
  id: number;
  /** 红包发送用户 */
  user: User;
  /** 开始时间，秒级时间戳 */
  start_time: number;
  /** 结束时间，秒级时间戳 */
  end_time: number;
  /** 持续时间，秒 */
  duration: number;
  /** 口令弹幕内容 */
  danmu: string;
  /** 红包奖品 */
  awards: RedPocketStartAward[];
  /** 奖品总价值，除以1000为RMB */
  total_price: number;
  /** 剩余等待的红包数 */
  wait_num: number;
}
interface RedPocketStartAward {
  /** 奖品id */
  gift_id: number;
  /** 奖品名称 */
  gift_name: string;
  /** 奖品图片 */
  gift_pic: string;
  /** 奖品数量 */
  num: number;
}
type Handler$8 = {
  /** 红包抽奖开始 */
  onRedPocketStart: (msg: Message<RedPocketStartMsg>) => void;
};
//#endregion
//#region src/parser/POPULARITY_RED_POCKET_WINNER_LIST.d.ts
interface RedPocketEndMsg {
  /** 红包抽奖id */
  id: number;
  /** 中奖人数 */
  total_num: number;
  /** 中奖用户列表 */
  winner: ({
    /** 用户uid */
    uid: number;
    /** 用户昵称 */
    uname: string;
    /** 奖品id */
    award_id: number;
  } & RedPocketEndAward)[];
  /** 红包奖品列表 */
  awards: Record<string, RedPocketEndAward>;
}
interface RedPocketEndAward {
  /** 奖品类型，待补充 */
  award_type: number;
  /** 奖品名称 */
  award_name: string;
  /** 奖品图片 */
  award_pic: string;
  /** 奖品图片大图 */
  award_big_pic: string;
  /** 奖品价值，除以1000为RMB */
  award_price: number;
}
type Handler$7 = {
  /** 红包抽奖结果 */
  onRedPocketEnd: (msg: Message<RedPocketEndMsg>) => void;
};
//#endregion
//#region src/parser/ROOM_ADMIN.d.ts
interface RoomAdminSetMsg {
  /** 类型（设立、撤销） */
  type: 'set' | 'revoke';
  /** 用户uid */
  uid: number;
}
type Handler$6 = {
  /** 房间设立、撤销房管 */
  onRoomAdminSet: (msg: Message<RoomAdminSetMsg>) => void;
};
//#endregion
//#region src/parser/ROOM_CHANGE.d.ts
interface RoomInfoChangeMsg {
  /** 直播间标题 */
  title: string;
  /** 一级分区id */
  parent_area_id: number;
  /** 一级分区名 */
  parent_area_name: string;
  /** 二级分区id */
  area_id: number;
  /** 二级分区名 */
  area_name: string;
}
type Handler$5 = {
  /** 直播间信息修改 */
  onRoomInfoChange: (msg: Message<RoomInfoChangeMsg>) => void;
};
//#endregion
//#region src/parser/ROOM_SILENT.d.ts
interface RoomSilentMsg {
  /** 禁言类型（按用户等级、勋章等级、全员、关闭） */
  type: 'level' | 'medal' | 'member' | 'off';
  /** 禁言等级 */
  level: number;
  /** 禁言结束时间，秒级时间戳，-1 为无限 */
  second: number;
}
type Handler$4 = {
  /** 房间开启、关闭全局禁言 */
  onRoomSilent: (msg: Message<RoomSilentMsg>) => void;
};
//#endregion
//#region src/parser/SEND_GIFT.d.ts
interface GiftMsg {
  user: User;
  /** 礼物id */
  gift_id: number;
  /** 礼物名称 */
  gift_name: string;
  /** 礼物价格类型 */
  coin_type: 'silver' | 'gold';
  /** 礼物价格，除以1000为RMB */
  price: number;
  /** 礼物数量 */
  amount: number;
  /** 送礼指向主播信息，多人直播间可指定要送给的主播，单人直播间为空 */
  send_master?: {
    uid: number;
    uname: string;
    room_id: number;
  };
  /** 礼物连击 */
  combo?: {
    /** 连击id */
    batch_id: string;
    /** 当前连击数（礼物总数） */
    combo_num: number;
    /** 连击礼物总价格，除以1000为RMB */
    total_price: number;
  };
}
type Handler$3 = {
  /** 收到礼物 */
  onGift: (msg: Message<GiftMsg>) => void;
};
//#endregion
//#region src/parser/SUPER_CHAT_MESSAGE.d.ts
interface SuperChatMsg {
  /** 消息id */
  id: number;
  /** 发送用户 */
  user: User;
  /** 弹幕内容 */
  content: string;
  /** 弹幕颜色 */
  content_color: string;
  /** 价格，RMB */
  price: number;
  /** 持续时间，秒 */
  time: number;
}
type Handler$2 = {
  /** 收到醒目留言 */
  onIncomeSuperChat: (msg: Message<SuperChatMsg>) => void;
};
//#endregion
//#region src/parser/WARNING_CUT_OFF.d.ts
interface RoomWarnMsg {
  /** 处理类型 */
  type: 'warning' | 'cut';
  /** 处理原因 */
  msg: string;
}
type Handler$1 = {
  /** 房间被超管警告、切断 */
  onRoomWarn: (msg: Message<RoomWarnMsg>) => void;
};
//#endregion
//#region src/parser/WATCHED_CHANGE.d.ts
interface WatchedChangeMsg {
  /** 累计入场人数 */
  num: number;
  /** 累计入场人数，格式化输出 */
  text_small: string;
}
type Handler = {
  /** 累计看过人数变化 */
  onWatchedChange: (msg: Message<WatchedChangeMsg>) => void;
};
//#endregion
//#region src/listener/index.d.ts
type MsgHandler = Partial<{
  /** 连接成功 */
  onOpen: () => void;
  /** 连接关闭 */
  onClose: () => void;
  /** 连接错误 */
  onError: (e: Error) => void;
  /** 开始监听消息 */
  onStartListen: () => void;
} & Handler$18 & Handler$17 & Handler$16 & Handler$15 & Handler$14 & Handler$13 & Handler$12 & Handler$11 & Handler$10 & Handler$9 & Handler$8 & Handler$7 & Handler$6 & Handler$5 & Handler$4 & Handler$3 & Handler$2 & Handler$1 & Handler & {
  /** 原始消息 */
  raw: Record<'msg' | string, (msg: any) => void>;
}>;
//#endregion
//#region src/index.d.ts
interface MessageListener {
  /** tiny-bilibili-ws 实例 */
  live: KeepLiveTCP | KeepLiveWS;
  /** 直播间房间号 */
  roomId: number;
  /** 人气值 */
  online: number;
  /** 是否关闭 */
  closed: boolean;
  /** 关闭连接 */
  close: () => void;
  /** 刷新当前直播间热度 */
  getAttention: () => Promise<number>;
  /** 刷新当前直播间热度 */
  getOnline: () => Promise<number>;
  /** 重新连接 */
  reconnect: () => void;
  /** 发送心跳 */
  heartbeat: () => void;
  /** 发送消息 */
  send: (op: WS_OP, data?: Record<string, any> | string) => void;
}
interface MessageListenerTCPOptions {
  /**
   * tiny-bilibili-ws 连接选项
   *
   * @see https://github.com/starknt/tiny-bilibili-ws
   */
  ws?: TCPOptions;
}
declare const startListen: (roomId: number, handler: MsgHandler, options?: MessageListenerTCPOptions) => MessageListener;
//#endregion
export { AnchorLotteryEndMsg, AnchorLotteryStartMsg, AttentionChangeMsg, DanmuMsg, GiftMsg, GuardBuyMsg, GuardLevel, LikedChangeMsg, LiveEndMsg, LiveStartMsg, Message, MessageListener, MsgHandler, RankCountChangeMsg, RedPocketEndMsg, RedPocketStartMsg, RoomAdminSetMsg, RoomInfoChangeMsg, RoomSilentMsg, RoomWarnMsg, SuperChatMsg, User, UserActionMsg, WatchedChangeMsg, startListen };