started the facelift of the repo, adding in bans and timeouts. That comes with some restructure. Also implementing a goroutine limit for command handlers and options around that, as well as moving the intents to options to allow stronger restrictions
120 lines
3.6 KiB
Go
120 lines
3.6 KiB
Go
package bolt
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
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 string //current username of the message author
|
|
authorID string //discord ID of message author
|
|
authorRoles []string
|
|
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
|
|
}
|
|
|
|
// 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)
|
|
}
|
|
|
|
// Timeout sets a timeout for the message author
|
|
func (m *Message) Timeout(duration time.Time) error {
|
|
return m.sesh.GuildMemberTimeout(m.serverID, m.authorID, &duration)
|
|
}
|
|
|
|
// ClearTimeout removes all timeouts for the message author
|
|
func (m *Message) ClearTimeout() error {
|
|
return m.sesh.GuildMemberTimeout(m.serverID, m.authorID, nil)
|
|
}
|
|
|
|
// Ban removes a user from the server, banning them and removing all messages within the range of
|
|
// the days parameter
|
|
func (m *Message) Ban(reason string, days int) error {
|
|
return m.sesh.GuildBanCreateWithReason(m.serverID, m.authorID, reason, days)
|
|
}
|
|
|
|
// unban user
|
|
|
|
// ClearBan deletes the ban on message Authors
|
|
|
|
// lol this won't work, they're banned, same with all clear*
|
|
func (m *Message) ClearBan() error {
|
|
return m.sesh.GuildBanDelete(m.serverID, m.authorID)
|
|
}
|
|
|
|
func (m *Message) Mute(username string) error {
|
|
return m.sesh.GuildMemberMute(m.serverID, m.authorID, true)
|
|
}
|
|
|
|
// message attachment details
|
|
type MessageAttachment struct {
|
|
ID string
|
|
URL string
|
|
ProxyURL string
|
|
Filename string
|
|
ContentType string
|
|
Width int
|
|
Height int
|
|
Size int
|
|
DurationSecs float64
|
|
}
|