package discord import ( "context" "github.com/rs/zerolog" ) type Discord struct { token string logger *zerolog.Logger gateway Gateway eventHandler EventHandler rest REST } func NewClient(token string, logger *zerolog.Logger) *Discord { token = "Bot " + token eventHandler := NewEventHandler() rest := NewREST(token) gateway := NewGateway(logger, eventHandler) return &Discord{ token: token, logger: logger, gateway: gateway, eventHandler: eventHandler, rest: rest, } } func (d *Discord) Connect(ctx context.Context) error { gatewayURL, err := d.rest.Gateway() if err != nil { return err } err = d.gateway.Start(ctx, gatewayURL, d.token) if err != nil { return err } // We are ready! d.eventHandler.Fire(DISCORD_EVENT_READY, nil) return nil } func (d *Discord) Disconnect() error { return d.gateway.Close() } func (d *Discord) SendMessage(channelID Snowflake, content string) error { return d.rest.SendMessage(channelID, content) } func (d *Discord) On(eventName DiscordEvent, handler func(payload any)) { d.eventHandler.Add(eventName, handler) }