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

