mirror of
https://github.com/yusufipk/YTChatHub.git
synced 2026-09-11 10:56:17 +00:00
feat: extract and display membership gift counts in chat messages
This commit is contained in:
@@ -257,6 +257,19 @@ function normalizeAction(action: any): ChatMessage | null {
|
|||||||
(isPaid ? undefined : 'New member');
|
(isPaid ? undefined : 'New member');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Extract gift count for gift purchases
|
||||||
|
let giftCount: number | undefined;
|
||||||
|
if (isGiftPurchase) {
|
||||||
|
const text = resolveMessageText(item);
|
||||||
|
const headerText = item.header_primary_text?.toString() || item.header_subtext?.toString() || '';
|
||||||
|
const combinedText = text + ' ' + headerText;
|
||||||
|
// Try to extract number from text like "Gifted 5 memberships" or "5 memberships"
|
||||||
|
const countMatch = combinedText.match(/(\d+)\s*(?:membership|memberships|member|members)/i);
|
||||||
|
if (countMatch) {
|
||||||
|
giftCount = parseInt(countMatch[1], 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: String(item.id ?? item.timestamp_usec ?? Date.now()),
|
id: String(item.id ?? item.timestamp_usec ?? Date.now()),
|
||||||
author: String(item.author?.name ?? 'Unknown'),
|
author: String(item.author?.name ?? 'Unknown'),
|
||||||
@@ -268,9 +281,10 @@ function normalizeAction(action: any): ChatMessage | null {
|
|||||||
isMember,
|
isMember,
|
||||||
isVerified,
|
isVerified,
|
||||||
superChat: extractSuperChatInfo(item),
|
superChat: extractSuperChatInfo(item),
|
||||||
membershipGift: isMembership || isGiftReceived,
|
membershipGift: isMembership,
|
||||||
membershipGiftPurchase: isGiftPurchase,
|
membershipGiftPurchase: isGiftPurchase,
|
||||||
membershipLevel
|
membershipLevel,
|
||||||
|
giftCount
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ export default function DashboardPage() {
|
|||||||
}, [pollError, overlayStatus]);
|
}, [pollError, overlayStatus]);
|
||||||
|
|
||||||
const superChats = useMemo(() => messages.filter(m => m.superChat), [messages]);
|
const superChats = useMemo(() => messages.filter(m => m.superChat), [messages]);
|
||||||
const newMembers = useMemo(() => messages.filter(m => m.membershipGiftPurchase), [messages]);
|
const newMembers = useMemo(() => messages.filter(m => m.membershipGift || m.membershipGiftPurchase), [messages]);
|
||||||
const regularMessages = useMemo(() => messages.filter(m => !m.superChat && !m.membershipGift), [messages]);
|
const regularMessages = useMemo(() => messages.filter(m => !m.superChat && !m.membershipGift && !m.membershipGiftPurchase), [messages]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className="dashboard">
|
<main className="dashboard">
|
||||||
@@ -462,7 +462,9 @@ function MemberItem({ message, isSelected, onSelect }: ChatItemProps) {
|
|||||||
<div className="memberItem__info">
|
<div className="memberItem__info">
|
||||||
<span className="memberItem__author">{message.author}</span>
|
<span className="memberItem__author">{message.author}</span>
|
||||||
<span className="memberItem__level">
|
<span className="memberItem__level">
|
||||||
{message.membershipLevel || 'New member'}
|
{message.membershipGiftPurchase && message.giftCount
|
||||||
|
? `Gifted ${message.giftCount} membership${message.giftCount > 1 ? 's' : ''}`
|
||||||
|
: message.membershipLevel || 'New member'}
|
||||||
</span>
|
</span>
|
||||||
<time className="memberItem__time">{new Date(message.publishedAt).toLocaleTimeString()}</time>
|
<time className="memberItem__time">{new Date(message.publishedAt).toLocaleTimeString()}</time>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -89,12 +89,16 @@ export default function OverlayPage() {
|
|||||||
💰 {message.superChat.currency}{message.superChat.amount}
|
💰 {message.superChat.currency}{message.superChat.amount}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{message.membershipGift && (
|
{(message.membershipGift || message.membershipGiftPurchase) && (
|
||||||
<div className="overlay__membership">
|
<div className="overlay__membership">
|
||||||
🎁 New Member!
|
{message.membershipGiftPurchase && message.giftCount
|
||||||
|
? `🎁 Gifted ${message.giftCount} Membership${message.giftCount > 1 ? 's' : ''}!`
|
||||||
|
: message.membershipGiftPurchase
|
||||||
|
? '🎁 Gift Purchase'
|
||||||
|
: '🎁 New Member!'}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{(!message.superChat && !message.membershipGift) && message.text && (
|
{(!message.superChat && !message.membershipGift && !message.membershipGiftPurchase) && message.text && (
|
||||||
<p className="overlay__text">{message.text}</p>
|
<p className="overlay__text">{message.text}</p>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -24,4 +24,5 @@ export type ChatMessage = {
|
|||||||
membershipGift?: boolean;
|
membershipGift?: boolean;
|
||||||
membershipGiftPurchase?: boolean;
|
membershipGiftPurchase?: boolean;
|
||||||
membershipLevel?: string; // e.g., "New member", "Member (6 months)", etc.
|
membershipLevel?: string; // e.g., "New member", "Member (6 months)", etc.
|
||||||
|
giftCount?: number; // Number of memberships gifted
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user