package discord import ( "context" "jinx/pkg/discord/entities" "jinx/pkg/discord/events" "jinx/pkg/discord/gateway" "jinx/pkg/discord/rest" "github.com/rs/zerolog" ) type Discord struct { token string logger *zerolog.Logger gateway gateway.Gateway eventHandler events.EventHandler rest rest.REST } func New(token string, logger *zerolog.Logger) *Discord { token = "Bot " + token eventHandler := events.NewEventHandler() rest := rest.New(token) gateway := gateway.New(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(events.READY, nil) return nil } func (d *Discord) Disconnect() error { return d.gateway.Close() } func (d *Discord) SendMessage(channelID entities.Snowflake, content string) error { return d.rest.SendMessage(channelID, content) } func (d *Discord) On(eventName events.Event, handler func(payload any)) { d.eventHandler.Add(eventName, handler) }