discord
Kickside Discord provider — bot-token connection, reply provider, resource discovery, normalized inbound adapter for DM/channel bots, and data-sync source/sink for channel messages.
Run
wippy run kickside/discordkickside/discord
Discord connection provider for Kickside.
It owns:
- a
kickside.connection:connectionbinding for bot-token health checks and resource discovery - a
kickside.connection:reply_providerbinding for sending messages back to Discord channels - a normalized inbound adapter for Discord
MESSAGE_CREATE-style events that callskickside.dm:receive - a polled
kickside.data:pullablesource, published as thechannel_messagesport (kickside.discord.source:channel_messages) backed bykickside.discord.source:messages_source, that pulls a channel's messages on a snowflake cursor — full backfill, edit re-emission viasource_version, deletion propagation via the reconcilepull_keyslisting, and 429s surfaced asretry_after_msfor the engine's pacing - a
kickside.data:writablesink, published as thechannel_messageport (kickside.discord.sink:channel_message) backed bykickside.discord.sink:message_sink, that converges items onto channel messages: post on first delivery (returning the message id asdest_ref), edit in place on redelivery with adest_ref, delete bydest_ref
Known gap: a real-time trigger source over the Discord gateway websocket (a
trigger source port fed by the existing gateway hub) is not implemented yet —
the polled channel_messages port above is the only data-sync entry point. The
source and sink channel_id is a plain form field for now; a shared Discord
channel-picker web component is a follow-up.
Inbound Discord messages are Gateway events, not ordinary webhooks. The gateway
process passes the connection component id and event into
kickside.discord.inbound:receive_message as the system gateway process; DM
resolves the sender from the link and handles thread ownership, idempotency, and
session routing.