package bus import "strings" // NormalizeInboundMessage ensures the inbound context is normalized and keeps // convenience mirrors in sync for runtime consumers. func NormalizeInboundMessage(msg InboundMessage) InboundMessage { msg.Context = normalizeInboundContext(msg.Context) msg.Channel = msg.Context.Channel msg.SenderID = msg.Context.SenderID msg.ChatID = msg.Context.ChatID if msg.MessageID == "" { msg.MessageID = msg.Context.MessageID } if msg.Context.MessageID == "" { msg.Context.MessageID = msg.MessageID } return msg } func (ctx InboundContext) isZero() bool { return ctx.Channel == "" && ctx.Account == "" && ctx.ChatID == "" && ctx.ChatType == "" && ctx.TopicID == "" && ctx.SpaceID == "" && ctx.SpaceType == "" && ctx.SenderID == "" && ctx.MessageID == "" && !ctx.Mentioned && ctx.ReplyToMessageID == "" && ctx.ReplyToSenderID == "" && len(ctx.ReplyHandles) == 0 && len(ctx.Raw) == 0 } func normalizeInboundContext(ctx InboundContext) InboundContext { ctx.Channel = strings.TrimSpace(ctx.Channel) ctx.Account = strings.TrimSpace(ctx.Account) ctx.ChatID = strings.TrimSpace(ctx.ChatID) ctx.ChatType = normalizeKind(ctx.ChatType) ctx.TopicID = strings.TrimSpace(ctx.TopicID) ctx.SpaceID = strings.TrimSpace(ctx.SpaceID) ctx.SpaceType = normalizeKind(ctx.SpaceType) ctx.SenderID = strings.TrimSpace(ctx.SenderID) ctx.MessageID = strings.TrimSpace(ctx.MessageID) ctx.ReplyToMessageID = strings.TrimSpace(ctx.ReplyToMessageID) ctx.ReplyToSenderID = strings.TrimSpace(ctx.ReplyToSenderID) ctx.ReplyHandles = cloneStringMap(ctx.ReplyHandles) ctx.Raw = cloneStringMap(ctx.Raw) return ctx } func cloneStringMap(src map[string]string) map[string]string { if len(src) == 0 { return nil } dst := make(map[string]string, len(src)) for k, v := range src { dst[k] = v } return dst } func normalizeKind(kind string) string { switch strings.ToLower(strings.TrimSpace(kind)) { case "direct", "group", "channel", "guild", "team", "workspace", "tenant", "topic": return strings.ToLower(strings.TrimSpace(kind)) default: return strings.ToLower(strings.TrimSpace(kind)) } }