@akokko/blive-message-listener
Version:
Bilibili-live danmu listener with type
518 lines (517 loc) • 13.2 kB
TypeScript
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 };