99 lines
2.3 KiB
TypeScript
99 lines
2.3 KiB
TypeScript
import type { Badge, ParsedMessage } from './types'
|
|
import { getBadges, getBadgesFromMessage } from './badges'
|
|
import type { StreamMessage } from '@/types'
|
|
|
|
export function parseMessage(messageData: any, allBadges: Badge[]): ParsedMessage {
|
|
const message = JSON.parse(messageData)
|
|
|
|
if (message.type === undefined && message.cursor !== '') {
|
|
const data: ParsedMessage = {
|
|
type: 'PRIVMSG',
|
|
data: {
|
|
message: message.message,
|
|
username: message.messager.name,
|
|
badges: message.badges,
|
|
offset: message.offset,
|
|
color: message.messager.colorHex
|
|
}
|
|
}
|
|
|
|
return data
|
|
}
|
|
|
|
switch (message.type) {
|
|
case 'PRIVMSG': {
|
|
const data: ParsedMessage = {
|
|
type: 'PRIVMSG',
|
|
data: {
|
|
message: message.message,
|
|
username: message.username,
|
|
color: message.tags.color,
|
|
badges: getBadgesFromMessage(message.tags, allBadges)
|
|
}
|
|
}
|
|
|
|
return data
|
|
}
|
|
case 'USERNOTICE': {
|
|
const username = message.tags.login
|
|
const resub = message.tags['msg-id'] === 'resub'
|
|
const months = parseInt(message.tags['msg-param-cumulative-months'])
|
|
return {
|
|
type: 'USERNOTICE',
|
|
data: { username, resub, months }
|
|
}
|
|
}
|
|
case 'CLEARMSG': {
|
|
return {
|
|
type: 'CLEARMSG',
|
|
data: {
|
|
username: message.tags['@login']
|
|
}
|
|
}
|
|
}
|
|
case 'CLEARCHAT': {
|
|
let duration = message.tags['@ban-duration']
|
|
if (!message.tags['@ban-duration']) {
|
|
duration = 0
|
|
}
|
|
|
|
return {
|
|
type: 'CLEARCHAT',
|
|
data: {
|
|
username: message.message.replace(/(\r\n|\n|\r)/gm, ''),
|
|
duration
|
|
}
|
|
}
|
|
}
|
|
// Add more cases for other message types here
|
|
default: {
|
|
return {
|
|
type: 'UNKNOWN',
|
|
data: { message }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export function parseChatHistory(messages: StreamMessage[], badges: Badge[]) {
|
|
const parsedMessages = []
|
|
|
|
for (let i = 0; i < messages.length; i++) {
|
|
const message = messages[i]
|
|
|
|
const data: ParsedMessage = {
|
|
type: 'PRIVMSG',
|
|
data: {
|
|
message: message.message,
|
|
username: message.username,
|
|
color: message.color,
|
|
badges: getBadges(badges, message.badges)
|
|
}
|
|
}
|
|
|
|
parsedMessages.push(data)
|
|
}
|
|
|
|
return parsedMessages
|
|
}
|