douyin-danma-listener 0.2.1 → 0.4.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.
package/README.md CHANGED
@@ -28,10 +28,12 @@ client.connect();
28
28
  配置项如下:
29
29
 
30
30
  - `autoStart` (boolean): 是否自动开始连接,默认为 `false`
31
- - `autoReconnect` (number): 自动重连次数,默认为 `3`
31
+ - `autoReconnect` (number): 自动重连次数,默认为 `10`
32
32
  - `heartbeatInterval` (number): 心跳包发送间隔,单位为毫秒,默认为 `10000`
33
33
  - `cookie` (string): 可选的 Cookie 字符串,某些直播间可能需要?
34
34
  - `timeoutInterval` (number): 没有数据返回但`ws`未被主动关闭时超时后重新连接,单位为秒,默认`100`
35
+ - `reconnectInterval`: 重连等待时间
36
+ - `host`:弹幕连接域名
35
37
 
36
38
  ## 事件
37
39
 
package/lib/index.js CHANGED
@@ -26,11 +26,14 @@ class DouYinDanmaClient extends TypedEmitter {
26
26
  autoStart;
27
27
  autoReconnect;
28
28
  reconnectAttempts;
29
+ reconnectInterval;
29
30
  cookie;
30
31
  timeoutInterval;
31
32
  lastMessageTime;
32
33
  timeoutTimer;
33
34
  isTimeoutCheckRunning = false;
35
+ isReconnecting = false;
36
+ host;
34
37
  constructor(roomId, options = {}) {
35
38
  super();
36
39
  this.roomId = roomId;
@@ -38,9 +41,11 @@ class DouYinDanmaClient extends TypedEmitter {
38
41
  this.autoStart = options.autoStart ?? false;
39
42
  this.autoReconnect = options.autoReconnect ?? 10;
40
43
  this.reconnectAttempts = 0;
44
+ this.reconnectInterval = options.reconnectInterval ?? 10000;
41
45
  this.cookie = options.cookie;
42
46
  this.timeoutInterval = options.timeoutInterval ?? 100000; // 默认100秒
43
47
  this.lastMessageTime = Date.now();
48
+ this.host = options.host ?? "webcast100-ws-web-hl.douyin.com";
44
49
  if (this.autoStart) {
45
50
  this.connect();
46
51
  }
@@ -59,6 +64,7 @@ class DouYinDanmaClient extends TypedEmitter {
59
64
  },
60
65
  });
61
66
  this.ws.on("open", () => {
67
+ this.reconnectAttempts = 0;
62
68
  this.emit("open");
63
69
  this.startHeartbeat();
64
70
  this.startTimeoutCheck();
@@ -140,12 +146,19 @@ class DouYinDanmaClient extends TypedEmitter {
140
146
  }
141
147
  }
142
148
  reconnect() {
149
+ if (this.isReconnecting) {
150
+ return;
151
+ }
143
152
  this.stopHeartbeat();
144
153
  this.stopTimeoutCheck();
145
154
  if (this.reconnectAttempts < this.autoReconnect) {
155
+ this.isReconnecting = true;
146
156
  this.reconnectAttempts++;
147
- this.connect();
148
- this.emit("reconnect", this.reconnectAttempts);
157
+ setTimeout(() => {
158
+ this.connect();
159
+ this.isReconnecting = false;
160
+ this.emit("reconnect", this.reconnectAttempts);
161
+ }, this.reconnectInterval);
149
162
  }
150
163
  }
151
164
  async handleMessage() { }
@@ -205,6 +218,14 @@ class DouYinDanmaClient extends TypedEmitter {
205
218
  this.emit("roomRank", message);
206
219
  this.emit("message", message);
207
220
  }
221
+ async handlePrivilegeScreenChatMessage(message) {
222
+ this.emit("privilegeScreenChat", message);
223
+ this.emit("message", message);
224
+ }
225
+ async handleScreenChatMessage(message) {
226
+ this.emit("screenChat", message);
227
+ this.emit("message", message);
228
+ }
208
229
  /**
209
230
  * 处理其他消息
210
231
  */
@@ -232,6 +253,10 @@ class DouYinDanmaClient extends TypedEmitter {
232
253
  const RoomStatsMessage = protobuf.douyin.RoomStatsMessage;
233
254
  // @ts-ignore
234
255
  const RoomRankMessage = protobuf.douyin.RoomRankMessage;
256
+ // @ts-ignore
257
+ const PrivilegeScreenChatMessage = protobuf.douyin.PrivilegeScreenChatMessage;
258
+ // @ts-ignore
259
+ const ScreenChatMessage = protobuf.douyin.ScreenChatMessage;
235
260
  const wssPackage = PushFrame.decode(data);
236
261
  // @ts-ignore
237
262
  const logId = wssPackage.logId;
@@ -298,6 +323,14 @@ class DouYinDanmaClient extends TypedEmitter {
298
323
  const message = RoomRankMessage.decode(msg.payload);
299
324
  this.handleRoomRankMessage(message.toJSON());
300
325
  }
326
+ else if (msg.method === "WebcastPrivilegeScreenChatMessage") {
327
+ const message = PrivilegeScreenChatMessage.decode(msg.payload);
328
+ this.handlePrivilegeScreenChatMessage(message.toJSON());
329
+ }
330
+ else if (msg.method === "WebcastScreenChatMessage") {
331
+ const message = ScreenChatMessage.decode(msg.payload);
332
+ this.handleScreenChatMessage(message.toJSON());
333
+ }
301
334
  else {
302
335
  // WebcastRanklistHourEntranceMessage,WebcastInRoomBannerMessage,WebcastRoomStreamAdaptationMessage
303
336
  }
@@ -315,7 +348,7 @@ class DouYinDanmaClient extends TypedEmitter {
315
348
  const userUniqueId = getUserUniqueId();
316
349
  // const userUniqueId = "7877922945687137703";
317
350
  const versionCode = 180800;
318
- const webcastSdkVersion = "1.0.14-beta.0";
351
+ const webcastSdkVersion = "1.0.15";
319
352
  const sigParams = {
320
353
  live_id: "1",
321
354
  aid: "6383",
@@ -350,7 +383,7 @@ class DouYinDanmaClient extends TypedEmitter {
350
383
  identity: "audience",
351
384
  signature: signature.toString(),
352
385
  };
353
- const wssUrl = `wss://webcast5-ws-web-lf.douyin.com/webcast/im/push/v2/?${new URLSearchParams(webcast5Params).toString()}`;
386
+ const wssUrl = `wss://${this.host}/webcast/im/push/v2/?${new URLSearchParams(webcast5Params).toString()}`;
354
387
  return buildRequestUrl(wssUrl);
355
388
  }
356
389
  }
package/lib/proto.js CHANGED
@@ -1332,6 +1332,543 @@ export const douyin = ($root.douyin = (() => {
1332
1332
  };
1333
1333
  return ChatMessage;
1334
1334
  })();
1335
+ douyin.PrivilegeScreenChatMessage = (function () {
1336
+ /**
1337
+ * Properties of a PrivilegeScreenChatMessage.
1338
+ * @memberof douyin
1339
+ * @interface IPrivilegeScreenChatMessage
1340
+ * @property {douyin.ICommon|null} [common] PrivilegeScreenChatMessage common
1341
+ * @property {douyin.IUser|null} [user] PrivilegeScreenChatMessage user
1342
+ * @property {string|null} [content] PrivilegeScreenChatMessage content
1343
+ */
1344
+ /**
1345
+ * Constructs a new PrivilegeScreenChatMessage.
1346
+ * @memberof douyin
1347
+ * @classdesc Represents a PrivilegeScreenChatMessage.
1348
+ * @implements IPrivilegeScreenChatMessage
1349
+ * @constructor
1350
+ * @param {douyin.IPrivilegeScreenChatMessage=} [properties] Properties to set
1351
+ */
1352
+ function PrivilegeScreenChatMessage(properties) {
1353
+ if (properties)
1354
+ for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)
1355
+ if (properties[keys[i]] != null)
1356
+ this[keys[i]] = properties[keys[i]];
1357
+ }
1358
+ /**
1359
+ * PrivilegeScreenChatMessage common.
1360
+ * @member {douyin.ICommon|null|undefined} common
1361
+ * @memberof douyin.PrivilegeScreenChatMessage
1362
+ * @instance
1363
+ */
1364
+ PrivilegeScreenChatMessage.prototype.common = null;
1365
+ /**
1366
+ * PrivilegeScreenChatMessage user.
1367
+ * @member {douyin.IUser|null|undefined} user
1368
+ * @memberof douyin.PrivilegeScreenChatMessage
1369
+ * @instance
1370
+ */
1371
+ PrivilegeScreenChatMessage.prototype.user = null;
1372
+ /**
1373
+ * PrivilegeScreenChatMessage content.
1374
+ * @member {string} content
1375
+ * @memberof douyin.PrivilegeScreenChatMessage
1376
+ * @instance
1377
+ */
1378
+ PrivilegeScreenChatMessage.prototype.content = "";
1379
+ /**
1380
+ * Creates a new PrivilegeScreenChatMessage instance using the specified properties.
1381
+ * @function create
1382
+ * @memberof douyin.PrivilegeScreenChatMessage
1383
+ * @static
1384
+ * @param {douyin.IPrivilegeScreenChatMessage=} [properties] Properties to set
1385
+ * @returns {douyin.PrivilegeScreenChatMessage} PrivilegeScreenChatMessage instance
1386
+ */
1387
+ PrivilegeScreenChatMessage.create = function create(properties) {
1388
+ return new PrivilegeScreenChatMessage(properties);
1389
+ };
1390
+ /**
1391
+ * Encodes the specified PrivilegeScreenChatMessage message. Does not implicitly {@link douyin.PrivilegeScreenChatMessage.verify|verify} messages.
1392
+ * @function encode
1393
+ * @memberof douyin.PrivilegeScreenChatMessage
1394
+ * @static
1395
+ * @param {douyin.IPrivilegeScreenChatMessage} message PrivilegeScreenChatMessage message or plain object to encode
1396
+ * @param {$protobuf.Writer} [writer] Writer to encode to
1397
+ * @returns {$protobuf.Writer} Writer
1398
+ */
1399
+ PrivilegeScreenChatMessage.encode = function encode(message, writer) {
1400
+ if (!writer)
1401
+ writer = $Writer.create();
1402
+ if (message.common != null && Object.hasOwnProperty.call(message, "common"))
1403
+ $root.douyin.Common.encode(message.common, writer.uint32(/* id 1, wireType 2 =*/ 10).fork()).ldelim();
1404
+ if (message.user != null && Object.hasOwnProperty.call(message, "user"))
1405
+ $root.douyin.User.encode(message.user, writer.uint32(/* id 2, wireType 2 =*/ 18).fork()).ldelim();
1406
+ if (message.content != null && Object.hasOwnProperty.call(message, "content"))
1407
+ writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.content);
1408
+ return writer;
1409
+ };
1410
+ /**
1411
+ * Encodes the specified PrivilegeScreenChatMessage message, length delimited. Does not implicitly {@link douyin.PrivilegeScreenChatMessage.verify|verify} messages.
1412
+ * @function encodeDelimited
1413
+ * @memberof douyin.PrivilegeScreenChatMessage
1414
+ * @static
1415
+ * @param {douyin.IPrivilegeScreenChatMessage} message PrivilegeScreenChatMessage message or plain object to encode
1416
+ * @param {$protobuf.Writer} [writer] Writer to encode to
1417
+ * @returns {$protobuf.Writer} Writer
1418
+ */
1419
+ PrivilegeScreenChatMessage.encodeDelimited = function encodeDelimited(message, writer) {
1420
+ return this.encode(message, writer).ldelim();
1421
+ };
1422
+ /**
1423
+ * Decodes a PrivilegeScreenChatMessage message from the specified reader or buffer.
1424
+ * @function decode
1425
+ * @memberof douyin.PrivilegeScreenChatMessage
1426
+ * @static
1427
+ * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
1428
+ * @param {number} [length] Message length if known beforehand
1429
+ * @returns {douyin.PrivilegeScreenChatMessage} PrivilegeScreenChatMessage
1430
+ * @throws {Error} If the payload is not a reader or valid buffer
1431
+ * @throws {$protobuf.util.ProtocolError} If required fields are missing
1432
+ */
1433
+ PrivilegeScreenChatMessage.decode = function decode(reader, length) {
1434
+ if (!(reader instanceof $Reader))
1435
+ reader = $Reader.create(reader);
1436
+ let end = length === undefined ? reader.len : reader.pos + length, message = new $root.douyin.PrivilegeScreenChatMessage();
1437
+ while (reader.pos < end) {
1438
+ let tag = reader.uint32();
1439
+ switch (tag >>> 3) {
1440
+ case 1: {
1441
+ message.common = $root.douyin.Common.decode(reader, reader.uint32());
1442
+ break;
1443
+ }
1444
+ case 2: {
1445
+ message.user = $root.douyin.User.decode(reader, reader.uint32());
1446
+ break;
1447
+ }
1448
+ case 3: {
1449
+ message.content = reader.string();
1450
+ break;
1451
+ }
1452
+ default:
1453
+ reader.skipType(tag & 7);
1454
+ break;
1455
+ }
1456
+ }
1457
+ return message;
1458
+ };
1459
+ /**
1460
+ * Decodes a PrivilegeScreenChatMessage message from the specified reader or buffer, length delimited.
1461
+ * @function decodeDelimited
1462
+ * @memberof douyin.PrivilegeScreenChatMessage
1463
+ * @static
1464
+ * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
1465
+ * @returns {douyin.PrivilegeScreenChatMessage} PrivilegeScreenChatMessage
1466
+ * @throws {Error} If the payload is not a reader or valid buffer
1467
+ * @throws {$protobuf.util.ProtocolError} If required fields are missing
1468
+ */
1469
+ PrivilegeScreenChatMessage.decodeDelimited = function decodeDelimited(reader) {
1470
+ if (!(reader instanceof $Reader))
1471
+ reader = new $Reader(reader);
1472
+ return this.decode(reader, reader.uint32());
1473
+ };
1474
+ /**
1475
+ * Verifies a PrivilegeScreenChatMessage message.
1476
+ * @function verify
1477
+ * @memberof douyin.PrivilegeScreenChatMessage
1478
+ * @static
1479
+ * @param {Object.<string,*>} message Plain object to verify
1480
+ * @returns {string|null} `null` if valid, otherwise the reason why it is not
1481
+ */
1482
+ PrivilegeScreenChatMessage.verify = function verify(message) {
1483
+ if (typeof message !== "object" || message === null)
1484
+ return "object expected";
1485
+ if (message.common != null && message.hasOwnProperty("common")) {
1486
+ let error = $root.douyin.Common.verify(message.common);
1487
+ if (error)
1488
+ return "common." + error;
1489
+ }
1490
+ if (message.user != null && message.hasOwnProperty("user")) {
1491
+ let error = $root.douyin.User.verify(message.user);
1492
+ if (error)
1493
+ return "user." + error;
1494
+ }
1495
+ if (message.content != null && message.hasOwnProperty("content"))
1496
+ if (!$util.isString(message.content))
1497
+ return "content: string expected";
1498
+ return null;
1499
+ };
1500
+ /**
1501
+ * Creates a PrivilegeScreenChatMessage message from a plain object. Also converts values to their respective internal types.
1502
+ * @function fromObject
1503
+ * @memberof douyin.PrivilegeScreenChatMessage
1504
+ * @static
1505
+ * @param {Object.<string,*>} object Plain object
1506
+ * @returns {douyin.PrivilegeScreenChatMessage} PrivilegeScreenChatMessage
1507
+ */
1508
+ PrivilegeScreenChatMessage.fromObject = function fromObject(object) {
1509
+ if (object instanceof $root.douyin.PrivilegeScreenChatMessage)
1510
+ return object;
1511
+ let message = new $root.douyin.PrivilegeScreenChatMessage();
1512
+ if (object.common != null) {
1513
+ if (typeof object.common !== "object")
1514
+ throw TypeError(".douyin.PrivilegeScreenChatMessage.common: object expected");
1515
+ message.common = $root.douyin.Common.fromObject(object.common);
1516
+ }
1517
+ if (object.user != null) {
1518
+ if (typeof object.user !== "object")
1519
+ throw TypeError(".douyin.PrivilegeScreenChatMessage.user: object expected");
1520
+ message.user = $root.douyin.User.fromObject(object.user);
1521
+ }
1522
+ if (object.content != null)
1523
+ message.content = String(object.content);
1524
+ return message;
1525
+ };
1526
+ /**
1527
+ * Creates a plain object from a PrivilegeScreenChatMessage message. Also converts values to other types if specified.
1528
+ * @function toObject
1529
+ * @memberof douyin.PrivilegeScreenChatMessage
1530
+ * @static
1531
+ * @param {douyin.PrivilegeScreenChatMessage} message PrivilegeScreenChatMessage
1532
+ * @param {$protobuf.IConversionOptions} [options] Conversion options
1533
+ * @returns {Object.<string,*>} Plain object
1534
+ */
1535
+ PrivilegeScreenChatMessage.toObject = function toObject(message, options) {
1536
+ if (!options)
1537
+ options = {};
1538
+ let object = {};
1539
+ if (options.defaults) {
1540
+ object.common = null;
1541
+ object.user = null;
1542
+ object.content = "";
1543
+ }
1544
+ if (message.common != null && message.hasOwnProperty("common"))
1545
+ object.common = $root.douyin.Common.toObject(message.common, options);
1546
+ if (message.user != null && message.hasOwnProperty("user"))
1547
+ object.user = $root.douyin.User.toObject(message.user, options);
1548
+ if (message.content != null && message.hasOwnProperty("content"))
1549
+ object.content = message.content;
1550
+ return object;
1551
+ };
1552
+ /**
1553
+ * Converts this PrivilegeScreenChatMessage to JSON.
1554
+ * @function toJSON
1555
+ * @memberof douyin.PrivilegeScreenChatMessage
1556
+ * @instance
1557
+ * @returns {Object.<string,*>} JSON object
1558
+ */
1559
+ PrivilegeScreenChatMessage.prototype.toJSON = function toJSON() {
1560
+ return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
1561
+ };
1562
+ /**
1563
+ * Gets the default type url for PrivilegeScreenChatMessage
1564
+ * @function getTypeUrl
1565
+ * @memberof douyin.PrivilegeScreenChatMessage
1566
+ * @static
1567
+ * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
1568
+ * @returns {string} The default type url
1569
+ */
1570
+ PrivilegeScreenChatMessage.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
1571
+ if (typeUrlPrefix === undefined) {
1572
+ typeUrlPrefix = "type.googleapis.com";
1573
+ }
1574
+ return typeUrlPrefix + "/douyin.PrivilegeScreenChatMessage";
1575
+ };
1576
+ return PrivilegeScreenChatMessage;
1577
+ })();
1578
+ douyin.ScreenChatMessage = (function () {
1579
+ /**
1580
+ * Properties of a ScreenChatMessage.
1581
+ * @memberof douyin
1582
+ * @interface IScreenChatMessage
1583
+ * @property {douyin.ICommon|null} [common] ScreenChatMessage common
1584
+ * @property {douyin.IUser|null} [user] ScreenChatMessage user
1585
+ * @property {string|null} [content] ScreenChatMessage content
1586
+ * @property {number|Long|null} [eventTime] ScreenChatMessage eventTime
1587
+ */
1588
+ /**
1589
+ * Constructs a new ScreenChatMessage.
1590
+ * @memberof douyin
1591
+ * @classdesc Represents a ScreenChatMessage.
1592
+ * @implements IScreenChatMessage
1593
+ * @constructor
1594
+ * @param {douyin.IScreenChatMessage=} [properties] Properties to set
1595
+ */
1596
+ function ScreenChatMessage(properties) {
1597
+ if (properties)
1598
+ for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)
1599
+ if (properties[keys[i]] != null)
1600
+ this[keys[i]] = properties[keys[i]];
1601
+ }
1602
+ /**
1603
+ * ScreenChatMessage common.
1604
+ * @member {douyin.ICommon|null|undefined} common
1605
+ * @memberof douyin.ScreenChatMessage
1606
+ * @instance
1607
+ */
1608
+ ScreenChatMessage.prototype.common = null;
1609
+ /**
1610
+ * ScreenChatMessage user.
1611
+ * @member {douyin.IUser|null|undefined} user
1612
+ * @memberof douyin.ScreenChatMessage
1613
+ * @instance
1614
+ */
1615
+ ScreenChatMessage.prototype.user = null;
1616
+ /**
1617
+ * ScreenChatMessage content.
1618
+ * @member {string} content
1619
+ * @memberof douyin.ScreenChatMessage
1620
+ * @instance
1621
+ */
1622
+ ScreenChatMessage.prototype.content = "";
1623
+ /**
1624
+ * ScreenChatMessage eventTime.
1625
+ * @member {number|Long} eventTime
1626
+ * @memberof douyin.ScreenChatMessage
1627
+ * @instance
1628
+ */
1629
+ ScreenChatMessage.prototype.eventTime = $util.Long ? $util.Long.fromBits(0, 0, true) : 0;
1630
+ /**
1631
+ * Creates a new ScreenChatMessage instance using the specified properties.
1632
+ * @function create
1633
+ * @memberof douyin.ScreenChatMessage
1634
+ * @static
1635
+ * @param {douyin.IScreenChatMessage=} [properties] Properties to set
1636
+ * @returns {douyin.ScreenChatMessage} ScreenChatMessage instance
1637
+ */
1638
+ ScreenChatMessage.create = function create(properties) {
1639
+ return new ScreenChatMessage(properties);
1640
+ };
1641
+ /**
1642
+ * Encodes the specified ScreenChatMessage message. Does not implicitly {@link douyin.ScreenChatMessage.verify|verify} messages.
1643
+ * @function encode
1644
+ * @memberof douyin.ScreenChatMessage
1645
+ * @static
1646
+ * @param {douyin.IScreenChatMessage} message ScreenChatMessage message or plain object to encode
1647
+ * @param {$protobuf.Writer} [writer] Writer to encode to
1648
+ * @returns {$protobuf.Writer} Writer
1649
+ */
1650
+ ScreenChatMessage.encode = function encode(message, writer) {
1651
+ if (!writer)
1652
+ writer = $Writer.create();
1653
+ if (message.common != null && Object.hasOwnProperty.call(message, "common"))
1654
+ $root.douyin.Common.encode(message.common, writer.uint32(/* id 1, wireType 2 =*/ 10).fork()).ldelim();
1655
+ if (message.user != null && Object.hasOwnProperty.call(message, "user"))
1656
+ $root.douyin.User.encode(message.user, writer.uint32(/* id 2, wireType 2 =*/ 18).fork()).ldelim();
1657
+ if (message.content != null && Object.hasOwnProperty.call(message, "content"))
1658
+ writer.uint32(/* id 4, wireType 2 =*/ 34).string(message.content);
1659
+ if (message.eventTime != null && Object.hasOwnProperty.call(message, "eventTime"))
1660
+ writer.uint32(/* id 12, wireType 0 =*/ 96).uint64(message.eventTime);
1661
+ return writer;
1662
+ };
1663
+ /**
1664
+ * Encodes the specified ScreenChatMessage message, length delimited. Does not implicitly {@link douyin.ScreenChatMessage.verify|verify} messages.
1665
+ * @function encodeDelimited
1666
+ * @memberof douyin.ScreenChatMessage
1667
+ * @static
1668
+ * @param {douyin.IScreenChatMessage} message ScreenChatMessage message or plain object to encode
1669
+ * @param {$protobuf.Writer} [writer] Writer to encode to
1670
+ * @returns {$protobuf.Writer} Writer
1671
+ */
1672
+ ScreenChatMessage.encodeDelimited = function encodeDelimited(message, writer) {
1673
+ return this.encode(message, writer).ldelim();
1674
+ };
1675
+ /**
1676
+ * Decodes a ScreenChatMessage message from the specified reader or buffer.
1677
+ * @function decode
1678
+ * @memberof douyin.ScreenChatMessage
1679
+ * @static
1680
+ * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
1681
+ * @param {number} [length] Message length if known beforehand
1682
+ * @returns {douyin.ScreenChatMessage} ScreenChatMessage
1683
+ * @throws {Error} If the payload is not a reader or valid buffer
1684
+ * @throws {$protobuf.util.ProtocolError} If required fields are missing
1685
+ */
1686
+ ScreenChatMessage.decode = function decode(reader, length) {
1687
+ if (!(reader instanceof $Reader))
1688
+ reader = $Reader.create(reader);
1689
+ let end = length === undefined ? reader.len : reader.pos + length, message = new $root.douyin.ScreenChatMessage();
1690
+ while (reader.pos < end) {
1691
+ let tag = reader.uint32();
1692
+ switch (tag >>> 3) {
1693
+ case 1: {
1694
+ message.common = $root.douyin.Common.decode(reader, reader.uint32());
1695
+ break;
1696
+ }
1697
+ case 2: {
1698
+ message.user = $root.douyin.User.decode(reader, reader.uint32());
1699
+ break;
1700
+ }
1701
+ case 4: {
1702
+ message.content = reader.string();
1703
+ break;
1704
+ }
1705
+ case 12: {
1706
+ message.eventTime = reader.uint64();
1707
+ break;
1708
+ }
1709
+ default:
1710
+ reader.skipType(tag & 7);
1711
+ break;
1712
+ }
1713
+ }
1714
+ return message;
1715
+ };
1716
+ /**
1717
+ * Decodes a ScreenChatMessage message from the specified reader or buffer, length delimited.
1718
+ * @function decodeDelimited
1719
+ * @memberof douyin.ScreenChatMessage
1720
+ * @static
1721
+ * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
1722
+ * @returns {douyin.ScreenChatMessage} ScreenChatMessage
1723
+ * @throws {Error} If the payload is not a reader or valid buffer
1724
+ * @throws {$protobuf.util.ProtocolError} If required fields are missing
1725
+ */
1726
+ ScreenChatMessage.decodeDelimited = function decodeDelimited(reader) {
1727
+ if (!(reader instanceof $Reader))
1728
+ reader = new $Reader(reader);
1729
+ return this.decode(reader, reader.uint32());
1730
+ };
1731
+ /**
1732
+ * Verifies a ScreenChatMessage message.
1733
+ * @function verify
1734
+ * @memberof douyin.ScreenChatMessage
1735
+ * @static
1736
+ * @param {Object.<string,*>} message Plain object to verify
1737
+ * @returns {string|null} `null` if valid, otherwise the reason why it is not
1738
+ */
1739
+ ScreenChatMessage.verify = function verify(message) {
1740
+ if (typeof message !== "object" || message === null)
1741
+ return "object expected";
1742
+ if (message.common != null && message.hasOwnProperty("common")) {
1743
+ let error = $root.douyin.Common.verify(message.common);
1744
+ if (error)
1745
+ return "common." + error;
1746
+ }
1747
+ if (message.user != null && message.hasOwnProperty("user")) {
1748
+ let error = $root.douyin.User.verify(message.user);
1749
+ if (error)
1750
+ return "user." + error;
1751
+ }
1752
+ if (message.content != null && message.hasOwnProperty("content"))
1753
+ if (!$util.isString(message.content))
1754
+ return "content: string expected";
1755
+ if (message.eventTime != null && message.hasOwnProperty("eventTime"))
1756
+ if (!$util.isInteger(message.eventTime) &&
1757
+ !(message.eventTime &&
1758
+ $util.isInteger(message.eventTime.low) &&
1759
+ $util.isInteger(message.eventTime.high)))
1760
+ return "eventTime: integer|Long expected";
1761
+ return null;
1762
+ };
1763
+ /**
1764
+ * Creates a ScreenChatMessage message from a plain object. Also converts values to their respective internal types.
1765
+ * @function fromObject
1766
+ * @memberof douyin.ScreenChatMessage
1767
+ * @static
1768
+ * @param {Object.<string,*>} object Plain object
1769
+ * @returns {douyin.ScreenChatMessage} ScreenChatMessage
1770
+ */
1771
+ ScreenChatMessage.fromObject = function fromObject(object) {
1772
+ if (object instanceof $root.douyin.ScreenChatMessage)
1773
+ return object;
1774
+ let message = new $root.douyin.ScreenChatMessage();
1775
+ if (object.common != null) {
1776
+ if (typeof object.common !== "object")
1777
+ throw TypeError(".douyin.ScreenChatMessage.common: object expected");
1778
+ message.common = $root.douyin.Common.fromObject(object.common);
1779
+ }
1780
+ if (object.user != null) {
1781
+ if (typeof object.user !== "object")
1782
+ throw TypeError(".douyin.ScreenChatMessage.user: object expected");
1783
+ message.user = $root.douyin.User.fromObject(object.user);
1784
+ }
1785
+ if (object.content != null)
1786
+ message.content = String(object.content);
1787
+ if (object.eventTime != null)
1788
+ if ($util.Long)
1789
+ (message.eventTime = $util.Long.fromValue(object.eventTime)).unsigned = true;
1790
+ else if (typeof object.eventTime === "string")
1791
+ message.eventTime = parseInt(object.eventTime, 10);
1792
+ else if (typeof object.eventTime === "number")
1793
+ message.eventTime = object.eventTime;
1794
+ else if (typeof object.eventTime === "object")
1795
+ message.eventTime = new $util.LongBits(object.eventTime.low >>> 0, object.eventTime.high >>> 0).toNumber(true);
1796
+ return message;
1797
+ };
1798
+ /**
1799
+ * Creates a plain object from a ScreenChatMessage message. Also converts values to other types if specified.
1800
+ * @function toObject
1801
+ * @memberof douyin.ScreenChatMessage
1802
+ * @static
1803
+ * @param {douyin.ScreenChatMessage} message ScreenChatMessage
1804
+ * @param {$protobuf.IConversionOptions} [options] Conversion options
1805
+ * @returns {Object.<string,*>} Plain object
1806
+ */
1807
+ ScreenChatMessage.toObject = function toObject(message, options) {
1808
+ if (!options)
1809
+ options = {};
1810
+ let object = {};
1811
+ if (options.defaults) {
1812
+ object.common = null;
1813
+ object.user = null;
1814
+ object.content = "";
1815
+ if ($util.Long) {
1816
+ let long = new $util.Long(0, 0, true);
1817
+ object.eventTime =
1818
+ options.longs === String
1819
+ ? long.toString()
1820
+ : options.longs === Number
1821
+ ? long.toNumber()
1822
+ : long;
1823
+ }
1824
+ else
1825
+ object.eventTime = options.longs === String ? "0" : 0;
1826
+ }
1827
+ if (message.common != null && message.hasOwnProperty("common"))
1828
+ object.common = $root.douyin.Common.toObject(message.common, options);
1829
+ if (message.user != null && message.hasOwnProperty("user"))
1830
+ object.user = $root.douyin.User.toObject(message.user, options);
1831
+ if (message.content != null && message.hasOwnProperty("content"))
1832
+ object.content = message.content;
1833
+ if (message.eventTime != null && message.hasOwnProperty("eventTime"))
1834
+ if (typeof message.eventTime === "number")
1835
+ object.eventTime =
1836
+ options.longs === String ? String(message.eventTime) : message.eventTime;
1837
+ else
1838
+ object.eventTime =
1839
+ options.longs === String
1840
+ ? $util.Long.prototype.toString.call(message.eventTime)
1841
+ : options.longs === Number
1842
+ ? new $util.LongBits(message.eventTime.low >>> 0, message.eventTime.high >>> 0).toNumber(true)
1843
+ : message.eventTime;
1844
+ return object;
1845
+ };
1846
+ /**
1847
+ * Converts this ScreenChatMessage to JSON.
1848
+ * @function toJSON
1849
+ * @memberof douyin.ScreenChatMessage
1850
+ * @instance
1851
+ * @returns {Object.<string,*>} JSON object
1852
+ */
1853
+ ScreenChatMessage.prototype.toJSON = function toJSON() {
1854
+ return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
1855
+ };
1856
+ /**
1857
+ * Gets the default type url for ScreenChatMessage
1858
+ * @function getTypeUrl
1859
+ * @memberof douyin.ScreenChatMessage
1860
+ * @static
1861
+ * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
1862
+ * @returns {string} The default type url
1863
+ */
1864
+ ScreenChatMessage.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
1865
+ if (typeUrlPrefix === undefined) {
1866
+ typeUrlPrefix = "type.googleapis.com";
1867
+ }
1868
+ return typeUrlPrefix + "/douyin.ScreenChatMessage";
1869
+ };
1870
+ return ScreenChatMessage;
1871
+ })();
1335
1872
  douyin.LandscapeAreaCommon = (function () {
1336
1873
  /**
1337
1874
  * Properties of a LandscapeAreaCommon.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "douyin-danma-listener",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "douyin danma listener",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./types/index.d.ts",
package/types/index.d.ts CHANGED
@@ -9,6 +9,8 @@ import type {
9
9
  RoomStatsMessage,
10
10
  RoomRankMessage,
11
11
  Message,
12
+ PrivilegeScreenChatMessage,
13
+ ScreenChatMessage,
12
14
  } from "../types/types.js";
13
15
  import WebSocket from "ws";
14
16
 
@@ -27,6 +29,8 @@ interface Events {
27
29
  roomStats: (message: RoomStatsMessage) => void;
28
30
  roomRank: (message: RoomRankMessage) => void;
29
31
  message: (message: Message) => void;
32
+ privilegeScreenChat: (message: PrivilegeScreenChatMessage) => void;
33
+ screenChat: (message: ScreenChatMessage) => void;
30
34
  }
31
35
  declare class DouYinDanmaClient extends TypedEmitter<Events> {
32
36
  private ws: WebSocket;
package/types/types.d.ts CHANGED
@@ -150,7 +150,9 @@ export interface SocialMessage {
150
150
  export interface GiftMessage {
151
151
  common: Common & { method: "WebcastGiftMessage" };
152
152
  user: User;
153
+ // 这个参数其实差不多是秒级时间戳,并不可靠
153
154
  groupId: string;
155
+ giftId: number;
154
156
  gift: Gift;
155
157
  publicAreaCommon: PublicAreaCommon;
156
158
  trayDisplayText: TrayDisplayText;
@@ -190,6 +192,19 @@ export interface RoomRankMessage {
190
192
  }[];
191
193
  }
192
194
 
195
+ export interface PrivilegeScreenChatMessage {
196
+ common: Common & { method: "WebcastPrivilegeScreenChatMessage" };
197
+ user: User;
198
+ content: string;
199
+ }
200
+
201
+ export interface ScreenChatMessage {
202
+ common: Common & { method: "WebcastScreenChatMessage" };
203
+ user: User;
204
+ content: string;
205
+ eventTime: string;
206
+ }
207
+
193
208
  export type Message =
194
209
  | ChatMessage
195
210
  | MemberMessage
@@ -198,4 +213,6 @@ export type Message =
198
213
  | GiftMessage
199
214
  | RoomUserSeqMessage
200
215
  | RoomStatsMessage
201
- | RoomRankMessage;
216
+ | RoomRankMessage
217
+ | PrivilegeScreenChatMessage
218
+ | ScreenChatMessage;