package bolt import ( "fmt" dg "github.com/bwmarrin/discordgo" ) const ( // the max length allowed for basic messages MSG_MAX_LENGTH = 2000 ) // Message contains basic information about the messages received and provides a few methods // for handling replies, bans, timeouts, reaction, and deletion. All Discord utilities will use // a timeout to prevent hanging for too long, this timeout can be customized with the WithTimeout // option. type Message struct { Author Author ID string //message ID Words []string //message data split on whitespaces Content string //entire message data string Channel string //name of channel message was sent in ChannelID string //ID of channel message was sent in Server string //name of guild message was sent in ServerID string //ID of guild message was sent in Attachments []MessageAttachment //any attachments bound to the message Mentions []*dg.User sesh *bolt } type Author struct { Name string ID string Roles []string } // React applies reaction to the message func (m *Message) React(emoji Reaction) error { return m.sesh.MessageReactionAdd(m.ChannelID, m.ID, fmt.Sprint(emoji)) } // Respond sends a response to the message, handling chunking if the message exceeds max length func (m *Message) Respond(res string) error { if len(res) > MSG_MAX_LENGTH { for len(res) > 0 { //send full chunk size allowed by discord sc := res[:MSG_MAX_LENGTH] rep := m.sesh.createReply(sc, m.ID, m.ChannelID, m.ServerID) _, err := m.sesh.ChannelMessageSendComplex(m.ChannelID, rep) if err != nil { return err } res = res[MSG_MAX_LENGTH:] //if we have left than a full chunk send the rest and break the loop if len(res) < MSG_MAX_LENGTH { final := m.sesh.createReply(res, m.ID, m.ChannelID, m.ServerID) _, err := m.sesh.ChannelMessageSendComplex(m.ChannelID, final) if err != nil { return err } break } } return nil } //short enough message to send in one go rep := m.sesh.createReply(res, m.ID, m.ChannelID, m.ServerID) _, err := m.sesh.ChannelMessageSendComplex(m.ChannelID, rep) return err } // Delete removes the message from the current channel func (m *Message) Delete() error { return m.sesh.ChannelMessageDelete(m.ChannelID, m.ID, nil) } // func (m *Message) Timeout(userID string, duration time.Time) error { // return m.sesh.GuildMemberTimeout(m.serverID, userID, &duration) // } // func (m *Message) ClearTimeout(userID string) error { // return m.sesh.GuildMemberTimeout(m.serverID, userID, nil) // } // func (m *Message) Mute(userID string) error { // return m.sesh.GuildMemberMute(m.serverID, userID, true) // } // func (m *Author) Unmute(userID string) error { // return m.sesh.GuildMemberMute(m.serverID, userID, false) // } // message attachment details type MessageAttachment struct { ID string URL string ProxyURL string Filename string ContentType string Width int Height int Size int DurationSecs float64 }