diff --git a/src/assets/badges.ts b/src/assets/badges.ts index ed8b2ca..3a66a16 100644 --- a/src/assets/badges.ts +++ b/src/assets/badges.ts @@ -1,4 +1,4 @@ -import type { Badge } from './types'; +import type { Badge, ParsedMessage } from './types'; export function getBadges(badges: Badge[], badgesToFind: { setId: string; version: string; }[]) { const foundBadges = []; @@ -17,11 +17,11 @@ export function getBadges(badges: Badge[], badgesToFind: { setId: string; versio return foundBadges; } -export const getBadgesFromMessage = (message: { username: string, channel: string, message: string, messageType: string, tags: Record }, allBadges: Badge[]) => { - let badgesString = message.tags.badges; +export const getBadgesFromMessage = (message: ParsedMessage, allBadges: Badge[]) => { + let badgesString = message.data.tags.badges; if (!badgesString) return; let badges = badgesString.split(','); - let formatedBadges = badges.map((badgeWithVersion) => { + let formatedBadges = badges.map((badgeWithVersion: string) => { const [setId, version] = badgeWithVersion.split('/'); return { setId, version }; }); diff --git a/src/assets/messageParser.ts b/src/assets/messageParser.ts new file mode 100644 index 0000000..8b9ed45 --- /dev/null +++ b/src/assets/messageParser.ts @@ -0,0 +1,48 @@ +import type { Badge, ParsedMessage } from "./types"; +import { getBadgesFromMessage } from './badges' + + +export function parseMessage(messageData: string, allBadges: Badge[]): ParsedMessage { + const message = JSON.parse(messageData); + + switch (message.type) { + case "PRIVMSG": { + const tags = message.tags + const username = message.username + const data: ParsedMessage = { + type: "PRIVMSG", + data: { message: message.message, username, tags }, + }; + + const badges = getBadgesFromMessage(data, allBadges); + data.data.badges = badges + + 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'], + } + } + } + // Add more cases for other message types here + default: { + return { + type: "UNKNOWN", + data: { message }, + }; + } + } + } + \ No newline at end of file diff --git a/src/assets/types/ParsedMessage.ts b/src/assets/types/ParsedMessage.ts index ba020c8..ce22c63 100644 --- a/src/assets/types/ParsedMessage.ts +++ b/src/assets/types/ParsedMessage.ts @@ -1,5 +1,5 @@ export interface ParsedMessage { type: string; - data: any; + data: { [k: string]: any }; }; \ No newline at end of file diff --git a/src/components/TwitchChat.vue b/src/components/TwitchChat.vue index e234872..f328016 100644 --- a/src/components/TwitchChat.vue +++ b/src/components/TwitchChat.vue @@ -2,7 +2,8 @@ import { ref, type Ref } from 'vue' import BadgeVue from './ChatBadge.vue' import { getBadges } from '@/assets/badges' -import type { Badge } from '@/assets/types' +import { parseMessage } from '@/assets/messageParser' +import type { Badge, ParsedMessage } from '@/assets/types' export default { props: { @@ -17,21 +18,13 @@ export default { } }, async setup(props) { - let messages: Ref< - { - username: string - channel: string - message: string - messageType: string - tags: Record - }[] - > = ref([]) + let messages: Ref = ref([]) const badgesFetch = await fetch(`${import.meta.env.VITE_BACKEND_URL}/api/badges?channelName=${props.channelName}`) let badges: Badge[] = await badgesFetch.json() return { - ws: new WebSocket('ws://localhost:7000'), + ws: new WebSocket(`ws://localhost:7001`), messages, badges, props, @@ -45,7 +38,7 @@ export default { if (message.data == 'OK') { chatStatusMessage.textContent = `Connected to ${this.channelName}` } else { - this.messages.push(JSON.parse(message.data)) + this.messages.push(parseMessage(message.data, this.badges)) this.clearMessages() this.scrollToBottom(chatList) } @@ -67,11 +60,11 @@ export default { this.messages.shift } }, - getBadges(message: { username: string, channel: string, message: string, messageType: string, tags: Record }) { - let badgesString = message.tags.badges; + getBadges(message: ParsedMessage) { + let badgesString = message.data.tags.badges; if (!badgesString) return; let badges = badgesString.split(','); - let formatedBadges = badges.map((badgeWithVersion) => { + let formatedBadges = badges.map((badgeWithVersion: string) => { const [setId, version] = badgeWithVersion.split('/'); return { setId, version }; }); @@ -98,7 +91,8 @@ export default {

  • -
    + +

    @@ -110,11 +104,19 @@ export default { - {{ message.username }}: {{ message.message }} + {{ message.data.username }}: {{ message.data.message }}

    + +
    +

    Message by {{ message.data.username }} removed

    +
    + +
    + {{ message }} +