// TwitchMessage.cpp #include "twitchmessage.h" #include #include TwitchMessage TwitchMessage::parse(const QString &rawMessage) { TwitchMessage msg; // Basic IRC parsing QString remaining = rawMessage.trimmed(); // Parse tags (start with @) if (remaining.startsWith('@')) { int spaceIndex = remaining.indexOf(' '); if (spaceIndex != -1) { QString tagsStr = remaining.mid(1, spaceIndex - 1); remaining = remaining.mid(spaceIndex + 1); // Parse individual tags QStringList tags = tagsStr.split(';'); for (const QString &tag : tags) { int eqIndex = tag.indexOf('='); if (eqIndex != -1) { QString key = tag.left(eqIndex); QString value = tag.mid(eqIndex + 1); if (key == "badges") { if (!value.isEmpty()) { QStringList badgeList = value.split(','); for (const QString &badge : badgeList) { QStringList parts = badge.split('/'); if (parts.size() == 2) { TwitchMessage::Badge b; b.name = parts[0]; b.version = parts[1].toInt(); msg.badges.append(b); if (b.name == "vip") { msg.isVIP = true; } } } } } else if (key == "badge-info") { msg.badgeInfo = value; } else if (key == "client-nonce") { msg.clientNonce = value; } else if (key == "color") { msg.color = value; } else if (key == "display-name") { msg.displayName = value; } else if (key == "emotes") { msg.emotes = value; } else if (key == "first-msg") { msg.firstMsg = (value == "1"); } else if (key == "flags") { msg.flags = value; } else if (key == "id") { msg.messageId = value; } else if (key == "mod") { msg.isMod = (value == "1"); } else if (key == "vip") { msg.isVIP = (value == "1"); } else if (key == "returning-chatter") { msg.returningChatter = (value == "1"); } else if (key == "room-id") { msg.roomId = value.toLongLong(); } else if (key == "subscriber") { msg.isSubscriber = (value == "1"); } else if (key == "tmi-sent-ts") { msg.tmiSentTimestamp = value.toLongLong(); } else if (key == "turbo") { msg.isTurbo = (value == "1"); } else if (key == "user-id") { msg.userId = value.toLongLong(); } else if (key == "user-type") { msg.userType = value; } } } } } // Parse prefix (starts with : after tags) if (remaining.startsWith(':')) { int spaceIndex = remaining.indexOf(' '); if (spaceIndex != -1) { msg.ircPrefix = remaining.mid(1, spaceIndex - 1); remaining = remaining.mid(spaceIndex + 1); } } // Parse command int spaceIndex = remaining.indexOf(' '); if (spaceIndex != -1) { msg.ircCommand = remaining.left(spaceIndex); remaining = remaining.mid(spaceIndex + 1); } // Parse channel (starts with #) if (remaining.startsWith('#')) { spaceIndex = remaining.indexOf(' '); if (spaceIndex != -1) { msg.channel = remaining.left(spaceIndex); remaining = remaining.mid(spaceIndex + 1); } } // Parse message (starts with :) if (remaining.startsWith(':')) { msg.message = remaining.mid(1); } return msg; }