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 ChatMessage struct {
CreatedAt time.Time
EventType EventType
UserID ChatUserID
Username string
MessageID ChatMessageID
Message string
FormatType TextFormatType
Paid Money
CreatedAt time.Time
EventType EventType
UserID ChatUserID
Username string
MessageID ChatMessageID
Message string
MessageFormatType TextFormatType
Paid Money
}
type EventType int

View File

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

View File

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

View File

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

View File

@@ -22,6 +22,22 @@ func ChatMessageGo2GRPC(
UsernameReadable: xstring.ToReadable(event.Username),
MessageID: string(event.MessageID),
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(time.Nanosecond),
),
EventType: PlatformEventTypeGRPC2Go(event.GetEventType()),
UserID: streamcontrol.ChatUserID(event.GetUserID()),
Username: event.GetUsername(),
MessageID: streamcontrol.ChatMessageID(event.GetMessageID()),
Message: event.GetMessage(),
EventType: PlatformEventTypeGRPC2Go(event.GetEventType()),
UserID: streamcontrol.ChatUserID(event.GetUserID()),
Username: event.GetUsername(),
MessageID: streamcontrol.ChatMessageID(event.GetMessageID()),
Message: event.GetMessage(),
MessageFormatType: MessageFormatTypeGRPC2Go(event.GetMessageFormatType()),
},
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
}
}