package discord import ( "context" "github.com/rs/zerolog" ) type Discord struct { token string logger *zerolog.Logger gateway Gateway heartbeat Heartbeat eventHandler EventHandler rest REST } func NewClient(token string, logger *zerolog.Logger) *Discord { token = "Bot " + token eventHandler := NewEventHandler() rest := NewREST(token) gateway := NewGateway(logger, eventHandler) heartbeat := NewHeartbeat(logger, gateway) return &Discord{ token: token, logger: logger, gateway: gateway, heartbeat: heartbeat, 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) if err != nil { return err } hello, err := d.gateway.Hello() if err != nil { return err } d.heartbeat.Start(ctx, hello.HeartbeatInterval) if err = d.gateway.Identify(d.token); err != nil { return err } go d.gateway.Listen() // 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) AddEventHandler(eventName DiscordEvent, handler func(payload any)) { d.eventHandler.Add(eventName, handler) }