diff --git a/cmd_sticky.go b/cmd_sticky.go index 383be9d..b1c2f75 100644 --- a/cmd_sticky.go +++ b/cmd_sticky.go @@ -11,35 +11,75 @@ var sticky_command Command = Command{ Name: "sticky", Description: "Stick messages to the bottom of the current channel", DefaultMemberPermissions: int64Ptr(discordgo.PermissionManageMessages), + Options: []*discordgo.ApplicationCommandOption{ + { + Type: discordgo.ApplicationCommandOptionSubCommand, + Name: "add", + Description: "Stick messages to the bottom of the current channel", + }, + { + Type: discordgo.ApplicationCommandOptionSubCommand, + Name: "remove", + Description: "Remove the sticky message of the current channel", + }, + }, }, Interact: func(s *discordgo.Session, i *discordgo.InteractionCreate) { - s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ - Type: discordgo.InteractionResponseModal, - Data: &discordgo.InteractionResponseData{ - CustomID: "sticky_modal", - Title: "Sticky message", - Components: []discordgo.MessageComponent{ - discordgo.ActionsRow{ - Components: []discordgo.MessageComponent{ - discordgo.TextInput{ - CustomID: "sticky_modal_text", - Label: "Text", - Style: discordgo.TextInputParagraph, - Placeholder: "The message you want to stick to the bottom of this channel", - Required: true, - MaxLength: 2000, - Value: "", + switch i.ApplicationCommandData().Options[0].Name { + case "add": + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseModal, + Data: &discordgo.InteractionResponseData{ + CustomID: "sticky_modal", + Title: "Sticky message", + Components: []discordgo.MessageComponent{ + discordgo.ActionsRow{ + Components: []discordgo.MessageComponent{ + discordgo.TextInput{ + CustomID: "sticky_modal_text", + Label: "Text", + Style: discordgo.TextInputParagraph, + Placeholder: "The message you want to stick to the bottom of this channel", + Required: true, + MaxLength: 2000, + Value: "", + }, }, }, }, }, - }, - }) + }) + case "remove": + if hasSticky(i.GuildID, i.ChannelID) { + s.ChannelMessageDelete(i.ChannelID, getStickyMessageID(i.GuildID, i.ChannelID)) + removeSticky(i.GuildID, i.ChannelID) + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: "The sticky message was removed from this channel!", + Flags: discordgo.MessageFlagsEphemeral, + }, + }) + } else { + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: "This channel has no sticky message!", + Flags: discordgo.MessageFlagsEphemeral, + }, + }) + } + } }, ModalID: "sticky_modal", ModalSubmit: func(s *discordgo.Session, i *discordgo.InteractionCreate) { text := i.ModalSubmitData().Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput).Value - message, err := s.ChannelMessageSend(i.ChannelID, text) + message, err := s.ChannelMessageSendEmbed(i.ChannelID, &discordgo.MessageEmbed{ + Type: discordgo.EmbedTypeArticle, + Title: ":pushpin: Sticky message", + Color: hexToDecimal(color["primary"]), + Description: text, + }) if err != nil { log.Println(err) } diff --git a/handle_messages.go b/handle_messages.go index d961ee6..e222dca 100644 --- a/handle_messages.go +++ b/handle_messages.go @@ -1,13 +1,20 @@ package main import ( - "fmt" - "github.com/bwmarrin/discordgo" ) func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { if m.Author.ID != s.State.User.ID { - fmt.Print(m.Content) + if hasSticky(m.GuildID, m.ChannelID) { + s.ChannelMessageDelete(m.ChannelID, getStickyMessageID(m.GuildID, m.ChannelID)) + stickyMessage, _ := s.ChannelMessageSendEmbed(m.ChannelID, &discordgo.MessageEmbed{ + Type: discordgo.EmbedTypeArticle, + Title: ":pushpin: Sticky message", + Color: hexToDecimal(color["primary"]), + Description: getStickyMessageContent(m.GuildID, m.ChannelID), + }) + updateStickyMessageID(m.GuildID, m.ChannelID, stickyMessage.ID) + } } } diff --git a/manage_data.go b/manage_data.go index 6fb90bd..fc882de 100644 --- a/manage_data.go +++ b/manage_data.go @@ -122,6 +122,42 @@ func hasSticky(guildID string, channelID string) bool { return exists } -func updateStickyMessageID(guildID string, channelID string, messageID string) { - +func getStickyMessageID(guildID string, channelID string) string { + var messageID string + exists := hasSticky(guildID, channelID) + if exists { + err := db.QueryRow("SELECT message_id FROM sticky WHERE guild_id = $1 AND channel_id = $2", guildID, channelID).Scan(&messageID) + if err != nil { + log.Println(err) + } + } + return messageID +} +func getStickyMessageContent(guildID string, channelID string) string { + var messageID string + exists := hasSticky(guildID, channelID) + if exists { + err := db.QueryRow("SELECT message_content FROM sticky WHERE guild_id = $1 AND channel_id = $2", guildID, channelID).Scan(&messageID) + if err != nil { + log.Println(err) + } + } + return messageID +} + +func updateStickyMessageID(guildID string, channelID string, messageID string) { + exists := hasSticky(guildID, channelID) + if exists { + _, err := db.Exec("UPDATE sticky SET message_id = $1 WHERE guild_id = $2 AND channel_id = $3", messageID, guildID, channelID) + if err != nil { + log.Println(err) + } + } +} + +func removeSticky(guildID string, channelID string) { + _, err := db.Exec("DELETE FROM sticky WHERE guild_id = $1 AND channel_id = $2", guildID, channelID) + if err != nil { + log.Println(err) + } } diff --git a/register_commands.go b/register_commands.go index e9c60d8..d0e0576 100644 --- a/register_commands.go +++ b/register_commands.go @@ -15,7 +15,7 @@ type Command struct { ModalID string } -var commands []Command = []Command{tag_command, short_get_tag_command, dadjoke_command, ping_command, sticky_command, ask_command} +var commands []Command = []Command{tag_command, short_get_tag_command, dadjoke_command, ping_command, ask_command, sticky_command} func ready(s *discordgo.Session, event *discordgo.Ready) { for _, guild := range event.Guilds {