You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

YAGPDB机器人星板自定义命令:嵌入消息音视频预览修复请求

YAGPDB星板脚本图片/视频预览修复方案

原脚本存在的问题

  • 链接正则中的&是HTML转义字符,而Discord消息中的链接使用原始&,导致带参数的媒体链接无法匹配
  • 域名后缀长度限制过严(仅允许2-3位),无法匹配.dev、.app等新型域名下的媒体链接
  • 路径匹配规则过于严格,无法匹配包含特殊字符的媒体路径
  • 一处变量拼写错误($eomji应为$emoji),导致高星数对应的表情显示异常

修复后的完整脚本

{{/* 配置项开始 */}}
{{ $starEmoji := "⭐" }} {{/* 星标表情名称 */}}
{{ $starLimit := 1 }} {{/* 触发星板所需的星标数量 */}}
{{ $starboard := 736324263107231885 }} {{/* 星板频道ID */}}
{{/* 配置项结束 */}}

{{/* 修复后的媒体链接正则:支持带参数的链接、新型域名、宽松路径匹配 */}}
{{ $linkRegex := `https?:\/\/(?:\w+\.)?[\w-]+\.[\w]{2,6}(?:\/[^\s]*)*\.(?:png|jpg|jpeg|gif|webp|mp4|mpeg|avi|mov|wmv|flv|mkv|webm)(?:\?[\w=&%-]+)?` }}

{{ $count := 1 }}
{{ range .ReactionMessage.Reactions }}
{{ if and (eq .Emoji.Name $starEmoji) (ge .Count $starLimit) }}
{{ $count = .Count }}
{{ end }}
{{ end }}

{{ $starboardMessage := 0 }}
{{ $thisID := .ReactionMessage.ID }}
{{ with (dbGet 0 "starboardMessages").Value }}
{{ $idRegex := printf `%d:(\d+)` $thisID }}
{{ with reFindAllSubmatches $idRegex . }} {{ $starboardMessage = index . 0 1 }} {{ end }}
{{ if not (getMessage $starboard $starboardMessage) }}
{{ $starboardMessage = 0 }}
{{ dbSet 0 "starboardMessages" (reReplace $idRegex . "") }}
{{ end }}
{{ end }}

{{ if and $count (or .ReactionMessage.Content .ReactionMessage.Attachments) (eq .Reaction.Emoji.Name $starEmoji) }}
{{ $emoji := "🌠" }}
{{ if lt $count 5 }} {{ $emoji = "⭐" }}
{{ else if lt $count 10 }} {{ $emoji = "🌟" }}
{{ else if lt $count 15 }} {{ $emoji = "✨" }}
{{ else if lt $count 20 }} {{ $emoji = "💫" }}
{{ else if lt $count 30 }} {{ $emoji = "🎇" }}
{{ else if lt $count 40 }} {{ $emoji = "🎆" }}
{{ else if lt $count 50 }} {{ $emoji = "☄️" }} {{/* 修复拼写错误:$eomji → $emoji */}}
{{ end }}
{{ $embed := sdict
"color" 0xFFAC33
"fields" (cslice
(sdict "name" "作者" "value" .ReactionMessage.Author.Mention "inline" true)
(sdict "name" "频道" "value" (printf "\<#%d\>" .Channel.ID) "inline" true)
)
"timestamp" .ReactionMessage.Timestamp
"thumbnail" (sdict "url" (.ReactionMessage.Author.AvatarURL "1024"))
"footer" (sdict "text" (printf "%s %d | %d" $emoji $count .ReactionMessage.ID))
}}
{{ with .ReactionMessage.Content }}
{{ with reFind $linkRegex . }} {{ $embed.Set "image" (sdict "url" .) }} {{ end }}
{{ $content := . }}
{{ if gt (len .) 1000 }} {{ $content = slice . 0 1000 | printf "%s..." }} {{ end }}
{{ $embed.Set "fields" ($embed.fields.Append (sdict "name" "消息内容" "value" $content)) }}
{{ end }}
{{ with .ReactionMessage.Attachments }}
{{ range . }} {{/* 遍历所有附件,最后一个匹配的媒体会设置为Embed图片(Discord Embed仅支持一个主图) */}}
{{ $attachment := .URL }}
{{ if reFind `\.(?:png|jpg|jpeg|gif|webp|mp4|mpeg|avi|mov|wmv|flv|mkv|webm)$` $attachment }}
{{ $embed.Set "image" (sdict "url" $attachment) }}
{{ end }}
{{ end }}
{{ end }}
{{ $embed.Set "fields" ($embed.fields.Append (sdict
"name" "跳转链接"
"value" (printf "[查看原消息](https://discordapp.com/channels/%d/%d/%d)" .Guild.ID .Channel.ID .ReactionMessage.ID)))
}}
{{ with $starboardMessage }}
{{ editMessage $starboard . (cembed $embed) }}
{{ else }}
{{ $ret := sendMessageRetID $starboard (cembed $embed) }}
{{ dbSet 0 "starboardMessages" (printf
"%s\n%d:%d"
(or (dbGet 0 "starboardMessages").Value "")
.ReactionMessage.ID $ret
) }}
{{addMessageReactions $starboard $ret "👍" "👎"}}
{{ end }}
{{ end }}

关键修复说明

  1. 正则表达式优化:
    • 替换&amp;为&,匹配原始链接中的参数分隔符
    • 将域名后缀长度从[\w]{2,3}改为[\w]{2,6},支持更多新型顶级域名
    • 路径匹配改为(?:\/[^\s]*)*,匹配任意非空白字符组成的路径
    • 新增结尾的参数匹配(?:\?[\w=&%-]+)?,支持带查询参数的媒体链接
  2. 变量拼写修复:修正了$eomji的拼写错误为$emoji,确保50星以下的表情显示正确
  3. 附件遍历逻辑:从仅取第一个附件改为遍历所有附件,确保只要有符合条件的媒体附件就能被设置为Embed预览(Discord Embed仅支持一个主图,最后一个匹配的会生效)
  4. 字段中文本地化:将Embed中的字段名改为中文,更符合国内用户使用习惯

内容的提问来源于stack exchange,提问作者Kamlesh Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:28:12