Files
chatrd/js/fourthwall/module.js
2025-05-14 18:53:08 -03:00

323 lines
8.6 KiB
JavaScript

const showFourthwallDonations = getURLParam("showFourthwallDonations", true);
const showFourthwallOrders = getURLParam("showFourthwallOrders", true);
const showFourthwallShowImage = getURLParam("showFourthwallShowImage", true);
const showFourthwallBigImage = getURLParam("showFourthwallBigImage", true);
const showFourthwallSubscriptions = getURLParam("showFourthwallSubscriptions", true);
const showFourthwallGiftPurchase = getURLParam("showFourthwallGiftPurchase", true);
const showFourthwallShowGiftImage = getURLParam("showFourthwallShowGiftImage", true);
const showFourthwallBigGiftImage = getURLParam("showFourthwallBigGiftImage", true);
const showFourthwallGiftDraw = getURLParam("showFourthwallGiftDraw", true);
const fourthWallGiftDrawCommand = getURLParam("fourthWallGiftDrawCommand", "!enter");
const fourthwallMessageHandlers = {
'Fourthwall.Donation': (response) => {
console.debug('Fourthwall Donation', response.data);
fourthwallDonationMessage(response.data);
},
'Fourthwall.OrderPlaced': (response) => {
console.debug('Fourthwall Order', response.data);
fourthwallOrderMessage(response.data);
},
'Fourthwall.SubscriptionPurchased': (response) => {
console.debug('Fourthwall Sub', response.data);
fourthwallSubMessage(response.data);
},
'Fourthwall.GiftPurchase': (response) => {
console.debug('Fourthwall Gift', response.data);
fourthwallGiftMessage(response.data);
},
'Fourthwall.GiftDrawStarted': (response) => {
console.debug('Fourthwall Gift Draw Start', response.data);
fourthwallGiftDrawStartMessage(response.data);
},
'Fourthwall.GiftDrawEnded': (response) => {
console.debug('Fourthwall Gift Draw Start', response.data);
fourthwallGiftDrawEndMessage(response.data);
},
};
for (const [event, handler] of Object.entries(fourthwallMessageHandlers)) {
streamerBotClient.on(event, handler);
}
async function fourthwallDonationMessage(data) {
if (showFourthwallDonations == false) return;
const {
username : userName,
amount,
currency,
message: text
} = data;
const userID = createRandomString(40);
const messageID = createRandomString(40);
var money = formatCurrency(amount,currency);
const [avatar, message] = await Promise.all([
'',
currentLang.fourthwall.donation({
money: money,
message: text
}),
]);
const classes = '';
const messageData = {
classes: classes,
avatar,
badges: '',
userName,
color: '#FFF',
message,
reply: '',
};
addEventToChat(userID, messageID, 'fourthwall', messageData);
}
async function fourthwallOrderMessage(data) {
if (showFourthwallOrders == false) return;
const username = data.username;
const total = data.total;
const currency = data.currency;
const item = data.variants[0].name;
const itemsQuantity = data.variants.length;
const text = stripStringFromHtml(data.statmessageus);
const imageUrl = data.variants[0].image;
const userID = createRandomString(40);
const messageID = createRandomString(40);
var userName = '';
if (username == undefined) { userName = currentLang.fourthwall.someone(); }
else { userName = username; }
var money = '';
if (total == 0) { money = 0; }
else { money = formatCurrency(total,currency); }
var fourthWallImage = '';
if (showFourthwallShowImage == true) {
fourthWallImage = imageUrl
}
const [avatar, message] = await Promise.all([
'',
currentLang.fourthwall.order({
money: money,
firstItem: item,
items: itemsQuantity,
message: text,
image: fourthWallImage
}),
]);
const classes = ['order'];
if (showFourthwallBigImage == true) {
classes.push('giantimage');
}
const messageData = {
classes: classes.join(' '),
avatar,
badges: '',
userName,
color: '#FFF',
message,
reply: '',
};
addEventToChat(userID, messageID, 'fourthwall', messageData);
}
async function fourthwallSubMessage(data) {
if (showFourthwallSubscriptions == false) return;
const {
nickname : userName,
amount,
currency
} = data;
const userID = createRandomString(40);
const messageID = createRandomString(40);
var money = formatCurrency(amount,currency);
const [avatar, message] = await Promise.all([
'',
currentLang.fourthwall.donation({
money: money
}),
]);
const classes = '';
const messageData = {
classes: classes,
avatar,
badges: '',
userName,
color: '#FFF',
message,
reply: '',
};
addEventToChat(userID, messageID, 'fourthwall', messageData);
}
async function fourthwallGiftMessage(data) {
if (showFourthwallGiftPurchase == false) return;
const userName = data.username;
const total = data.total;
const currency = data.currency;
const gifts = data.gifts.length;
const item = data.offer.name;
const imageUrl = data.offer.imageUrl;
const text = stripStringFromHtml(data.statmessageus);
const userID = createRandomString(40);
const messageID = createRandomString(40);
var money = '';
if (total == 0) { money = 0; }
else { money = formatCurrency(total,currency); }
var fourthWallImage = '';
if (showFourthwallShowGiftImage == true) {
fourthWallImage = imageUrl
}
const [avatar, message] = await Promise.all([
'',
currentLang.fourthwall.gift({
money: money,
firstItem: item,
items: gifts,
message: text,
image: fourthWallImage
}),
]);
const classes = ['order'];
if (showFourthwallBigGiftImage == true) {
classes.push('giantimage');
}
const messageData = {
classes: classes.join(' '),
avatar,
badges: '',
userName,
color: '#FFF',
message,
reply: '',
};
addEventToChat(userID, messageID, 'fourthwall', messageData);
}
async function fourthwallGiftDrawStartMessage(data) {
if (showFourthwallGiftDraw == false) return;
const {
offer: {
name: itemName
},
durationSeconds
} = data;
var userName = '';
const userID = createRandomString(40);
const messageID = createRandomString(40);
const [avatar, message] = await Promise.all([
'',
currentLang.fourthwall.drawstart({
gift: itemName,
command: fourthWallGiftDrawCommand,
time: durationSeconds
}),
]);
const classes = '';
const messageData = {
classes: classes,
avatar,
badges: '',
userName,
color: '#FFF',
message,
reply: '',
};
addEventToChat(userID, messageID, 'fourthwall', messageData);
}
async function fourthwallGiftDrawEndMessage(data) {
if (showFourthwallGiftDraw == false) return;
const {
gifts
} = data;
var userName = '';
const userID = createRandomString(40);
const messageID = createRandomString(40);
const [avatar, message] = await Promise.all([
'',
currentLang.fourthwall.drawend({
winners: await getWinnersList(gifts)
}),
]);
const classes = '';
const messageData = {
classes: classes,
avatar,
badges: '',
userName,
color: '#FFF',
message,
reply: '',
};
addEventToChat(userID, messageID, 'fourthwall', messageData);
}
async function getWinnersList(gifts) {
const winners = gifts.map(gift => gift.winner).filter(Boolean); // Remove null/undefined
const numWinners = winners.length;
if (numWinners === 0) { return ""; }
if (numWinners === 1) { return winners[0]; }
if (numWinners === 2) { return `${winners[0]} and ${winners[1]}`; }
// For 3 or more, use the Oxford comma style: A, B, and C
const allButLast = winners.slice(0, -1).join(", ");
const lastWinner = winners[winners.length - 1];
return `${allButLast}, and ${lastWinner}`;
}