Select Git revision
instance.go
instance.go 2.73 KiB
package main
import (
"git.randomchars.net/freenitori/log"
"github.com/bwmarrin/discordgo"
"sync"
"time"
)
var (
categoryMap map[string]string
guildMap map[string]string
timeout time.Duration
)
type chatInstance struct {
Initiator *discordgo.Member
Channel *discordgo.Channel
PreviousAction time.Time
Members map[string]bool
sync.RWMutex
}
var (
instancesChannel = make(map[string]*chatInstance)
instancesUser = make(map[string]*chatInstance)
)
// destroy removes the corresponding Discord voice channel of a chatInstance and deletes the instance.
func (c *chatInstance) destroy() {
delete(instancesChannel, c.Channel.ID)
delete(instancesUser, c.Initiator.User.ID)
if _, err := session.ChannelDelete(c.Channel.ID); err != nil {
log.Errorf("Error destroying channel %s initiated by user %s in guild %s, %s",
c.Channel.ID, c.Initiator.User.ID, c.Initiator.GuildID, err)
}
log.Infof("Chat instance with channel %s initiated by user %s#%s (%s) destroyed.",
c.Channel.ID, c.Initiator.User.Username, c.Initiator.User.Discriminator, c.Initiator.User.ID)
}
// actionFree checks if actions are free in chatInstance.
func (c *chatInstance) actionFree() bool {
return c.PreviousAction.Add(timeout).Before(time.Now())
}
// actionRegister registers an action in chatInstance.
func (c *chatInstance) actionRegister() {
c.PreviousAction = time.Now()
}
// newInstance creates a new chatInstance on behalf of a discordgo.Member.
func newInstance(member *discordgo.Member) *chatInstance {
instance := setupInstance(member)
if instance != nil {
instancesChannel[instance.Channel.ID] = instance
instancesUser[instance.Initiator.User.ID] = instance
return instance
}
return nil
}
// setupInstance sets up a new chatInstance on behalf of a discordgo.Member.
func setupInstance(member *discordgo.Member) *chatInstance {
channelID := guildMap[member.GuildID]
if channelID == "" {
log.Debug("Instance setup skipped on empty channel ID.")
return nil
}
parentID := categoryMap[channelID]