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');
|
||||
}
|
||||
|
||||
// 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 {
|
||||
id: String(item.id ?? item.timestamp_usec ?? Date.now()),
|
||||
author: String(item.author?.name ?? 'Unknown'),
|
||||
@@ -268,9 +281,10 @@ function normalizeAction(action: any): ChatMessage | null {
|
||||
isMember,
|
||||
isVerified,
|
||||
superChat: extractSuperChatInfo(item),
|
||||
membershipGift: isMembership || isGiftReceived,
|
||||
membershipGift: isMembership,
|
||||
membershipGiftPurchase: isGiftPurchase,
|
||||
membershipLevel
|
||||
membershipLevel,
|
||||
giftCount
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -54,8 +54,8 @@ export default function DashboardPage() {
|
||||
}, [pollError, overlayStatus]);
|
||||
|
||||
const superChats = useMemo(() => messages.filter(m => m.superChat), [messages]);
|
||||
const newMembers = useMemo(() => messages.filter(m => m.membershipGiftPurchase), [messages]);
|
||||
const regularMessages = useMemo(() => messages.filter(m => !m.superChat && !m.membershipGift), [messages]);
|
||||
const newMembers = useMemo(() => messages.filter(m => m.membershipGift || m.membershipGiftPurchase), [messages]);
|
||||
const regularMessages = useMemo(() => messages.filter(m => !m.superChat && !m.membershipGift && !m.membershipGiftPurchase), [messages]);
|
||||
|
||||
return (
|
||||
<main className="dashboard">
|
||||
@@ -462,7 +462,9 @@ function MemberItem({ message, isSelected, onSelect }: ChatItemProps) {
|
||||
<div className="memberItem__info">
|
||||
<span className="memberItem__author">{message.author}</span>
|
||||
<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>
|
||||
<time className="memberItem__time">{new Date(message.publishedAt).toLocaleTimeString()}</time>
|
||||
</div>
|
||||
|
||||
@@ -89,12 +89,16 @@ export default function OverlayPage() {
|
||||
💰 {message.superChat.currency}{message.superChat.amount}
|
||||
</div>
|
||||
)}
|
||||
{message.membershipGift && (
|
||||
{(message.membershipGift || message.membershipGiftPurchase) && (
|
||||
<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>
|
||||
)}
|
||||
{(!message.superChat && !message.membershipGift) && message.text && (
|
||||
{(!message.superChat && !message.membershipGift && !message.membershipGiftPurchase) && message.text && (
|
||||
<p className="overlay__text">{message.text}</p>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -24,4 +24,5 @@ export type ChatMessage = {
|
||||
membershipGift?: boolean;
|
||||
membershipGiftPurchase?: boolean;
|
||||
membershipLevel?: string; // e.g., "New member", "Member (6 months)", etc.
|
||||
giftCount?: number; // Number of memberships gifted
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user