adding Context
- converting messages and methods into one context per event
This commit is contained in:
170
message.go
170
message.go
@@ -2,6 +2,7 @@ package bolt
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
dg "github.com/bwmarrin/discordgo"
|
||||
)
|
||||
@@ -11,89 +12,8 @@ const (
|
||||
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)
|
||||
// }
|
||||
// command payload functions, any strings returned are sent as a response to the command
|
||||
type Payload func(c *Context) error
|
||||
|
||||
// message attachment details
|
||||
type MessageAttachment struct {
|
||||
@@ -107,3 +27,87 @@ type MessageAttachment struct {
|
||||
Size int
|
||||
DurationSecs float64
|
||||
}
|
||||
|
||||
type Author struct {
|
||||
Name string
|
||||
ID string
|
||||
Roles []string
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
type Context struct {
|
||||
Message *Message
|
||||
bolt *bolt
|
||||
}
|
||||
|
||||
// React applies reaction to the message
|
||||
func (c *Context) React(emoji Reaction) error {
|
||||
return c.bolt.MessageReactionAdd(c.Message.ChannelID, c.Message.ID, fmt.Sprint(emoji))
|
||||
}
|
||||
|
||||
// Respond sends a response to the message, handling chunking if the message exceeds max length
|
||||
func (c *Context) 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 := c.bolt.createReply(sc, c.Message.ID, c.Message.ChannelID, c.Message.ServerID)
|
||||
_, err := c.bolt.ChannelMessageSendComplex(c.Message.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 := c.bolt.createReply(res, c.Message.ID, c.Message.ChannelID, c.Message.ServerID)
|
||||
_, err := c.bolt.ChannelMessageSendComplex(c.Message.ChannelID, final)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
//short enough message to send in one go
|
||||
rep := c.bolt.createReply(res, c.Message.ID, c.Message.ChannelID, c.Message.ServerID)
|
||||
_, err := c.bolt.ChannelMessageSendComplex(c.Message.ChannelID, rep)
|
||||
return err
|
||||
}
|
||||
|
||||
// Delete removes the message from the current channel
|
||||
func (c *Context) Delete() error {
|
||||
return c.bolt.ChannelMessageDelete(c.Message.ChannelID, c.Message.ID, nil)
|
||||
}
|
||||
|
||||
func (c *Context) Timeout(userId string, duration time.Time) error {
|
||||
return c.bolt.GuildMemberTimeout(c.Message.ServerID, userId, &duration)
|
||||
}
|
||||
|
||||
func (c *Context) ClearTimeout(userId string) error {
|
||||
return c.bolt.GuildMemberTimeout(c.Message.ServerID, userId, nil)
|
||||
}
|
||||
|
||||
func (c *Context) Mute(userId string) error {
|
||||
return c.bolt.GuildMemberMute(c.Message.ServerID, userId, true)
|
||||
}
|
||||
|
||||
func (c *Context) Unmute(userId string) error {
|
||||
return c.bolt.GuildMemberMute(c.Message.ServerID, userId, false)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user