Add MessageFormatType passing through
Some checks failed
rolling-release / build (push) Has been cancelled
rolling-release / rolling-release (push) Has been cancelled

This commit is contained in:
Dmitrii Okunev
2025-08-15 04:12:37 +01:00
parent 4f59735ea8
commit 1d65b36720
6 changed files with 135 additions and 103 deletions

View File

@@ -9,14 +9,14 @@ type ChatUserID string
type ChatMessageID string type ChatMessageID string
type ChatMessage struct { type ChatMessage struct {
CreatedAt time.Time CreatedAt time.Time
EventType EventType EventType EventType
UserID ChatUserID UserID ChatUserID
Username string Username string
MessageID ChatMessageID MessageID ChatMessageID
Message string Message string
FormatType TextFormatType MessageFormatType TextFormatType
Paid Money Paid Money
} }
type EventType int type EventType int

View File

@@ -155,13 +155,13 @@ func (h *ChatHandlerOBSOLETE) sendMessage(
h.lastMessageID = msg.ID h.lastMessageID = msg.ID
select { select {
case h.messagesOutChan <- streamcontrol.ChatMessage{ case h.messagesOutChan <- streamcontrol.ChatMessage{
CreatedAt: msg.CreatedAt, CreatedAt: msg.CreatedAt,
EventType: streamcontrol.EventTypeChatMessage, EventType: streamcontrol.EventTypeChatMessage,
UserID: streamcontrol.ChatUserID(fmt.Sprintf("%d", msg.UserID)), UserID: streamcontrol.ChatUserID(fmt.Sprintf("%d", msg.UserID)),
Username: msg.Sender.Slug, Username: msg.Sender.Slug,
MessageID: streamcontrol.ChatMessageID(msg.ID), MessageID: streamcontrol.ChatMessageID(msg.ID),
Message: msg.Content, Message: msg.Content,
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}: }:
default: default:
} }

View File

@@ -92,13 +92,13 @@ func newChatHandlerIRC(
} }
select { select {
case h.messagesOutChan <- streamcontrol.ChatMessage{ case h.messagesOutChan <- streamcontrol.ChatMessage{
CreatedAt: ev.CreatedAt, CreatedAt: ev.CreatedAt,
EventType: streamcontrol.EventTypeChatMessage, EventType: streamcontrol.EventTypeChatMessage,
UserID: streamcontrol.ChatUserID(ev.Sender.Username), UserID: streamcontrol.ChatUserID(ev.Sender.Username),
Username: ev.Sender.Username, Username: ev.Sender.Username,
MessageID: streamcontrol.ChatMessageID(ev.ID), MessageID: streamcontrol.ChatMessageID(ev.ID),
Message: ev.Text, // TODO: investigate if we need ev.IRCMessage.Text Message: ev.Text, // TODO: investigate if we need ev.IRCMessage.Text
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}: }:
default: default:
logger.Warnf(ctx, "the queue is full, skipping the message") logger.Warnf(ctx, "the queue is full, skipping the message")

View File

@@ -95,35 +95,35 @@ func NewChatHandlerSub(
} }
eventSubClient.OnEventAutomodMessageHold(func(event twitcheventsub.EventAutomodMessageHold, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventAutomodMessageHold(func(event twitcheventsub.EventAutomodMessageHold, msg twitcheventsub.NotificationMessage) {
h.sendMessage(ctx, streamcontrol.ChatMessage{ h.sendMessage(ctx, streamcontrol.ChatMessage{
CreatedAt: msg.Metadata.MessageTimestamp, CreatedAt: msg.Metadata.MessageTimestamp,
EventType: streamcontrol.EventTypeAutoModHold, EventType: streamcontrol.EventTypeAutoModHold,
UserID: streamcontrol.ChatUserID(event.UserID), UserID: streamcontrol.ChatUserID(event.UserID),
Username: event.UserName, Username: event.UserName,
MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID), MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID),
Message: event.Message.Text, Message: event.Message.Text,
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventChannelAdBreakBegin(func(event twitcheventsub.EventChannelAdBreakBegin, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventChannelAdBreakBegin(func(event twitcheventsub.EventChannelAdBreakBegin, msg twitcheventsub.NotificationMessage) {
h.sendMessage(ctx, streamcontrol.ChatMessage{ h.sendMessage(ctx, streamcontrol.ChatMessage{
CreatedAt: msg.Metadata.MessageTimestamp, CreatedAt: msg.Metadata.MessageTimestamp,
EventType: streamcontrol.EventTypeAdBreak, EventType: streamcontrol.EventTypeAdBreak,
UserID: "twitch", UserID: "twitch",
Username: "Twitch", Username: "Twitch",
MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID), MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID),
Message: fmt.Sprintf("%d seconds", event.DurationSeconds), Message: fmt.Sprintf("%d seconds", event.DurationSeconds),
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventChannelBan(func(event twitcheventsub.EventChannelBan, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventChannelBan(func(event twitcheventsub.EventChannelBan, msg twitcheventsub.NotificationMessage) {
h.sendMessage(ctx, streamcontrol.ChatMessage{ h.sendMessage(ctx, streamcontrol.ChatMessage{
CreatedAt: msg.Metadata.MessageTimestamp, CreatedAt: msg.Metadata.MessageTimestamp,
EventType: streamcontrol.EventTypeBan, EventType: streamcontrol.EventTypeBan,
UserID: streamcontrol.ChatUserID(event.UserID), UserID: streamcontrol.ChatUserID(event.UserID),
Username: event.UserName, Username: event.UserName,
MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID), MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID),
Message: event.Reason, Message: event.Reason,
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventChannelCheer(func(event twitcheventsub.EventChannelCheer, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventChannelCheer(func(event twitcheventsub.EventChannelCheer, msg twitcheventsub.NotificationMessage) {
@@ -138,40 +138,40 @@ func NewChatHandlerSub(
Currency: streamcontrol.CurrencyBits, Currency: streamcontrol.CurrencyBits,
Amount: float64(event.Bits), Amount: float64(event.Bits),
}, },
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventChannelFollow(func(event twitcheventsub.EventChannelFollow, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventChannelFollow(func(event twitcheventsub.EventChannelFollow, msg twitcheventsub.NotificationMessage) {
h.sendMessage(ctx, streamcontrol.ChatMessage{ h.sendMessage(ctx, streamcontrol.ChatMessage{
CreatedAt: msg.Metadata.MessageTimestamp, CreatedAt: msg.Metadata.MessageTimestamp,
EventType: streamcontrol.EventTypeFollow, EventType: streamcontrol.EventTypeFollow,
UserID: streamcontrol.ChatUserID(event.UserID), UserID: streamcontrol.ChatUserID(event.UserID),
Username: event.UserName, Username: event.UserName,
MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID), MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID),
Message: "", Message: "",
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventChannelRaid(func(event twitcheventsub.EventChannelRaid, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventChannelRaid(func(event twitcheventsub.EventChannelRaid, msg twitcheventsub.NotificationMessage) {
h.sendMessage(ctx, streamcontrol.ChatMessage{ h.sendMessage(ctx, streamcontrol.ChatMessage{
CreatedAt: msg.Metadata.MessageTimestamp, CreatedAt: msg.Metadata.MessageTimestamp,
EventType: streamcontrol.EventTypeRaid, EventType: streamcontrol.EventTypeRaid,
UserID: streamcontrol.ChatUserID(event.FromBroadcasterUserId), UserID: streamcontrol.ChatUserID(event.FromBroadcasterUserId),
Username: event.FromBroadcasterUserName, Username: event.FromBroadcasterUserName,
MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID), MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID),
Message: fmt.Sprintf("%d viewers", event.Viewers), Message: fmt.Sprintf("%d viewers", event.Viewers),
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventChannelShoutoutReceive(func(event twitcheventsub.EventChannelShoutoutReceive, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventChannelShoutoutReceive(func(event twitcheventsub.EventChannelShoutoutReceive, msg twitcheventsub.NotificationMessage) {
h.sendMessage(ctx, streamcontrol.ChatMessage{ h.sendMessage(ctx, streamcontrol.ChatMessage{
CreatedAt: msg.Metadata.MessageTimestamp, CreatedAt: msg.Metadata.MessageTimestamp,
EventType: streamcontrol.EventTypeChannelShoutoutReceive, EventType: streamcontrol.EventTypeChannelShoutoutReceive,
UserID: streamcontrol.ChatUserID(event.FromBroadcasterUserId), UserID: streamcontrol.ChatUserID(event.FromBroadcasterUserId),
Username: event.FromBroadcasterUserName, Username: event.FromBroadcasterUserName,
MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID), MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID),
Message: fmt.Sprintf("%d viewers", event.ViewerCount), Message: fmt.Sprintf("%d viewers", event.ViewerCount),
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventChannelSubscribe(func(event twitcheventsub.EventChannelSubscribe, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventChannelSubscribe(func(event twitcheventsub.EventChannelSubscribe, msg twitcheventsub.NotificationMessage) {
@@ -182,13 +182,13 @@ func NewChatHandlerSub(
} }
description = append(description, fmt.Sprintf("tier '%s'", event.Tier)) description = append(description, fmt.Sprintf("tier '%s'", event.Tier))
h.sendMessage(ctx, streamcontrol.ChatMessage{ h.sendMessage(ctx, streamcontrol.ChatMessage{
CreatedAt: msg.Metadata.MessageTimestamp, CreatedAt: msg.Metadata.MessageTimestamp,
EventType: streamcontrol.EventTypeSubscribe, EventType: streamcontrol.EventTypeSubscribe,
UserID: streamcontrol.ChatUserID(event.UserID), UserID: streamcontrol.ChatUserID(event.UserID),
Username: event.UserName, Username: event.UserName,
MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID), MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID),
Message: strings.Join(description, " "), Message: strings.Join(description, " "),
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventChannelSubscriptionMessage(func(event twitcheventsub.EventChannelSubscriptionMessage, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventChannelSubscriptionMessage(func(event twitcheventsub.EventChannelSubscriptionMessage, msg twitcheventsub.NotificationMessage) {
@@ -202,7 +202,7 @@ func NewChatHandlerSub(
"%d months (%d in total), tier '%s', message: %s", "%d months (%d in total), tier '%s', message: %s",
event.DurationMonths, event.CumulativeMonths, event.Tier, event.Message.Text, event.DurationMonths, event.CumulativeMonths, event.Tier, event.Message.Text,
), ),
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventChannelSubscriptionGift(func(event twitcheventsub.EventChannelSubscriptionGift, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventChannelSubscriptionGift(func(event twitcheventsub.EventChannelSubscriptionGift, msg twitcheventsub.NotificationMessage) {
@@ -216,29 +216,29 @@ func NewChatHandlerSub(
"gift: %d subs, tier '%s'", "gift: %d subs, tier '%s'",
event.Total, event.Tier, event.Total, event.Tier,
), ),
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventStreamOnline(func(event twitcheventsub.EventStreamOnline, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventStreamOnline(func(event twitcheventsub.EventStreamOnline, msg twitcheventsub.NotificationMessage) {
h.sendMessage(ctx, streamcontrol.ChatMessage{ h.sendMessage(ctx, streamcontrol.ChatMessage{
CreatedAt: msg.Metadata.MessageTimestamp, CreatedAt: msg.Metadata.MessageTimestamp,
EventType: streamcontrol.EventTypeStreamOnline, EventType: streamcontrol.EventTypeStreamOnline,
UserID: streamcontrol.ChatUserID(event.BroadcasterUserId), UserID: streamcontrol.ChatUserID(event.BroadcasterUserId),
Username: event.BroadcasterUserName, Username: event.BroadcasterUserName,
MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID), MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID),
Message: event.StartedAt.Format(time.DateTime), Message: event.StartedAt.Format(time.DateTime),
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventStreamOffline(func(event twitcheventsub.EventStreamOffline, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventStreamOffline(func(event twitcheventsub.EventStreamOffline, msg twitcheventsub.NotificationMessage) {
h.sendMessage(ctx, streamcontrol.ChatMessage{ h.sendMessage(ctx, streamcontrol.ChatMessage{
CreatedAt: msg.Metadata.MessageTimestamp, CreatedAt: msg.Metadata.MessageTimestamp,
EventType: streamcontrol.EventTypeStreamOffline, EventType: streamcontrol.EventTypeStreamOffline,
UserID: streamcontrol.ChatUserID(event.BroadcasterUserId), UserID: streamcontrol.ChatUserID(event.BroadcasterUserId),
Username: event.BroadcasterUserName, Username: event.BroadcasterUserName,
MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID), MessageID: streamcontrol.ChatMessageID(msg.Metadata.MessageID),
Message: "", Message: "",
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })
eventSubClient.OnEventChannelChatMessage(func(chatEvent twitcheventsub.EventChannelChatMessage, msg twitcheventsub.NotificationMessage) { eventSubClient.OnEventChannelChatMessage(func(chatEvent twitcheventsub.EventChannelChatMessage, msg twitcheventsub.NotificationMessage) {
@@ -248,13 +248,13 @@ func NewChatHandlerSub(
eventType = streamcontrol.EventTypeCheer eventType = streamcontrol.EventTypeCheer
} }
h.sendMessage(ctx, streamcontrol.ChatMessage{ h.sendMessage(ctx, streamcontrol.ChatMessage{
CreatedAt: msg.Metadata.MessageTimestamp, CreatedAt: msg.Metadata.MessageTimestamp,
EventType: eventType, EventType: eventType,
UserID: streamcontrol.ChatUserID(chatEvent.ChatterUserId), UserID: streamcontrol.ChatUserID(chatEvent.ChatterUserId),
Username: chatEvent.ChatterUserName, Username: chatEvent.ChatterUserName,
MessageID: streamcontrol.ChatMessageID(chatEvent.MessageId), MessageID: streamcontrol.ChatMessageID(chatEvent.MessageId),
Message: chatEvent.Message.Text, Message: chatEvent.Message.Text,
FormatType: streamcontrol.TextFormatTypePlain, MessageFormatType: streamcontrol.TextFormatTypePlain,
}) })
}) })

View File

@@ -150,9 +150,9 @@ func (l *ChatListenerOBSOLETE) listenLoop(ctx context.Context) (_err error) {
Username: msg.AuthorName, Username: msg.AuthorName,
// TODO: find a way to extract the message ID, // TODO: find a way to extract the message ID,
// in the mean while we we use a soft key for that: // in the mean while we we use a soft key for that:
MessageID: streamcontrol.ChatMessageID(fmt.Sprintf("%s/%s", msg.AuthorName, msg.Message)), MessageID: streamcontrol.ChatMessageID(fmt.Sprintf("%s/%s", msg.AuthorName, msg.Message)),
Message: text, Message: text,
FormatType: format, MessageFormatType: format,
} }
} }
} }

View File

@@ -22,6 +22,22 @@ func ChatMessageGo2GRPC(
UsernameReadable: xstring.ToReadable(event.Username), UsernameReadable: xstring.ToReadable(event.Username),
MessageID: string(event.MessageID), MessageID: string(event.MessageID),
Message: event.Message, Message: event.Message,
MessageFormatType: MessageFormatTypeGo2GRPC(event.MessageFormatType),
}
}
func MessageFormatTypeGo2GRPC(
formatType streamcontrol.TextFormatType,
) streamd_grpc.TextFormatType {
switch formatType {
case streamcontrol.TextFormatTypePlain:
return streamd_grpc.TextFormatType_TEXT_FORMAT_TYPE_PLAIN
case streamcontrol.TextFormatTypeMarkdown:
return streamd_grpc.TextFormatType_TEXT_FORMAT_TYPE_MARKDOWN
case streamcontrol.TextFormatTypeHTML:
return streamd_grpc.TextFormatType_TEXT_FORMAT_TYPE_HTML
default:
return streamd_grpc.TextFormatType_TEXT_FORMAT_TYPE_UNDEFINED
} }
} }
@@ -35,12 +51,28 @@ func ChatMessageGRPC2Go(
int64(createdAtUNIXNano)/int64(time.Second), int64(createdAtUNIXNano)/int64(time.Second),
(int64(createdAtUNIXNano)%int64(time.Second))/int64(time.Nanosecond), (int64(createdAtUNIXNano)%int64(time.Second))/int64(time.Nanosecond),
), ),
EventType: PlatformEventTypeGRPC2Go(event.GetEventType()), EventType: PlatformEventTypeGRPC2Go(event.GetEventType()),
UserID: streamcontrol.ChatUserID(event.GetUserID()), UserID: streamcontrol.ChatUserID(event.GetUserID()),
Username: event.GetUsername(), Username: event.GetUsername(),
MessageID: streamcontrol.ChatMessageID(event.GetMessageID()), MessageID: streamcontrol.ChatMessageID(event.GetMessageID()),
Message: event.GetMessage(), Message: event.GetMessage(),
MessageFormatType: MessageFormatTypeGRPC2Go(event.GetMessageFormatType()),
}, },
Platform: streamcontrol.PlatformName(event.GetPlatID()), Platform: streamcontrol.PlatformName(event.GetPlatID()),
} }
} }
func MessageFormatTypeGRPC2Go(
formatType streamd_grpc.TextFormatType,
) streamcontrol.TextFormatType {
switch formatType {
case streamd_grpc.TextFormatType_TEXT_FORMAT_TYPE_PLAIN:
return streamcontrol.TextFormatTypePlain
case streamd_grpc.TextFormatType_TEXT_FORMAT_TYPE_MARKDOWN:
return streamcontrol.TextFormatTypeMarkdown
case streamd_grpc.TextFormatType_TEXT_FORMAT_TYPE_HTML:
return streamcontrol.TextFormatTypeHTML
default:
return streamcontrol.TextFormatTypeUndefined
}
}