Skip to content
Snippets Groups Projects
Select Git revision
  • 98cd6ca7b05e1c762fd29e83563cc9d1620b95b4
  • main default protected
2 results

instance.go

Blame
  • 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]