github.com/diamondburned/arikawa/v2@v2.1.0/state/event_dispatcher.go (about)

     1  package state
     2  
     3  import (
     4  	"github.com/diamondburned/arikawa/v2/gateway"
     5  )
     6  
     7  func (s *State) handleReady(ev *gateway.ReadyEvent) {
     8  	s.guildMutex.Lock()
     9  	defer s.guildMutex.Unlock()
    10  
    11  	for _, g := range ev.Guilds {
    12  		s.unreadyGuilds[g.ID] = struct{}{}
    13  	}
    14  }
    15  
    16  func (s *State) handleGuildCreate(ev *gateway.GuildCreateEvent) {
    17  	s.guildMutex.Lock()
    18  
    19  	var derivedEvent interface{}
    20  
    21  	// The guild was previously announced to us in the ready event, and has now
    22  	// become available.
    23  	if _, ok := s.unreadyGuilds[ev.ID]; ok {
    24  		delete(s.unreadyGuilds, ev.ID)
    25  		derivedEvent = &GuildReadyEvent{GuildCreateEvent: ev}
    26  
    27  		// The guild was previously announced as unavailable through a guild
    28  		// delete event, and has now become available again.
    29  	} else if _, ok = s.unavailableGuilds[ev.ID]; ok {
    30  		delete(s.unavailableGuilds, ev.ID)
    31  		derivedEvent = &GuildAvailableEvent{GuildCreateEvent: ev}
    32  
    33  		// We don't know this guild, hence it's new.
    34  	} else {
    35  		derivedEvent = &GuildJoinEvent{GuildCreateEvent: ev}
    36  	}
    37  
    38  	// Unlock here already, so we don't block the mutex if there are
    39  	// long-blocking synchronous handlers.
    40  	s.guildMutex.Unlock()
    41  	s.Handler.Call(derivedEvent)
    42  }
    43  
    44  func (s *State) handleGuildDelete(ev *gateway.GuildDeleteEvent) {
    45  	s.guildMutex.Lock()
    46  
    47  	// store this so we can later dispatch a GuildAvailableEvent, once the
    48  	// guild becomes available again.
    49  	if ev.Unavailable {
    50  		s.unavailableGuilds[ev.ID] = struct{}{}
    51  		s.guildMutex.Unlock()
    52  
    53  		s.Handler.Call(&GuildUnavailableEvent{GuildDeleteEvent: ev})
    54  	} else {
    55  		// Possible scenario requiring this would be leaving the guild while
    56  		// unavailable.
    57  		delete(s.unavailableGuilds, ev.ID)
    58  		s.guildMutex.Unlock()
    59  
    60  		s.Handler.Call(&GuildLeaveEvent{GuildDeleteEvent: ev})
    61  	}
    62  }