Skip to main content

Main CC

This command allows users to react to messages with stars. If the number of stars reaches a given amount, it will be sent in the starboard channel.

For more information about the starboard system, see this page.

Trigger​

Type: Reaction
Additional options: Added + Removed Reactions

note

This command should be set to ignore your starboard channel in the channel restrictions.

Configuration​

See the starboard system overview for more information regarding how to configure this command.

Code​

{{/*
Allows users to react to messages with stars. If it reaches a given amount, it will be sent in the starboard channel.
See <https://yagpdb-cc.github.io/fun/starboard/main-cc> for more information.

Author: dvoraknt <https://github.com/dvoraknt>
*/}}

{{/* Configurable values */}}
{{$starEmoji := "⭐"}}
{{$starEmFull := "⭐"}}
{{$starLimit := 4}}
{{$starboard := 712681639410663516}}
{{$maxAge := "2w"}}
{{$selfStarEnable := false}}
{{$warnMessages := false}}

{{$antiStarEnable := false}}
{{$antiStarEmoji := "❌"}}
{{$antiStarEmFull := "❌"}}
{{$antiStarExtra := 0}}
{{/* End of configurable values */}}

{{$linkRegex := `https?:\/\/(?:\w+\.)?[\w-]+\.[\w]{2,3}(?:\/[\w-_.]+)+\.(?:png|jpg|jpeg|gif|webp)`}}

{{$thisID := .ReactionMessage.ID}}{{$skip := true}}
{{$data := ""}}{{$starboardData := ""}}{{$sboardPost := print $thisID}}{{$cid := .Reaction.ChannelID}}{{$mid := .Reaction.MessageID}}
{{if and (or (eq .Reaction.Emoji.Name $starEmoji) (eq .Reaction.Emoji.Name $antiStarEmoji)) (not .User.Bot)}}
{{if not (dbGet 0 "starboardReactions")}}{{dbSet 0 "starboardReactions" (sdict $sboardPost (sdict "ID" $sboardPost "listID" "" "listAnti" ""))}}{{end}}
{{with (dbGet 0 "starboardReactions").Value}}{{$data = sdict .}}{{end}}
{{$starboardData = $data.Get $sboardPost}}

{{if and .ReactionAdded (not $selfStarEnable) (eq .User.ID (.Message.Author).ID)}}
{{deleteMessageReaction $cid $mid .User.ID $starEmFull $antiStarEmFull}}
{{if $warnMessages}}{{$ret := sendMessageRetID nil (print .User.Mention " You can't influence your own post!")}}
{{deleteMessage $cid $ret 3}}{{end}}
{{else if $starboardData}}
{{$starboardData = sdict $starboardData}}

{{if and .ReactionAdded (eq .Reaction.Emoji.Name $starEmoji)}}
{{if reFind (print "SB" .User.ID ",") $starboardData.listID}}
{{deleteMessageReaction $cid $mid .User.ID $starEmFull}}
{{if $warnMessages}}{{$ret := sendMessageRetID nil (print .User.Mention " You already reacted on starboard!")}}
{{deleteMessage $cid $ret 3}}{{end}}
{{else if reFind (print .User.ID ",") $starboardData.listAnti}}
{{deleteMessageReaction $cid $mid .User.ID $starEmFull}}
{{if $warnMessages}}{{$ret := sendMessageRetID nil (print .User.Mention " You can't star and anti-star the same message!")}}
{{deleteMessage $cid $ret 3}}{{end}}
{{else}}
{{$IDregex:= print "PO" .User.ID ","}}
{{$starboardData.Set "listID" (print $starboardData.listID $IDregex)}}
{{$skip = false}}
{{end}}

{{else if eq .Reaction.Emoji.Name $starEmoji}}
{{$IDregex := print "PO" .User.ID ","}}
{{if reFind $IDregex $starboardData.listID}}
{{$starboardData.Set "listID" (reReplace $IDregex $starboardData.listID "")}}
{{end}}
{{$skip = false}}
{{end}}

{{if and $antiStarEnable .ReactionAdded (eq .Reaction.Emoji.Name $antiStarEmoji)}}
{{if reFind (print "SB" .User.ID ",") $starboardData.listAnti}}
{{deleteMessageReaction $cid $mid .User.ID $antiStarEmFull}}
{{if $warnMessages}}{{$ret := sendMessageRetID nil (print .User.Mention " You already reacted on starboard!")}}
{{deleteMessage $cid $ret 3}}{{end}}
{{else if reFind (print .User.ID ",") $starboardData.listID}}
{{deleteMessageReaction $cid $mid .User.ID $antiStarEmFull}}
{{if $warnMessages}}{{$ret := sendMessageRetID nil (print .User.Mention " You can't star and anti-star the same message!")}}
{{deleteMessage $cid $ret 3}}{{end}}
{{else}}
{{$IDregex:= print "PO" .User.ID ","}}
{{$starboardData.Set "listAnti" (print $starboardData.listAnti $IDregex)}}
{{$skip = false}}
{{end}}

{{else if and $antiStarEnable (eq .Reaction.Emoji.Name $antiStarEmoji)}}
{{$IDregex := print "PO" .User.ID ","}}
{{if reFind $IDregex $starboardData.listAnti}}
{{$starboardData.Set "listAnti" (reReplace $IDregex $starboardData.listAnti "")}}
{{end}}
{{$skip = false}}
{{end}}

{{$data.Set $sboardPost $starboardData}}
{{dbSet 0 "starboardReactions" $data}}

{{else}}
{{$data.Set $sboardPost (sdict "ID" $sboardPost "listID" (print "PO" .User.ID ",") "listAnti" "")}}
{{dbSet 0 "starboardReactions" $data}}
{{$skip = false}}
{{end}}
{{end}}

{{$count := 0}} {{$antiCount := 0}}
{{range .ReactionMessage.Reactions}}
{{- if and (eq .Emoji.Name $starEmoji) (ge .Count $starLimit)}}
{{- $count = .Count}}
{{- end -}}
{{- if and $antiStarEnable (eq .Emoji.Name $antiStarEmoji) (ge .Count $starLimit)}}
{{- $antiCount = .Count}}
{{- end -}}
{{end}}

{{$starboardMessage := 0}}{{$thisID := 0}}{{$chanID := 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 . "")}}
{{else}}
{{range (getMessage $starboard $starboardMessage).Reactions}}
{{- if eq .Emoji.Name $starEmoji}}
{{- $count = (sub (add $count .Count) 1)}}
{{- end -}}
{{- if and $antiStarEnable (eq .Emoji.Name $antiStarEmoji)}}
{{- $antiCount = (sub (add $antiCount .Count) 1)}}
{{- end -}}
{{end}}
{{end}}
{{end}}

{{if not $antiStarEnable}} {{$antiStarExtra = 0}} {{end}} {{/*resetting count to zero to prevent user configured variable from interrupting desired functionality*/}}
{{if and (not $skip) (or (lt $count $starLimit) (ge (add $antiCount $antiStarExtra) $count))}}
{{with (dbGet 0 "starboardMessages").Value}}
{{$idRegex := printf `\n%d:(\d+):(\d+)` $thisID}}
{{with reFindAllSubmatches $idRegex .}} {{$starboardMessage = index . 0 1}} {{end}}
{{deleteMessage $starboard $starboardMessage 0}}
{{dbSet 0 "starboardMessages" (reReplace $idRegex . "")}}
{{end}}

{{if $starboardData}}
{{$nil := $starboardData.Set "listID" (reReplace `SB\d+,` $starboardData.listID "")}}
{{$nil := $starboardData.Set "listAnti" (reReplace `SB\d+,` $starboardData.listAnti "")}}
{{$data.Set $sboardPost $starboardData}}
{{dbSet 0 "starboardReactions" $data}}
{{end}}

{{else if and $count (not $skip) (or .ReactionMessage.Content .ReactionMessage.Attachments) (or (eq .Reaction.Emoji.Name $starEmoji) (eq .Reaction.Emoji.Name $antiStarEmoji)) (le (currentTime.Sub .Message.Timestamp.Parse) (toDuration $maxAge))}}
{{$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 = "☄️"}}
{{end}}
{{$embed := sdict
"color" 0xFFAC33
"fields" (cslice
(sdict "name" "Author" "value" .ReactionMessage.Author.Mention "inline" true)
(sdict "name" "Channel" "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" "Message" "value" $content))}}
{{end}}
{{with .ReactionMessage.Attachments}}
{{$attachment := (index . 0).URL}}
{{if reFind `\.(png|jpg|jpeg|gif|webp)` $attachment}}
{{$embed.Set "image" (sdict "url" $attachment)}}
{{end}}
{{end}}
{{$embed.Set "fields" ($embed.fields.Append (sdict
"name" "Message"
"value" (printf "[Jump To](https://discordapp.com/channels/%d/%d/%d)" .Guild.ID .Channel.ID .ReactionMessage.ID)))
}}
{{with $starboardMessage}}
{{editMessage $starboard . (cembed $embed)}}
{{else}}
{{$ret := sendMessageRetID $starboard (complexMessage "embed" $embed)}}
{{if $antiStarEnable}} {{addMessageReactions $starboard $ret $starEmFull $antiStarEmFull}}
{{else}} {{addMessageReactions $starboard $ret $starEmFull}} {{end}}
{{$dbData := (printf
"%s\n%d:%d:%d"
(or (dbGet 0 "starboardMessages").Value "")
.ReactionMessage.ID $ret .Reaction.ChannelID
)}}
{{dbSet 0 "starboardMessages" $dbData}}
{{end}}
{{end}}

Author​

This custom command was written by @dvoraknt.