floating-live 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +62 -0
  3. package/index.d.ts +2 -0
  4. package/index.js +6 -0
  5. package/package.json +29 -0
  6. package/plugin/acfun/acfunLive.d.ts +74 -0
  7. package/plugin/acfun/acfunLive.js +236 -0
  8. package/plugin/acfun/index.d.ts +3 -0
  9. package/plugin/acfun/index.js +12 -0
  10. package/plugin/bilibili/bilibiliLive.d.ts +58 -0
  11. package/plugin/bilibili/bilibiliLive.js +421 -0
  12. package/plugin/bilibili/index.d.ts +3 -0
  13. package/plugin/bilibili/index.js +12 -0
  14. package/plugin/chat/ChatCommand.d.ts +9 -0
  15. package/plugin/chat/ChatCommand.js +39 -0
  16. package/plugin/chat/ChatFilter.d.ts +9 -0
  17. package/plugin/chat/ChatFilter.js +44 -0
  18. package/plugin/chat/chatProcessor.d.ts +12 -0
  19. package/plugin/chat/chatProcessor.js +24 -0
  20. package/plugin/chatPrint/chatPrint.d.ts +21 -0
  21. package/plugin/chatPrint/chatPrint.js +111 -0
  22. package/plugin/chatPrint/index.d.ts +4 -0
  23. package/plugin/chatPrint/index.js +8 -0
  24. package/plugin/consoleEvent/index.d.ts +3 -0
  25. package/plugin/consoleEvent/index.js +39 -0
  26. package/plugin/msgSave/index.d.ts +4 -0
  27. package/plugin/msgSave/index.js +31 -0
  28. package/plugin/msgSave/msgSave.d.ts +22 -0
  29. package/plugin/msgSave/msgSave.js +40 -0
  30. package/src/controller/Message.d.ts +9 -0
  31. package/src/controller/Message.js +15 -0
  32. package/src/controller/Room.d.ts +32 -0
  33. package/src/controller/Room.js +110 -0
  34. package/src/controller/index.d.ts +39 -0
  35. package/src/controller/index.js +74 -0
  36. package/src/index.d.ts +33 -0
  37. package/src/index.js +50 -0
  38. package/src/lib/Registerable.d.ts +27 -0
  39. package/src/lib/Registerable.js +67 -0
  40. package/src/types/message/AttributeInfo.d.ts +64 -0
  41. package/src/types/message/AttributeInfo.js +2 -0
  42. package/src/types/message/MessageData.d.ts +80 -0
  43. package/src/types/message/MessageData.js +2 -0
  44. package/src/types/message/MessageInfo.d.ts +123 -0
  45. package/src/types/message/MessageInfo.js +2 -0
  46. package/src/types/plugin/Plugin.d.ts +3 -0
  47. package/src/types/plugin/Plugin.js +2 -0
  48. package/src/types/room/LiveInfo.d.ts +24 -0
  49. package/src/types/room/LiveInfo.js +2 -0
  50. package/src/types/room/LiveRoom.d.ts +20 -0
  51. package/src/types/room/LiveRoom.js +2 -0
  52. package/src/types/room/PlatformInfo.d.ts +38 -0
  53. package/src/types/room/PlatformInfo.js +2 -0
  54. package/src/types/room/RoomInfo.d.ts +16 -0
  55. package/src/types/room/RoomInfo.js +2 -0
  56. package/src/utils/getRoomInfo.d.ts +4 -0
  57. package/src/utils/getRoomInfo.js +25 -0
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class chatPrint {
4
+ constructor(main) {
5
+ this.main = main;
6
+ let hidden = [];
7
+ this.hideType = new Set(hidden); // 隐藏类型
8
+ this.main.on("live_message", (msg) => { this.log(msg); });
9
+ }
10
+ /** 获取用户信息 */
11
+ getUserInfo(message) {
12
+ let user = message.info.user; // 用户信息
13
+ let name = `${"\x1b[33m"}${user.name}`; // 用户名
14
+ let medal = user.medal ? `${"\x1b[32m"}[${user.medal.name}(${user.medal.level})] ` : ""; // 粉丝牌
15
+ let privilege = user.privilege ? `${"\x1b[36m"}[${this.getPriviliegeName(message.platform, user.privilege)}]` : ""; // 特权粉丝
16
+ let admin = user.admin ? `${"\x1b[95m"}[${["", "主播", "房"][user.admin]}]` : ""; // 房管
17
+ return `${medal}${privilege}${admin}${name}${"\x1b[0m"}`; //[粉丝牌(等级)] [特权][房管]用户名
18
+ }
19
+ /** 获取特权粉丝名称 */
20
+ getPriviliegeName(platform, level) {
21
+ switch (platform) {
22
+ case "bilibili":
23
+ return `${"\x1b[36m"}${["", "总督", "提督", "舰长"][Number(level)]}`;
24
+ default:
25
+ return level;
26
+ }
27
+ }
28
+ /** 记录在控制台上 */
29
+ log(message) {
30
+ if (this.hideType.has(message.type)) {
31
+ return;
32
+ }
33
+ switch (message.type) {
34
+ case "text": {
35
+ let user = this.getUserInfo(message);
36
+ let text = message.info.text;
37
+ console.log(`${user}: ${text}`);
38
+ break;
39
+ }
40
+ case "image": {
41
+ let user = this.getUserInfo(message);
42
+ let image = message.info.image.name || message.info.image.id;
43
+ console.log(`${user}: [img]${image}`);
44
+ break;
45
+ }
46
+ case "like": {
47
+ let user = this.getUserInfo(message);
48
+ console.log(`${user} 点赞了`);
49
+ break;
50
+ }
51
+ case "gift": {
52
+ let user = this.getUserInfo(message);
53
+ let action = message.info.gift.action || "送出";
54
+ let name = message.info.gift.name;
55
+ let num = message.info.gift.num;
56
+ console.log(`${user}${"\x1b[0m"} ${action} ${"\x1b[40;33m"}${name} x${num}${"\x1b[0m"}`);
57
+ break;
58
+ }
59
+ case "privilege": {
60
+ let user = this.getUserInfo(message);
61
+ let name = message.info.name;
62
+ let action = message.info.renew ? ["开通", "续费", "自动续费"][message.info.renew] : "开通";
63
+ console.log(`${user}${"\x1b[1;31m"} ${action}了主播的${"\x1b[33m"}${name}${"\x1b[0m"}`);
64
+ break;
65
+ }
66
+ case "superchat": {
67
+ let user = this.getUserInfo(message);
68
+ let second = Math.round(message.info.duration / 1000);
69
+ console.log(`${"\x1b[1;36m"}SC(${second}s) ${user}${"\x1b[0m"}: ${message.info.text}`);
70
+ break;
71
+ }
72
+ case "entry": {
73
+ let user = this.getUserInfo(message);
74
+ console.log(`${user} 进入直播间`);
75
+ break;
76
+ }
77
+ case "follow": {
78
+ let user = this.getUserInfo(message);
79
+ console.log(`${user} 关注了主播`);
80
+ break;
81
+ }
82
+ case "share": {
83
+ let user = this.getUserInfo(message);
84
+ console.log(`${user} 分享了直播间`);
85
+ break;
86
+ }
87
+ case "block": {
88
+ let user = this.getUserInfo(message);
89
+ let operator = message.info.operator.admin ? ["", "主播", "房管"][message.info.operator.admin] : "管理员";
90
+ console.log(`${user} 已被${operator}禁言`);
91
+ break;
92
+ }
93
+ case "live_start": {
94
+ let roomKey = `${message.platform}:${message.room}`;
95
+ console.log(`[+] 直播间${"\x1b[40;33m"} ${roomKey} ${"\x1b[0m"}已开播`);
96
+ break;
97
+ }
98
+ case "live_cut": {
99
+ let roomKey = `${message.platform}:${message.room}`;
100
+ let msg = message.info.message;
101
+ console.log(`[!] ${"\x1b[1;31m"}直播间${"\x1b[40;33m"} ${roomKey} ${"\x1b[1;31m"}被管理员切断${"\x1b[0m"}: ${msg}`);
102
+ break;
103
+ }
104
+ case "live_end": {
105
+ let roomKey = `${message.platform}:${message.room}`;
106
+ console.log(`[=] ${"\x1b[1;31m"}直播间${"\x1b[40;33m"} ${roomKey} ${"\x1b[1;31m"}已结束直播${"\x1b[0m"}`);
107
+ }
108
+ }
109
+ }
110
+ }
111
+ exports.default = chatPrint;
@@ -0,0 +1,4 @@
1
+ import FloatingLive from "../../src";
2
+ import chatPrint from "./chatPrint";
3
+ declare const _default: (ctx: FloatingLive) => chatPrint;
4
+ export = _default;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const chatPrint_1 = __importDefault(require("./chatPrint"));
6
+ module.exports = (ctx) => {
7
+ return new chatPrint_1.default(ctx);
8
+ };
@@ -0,0 +1,3 @@
1
+ import FloatingLive from "../../src";
2
+ declare const _default: (ctx: FloatingLive) => void;
3
+ export = _default;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ module.exports = (ctx) => {
3
+ ctx.on("start", () => {
4
+ console.log(`[controller]记录已开始: ${ctx.controller.timestamp}`);
5
+ });
6
+ ctx.on("end", () => {
7
+ console.log(`[controller]记录已结束: ${ctx.controller.timestamp}`);
8
+ });
9
+ ctx.on("room_connect", (key) => {
10
+ console.log(`[${key}]已连接到直播服务器`);
11
+ });
12
+ ctx.on("room_disconnect", (key) => {
13
+ console.log(`[${key}]与直播服务器的连接已断开`);
14
+ });
15
+ ctx.on("room_info", (key) => {
16
+ console.log(`[${key}]已获取到房间信息`);
17
+ });
18
+ ctx.on("room_update", (key) => {
19
+ console.log(`[${key}]直播间信息更新`);
20
+ });
21
+ ctx.on("room_open", (key) => {
22
+ console.log(`[${key}]房间已打开`);
23
+ });
24
+ ctx.on("room_close", (key) => {
25
+ console.log(`[${key}]房间已关闭`);
26
+ });
27
+ ctx.on("room_open", (key) => {
28
+ console.log(`[room]已添加房间: ${key}`);
29
+ });
30
+ ctx.on("room_close", (key) => {
31
+ console.log(`[room]已移除房间: ${key}`);
32
+ });
33
+ ctx.on("room_exist", (key) => {
34
+ console.log(`[room]房间已存在: ${key}`);
35
+ });
36
+ ctx.on("room_unexist", (key) => {
37
+ console.log(`[room]房间不存在: ${key}`);
38
+ });
39
+ };
@@ -0,0 +1,4 @@
1
+ import FloatingLive from "../../src";
2
+ import msgSave from "../msgSave/msgSave";
3
+ export declare const messageSave: (ctx: FloatingLive) => msgSave;
4
+ export declare const messageSaveOrigin: (ctx: FloatingLive) => msgSave;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.messageSaveOrigin = exports.messageSave = void 0;
7
+ const msgSave_1 = __importDefault(require("../msgSave/msgSave"));
8
+ const messageSave = (ctx) => {
9
+ let saveMessage = new msgSave_1.default(ctx, "live_message", `./save/undefined.txt`, ctx.controller.started);
10
+ ctx.on("start", () => {
11
+ let startDate = new Date(ctx.controller.timestamp);
12
+ let fileId = `${startDate.getFullYear()}${(startDate.getMonth() + 1).toString().padStart(2, '0')}${startDate.getDate().toString().padStart(2, '0')}_${startDate.getHours().toString().padStart(2, '0')}${startDate.getMinutes().toString().padStart(2, '0')}${startDate.getSeconds().toString().padStart(2, '0')}-${String(ctx.controller.room.keyList[0]).replace(":", "-")}`;
13
+ saveMessage.changeFile(`./save/${fileId}.txt`);
14
+ saveMessage.start();
15
+ });
16
+ ctx.on("end", () => { saveMessage.pause(); });
17
+ return saveMessage;
18
+ };
19
+ exports.messageSave = messageSave;
20
+ const messageSaveOrigin = (ctx) => {
21
+ let saveOrigin = new msgSave_1.default(ctx, "live_origin", `./save/undefined-origin.txt`, ctx.controller.started);
22
+ ctx.on("start", () => {
23
+ let startDate = new Date(ctx.controller.timestamp);
24
+ let fileId = `${startDate.getFullYear()}${(startDate.getMonth() + 1).toString().padStart(2, '0')}${startDate.getDate().toString().padStart(2, '0')}_${startDate.getHours().toString().padStart(2, '0')}${startDate.getMinutes().toString().padStart(2, '0')}${startDate.getSeconds().toString().padStart(2, '0')}-${String(ctx.controller.room.keyList[0]).replace(":", "-")}`;
25
+ saveOrigin.changeFile(`./save/${fileId}-origin.txt`);
26
+ saveOrigin.start();
27
+ });
28
+ ctx.on("end", () => { saveOrigin.pause(); });
29
+ return saveOrigin;
30
+ };
31
+ exports.messageSaveOrigin = messageSaveOrigin;
@@ -0,0 +1,22 @@
1
+ import FloatingLiving from "../..";
2
+ declare class msgSave {
3
+ /** 主模块 */
4
+ main: FloatingLiving;
5
+ file: string;
6
+ config: object;
7
+ type: string;
8
+ paused: boolean;
9
+ listener: (msg: any) => void;
10
+ constructor(main: FloatingLiving, type: string, file: string, open?: boolean, config?: {
11
+ encoding: string;
12
+ flag: string;
13
+ });
14
+ write(message: any): void;
15
+ start(): void;
16
+ pause(): void;
17
+ /** 更改路径 */
18
+ changeFile(file: string): void;
19
+ /** 销毁实例 */
20
+ destory(): void;
21
+ }
22
+ export default msgSave;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ class msgSave {
8
+ constructor(main, type, file, open = true, config = { encoding: "utf8", flag: "a" }) {
9
+ this.paused = !open;
10
+ this.main = main;
11
+ this.file = file;
12
+ this.config = config;
13
+ this.type = type;
14
+ this.listener = (msg) => { if (!this.paused)
15
+ this.write(msg); };
16
+ this.main.on(this.type, this.listener);
17
+ }
18
+ write(message) {
19
+ fs_1.default.writeFile(this.file, JSON.stringify(message) + ",", this.config, (err) => {
20
+ if (err)
21
+ throw err;
22
+ // console.log('写入成功');
23
+ });
24
+ }
25
+ start() {
26
+ this.paused = false;
27
+ }
28
+ pause() {
29
+ this.paused = true;
30
+ }
31
+ /** 更改路径 */
32
+ changeFile(file) {
33
+ this.file = file;
34
+ }
35
+ /** 销毁实例 */
36
+ destory() {
37
+ this.main.removeListener(this.type, this.listener);
38
+ }
39
+ }
40
+ exports.default = msgSave;
@@ -0,0 +1,9 @@
1
+ import Controller from ".";
2
+ import FloatingLive from "..";
3
+ import { MessageType } from "../types/message/MessageData";
4
+ export default class Message {
5
+ readonly controller: Controller;
6
+ readonly main: FloatingLive;
7
+ constructor(controller: Controller);
8
+ send(msg: MessageType): void;
9
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class Message {
4
+ constructor(controller) {
5
+ this.controller = controller;
6
+ this.main = controller.main;
7
+ }
8
+ send(msg) {
9
+ this.main.helper.messageHandler.getList().forEach((handler) => {
10
+ handler(msg);
11
+ });
12
+ this.main.emit("live_message", msg);
13
+ }
14
+ }
15
+ exports.default = Message;
@@ -0,0 +1,32 @@
1
+ import LiveRoom from "../types/room/LiveRoom";
2
+ import FloatingLive from "..";
3
+ import Controller from ".";
4
+ /** 直播间监听实例控制器 */
5
+ declare class Room {
6
+ readonly controller: Controller;
7
+ readonly main: FloatingLive;
8
+ private roomMap;
9
+ constructor(controller: Controller);
10
+ generate(r: {
11
+ platform: string;
12
+ id: string | number;
13
+ }, open?: boolean): {
14
+ key: string;
15
+ room: LiveRoom;
16
+ } | undefined;
17
+ /** 添加房间监听对象 */
18
+ add(key: string, room: LiveRoom, open?: boolean): void;
19
+ /** 移除房间 */
20
+ remove(roomKey: string): void;
21
+ /** 获取房间 */
22
+ get(roomKey: string): LiveRoom | undefined;
23
+ /** 获取房间信息 */
24
+ getInfo(roomKey: string): import("../types/room/RoomInfo").default | undefined;
25
+ /** 更新房间信息 */
26
+ update(roomKey: string): void;
27
+ /** 获取roomKey列表 */
28
+ get keyList(): Array<string>;
29
+ open(roomKey: string): void;
30
+ close(roomKey: string): void;
31
+ }
32
+ export default Room;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const getRoomInfo_1 = __importDefault(require("../utils/getRoomInfo"));
7
+ /** 直播间监听实例控制器 */
8
+ class Room {
9
+ constructor(controller) {
10
+ this.roomMap = new Map();
11
+ this.controller = controller;
12
+ this.main = controller.main;
13
+ }
14
+ generate(r, open) {
15
+ let platform;
16
+ let id;
17
+ platform = r.platform.toLowerCase();
18
+ id = r.id;
19
+ let platformGenerator = this.main.helper.roomGenerator.get(platform);
20
+ if (platformGenerator) {
21
+ return platformGenerator(id, open);
22
+ }
23
+ else {
24
+ this.main.emit("room_unknown_platform", platform);
25
+ }
26
+ }
27
+ /** 添加房间监听对象 */
28
+ add(key, room, open) {
29
+ if (this.roomMap.has(key)) {
30
+ this.main.emit("room_exist", key);
31
+ return;
32
+ }
33
+ this.roomMap.set(key, room);
34
+ // 添加监听事件
35
+ // 直播消息
36
+ room.on("msg", (data) => {
37
+ this.controller.message.send(data);
38
+ });
39
+ // 直播消息源数据
40
+ room.on("origin", (data) => {
41
+ this.main.emit("live_origin", data);
42
+ });
43
+ // 连接到直播间
44
+ room.on("connect", () => {
45
+ this.main.emit("room_connect", key);
46
+ });
47
+ // 与直播间的连接已断开
48
+ room.on("disconnect", () => {
49
+ this.main.emit("room_disconnect", key);
50
+ });
51
+ // 获取房间信息
52
+ room.on("info", () => {
53
+ this.main.emit("room_info", key, (0, getRoomInfo_1.default)(room));
54
+ });
55
+ // 更新直播间信息
56
+ room.on("update", (data) => {
57
+ this.main.emit("room_update", key, data);
58
+ });
59
+ // 房间被打开
60
+ room.on("open", () => {
61
+ this.main.emit("room_open", key, (0, getRoomInfo_1.default)(room));
62
+ });
63
+ // 房间被关闭
64
+ room.on("close", () => {
65
+ this.main.emit("room_close", key, (0, getRoomInfo_1.default)(room));
66
+ });
67
+ if (open) {
68
+ room.open();
69
+ }
70
+ this.main.emit("room_add", { key: key, room: (0, getRoomInfo_1.default)(room) });
71
+ }
72
+ /** 移除房间 */
73
+ remove(roomKey) {
74
+ if (!this.roomMap.has(roomKey)) {
75
+ this.main.emit("room", { key: "room_unexist", value: { key: roomKey } });
76
+ return;
77
+ }
78
+ let room = this.roomMap.get(roomKey);
79
+ this.roomMap.delete(roomKey); // 从表中删除房间
80
+ room?.removeAllListeners(); // 移除房间监听实例
81
+ this.main.emit("room", { key: "room_remove", value: { key: roomKey } });
82
+ }
83
+ /** 获取房间 */
84
+ get(roomKey) {
85
+ return this.roomMap.get(roomKey);
86
+ }
87
+ /** 获取房间信息 */
88
+ getInfo(roomKey) {
89
+ let room = this.roomMap.get(roomKey);
90
+ return room ? (0, getRoomInfo_1.default)(room) : undefined;
91
+ }
92
+ /** 更新房间信息 */
93
+ update(roomKey) {
94
+ let room = this.roomMap.get(roomKey);
95
+ room && room.getInfo();
96
+ }
97
+ /** 获取roomKey列表 */
98
+ get keyList() {
99
+ return [...this.roomMap.keys()];
100
+ }
101
+ open(roomKey) {
102
+ let room = this.roomMap.get(roomKey);
103
+ room?.available && !room.opening && room.open();
104
+ }
105
+ close(roomKey) {
106
+ let room = this.roomMap.get(roomKey);
107
+ room?.opening && room.close();
108
+ }
109
+ }
110
+ exports.default = Room;
@@ -0,0 +1,39 @@
1
+ import FloatingLive from "..";
2
+ import LiveRoom from "../types/room/LiveRoom";
3
+ import Message from "./Message";
4
+ import Room from "./Room";
5
+ export default class Controller {
6
+ readonly main: FloatingLive;
7
+ /** room 控制模块 */
8
+ readonly room: Room;
9
+ /** message 控制模块 */
10
+ readonly message: Message;
11
+ /** 开始时间戳 */
12
+ timestamp: number;
13
+ /** 开始状态 */
14
+ started: boolean;
15
+ constructor(main: FloatingLive);
16
+ /** 开始 */
17
+ start(): void;
18
+ /** 结束 */
19
+ end(): void;
20
+ /** 添加房间 */
21
+ addRoom({ platform, id }: {
22
+ platform: string;
23
+ id: number;
24
+ }, open?: boolean): void;
25
+ /** 移除房间 */
26
+ removeRoom(roomKey: string): void;
27
+ /** 添加房间实例 */
28
+ addLiveRoom(key: string, room: LiveRoom): void;
29
+ /** 打开房间 */
30
+ openRoom(roomKey: string): void;
31
+ /** 关闭房间 */
32
+ closeRoom(roomKey: string): void;
33
+ /** 打开所有房间 */
34
+ openAllRooms(): void;
35
+ /** 关闭所有房间 */
36
+ closeAllRooms(): void;
37
+ /** 更新房间信息 */
38
+ updateRoomInfo(roomKey: string): void;
39
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Message_1 = __importDefault(require("./Message"));
7
+ const Room_1 = __importDefault(require("./Room"));
8
+ class Controller {
9
+ constructor(main) {
10
+ /** 开始时间戳 */
11
+ this.timestamp = 0;
12
+ /** 开始状态 */
13
+ this.started = false;
14
+ this.main = main;
15
+ this.room = new Room_1.default(this);
16
+ this.message = new Message_1.default(this);
17
+ this.main.on("room_open", () => {
18
+ this.start();
19
+ });
20
+ }
21
+ /** 开始 */
22
+ start() {
23
+ this.started = true;
24
+ this.timestamp = new Date().valueOf();
25
+ this.main.emit("start");
26
+ }
27
+ /** 结束 */
28
+ end() {
29
+ this.closeAllRooms();
30
+ this.started = false;
31
+ this.main.emit("end");
32
+ this.timestamp = 0;
33
+ }
34
+ /** 添加房间 */
35
+ addRoom({ platform, id }, open) {
36
+ let generated = this.room.generate({ platform, id }, open);
37
+ if (generated) {
38
+ this.room.add(generated.key, generated.room);
39
+ }
40
+ }
41
+ /** 移除房间 */
42
+ removeRoom(roomKey) {
43
+ this.room.remove(roomKey);
44
+ }
45
+ /** 添加房间实例 */
46
+ addLiveRoom(key, room) {
47
+ this.room.add(key, room);
48
+ }
49
+ /** 打开房间 */
50
+ openRoom(roomKey) {
51
+ this.room.open(roomKey);
52
+ }
53
+ /** 关闭房间 */
54
+ closeRoom(roomKey) {
55
+ this.room.open(roomKey);
56
+ }
57
+ /** 打开所有房间 */
58
+ openAllRooms() {
59
+ this.room.keyList.forEach((key) => {
60
+ this.room.open(key);
61
+ });
62
+ }
63
+ /** 关闭所有房间 */
64
+ closeAllRooms() {
65
+ this.room.keyList.forEach((key) => {
66
+ this.room.close(key);
67
+ });
68
+ }
69
+ /** 更新房间信息 */
70
+ updateRoomInfo(roomKey) {
71
+ this.room.update(roomKey);
72
+ }
73
+ }
74
+ exports.default = Controller;
package/src/index.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from "events";
3
+ import { Registerable } from "./lib/Registerable";
4
+ import LiveRoom from "./types/room/LiveRoom";
5
+ import { MessageType } from "./types/message/MessageData";
6
+ import Controller from "./controller";
7
+ declare class FloatingLive extends EventEmitter {
8
+ /** 控制器 */
9
+ controller: Controller;
10
+ /** 拓展插件 */
11
+ plugin: Map<string, {
12
+ [key: string]: any;
13
+ }>;
14
+ helper: {
15
+ /** 房间生成器 */
16
+ roomGenerator: Registerable<(id: string | number, open?: boolean) => {
17
+ key: string;
18
+ room: LiveRoom;
19
+ }>;
20
+ /** 消息处理 */
21
+ messageHandler: Registerable<(msg: MessageType) => void>;
22
+ };
23
+ constructor();
24
+ /** 添加插件 */
25
+ registerPlugin(name: string, pluginFunc: (main: FloatingLive) => any): any;
26
+ /** 根据名称获取插件操作对象 */
27
+ getPlugin(name: string): {
28
+ [key: string]: any;
29
+ } | undefined;
30
+ /** 移除插件 */
31
+ removePlugin(name: string): void;
32
+ }
33
+ export default FloatingLive;
package/src/index.js ADDED
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const events_1 = require("events");
7
+ const Registerable_1 = require("./lib/Registerable");
8
+ const controller_1 = __importDefault(require("./controller"));
9
+ class FloatingLive extends events_1.EventEmitter {
10
+ constructor() {
11
+ super();
12
+ /** 拓展插件 */
13
+ this.plugin = new Map();
14
+ this.helper = {
15
+ /** 房间生成器 */
16
+ roomGenerator: new Registerable_1.Registerable("roomGenerator"),
17
+ /** 消息处理 */
18
+ messageHandler: new Registerable_1.Registerable("messageHandler"),
19
+ };
20
+ this.controller = new controller_1.default(this);
21
+ }
22
+ /** 添加插件 */
23
+ registerPlugin(name, pluginFunc) {
24
+ Registerable_1.Registerable.currentPlugin = name;
25
+ let pluginObject = pluginFunc(this); // 获取插件操作对象
26
+ this.plugin.set(name, pluginObject);
27
+ this.emit("addPlugin", name);
28
+ console.log(`已添加插件: ${name}`);
29
+ Registerable_1.Registerable.currentPlugin = null;
30
+ return pluginObject;
31
+ }
32
+ /** 根据名称获取插件操作对象 */
33
+ getPlugin(name) {
34
+ return this.plugin.get(name);
35
+ }
36
+ /** 移除插件 */
37
+ removePlugin(name) {
38
+ if (!this.plugin.has(name)) {
39
+ this.emit("pluginUnexist", name);
40
+ return;
41
+ }
42
+ let pluginObject = this.plugin.get(name);
43
+ this.plugin.delete(name);
44
+ this.helper.roomGenerator.unregister(name);
45
+ this.helper.messageHandler.unregister(name);
46
+ pluginObject?.destory && pluginObject.destory();
47
+ this.emit("removePlugin", name);
48
+ }
49
+ }
50
+ exports.default = FloatingLive;
@@ -0,0 +1,27 @@
1
+ /** 插件可注册对象模块 */
2
+ export declare class Registerable<T> {
3
+ /** 当前安装插件 */
4
+ static currentPlugin: string | null;
5
+ /** 功能列表 */
6
+ private readonly list;
7
+ /** 插件与功能名称绑定表 */
8
+ private readonly pluginIdMap;
9
+ private readonly name;
10
+ constructor(name: string);
11
+ /** 注册一个对象 */
12
+ register(id: string, item: T): void;
13
+ /** 取消某一插件在该模块中的注册 */
14
+ unregister(pluginName: string): void;
15
+ /** 获取名称 */
16
+ getName(): string;
17
+ /** 根据id获取注册对象 */
18
+ get(id: string): T | undefined;
19
+ /** 获取注册对象列表 */
20
+ getList(): T[];
21
+ /** 获取注册id列表 */
22
+ getIdList(): string[];
23
+ }
24
+ /** 设置当前安装插件名称 */
25
+ export declare const setCurrentPluginName: (name?: string | null) => void;
26
+ /** 获取当前安装插件名称 */
27
+ export declare const getCurrentPluginName: () => string | null;