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 }