fix: address edge cases, bounds checks, and unused configs based on automated review

This commit is contained in:
Andrew 2026-02-24 00:07:35 +00:00
parent 50dc9ec02b
commit 12ba514761
3 changed files with 24 additions and 20 deletions

View file

@ -169,12 +169,14 @@ func (c *TelegramChannel) Send(ctx context.Context, msg bus.OutboundMessage) err
limit = 4000 // Default Telegram limit (~4096) limit = 4000 // Default Telegram limit (~4096)
} }
// Telegram HTML tags (like <pre><code>) can expand content significantly. // Use a percentage-based headroom for the markdown-based split, but never
// We use a safe headroom for the markdown-based split, but never exceed // exceed the configured limit. This scales better for large messages with
// the configured limit. // extensive formatting or code blocks.
effectiveMarkdownLimit := limit - 500 effectiveMarkdownLimit := int(float64(limit) * 0.8) // ~80% of limit
if effectiveMarkdownLimit < 1 { if effectiveMarkdownLimit < 1 {
effectiveMarkdownLimit = 1 effectiveMarkdownLimit = 1
} else if effectiveMarkdownLimit >= limit {
effectiveMarkdownLimit = limit - 1
} }
chunks := utils.SplitMessage(msg.Content, effectiveMarkdownLimit) chunks := utils.SplitMessage(msg.Content, effectiveMarkdownLimit)

View file

@ -195,10 +195,9 @@ type ChannelsConfig struct {
} }
type WhatsAppConfig struct { type WhatsAppConfig struct {
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_WHATSAPP_ENABLED"` Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_WHATSAPP_ENABLED"`
BridgeURL string `json:"bridge_url" env:"PICOCLAW_CHANNELS_WHATSAPP_BRIDGE_URL"` BridgeURL string `json:"bridge_url" env:"PICOCLAW_CHANNELS_WHATSAPP_BRIDGE_URL"`
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_WHATSAPP_ALLOW_FROM"` AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_WHATSAPP_ALLOW_FROM"`
MaxMessageLength int `json:"max_message_length,omitempty" env:"PICOCLAW_CHANNELS_WHATSAPP_MAX_MESSAGE_LENGTH"`
} }
type TelegramConfig struct { type TelegramConfig struct {
@ -216,7 +215,6 @@ type FeishuConfig struct {
EncryptKey string `json:"encrypt_key" env:"PICOCLAW_CHANNELS_FEISHU_ENCRYPT_KEY"` EncryptKey string `json:"encrypt_key" env:"PICOCLAW_CHANNELS_FEISHU_ENCRYPT_KEY"`
VerificationToken string `json:"verification_token" env:"PICOCLAW_CHANNELS_FEISHU_VERIFICATION_TOKEN"` VerificationToken string `json:"verification_token" env:"PICOCLAW_CHANNELS_FEISHU_VERIFICATION_TOKEN"`
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_FEISHU_ALLOW_FROM"` AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_FEISHU_ALLOW_FROM"`
MaxMessageLength int `json:"max_message_length,omitempty" env:"PICOCLAW_CHANNELS_FEISHU_MAX_MESSAGE_LENGTH"`
} }
type DiscordConfig struct { type DiscordConfig struct {
@ -235,19 +233,17 @@ type MaixCamConfig struct {
} }
type QQConfig struct { type QQConfig struct {
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_QQ_ENABLED"` Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_QQ_ENABLED"`
AppID string `json:"app_id" env:"PICOCLAW_CHANNELS_QQ_APP_ID"` AppID string `json:"app_id" env:"PICOCLAW_CHANNELS_QQ_APP_ID"`
AppSecret string `json:"app_secret" env:"PICOCLAW_CHANNELS_QQ_APP_SECRET"` AppSecret string `json:"app_secret" env:"PICOCLAW_CHANNELS_QQ_APP_SECRET"`
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_QQ_ALLOW_FROM"` AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_QQ_ALLOW_FROM"`
MaxMessageLength int `json:"max_message_length,omitempty" env:"PICOCLAW_CHANNELS_QQ_MAX_MESSAGE_LENGTH"`
} }
type DingTalkConfig struct { type DingTalkConfig struct {
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_DINGTALK_ENABLED"` Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_DINGTALK_ENABLED"`
ClientID string `json:"client_id" env:"PICOCLAW_CHANNELS_DINGTALK_CLIENT_ID"` ClientID string `json:"client_id" env:"PICOCLAW_CHANNELS_DINGTALK_CLIENT_ID"`
ClientSecret string `json:"client_secret" env:"PICOCLAW_CHANNELS_DINGTALK_CLIENT_SECRET"` ClientSecret string `json:"client_secret" env:"PICOCLAW_CHANNELS_DINGTALK_CLIENT_SECRET"`
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_DINGTALK_ALLOW_FROM"` AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_DINGTALK_ALLOW_FROM"`
MaxMessageLength int `json:"max_message_length,omitempty" env:"PICOCLAW_CHANNELS_DINGTALK_MAX_MESSAGE_LENGTH"`
} }
type SlackConfig struct { type SlackConfig struct {
@ -276,7 +272,6 @@ type OneBotConfig struct {
ReconnectInterval int `json:"reconnect_interval" env:"PICOCLAW_CHANNELS_ONEBOT_RECONNECT_INTERVAL"` ReconnectInterval int `json:"reconnect_interval" env:"PICOCLAW_CHANNELS_ONEBOT_RECONNECT_INTERVAL"`
GroupTriggerPrefix []string `json:"group_trigger_prefix" env:"PICOCLAW_CHANNELS_ONEBOT_GROUP_TRIGGER_PREFIX"` GroupTriggerPrefix []string `json:"group_trigger_prefix" env:"PICOCLAW_CHANNELS_ONEBOT_GROUP_TRIGGER_PREFIX"`
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_ONEBOT_ALLOW_FROM"` AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_ONEBOT_ALLOW_FROM"`
MaxMessageLength int `json:"max_message_length,omitempty" env:"PICOCLAW_CHANNELS_ONEBOT_MAX_MESSAGE_LENGTH"`
} }
type WeComConfig struct { type WeComConfig struct {

View file

@ -106,6 +106,10 @@ func SplitMessage(content string, maxLen int) []string {
msgEndOffset = startIndex + innerLimit msgEndOffset = startIndex + innerLimit
} }
if msgEndOffset > len(runes) {
msgEndOffset = len(runes)
}
chunkStr := string(runes[startIndex:msgEndOffset]) chunkStr := string(runes[startIndex:msgEndOffset])
messages = append(messages, strings.TrimRight(chunkStr, " \t\n\r")+"\n```") messages = append(messages, strings.TrimRight(chunkStr, " \t\n\r")+"\n```")
@ -138,6 +142,9 @@ func SplitMessage(content string, maxLen int) []string {
} else { } else {
// Hard split inside (last resort) // Hard split inside (last resort)
msgEndOffset = startIndex + maxLen - 5 msgEndOffset = startIndex + maxLen - 5
if msgEndOffset > len(runes) {
msgEndOffset = len(runes)
}
chunkStr := string(runes[startIndex:msgEndOffset]) chunkStr := string(runes[startIndex:msgEndOffset])
messages = append(messages, strings.TrimRight(chunkStr, " \t\n\r")+"\n```") messages = append(messages, strings.TrimRight(chunkStr, " \t\n\r")+"\n```")