/* ----------------------------------------------------------------------------------------- */
/* TikFinity >< Streamer.Bot */
/* ----------------------------------------------------------------------------------------- */
/* In Streamer.bot, go into Servers/Clients, then Websocket clients, */
/* and add the server info for TikFinity Desktop App. */
/* ----------------------------------------------------------------------------------------- */
/* If it's also running on the same computer, the address will be: ws://127.0.0.1:21213/ */
/* ----------------------------------------------------------------------------------------- */
const showTikTokMessages = getURLParam("showTikTokMessages", true);
const showTikTokFollows = getURLParam("showTikTokFollows", true);
const showTikTokLikes = getURLParam("showTikTokLikes", true);
const showTikTokGifts = getURLParam("showTikTokGifts", true);
const showTikTokSubs = getURLParam("showTikTokSubs", true);
const showTikTokStatistics = getURLParam("showTikTokStatistics", true);
userColors.set('tiktok', new Map());
if (showTikTokStatistics == false) { document.querySelector('#statistics #tiktok').style.display = 'none'; }
streamerBotClient.on('General.Custom', (response) => {
if (response.data.platform === 'TikTok') {
let json = response.data;
let jsonData = json.data.data;
switch (json.data.event) {
case 'roomUser' :
tiktokUpdateStatistics(jsonData, 'viewers');
break;
case 'like' :
tiktokUpdateStatistics(jsonData, 'likes');
//console.log('TikTok Likes', jsonData);
tiktokLikesMessage(jsonData);
break;
case 'chat' :
console.log('TikTok Chat', jsonData);
tiktokChatMessage(jsonData);
break;
case 'follow' :
console.log('TikTok Follow', jsonData);
tiktokFollowMessage(jsonData);
break;
case 'subscribe' :
console.log('TikTok Sub', jsonData);
tiktokSubMessage(jsonData);
break;
case 'gift' :
console.log('TikTok Gift', jsonData);
tiktokGiftMessage(jsonData);
break;
default:
//console.debug(json);
}
}
});
async function tiktokChatMessage(data) {
if (showTikTokMessages == false) return;
if (ignoreUserList.includes(data.nickname.toLowerCase())) return;
if (data.comment.startsWith("!") && excludeCommands == true) return;
const {
userId: userID,
msgId: messageID,
profilePictureUrl: avatar,
comment: message,
emotes,
nickname: userName,
isSubscriber,
isModerator,
} = data;
const badgesHTML = [
isSubscriber && '',
isModerator && '',
].filter(Boolean).join('');
const classes = [
isSubscriber && 'sub',
isModerator && 'mod',
].filter(Boolean);
var fullmessage = message;
if (emotes.length > 0) {
emotes.forEach(emote => {
var emotetoadd = `
`;
var position = emote.placeInComment;
fullmessage = [fullmessage.slice(0, position), emotetoadd, fullmessage.slice(position)].join('');
});
}
const messageData = {
classes: classes.join(' '),
avatar,
badges: badgesHTML,
userName,
color: await createRandomColor('tiktok', userID),
message: fullmessage,
reply: '',
};
addMessageToChat(userID, messageID, 'tiktok', messageData);
}
async function tiktokFollowMessage(data) {
if (showTikTokFollows == false) return;
const {
userId: userID,
msgId: messageID,
profilePictureUrl: avatar,
nickname: userName,
} = data;
const message = currentLang.tiktok.follow();
const classes = 'follow'
const messageData = {
classes: classes,
avatar,
badges: '',
userName,
color: '#FFF',
message,
reply: '',
};
addEventToChat(userID, messageID, 'tiktok', messageData);
}
async function tiktokLikesMessage(data) {
if (showTikTokLikes == false) return;
const {
userId: userID,
msgId: messageID,
profilePictureUrl: avatar,
nickname: userName,
likeCount: likesSent
} = data;
var likeCountTotal = parseInt(likesSent);
// Search for Previous Likes from the Same User
const previousLikeContainer = chatContainer.querySelector(`div.message.likes[data-user="${userID}"]`);
// If found, fetches the previous likes, deletes the element
// and then creates a new count with a sum of the like count
if (previousLikeContainer) {
const likeCountElem = previousLikeContainer.querySelector('.likecount');
if (likeCountElem) {
var likeCountPrev = parseInt(likeCountElem.textContent);
likeCountTotal = Math.floor(likeCountPrev + likeCountTotal);
previousLikeContainer.remove();
}
}
const message = currentLang.tiktok.likes(likeCountTotal)
const classes = 'likes'
const messageData = {
classes: classes,
avatar,
badges: '',
userName,
color: '#FFF',
message,
reply: '',
};
addEventToChat(userID, messageID, 'tiktok', messageData);
}
async function tiktokSubMessage(data) {
if (showTikTokSubs == false) return;
const {
userId: userID,
msgId: messageID,
profilePictureUrl: avatar,
nickname: userName,
} = data;
const message = currentLang.tiktok.sub({
months : data.subMonth
});
const classes = 'sub'
const messageData = {
classes: classes,
avatar,
badges: '',
userName,
color: '#FFF',
message,
reply: '',
};
addEventToChat(userID, messageID, 'tiktok', messageData);
}
async function tiktokGiftMessage(data) {
if (showTikTokGifts == false) return;
if (data.giftType === 1 && !data.repeatEnd) {}
else {
const {
userId: userID,
msgId: messageID,
profilePictureUrl: avatar,
nickname: userName,
} = data;
var coins = Math.floor(data.repeatCount*data.diamondCount);
const message = currentLang.tiktok.gift({
gift : data.giftName,
count : data.repeatCount,
coins : coins
});
const classes = 'gift'
const messageData = {
classes: classes,
avatar,
badges: '',
userName,
color: '#FFF',
message,
reply: '',
};
addEventToChat(userID, messageID, 'tiktok', messageData);
}
}
async function tiktokUpdateStatistics(data, type) {
if (showPlatformStatistics == false || showTikTokStatistics == false) return;
if (type == 'viewers') {
const viewers = DOMPurify.sanitize(data.viewerCount);
document.querySelector('#statistics #tiktok .viewers span').textContent = formatNumber(viewers);
}
if (type == 'likes') {
const likes = DOMPurify.sanitize(data.totalLikeCount);
document.querySelector('#statistics #tiktok .likes span').textContent = formatNumber(likes);
}
}