tiktok-live-connector
Advanced tools
Comparing version 0.9.20 to 0.9.21
@@ -62,3 +62,5 @@ "use strict"; | ||
LINKMICARMIES: 'linkMicArmies', | ||
LIVEINTRO: 'liveIntro' | ||
LIVEINTRO: 'liveIntro', | ||
EMOTE: 'emote', | ||
ENVELOPE: 'envelope' | ||
}; | ||
@@ -615,2 +617,10 @@ /** | ||
break; | ||
case 'WebcastEmoteChatMessage': | ||
this.emit(MessageEvents.EMOTE, simplifiedObj); | ||
break; | ||
case 'WebcastEnvelopeMessage': | ||
this.emit(MessageEvents.ENVELOPE, simplifiedObj); | ||
break; | ||
} | ||
@@ -617,0 +627,0 @@ }); |
@@ -97,2 +97,24 @@ "use strict"; | ||
if (webcastObject.emote) { | ||
var _webcastObject$emote, _webcastObject$emote2, _webcastObject$emote3; | ||
webcastObject.emoteId = (_webcastObject$emote = webcastObject.emote) === null || _webcastObject$emote === void 0 ? void 0 : _webcastObject$emote.emoteId; | ||
webcastObject.emoteImageUrl = (_webcastObject$emote2 = webcastObject.emote) === null || _webcastObject$emote2 === void 0 ? void 0 : (_webcastObject$emote3 = _webcastObject$emote2.image) === null || _webcastObject$emote3 === void 0 ? void 0 : _webcastObject$emote3.imageUrl; | ||
delete webcastObject.emote; | ||
} | ||
if (webcastObject.treasureBoxUser) { | ||
var _webcastObject$treasu, _webcastObject$treasu2, _webcastObject$treasu3, _webcastObject$treasu4; | ||
// holy crap | ||
Object.assign(webcastObject, getUserAttributes(((_webcastObject$treasu = webcastObject.treasureBoxUser) === null || _webcastObject$treasu === void 0 ? void 0 : (_webcastObject$treasu2 = _webcastObject$treasu.user2) === null || _webcastObject$treasu2 === void 0 ? void 0 : (_webcastObject$treasu3 = _webcastObject$treasu2.user3[0]) === null || _webcastObject$treasu3 === void 0 ? void 0 : (_webcastObject$treasu4 = _webcastObject$treasu3.user4) === null || _webcastObject$treasu4 === void 0 ? void 0 : _webcastObject$treasu4.user) || {})); | ||
delete webcastObject.treasureBoxUser; | ||
} | ||
if (webcastObject.treasureBoxData) { | ||
Object.assign(webcastObject, webcastObject.treasureBoxData); | ||
delete webcastObject.treasureBoxData; | ||
webcastObject.timestamp = parseInt(webcastObject.timestamp); | ||
} | ||
return Object.assign({}, webcastObject); | ||
@@ -102,6 +124,6 @@ } | ||
function getUserAttributes(webcastUser) { | ||
var _webcastUser$profileP, _webcastUser$extraAtt; | ||
var _webcastUser$userId, _webcastUser$profileP, _webcastUser$extraAtt, _userAttributes$userB, _userAttributes$userB2, _userAttributes$userB3; | ||
return { | ||
userId: webcastUser.userId.toString(), | ||
let userAttributes = { | ||
userId: (_webcastUser$userId = webcastUser.userId) === null || _webcastUser$userId === void 0 ? void 0 : _webcastUser$userId.toString(), | ||
uniqueId: webcastUser.uniqueId !== '' ? webcastUser.uniqueId : undefined, | ||
@@ -111,13 +133,37 @@ nickname: webcastUser.nickname !== '' ? webcastUser.nickname : undefined, | ||
followRole: (_webcastUser$extraAtt = webcastUser.extraAttributes) === null || _webcastUser$extraAtt === void 0 ? void 0 : _webcastUser$extraAtt.followRole, | ||
userBadges: mapBadges(webcastUser.badge) | ||
userBadges: mapBadges(webcastUser.badges) | ||
}; | ||
userAttributes.isModerator = userAttributes.userBadges.some(x => x.type && x.type.toLowerCase().includes('moderator')); | ||
userAttributes.isNewGifter = userAttributes.userBadges.some(x => x.type && x.type.toLowerCase().includes('live_ng_')); | ||
userAttributes.isSubscriber = userAttributes.userBadges.some(x => x.url && x.url.toLowerCase().includes('/sub_')); | ||
userAttributes.topGifterRank = (_userAttributes$userB = (_userAttributes$userB2 = userAttributes.userBadges.find(x => x.url && x.url.includes('/ranklist_top_gifter_'))) === null || _userAttributes$userB2 === void 0 ? void 0 : (_userAttributes$userB3 = _userAttributes$userB2.url.match(/(?<=ranklist_top_gifter_)(\d+)(?=.png)/g)) === null || _userAttributes$userB3 === void 0 ? void 0 : _userAttributes$userB3.map(Number)[0]) !== null && _userAttributes$userB !== void 0 ? _userAttributes$userB : null; | ||
return userAttributes; | ||
} | ||
function mapBadges(badge) { | ||
if (!badge || !Array.isArray(badge.badges)) return []; | ||
let badges = []; | ||
badge.badges.forEach(badge => { | ||
badges.push(Object.assign({}, badge)); | ||
}); | ||
return badges; | ||
function mapBadges(badges) { | ||
let simplifiedBadges = []; | ||
if (Array.isArray(badges)) { | ||
badges.forEach(innerBadges => { | ||
if (Array.isArray(innerBadges.badges)) { | ||
innerBadges.badges.forEach(badge => { | ||
simplifiedBadges.push(Object.assign({}, badge)); | ||
}); | ||
} | ||
if (Array.isArray(innerBadges.imageBadges)) { | ||
innerBadges.imageBadges.forEach(badge => { | ||
if (badge && badge.image && badge.image.url) { | ||
simplifiedBadges.push({ | ||
type: 'image', | ||
displayType: badge.displayType, | ||
url: badge.image.url | ||
}); | ||
} | ||
}); | ||
} | ||
}); | ||
} | ||
return simplifiedBadges; | ||
} | ||
@@ -124,0 +170,0 @@ |
@@ -39,2 +39,4 @@ "use strict"; | ||
case 'WebcastLiveIntroMessage': | ||
case 'WebcastEmoteChatMessage': | ||
case 'WebcastEnvelopeMessage': | ||
message.decodedData = tiktokSchema.lookupType(`TikTok.${message.type}`).decode(message.binary); | ||
@@ -41,0 +43,0 @@ break; |
{ | ||
"name": "tiktok-live-connector", | ||
"version": "0.9.20", | ||
"version": "0.9.21", | ||
"description": "Node.js module to receive live stream chat events like comments and gifts from TikTok LIVE", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -129,2 +129,4 @@ # TikTok-Live-Connector | ||
- [`social`](#social) | ||
- [`emote`](#emote) | ||
- [`envelope`](#envelope) | ||
- [`questionNew`](#questionnew) | ||
@@ -213,3 +215,7 @@ - [`linkMicBattle`](#linkmicbattle) | ||
followRole: 1, // 0 = none; 1 = follower; 2 = friends | ||
userBadges: [] // e.g. Moderator badge | ||
userBadges: [], // e.g. Moderator badge | ||
isModerator: true, | ||
isNewGifter: false, | ||
isSubscriber: false, | ||
topGifterRank: 3 | ||
} | ||
@@ -240,4 +246,20 @@ ``` | ||
name: 'Moderator' | ||
}, | ||
{ | ||
// Top Gifter Badge | ||
type: 'image', | ||
displayType: 1, | ||
url: 'https://p19-webcast.tiktokcdn.com/webcast-va/ranklist_top_gifter_3.png~tplv-obj.image' | ||
}, | ||
{ | ||
// Subscriber Badge | ||
type: 'image', | ||
displayType: 1, | ||
url: 'https://p19-webcast.tiktokcdn.com/webcast-va/e1b3cdc5d3a687ca5602d84c09117d9b~tplv-obj.image' | ||
} | ||
] | ||
], | ||
isModerator: true, | ||
isNewGifter: false, | ||
isSubscriber: true, | ||
topGifterRank: 3 | ||
} | ||
@@ -274,3 +296,7 @@ ``` | ||
userBadges: [], | ||
profilePictureUrl: 'https://p16-sign.tiktokcdn-us.com/...', | ||
profilePictureUrl: 'https://p16-sign.tiktokcdn-us.com/...', | ||
isModerator: true, | ||
isNewGifter: false, | ||
isSubscriber: true, | ||
topGifterRank: 3, | ||
@@ -291,3 +317,3 @@ // Gift Details | ||
// Receiver Details | ||
// Receiver Details (can also be a guest broadcaster) | ||
receiverUserId: '7044962356446839814' | ||
@@ -350,2 +376,48 @@ } | ||
#### `emote` | ||
Triggered every time a subscriber sends an emote (sticker). | ||
```javascript | ||
tiktokChatConnection.on('emote', data => { | ||
console.log('emote received', data); | ||
}) | ||
``` | ||
Data structure: | ||
```javascript | ||
{ | ||
userId: '6889810001851728898', | ||
uniqueId: 'zerodytest', | ||
nickname: 'Zerody One', | ||
profilePictureUrl: 'https://p77-sign-va.tiktokcdn.com/...', | ||
followRole: 2, | ||
userBadges: [ ], | ||
isSubscriber: true, | ||
topGifterRank: 3, | ||
emoteId: '7101355900887796486', | ||
emoteImageUrl: 'https://p19-webcast.tiktokcdn.com/...' | ||
} | ||
``` | ||
#### `envelope` | ||
Triggered every time someone sends a treasure chest. | ||
```javascript | ||
tiktokChatConnection.on('envelope', data => { | ||
console.log('envelope received', data); | ||
}) | ||
``` | ||
Data structure: | ||
```javascript | ||
{ | ||
userId: '6889810001851728898', | ||
uniqueId: 'zerodytest', | ||
nickname: 'Zerody One', | ||
coins: 220, | ||
canOpen: 10, | ||
timestamp: 1654802658 | ||
} | ||
``` | ||
#### `questionNew` | ||
@@ -352,0 +424,0 @@ Triggered every time someone asks a new question via the question feature. |
Sorry, the diff of this file is not supported yet
76997
992
606