← back to Cli Printing Press
feat(press): add Phase 0.7 prediction engine, Discord CLI, 6-artifact pipeline
6775a8629659d361858b76a6117ca92375ef2e92 · 2026-03-26 07:31:42 -0700 · Matt Van Horn
- Add Phase 0.7: Power User Prediction Engine to SKILL.md
- Entity classification (Accumulating/Reference/Append-only/Ephemeral)
- Social signal mining (7 parallel searches)
- Data gravity scoring (Volume+QueryFreq+JoinDemand+SearchNeed+TemporalValue)
- Schema+Sync+Search specification with API validation
- Add artifact writing system: /ce:plan integration with built-in fallback
- 6 comprehensive plan documents per run
- Each phase gate invokes /ce:plan or 200+ line built-in writer
- Add Discord CLI (330 commands, 7 workflow commands, Grade A)
- channel-health, audit-report, member-report, server-snapshot
- message-stats, webhook-test, prune-preview
- Update Phase 4 priorities: data layer first, then workflows
- Add 7 new anti-shortcut rules for prediction engine
- Add discrawl gap analysis and prediction engine plan docs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Files touched
A discord-cli/MakefileA discord-cli/README.mdA discord-cli/cmd/discord-cli/main.goA discord-cli/go.modA discord-cli/go.sumA discord-cli/internal/cache/cache.goA discord-cli/internal/cli/analytics.goA discord-cli/internal/cli/applications.goA discord-cli/internal/cli/applications_activity-instances.goA discord-cli/internal/cli/applications_activity-instances_applications-get.goA discord-cli/internal/cli/applications_attachment.goA discord-cli/internal/cli/applications_attachment_upload-application.goA discord-cli/internal/cli/applications_commands.goA discord-cli/internal/cli/applications_commands_bulk-set-application.goA discord-cli/internal/cli/applications_commands_create-application.goA discord-cli/internal/cli/applications_commands_delete-application.goA discord-cli/internal/cli/applications_commands_get-application.goA discord-cli/internal/cli/applications_commands_list-application.goA discord-cli/internal/cli/applications_commands_update-application.goA discord-cli/internal/cli/applications_emojis.goA discord-cli/internal/cli/applications_emojis_create-application.goA discord-cli/internal/cli/applications_emojis_delete-application.goA discord-cli/internal/cli/applications_emojis_get-application.goA discord-cli/internal/cli/applications_emojis_list-application.goA discord-cli/internal/cli/applications_emojis_update-application.goA discord-cli/internal/cli/applications_entitlements.goA discord-cli/internal/cli/applications_entitlements_consume.goA discord-cli/internal/cli/applications_entitlements_create.goA discord-cli/internal/cli/applications_entitlements_delete.goA discord-cli/internal/cli/applications_entitlements_get-applications.goA discord-cli/internal/cli/applications_entitlements_get.goA discord-cli/internal/cli/applications_get-my.goA discord-cli/internal/cli/applications_get.goA discord-cli/internal/cli/applications_guilds.goA discord-cli/internal/cli/applications_guilds_bulk-set-application-commands.goA discord-cli/internal/cli/applications_guilds_create-application-command.goA discord-cli/internal/cli/applications_guilds_delete-application-command.goA discord-cli/internal/cli/applications_guilds_get-application-command-permissions.goA discord-cli/internal/cli/applications_guilds_get-application-command.goA discord-cli/internal/cli/applications_guilds_list-application-command-permissions.goA discord-cli/internal/cli/applications_guilds_list-application-commands.goA discord-cli/internal/cli/applications_guilds_set-application-command-permissions.goA discord-cli/internal/cli/applications_guilds_update-application-command.goA discord-cli/internal/cli/applications_role-connections.goA discord-cli/internal/cli/applications_role-connections_get-application-metadata.goA discord-cli/internal/cli/applications_role-connections_update-application-metadata.goA discord-cli/internal/cli/applications_update-my.goA discord-cli/internal/cli/applications_update.goA discord-cli/internal/cli/auth.goA discord-cli/internal/cli/channel_workflow.goA discord-cli/internal/cli/channels.goA discord-cli/internal/cli/channels_delete.goA discord-cli/internal/cli/channels_followers.goA discord-cli/internal/cli/channels_followers_follow-channel.goA discord-cli/internal/cli/channels_get.goA discord-cli/internal/cli/channels_invites.goA discord-cli/internal/cli/channels_invites_create-channel.goA discord-cli/internal/cli/channels_invites_list-channel.goA discord-cli/internal/cli/channels_messages.goA discord-cli/internal/cli/channels_messages_add-my-reaction.goA discord-cli/internal/cli/channels_messages_bulk-delete.goA discord-cli/internal/cli/channels_messages_create-pin.goA discord-cli/internal/cli/channels_messages_create-thread-from.goA discord-cli/internal/cli/channels_messages_create.goA discord-cli/internal/cli/channels_messages_crosspost.goA discord-cli/internal/cli/channels_messages_delete-all-reactions-by-emoji.goA discord-cli/internal/cli/channels_messages_delete-all-reactions.goA discord-cli/internal/cli/channels_messages_delete-my-reaction.goA discord-cli/internal/cli/channels_messages_delete-pin.goA discord-cli/internal/cli/channels_messages_delete-user-reaction.goA discord-cli/internal/cli/channels_messages_delete.goA discord-cli/internal/cli/channels_messages_get.goA discord-cli/internal/cli/channels_messages_list-pins.goA discord-cli/internal/cli/channels_messages_list-reactions-by-emoji.goA discord-cli/internal/cli/channels_messages_list.goA discord-cli/internal/cli/channels_messages_update.goA discord-cli/internal/cli/channels_permissions.goA discord-cli/internal/cli/channels_permissions_delete-channel-overwrite.goA discord-cli/internal/cli/channels_permissions_set-channel-overwrite.goA discord-cli/internal/cli/channels_pins.goA discord-cli/internal/cli/channels_pins_deprecated-create.goA discord-cli/internal/cli/channels_pins_deprecated-delete.goA discord-cli/internal/cli/channels_pins_deprecated-list.goA discord-cli/internal/cli/channels_polls.goA discord-cli/internal/cli/channels_polls_expire.goA discord-cli/internal/cli/channels_polls_get-answer-voters.goA discord-cli/internal/cli/channels_recipients.goA discord-cli/internal/cli/channels_recipients_add-group-dm-user.goA discord-cli/internal/cli/channels_recipients_delete-group-dm-user.goA discord-cli/internal/cli/channels_send-soundboard-sound.goA discord-cli/internal/cli/channels_send-soundboard-sound_send_soundboard_sound.goA discord-cli/internal/cli/channels_thread-members.goA discord-cli/internal/cli/channels_thread-members_add.goA discord-cli/internal/cli/channels_thread-members_delete.goA discord-cli/internal/cli/channels_thread-members_get.goA discord-cli/internal/cli/channels_thread-members_join-thread.goA discord-cli/internal/cli/channels_thread-members_leave-thread.goA discord-cli/internal/cli/channels_thread-members_list.goA discord-cli/internal/cli/channels_threads.goA discord-cli/internal/cli/channels_threads_create.goA discord-cli/internal/cli/channels_threads_list-private-archived.goA discord-cli/internal/cli/channels_threads_list-public-archived.goA discord-cli/internal/cli/channels_threads_search.goA discord-cli/internal/cli/channels_typing.goA discord-cli/internal/cli/channels_typing_trigger-indicator.goA discord-cli/internal/cli/channels_update.goA discord-cli/internal/cli/channels_users.goA discord-cli/internal/cli/channels_users_list-my-private-archived-threads.goA discord-cli/internal/cli/channels_webhooks.goA discord-cli/internal/cli/channels_webhooks_create.goA discord-cli/internal/cli/channels_webhooks_list-channel.goA discord-cli/internal/cli/doctor.goA discord-cli/internal/cli/export.goA discord-cli/internal/cli/gateway.goA discord-cli/internal/cli/gateway_get-bot.goA discord-cli/internal/cli/gateway_get.goA discord-cli/internal/cli/guilds.goA discord-cli/internal/cli/guilds_audit-logs.goA discord-cli/internal/cli/guilds_audit-logs_list-guild-entries.goA discord-cli/internal/cli/guilds_auto-moderation.goA discord-cli/internal/cli/guilds_auto-moderation_create-rule.goA discord-cli/internal/cli/guilds_auto-moderation_delete-rule.goA discord-cli/internal/cli/guilds_auto-moderation_get-rule.goA discord-cli/internal/cli/guilds_auto-moderation_list-rules.goA discord-cli/internal/cli/guilds_auto-moderation_update-rule.goA discord-cli/internal/cli/guilds_bans.goA discord-cli/internal/cli/guilds_bans_get-guild.goA discord-cli/internal/cli/guilds_bans_list-guild.goA discord-cli/internal/cli/guilds_bans_unban-user-from-guild.goA discord-cli/internal/cli/guilds_bans_user-from-guild.goA discord-cli/internal/cli/guilds_bulk-ban.goA discord-cli/internal/cli/guilds_bulk-ban_users-from-guild.goA discord-cli/internal/cli/guilds_channels.goA discord-cli/internal/cli/guilds_channels_bulk-update-guild.goA discord-cli/internal/cli/guilds_channels_create-guild.goA discord-cli/internal/cli/guilds_channels_list-guild.goA discord-cli/internal/cli/guilds_emojis.goA discord-cli/internal/cli/guilds_emojis_create-guild.goA discord-cli/internal/cli/guilds_emojis_delete-guild.goA discord-cli/internal/cli/guilds_emojis_get-guild.goA discord-cli/internal/cli/guilds_emojis_list-guild.goA discord-cli/internal/cli/guilds_emojis_update-guild.goA discord-cli/internal/cli/guilds_get-template.goA discord-cli/internal/cli/guilds_get.goA discord-cli/internal/cli/guilds_integrations.goA discord-cli/internal/cli/guilds_integrations_delete-guild.goA discord-cli/internal/cli/guilds_integrations_list-guild.goA discord-cli/internal/cli/guilds_invites.goA discord-cli/internal/cli/guilds_invites_list-guild.goA discord-cli/internal/cli/guilds_members.goA discord-cli/internal/cli/guilds_members_add-guild-role.goA discord-cli/internal/cli/guilds_members_add-guild.goA discord-cli/internal/cli/guilds_members_delete-guild-role.goA discord-cli/internal/cli/guilds_members_delete-guild.goA discord-cli/internal/cli/guilds_members_get-guild.goA discord-cli/internal/cli/guilds_members_list-guild.goA discord-cli/internal/cli/guilds_members_search-guild.goA discord-cli/internal/cli/guilds_members_update-guild.goA discord-cli/internal/cli/guilds_members_update-my-guild.goA discord-cli/internal/cli/guilds_messages.goA discord-cli/internal/cli/guilds_messages_guild-search.goA discord-cli/internal/cli/guilds_new-member-welcome.goA discord-cli/internal/cli/guilds_new-member-welcome_get-guild.goA discord-cli/internal/cli/guilds_onboarding.goA discord-cli/internal/cli/guilds_onboarding_get-guilds.goA discord-cli/internal/cli/guilds_onboarding_put-guilds.goA discord-cli/internal/cli/guilds_preview.goA discord-cli/internal/cli/guilds_preview_get-guild.goA discord-cli/internal/cli/guilds_prune.goA discord-cli/internal/cli/guilds_prune_guild.goA discord-cli/internal/cli/guilds_prune_preview-guild.goA discord-cli/internal/cli/guilds_regions.goA discord-cli/internal/cli/guilds_regions_list-guild-voice.goA discord-cli/internal/cli/guilds_roles.goA discord-cli/internal/cli/guilds_roles_bulk-update-guild.goA discord-cli/internal/cli/guilds_roles_create-guild.goA discord-cli/internal/cli/guilds_roles_delete-guild.goA discord-cli/internal/cli/guilds_roles_get-guild.goA discord-cli/internal/cli/guilds_roles_guild-member-counts.goA discord-cli/internal/cli/guilds_roles_list-guild.goA discord-cli/internal/cli/guilds_roles_update-guild.goA discord-cli/internal/cli/guilds_scheduled-events.goA discord-cli/internal/cli/guilds_scheduled-events_create-guild.goA discord-cli/internal/cli/guilds_scheduled-events_delete-guild.goA discord-cli/internal/cli/guilds_scheduled-events_get-guild.goA discord-cli/internal/cli/guilds_scheduled-events_list-guild-users.goA discord-cli/internal/cli/guilds_scheduled-events_list-guild.goA discord-cli/internal/cli/guilds_scheduled-events_update-guild.goA discord-cli/internal/cli/guilds_soundboard-sounds.goA discord-cli/internal/cli/guilds_soundboard-sounds_create-guild.goA discord-cli/internal/cli/guilds_soundboard-sounds_delete-guild.goA discord-cli/internal/cli/guilds_soundboard-sounds_get-guild.goA discord-cli/internal/cli/guilds_soundboard-sounds_list-guild.goA discord-cli/internal/cli/guilds_soundboard-sounds_update-guild.goA discord-cli/internal/cli/guilds_stickers.goA discord-cli/internal/cli/guilds_stickers_create-guild.goA discord-cli/internal/cli/guilds_stickers_delete-guild.goA discord-cli/internal/cli/guilds_stickers_get-guild.goA discord-cli/internal/cli/guilds_stickers_list-guild.goA discord-cli/internal/cli/guilds_stickers_update-guild.goA discord-cli/internal/cli/guilds_templates.goA discord-cli/internal/cli/guilds_templates_create-guild.goA discord-cli/internal/cli/guilds_templates_delete-guild.goA discord-cli/internal/cli/guilds_templates_list-guild.goA discord-cli/internal/cli/guilds_templates_sync-guild.goA discord-cli/internal/cli/guilds_templates_update-guild.goA discord-cli/internal/cli/guilds_threads.goA discord-cli/internal/cli/guilds_threads_get-active-guild.goA discord-cli/internal/cli/guilds_update.goA discord-cli/internal/cli/guilds_vanity-url.goA discord-cli/internal/cli/guilds_vanity-url_get-guild.goA discord-cli/internal/cli/guilds_voice-states.goA discord-cli/internal/cli/guilds_voice-states_get-self.goA discord-cli/internal/cli/guilds_voice-states_get.goA discord-cli/internal/cli/guilds_voice-states_update-self.goA discord-cli/internal/cli/guilds_voice-states_update.goA discord-cli/internal/cli/guilds_webhooks.goA discord-cli/internal/cli/guilds_webhooks_get-guild.goA discord-cli/internal/cli/guilds_welcome-screen.goA discord-cli/internal/cli/guilds_welcome-screen_get-guild.goA discord-cli/internal/cli/guilds_welcome-screen_update-guild.goA discord-cli/internal/cli/guilds_widget-json.goA discord-cli/internal/cli/guilds_widget-json_get-guild-widget.goA discord-cli/internal/cli/guilds_widget-png.goA discord-cli/internal/cli/guilds_widget-png_get-guild.goA discord-cli/internal/cli/guilds_widget.goA discord-cli/internal/cli/guilds_widget_get-guild-settings.goA discord-cli/internal/cli/guilds_widget_update-guild-settings.goA discord-cli/internal/cli/helpers.goA discord-cli/internal/cli/import.goA discord-cli/internal/cli/interactions.goA discord-cli/internal/cli/interactions_callback.goA discord-cli/internal/cli/interactions_callback_create-interaction-response.goA discord-cli/internal/cli/invites.goA discord-cli/internal/cli/invites_resolve.goA discord-cli/internal/cli/invites_revoke.goA discord-cli/internal/cli/invites_target-users.goA discord-cli/internal/cli/invites_target-users_get-invite-job-status.goA discord-cli/internal/cli/invites_target-users_get-invite.goA discord-cli/internal/cli/invites_target-users_update-invite.goA discord-cli/internal/cli/lobbies.goA discord-cli/internal/cli/lobbies_channel-linking.goA discord-cli/internal/cli/lobbies_channel-linking_edit-lobby-channel-link.goA discord-cli/internal/cli/lobbies_create-lobby.goA discord-cli/internal/cli/lobbies_create-or-join-lobby.goA discord-cli/internal/cli/lobbies_edit-lobby.goA discord-cli/internal/cli/lobbies_get-lobby.goA discord-cli/internal/cli/lobbies_members.goA discord-cli/internal/cli/lobbies_members_add-lobby.goA discord-cli/internal/cli/lobbies_members_bulk-update-lobby.goA discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-self.goA discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-user.goA discord-cli/internal/cli/lobbies_members_delete-lobby.goA discord-cli/internal/cli/lobbies_members_leave-lobby.goA discord-cli/internal/cli/lobbies_messages.goA discord-cli/internal/cli/lobbies_messages_create-lobby.goA discord-cli/internal/cli/lobbies_messages_get-lobby.goA discord-cli/internal/cli/lobbies_messages_update-lobby-external-moderation-metadata.goA discord-cli/internal/cli/oauth2.goA discord-cli/internal/cli/oauth2_get-my-application.goA discord-cli/internal/cli/oauth2_get-my-authorization.goA discord-cli/internal/cli/oauth2_get-openid-connect-userinfo.goA discord-cli/internal/cli/oauth2_get-public-keys.goA discord-cli/internal/cli/partner-sdk.goA discord-cli/internal/cli/partner-sdk_bot-token.goA discord-cli/internal/cli/partner-sdk_bot-unmerge-provisional-account.goA discord-cli/internal/cli/partner-sdk_token.goA discord-cli/internal/cli/partner-sdk_unmerge-provisional-account.goA discord-cli/internal/cli/partner-sdk_update-user-message-external-moderation-metadata.goA discord-cli/internal/cli/root.goA discord-cli/internal/cli/search.goA discord-cli/internal/cli/soundboard-default-sounds.goA discord-cli/internal/cli/soundboard-default-sounds_get.goA discord-cli/internal/cli/stage-instances.goA discord-cli/internal/cli/stage-instances_create.goA discord-cli/internal/cli/stage-instances_delete.goA discord-cli/internal/cli/stage-instances_get.goA discord-cli/internal/cli/stage-instances_update.goA discord-cli/internal/cli/sticker-packs.goA discord-cli/internal/cli/sticker-packs_get.goA discord-cli/internal/cli/sticker-packs_list.goA discord-cli/internal/cli/stickers.goA discord-cli/internal/cli/stickers_get.goA discord-cli/internal/cli/sync.goA discord-cli/internal/cli/tail.goA discord-cli/internal/cli/users.goA discord-cli/internal/cli/users_create-dm.goA discord-cli/internal/cli/users_delete-application-role-connection.goA discord-cli/internal/cli/users_get-application-role-connection.goA discord-cli/internal/cli/users_get-current-application-entitlements.goA discord-cli/internal/cli/users_get-my-guild-member.goA discord-cli/internal/cli/users_get-my.goA discord-cli/internal/cli/users_get.goA discord-cli/internal/cli/users_leave-guild.goA discord-cli/internal/cli/users_list-my-connections.goA discord-cli/internal/cli/users_list-my-guilds.goA discord-cli/internal/cli/users_update-application-role-connection.goA discord-cli/internal/cli/users_update-my.goA discord-cli/internal/cli/voice.goA discord-cli/internal/cli/voice_list-regions.goA discord-cli/internal/cli/webhooks.goA discord-cli/internal/cli/webhooks_delete-by-token.goA discord-cli/internal/cli/webhooks_delete.goA discord-cli/internal/cli/webhooks_execute.goA discord-cli/internal/cli/webhooks_get-by-token.goA discord-cli/internal/cli/webhooks_get.goA discord-cli/internal/cli/webhooks_github.goA discord-cli/internal/cli/webhooks_github_execute-compatible-webhook.goA discord-cli/internal/cli/webhooks_messages.goA discord-cli/internal/cli/webhooks_messages_delete-original-webhook.goA discord-cli/internal/cli/webhooks_messages_delete-webhook.goA discord-cli/internal/cli/webhooks_messages_get-original-webhook.goA discord-cli/internal/cli/webhooks_messages_get-webhook.goA discord-cli/internal/cli/webhooks_messages_update-original-webhook.goA discord-cli/internal/cli/webhooks_messages_update-webhook.goA discord-cli/internal/cli/webhooks_slack.goA discord-cli/internal/cli/webhooks_slack_execute-compatible-webhook.goA discord-cli/internal/cli/webhooks_update-by-token.goA discord-cli/internal/cli/webhooks_update.goA discord-cli/internal/cli/workflow_audit_report.goA discord-cli/internal/cli/workflow_channel_health.goA discord-cli/internal/cli/workflow_member_report.goA discord-cli/internal/cli/workflow_message_stats.goA discord-cli/internal/cli/workflow_prune_preview.goA discord-cli/internal/cli/workflow_server_snapshot.goA discord-cli/internal/cli/workflow_webhook_send.goA discord-cli/internal/client/client.goA discord-cli/internal/config/config.goA discord-cli/internal/store/store.goA discord-cli/internal/types/types.goM docs/plans/2026-03-25-feat-discord-cli-research.mdA docs/plans/2026-03-25-feat-discord-cli-visionary-research.mdM docs/plans/2026-03-25-fix-discord-cli-audit.mdA docs/plans/2026-03-26-feat-discord-cli-vs-discrawl-gap-analysis-plan.mdA docs/plans/2026-03-26-feat-power-user-prediction-engine-plan.mdM skills/printing-press/SKILL.md
Diff
commit 6775a8629659d361858b76a6117ca92375ef2e92
Author: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Date: Thu Mar 26 07:31:42 2026 -0700
feat(press): add Phase 0.7 prediction engine, Discord CLI, 6-artifact pipeline
- Add Phase 0.7: Power User Prediction Engine to SKILL.md
- Entity classification (Accumulating/Reference/Append-only/Ephemeral)
- Social signal mining (7 parallel searches)
- Data gravity scoring (Volume+QueryFreq+JoinDemand+SearchNeed+TemporalValue)
- Schema+Sync+Search specification with API validation
- Add artifact writing system: /ce:plan integration with built-in fallback
- 6 comprehensive plan documents per run
- Each phase gate invokes /ce:plan or 200+ line built-in writer
- Add Discord CLI (330 commands, 7 workflow commands, Grade A)
- channel-health, audit-report, member-report, server-snapshot
- message-stats, webhook-test, prune-preview
- Update Phase 4 priorities: data layer first, then workflows
- Add 7 new anti-shortcut rules for prediction engine
- Add discrawl gap analysis and prediction engine plan docs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---
discord-cli/Makefile | 16 +
discord-cli/README.md | 306 ++
discord-cli/cmd/discord-cli/main.go | 17 +
discord-cli/go.mod | 25 +
discord-cli/go.sum | 59 +
discord-cli/internal/cache/cache.go | 58 +
discord-cli/internal/cli/analytics.go | 136 +
discord-cli/internal/cli/applications.go | 27 +
.../cli/applications_activity-instances.go | 17 +
...ications_activity-instances_applications-get.go | 54 +
.../internal/cli/applications_attachment.go | 17 +
.../applications_attachment_upload-application.go | 71 +
discord-cli/internal/cli/applications_commands.go | 22 +
.../applications_commands_bulk-set-application.go | 65 +
.../applications_commands_create-application.go | 96 +
.../applications_commands_delete-application.go | 53 +
.../cli/applications_commands_get-application.go | 54 +
.../cli/applications_commands_list-application.go | 54 +
.../applications_commands_update-application.go | 93 +
discord-cli/internal/cli/applications_emojis.go | 21 +
.../cli/applications_emojis_create-application.go | 77 +
.../cli/applications_emojis_delete-application.go | 53 +
.../cli/applications_emojis_get-application.go | 54 +
.../cli/applications_emojis_list-application.go | 49 +
.../cli/applications_emojis_update-application.go | 74 +
.../internal/cli/applications_entitlements.go | 21 +
.../cli/applications_entitlements_consume.go | 68 +
.../cli/applications_entitlements_create.go | 82 +
.../cli/applications_entitlements_delete.go | 52 +
.../applications_entitlements_get-applications.go | 53 +
.../internal/cli/applications_entitlements_get.go | 78 +
discord-cli/internal/cli/applications_get-my.go | 46 +
discord-cli/internal/cli/applications_get.go | 49 +
discord-cli/internal/cli/applications_guilds.go | 25 +
...cations_guilds_bulk-set-application-commands.go | 69 +
...plications_guilds_create-application-command.go | 100 +
...plications_guilds_delete-application-command.go | 57 +
...s_guilds_get-application-command-permissions.go | 57 +
.../applications_guilds_get-application-command.go | 58 +
..._guilds_list-application-command-permissions.go | 53 +
...pplications_guilds_list-application-commands.go | 58 +
...s_guilds_set-application-command-permissions.go | 72 +
...plications_guilds_update-application-command.go | 97 +
.../internal/cli/applications_role-connections.go | 18 +
...ns_role-connections_get-application-metadata.go | 50 +
...role-connections_update-application-metadata.go | 65 +
discord-cli/internal/cli/applications_update-my.go | 115 +
discord-cli/internal/cli/applications_update.go | 119 +
discord-cli/internal/cli/auth.go | 250 ++
discord-cli/internal/cli/channel_workflow.go | 209 ++
discord-cli/internal/cli/channels.go | 32 +
discord-cli/internal/cli/channels_delete.go | 48 +
discord-cli/internal/cli/channels_followers.go | 17 +
.../cli/channels_followers_follow-channel.go | 71 +
discord-cli/internal/cli/channels_get.go | 49 +
discord-cli/internal/cli/channels_invites.go | 18 +
.../cli/channels_invites_create-channel.go | 65 +
.../internal/cli/channels_invites_list-channel.go | 50 +
discord-cli/internal/cli/channels_messages.go | 33 +
.../cli/channels_messages_add-my-reaction.go | 72 +
.../internal/cli/channels_messages_bulk-delete.go | 64 +
.../internal/cli/channels_messages_create-pin.go | 68 +
.../cli/channels_messages_create-thread-from.go | 84 +
.../internal/cli/channels_messages_create.go | 113 +
.../internal/cli/channels_messages_crosspost.go | 68 +
...nnels_messages_delete-all-reactions-by-emoji.go | 56 +
.../cli/channels_messages_delete-all-reactions.go | 52 +
.../cli/channels_messages_delete-my-reaction.go | 56 +
.../internal/cli/channels_messages_delete-pin.go | 52 +
.../cli/channels_messages_delete-user-reaction.go | 60 +
.../internal/cli/channels_messages_delete.go | 52 +
discord-cli/internal/cli/channels_messages_get.go | 53 +
.../internal/cli/channels_messages_list-pins.go | 57 +
.../channels_messages_list-reactions-by-emoji.go | 68 +
discord-cli/internal/cli/channels_messages_list.go | 63 +
.../internal/cli/channels_messages_update.go | 83 +
discord-cli/internal/cli/channels_permissions.go | 18 +
...hannels_permissions_delete-channel-overwrite.go | 53 +
.../channels_permissions_set-channel-overwrite.go | 84 +
discord-cli/internal/cli/channels_pins.go | 19 +
.../cli/channels_pins_deprecated-create.go | 69 +
.../cli/channels_pins_deprecated-delete.go | 53 +
.../internal/cli/channels_pins_deprecated-list.go | 50 +
discord-cli/internal/cli/channels_polls.go | 18 +
discord-cli/internal/cli/channels_polls_expire.go | 69 +
.../cli/channels_polls_get-answer-voters.go | 66 +
discord-cli/internal/cli/channels_recipients.go | 18 +
.../cli/channels_recipients_add-group-dm-user.go | 79 +
.../channels_recipients_delete-group-dm-user.go | 53 +
.../internal/cli/channels_send-soundboard-sound.go | 17 +
..._send-soundboard-sound_send_soundboard_sound.go | 76 +
.../internal/cli/channels_thread-members.go | 22 +
.../internal/cli/channels_thread-members_add.go | 69 +
.../internal/cli/channels_thread-members_delete.go | 52 +
.../internal/cli/channels_thread-members_get.go | 58 +
.../cli/channels_thread-members_join-thread.go | 64 +
.../cli/channels_thread-members_leave-thread.go | 48 +
.../internal/cli/channels_thread-members_list.go | 60 +
discord-cli/internal/cli/channels_threads.go | 20 +
.../internal/cli/channels_threads_create.go | 64 +
.../cli/channels_threads_list-private-archived.go | 58 +
.../cli/channels_threads_list-public-archived.go | 57 +
.../internal/cli/channels_threads_search.go | 84 +
discord-cli/internal/cli/channels_typing.go | 17 +
.../cli/channels_typing_trigger-indicator.go | 65 +
discord-cli/internal/cli/channels_update.go | 64 +
discord-cli/internal/cli/channels_users.go | 17 +
...nnels_users_list-my-private-archived-threads.go | 58 +
discord-cli/internal/cli/channels_webhooks.go | 18 +
.../internal/cli/channels_webhooks_create.go | 75 +
.../internal/cli/channels_webhooks_list-channel.go | 50 +
discord-cli/internal/cli/doctor.go | 138 +
discord-cli/internal/cli/export.go | 106 +
discord-cli/internal/cli/gateway.go | 18 +
discord-cli/internal/cli/gateway_get-bot.go | 45 +
discord-cli/internal/cli/gateway_get.go | 46 +
discord-cli/internal/cli/guilds.go | 47 +
discord-cli/internal/cli/guilds_audit-logs.go | 17 +
.../cli/guilds_audit-logs_list-guild-entries.go | 70 +
discord-cli/internal/cli/guilds_auto-moderation.go | 21 +
.../cli/guilds_auto-moderation_create-rule.go | 65 +
.../cli/guilds_auto-moderation_delete-rule.go | 53 +
.../cli/guilds_auto-moderation_get-rule.go | 54 +
.../cli/guilds_auto-moderation_list-rules.go | 49 +
.../cli/guilds_auto-moderation_update-rule.go | 69 +
discord-cli/internal/cli/guilds_bans.go | 20 +
discord-cli/internal/cli/guilds_bans_get-guild.go | 54 +
discord-cli/internal/cli/guilds_bans_list-guild.go | 60 +
.../cli/guilds_bans_unban-user-from-guild.go | 53 +
.../internal/cli/guilds_bans_user-from-guild.go | 79 +
discord-cli/internal/cli/guilds_bulk-ban.go | 17 +
.../cli/guilds_bulk-ban_users-from-guild.go | 70 +
discord-cli/internal/cli/guilds_channels.go | 19 +
.../cli/guilds_channels_bulk-update-guild.go | 65 +
.../internal/cli/guilds_channels_create-guild.go | 151 +
.../internal/cli/guilds_channels_list-guild.go | 50 +
discord-cli/internal/cli/guilds_emojis.go | 21 +
.../internal/cli/guilds_emojis_create-guild.go | 77 +
.../internal/cli/guilds_emojis_delete-guild.go | 53 +
.../internal/cli/guilds_emojis_get-guild.go | 54 +
.../internal/cli/guilds_emojis_list-guild.go | 49 +
.../internal/cli/guilds_emojis_update-guild.go | 74 +
discord-cli/internal/cli/guilds_get-template.go | 49 +
discord-cli/internal/cli/guilds_get.go | 54 +
discord-cli/internal/cli/guilds_integrations.go | 18 +
.../cli/guilds_integrations_delete-guild.go | 53 +
.../internal/cli/guilds_integrations_list-guild.go | 50 +
discord-cli/internal/cli/guilds_invites.go | 17 +
.../internal/cli/guilds_invites_list-guild.go | 50 +
discord-cli/internal/cli/guilds_members.go | 25 +
.../internal/cli/guilds_members_add-guild-role.go | 72 +
.../internal/cli/guilds_members_add-guild.go | 95 +
.../cli/guilds_members_delete-guild-role.go | 56 +
.../internal/cli/guilds_members_delete-guild.go | 53 +
.../internal/cli/guilds_members_get-guild.go | 54 +
.../internal/cli/guilds_members_list-guild.go | 57 +
.../internal/cli/guilds_members_search-guild.go | 58 +
.../internal/cli/guilds_members_update-guild.go | 98 +
.../internal/cli/guilds_members_update-my-guild.go | 84 +
discord-cli/internal/cli/guilds_messages.go | 17 +
.../internal/cli/guilds_messages_guild-search.go | 124 +
.../internal/cli/guilds_new-member-welcome.go | 17 +
.../cli/guilds_new-member-welcome_get-guild.go | 50 +
discord-cli/internal/cli/guilds_onboarding.go | 18 +
.../internal/cli/guilds_onboarding_get-guilds.go | 50 +
.../internal/cli/guilds_onboarding_put-guilds.go | 75 +
discord-cli/internal/cli/guilds_preview.go | 17 +
.../internal/cli/guilds_preview_get-guild.go | 50 +
discord-cli/internal/cli/guilds_prune.go | 18 +
discord-cli/internal/cli/guilds_prune_guild.go | 80 +
.../internal/cli/guilds_prune_preview-guild.go | 60 +
discord-cli/internal/cli/guilds_regions.go | 17 +
.../cli/guilds_regions_list-guild-voice.go | 50 +
discord-cli/internal/cli/guilds_roles.go | 23 +
.../internal/cli/guilds_roles_bulk-update-guild.go | 65 +
.../internal/cli/guilds_roles_create-guild.go | 105 +
.../internal/cli/guilds_roles_delete-guild.go | 53 +
discord-cli/internal/cli/guilds_roles_get-guild.go | 54 +
.../cli/guilds_roles_guild-member-counts.go | 49 +
.../internal/cli/guilds_roles_list-guild.go | 49 +
.../internal/cli/guilds_roles_update-guild.go | 108 +
.../internal/cli/guilds_scheduled-events.go | 22 +
.../cli/guilds_scheduled-events_create-guild.go | 65 +
.../cli/guilds_scheduled-events_delete-guild.go | 53 +
.../cli/guilds_scheduled-events_get-guild.go | 59 +
.../guilds_scheduled-events_list-guild-users.go | 67 +
.../cli/guilds_scheduled-events_list-guild.go | 54 +
.../cli/guilds_scheduled-events_update-guild.go | 69 +
.../internal/cli/guilds_soundboard-sounds.go | 21 +
.../cli/guilds_soundboard-sounds_create-guild.go | 92 +
.../cli/guilds_soundboard-sounds_delete-guild.go | 53 +
.../cli/guilds_soundboard-sounds_get-guild.go | 54 +
.../cli/guilds_soundboard-sounds_list-guild.go | 49 +
.../cli/guilds_soundboard-sounds_update-guild.go | 89 +
discord-cli/internal/cli/guilds_stickers.go | 21 +
.../internal/cli/guilds_stickers_create-guild.go | 88 +
.../internal/cli/guilds_stickers_delete-guild.go | 53 +
.../internal/cli/guilds_stickers_get-guild.go | 54 +
.../internal/cli/guilds_stickers_list-guild.go | 49 +
.../internal/cli/guilds_stickers_update-guild.go | 84 +
discord-cli/internal/cli/guilds_templates.go | 21 +
.../internal/cli/guilds_templates_create-guild.go | 76 +
.../internal/cli/guilds_templates_delete-guild.go | 53 +
.../internal/cli/guilds_templates_list-guild.go | 50 +
.../internal/cli/guilds_templates_sync-guild.go | 69 +
.../internal/cli/guilds_templates_update-guild.go | 78 +
discord-cli/internal/cli/guilds_threads.go | 17 +
.../cli/guilds_threads_get-active-guild.go | 50 +
discord-cli/internal/cli/guilds_update.go | 164 +
discord-cli/internal/cli/guilds_vanity-url.go | 17 +
.../internal/cli/guilds_vanity-url_get-guild.go | 50 +
discord-cli/internal/cli/guilds_voice-states.go | 20 +
.../internal/cli/guilds_voice-states_get-self.go | 49 +
.../internal/cli/guilds_voice-states_get.go | 53 +
.../cli/guilds_voice-states_update-self.go | 79 +
.../internal/cli/guilds_voice-states_update.go | 78 +
discord-cli/internal/cli/guilds_webhooks.go | 17 +
.../internal/cli/guilds_webhooks_get-guild.go | 50 +
discord-cli/internal/cli/guilds_welcome-screen.go | 18 +
.../cli/guilds_welcome-screen_get-guild.go | 50 +
.../cli/guilds_welcome-screen_update-guild.go | 75 +
discord-cli/internal/cli/guilds_widget-json.go | 17 +
.../cli/guilds_widget-json_get-guild-widget.go | 50 +
discord-cli/internal/cli/guilds_widget-png.go | 17 +
.../internal/cli/guilds_widget-png_get-guild.go | 55 +
discord-cli/internal/cli/guilds_widget.go | 18 +
.../cli/guilds_widget_get-guild-settings.go | 50 +
.../cli/guilds_widget_update-guild-settings.go | 75 +
discord-cli/internal/cli/helpers.go | 385 ++
discord-cli/internal/cli/import.go | 100 +
discord-cli/internal/cli/interactions.go | 17 +
discord-cli/internal/cli/interactions_callback.go | 17 +
...actions_callback_create-interaction-response.go | 71 +
discord-cli/internal/cli/invites.go | 19 +
discord-cli/internal/cli/invites_resolve.go | 60 +
discord-cli/internal/cli/invites_revoke.go | 49 +
discord-cli/internal/cli/invites_target-users.go | 19 +
.../invites_target-users_get-invite-job-status.go | 49 +
.../cli/invites_target-users_get-invite.go | 50 +
.../cli/invites_target-users_update-invite.go | 71 +
discord-cli/internal/cli/lobbies.go | 23 +
.../internal/cli/lobbies_channel-linking.go | 17 +
...bies_channel-linking_edit-lobby-channel-link.go | 70 +
discord-cli/internal/cli/lobbies_create-lobby.go | 76 +
.../internal/cli/lobbies_create-or-join-lobby.go | 77 +
discord-cli/internal/cli/lobbies_edit-lobby.go | 79 +
discord-cli/internal/cli/lobbies_get-lobby.go | 50 +
discord-cli/internal/cli/lobbies_members.go | 22 +
.../internal/cli/lobbies_members_add-lobby.go | 74 +
.../cli/lobbies_members_bulk-update-lobby.go | 65 +
...rs_create-linked-lobby-guild-invite-for-self.go | 64 +
...rs_create-linked-lobby-guild-invite-for-user.go | 68 +
.../internal/cli/lobbies_members_delete-lobby.go | 53 +
.../internal/cli/lobbies_members_leave-lobby.go | 48 +
discord-cli/internal/cli/lobbies_messages.go | 19 +
.../internal/cli/lobbies_messages_create-lobby.go | 110 +
.../internal/cli/lobbies_messages_get-lobby.go | 55 +
...es_update-lobby-external-moderation-metadata.go | 69 +
discord-cli/internal/cli/oauth2.go | 20 +
.../internal/cli/oauth2_get-my-application.go | 46 +
.../internal/cli/oauth2_get-my-authorization.go | 45 +
.../cli/oauth2_get-openid-connect-userinfo.go | 45 +
discord-cli/internal/cli/oauth2_get-public-keys.go | 45 +
discord-cli/internal/cli/partner-sdk.go | 21 +
discord-cli/internal/cli/partner-sdk_bot-token.go | 72 +
.../partner-sdk_bot-unmerge-provisional-account.go | 66 +
discord-cli/internal/cli/partner-sdk_token.go | 83 +
.../cli/partner-sdk_unmerge-provisional-account.go | 83 +
...te-user-message-external-moderation-metadata.go | 73 +
discord-cli/internal/cli/root.go | 145 +
discord-cli/internal/cli/search.go | 77 +
.../internal/cli/soundboard-default-sounds.go | 17 +
.../internal/cli/soundboard-default-sounds_get.go | 46 +
discord-cli/internal/cli/stage-instances.go | 20 +
discord-cli/internal/cli/stage-instances_create.go | 87 +
discord-cli/internal/cli/stage-instances_delete.go | 48 +
discord-cli/internal/cli/stage-instances_get.go | 49 +
discord-cli/internal/cli/stage-instances_update.go | 74 +
discord-cli/internal/cli/sticker-packs.go | 18 +
discord-cli/internal/cli/sticker-packs_get.go | 49 +
discord-cli/internal/cli/sticker-packs_list.go | 45 +
discord-cli/internal/cli/stickers.go | 17 +
discord-cli/internal/cli/stickers_get.go | 49 +
discord-cli/internal/cli/sync.go | 128 +
discord-cli/internal/cli/tail.go | 117 +
discord-cli/internal/cli/users.go | 28 +
discord-cli/internal/cli/users_create-dm.go | 66 +
.../users_delete-application-role-connection.go | 49 +
.../cli/users_get-application-role-connection.go | 49 +
.../users_get-current-application-entitlements.go | 59 +
.../internal/cli/users_get-my-guild-member.go | 49 +
discord-cli/internal/cli/users_get-my.go | 46 +
discord-cli/internal/cli/users_get.go | 49 +
discord-cli/internal/cli/users_leave-guild.go | 48 +
.../internal/cli/users_list-my-connections.go | 45 +
discord-cli/internal/cli/users_list-my-guilds.go | 59 +
.../users_update-application-role-connection.go | 75 +
discord-cli/internal/cli/users_update-my.go | 76 +
discord-cli/internal/cli/voice.go | 17 +
discord-cli/internal/cli/voice_list-regions.go | 46 +
discord-cli/internal/cli/webhooks.go | 26 +
.../internal/cli/webhooks_delete-by-token.go | 52 +
discord-cli/internal/cli/webhooks_delete.go | 48 +
discord-cli/internal/cli/webhooks_execute.go | 75 +
discord-cli/internal/cli/webhooks_get-by-token.go | 53 +
discord-cli/internal/cli/webhooks_get.go | 49 +
discord-cli/internal/cli/webhooks_github.go | 17 +
.../webhooks_github_execute-compatible-webhook.go | 163 +
discord-cli/internal/cli/webhooks_messages.go | 22 +
.../webhooks_messages_delete-original-webhook.go | 55 +
.../cli/webhooks_messages_delete-webhook.go | 58 +
.../cli/webhooks_messages_get-original-webhook.go | 59 +
.../internal/cli/webhooks_messages_get-webhook.go | 62 +
.../webhooks_messages_update-original-webhook.go | 93 +
.../cli/webhooks_messages_update-webhook.go | 96 +
discord-cli/internal/cli/webhooks_slack.go | 17 +
.../webhooks_slack_execute-compatible-webhook.go | 88 +
.../internal/cli/webhooks_update-by-token.go | 78 +
discord-cli/internal/cli/webhooks_update.go | 79 +
discord-cli/internal/cli/workflow_audit_report.go | 139 +
.../internal/cli/workflow_channel_health.go | 167 +
discord-cli/internal/cli/workflow_member_report.go | 134 +
discord-cli/internal/cli/workflow_message_stats.go | 173 +
discord-cli/internal/cli/workflow_prune_preview.go | 90 +
.../internal/cli/workflow_server_snapshot.go | 110 +
discord-cli/internal/cli/workflow_webhook_send.go | 68 +
discord-cli/internal/client/client.go | 346 ++
discord-cli/internal/config/config.go | 104 +
discord-cli/internal/store/store.go | 277 ++
discord-cli/internal/types/types.go | 3877 ++++++++++++++++++++
docs/plans/2026-03-25-feat-discord-cli-research.md | 74 +-
...26-03-25-feat-discord-cli-visionary-research.md | 69 +
docs/plans/2026-03-25-fix-discord-cli-audit.md | 124 +-
...at-discord-cli-vs-discrawl-gap-analysis-plan.md | 318 ++
...03-26-feat-power-user-prediction-engine-plan.md | 620 ++++
skills/printing-press/SKILL.md | 316 +-
336 files changed, 25502 insertions(+), 109 deletions(-)
diff --git a/discord-cli/Makefile b/discord-cli/Makefile
new file mode 100644
index 00000000..4c06a1a4
--- /dev/null
+++ b/discord-cli/Makefile
@@ -0,0 +1,16 @@
+.PHONY: build test lint install clean
+
+build:
+ go build -o bin/discord-cli ./cmd/discord-cli
+
+test:
+ go test ./...
+
+lint:
+ golangci-lint run
+
+install:
+ go install ./cmd/discord-cli
+
+clean:
+ rm -rf bin/
diff --git a/discord-cli/README.md b/discord-cli/README.md
new file mode 100644
index 00000000..9196327b
--- /dev/null
+++ b/discord-cli/README.md
@@ -0,0 +1,306 @@
+# discord-cli
+
+Manage Discord servers, channels, messages, roles, and more from your terminal. Built for bot developers, server admins, and AI agents.
+
+## Install
+
+### Homebrew
+
+```
+brew install USER/tap/discord-cli
+```
+
+### Go
+
+```
+go install github.com/USER/discord-cli/cmd/discord-cli@latest
+```
+
+### Binary
+
+Download from [Releases](https://github.com/USER/discord-cli/releases).
+
+## Quick Start
+
+```bash
+# 1. Set your bot token
+export DISCORD_TOKEN="Bot YOUR_BOT_TOKEN_HERE"
+
+# 2. Verify everything works
+discord-cli doctor
+
+# 3. List your guilds (servers)
+discord-cli users list-my-guilds --json
+
+# 4. List channels in a guild
+discord-cli guilds channels list-guild 123456789012345678 --json
+```
+
+## Workflow Commands
+
+These compound commands combine multiple API calls into single operations. They're the reason this CLI exists - not just an API wrapper.
+
+### channel-health
+
+Detect stale channels and show activity trends across a guild.
+
+```bash
+# Find inactive channels (no messages in 30 days)
+discord-cli workflow channel-health --guild 123456789012345678
+
+# Custom staleness threshold
+discord-cli workflow channel-health --guild 123456789012345678 --days 14 --json
+```
+
+### audit-report
+
+Analyze audit log entries grouped by action type and user.
+
+```bash
+# Full audit report
+discord-cli workflow audit-report --guild 123456789012345678
+
+# Filter by action type (22 = MEMBER_BAN_ADD)
+discord-cli workflow audit-report --guild 123456789012345678 --action 22 --json
+```
+
+### member-report
+
+Analyze member roles, join dates, and composition across a guild.
+
+```bash
+# Member report with role distribution
+discord-cli workflow member-report --guild 123456789012345678
+
+# Fetch more members
+discord-cli workflow member-report --guild 123456789012345678 --max 500 --json
+```
+
+### server-snapshot
+
+Backup guild configuration (roles, channels, emojis) to JSON.
+
+```bash
+# Backup to file
+discord-cli workflow server-snapshot --guild 123456789012345678 -o backup.json
+
+# Backup to stdout
+discord-cli workflow server-snapshot --guild 123456789012345678 --json
+```
+
+### message-stats
+
+Show message volume and top contributors for a channel or guild.
+
+```bash
+# Stats for a specific channel
+discord-cli workflow message-stats --channel 123456789012345678 --limit 100
+
+# Stats across all channels in a guild
+discord-cli workflow message-stats --guild 123456789012345678 --json
+```
+
+### prune-preview
+
+Preview how many members would be pruned without executing.
+
+```bash
+# Preview 7-day prune (never modifies the guild)
+discord-cli workflow prune-preview --guild 123456789012345678 --days 7
+```
+
+### webhook-test
+
+Send a test payload to a Discord webhook.
+
+```bash
+# Simple test message
+discord-cli workflow webhook-test --id 123456789012345678 --token abcdef123456 --message "Hello from CLI!"
+
+# Rich embed via stdin
+echo '{"content":"Deploy alert","embeds":[{"title":"Build #42","color":3066993}]}' | discord-cli workflow webhook-test --id 123456789012345678 --token abcdef123456 --stdin
+```
+
+## API Commands
+
+### channels
+
+Manage Discord channels, messages, threads, pins, and permissions.
+
+```bash
+# Get channel details
+discord-cli channels get 123456789012345678
+
+# List messages
+discord-cli channels messages list 123456789012345678 --limit 25 --json
+
+# Send a message
+discord-cli channels messages create 123456789012345678 --content "Hello, world!"
+
+# Send a rich message with embeds
+echo '{"content":"Announcement","embeds":[{"title":"v2.0 Released","description":"Check out the new features","color":5814783}]}' | discord-cli channels messages create 123456789012345678 --stdin
+
+# Pin a message
+discord-cli channels pins pin 123456789012345678 987654321098765432
+
+# Create a thread
+echo '{"name":"Bug Discussion","auto_archive_duration":1440}' | discord-cli channels threads create 123456789012345678 --stdin
+```
+
+### guilds
+
+Manage guilds (servers) - members, roles, bans, channels, audit logs, and more.
+
+```bash
+# Get guild details
+discord-cli guilds get 123456789012345678 --json
+
+# List members
+discord-cli guilds members list 123456789012345678 --limit 100 --json
+
+# List roles
+discord-cli guilds roles list-guild 123456789012345678 --json
+
+# Ban a user
+discord-cli guilds bans user-from-guild 123456789012345678 987654321098765432
+
+# List audit log
+discord-cli guilds audit-logs list-guild-entries 123456789012345678 --json
+
+# Create a channel
+echo '{"name":"new-channel","type":0,"permission_overwrites":[{"id":"ROLE_ID","type":0,"allow":"1024"}]}' | discord-cli guilds channels create-guild 123456789012345678 --stdin
+```
+
+### webhooks
+
+```bash
+# Get webhook details
+discord-cli webhooks get 123456789012345678
+
+# Execute a webhook
+echo '{"content":"Build passed!","embeds":[{"title":"CI/CD","color":3066993}]}' | discord-cli webhooks execute 123456789012345678 TOKEN --stdin
+```
+
+### users
+
+```bash
+# Get current user
+discord-cli users get-my --json
+
+# List guilds you're in
+discord-cli users list-my-guilds --json
+
+# Get a user by ID
+discord-cli users get 123456789012345678 --json
+```
+
+## Local Sync and Search
+
+Sync messages to a local SQLite database for instant full-text search without API calls.
+
+```bash
+# Sync all resources
+discord-cli sync
+
+# Full-text search across synced data
+discord-cli search "error timeout" --json
+
+# Follow new messages (tail -f for Discord)
+discord-cli tail messages --interval 5s
+
+# Export messages to JSONL
+discord-cli export messages --format jsonl --output messages.jsonl
+
+# Analytics on synced data
+discord-cli analytics --type messages --group-by channel_id
+```
+
+## Output Formats
+
+```bash
+# Human-readable table (default)
+discord-cli guilds roles list-guild 123456789012345678
+
+# JSON for scripting and agents
+discord-cli guilds roles list-guild 123456789012345678 --json
+
+# Filter specific fields
+discord-cli guilds roles list-guild 123456789012345678 --json --select id,name,color
+
+# Plain tab-separated for piping
+discord-cli guilds members list 123456789012345678 --plain
+
+# Dry run (show request without sending)
+discord-cli guilds bans user-from-guild 123456789012345678 USER_ID --dry-run
+```
+
+## Agent Usage
+
+This CLI is designed for AI agent consumption:
+
+- **Non-interactive** - never prompts, every input is a flag
+- **Pipeable** - `--json` output to stdout, errors to stderr
+- **Filterable** - `--select id,name` returns only fields you need
+- **Previewable** - `--dry-run` shows the request without sending
+- **Retryable** - creates return "already exists" on retry, deletes return "already deleted"
+- **Confirmable** - `--yes` for explicit confirmation of destructive actions
+- **Piped input** - `echo '{"key":"value"}' | discord-cli <resource> create --stdin`
+- **Cacheable** - GET responses cached for 5 minutes, bypass with `--no-cache`
+- **Agent-safe by default** - no colors or formatting unless `--human-friendly` is set
+- **Progress events** - paginated commands emit NDJSON events to stderr in default mode
+
+Exit codes: `0` success, `2` usage error, `3` not found, `4` auth error, `5` API error, `7` rate limited, `10` config error.
+
+## Doctor
+
+```bash
+discord-cli doctor
+```
+
+Validates your bot token, API connectivity, and configuration.
+
+## Configuration
+
+Config file: `~/.config/discord-cli/config.toml`
+
+Environment variables:
+- `DISCORD_TOKEN` - Bot token (format: `Bot YOUR_TOKEN`)
+
+## FAQ
+
+**How do I get a bot token?**
+1. Go to [Discord Developer Portal](https://discord.com/developers/applications)
+2. Create an application
+3. Go to Bot section, click "Reset Token"
+4. Copy the token and set `DISCORD_TOKEN="Bot YOUR_TOKEN"`
+
+**What permissions does my bot need?**
+It depends on what you want to do. For read-only operations (list channels, messages), the bot needs basic permissions. For management (bans, role changes), it needs admin permissions. Check Discord's [permission calculator](https://discord.com/developers/docs/topics/permissions).
+
+**Can I use a user token?**
+This CLI is designed for bot tokens (TOS-compliant). User tokens may work but violate Discord's Terms of Service and risk account suspension.
+
+**How does rate limiting work?**
+The CLI automatically handles Discord's per-route rate limits with retry + exponential backoff. If you see `exit code 7`, you're being rate-limited - wait a few minutes.
+
+**Where is the local database stored?**
+`~/.local/share/discord-cli/data.db` (SQLite). Use `--db` flag to specify a custom path.
+
+## Troubleshooting
+
+**Authentication errors (exit code 4)**
+- Run `discord-cli doctor` to check credentials
+- Verify the environment variable: `echo $DISCORD_TOKEN`
+- Make sure the format is `Bot YOUR_TOKEN` (with the "Bot " prefix)
+
+**Not found errors (exit code 3)**
+- Check the resource ID is correct (use Developer Mode in Discord to copy IDs)
+- Run the `list` command to see available items
+
+**Rate limit errors (exit code 7)**
+- The CLI auto-retries with exponential backoff
+- If persistent, wait a few minutes and try again
+
+---
+
+Generated by [CLI Printing Press](https://github.com/mvanhorn/cli-printing-press)
diff --git a/discord-cli/cmd/discord-cli/main.go b/discord-cli/cmd/discord-cli/main.go
new file mode 100644
index 00000000..56550b04
--- /dev/null
+++ b/discord-cli/cmd/discord-cli/main.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/USER/discord-cli/internal/cli"
+)
+
+func main() {
+ if err := cli.Execute(); err != nil {
+ fmt.Fprintln(os.Stderr, err.Error())
+ os.Exit(cli.ExitCode(err))
+ }
+}
diff --git a/discord-cli/go.mod b/discord-cli/go.mod
new file mode 100644
index 00000000..0cdd3357
--- /dev/null
+++ b/discord-cli/go.mod
@@ -0,0 +1,25 @@
+module github.com/USER/discord-cli
+
+go 1.23.0
+
+require (
+ github.com/mattn/go-isatty v0.0.20
+ github.com/pelletier/go-toml/v2 v2.2.4
+ github.com/spf13/cobra v1.9.1
+)
+
+require modernc.org/sqlite v1.37.0
+
+require (
+ github.com/dustin/go-humanize v1.0.1 // indirect
+ github.com/google/uuid v1.6.0 // indirect
+ github.com/inconshreveable/mousetrap v1.1.0 // indirect
+ github.com/ncruces/go-strftime v0.1.9 // indirect
+ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
+ github.com/spf13/pflag v1.0.6 // indirect
+ golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect
+ golang.org/x/sys v0.31.0 // indirect
+ modernc.org/libc v1.62.1 // indirect
+ modernc.org/mathutil v1.7.1 // indirect
+ modernc.org/memory v1.9.1 // indirect
+)
diff --git a/discord-cli/go.sum b/discord-cli/go.sum
new file mode 100644
index 00000000..9c8f1377
--- /dev/null
+++ b/discord-cli/go.sum
@@ -0,0 +1,59 @@
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
+github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
+github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
+github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
+github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
+github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
+github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
+github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
+github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
+golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
+golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
+golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
+golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
+golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+modernc.org/cc/v4 v4.25.2 h1:T2oH7sZdGvTaie0BRNFbIYsabzCxUQg8nLqCdQ2i0ic=
+modernc.org/cc/v4 v4.25.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
+modernc.org/ccgo/v4 v4.25.1 h1:TFSzPrAGmDsdnhT9X2UrcPMI3N/mJ9/X9ykKXwLhDsU=
+modernc.org/ccgo/v4 v4.25.1/go.mod h1:njjuAYiPflywOOrm3B7kCB444ONP5pAVr8PIEoE0uDw=
+modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
+modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
+modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
+modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
+modernc.org/libc v1.62.1 h1:s0+fv5E3FymN8eJVmnk0llBe6rOxCu/DEU+XygRbS8s=
+modernc.org/libc v1.62.1/go.mod h1:iXhATfJQLjG3NWy56a6WVU73lWOcdYVxsvwCgoPljuo=
+modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
+modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
+modernc.org/memory v1.9.1 h1:V/Z1solwAVmMW1yttq3nDdZPJqV1rM05Ccq6KMSZ34g=
+modernc.org/memory v1.9.1/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
+modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
+modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
+modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
+modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
+modernc.org/sqlite v1.37.0 h1:s1TMe7T3Q3ovQiK2Ouz4Jwh7dw4ZDqbebSDTlSJdfjI=
+modernc.org/sqlite v1.37.0/go.mod h1:5YiWv+YviqGMuGw4V+PNplcyaJ5v+vQd7TQOgkACoJM=
+modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
+modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
+modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
+modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
diff --git a/discord-cli/internal/cache/cache.go b/discord-cli/internal/cache/cache.go
new file mode 100644
index 00000000..ff4e2d6a
--- /dev/null
+++ b/discord-cli/internal/cache/cache.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+// Package cache provides a file-based response cache with optional embedded database backend.
+// The default implementation stores JSON responses as flat files in ~/.cache/<cli>/ with a TTL.
+// For higher-throughput or concurrent-write scenarios, replace the file backend with an
+// embedded database such as bolt (go.etcd.io/bbolt), badger (github.com/dgraph-io/badger),
+// or sqlite (modernc.org/sqlite).
+package cache
+
+import (
+ "crypto/sha256"
+ "encoding/hex"
+ "encoding/json"
+ "os"
+ "path/filepath"
+ "time"
+)
+
+// Store is a key-value cache backed by the filesystem.
+type Store struct {
+ Dir string
+ TTL time.Duration
+}
+
+// New creates a file-based cache store.
+func New(dir string, ttl time.Duration) *Store {
+ return &Store{Dir: dir, TTL: ttl}
+}
+
+// Get retrieves a cached value. Returns nil if not found or expired.
+func (s *Store) Get(key string) (json.RawMessage, bool) {
+ path := s.path(key)
+ info, err := os.Stat(path)
+ if err != nil || time.Since(info.ModTime()) > s.TTL {
+ return nil, false
+ }
+ data, err := os.ReadFile(path)
+ if err != nil {
+ return nil, false
+ }
+ return json.RawMessage(data), true
+}
+
+// Set stores a value in the cache.
+func (s *Store) Set(key string, value json.RawMessage) {
+ _ = os.MkdirAll(s.Dir, 0o755)
+ _ = os.WriteFile(s.path(key), []byte(value), 0o644)
+}
+
+// Clear removes all cached entries.
+func (s *Store) Clear() error {
+ return os.RemoveAll(s.Dir)
+}
+
+func (s *Store) path(key string) string {
+ h := sha256.Sum256([]byte(key))
+ return filepath.Join(s.Dir, hex.EncodeToString(h[:8])+".json")
+}
diff --git a/discord-cli/internal/cli/analytics.go b/discord-cli/internal/cli/analytics.go
new file mode 100644
index 00000000..75dc95bb
--- /dev/null
+++ b/discord-cli/internal/cli/analytics.go
@@ -0,0 +1,136 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "path/filepath"
+ "sort"
+
+ "github.com/USER/discord-cli/internal/store"
+ "github.com/spf13/cobra"
+)
+
+func newAnalyticsCmd(flags *rootFlags) *cobra.Command {
+ var resourceType string
+ var groupBy string
+ var dbPath string
+ var limit int
+
+ cmd := &cobra.Command{
+ Use: "analytics",
+ Short: "Run analytics queries on locally synced data",
+ Long: `Analyze locally synced data with count, group-by, and summary operations.
+Data must be synced first with the sync command.`,
+ Example: ` # Count records by type
+ discord-cli analytics --type messages
+
+ # Group by a field
+ discord-cli analytics --type messages --group-by author_id
+
+ # Top 10 most frequent values
+ discord-cli analytics --type messages --group-by channel_id --limit 10 --json`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ if dbPath == "" {
+ home, _ := os.UserHomeDir()
+ dbPath = filepath.Join(home, ".local", "share", "discord-cli", "data.db")
+ }
+
+ db, err := store.Open(dbPath)
+ if err != nil {
+ return fmt.Errorf("opening local database: %w\nRun 'discord-cli sync' first.", err)
+ }
+ defer db.Close()
+
+ if resourceType == "" {
+ // Show summary of all resource types
+ status, err := db.Status()
+ if err != nil {
+ return fmt.Errorf("getting status: %w", err)
+ }
+ if flags.asJSON {
+ enc := json.NewEncoder(os.Stdout)
+ enc.SetIndent("", " ")
+ return enc.Encode(status)
+ }
+ fmt.Println("Resource Type\tCount")
+ fmt.Println("-------------\t-----")
+ for rt, count := range status {
+ fmt.Printf("%s\t%d\n", rt, count)
+ }
+ return nil
+ }
+
+ if groupBy != "" {
+ return runGroupBy(db, resourceType, groupBy, limit, flags)
+ }
+
+ count, err := db.Count(resourceType)
+ if err != nil {
+ return fmt.Errorf("counting: %w", err)
+ }
+
+ if flags.asJSON {
+ result := map[string]any{"resource_type": resourceType, "count": count}
+ enc := json.NewEncoder(os.Stdout)
+ enc.SetIndent("", " ")
+ return enc.Encode(result)
+ }
+
+ fmt.Printf("%s: %d records\n", resourceType, count)
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&resourceType, "type", "", "Resource type to analyze")
+ cmd.Flags().StringVar(&groupBy, "group-by", "", "Field to group by")
+ cmd.Flags().StringVar(&dbPath, "db", "", "Database path")
+ cmd.Flags().IntVar(&limit, "limit", 25, "Max groups to show")
+
+ return cmd
+}
+
+func runGroupBy(db *store.Store, resourceType, field string, limit int, flags *rootFlags) error {
+ items, err := db.List(resourceType, 0)
+ if err != nil {
+ return err
+ }
+
+ counts := make(map[string]int)
+ for _, item := range items {
+ var obj map[string]any
+ if err := json.Unmarshal(item, &obj); err != nil {
+ continue
+ }
+ val := fmt.Sprintf("%v", obj[field])
+ counts[val]++
+ }
+
+ type kv struct {
+ Key string `json:"value"`
+ Count int `json:"count"`
+ }
+ var sorted []kv
+ for k, v := range counts {
+ sorted = append(sorted, kv{k, v})
+ }
+ sort.Slice(sorted, func(i, j int) bool { return sorted[i].Count > sorted[j].Count })
+ if limit > 0 && len(sorted) > limit {
+ sorted = sorted[:limit]
+ }
+
+ if flags.asJSON {
+ enc := json.NewEncoder(os.Stdout)
+ enc.SetIndent("", " ")
+ return enc.Encode(sorted)
+ }
+
+ fmt.Printf("%s\tCount\n", field)
+ fmt.Println("---\t-----")
+ for _, kv := range sorted {
+ fmt.Printf("%s\t%d\n", kv.Key, kv.Count)
+ }
+ return nil
+}
diff --git a/discord-cli/internal/cli/applications.go b/discord-cli/internal/cli/applications.go
new file mode 100644
index 00000000..68b24a40
--- /dev/null
+++ b/discord-cli/internal/cli/applications.go
@@ -0,0 +1,27 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newApplicationsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "applications",
+ Short: "Manage applications",
+ }
+
+ cmd.AddCommand(newApplicationsGetCmd(flags))
+ cmd.AddCommand(newApplicationsGetMyCmd(flags))
+ cmd.AddCommand(newApplicationsUpdateCmd(flags))
+ cmd.AddCommand(newApplicationsUpdateMyCmd(flags))
+ cmd.AddCommand(newApplicationsActivityInstancesCmd(flags))
+ cmd.AddCommand(newApplicationsAttachmentCmd(flags))
+ cmd.AddCommand(newApplicationsCommandsCmd(flags))
+ cmd.AddCommand(newApplicationsEmojisCmd(flags))
+ cmd.AddCommand(newApplicationsEntitlementsCmd(flags))
+ cmd.AddCommand(newApplicationsGuildsCmd(flags))
+ cmd.AddCommand(newApplicationsRoleConnectionsCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_activity-instances.go b/discord-cli/internal/cli/applications_activity-instances.go
new file mode 100644
index 00000000..12c6ac1d
--- /dev/null
+++ b/discord-cli/internal/cli/applications_activity-instances.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newApplicationsActivityInstancesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "activity-instances",
+ Short: "Manage activity instances",
+ }
+
+ cmd.AddCommand(newApplicationsActivityInstancesApplicationsGetCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_activity-instances_applications-get.go b/discord-cli/internal/cli/applications_activity-instances_applications-get.go
new file mode 100644
index 00000000..e198294f
--- /dev/null
+++ b/discord-cli/internal/cli/applications_activity-instances_applications-get.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsActivityInstancesApplicationsGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "applications-get <application_id> <instance_id>",
+ Aliases: []string{"get"},
+ Short: "Applications get",
+ Example: " discord-cli applications activity-instances applications-get abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/activity-instances/{instance_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("instance_id is required"))
+ }
+ path = replacePathParam(path, "instance_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_attachment.go b/discord-cli/internal/cli/applications_attachment.go
new file mode 100644
index 00000000..2640e1e6
--- /dev/null
+++ b/discord-cli/internal/cli/applications_attachment.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newApplicationsAttachmentCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "attachment",
+ Short: "Manage attachment",
+ }
+
+ cmd.AddCommand(newApplicationsAttachmentUploadApplicationCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_attachment_upload-application.go b/discord-cli/internal/cli/applications_attachment_upload-application.go
new file mode 100644
index 00000000..236a9221
--- /dev/null
+++ b/discord-cli/internal/cli/applications_attachment_upload-application.go
@@ -0,0 +1,71 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsAttachmentUploadApplicationCmd(flags *rootFlags) *cobra.Command {
+ var bodyFile string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "upload-application <application_id>",
+ Aliases: []string{"create"},
+ Short: "Upload application",
+ Example: " discord-cli applications attachment upload-application abc123 --file value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/attachment"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyFile != "" {
+ body["file"] = bodyFile
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyFile, "file", "", "File")
+ _ = cmd.MarkFlagRequired("file")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands.go b/discord-cli/internal/cli/applications_commands.go
new file mode 100644
index 00000000..4ca9f7ad
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands.go
@@ -0,0 +1,22 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newApplicationsCommandsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "commands",
+ Short: "Manage commands",
+ }
+
+ cmd.AddCommand(newApplicationsCommandsBulkSetApplicationCmd(flags))
+ cmd.AddCommand(newApplicationsCommandsCreateApplicationCmd(flags))
+ cmd.AddCommand(newApplicationsCommandsDeleteApplicationCmd(flags))
+ cmd.AddCommand(newApplicationsCommandsGetApplicationCmd(flags))
+ cmd.AddCommand(newApplicationsCommandsListApplicationCmd(flags))
+ cmd.AddCommand(newApplicationsCommandsUpdateApplicationCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_bulk-set-application.go b/discord-cli/internal/cli/applications_commands_bulk-set-application.go
new file mode 100644
index 00000000..071bdc47
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_bulk-set-application.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsCommandsBulkSetApplicationCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "bulk-set-application <application_id>",
+ Aliases: []string{"update"},
+ Short: "Bulk set application",
+ Example: " discord-cli applications commands bulk-set-application abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/commands"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_create-application.go b/discord-cli/internal/cli/applications_commands_create-application.go
new file mode 100644
index 00000000..6e62ee45
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_create-application.go
@@ -0,0 +1,96 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsCommandsCreateApplicationCmd(flags *rootFlags) *cobra.Command {
+ var bodyDefaultMemberPermissions int
+ var bodyDescription string
+ var bodyDmPermission bool
+ var bodyHandler string
+ var bodyName string
+ var bodyType string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-application <application_id>",
+ Aliases: []string{"create"},
+ Short: "Create application",
+ Example: " discord-cli applications commands create-application abc123 --name my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/commands"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDefaultMemberPermissions != 0 {
+ body["default_member_permissions"] = bodyDefaultMemberPermissions
+ }
+ if bodyDescription != "" {
+ body["description"] = bodyDescription
+ }
+ if bodyDmPermission != false {
+ body["dm_permission"] = bodyDmPermission
+ }
+ if bodyHandler != "" {
+ body["handler"] = bodyHandler
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodyType != "" {
+ body["type"] = bodyType
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyDefaultMemberPermissions, "default-member-permissions", 0, "Default member permissions")
+ cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+ cmd.Flags().BoolVar(&bodyDmPermission, "dm-permission", false, "Dm permission")
+ cmd.Flags().StringVar(&bodyHandler, "handler", "", "Handler")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ _ = cmd.MarkFlagRequired("name")
+ cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_delete-application.go b/discord-cli/internal/cli/applications_commands_delete-application.go
new file mode 100644
index 00000000..6668cb8d
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_delete-application.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsCommandsDeleteApplicationCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-application <application_id> <command_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete application",
+ Example: " discord-cli applications commands delete-application abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/commands/{command_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("command_id is required"))
+ }
+ path = replacePathParam(path, "command_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_get-application.go b/discord-cli/internal/cli/applications_commands_get-application.go
new file mode 100644
index 00000000..d6d4ff21
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_get-application.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsCommandsGetApplicationCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-application <application_id> <command_id>",
+ Aliases: []string{"get"},
+ Short: "Get application",
+ Example: " discord-cli applications commands get-application abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/commands/{command_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("command_id is required"))
+ }
+ path = replacePathParam(path, "command_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_list-application.go b/discord-cli/internal/cli/applications_commands_list-application.go
new file mode 100644
index 00000000..d1dc076b
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_list-application.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsCommandsListApplicationCmd(flags *rootFlags) *cobra.Command {
+ var flagWithLocalizations bool
+
+ cmd := &cobra.Command{
+ Use: "list-application <application_id>",
+ Short: "List application",
+ Example: " discord-cli applications commands list-application abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/commands"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ params := map[string]string{}
+ if flagWithLocalizations != false {
+ params["with_localizations"] = fmt.Sprintf("%v", flagWithLocalizations)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWithLocalizations, "with-localizations", false, "With localizations")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_update-application.go b/discord-cli/internal/cli/applications_commands_update-application.go
new file mode 100644
index 00000000..70fd3117
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_update-application.go
@@ -0,0 +1,93 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsCommandsUpdateApplicationCmd(flags *rootFlags) *cobra.Command {
+ var bodyDefaultMemberPermissions int
+ var bodyDescription string
+ var bodyDmPermission bool
+ var bodyHandler string
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-application <application_id> <command_id>",
+ Short: "Update application",
+ Example: " discord-cli applications commands update-application abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/commands/{command_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("command_id is required"))
+ }
+ path = replacePathParam(path, "command_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDefaultMemberPermissions != 0 {
+ body["default_member_permissions"] = bodyDefaultMemberPermissions
+ }
+ if bodyDescription != "" {
+ body["description"] = bodyDescription
+ }
+ if bodyDmPermission != false {
+ body["dm_permission"] = bodyDmPermission
+ }
+ if bodyHandler != "" {
+ body["handler"] = bodyHandler
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyDefaultMemberPermissions, "default-member-permissions", 0, "Default member permissions")
+ cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+ cmd.Flags().BoolVar(&bodyDmPermission, "dm-permission", false, "Dm permission")
+ cmd.Flags().StringVar(&bodyHandler, "handler", "", "Handler")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis.go b/discord-cli/internal/cli/applications_emojis.go
new file mode 100644
index 00000000..3a8323bd
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newApplicationsEmojisCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "emojis",
+ Short: "Manage emojis",
+ }
+
+ cmd.AddCommand(newApplicationsEmojisCreateApplicationCmd(flags))
+ cmd.AddCommand(newApplicationsEmojisDeleteApplicationCmd(flags))
+ cmd.AddCommand(newApplicationsEmojisGetApplicationCmd(flags))
+ cmd.AddCommand(newApplicationsEmojisListApplicationCmd(flags))
+ cmd.AddCommand(newApplicationsEmojisUpdateApplicationCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis_create-application.go b/discord-cli/internal/cli/applications_emojis_create-application.go
new file mode 100644
index 00000000..d8214e91
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis_create-application.go
@@ -0,0 +1,77 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsEmojisCreateApplicationCmd(flags *rootFlags) *cobra.Command {
+ var bodyImage string
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-application <application_id>",
+ Aliases: []string{"create"},
+ Short: "Create application",
+ Example: " discord-cli applications emojis create-application abc123 --image value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/emojis"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyImage != "" {
+ body["image"] = bodyImage
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyImage, "image", "", "Image")
+ _ = cmd.MarkFlagRequired("image")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ _ = cmd.MarkFlagRequired("name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis_delete-application.go b/discord-cli/internal/cli/applications_emojis_delete-application.go
new file mode 100644
index 00000000..3b29014f
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis_delete-application.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsEmojisDeleteApplicationCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-application <application_id> <emoji_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete application",
+ Example: " discord-cli applications emojis delete-application abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/emojis/{emoji_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("emoji_id is required"))
+ }
+ path = replacePathParam(path, "emoji_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis_get-application.go b/discord-cli/internal/cli/applications_emojis_get-application.go
new file mode 100644
index 00000000..6d619a22
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis_get-application.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsEmojisGetApplicationCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-application <application_id> <emoji_id>",
+ Aliases: []string{"get"},
+ Short: "Get application",
+ Example: " discord-cli applications emojis get-application abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/emojis/{emoji_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("emoji_id is required"))
+ }
+ path = replacePathParam(path, "emoji_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis_list-application.go b/discord-cli/internal/cli/applications_emojis_list-application.go
new file mode 100644
index 00000000..fa730874
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis_list-application.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsEmojisListApplicationCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-application <application_id>",
+ Short: "List application",
+ Example: " discord-cli applications emojis list-application abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/emojis"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis_update-application.go b/discord-cli/internal/cli/applications_emojis_update-application.go
new file mode 100644
index 00000000..8e27890b
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis_update-application.go
@@ -0,0 +1,74 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsEmojisUpdateApplicationCmd(flags *rootFlags) *cobra.Command {
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-application <application_id> <emoji_id>",
+ Aliases: []string{"update"},
+ Short: "Update application",
+ Example: " discord-cli applications emojis update-application abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/emojis/{emoji_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("emoji_id is required"))
+ }
+ path = replacePathParam(path, "emoji_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements.go b/discord-cli/internal/cli/applications_entitlements.go
new file mode 100644
index 00000000..77461440
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newApplicationsEntitlementsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "entitlements",
+ Short: "Manage entitlements",
+ }
+
+ cmd.AddCommand(newApplicationsEntitlementsConsumeCmd(flags))
+ cmd.AddCommand(newApplicationsEntitlementsCreateCmd(flags))
+ cmd.AddCommand(newApplicationsEntitlementsDeleteCmd(flags))
+ cmd.AddCommand(newApplicationsEntitlementsGetCmd(flags))
+ cmd.AddCommand(newApplicationsEntitlementsGetApplicationsCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements_consume.go b/discord-cli/internal/cli/applications_entitlements_consume.go
new file mode 100644
index 00000000..2bb7e43c
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements_consume.go
@@ -0,0 +1,68 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsEntitlementsConsumeCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "consume <application_id> <entitlement_id>",
+ Short: "Consume",
+ Example: " discord-cli applications entitlements consume abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/entitlements/{entitlement_id}/consume"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("entitlement_id is required"))
+ }
+ path = replacePathParam(path, "entitlement_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements_create.go b/discord-cli/internal/cli/applications_entitlements_create.go
new file mode 100644
index 00000000..d116c1b3
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements_create.go
@@ -0,0 +1,82 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsEntitlementsCreateCmd(flags *rootFlags) *cobra.Command {
+ var bodyOwnerId string
+ var bodyOwnerType int
+ var bodySkuId string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create <application_id>",
+ Short: "Create",
+ Example: " discord-cli applications entitlements create abc123 --owner-id abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/entitlements"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyOwnerId != "" {
+ body["owner_id"] = bodyOwnerId
+ }
+ if bodyOwnerType != 0 {
+ body["owner_type"] = bodyOwnerType
+ }
+ if bodySkuId != "" {
+ body["sku_id"] = bodySkuId
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyOwnerId, "owner-id", "", "Owner id")
+ _ = cmd.MarkFlagRequired("owner-id")
+ cmd.Flags().IntVar(&bodyOwnerType, "owner-type", 0, "Owner type")
+ _ = cmd.MarkFlagRequired("owner-type")
+ cmd.Flags().StringVar(&bodySkuId, "sku-id", "", "Sku id")
+ _ = cmd.MarkFlagRequired("sku-id")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements_delete.go b/discord-cli/internal/cli/applications_entitlements_delete.go
new file mode 100644
index 00000000..b877a2f2
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements_delete.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsEntitlementsDeleteCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete <application_id> <entitlement_id>",
+ Short: "Delete",
+ Example: " discord-cli applications entitlements delete abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/entitlements/{entitlement_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("entitlement_id is required"))
+ }
+ path = replacePathParam(path, "entitlement_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements_get-applications.go b/discord-cli/internal/cli/applications_entitlements_get-applications.go
new file mode 100644
index 00000000..4a4853fc
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements_get-applications.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsEntitlementsGetApplicationsCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-applications <application_id> <entitlement_id>",
+ Short: "Get applications",
+ Example: " discord-cli applications entitlements get-applications abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/entitlements/{entitlement_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("entitlement_id is required"))
+ }
+ path = replacePathParam(path, "entitlement_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements_get.go b/discord-cli/internal/cli/applications_entitlements_get.go
new file mode 100644
index 00000000..6d8fcfb3
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements_get.go
@@ -0,0 +1,78 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsEntitlementsGetCmd(flags *rootFlags) *cobra.Command {
+ var flagUserId string
+ var flagSkuIds string
+ var flagGuildId string
+ var flagBefore string
+ var flagAfter string
+ var flagLimit int
+ var flagExcludeEnded bool
+ var flagExcludeDeleted bool
+ var flagOnlyActive bool
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "get <application_id>",
+ Short: "Get",
+ Example: " discord-cli applications entitlements get abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/entitlements"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "user_id": fmt.Sprintf("%v", flagUserId),
+ "sku_ids": fmt.Sprintf("%v", flagSkuIds),
+ "guild_id": fmt.Sprintf("%v", flagGuildId),
+ "before": fmt.Sprintf("%v", flagBefore),
+ "after": fmt.Sprintf("%v", flagAfter),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ "exclude_ended": fmt.Sprintf("%v", flagExcludeEnded),
+ "exclude_deleted": fmt.Sprintf("%v", flagExcludeDeleted),
+ "only_active": fmt.Sprintf("%v", flagOnlyActive),
+ }, flagAll, "after", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagUserId, "user-id", "", "User id")
+ cmd.Flags().StringVar(&flagSkuIds, "sku-ids", "", "Sku ids")
+ cmd.Flags().StringVar(&flagGuildId, "guild-id", "", "Guild id")
+ cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+ cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().BoolVar(&flagExcludeEnded, "exclude-ended", false, "Exclude ended")
+ cmd.Flags().BoolVar(&flagExcludeDeleted, "exclude-deleted", false, "Exclude deleted")
+ cmd.Flags().BoolVar(&flagOnlyActive, "only-active", false, "Only active")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_get-my.go b/discord-cli/internal/cli/applications_get-my.go
new file mode 100644
index 00000000..7a2ac2af
--- /dev/null
+++ b/discord-cli/internal/cli/applications_get-my.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGetMyCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-my",
+ Aliases: []string{"list"},
+ Short: "Get my",
+ Example: " discord-cli applications get-my",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/@me"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_get.go b/discord-cli/internal/cli/applications_get.go
new file mode 100644
index 00000000..fff459f9
--- /dev/null
+++ b/discord-cli/internal/cli/applications_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get <application_id>",
+ Short: "Get",
+ Example: " discord-cli applications get abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds.go b/discord-cli/internal/cli/applications_guilds.go
new file mode 100644
index 00000000..a414825a
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds.go
@@ -0,0 +1,25 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newApplicationsGuildsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "guilds",
+ Short: "Manage guilds",
+ }
+
+ cmd.AddCommand(newApplicationsGuildsBulkSetApplicationCommandsCmd(flags))
+ cmd.AddCommand(newApplicationsGuildsCreateApplicationCommandCmd(flags))
+ cmd.AddCommand(newApplicationsGuildsDeleteApplicationCommandCmd(flags))
+ cmd.AddCommand(newApplicationsGuildsGetApplicationCommandCmd(flags))
+ cmd.AddCommand(newApplicationsGuildsGetApplicationCommandPermissionsCmd(flags))
+ cmd.AddCommand(newApplicationsGuildsListApplicationCommandPermissionsCmd(flags))
+ cmd.AddCommand(newApplicationsGuildsListApplicationCommandsCmd(flags))
+ cmd.AddCommand(newApplicationsGuildsSetApplicationCommandPermissionsCmd(flags))
+ cmd.AddCommand(newApplicationsGuildsUpdateApplicationCommandCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_bulk-set-application-commands.go b/discord-cli/internal/cli/applications_guilds_bulk-set-application-commands.go
new file mode 100644
index 00000000..cff9a530
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_bulk-set-application-commands.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGuildsBulkSetApplicationCommandsCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "bulk-set-application-commands <application_id> <guild_id>",
+ Aliases: []string{"update"},
+ Short: "Bulk set application commands",
+ Example: " discord-cli applications guilds bulk-set-application-commands abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/guilds/{guild_id}/commands"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_create-application-command.go b/discord-cli/internal/cli/applications_guilds_create-application-command.go
new file mode 100644
index 00000000..419f8f46
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_create-application-command.go
@@ -0,0 +1,100 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGuildsCreateApplicationCommandCmd(flags *rootFlags) *cobra.Command {
+ var bodyDefaultMemberPermissions int
+ var bodyDescription string
+ var bodyDmPermission bool
+ var bodyHandler string
+ var bodyName string
+ var bodyType string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-application-command <application_id> <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Create application command",
+ Example: " discord-cli applications guilds create-application-command abc123 abc123 --name my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/guilds/{guild_id}/commands"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDefaultMemberPermissions != 0 {
+ body["default_member_permissions"] = bodyDefaultMemberPermissions
+ }
+ if bodyDescription != "" {
+ body["description"] = bodyDescription
+ }
+ if bodyDmPermission != false {
+ body["dm_permission"] = bodyDmPermission
+ }
+ if bodyHandler != "" {
+ body["handler"] = bodyHandler
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodyType != "" {
+ body["type"] = bodyType
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyDefaultMemberPermissions, "default-member-permissions", 0, "Default member permissions")
+ cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+ cmd.Flags().BoolVar(&bodyDmPermission, "dm-permission", false, "Dm permission")
+ cmd.Flags().StringVar(&bodyHandler, "handler", "", "Handler")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ _ = cmd.MarkFlagRequired("name")
+ cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_delete-application-command.go b/discord-cli/internal/cli/applications_guilds_delete-application-command.go
new file mode 100644
index 00000000..31e3a596
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_delete-application-command.go
@@ -0,0 +1,57 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGuildsDeleteApplicationCommandCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-application-command <application_id> <guild_id> <command_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete application command",
+ Example: " discord-cli applications guilds delete-application-command abc123 abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/guilds/{guild_id}/commands/{command_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("command_id is required"))
+ }
+ path = replacePathParam(path, "command_id", args[2])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_get-application-command-permissions.go b/discord-cli/internal/cli/applications_guilds_get-application-command-permissions.go
new file mode 100644
index 00000000..cd2c879a
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_get-application-command-permissions.go
@@ -0,0 +1,57 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGuildsGetApplicationCommandPermissionsCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-application-command-permissions <application_id> <guild_id> <command_id>",
+ Short: "Get application command permissions",
+ Example: " discord-cli applications guilds get-application-command-permissions abc123 abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/guilds/{guild_id}/commands/{command_id}/permissions"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("command_id is required"))
+ }
+ path = replacePathParam(path, "command_id", args[2])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_get-application-command.go b/discord-cli/internal/cli/applications_guilds_get-application-command.go
new file mode 100644
index 00000000..047e003c
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_get-application-command.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGuildsGetApplicationCommandCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-application-command <application_id> <guild_id> <command_id>",
+ Aliases: []string{"get"},
+ Short: "Get application command",
+ Example: " discord-cli applications guilds get-application-command abc123 abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/guilds/{guild_id}/commands/{command_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("command_id is required"))
+ }
+ path = replacePathParam(path, "command_id", args[2])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_list-application-command-permissions.go b/discord-cli/internal/cli/applications_guilds_list-application-command-permissions.go
new file mode 100644
index 00000000..0eefb705
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_list-application-command-permissions.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGuildsListApplicationCommandPermissionsCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-application-command-permissions <application_id> <guild_id>",
+ Short: "List application command permissions",
+ Example: " discord-cli applications guilds list-application-command-permissions abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/guilds/{guild_id}/commands/permissions"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_list-application-commands.go b/discord-cli/internal/cli/applications_guilds_list-application-commands.go
new file mode 100644
index 00000000..15f188ae
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_list-application-commands.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGuildsListApplicationCommandsCmd(flags *rootFlags) *cobra.Command {
+ var flagWithLocalizations bool
+
+ cmd := &cobra.Command{
+ Use: "list-application-commands <application_id> <guild_id>",
+ Short: "List application commands",
+ Example: " discord-cli applications guilds list-application-commands abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/guilds/{guild_id}/commands"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[1])
+ params := map[string]string{}
+ if flagWithLocalizations != false {
+ params["with_localizations"] = fmt.Sprintf("%v", flagWithLocalizations)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWithLocalizations, "with-localizations", false, "With localizations")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_set-application-command-permissions.go b/discord-cli/internal/cli/applications_guilds_set-application-command-permissions.go
new file mode 100644
index 00000000..5fae6035
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_set-application-command-permissions.go
@@ -0,0 +1,72 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGuildsSetApplicationCommandPermissionsCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "set-application-command-permissions <application_id> <guild_id> <command_id>",
+ Short: "Set application command permissions",
+ Example: " discord-cli applications guilds set-application-command-permissions abc123 abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/guilds/{guild_id}/commands/{command_id}/permissions"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("command_id is required"))
+ }
+ path = replacePathParam(path, "command_id", args[2])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_update-application-command.go b/discord-cli/internal/cli/applications_guilds_update-application-command.go
new file mode 100644
index 00000000..014c881d
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_update-application-command.go
@@ -0,0 +1,97 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsGuildsUpdateApplicationCommandCmd(flags *rootFlags) *cobra.Command {
+ var bodyDefaultMemberPermissions int
+ var bodyDescription string
+ var bodyDmPermission bool
+ var bodyHandler string
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-application-command <application_id> <guild_id> <command_id>",
+ Short: "Update application command",
+ Example: " discord-cli applications guilds update-application-command abc123 abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/guilds/{guild_id}/commands/{command_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("command_id is required"))
+ }
+ path = replacePathParam(path, "command_id", args[2])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDefaultMemberPermissions != 0 {
+ body["default_member_permissions"] = bodyDefaultMemberPermissions
+ }
+ if bodyDescription != "" {
+ body["description"] = bodyDescription
+ }
+ if bodyDmPermission != false {
+ body["dm_permission"] = bodyDmPermission
+ }
+ if bodyHandler != "" {
+ body["handler"] = bodyHandler
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyDefaultMemberPermissions, "default-member-permissions", 0, "Default member permissions")
+ cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+ cmd.Flags().BoolVar(&bodyDmPermission, "dm-permission", false, "Dm permission")
+ cmd.Flags().StringVar(&bodyHandler, "handler", "", "Handler")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_role-connections.go b/discord-cli/internal/cli/applications_role-connections.go
new file mode 100644
index 00000000..5722509e
--- /dev/null
+++ b/discord-cli/internal/cli/applications_role-connections.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newApplicationsRoleConnectionsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "role-connections",
+ Short: "Manage role connections",
+ }
+
+ cmd.AddCommand(newApplicationsRoleConnectionsGetApplicationMetadataCmd(flags))
+ cmd.AddCommand(newApplicationsRoleConnectionsUpdateApplicationMetadataCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_role-connections_get-application-metadata.go b/discord-cli/internal/cli/applications_role-connections_get-application-metadata.go
new file mode 100644
index 00000000..b348b172
--- /dev/null
+++ b/discord-cli/internal/cli/applications_role-connections_get-application-metadata.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsRoleConnectionsGetApplicationMetadataCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-application-metadata <application_id>",
+ Aliases: []string{"get"},
+ Short: "Get application metadata",
+ Example: " discord-cli applications role-connections get-application-metadata abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/role-connections/metadata"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_role-connections_update-application-metadata.go b/discord-cli/internal/cli/applications_role-connections_update-application-metadata.go
new file mode 100644
index 00000000..9242c2a2
--- /dev/null
+++ b/discord-cli/internal/cli/applications_role-connections_update-application-metadata.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsRoleConnectionsUpdateApplicationMetadataCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-application-metadata <application_id>",
+ Aliases: []string{"update"},
+ Short: "Update application metadata",
+ Example: " discord-cli applications role-connections update-application-metadata abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}/role-connections/metadata"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_update-my.go b/discord-cli/internal/cli/applications_update-my.go
new file mode 100644
index 00000000..fe9e4b29
--- /dev/null
+++ b/discord-cli/internal/cli/applications_update-my.go
@@ -0,0 +1,115 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsUpdateMyCmd(flags *rootFlags) *cobra.Command {
+ var bodyCoverImage string
+ var bodyCustomInstallUrl string
+ var bodyExplicitContentFilter string
+ var bodyFlags int
+ var bodyIcon string
+ var bodyInstallParams string
+ var bodyInteractionsEndpointUrl string
+ var bodyMaxParticipants int
+ var bodyRoleConnectionsVerificationUrl string
+ var bodyTeamId string
+ var bodyType string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-my",
+ Short: "Update my",
+ Example: " discord-cli applications update-my",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/@me"
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyCoverImage != "" {
+ body["cover_image"] = bodyCoverImage
+ }
+ if bodyCustomInstallUrl != "" {
+ body["custom_install_url"] = bodyCustomInstallUrl
+ }
+ if bodyExplicitContentFilter != "" {
+ body["explicit_content_filter"] = bodyExplicitContentFilter
+ }
+ if bodyFlags != 0 {
+ body["flags"] = bodyFlags
+ }
+ if bodyIcon != "" {
+ body["icon"] = bodyIcon
+ }
+ if bodyInstallParams != "" {
+ body["install_params"] = bodyInstallParams
+ }
+ if bodyInteractionsEndpointUrl != "" {
+ body["interactions_endpoint_url"] = bodyInteractionsEndpointUrl
+ }
+ if bodyMaxParticipants != 0 {
+ body["max_participants"] = bodyMaxParticipants
+ }
+ if bodyRoleConnectionsVerificationUrl != "" {
+ body["role_connections_verification_url"] = bodyRoleConnectionsVerificationUrl
+ }
+ if bodyTeamId != "" {
+ body["team_id"] = bodyTeamId
+ }
+ if bodyType != "" {
+ body["type"] = bodyType
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyCoverImage, "cover-image", "", "Cover image")
+ cmd.Flags().StringVar(&bodyCustomInstallUrl, "custom-install-url", "", "Custom install url")
+ cmd.Flags().StringVar(&bodyExplicitContentFilter, "explicit-content-filter", "", "Explicit content filter")
+ cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+ cmd.Flags().StringVar(&bodyIcon, "icon", "", "Icon")
+ cmd.Flags().StringVar(&bodyInstallParams, "install-params", "", "Install params")
+ cmd.Flags().StringVar(&bodyInteractionsEndpointUrl, "interactions-endpoint-url", "", "Interactions endpoint url")
+ cmd.Flags().IntVar(&bodyMaxParticipants, "max-participants", 0, "Max participants")
+ cmd.Flags().StringVar(&bodyRoleConnectionsVerificationUrl, "role-connections-verification-url", "", "Role connections verification url")
+ cmd.Flags().StringVar(&bodyTeamId, "team-id", "", "Team id")
+ cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/applications_update.go b/discord-cli/internal/cli/applications_update.go
new file mode 100644
index 00000000..6dcaba2d
--- /dev/null
+++ b/discord-cli/internal/cli/applications_update.go
@@ -0,0 +1,119 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newApplicationsUpdateCmd(flags *rootFlags) *cobra.Command {
+ var bodyCoverImage string
+ var bodyCustomInstallUrl string
+ var bodyExplicitContentFilter string
+ var bodyFlags int
+ var bodyIcon string
+ var bodyInstallParams string
+ var bodyInteractionsEndpointUrl string
+ var bodyMaxParticipants int
+ var bodyRoleConnectionsVerificationUrl string
+ var bodyTeamId string
+ var bodyType string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update <application_id>",
+ Short: "Update",
+ Example: " discord-cli applications update abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/applications/{application_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyCoverImage != "" {
+ body["cover_image"] = bodyCoverImage
+ }
+ if bodyCustomInstallUrl != "" {
+ body["custom_install_url"] = bodyCustomInstallUrl
+ }
+ if bodyExplicitContentFilter != "" {
+ body["explicit_content_filter"] = bodyExplicitContentFilter
+ }
+ if bodyFlags != 0 {
+ body["flags"] = bodyFlags
+ }
+ if bodyIcon != "" {
+ body["icon"] = bodyIcon
+ }
+ if bodyInstallParams != "" {
+ body["install_params"] = bodyInstallParams
+ }
+ if bodyInteractionsEndpointUrl != "" {
+ body["interactions_endpoint_url"] = bodyInteractionsEndpointUrl
+ }
+ if bodyMaxParticipants != 0 {
+ body["max_participants"] = bodyMaxParticipants
+ }
+ if bodyRoleConnectionsVerificationUrl != "" {
+ body["role_connections_verification_url"] = bodyRoleConnectionsVerificationUrl
+ }
+ if bodyTeamId != "" {
+ body["team_id"] = bodyTeamId
+ }
+ if bodyType != "" {
+ body["type"] = bodyType
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyCoverImage, "cover-image", "", "Cover image")
+ cmd.Flags().StringVar(&bodyCustomInstallUrl, "custom-install-url", "", "Custom install url")
+ cmd.Flags().StringVar(&bodyExplicitContentFilter, "explicit-content-filter", "", "Explicit content filter")
+ cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+ cmd.Flags().StringVar(&bodyIcon, "icon", "", "Icon")
+ cmd.Flags().StringVar(&bodyInstallParams, "install-params", "", "Install params")
+ cmd.Flags().StringVar(&bodyInteractionsEndpointUrl, "interactions-endpoint-url", "", "Interactions endpoint url")
+ cmd.Flags().IntVar(&bodyMaxParticipants, "max-participants", 0, "Max participants")
+ cmd.Flags().StringVar(&bodyRoleConnectionsVerificationUrl, "role-connections-verification-url", "", "Role connections verification url")
+ cmd.Flags().StringVar(&bodyTeamId, "team-id", "", "Team id")
+ cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/auth.go b/discord-cli/internal/cli/auth.go
new file mode 100644
index 00000000..71fa513c
--- /dev/null
+++ b/discord-cli/internal/cli/auth.go
@@ -0,0 +1,250 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "context"
+ "crypto/rand"
+ "encoding/hex"
+ "encoding/json"
+ "fmt"
+ "net"
+ "net/http"
+ "net/url"
+ "os"
+ "os/exec"
+ "runtime"
+ "strings"
+ "time"
+
+ "github.com/USER/discord-cli/internal/config"
+ "github.com/spf13/cobra"
+)
+
+func newAuthCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "auth",
+ Short: "Manage authentication",
+ }
+
+ cmd.AddCommand(newAuthLoginCmd(flags))
+ cmd.AddCommand(newAuthStatusCmd(flags))
+ cmd.AddCommand(newAuthLogoutCmd(flags))
+
+ return cmd
+}
+
+func newAuthLoginCmd(flags *rootFlags) *cobra.Command {
+ var clientID string
+ var clientSecret string
+ var port int
+
+ cmd := &cobra.Command{
+ Use: "login",
+ Short: "Authenticate via OAuth2",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ if clientID == "" {
+ return fmt.Errorf("--client-id is required")
+ }
+
+ cfg, err := config.Load(flags.configPath)
+ if err != nil {
+ return err
+ }
+
+ stateBytes := make([]byte, 16)
+ if _, err := rand.Read(stateBytes); err != nil {
+ return fmt.Errorf("generating state: %w", err)
+ }
+ state := hex.EncodeToString(stateBytes)
+
+ listener, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", port))
+ if err != nil {
+ return fmt.Errorf("starting callback server: %w", err)
+ }
+ defer listener.Close()
+
+ redirectURI := fmt.Sprintf("http://localhost:%d/callback", listener.Addr().(*net.TCPAddr).Port)
+
+ authURL := "https://discord.com/api/oauth2/authorize"
+ params := url.Values{
+ "client_id": {clientID},
+ "redirect_uri": {redirectURI},
+ "response_type": {"code"},
+ "state": {state},
+ "access_type": {"offline"},
+ "prompt": {"consent"},
+ }
+ scopes := []string{"activities.invites.write", "activities.read", "activities.write", "applications.builds.read", "applications.builds.upload", "applications.commands", "applications.commands.permissions.update", "applications.entitlements", "applications.store.update", "bot", "connections", "dm_channels.read", "email", "gdm.join", "guilds", "guilds.join", "guilds.members.read", "identify", "messages.read", "openid", "relationships.read", "role_connections.write", "rpc", "rpc.activities.write", "rpc.notifications.read", "rpc.screenshare.read", "rpc.screenshare.write", "rpc.video.read", "rpc.video.write", "rpc.voice.read", "rpc.voice.write", "voice", "webhook.incoming", }
+ if len(scopes) > 0 {
+ params.Set("scope", strings.Join(scopes, " "))
+ }
+
+ fullURL := authURL + "?" + params.Encode()
+ fmt.Fprintf(os.Stderr, "Opening browser for authentication...\n")
+ fmt.Fprintf(os.Stderr, "If the browser doesn't open, visit:\n%s\n\n", fullURL)
+ openBrowser(fullURL)
+
+ codeCh := make(chan string, 1)
+ errCh := make(chan error, 1)
+
+ mux := http.NewServeMux()
+ mux.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) {
+ if r.URL.Query().Get("state") != state {
+ errCh <- fmt.Errorf("state mismatch")
+ http.Error(w, "State mismatch", http.StatusBadRequest)
+ return
+ }
+ if errMsg := r.URL.Query().Get("error"); errMsg != "" {
+ errCh <- fmt.Errorf("auth error: %s", errMsg)
+ http.Error(w, errMsg, http.StatusBadRequest)
+ return
+ }
+ code := r.URL.Query().Get("code")
+ if code == "" {
+ errCh <- fmt.Errorf("no code in callback")
+ http.Error(w, "No code", http.StatusBadRequest)
+ return
+ }
+ w.Header().Set("Content-Type", "text/html")
+ fmt.Fprint(w, "<html><body><h2>Authentication successful!</h2><p>You can close this tab.</p></body></html>")
+ codeCh <- code
+ })
+
+ server := &http.Server{Handler: mux}
+ go server.Serve(listener)
+
+ var code string
+ select {
+ case code = <-codeCh:
+ case err := <-errCh:
+ return err
+ case <-time.After(2 * time.Minute):
+ return fmt.Errorf("authentication timed out after 2 minutes")
+ }
+
+ server.Shutdown(context.Background())
+
+ tokenURL := "https://discord.com/api/oauth2/token"
+ tokenParams := url.Values{
+ "grant_type": {"authorization_code"},
+ "code": {code},
+ "redirect_uri": {redirectURI},
+ "client_id": {clientID},
+ }
+ if clientSecret != "" {
+ tokenParams.Set("client_secret", clientSecret)
+ }
+
+ resp, err := http.PostForm(tokenURL, tokenParams)
+ if err != nil {
+ return fmt.Errorf("exchanging code for token: %w", err)
+ }
+ defer resp.Body.Close()
+
+ if resp.StatusCode >= 400 {
+ var body map[string]any
+ if err := json.NewDecoder(resp.Body).Decode(&body); err == nil {
+ return fmt.Errorf("exchanging code for token: HTTP %d: %v", resp.StatusCode, body)
+ }
+ return fmt.Errorf("exchanging code for token: HTTP %d", resp.StatusCode)
+ }
+
+ var tokenResp struct {
+ AccessToken string `json:"access_token"`
+ RefreshToken string `json:"refresh_token"`
+ ExpiresIn int `json:"expires_in"`
+ TokenType string `json:"token_type"`
+ }
+ if err := json.NewDecoder(resp.Body).Decode(&tokenResp); err != nil {
+ return fmt.Errorf("parsing token response: %w", err)
+ }
+ if tokenResp.AccessToken == "" {
+ return fmt.Errorf("no access token in response")
+ }
+
+ expiry := time.Now().Add(time.Duration(tokenResp.ExpiresIn) * time.Second)
+ if err := cfg.SaveTokens(clientID, clientSecret, tokenResp.AccessToken, tokenResp.RefreshToken, expiry); err != nil {
+ return fmt.Errorf("saving tokens: %w", err)
+ }
+
+ fmt.Fprintf(os.Stderr, "%s Authentication successful! Token expires at %s\n", green("OK"), expiry.Format(time.RFC3339))
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&clientID, "client-id", os.Getenv("DISCORD_CLIENT_ID"), "OAuth2 client ID")
+ cmd.Flags().StringVar(&clientSecret, "client-secret", os.Getenv("DISCORD_CLIENT_SECRET"), "OAuth2 client secret")
+ cmd.Flags().IntVar(&port, "port", 8085, "Local callback server port")
+
+ return cmd
+}
+
+func newAuthStatusCmd(flags *rootFlags) *cobra.Command {
+ return &cobra.Command{
+ Use: "status",
+ Short: "Show authentication status",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ cfg, err := config.Load(flags.configPath)
+ if err != nil {
+ return err
+ }
+
+ w := cmd.OutOrStdout()
+ if cfg.AccessToken == "" {
+ fmt.Fprintf(w, " %s Not authenticated. Run 'auth login' to authenticate.\n", red("FAIL"))
+ return nil
+ }
+
+ if cfg.TokenExpiry.IsZero() {
+ fmt.Fprintf(w, " %s Authenticated (no expiry info)\n", green("OK"))
+ } else if time.Now().Before(cfg.TokenExpiry) {
+ fmt.Fprintf(w, " %s Authenticated (expires %s)\n", green("OK"), cfg.TokenExpiry.Format(time.RFC3339))
+ } else {
+ if cfg.RefreshToken != "" {
+ fmt.Fprintf(w, " %s Token expired (will auto-refresh on next request)\n", yellow("WARN"))
+ } else {
+ fmt.Fprintf(w, " %s Token expired. Run 'auth login' to re-authenticate.\n", red("FAIL"))
+ }
+ }
+
+ if cfg.AuthSource != "" {
+ fmt.Fprintf(w, " source: %s\n", cfg.AuthSource)
+ }
+ return nil
+ },
+ }
+}
+
+func newAuthLogoutCmd(flags *rootFlags) *cobra.Command {
+ return &cobra.Command{
+ Use: "logout",
+ Short: "Remove stored authentication tokens",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ cfg, err := config.Load(flags.configPath)
+ if err != nil {
+ return err
+ }
+ if err := cfg.ClearTokens(); err != nil {
+ return fmt.Errorf("clearing tokens: %w", err)
+ }
+ fmt.Fprintf(os.Stderr, "Logged out. Tokens removed.\n")
+ return nil
+ },
+ }
+}
+
+func openBrowser(url string) {
+ var cmd *exec.Cmd
+ switch runtime.GOOS {
+ case "darwin":
+ cmd = exec.Command("open", url)
+ case "linux":
+ cmd = exec.Command("xdg-open", url)
+ case "windows":
+ cmd = exec.Command("rundll32", "url.dll,FileProtocolHandler", url)
+ default:
+ return
+ }
+ cmd.Start()
+}
diff --git a/discord-cli/internal/cli/channel_workflow.go b/discord-cli/internal/cli/channel_workflow.go
new file mode 100644
index 00000000..44d1f45c
--- /dev/null
+++ b/discord-cli/internal/cli/channel_workflow.go
@@ -0,0 +1,209 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "path/filepath"
+ "time"
+
+ "github.com/USER/discord-cli/internal/store"
+ "github.com/spf13/cobra"
+)
+
+func newWorkflowCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "workflow",
+ Short: "Compound workflows that combine multiple API operations",
+ }
+
+ cmd.AddCommand(newWorkflowArchiveCmd(flags))
+ cmd.AddCommand(newWorkflowStatusCmd(flags))
+ cmd.AddCommand(newChannelHealthCmd(flags))
+ cmd.AddCommand(newAuditReportCmd(flags))
+ cmd.AddCommand(newMemberReportCmd(flags))
+ cmd.AddCommand(newServerSnapshotCmd(flags))
+ cmd.AddCommand(newMessageStatsCmd(flags))
+ cmd.AddCommand(newWebhookTestCmd(flags))
+ cmd.AddCommand(newPrunePreviewCmd(flags))
+
+ return cmd
+}
+
+func newWorkflowArchiveCmd(flags *rootFlags) *cobra.Command {
+ var dbPath string
+ var full bool
+
+ cmd := &cobra.Command{
+ Use: "archive",
+ Short: "Sync all resources to local store for offline access and search",
+ Long: `Archive fetches all syncable resources from the API and stores them in a
+local SQLite database. Supports incremental sync (only new data since last run)
+and full resync. After archiving, use 'search' for instant full-text search.`,
+ Example: ` # Archive all resources
+ discord-cli workflow archive
+
+ # Full re-archive (ignore previous sync state)
+ discord-cli workflow archive --full`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+ c.NoCache = true
+
+ if dbPath == "" {
+ dbPath = defaultDBPath("discord-cli")
+ }
+ s, err := store.Open(dbPath)
+ if err != nil {
+ return fmt.Errorf("opening store: %w", err)
+ }
+ defer s.Close()
+
+ resources := []string{"audit-logs", "bans", "entitlements", "members", "messages", "polls", "scheduled-events", "thread-members", "threads", "users", }
+ totalSynced := 0
+
+ for _, resource := range resources {
+ cursor := ""
+ if !full {
+ existing, _, _, err := s.GetSyncState(resource)
+ if err == nil && existing != "" {
+ cursor = existing
+ }
+ }
+
+ fmt.Fprintf(cmd.ErrOrStderr(), "Syncing %s...\n", resource)
+
+ params := map[string]string{"limit": "100"}
+ if cursor != "" {
+ params["after"] = cursor
+ }
+
+ count := 0
+ for {
+ data, fetchErr := c.Get("/"+resource, params)
+ if fetchErr != nil {
+ fmt.Fprintf(cmd.ErrOrStderr(), " warning: %s: %v\n", resource, fetchErr)
+ break
+ }
+ var items []json.RawMessage
+ if err := json.Unmarshal(data, &items); err != nil {
+ // Might be a single object, not array
+ if err := s.Upsert(resource, resource+"-singleton", data); err != nil {
+ fmt.Fprintf(cmd.ErrOrStderr(), " warning: store %s: %v\n", resource, err)
+ }
+ count++
+ break
+ }
+ if len(items) == 0 {
+ break
+ }
+ for _, item := range items {
+ var obj struct{ ID string `json:"id"` }
+ json.Unmarshal(item, &obj)
+ id := obj.ID
+ if id == "" {
+ id = fmt.Sprintf("%s-%d", resource, count)
+ }
+ if err := s.Upsert(resource, id, item); err != nil {
+ fmt.Fprintf(cmd.ErrOrStderr(), " warning: store %s/%s: %v\n", resource, id, err)
+ }
+ cursor = id
+ count++
+ }
+ if len(items) < 100 {
+ break
+ }
+ params["after"] = cursor
+ }
+
+ if count > 0 {
+ s.SaveSyncState(resource, cursor, count)
+ }
+ totalSynced += count
+ fmt.Fprintf(cmd.ErrOrStderr(), " %s: %d items\n", resource, count)
+ }
+
+ if flags.asJSON {
+ enc := json.NewEncoder(cmd.OutOrStdout())
+ enc.SetIndent("", " ")
+ return enc.Encode(map[string]any{
+ "resources_synced": len(resources),
+ "total_items": totalSynced,
+ "store_path": dbPath,
+ "timestamp": time.Now().UTC().Format(time.RFC3339),
+ })
+ }
+
+ fmt.Fprintf(cmd.OutOrStdout(), "Archived %d items across %d resources to %s\n", totalSynced, len(resources), dbPath)
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&dbPath, "db", "", "Database path (default: ~/.config/discord-cli/store.db)")
+ cmd.Flags().BoolVar(&full, "full", false, "Full re-archive (ignore previous sync state)")
+
+ return cmd
+}
+
+func newWorkflowStatusCmd(flags *rootFlags) *cobra.Command {
+ var dbPath string
+
+ cmd := &cobra.Command{
+ Use: "status",
+ Short: "Show local archive status and sync state for all resources",
+ Example: ` # Show archive status
+ discord-cli workflow status
+
+ # Show status as JSON
+ discord-cli workflow status --json`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ if dbPath == "" {
+ dbPath = defaultDBPath("discord-cli")
+ }
+ s, err := store.Open(dbPath)
+ if err != nil {
+ return fmt.Errorf("opening store: %w", err)
+ }
+ defer s.Close()
+
+ status, err := s.Status()
+ if err != nil {
+ return err
+ }
+
+ if flags.asJSON {
+ enc := json.NewEncoder(cmd.OutOrStdout())
+ enc.SetIndent("", " ")
+ return enc.Encode(status)
+ }
+
+ if len(status) == 0 {
+ fmt.Fprintln(cmd.OutOrStdout(), "No archived data. Run 'workflow archive' to sync.")
+ return nil
+ }
+
+ fmt.Fprintln(cmd.OutOrStdout(), "Archive Status:")
+ total := 0
+ for resource, count := range status {
+ fmt.Fprintf(cmd.OutOrStdout(), " %-30s %d items\n", resource, count)
+ total += count
+ }
+ fmt.Fprintf(cmd.OutOrStdout(), "\n Total: %d items\n", total)
+ fmt.Fprintf(cmd.OutOrStdout(), " Store: %s\n", dbPath)
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&dbPath, "db", "", "Database path")
+
+ return cmd
+}
+
+func defaultDBPath(name string) string {
+ home, _ := os.UserHomeDir()
+ return filepath.Join(home, ".config", name, "store.db")
+}
diff --git a/discord-cli/internal/cli/channels.go b/discord-cli/internal/cli/channels.go
new file mode 100644
index 00000000..d1a9a20f
--- /dev/null
+++ b/discord-cli/internal/cli/channels.go
@@ -0,0 +1,32 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "channels",
+ Short: "Manage Discord channels, messages, threads, pins, and permissions",
+ }
+
+ cmd.AddCommand(newChannelsDeleteCmd(flags))
+ cmd.AddCommand(newChannelsGetCmd(flags))
+ cmd.AddCommand(newChannelsUpdateCmd(flags))
+ cmd.AddCommand(newChannelsFollowersCmd(flags))
+ cmd.AddCommand(newChannelsInvitesCmd(flags))
+ cmd.AddCommand(newChannelsMessagesCmd(flags))
+ cmd.AddCommand(newChannelsPermissionsCmd(flags))
+ cmd.AddCommand(newChannelsPinsCmd(flags))
+ cmd.AddCommand(newChannelsPollsCmd(flags))
+ cmd.AddCommand(newChannelsRecipientsCmd(flags))
+ cmd.AddCommand(newChannelsSendSoundboardSoundCmd(flags))
+ cmd.AddCommand(newChannelsThreadMembersCmd(flags))
+ cmd.AddCommand(newChannelsThreadsCmd(flags))
+ cmd.AddCommand(newChannelsTypingCmd(flags))
+ cmd.AddCommand(newChannelsUsersCmd(flags))
+ cmd.AddCommand(newChannelsWebhooksCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_delete.go b/discord-cli/internal/cli/channels_delete.go
new file mode 100644
index 00000000..4255de9d
--- /dev/null
+++ b/discord-cli/internal/cli/channels_delete.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsDeleteCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete <channel_id>",
+ Short: "Delete",
+ Example: " discord-cli channels delete abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_followers.go b/discord-cli/internal/cli/channels_followers.go
new file mode 100644
index 00000000..7621fdc5
--- /dev/null
+++ b/discord-cli/internal/cli/channels_followers.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsFollowersCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "followers",
+ Short: "Manage followers",
+ }
+
+ cmd.AddCommand(newChannelsFollowersFollowChannelCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_followers_follow-channel.go b/discord-cli/internal/cli/channels_followers_follow-channel.go
new file mode 100644
index 00000000..6e3e1ca1
--- /dev/null
+++ b/discord-cli/internal/cli/channels_followers_follow-channel.go
@@ -0,0 +1,71 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsFollowersFollowChannelCmd(flags *rootFlags) *cobra.Command {
+ var bodyWebhookChannelId string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "follow-channel <channel_id>",
+ Aliases: []string{"create"},
+ Short: "Follow channel",
+ Example: " discord-cli channels followers follow-channel abc123 --webhook-channel-id abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/followers"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyWebhookChannelId != "" {
+ body["webhook_channel_id"] = bodyWebhookChannelId
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyWebhookChannelId, "webhook-channel-id", "", "Webhook channel id")
+ _ = cmd.MarkFlagRequired("webhook-channel-id")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_get.go b/discord-cli/internal/cli/channels_get.go
new file mode 100644
index 00000000..e121dd40
--- /dev/null
+++ b/discord-cli/internal/cli/channels_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get <channel_id>",
+ Short: "Get",
+ Example: " discord-cli channels get abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_invites.go b/discord-cli/internal/cli/channels_invites.go
new file mode 100644
index 00000000..7fc2de58
--- /dev/null
+++ b/discord-cli/internal/cli/channels_invites.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsInvitesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "invites",
+ Short: "Manage invites",
+ }
+
+ cmd.AddCommand(newChannelsInvitesCreateChannelCmd(flags))
+ cmd.AddCommand(newChannelsInvitesListChannelCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_invites_create-channel.go b/discord-cli/internal/cli/channels_invites_create-channel.go
new file mode 100644
index 00000000..5ea66336
--- /dev/null
+++ b/discord-cli/internal/cli/channels_invites_create-channel.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsInvitesCreateChannelCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-channel <channel_id>",
+ Aliases: []string{"create"},
+ Short: "Create channel",
+ Example: " discord-cli channels invites create-channel abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/invites"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_invites_list-channel.go b/discord-cli/internal/cli/channels_invites_list-channel.go
new file mode 100644
index 00000000..b7ccdd5e
--- /dev/null
+++ b/discord-cli/internal/cli/channels_invites_list-channel.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsInvitesListChannelCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-channel <channel_id>",
+ Aliases: []string{"get"},
+ Short: "List channel",
+ Example: " discord-cli channels invites list-channel abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/invites"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages.go b/discord-cli/internal/cli/channels_messages.go
new file mode 100644
index 00000000..9f6f500d
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages.go
@@ -0,0 +1,33 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsMessagesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "messages",
+ Short: "Manage messages",
+ }
+
+ cmd.AddCommand(newChannelsMessagesAddMyReactionCmd(flags))
+ cmd.AddCommand(newChannelsMessagesBulkDeleteCmd(flags))
+ cmd.AddCommand(newChannelsMessagesCreateCmd(flags))
+ cmd.AddCommand(newChannelsMessagesCreatePinCmd(flags))
+ cmd.AddCommand(newChannelsMessagesCreateThreadFromCmd(flags))
+ cmd.AddCommand(newChannelsMessagesCrosspostCmd(flags))
+ cmd.AddCommand(newChannelsMessagesDeleteCmd(flags))
+ cmd.AddCommand(newChannelsMessagesDeleteAllReactionsCmd(flags))
+ cmd.AddCommand(newChannelsMessagesDeleteAllReactionsByEmojiCmd(flags))
+ cmd.AddCommand(newChannelsMessagesDeleteMyReactionCmd(flags))
+ cmd.AddCommand(newChannelsMessagesDeletePinCmd(flags))
+ cmd.AddCommand(newChannelsMessagesDeleteUserReactionCmd(flags))
+ cmd.AddCommand(newChannelsMessagesGetCmd(flags))
+ cmd.AddCommand(newChannelsMessagesListCmd(flags))
+ cmd.AddCommand(newChannelsMessagesListPinsCmd(flags))
+ cmd.AddCommand(newChannelsMessagesListReactionsByEmojiCmd(flags))
+ cmd.AddCommand(newChannelsMessagesUpdateCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_add-my-reaction.go b/discord-cli/internal/cli/channels_messages_add-my-reaction.go
new file mode 100644
index 00000000..73c8dfaa
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_add-my-reaction.go
@@ -0,0 +1,72 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesAddMyReactionCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "add-my-reaction <channel_id> <message_id> <emoji_name>",
+ Short: "Add my reaction",
+ Example: " discord-cli channels messages add-my-reaction abc123 abc123 my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}/reactions/{emoji_name}/@me"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("emoji_name is required"))
+ }
+ path = replacePathParam(path, "emoji_name", args[2])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_bulk-delete.go b/discord-cli/internal/cli/channels_messages_bulk-delete.go
new file mode 100644
index 00000000..eeb8060d
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_bulk-delete.go
@@ -0,0 +1,64 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesBulkDeleteCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "bulk-delete <channel_id>",
+ Short: "Bulk delete",
+ Example: " discord-cli channels messages bulk-delete abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/bulk-delete"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_create-pin.go b/discord-cli/internal/cli/channels_messages_create-pin.go
new file mode 100644
index 00000000..5b0ab7f2
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_create-pin.go
@@ -0,0 +1,68 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesCreatePinCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-pin <channel_id> <message_id>",
+ Short: "Create pin",
+ Example: " discord-cli channels messages create-pin abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/pins/{message_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_create-thread-from.go b/discord-cli/internal/cli/channels_messages_create-thread-from.go
new file mode 100644
index 00000000..2e411c88
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_create-thread-from.go
@@ -0,0 +1,84 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesCreateThreadFromCmd(flags *rootFlags) *cobra.Command {
+ var bodyAutoArchiveDuration string
+ var bodyName string
+ var bodyRateLimitPerUser int
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-thread-from <channel_id> <message_id>",
+ Short: "Create thread from",
+ Example: " discord-cli channels messages create-thread-from abc123 abc123 --name my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}/threads"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAutoArchiveDuration != "" {
+ body["auto_archive_duration"] = bodyAutoArchiveDuration
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodyRateLimitPerUser != 0 {
+ body["rate_limit_per_user"] = bodyRateLimitPerUser
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAutoArchiveDuration, "auto-archive-duration", "", "Auto archive duration")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ _ = cmd.MarkFlagRequired("name")
+ cmd.Flags().IntVar(&bodyRateLimitPerUser, "rate-limit-per-user", 0, "Rate limit per user")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_create.go b/discord-cli/internal/cli/channels_messages_create.go
new file mode 100644
index 00000000..f6a033df
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_create.go
@@ -0,0 +1,113 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesCreateCmd(flags *rootFlags) *cobra.Command {
+ var bodyAllowedMentions string
+ var bodyContent string
+ var bodyEnforceNonce bool
+ var bodyFlags int
+ var bodyMessageReference string
+ var bodyNonce string
+ var bodyPoll string
+ var bodySharedClientTheme string
+ var bodyTts bool
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create <channel_id>",
+ Short: "Send a message to a channel",
+ Example: ` # Send a text message
+ discord-cli channels messages create 123456789012345678 --content "Hello, world!"
+
+ # Send a message with embeds via stdin
+ echo '{"content":"Deploy complete","embeds":[{"title":"Build #123","color":3066993}]}' | discord-cli channels messages create 123456789012345678 --stdin`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAllowedMentions != "" {
+ body["allowed_mentions"] = bodyAllowedMentions
+ }
+ if bodyContent != "" {
+ body["content"] = bodyContent
+ }
+ if bodyEnforceNonce != false {
+ body["enforce_nonce"] = bodyEnforceNonce
+ }
+ if bodyFlags != 0 {
+ body["flags"] = bodyFlags
+ }
+ if bodyMessageReference != "" {
+ body["message_reference"] = bodyMessageReference
+ }
+ if bodyNonce != "" {
+ body["nonce"] = bodyNonce
+ }
+ if bodyPoll != "" {
+ body["poll"] = bodyPoll
+ }
+ if bodySharedClientTheme != "" {
+ body["shared_client_theme"] = bodySharedClientTheme
+ }
+ if bodyTts != false {
+ body["tts"] = bodyTts
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAllowedMentions, "allowed-mentions", "", "Allowed mentions")
+ cmd.Flags().StringVar(&bodyContent, "content", "", "Content")
+ cmd.Flags().BoolVar(&bodyEnforceNonce, "enforce-nonce", false, "Enforce nonce")
+ cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+ cmd.Flags().StringVar(&bodyMessageReference, "message-reference", "", "Message reference")
+ cmd.Flags().StringVar(&bodyNonce, "nonce", "", "Nonce")
+ cmd.Flags().StringVar(&bodyPoll, "poll", "", "Poll")
+ cmd.Flags().StringVar(&bodySharedClientTheme, "shared-client-theme", "", "Shared client theme")
+ cmd.Flags().BoolVar(&bodyTts, "tts", false, "Tts")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_crosspost.go b/discord-cli/internal/cli/channels_messages_crosspost.go
new file mode 100644
index 00000000..172c4cc6
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_crosspost.go
@@ -0,0 +1,68 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesCrosspostCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "crosspost <channel_id> <message_id>",
+ Short: "Crosspost",
+ Example: " discord-cli channels messages crosspost abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}/crosspost"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete-all-reactions-by-emoji.go b/discord-cli/internal/cli/channels_messages_delete-all-reactions-by-emoji.go
new file mode 100644
index 00000000..9f5e4ffb
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete-all-reactions-by-emoji.go
@@ -0,0 +1,56 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesDeleteAllReactionsByEmojiCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-all-reactions-by-emoji <channel_id> <message_id> <emoji_name>",
+ Short: "Delete all reactions by emoji",
+ Example: " discord-cli channels messages delete-all-reactions-by-emoji abc123 abc123 my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}/reactions/{emoji_name}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("emoji_name is required"))
+ }
+ path = replacePathParam(path, "emoji_name", args[2])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete-all-reactions.go b/discord-cli/internal/cli/channels_messages_delete-all-reactions.go
new file mode 100644
index 00000000..f026c66a
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete-all-reactions.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesDeleteAllReactionsCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-all-reactions <channel_id> <message_id>",
+ Short: "Delete all reactions",
+ Example: " discord-cli channels messages delete-all-reactions abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}/reactions"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete-my-reaction.go b/discord-cli/internal/cli/channels_messages_delete-my-reaction.go
new file mode 100644
index 00000000..692268e6
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete-my-reaction.go
@@ -0,0 +1,56 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesDeleteMyReactionCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-my-reaction <channel_id> <message_id> <emoji_name>",
+ Short: "Delete my reaction",
+ Example: " discord-cli channels messages delete-my-reaction abc123 abc123 my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}/reactions/{emoji_name}/@me"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("emoji_name is required"))
+ }
+ path = replacePathParam(path, "emoji_name", args[2])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete-pin.go b/discord-cli/internal/cli/channels_messages_delete-pin.go
new file mode 100644
index 00000000..ca6a854f
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete-pin.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesDeletePinCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-pin <channel_id> <message_id>",
+ Short: "Delete pin",
+ Example: " discord-cli channels messages delete-pin abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/pins/{message_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete-user-reaction.go b/discord-cli/internal/cli/channels_messages_delete-user-reaction.go
new file mode 100644
index 00000000..32b85069
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete-user-reaction.go
@@ -0,0 +1,60 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesDeleteUserReactionCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-user-reaction <channel_id> <message_id> <emoji_name> <user_id>",
+ Short: "Delete user reaction",
+ Example: " discord-cli channels messages delete-user-reaction abc123 abc123 my-resource abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}/reactions/{emoji_name}/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("emoji_name is required"))
+ }
+ path = replacePathParam(path, "emoji_name", args[2])
+ if len(args) < 4 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[3])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete.go b/discord-cli/internal/cli/channels_messages_delete.go
new file mode 100644
index 00000000..d812a4e6
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesDeleteCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete <channel_id> <message_id>",
+ Short: "Delete",
+ Example: " discord-cli channels messages delete abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_get.go b/discord-cli/internal/cli/channels_messages_get.go
new file mode 100644
index 00000000..048eea1c
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_get.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get <channel_id> <message_id>",
+ Short: "Get",
+ Example: " discord-cli channels messages get abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_list-pins.go b/discord-cli/internal/cli/channels_messages_list-pins.go
new file mode 100644
index 00000000..8ddd01e8
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_list-pins.go
@@ -0,0 +1,57 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesListPinsCmd(flags *rootFlags) *cobra.Command {
+ var flagBefore string
+ var flagLimit int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list-pins <channel_id>",
+ Short: "List pins",
+ Example: " discord-cli channels messages list-pins abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/pins"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "before": fmt.Sprintf("%v", flagBefore),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ }, flagAll, "", "", "has_more")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_list-reactions-by-emoji.go b/discord-cli/internal/cli/channels_messages_list-reactions-by-emoji.go
new file mode 100644
index 00000000..57026d0e
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_list-reactions-by-emoji.go
@@ -0,0 +1,68 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesListReactionsByEmojiCmd(flags *rootFlags) *cobra.Command {
+ var flagAfter string
+ var flagLimit int
+ var flagType int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list-reactions-by-emoji <channel_id> <message_id> <emoji_name>",
+ Short: "List reactions by emoji",
+ Example: " discord-cli channels messages list-reactions-by-emoji abc123 abc123 my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}/reactions/{emoji_name}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("emoji_name is required"))
+ }
+ path = replacePathParam(path, "emoji_name", args[2])
+ data, err := paginatedGet(c, path, map[string]string{
+ "after": fmt.Sprintf("%v", flagAfter),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ "type": fmt.Sprintf("%v", flagType),
+ }, flagAll, "after", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().IntVar(&flagType, "type", 0, "Type")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_list.go b/discord-cli/internal/cli/channels_messages_list.go
new file mode 100644
index 00000000..f5c75851
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_list.go
@@ -0,0 +1,63 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesListCmd(flags *rootFlags) *cobra.Command {
+ var flagAround string
+ var flagBefore string
+ var flagAfter string
+ var flagLimit int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list <channel_id>",
+ Short: "List",
+ Example: " discord-cli channels messages list abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "around": fmt.Sprintf("%v", flagAround),
+ "before": fmt.Sprintf("%v", flagBefore),
+ "after": fmt.Sprintf("%v", flagAfter),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ }, flagAll, "after", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagAround, "around", "", "Around")
+ cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+ cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_update.go b/discord-cli/internal/cli/channels_messages_update.go
new file mode 100644
index 00000000..19f68940
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_update.go
@@ -0,0 +1,83 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsMessagesUpdateCmd(flags *rootFlags) *cobra.Command {
+ var bodyAllowedMentions string
+ var bodyContent string
+ var bodyFlags int
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update <channel_id> <message_id>",
+ Short: "Update",
+ Example: " discord-cli channels messages update abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/messages/{message_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAllowedMentions != "" {
+ body["allowed_mentions"] = bodyAllowedMentions
+ }
+ if bodyContent != "" {
+ body["content"] = bodyContent
+ }
+ if bodyFlags != 0 {
+ body["flags"] = bodyFlags
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAllowedMentions, "allowed-mentions", "", "Allowed mentions")
+ cmd.Flags().StringVar(&bodyContent, "content", "", "Content")
+ cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_permissions.go b/discord-cli/internal/cli/channels_permissions.go
new file mode 100644
index 00000000..5eae673f
--- /dev/null
+++ b/discord-cli/internal/cli/channels_permissions.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsPermissionsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "permissions",
+ Short: "Manage permissions",
+ }
+
+ cmd.AddCommand(newChannelsPermissionsDeleteChannelOverwriteCmd(flags))
+ cmd.AddCommand(newChannelsPermissionsSetChannelOverwriteCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_permissions_delete-channel-overwrite.go b/discord-cli/internal/cli/channels_permissions_delete-channel-overwrite.go
new file mode 100644
index 00000000..0e743d0f
--- /dev/null
+++ b/discord-cli/internal/cli/channels_permissions_delete-channel-overwrite.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsPermissionsDeleteChannelOverwriteCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-channel-overwrite <channel_id> <overwrite_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete channel overwrite",
+ Example: " discord-cli channels permissions delete-channel-overwrite abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/permissions/{overwrite_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("overwrite_id is required"))
+ }
+ path = replacePathParam(path, "overwrite_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_permissions_set-channel-overwrite.go b/discord-cli/internal/cli/channels_permissions_set-channel-overwrite.go
new file mode 100644
index 00000000..e7ac37a5
--- /dev/null
+++ b/discord-cli/internal/cli/channels_permissions_set-channel-overwrite.go
@@ -0,0 +1,84 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsPermissionsSetChannelOverwriteCmd(flags *rootFlags) *cobra.Command {
+ var bodyAllow int
+ var bodyDeny int
+ var bodyType string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "set-channel-overwrite <channel_id> <overwrite_id>",
+ Aliases: []string{"update"},
+ Short: "Set channel overwrite",
+ Example: " discord-cli channels permissions set-channel-overwrite abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/permissions/{overwrite_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("overwrite_id is required"))
+ }
+ path = replacePathParam(path, "overwrite_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAllow != 0 {
+ body["allow"] = bodyAllow
+ }
+ if bodyDeny != 0 {
+ body["deny"] = bodyDeny
+ }
+ if bodyType != "" {
+ body["type"] = bodyType
+ }
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyAllow, "allow", 0, "Allow")
+ cmd.Flags().IntVar(&bodyDeny, "deny", 0, "Deny")
+ cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_pins.go b/discord-cli/internal/cli/channels_pins.go
new file mode 100644
index 00000000..a2314a85
--- /dev/null
+++ b/discord-cli/internal/cli/channels_pins.go
@@ -0,0 +1,19 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsPinsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "pins",
+ Short: "Manage pins",
+ }
+
+ cmd.AddCommand(newChannelsPinsDeprecatedCreateCmd(flags))
+ cmd.AddCommand(newChannelsPinsDeprecatedDeleteCmd(flags))
+ cmd.AddCommand(newChannelsPinsDeprecatedListCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_pins_deprecated-create.go b/discord-cli/internal/cli/channels_pins_deprecated-create.go
new file mode 100644
index 00000000..0fbc9ce7
--- /dev/null
+++ b/discord-cli/internal/cli/channels_pins_deprecated-create.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsPinsDeprecatedCreateCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "deprecated-create <channel_id> <message_id>",
+ Aliases: []string{"update"},
+ Short: "Deprecated create",
+ Example: " discord-cli channels pins deprecated-create abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/pins/{message_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_pins_deprecated-delete.go b/discord-cli/internal/cli/channels_pins_deprecated-delete.go
new file mode 100644
index 00000000..e1d2409a
--- /dev/null
+++ b/discord-cli/internal/cli/channels_pins_deprecated-delete.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsPinsDeprecatedDeleteCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "deprecated-delete <channel_id> <message_id>",
+ Aliases: []string{"delete"},
+ Short: "Deprecated delete",
+ Example: " discord-cli channels pins deprecated-delete abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/pins/{message_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_pins_deprecated-list.go b/discord-cli/internal/cli/channels_pins_deprecated-list.go
new file mode 100644
index 00000000..2a7f06a2
--- /dev/null
+++ b/discord-cli/internal/cli/channels_pins_deprecated-list.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsPinsDeprecatedListCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "deprecated-list <channel_id>",
+ Aliases: []string{"get"},
+ Short: "Deprecated list",
+ Example: " discord-cli channels pins deprecated-list abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/pins"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_polls.go b/discord-cli/internal/cli/channels_polls.go
new file mode 100644
index 00000000..8de897fb
--- /dev/null
+++ b/discord-cli/internal/cli/channels_polls.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsPollsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "polls",
+ Short: "Manage polls",
+ }
+
+ cmd.AddCommand(newChannelsPollsExpireCmd(flags))
+ cmd.AddCommand(newChannelsPollsGetAnswerVotersCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_polls_expire.go b/discord-cli/internal/cli/channels_polls_expire.go
new file mode 100644
index 00000000..b6d3b476
--- /dev/null
+++ b/discord-cli/internal/cli/channels_polls_expire.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsPollsExpireCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "expire <channel_id> <message_id>",
+ Aliases: []string{"create"},
+ Short: "Expire",
+ Example: " discord-cli channels polls expire abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/polls/{message_id}/expire"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_polls_get-answer-voters.go b/discord-cli/internal/cli/channels_polls_get-answer-voters.go
new file mode 100644
index 00000000..108cbb34
--- /dev/null
+++ b/discord-cli/internal/cli/channels_polls_get-answer-voters.go
@@ -0,0 +1,66 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsPollsGetAnswerVotersCmd(flags *rootFlags) *cobra.Command {
+ var flagAfter string
+ var flagLimit int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "get-answer-voters <channel_id> <message_id> <answer_id>",
+ Aliases: []string{"get"},
+ Short: "Get answer voters",
+ Example: " discord-cli channels polls get-answer-voters abc123 abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/polls/{message_id}/answers/{answer_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("answer_id is required"))
+ }
+ path = replacePathParam(path, "answer_id", args[2])
+ data, err := paginatedGet(c, path, map[string]string{
+ "after": fmt.Sprintf("%v", flagAfter),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ }, flagAll, "after", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_recipients.go b/discord-cli/internal/cli/channels_recipients.go
new file mode 100644
index 00000000..30c4089a
--- /dev/null
+++ b/discord-cli/internal/cli/channels_recipients.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsRecipientsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "recipients",
+ Short: "Manage recipients",
+ }
+
+ cmd.AddCommand(newChannelsRecipientsAddGroupDmUserCmd(flags))
+ cmd.AddCommand(newChannelsRecipientsDeleteGroupDmUserCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_recipients_add-group-dm-user.go b/discord-cli/internal/cli/channels_recipients_add-group-dm-user.go
new file mode 100644
index 00000000..7b0dc52c
--- /dev/null
+++ b/discord-cli/internal/cli/channels_recipients_add-group-dm-user.go
@@ -0,0 +1,79 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsRecipientsAddGroupDmUserCmd(flags *rootFlags) *cobra.Command {
+ var bodyAccessToken string
+ var bodyNick string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "add-group-dm-user <channel_id> <user_id>",
+ Aliases: []string{"update"},
+ Short: "Add group dm user",
+ Example: " discord-cli channels recipients add-group-dm-user abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/recipients/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAccessToken != "" {
+ body["access_token"] = bodyAccessToken
+ }
+ if bodyNick != "" {
+ body["nick"] = bodyNick
+ }
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAccessToken, "access-token", "", "Access token")
+ cmd.Flags().StringVar(&bodyNick, "nick", "", "Nick")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_recipients_delete-group-dm-user.go b/discord-cli/internal/cli/channels_recipients_delete-group-dm-user.go
new file mode 100644
index 00000000..53930a80
--- /dev/null
+++ b/discord-cli/internal/cli/channels_recipients_delete-group-dm-user.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsRecipientsDeleteGroupDmUserCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-group-dm-user <channel_id> <user_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete group dm user",
+ Example: " discord-cli channels recipients delete-group-dm-user abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/recipients/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_send-soundboard-sound.go b/discord-cli/internal/cli/channels_send-soundboard-sound.go
new file mode 100644
index 00000000..a63e26de
--- /dev/null
+++ b/discord-cli/internal/cli/channels_send-soundboard-sound.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsSendSoundboardSoundCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "send-soundboard-sound",
+ Short: "Manage send soundboard sound",
+ }
+
+ cmd.AddCommand(newChannelsSendSoundboardSoundSendSoundboardSoundCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_send-soundboard-sound_send_soundboard_sound.go b/discord-cli/internal/cli/channels_send-soundboard-sound_send_soundboard_sound.go
new file mode 100644
index 00000000..e317e627
--- /dev/null
+++ b/discord-cli/internal/cli/channels_send-soundboard-sound_send_soundboard_sound.go
@@ -0,0 +1,76 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsSendSoundboardSoundSendSoundboardSoundCmd(flags *rootFlags) *cobra.Command {
+ var bodySoundId string
+ var bodySourceGuildId string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "send_soundboard_sound <channel_id>",
+ Aliases: []string{"create"},
+ Short: "Send soundboard sound",
+ Example: " discord-cli channels send-soundboard-sound send_soundboard_sound abc123 --sound-id abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/send-soundboard-sound"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodySoundId != "" {
+ body["sound_id"] = bodySoundId
+ }
+ if bodySourceGuildId != "" {
+ body["source_guild_id"] = bodySourceGuildId
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodySoundId, "sound-id", "", "Sound id")
+ _ = cmd.MarkFlagRequired("sound-id")
+ cmd.Flags().StringVar(&bodySourceGuildId, "source-guild-id", "", "Source guild id")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members.go b/discord-cli/internal/cli/channels_thread-members.go
new file mode 100644
index 00000000..6be0ec3b
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members.go
@@ -0,0 +1,22 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsThreadMembersCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "thread-members",
+ Short: "Manage thread members",
+ }
+
+ cmd.AddCommand(newChannelsThreadMembersAddCmd(flags))
+ cmd.AddCommand(newChannelsThreadMembersDeleteCmd(flags))
+ cmd.AddCommand(newChannelsThreadMembersGetCmd(flags))
+ cmd.AddCommand(newChannelsThreadMembersJoinThreadCmd(flags))
+ cmd.AddCommand(newChannelsThreadMembersLeaveThreadCmd(flags))
+ cmd.AddCommand(newChannelsThreadMembersListCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_add.go b/discord-cli/internal/cli/channels_thread-members_add.go
new file mode 100644
index 00000000..d562b457
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_add.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsThreadMembersAddCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "add <channel_id> <user_id>",
+ Aliases: []string{"update"},
+ Short: "Add",
+ Example: " discord-cli channels thread-members add abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/thread-members/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_delete.go b/discord-cli/internal/cli/channels_thread-members_delete.go
new file mode 100644
index 00000000..c7b3df97
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_delete.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsThreadMembersDeleteCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete <channel_id> <user_id>",
+ Short: "Delete",
+ Example: " discord-cli channels thread-members delete abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/thread-members/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_get.go b/discord-cli/internal/cli/channels_thread-members_get.go
new file mode 100644
index 00000000..31cc0c14
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_get.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsThreadMembersGetCmd(flags *rootFlags) *cobra.Command {
+ var flagWithMember bool
+
+ cmd := &cobra.Command{
+ Use: "get <channel_id> <user_id>",
+ Short: "Get",
+ Example: " discord-cli channels thread-members get abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/thread-members/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ params := map[string]string{}
+ if flagWithMember != false {
+ params["with_member"] = fmt.Sprintf("%v", flagWithMember)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWithMember, "with-member", false, "With member")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_join-thread.go b/discord-cli/internal/cli/channels_thread-members_join-thread.go
new file mode 100644
index 00000000..02e303cd
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_join-thread.go
@@ -0,0 +1,64 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsThreadMembersJoinThreadCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "join-thread <channel_id>",
+ Short: "Join thread",
+ Example: " discord-cli channels thread-members join-thread abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/thread-members/@me"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_leave-thread.go b/discord-cli/internal/cli/channels_thread-members_leave-thread.go
new file mode 100644
index 00000000..5f433b97
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_leave-thread.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsThreadMembersLeaveThreadCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "leave-thread <channel_id>",
+ Short: "Leave thread",
+ Example: " discord-cli channels thread-members leave-thread abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/thread-members/@me"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_list.go b/discord-cli/internal/cli/channels_thread-members_list.go
new file mode 100644
index 00000000..65a5fcee
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_list.go
@@ -0,0 +1,60 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsThreadMembersListCmd(flags *rootFlags) *cobra.Command {
+ var flagWithMember bool
+ var flagLimit int
+ var flagAfter string
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list <channel_id>",
+ Short: "List",
+ Example: " discord-cli channels thread-members list abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/thread-members"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "with_member": fmt.Sprintf("%v", flagWithMember),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ "after": fmt.Sprintf("%v", flagAfter),
+ }, flagAll, "after", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWithMember, "with-member", false, "With member")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_threads.go b/discord-cli/internal/cli/channels_threads.go
new file mode 100644
index 00000000..a2ce162d
--- /dev/null
+++ b/discord-cli/internal/cli/channels_threads.go
@@ -0,0 +1,20 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsThreadsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "threads",
+ Short: "Manage threads",
+ }
+
+ cmd.AddCommand(newChannelsThreadsCreateCmd(flags))
+ cmd.AddCommand(newChannelsThreadsListPrivateArchivedCmd(flags))
+ cmd.AddCommand(newChannelsThreadsListPublicArchivedCmd(flags))
+ cmd.AddCommand(newChannelsThreadsSearchCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_threads_create.go b/discord-cli/internal/cli/channels_threads_create.go
new file mode 100644
index 00000000..e4d21d51
--- /dev/null
+++ b/discord-cli/internal/cli/channels_threads_create.go
@@ -0,0 +1,64 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsThreadsCreateCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create <channel_id>",
+ Short: "Create",
+ Example: " discord-cli channels threads create abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/threads"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_threads_list-private-archived.go b/discord-cli/internal/cli/channels_threads_list-private-archived.go
new file mode 100644
index 00000000..68484c55
--- /dev/null
+++ b/discord-cli/internal/cli/channels_threads_list-private-archived.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsThreadsListPrivateArchivedCmd(flags *rootFlags) *cobra.Command {
+ var flagBefore string
+ var flagLimit int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list-private-archived <channel_id>",
+ Aliases: []string{"get"},
+ Short: "List private archived",
+ Example: " discord-cli channels threads list-private-archived abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/threads/archived/private"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "before": fmt.Sprintf("%v", flagBefore),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ }, flagAll, "", "", "has_more")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_threads_list-public-archived.go b/discord-cli/internal/cli/channels_threads_list-public-archived.go
new file mode 100644
index 00000000..b27d0e0c
--- /dev/null
+++ b/discord-cli/internal/cli/channels_threads_list-public-archived.go
@@ -0,0 +1,57 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsThreadsListPublicArchivedCmd(flags *rootFlags) *cobra.Command {
+ var flagBefore string
+ var flagLimit int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list-public-archived <channel_id>",
+ Short: "List public archived",
+ Example: " discord-cli channels threads list-public-archived abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/threads/archived/public"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "before": fmt.Sprintf("%v", flagBefore),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ }, flagAll, "", "", "has_more")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_threads_search.go b/discord-cli/internal/cli/channels_threads_search.go
new file mode 100644
index 00000000..9d4755a6
--- /dev/null
+++ b/discord-cli/internal/cli/channels_threads_search.go
@@ -0,0 +1,84 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsThreadsSearchCmd(flags *rootFlags) *cobra.Command {
+ var flagName string
+ var flagSlop int
+ var flagMinId string
+ var flagMaxId string
+ var flagTag string
+ var flagTagSetting string
+ var flagArchived bool
+ var flagSortBy string
+ var flagSortOrder string
+ var flagLimit int
+ var flagOffset int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "search <channel_id>",
+ Short: "Search",
+ Example: " discord-cli channels threads search abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/threads/search"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "name": fmt.Sprintf("%v", flagName),
+ "slop": fmt.Sprintf("%v", flagSlop),
+ "min_id": fmt.Sprintf("%v", flagMinId),
+ "max_id": fmt.Sprintf("%v", flagMaxId),
+ "tag": fmt.Sprintf("%v", flagTag),
+ "tag_setting": fmt.Sprintf("%v", flagTagSetting),
+ "archived": fmt.Sprintf("%v", flagArchived),
+ "sort_by": fmt.Sprintf("%v", flagSortBy),
+ "sort_order": fmt.Sprintf("%v", flagSortOrder),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ "offset": fmt.Sprintf("%v", flagOffset),
+ }, flagAll, "offset", "", "has_more")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagName, "name", "", "Name")
+ cmd.Flags().IntVar(&flagSlop, "slop", 0, "Slop")
+ cmd.Flags().StringVar(&flagMinId, "min-id", "", "Min id")
+ cmd.Flags().StringVar(&flagMaxId, "max-id", "", "Max id")
+ cmd.Flags().StringVar(&flagTag, "tag", "", "Tag")
+ cmd.Flags().StringVar(&flagTagSetting, "tag-setting", "", "Tag setting")
+ cmd.Flags().BoolVar(&flagArchived, "archived", false, "Archived")
+ cmd.Flags().StringVar(&flagSortBy, "sort-by", "", "Sort by")
+ cmd.Flags().StringVar(&flagSortOrder, "sort-order", "", "Sort order")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().IntVar(&flagOffset, "offset", 0, "Offset")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_typing.go b/discord-cli/internal/cli/channels_typing.go
new file mode 100644
index 00000000..89e447a8
--- /dev/null
+++ b/discord-cli/internal/cli/channels_typing.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsTypingCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "typing",
+ Short: "Manage typing",
+ }
+
+ cmd.AddCommand(newChannelsTypingTriggerIndicatorCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_typing_trigger-indicator.go b/discord-cli/internal/cli/channels_typing_trigger-indicator.go
new file mode 100644
index 00000000..090eadf6
--- /dev/null
+++ b/discord-cli/internal/cli/channels_typing_trigger-indicator.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsTypingTriggerIndicatorCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "trigger-indicator <channel_id>",
+ Aliases: []string{"create"},
+ Short: "Trigger indicator",
+ Example: " discord-cli channels typing trigger-indicator abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/typing"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_update.go b/discord-cli/internal/cli/channels_update.go
new file mode 100644
index 00000000..90574757
--- /dev/null
+++ b/discord-cli/internal/cli/channels_update.go
@@ -0,0 +1,64 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsUpdateCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update <channel_id>",
+ Short: "Update",
+ Example: " discord-cli channels update abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_users.go b/discord-cli/internal/cli/channels_users.go
new file mode 100644
index 00000000..09a05bfb
--- /dev/null
+++ b/discord-cli/internal/cli/channels_users.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsUsersCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "users",
+ Short: "Manage users",
+ }
+
+ cmd.AddCommand(newChannelsUsersListMyPrivateArchivedThreadsCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_users_list-my-private-archived-threads.go b/discord-cli/internal/cli/channels_users_list-my-private-archived-threads.go
new file mode 100644
index 00000000..204b8411
--- /dev/null
+++ b/discord-cli/internal/cli/channels_users_list-my-private-archived-threads.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsUsersListMyPrivateArchivedThreadsCmd(flags *rootFlags) *cobra.Command {
+ var flagBefore string
+ var flagLimit int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list-my-private-archived-threads <channel_id>",
+ Aliases: []string{"get"},
+ Short: "List my private archived threads",
+ Example: " discord-cli channels users list-my-private-archived-threads abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/users/@me/threads/archived/private"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "before": fmt.Sprintf("%v", flagBefore),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ }, flagAll, "", "", "has_more")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_webhooks.go b/discord-cli/internal/cli/channels_webhooks.go
new file mode 100644
index 00000000..ccbccdcd
--- /dev/null
+++ b/discord-cli/internal/cli/channels_webhooks.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newChannelsWebhooksCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "webhooks",
+ Short: "Manage webhooks",
+ }
+
+ cmd.AddCommand(newChannelsWebhooksCreateCmd(flags))
+ cmd.AddCommand(newChannelsWebhooksListChannelCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_webhooks_create.go b/discord-cli/internal/cli/channels_webhooks_create.go
new file mode 100644
index 00000000..51f367e0
--- /dev/null
+++ b/discord-cli/internal/cli/channels_webhooks_create.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsWebhooksCreateCmd(flags *rootFlags) *cobra.Command {
+ var bodyAvatar string
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create <channel_id>",
+ Short: "Create",
+ Example: " discord-cli channels webhooks create abc123 --name my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/webhooks"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAvatar != "" {
+ body["avatar"] = bodyAvatar
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAvatar, "avatar", "", "Avatar")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ _ = cmd.MarkFlagRequired("name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/channels_webhooks_list-channel.go b/discord-cli/internal/cli/channels_webhooks_list-channel.go
new file mode 100644
index 00000000..77bd7dd2
--- /dev/null
+++ b/discord-cli/internal/cli/channels_webhooks_list-channel.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newChannelsWebhooksListChannelCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-channel <channel_id>",
+ Aliases: []string{"get"},
+ Short: "List channel",
+ Example: " discord-cli channels webhooks list-channel abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/channels/{channel_id}/webhooks"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/doctor.go b/discord-cli/internal/cli/doctor.go
new file mode 100644
index 00000000..86bb76ec
--- /dev/null
+++ b/discord-cli/internal/cli/doctor.go
@@ -0,0 +1,138 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "fmt"
+ "net/http"
+ "os"
+ "strings"
+ "time"
+
+ "github.com/USER/discord-cli/internal/config"
+ "github.com/spf13/cobra"
+)
+
+func newDoctorCmd(flags *rootFlags) *cobra.Command {
+ return &cobra.Command{
+ Use: "doctor",
+ Short: "Check CLI health",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ report := map[string]any{}
+
+ // Check config
+ cfg, err := config.Load(flags.configPath)
+ if err != nil {
+ report["config"] = fmt.Sprintf("error: %s", err)
+ } else {
+ report["config"] = "ok"
+ report["config_path"] = cfg.Path
+ report["base_url"] = cfg.BaseURL
+ }
+
+ // Check auth
+ if cfg != nil {
+ header := cfg.AuthHeader()
+ if header == "" {
+ report["auth"] = "not configured"
+ } else {
+ report["auth"] = "configured"
+ report["auth_source"] = cfg.AuthSource
+ }
+ }
+
+ // Check auth environment variables
+ authEnvChecked := 0
+ authEnvSet := 0
+ authEnvChecked++
+ if os.Getenv("DISCORD_TOKEN") != "" {
+ authEnvSet++
+ }
+ if authEnvSet == 0 {
+ report["env_vars"] = fmt.Sprintf("none set (checked %d)", authEnvChecked)
+ } else {
+ report["env_vars"] = fmt.Sprintf("%d/%d set", authEnvSet, authEnvChecked)
+ }
+
+ // Check API connectivity
+ if cfg != nil && cfg.BaseURL != "" {
+ httpClient := &http.Client{Timeout: 5 * time.Second}
+
+ // Health check: HEAD request to base URL
+ headReq, _ := http.NewRequest("HEAD", cfg.BaseURL, nil)
+ headResp, headErr := httpClient.Do(headReq)
+ if headErr != nil {
+ report["api_head"] = fmt.Sprintf("unreachable: %s", headErr)
+ } else {
+ headResp.Body.Close()
+ report["api_head"] = fmt.Sprintf("HTTP %d", headResp.StatusCode)
+ }
+
+ // Health check: try common health endpoints
+ healthPaths := []string{"/health", "/healthz", "/status", "/ping", ""}
+ reached := false
+ for _, p := range healthPaths {
+ healthURL := strings.TrimRight(cfg.BaseURL, "/") + p
+ healthResp, healthErr := httpClient.Get(healthURL)
+ if healthErr != nil {
+ continue
+ }
+ healthResp.Body.Close()
+ if healthResp.StatusCode >= 200 && healthResp.StatusCode < 400 {
+ report["api"] = fmt.Sprintf("reachable (HTTP %d at %s)", healthResp.StatusCode, p)
+ reached = true
+ break
+ }
+ }
+
+ if !reached {
+ // Fall back to GET on base URL
+ fallbackResp, fallbackErr := httpClient.Get(cfg.BaseURL)
+ if fallbackErr != nil {
+ report["api"] = fmt.Sprintf("unreachable: %s", fallbackErr)
+ } else {
+ fallbackResp.Body.Close()
+ report["api"] = fmt.Sprintf("degraded (HTTP %d)", fallbackResp.StatusCode)
+ }
+ }
+ } else if cfg != nil && cfg.BaseURL == "" {
+ report["api"] = "not configured (set base_url in config file)"
+ }
+
+ report["version"] = version
+
+ if flags.asJSON {
+ return flags.printJSON(cmd, report)
+ }
+
+ // Human-readable output with color
+ w := cmd.OutOrStdout()
+ checkKeys := []struct{ key, label string }{
+ {"config", "Config"},
+ {"auth", "Auth"},
+ {"api", "API"},
+ }
+ for _, ck := range checkKeys {
+ v, ok := report[ck.key]
+ if !ok {
+ continue
+ }
+ s := fmt.Sprintf("%v", v)
+ indicator := green("OK")
+ if strings.Contains(s, "error") || strings.Contains(s, "not configured") || strings.Contains(s, "unreachable") {
+ indicator = red("FAIL")
+ } else if strings.Contains(s, "not ") {
+ indicator = yellow("WARN")
+ }
+ fmt.Fprintf(w, " %s %s: %s\n", indicator, ck.label, s)
+ }
+ // Print info keys without status indicator
+ for _, key := range []string{"config_path", "base_url", "auth_source", "version"} {
+ if v, ok := report[key]; ok {
+ fmt.Fprintf(w, " %s: %v\n", key, v)
+ }
+ }
+ return nil
+ },
+ }
+}
diff --git a/discord-cli/internal/cli/export.go b/discord-cli/internal/cli/export.go
new file mode 100644
index 00000000..c11998d2
--- /dev/null
+++ b/discord-cli/internal/cli/export.go
@@ -0,0 +1,106 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "bufio"
+ "encoding/json"
+ "fmt"
+ "os"
+
+ "github.com/spf13/cobra"
+)
+
+func newExportCmd(flags *rootFlags) *cobra.Command {
+ var format string
+ var outputFile string
+ var limit int
+ var noCache bool
+
+ cmd := &cobra.Command{
+ Use: "export <resource> [id]",
+ Short: "Export data to JSONL or JSON for backup, migration, or analysis",
+ Long: `Export paginated API data to a local file. Supports JSONL (one JSON object
+per line, streaming-friendly) and JSON (array). JSONL is recommended for
+large datasets as it has no memory pressure.`,
+ Example: ` # Export all items as JSONL (streaming, recommended for large datasets)
+ discord-cli export <resource> --format jsonl --output data.jsonl
+
+ # Export with limit
+ discord-cli export <resource> --format jsonl --limit 1000
+
+ # Pipe to another tool
+ discord-cli export <resource> --format jsonl | jq '.id'`,
+ Args: cobra.MinimumNArgs(1),
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+ if noCache {
+ c.NoCache = true
+ }
+
+ resource := args[0]
+ path := "/" + resource
+ if len(args) > 1 {
+ path += "/" + args[1]
+ }
+
+ var writer *bufio.Writer
+ if outputFile != "" {
+ f, err := os.Create(outputFile)
+ if err != nil {
+ return fmt.Errorf("creating output file: %w", err)
+ }
+ defer f.Close()
+ writer = bufio.NewWriter(f)
+ defer writer.Flush()
+ } else {
+ writer = bufio.NewWriter(os.Stdout)
+ defer writer.Flush()
+ }
+
+ data, err := c.Get(path, nil)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ switch format {
+ case "jsonl":
+ var items []json.RawMessage
+ if err := json.Unmarshal(data, &items); err != nil {
+ fmt.Fprintln(writer, string(data))
+ return nil
+ }
+ count := 0
+ for _, item := range items {
+ if limit > 0 && count >= limit {
+ break
+ }
+ fmt.Fprintln(writer, string(item))
+ count++
+ }
+ if outputFile != "" {
+ fmt.Fprintf(os.Stderr, "Exported %d records to %s\n", count, outputFile)
+ }
+ default:
+ enc := json.NewEncoder(writer)
+ enc.SetIndent("", " ")
+ var parsed any
+ if err := json.Unmarshal(data, &parsed); err != nil {
+ return err
+ }
+ return enc.Encode(parsed)
+ }
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&format, "format", "jsonl", "Output format: jsonl or json")
+ cmd.Flags().StringVarP(&outputFile, "output", "o", "", "Output file path (default: stdout)")
+ cmd.Flags().IntVar(&limit, "limit", 0, "Maximum records to export (0 = unlimited)")
+ cmd.Flags().BoolVar(&noCache, "no-cache", false, "Bypass response cache for fresh data")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/gateway.go b/discord-cli/internal/cli/gateway.go
new file mode 100644
index 00000000..2e75b428
--- /dev/null
+++ b/discord-cli/internal/cli/gateway.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGatewayCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "gateway",
+ Short: "Manage gateway",
+ }
+
+ cmd.AddCommand(newGatewayGetCmd(flags))
+ cmd.AddCommand(newGatewayGetBotCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/gateway_get-bot.go b/discord-cli/internal/cli/gateway_get-bot.go
new file mode 100644
index 00000000..c2a58ee0
--- /dev/null
+++ b/discord-cli/internal/cli/gateway_get-bot.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGatewayGetBotCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-bot",
+ Short: "Get bot",
+ Example: " discord-cli gateway get-bot",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/gateway/bot"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/gateway_get.go b/discord-cli/internal/cli/gateway_get.go
new file mode 100644
index 00000000..7a433a47
--- /dev/null
+++ b/discord-cli/internal/cli/gateway_get.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGatewayGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get",
+ Aliases: []string{"list"},
+ Short: "Get",
+ Example: " discord-cli gateway get",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/gateway"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds.go b/discord-cli/internal/cli/guilds.go
new file mode 100644
index 00000000..36837637
--- /dev/null
+++ b/discord-cli/internal/cli/guilds.go
@@ -0,0 +1,47 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "guilds",
+ Short: "Manage Discord guilds (servers) - members, roles, bans, channels, audit logs, and more",
+ }
+
+ cmd.AddCommand(newGuildsGetCmd(flags))
+ cmd.AddCommand(newGuildsGetTemplateCmd(flags))
+ cmd.AddCommand(newGuildsUpdateCmd(flags))
+ cmd.AddCommand(newGuildsAuditLogsCmd(flags))
+ cmd.AddCommand(newGuildsAutoModerationCmd(flags))
+ cmd.AddCommand(newGuildsBansCmd(flags))
+ cmd.AddCommand(newGuildsBulkBanCmd(flags))
+ cmd.AddCommand(newGuildsChannelsCmd(flags))
+ cmd.AddCommand(newGuildsEmojisCmd(flags))
+ cmd.AddCommand(newGuildsIntegrationsCmd(flags))
+ cmd.AddCommand(newGuildsInvitesCmd(flags))
+ cmd.AddCommand(newGuildsMembersCmd(flags))
+ cmd.AddCommand(newGuildsMessagesCmd(flags))
+ cmd.AddCommand(newGuildsNewMemberWelcomeCmd(flags))
+ cmd.AddCommand(newGuildsOnboardingCmd(flags))
+ cmd.AddCommand(newGuildsPreviewCmd(flags))
+ cmd.AddCommand(newGuildsPruneCmd(flags))
+ cmd.AddCommand(newGuildsRegionsCmd(flags))
+ cmd.AddCommand(newGuildsRolesCmd(flags))
+ cmd.AddCommand(newGuildsScheduledEventsCmd(flags))
+ cmd.AddCommand(newGuildsSoundboardSoundsCmd(flags))
+ cmd.AddCommand(newGuildsStickersCmd(flags))
+ cmd.AddCommand(newGuildsTemplatesCmd(flags))
+ cmd.AddCommand(newGuildsThreadsCmd(flags))
+ cmd.AddCommand(newGuildsVanityUrlCmd(flags))
+ cmd.AddCommand(newGuildsVoiceStatesCmd(flags))
+ cmd.AddCommand(newGuildsWebhooksCmd(flags))
+ cmd.AddCommand(newGuildsWelcomeScreenCmd(flags))
+ cmd.AddCommand(newGuildsWidgetCmd(flags))
+ cmd.AddCommand(newGuildsWidgetJsonCmd(flags))
+ cmd.AddCommand(newGuildsWidgetPngCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_audit-logs.go b/discord-cli/internal/cli/guilds_audit-logs.go
new file mode 100644
index 00000000..ae9a0f9d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_audit-logs.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsAuditLogsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "audit-logs",
+ Short: "Manage audit logs",
+ }
+
+ cmd.AddCommand(newGuildsAuditLogsListGuildEntriesCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_audit-logs_list-guild-entries.go b/discord-cli/internal/cli/guilds_audit-logs_list-guild-entries.go
new file mode 100644
index 00000000..82507356
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_audit-logs_list-guild-entries.go
@@ -0,0 +1,70 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsAuditLogsListGuildEntriesCmd(flags *rootFlags) *cobra.Command {
+ var flagUserId string
+ var flagTargetId string
+ var flagActionType int
+ var flagBefore string
+ var flagAfter string
+ var flagLimit int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list-guild-entries <guild_id>",
+ Aliases: []string{"get"},
+ Short: "List guild entries",
+ Example: " discord-cli guilds audit-logs list-guild-entries abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/audit-logs"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "user_id": fmt.Sprintf("%v", flagUserId),
+ "target_id": fmt.Sprintf("%v", flagTargetId),
+ "action_type": fmt.Sprintf("%v", flagActionType),
+ "before": fmt.Sprintf("%v", flagBefore),
+ "after": fmt.Sprintf("%v", flagAfter),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ }, flagAll, "after", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagUserId, "user-id", "", "User id")
+ cmd.Flags().StringVar(&flagTargetId, "target-id", "", "Target id")
+ cmd.Flags().IntVar(&flagActionType, "action-type", 0, "Action type")
+ cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+ cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation.go b/discord-cli/internal/cli/guilds_auto-moderation.go
new file mode 100644
index 00000000..8ad68d69
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsAutoModerationCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "auto-moderation",
+ Short: "Manage auto moderation",
+ }
+
+ cmd.AddCommand(newGuildsAutoModerationCreateRuleCmd(flags))
+ cmd.AddCommand(newGuildsAutoModerationDeleteRuleCmd(flags))
+ cmd.AddCommand(newGuildsAutoModerationGetRuleCmd(flags))
+ cmd.AddCommand(newGuildsAutoModerationListRulesCmd(flags))
+ cmd.AddCommand(newGuildsAutoModerationUpdateRuleCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation_create-rule.go b/discord-cli/internal/cli/guilds_auto-moderation_create-rule.go
new file mode 100644
index 00000000..ffabfc60
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation_create-rule.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsAutoModerationCreateRuleCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-rule <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Create rule",
+ Example: " discord-cli guilds auto-moderation create-rule abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/auto-moderation/rules"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation_delete-rule.go b/discord-cli/internal/cli/guilds_auto-moderation_delete-rule.go
new file mode 100644
index 00000000..1fdde628
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation_delete-rule.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsAutoModerationDeleteRuleCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-rule <guild_id> <rule_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete rule",
+ Example: " discord-cli guilds auto-moderation delete-rule abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/auto-moderation/rules/{rule_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("rule_id is required"))
+ }
+ path = replacePathParam(path, "rule_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation_get-rule.go b/discord-cli/internal/cli/guilds_auto-moderation_get-rule.go
new file mode 100644
index 00000000..6e0b0b0f
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation_get-rule.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsAutoModerationGetRuleCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-rule <guild_id> <rule_id>",
+ Aliases: []string{"get"},
+ Short: "Get rule",
+ Example: " discord-cli guilds auto-moderation get-rule abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/auto-moderation/rules/{rule_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("rule_id is required"))
+ }
+ path = replacePathParam(path, "rule_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation_list-rules.go b/discord-cli/internal/cli/guilds_auto-moderation_list-rules.go
new file mode 100644
index 00000000..0da99dd8
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation_list-rules.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsAutoModerationListRulesCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-rules <guild_id>",
+ Short: "List rules",
+ Example: " discord-cli guilds auto-moderation list-rules abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/auto-moderation/rules"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation_update-rule.go b/discord-cli/internal/cli/guilds_auto-moderation_update-rule.go
new file mode 100644
index 00000000..428e6364
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation_update-rule.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsAutoModerationUpdateRuleCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-rule <guild_id> <rule_id>",
+ Aliases: []string{"update"},
+ Short: "Update rule",
+ Example: " discord-cli guilds auto-moderation update-rule abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/auto-moderation/rules/{rule_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("rule_id is required"))
+ }
+ path = replacePathParam(path, "rule_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bans.go b/discord-cli/internal/cli/guilds_bans.go
new file mode 100644
index 00000000..ae36efa3
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bans.go
@@ -0,0 +1,20 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsBansCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "bans",
+ Short: "Manage bans",
+ }
+
+ cmd.AddCommand(newGuildsBansGetGuildCmd(flags))
+ cmd.AddCommand(newGuildsBansListGuildCmd(flags))
+ cmd.AddCommand(newGuildsBansUnbanUserFromGuildCmd(flags))
+ cmd.AddCommand(newGuildsBansUserFromGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bans_get-guild.go b/discord-cli/internal/cli/guilds_bans_get-guild.go
new file mode 100644
index 00000000..b6f806fb
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bans_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsBansGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id> <user_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds bans get-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/bans/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bans_list-guild.go b/discord-cli/internal/cli/guilds_bans_list-guild.go
new file mode 100644
index 00000000..321a2400
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bans_list-guild.go
@@ -0,0 +1,60 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsBansListGuildCmd(flags *rootFlags) *cobra.Command {
+ var flagLimit int
+ var flagBefore string
+ var flagAfter string
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Short: "List guild",
+ Example: " discord-cli guilds bans list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/bans"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "limit": fmt.Sprintf("%v", flagLimit),
+ "before": fmt.Sprintf("%v", flagBefore),
+ "after": fmt.Sprintf("%v", flagAfter),
+ }, flagAll, "after", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+ cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bans_unban-user-from-guild.go b/discord-cli/internal/cli/guilds_bans_unban-user-from-guild.go
new file mode 100644
index 00000000..dac721ec
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bans_unban-user-from-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsBansUnbanUserFromGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "unban-user-from-guild <guild_id> <user_id>",
+ Aliases: []string{"delete"},
+ Short: "Unban user from guild",
+ Example: " discord-cli guilds bans unban-user-from-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/bans/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bans_user-from-guild.go b/discord-cli/internal/cli/guilds_bans_user-from-guild.go
new file mode 100644
index 00000000..d266abcd
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bans_user-from-guild.go
@@ -0,0 +1,79 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsBansUserFromGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyDeleteMessageDays int
+ var bodyDeleteMessageSeconds int
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "user-from-guild <guild_id> <user_id>",
+ Aliases: []string{"update"},
+ Short: "User from guild",
+ Example: " discord-cli guilds bans user-from-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/bans/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDeleteMessageDays != 0 {
+ body["delete_message_days"] = bodyDeleteMessageDays
+ }
+ if bodyDeleteMessageSeconds != 0 {
+ body["delete_message_seconds"] = bodyDeleteMessageSeconds
+ }
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyDeleteMessageDays, "delete-message-days", 0, "Delete message days")
+ cmd.Flags().IntVar(&bodyDeleteMessageSeconds, "delete-message-seconds", 0, "Delete message seconds")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bulk-ban.go b/discord-cli/internal/cli/guilds_bulk-ban.go
new file mode 100644
index 00000000..cd3f62b0
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bulk-ban.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsBulkBanCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "bulk-ban",
+ Short: "Manage bulk ban",
+ }
+
+ cmd.AddCommand(newGuildsBulkBanUsersFromGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bulk-ban_users-from-guild.go b/discord-cli/internal/cli/guilds_bulk-ban_users-from-guild.go
new file mode 100644
index 00000000..836334ce
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bulk-ban_users-from-guild.go
@@ -0,0 +1,70 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsBulkBanUsersFromGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyDeleteMessageSeconds int
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "users-from-guild <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Users from guild",
+ Example: " discord-cli guilds bulk-ban users-from-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/bulk-ban"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDeleteMessageSeconds != 0 {
+ body["delete_message_seconds"] = bodyDeleteMessageSeconds
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyDeleteMessageSeconds, "delete-message-seconds", 0, "Delete message seconds")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_channels.go b/discord-cli/internal/cli/guilds_channels.go
new file mode 100644
index 00000000..95d71bb1
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_channels.go
@@ -0,0 +1,19 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsChannelsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "channels",
+ Short: "Manage channels",
+ }
+
+ cmd.AddCommand(newGuildsChannelsBulkUpdateGuildCmd(flags))
+ cmd.AddCommand(newGuildsChannelsCreateGuildCmd(flags))
+ cmd.AddCommand(newGuildsChannelsListGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_channels_bulk-update-guild.go b/discord-cli/internal/cli/guilds_channels_bulk-update-guild.go
new file mode 100644
index 00000000..9ed27fb4
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_channels_bulk-update-guild.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsChannelsBulkUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "bulk-update-guild <guild_id>",
+ Aliases: []string{"update"},
+ Short: "Bulk update guild",
+ Example: " discord-cli guilds channels bulk-update-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/channels"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_channels_create-guild.go b/discord-cli/internal/cli/guilds_channels_create-guild.go
new file mode 100644
index 00000000..c93455dd
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_channels_create-guild.go
@@ -0,0 +1,151 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsChannelsCreateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyBitrate int
+ var bodyDefaultAutoArchiveDuration string
+ var bodyDefaultForumLayout string
+ var bodyDefaultReactionEmoji string
+ var bodyDefaultSortOrder string
+ var bodyDefaultTagSetting string
+ var bodyDefaultThreadRateLimitPerUser int
+ var bodyName string
+ var bodyNsfw bool
+ var bodyParentId string
+ var bodyPosition int
+ var bodyRateLimitPerUser int
+ var bodyRtcRegion string
+ var bodyTopic string
+ var bodyType string
+ var bodyUserLimit int
+ var bodyVideoQualityMode string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-guild <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Create guild",
+ Example: " discord-cli guilds channels create-guild abc123 --name my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/channels"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyBitrate != 0 {
+ body["bitrate"] = bodyBitrate
+ }
+ if bodyDefaultAutoArchiveDuration != "" {
+ body["default_auto_archive_duration"] = bodyDefaultAutoArchiveDuration
+ }
+ if bodyDefaultForumLayout != "" {
+ body["default_forum_layout"] = bodyDefaultForumLayout
+ }
+ if bodyDefaultReactionEmoji != "" {
+ body["default_reaction_emoji"] = bodyDefaultReactionEmoji
+ }
+ if bodyDefaultSortOrder != "" {
+ body["default_sort_order"] = bodyDefaultSortOrder
+ }
+ if bodyDefaultTagSetting != "" {
+ body["default_tag_setting"] = bodyDefaultTagSetting
+ }
+ if bodyDefaultThreadRateLimitPerUser != 0 {
+ body["default_thread_rate_limit_per_user"] = bodyDefaultThreadRateLimitPerUser
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodyNsfw != false {
+ body["nsfw"] = bodyNsfw
+ }
+ if bodyParentId != "" {
+ body["parent_id"] = bodyParentId
+ }
+ if bodyPosition != 0 {
+ body["position"] = bodyPosition
+ }
+ if bodyRateLimitPerUser != 0 {
+ body["rate_limit_per_user"] = bodyRateLimitPerUser
+ }
+ if bodyRtcRegion != "" {
+ body["rtc_region"] = bodyRtcRegion
+ }
+ if bodyTopic != "" {
+ body["topic"] = bodyTopic
+ }
+ if bodyType != "" {
+ body["type"] = bodyType
+ }
+ if bodyUserLimit != 0 {
+ body["user_limit"] = bodyUserLimit
+ }
+ if bodyVideoQualityMode != "" {
+ body["video_quality_mode"] = bodyVideoQualityMode
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyBitrate, "bitrate", 0, "Bitrate")
+ cmd.Flags().StringVar(&bodyDefaultAutoArchiveDuration, "default-auto-archive-duration", "", "Default auto archive duration")
+ cmd.Flags().StringVar(&bodyDefaultForumLayout, "default-forum-layout", "", "Default forum layout")
+ cmd.Flags().StringVar(&bodyDefaultReactionEmoji, "default-reaction-emoji", "", "Default reaction emoji")
+ cmd.Flags().StringVar(&bodyDefaultSortOrder, "default-sort-order", "", "Default sort order")
+ cmd.Flags().StringVar(&bodyDefaultTagSetting, "default-tag-setting", "", "Default tag setting")
+ cmd.Flags().IntVar(&bodyDefaultThreadRateLimitPerUser, "default-thread-rate-limit-per-user", 0, "Default thread rate limit per user")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ _ = cmd.MarkFlagRequired("name")
+ cmd.Flags().BoolVar(&bodyNsfw, "nsfw", false, "Nsfw")
+ cmd.Flags().StringVar(&bodyParentId, "parent-id", "", "Parent id")
+ cmd.Flags().IntVar(&bodyPosition, "position", 0, "Position")
+ cmd.Flags().IntVar(&bodyRateLimitPerUser, "rate-limit-per-user", 0, "Rate limit per user")
+ cmd.Flags().StringVar(&bodyRtcRegion, "rtc-region", "", "Rtc region")
+ cmd.Flags().StringVar(&bodyTopic, "topic", "", "Topic")
+ cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+ cmd.Flags().IntVar(&bodyUserLimit, "user-limit", 0, "User limit")
+ cmd.Flags().StringVar(&bodyVideoQualityMode, "video-quality-mode", "", "Video quality mode")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_channels_list-guild.go b/discord-cli/internal/cli/guilds_channels_list-guild.go
new file mode 100644
index 00000000..17fae30d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_channels_list-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsChannelsListGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "List guild",
+ Example: " discord-cli guilds channels list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/channels"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis.go b/discord-cli/internal/cli/guilds_emojis.go
new file mode 100644
index 00000000..5c612aec
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsEmojisCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "emojis",
+ Short: "Manage emojis",
+ }
+
+ cmd.AddCommand(newGuildsEmojisCreateGuildCmd(flags))
+ cmd.AddCommand(newGuildsEmojisDeleteGuildCmd(flags))
+ cmd.AddCommand(newGuildsEmojisGetGuildCmd(flags))
+ cmd.AddCommand(newGuildsEmojisListGuildCmd(flags))
+ cmd.AddCommand(newGuildsEmojisUpdateGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis_create-guild.go b/discord-cli/internal/cli/guilds_emojis_create-guild.go
new file mode 100644
index 00000000..b0f0a957
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis_create-guild.go
@@ -0,0 +1,77 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsEmojisCreateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyImage string
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-guild <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Create guild",
+ Example: " discord-cli guilds emojis create-guild abc123 --image value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/emojis"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyImage != "" {
+ body["image"] = bodyImage
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyImage, "image", "", "Image")
+ _ = cmd.MarkFlagRequired("image")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ _ = cmd.MarkFlagRequired("name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis_delete-guild.go b/discord-cli/internal/cli/guilds_emojis_delete-guild.go
new file mode 100644
index 00000000..ef1aa49d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsEmojisDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-guild <guild_id> <emoji_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete guild",
+ Example: " discord-cli guilds emojis delete-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/emojis/{emoji_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("emoji_id is required"))
+ }
+ path = replacePathParam(path, "emoji_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis_get-guild.go b/discord-cli/internal/cli/guilds_emojis_get-guild.go
new file mode 100644
index 00000000..18a1e6d7
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsEmojisGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id> <emoji_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds emojis get-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/emojis/{emoji_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("emoji_id is required"))
+ }
+ path = replacePathParam(path, "emoji_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis_list-guild.go b/discord-cli/internal/cli/guilds_emojis_list-guild.go
new file mode 100644
index 00000000..d2de44d7
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis_list-guild.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsEmojisListGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Short: "List guild",
+ Example: " discord-cli guilds emojis list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/emojis"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis_update-guild.go b/discord-cli/internal/cli/guilds_emojis_update-guild.go
new file mode 100644
index 00000000..b727de21
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis_update-guild.go
@@ -0,0 +1,74 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsEmojisUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-guild <guild_id> <emoji_id>",
+ Aliases: []string{"update"},
+ Short: "Update guild",
+ Example: " discord-cli guilds emojis update-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/emojis/{emoji_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("emoji_id is required"))
+ }
+ path = replacePathParam(path, "emoji_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_get-template.go b/discord-cli/internal/cli/guilds_get-template.go
new file mode 100644
index 00000000..6244fe5b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_get-template.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsGetTemplateCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-template <code>",
+ Short: "Get template",
+ Example: " discord-cli guilds get-template value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/templates/{code}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("code is required"))
+ }
+ path = replacePathParam(path, "code", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_get.go b/discord-cli/internal/cli/guilds_get.go
new file mode 100644
index 00000000..1898b25d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_get.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsGetCmd(flags *rootFlags) *cobra.Command {
+ var flagWithCounts bool
+
+ cmd := &cobra.Command{
+ Use: "get <guild_id>",
+ Short: "Get",
+ Example: " discord-cli guilds get abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ if flagWithCounts != false {
+ params["with_counts"] = fmt.Sprintf("%v", flagWithCounts)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWithCounts, "with-counts", false, "With counts")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_integrations.go b/discord-cli/internal/cli/guilds_integrations.go
new file mode 100644
index 00000000..e870fcaf
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_integrations.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsIntegrationsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "integrations",
+ Short: "Manage integrations",
+ }
+
+ cmd.AddCommand(newGuildsIntegrationsDeleteGuildCmd(flags))
+ cmd.AddCommand(newGuildsIntegrationsListGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_integrations_delete-guild.go b/discord-cli/internal/cli/guilds_integrations_delete-guild.go
new file mode 100644
index 00000000..12514257
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_integrations_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsIntegrationsDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-guild <guild_id> <integration_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete guild",
+ Example: " discord-cli guilds integrations delete-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/integrations/{integration_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("integration_id is required"))
+ }
+ path = replacePathParam(path, "integration_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_integrations_list-guild.go b/discord-cli/internal/cli/guilds_integrations_list-guild.go
new file mode 100644
index 00000000..6e97b811
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_integrations_list-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsIntegrationsListGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "List guild",
+ Example: " discord-cli guilds integrations list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/integrations"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_invites.go b/discord-cli/internal/cli/guilds_invites.go
new file mode 100644
index 00000000..65c10b2b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_invites.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsInvitesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "invites",
+ Short: "Manage invites",
+ }
+
+ cmd.AddCommand(newGuildsInvitesListGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_invites_list-guild.go b/discord-cli/internal/cli/guilds_invites_list-guild.go
new file mode 100644
index 00000000..4477842c
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_invites_list-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsInvitesListGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "List guild",
+ Example: " discord-cli guilds invites list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/invites"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members.go b/discord-cli/internal/cli/guilds_members.go
new file mode 100644
index 00000000..e1016e43
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members.go
@@ -0,0 +1,25 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsMembersCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "members",
+ Short: "Manage members",
+ }
+
+ cmd.AddCommand(newGuildsMembersAddGuildCmd(flags))
+ cmd.AddCommand(newGuildsMembersAddGuildRoleCmd(flags))
+ cmd.AddCommand(newGuildsMembersDeleteGuildCmd(flags))
+ cmd.AddCommand(newGuildsMembersDeleteGuildRoleCmd(flags))
+ cmd.AddCommand(newGuildsMembersGetGuildCmd(flags))
+ cmd.AddCommand(newGuildsMembersListGuildCmd(flags))
+ cmd.AddCommand(newGuildsMembersSearchGuildCmd(flags))
+ cmd.AddCommand(newGuildsMembersUpdateGuildCmd(flags))
+ cmd.AddCommand(newGuildsMembersUpdateMyGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_add-guild-role.go b/discord-cli/internal/cli/guilds_members_add-guild-role.go
new file mode 100644
index 00000000..76aee92b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_add-guild-role.go
@@ -0,0 +1,72 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsMembersAddGuildRoleCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "add-guild-role <guild_id> <user_id> <role_id>",
+ Short: "Add guild role",
+ Example: " discord-cli guilds members add-guild-role abc123 abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/members/{user_id}/roles/{role_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("role_id is required"))
+ }
+ path = replacePathParam(path, "role_id", args[2])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_add-guild.go b/discord-cli/internal/cli/guilds_members_add-guild.go
new file mode 100644
index 00000000..f98842c7
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_add-guild.go
@@ -0,0 +1,95 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsMembersAddGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyAccessToken string
+ var bodyDeaf bool
+ var bodyFlags int
+ var bodyMute bool
+ var bodyNick string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "add-guild <guild_id> <user_id>",
+ Aliases: []string{"update"},
+ Short: "Add guild",
+ Example: " discord-cli guilds members add-guild abc123 abc123 --access-token value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/members/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAccessToken != "" {
+ body["access_token"] = bodyAccessToken
+ }
+ if bodyDeaf != false {
+ body["deaf"] = bodyDeaf
+ }
+ if bodyFlags != 0 {
+ body["flags"] = bodyFlags
+ }
+ if bodyMute != false {
+ body["mute"] = bodyMute
+ }
+ if bodyNick != "" {
+ body["nick"] = bodyNick
+ }
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAccessToken, "access-token", "", "Access token")
+ _ = cmd.MarkFlagRequired("access-token")
+ cmd.Flags().BoolVar(&bodyDeaf, "deaf", false, "Deaf")
+ cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+ cmd.Flags().BoolVar(&bodyMute, "mute", false, "Mute")
+ cmd.Flags().StringVar(&bodyNick, "nick", "", "Nick")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_delete-guild-role.go b/discord-cli/internal/cli/guilds_members_delete-guild-role.go
new file mode 100644
index 00000000..735099a7
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_delete-guild-role.go
@@ -0,0 +1,56 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsMembersDeleteGuildRoleCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-guild-role <guild_id> <user_id> <role_id>",
+ Short: "Delete guild role",
+ Example: " discord-cli guilds members delete-guild-role abc123 abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/members/{user_id}/roles/{role_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("role_id is required"))
+ }
+ path = replacePathParam(path, "role_id", args[2])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_delete-guild.go b/discord-cli/internal/cli/guilds_members_delete-guild.go
new file mode 100644
index 00000000..6b2971cb
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsMembersDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-guild <guild_id> <user_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete guild",
+ Example: " discord-cli guilds members delete-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/members/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_get-guild.go b/discord-cli/internal/cli/guilds_members_get-guild.go
new file mode 100644
index 00000000..c8811aba
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsMembersGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id> <user_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds members get-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/members/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_list-guild.go b/discord-cli/internal/cli/guilds_members_list-guild.go
new file mode 100644
index 00000000..b2a09cc4
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_list-guild.go
@@ -0,0 +1,57 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsMembersListGuildCmd(flags *rootFlags) *cobra.Command {
+ var flagLimit int
+ var flagAfter int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Short: "List guild",
+ Example: " discord-cli guilds members list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/members"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "limit": fmt.Sprintf("%v", flagLimit),
+ "after": fmt.Sprintf("%v", flagAfter),
+ }, flagAll, "after", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().IntVar(&flagAfter, "after", 0, "After")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_search-guild.go b/discord-cli/internal/cli/guilds_members_search-guild.go
new file mode 100644
index 00000000..9f9dfba5
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_search-guild.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsMembersSearchGuildCmd(flags *rootFlags) *cobra.Command {
+ var flagLimit int
+ var flagQuery string
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "search-guild <guild_id>",
+ Short: "Search guild",
+ Example: " discord-cli guilds members search-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/members/search"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "limit": fmt.Sprintf("%v", flagLimit),
+ "query": fmt.Sprintf("%v", flagQuery),
+ }, flagAll, "", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().StringVar(&flagQuery, "query", "", "Query")
+ _ = cmd.MarkFlagRequired("query")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_update-guild.go b/discord-cli/internal/cli/guilds_members_update-guild.go
new file mode 100644
index 00000000..3bf9b8ce
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_update-guild.go
@@ -0,0 +1,98 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsMembersUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyChannelId string
+ var bodyCommunicationDisabledUntil string
+ var bodyDeaf bool
+ var bodyFlags int
+ var bodyMute bool
+ var bodyNick string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-guild <guild_id> <user_id>",
+ Short: "Update guild",
+ Example: " discord-cli guilds members update-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/members/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyChannelId != "" {
+ body["channel_id"] = bodyChannelId
+ }
+ if bodyCommunicationDisabledUntil != "" {
+ body["communication_disabled_until"] = bodyCommunicationDisabledUntil
+ }
+ if bodyDeaf != false {
+ body["deaf"] = bodyDeaf
+ }
+ if bodyFlags != 0 {
+ body["flags"] = bodyFlags
+ }
+ if bodyMute != false {
+ body["mute"] = bodyMute
+ }
+ if bodyNick != "" {
+ body["nick"] = bodyNick
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+ cmd.Flags().StringVar(&bodyCommunicationDisabledUntil, "communication-disabled-until", "", "Communication disabled until")
+ cmd.Flags().BoolVar(&bodyDeaf, "deaf", false, "Deaf")
+ cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+ cmd.Flags().BoolVar(&bodyMute, "mute", false, "Mute")
+ cmd.Flags().StringVar(&bodyNick, "nick", "", "Nick")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_update-my-guild.go b/discord-cli/internal/cli/guilds_members_update-my-guild.go
new file mode 100644
index 00000000..0966cb36
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_update-my-guild.go
@@ -0,0 +1,84 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsMembersUpdateMyGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyAvatar string
+ var bodyBanner string
+ var bodyBio string
+ var bodyNick string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-my-guild <guild_id>",
+ Short: "Update my guild",
+ Example: " discord-cli guilds members update-my-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/members/@me"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAvatar != "" {
+ body["avatar"] = bodyAvatar
+ }
+ if bodyBanner != "" {
+ body["banner"] = bodyBanner
+ }
+ if bodyBio != "" {
+ body["bio"] = bodyBio
+ }
+ if bodyNick != "" {
+ body["nick"] = bodyNick
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAvatar, "avatar", "", "Avatar")
+ cmd.Flags().StringVar(&bodyBanner, "banner", "", "Banner")
+ cmd.Flags().StringVar(&bodyBio, "bio", "", "Bio")
+ cmd.Flags().StringVar(&bodyNick, "nick", "", "Nick")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_messages.go b/discord-cli/internal/cli/guilds_messages.go
new file mode 100644
index 00000000..4280c8f3
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_messages.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsMessagesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "messages",
+ Short: "Manage messages",
+ }
+
+ cmd.AddCommand(newGuildsMessagesGuildSearchCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_messages_guild-search.go b/discord-cli/internal/cli/guilds_messages_guild-search.go
new file mode 100644
index 00000000..09a4a464
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_messages_guild-search.go
@@ -0,0 +1,124 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsMessagesGuildSearchCmd(flags *rootFlags) *cobra.Command {
+ var flagSortBy string
+ var flagSortOrder string
+ var flagContent string
+ var flagSlop int
+ var flagAuthorId string
+ var flagAuthorType string
+ var flagMentions string
+ var flagMentionsRoleId string
+ var flagRepliedToUserId string
+ var flagRepliedToMessageId string
+ var flagMentionEveryone bool
+ var flagMinId string
+ var flagMaxId string
+ var flagLimit int
+ var flagOffset int
+ var flagHas string
+ var flagLinkHostname string
+ var flagEmbedProvider string
+ var flagEmbedType string
+ var flagAttachmentExtension string
+ var flagAttachmentFilename string
+ var flagPinned bool
+ var flagIncludeNsfw bool
+ var flagChannelId string
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "guild-search <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Guild search",
+ Example: " discord-cli guilds messages guild-search abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/messages/search"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "sort_by": fmt.Sprintf("%v", flagSortBy),
+ "sort_order": fmt.Sprintf("%v", flagSortOrder),
+ "content": fmt.Sprintf("%v", flagContent),
+ "slop": fmt.Sprintf("%v", flagSlop),
+ "author_id": fmt.Sprintf("%v", flagAuthorId),
+ "author_type": fmt.Sprintf("%v", flagAuthorType),
+ "mentions": fmt.Sprintf("%v", flagMentions),
+ "mentions_role_id": fmt.Sprintf("%v", flagMentionsRoleId),
+ "replied_to_user_id": fmt.Sprintf("%v", flagRepliedToUserId),
+ "replied_to_message_id": fmt.Sprintf("%v", flagRepliedToMessageId),
+ "mention_everyone": fmt.Sprintf("%v", flagMentionEveryone),
+ "min_id": fmt.Sprintf("%v", flagMinId),
+ "max_id": fmt.Sprintf("%v", flagMaxId),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ "offset": fmt.Sprintf("%v", flagOffset),
+ "has": fmt.Sprintf("%v", flagHas),
+ "link_hostname": fmt.Sprintf("%v", flagLinkHostname),
+ "embed_provider": fmt.Sprintf("%v", flagEmbedProvider),
+ "embed_type": fmt.Sprintf("%v", flagEmbedType),
+ "attachment_extension": fmt.Sprintf("%v", flagAttachmentExtension),
+ "attachment_filename": fmt.Sprintf("%v", flagAttachmentFilename),
+ "pinned": fmt.Sprintf("%v", flagPinned),
+ "include_nsfw": fmt.Sprintf("%v", flagIncludeNsfw),
+ "channel_id": fmt.Sprintf("%v", flagChannelId),
+ }, flagAll, "offset", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagSortBy, "sort-by", "", "Sort by")
+ cmd.Flags().StringVar(&flagSortOrder, "sort-order", "", "Sort order")
+ cmd.Flags().StringVar(&flagContent, "content", "", "Content")
+ cmd.Flags().IntVar(&flagSlop, "slop", 0, "Slop")
+ cmd.Flags().StringVar(&flagAuthorId, "author-id", "", "Author id")
+ cmd.Flags().StringVar(&flagAuthorType, "author-type", "", "Author type")
+ cmd.Flags().StringVar(&flagMentions, "mentions", "", "Mentions")
+ cmd.Flags().StringVar(&flagMentionsRoleId, "mentions-role-id", "", "Mentions role id")
+ cmd.Flags().StringVar(&flagRepliedToUserId, "replied-to-user-id", "", "Replied to user id")
+ cmd.Flags().StringVar(&flagRepliedToMessageId, "replied-to-message-id", "", "Replied to message id")
+ cmd.Flags().BoolVar(&flagMentionEveryone, "mention-everyone", false, "Mention everyone")
+ cmd.Flags().StringVar(&flagMinId, "min-id", "", "Min id")
+ cmd.Flags().StringVar(&flagMaxId, "max-id", "", "Max id")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().IntVar(&flagOffset, "offset", 0, "Offset")
+ cmd.Flags().StringVar(&flagHas, "has", "", "Has")
+ cmd.Flags().StringVar(&flagLinkHostname, "link-hostname", "", "Link hostname")
+ cmd.Flags().StringVar(&flagEmbedProvider, "embed-provider", "", "Embed provider")
+ cmd.Flags().StringVar(&flagEmbedType, "embed-type", "", "Embed type")
+ cmd.Flags().StringVar(&flagAttachmentExtension, "attachment-extension", "", "Attachment extension")
+ cmd.Flags().StringVar(&flagAttachmentFilename, "attachment-filename", "", "Attachment filename")
+ cmd.Flags().BoolVar(&flagPinned, "pinned", false, "Pinned")
+ cmd.Flags().BoolVar(&flagIncludeNsfw, "include-nsfw", false, "Include nsfw")
+ cmd.Flags().StringVar(&flagChannelId, "channel-id", "", "Channel id")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_new-member-welcome.go b/discord-cli/internal/cli/guilds_new-member-welcome.go
new file mode 100644
index 00000000..03d2385d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_new-member-welcome.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsNewMemberWelcomeCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "new-member-welcome",
+ Short: "Manage new member welcome",
+ }
+
+ cmd.AddCommand(newGuildsNewMemberWelcomeGetGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_new-member-welcome_get-guild.go b/discord-cli/internal/cli/guilds_new-member-welcome_get-guild.go
new file mode 100644
index 00000000..9ba91f3a
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_new-member-welcome_get-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsNewMemberWelcomeGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds new-member-welcome get-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/new-member-welcome"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_onboarding.go b/discord-cli/internal/cli/guilds_onboarding.go
new file mode 100644
index 00000000..3e7ae7e6
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_onboarding.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsOnboardingCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "onboarding",
+ Short: "Manage onboarding",
+ }
+
+ cmd.AddCommand(newGuildsOnboardingGetGuildsCmd(flags))
+ cmd.AddCommand(newGuildsOnboardingPutGuildsCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_onboarding_get-guilds.go b/discord-cli/internal/cli/guilds_onboarding_get-guilds.go
new file mode 100644
index 00000000..3433b5f2
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_onboarding_get-guilds.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsOnboardingGetGuildsCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guilds <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Get guilds",
+ Example: " discord-cli guilds onboarding get-guilds abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/onboarding"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_onboarding_put-guilds.go b/discord-cli/internal/cli/guilds_onboarding_put-guilds.go
new file mode 100644
index 00000000..e16c8c8b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_onboarding_put-guilds.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsOnboardingPutGuildsCmd(flags *rootFlags) *cobra.Command {
+ var bodyEnabled bool
+ var bodyMode string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "put-guilds <guild_id>",
+ Aliases: []string{"update"},
+ Short: "Put guilds",
+ Example: " discord-cli guilds onboarding put-guilds abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/onboarding"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyEnabled != false {
+ body["enabled"] = bodyEnabled
+ }
+ if bodyMode != "" {
+ body["mode"] = bodyMode
+ }
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&bodyEnabled, "enabled", false, "Enabled")
+ cmd.Flags().StringVar(&bodyMode, "mode", "", "Mode")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_preview.go b/discord-cli/internal/cli/guilds_preview.go
new file mode 100644
index 00000000..905433fb
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_preview.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsPreviewCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "preview",
+ Short: "Manage preview",
+ }
+
+ cmd.AddCommand(newGuildsPreviewGetGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_preview_get-guild.go b/discord-cli/internal/cli/guilds_preview_get-guild.go
new file mode 100644
index 00000000..6088919b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_preview_get-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsPreviewGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds preview get-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/preview"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_prune.go b/discord-cli/internal/cli/guilds_prune.go
new file mode 100644
index 00000000..1fa1d3f8
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_prune.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsPruneCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "prune",
+ Short: "Manage prune",
+ }
+
+ cmd.AddCommand(newGuildsPruneGuildCmd(flags))
+ cmd.AddCommand(newGuildsPrunePreviewGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_prune_guild.go b/discord-cli/internal/cli/guilds_prune_guild.go
new file mode 100644
index 00000000..3a7bfb6d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_prune_guild.go
@@ -0,0 +1,80 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsPruneGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyComputePruneCount bool
+ var bodyDays int
+ var bodyIncludeRoles string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "guild <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Guild",
+ Example: " discord-cli guilds prune guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/prune"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyComputePruneCount != false {
+ body["compute_prune_count"] = bodyComputePruneCount
+ }
+ if bodyDays != 0 {
+ body["days"] = bodyDays
+ }
+ if bodyIncludeRoles != "" {
+ body["include_roles"] = bodyIncludeRoles
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&bodyComputePruneCount, "compute-prune-count", false, "Compute prune count")
+ cmd.Flags().IntVar(&bodyDays, "days", 0, "Days")
+ cmd.Flags().StringVar(&bodyIncludeRoles, "include-roles", "", "Include roles")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_prune_preview-guild.go b/discord-cli/internal/cli/guilds_prune_preview-guild.go
new file mode 100644
index 00000000..4f4de6a0
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_prune_preview-guild.go
@@ -0,0 +1,60 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsPrunePreviewGuildCmd(flags *rootFlags) *cobra.Command {
+ var flagDays int
+ var flagIncludeRoles string
+
+ cmd := &cobra.Command{
+ Use: "preview-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Preview guild",
+ Example: " discord-cli guilds prune preview-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/prune"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ if flagDays != 0 {
+ params["days"] = fmt.Sprintf("%v", flagDays)
+ }
+ if flagIncludeRoles != "" {
+ params["include_roles"] = fmt.Sprintf("%v", flagIncludeRoles)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&flagDays, "days", 0, "Days")
+ cmd.Flags().StringVar(&flagIncludeRoles, "include-roles", "", "Include roles")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_regions.go b/discord-cli/internal/cli/guilds_regions.go
new file mode 100644
index 00000000..8c7523f6
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_regions.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsRegionsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "regions",
+ Short: "Manage regions",
+ }
+
+ cmd.AddCommand(newGuildsRegionsListGuildVoiceCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_regions_list-guild-voice.go b/discord-cli/internal/cli/guilds_regions_list-guild-voice.go
new file mode 100644
index 00000000..bfd2c538
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_regions_list-guild-voice.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsRegionsListGuildVoiceCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-guild-voice <guild_id>",
+ Aliases: []string{"get"},
+ Short: "List guild voice",
+ Example: " discord-cli guilds regions list-guild-voice abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/regions"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles.go b/discord-cli/internal/cli/guilds_roles.go
new file mode 100644
index 00000000..3bcc305d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles.go
@@ -0,0 +1,23 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsRolesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "roles",
+ Short: "Manage roles",
+ }
+
+ cmd.AddCommand(newGuildsRolesBulkUpdateGuildCmd(flags))
+ cmd.AddCommand(newGuildsRolesCreateGuildCmd(flags))
+ cmd.AddCommand(newGuildsRolesDeleteGuildCmd(flags))
+ cmd.AddCommand(newGuildsRolesGetGuildCmd(flags))
+ cmd.AddCommand(newGuildsRolesGuildMemberCountsCmd(flags))
+ cmd.AddCommand(newGuildsRolesListGuildCmd(flags))
+ cmd.AddCommand(newGuildsRolesUpdateGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_bulk-update-guild.go b/discord-cli/internal/cli/guilds_roles_bulk-update-guild.go
new file mode 100644
index 00000000..f02ef0e2
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_bulk-update-guild.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsRolesBulkUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "bulk-update-guild <guild_id>",
+ Aliases: []string{"update"},
+ Short: "Bulk update guild",
+ Example: " discord-cli guilds roles bulk-update-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/roles"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_create-guild.go b/discord-cli/internal/cli/guilds_roles_create-guild.go
new file mode 100644
index 00000000..99544359
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_create-guild.go
@@ -0,0 +1,105 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsRolesCreateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyColor int
+ var bodyColors string
+ var bodyHoist bool
+ var bodyIcon string
+ var bodyMentionable bool
+ var bodyName string
+ var bodyPermissions int
+ var bodyUnicodeEmoji string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-guild <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Create guild",
+ Example: " discord-cli guilds roles create-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/roles"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyColor != 0 {
+ body["color"] = bodyColor
+ }
+ if bodyColors != "" {
+ body["colors"] = bodyColors
+ }
+ if bodyHoist != false {
+ body["hoist"] = bodyHoist
+ }
+ if bodyIcon != "" {
+ body["icon"] = bodyIcon
+ }
+ if bodyMentionable != false {
+ body["mentionable"] = bodyMentionable
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodyPermissions != 0 {
+ body["permissions"] = bodyPermissions
+ }
+ if bodyUnicodeEmoji != "" {
+ body["unicode_emoji"] = bodyUnicodeEmoji
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyColor, "color", 0, "Color")
+ cmd.Flags().StringVar(&bodyColors, "colors", "", "Colors")
+ cmd.Flags().BoolVar(&bodyHoist, "hoist", false, "Hoist")
+ cmd.Flags().StringVar(&bodyIcon, "icon", "", "Icon")
+ cmd.Flags().BoolVar(&bodyMentionable, "mentionable", false, "Mentionable")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().IntVar(&bodyPermissions, "permissions", 0, "Permissions")
+ cmd.Flags().StringVar(&bodyUnicodeEmoji, "unicode-emoji", "", "Unicode emoji")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_delete-guild.go b/discord-cli/internal/cli/guilds_roles_delete-guild.go
new file mode 100644
index 00000000..ec7c6d48
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsRolesDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-guild <guild_id> <role_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete guild",
+ Example: " discord-cli guilds roles delete-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/roles/{role_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("role_id is required"))
+ }
+ path = replacePathParam(path, "role_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_get-guild.go b/discord-cli/internal/cli/guilds_roles_get-guild.go
new file mode 100644
index 00000000..2e861e53
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsRolesGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id> <role_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds roles get-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/roles/{role_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("role_id is required"))
+ }
+ path = replacePathParam(path, "role_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_guild-member-counts.go b/discord-cli/internal/cli/guilds_roles_guild-member-counts.go
new file mode 100644
index 00000000..f29efc96
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_guild-member-counts.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsRolesGuildMemberCountsCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "guild-member-counts <guild_id>",
+ Short: "Guild member counts",
+ Example: " discord-cli guilds roles guild-member-counts abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/roles/member-counts"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_list-guild.go b/discord-cli/internal/cli/guilds_roles_list-guild.go
new file mode 100644
index 00000000..bf85742c
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_list-guild.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsRolesListGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Short: "List guild",
+ Example: " discord-cli guilds roles list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/roles"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_update-guild.go b/discord-cli/internal/cli/guilds_roles_update-guild.go
new file mode 100644
index 00000000..bb5cf611
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_update-guild.go
@@ -0,0 +1,108 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsRolesUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyColor int
+ var bodyColors string
+ var bodyHoist bool
+ var bodyIcon string
+ var bodyMentionable bool
+ var bodyName string
+ var bodyPermissions int
+ var bodyUnicodeEmoji string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-guild <guild_id> <role_id>",
+ Short: "Update guild",
+ Example: " discord-cli guilds roles update-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/roles/{role_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("role_id is required"))
+ }
+ path = replacePathParam(path, "role_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyColor != 0 {
+ body["color"] = bodyColor
+ }
+ if bodyColors != "" {
+ body["colors"] = bodyColors
+ }
+ if bodyHoist != false {
+ body["hoist"] = bodyHoist
+ }
+ if bodyIcon != "" {
+ body["icon"] = bodyIcon
+ }
+ if bodyMentionable != false {
+ body["mentionable"] = bodyMentionable
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodyPermissions != 0 {
+ body["permissions"] = bodyPermissions
+ }
+ if bodyUnicodeEmoji != "" {
+ body["unicode_emoji"] = bodyUnicodeEmoji
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyColor, "color", 0, "Color")
+ cmd.Flags().StringVar(&bodyColors, "colors", "", "Colors")
+ cmd.Flags().BoolVar(&bodyHoist, "hoist", false, "Hoist")
+ cmd.Flags().StringVar(&bodyIcon, "icon", "", "Icon")
+ cmd.Flags().BoolVar(&bodyMentionable, "mentionable", false, "Mentionable")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().IntVar(&bodyPermissions, "permissions", 0, "Permissions")
+ cmd.Flags().StringVar(&bodyUnicodeEmoji, "unicode-emoji", "", "Unicode emoji")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events.go b/discord-cli/internal/cli/guilds_scheduled-events.go
new file mode 100644
index 00000000..fc4102e2
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events.go
@@ -0,0 +1,22 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsScheduledEventsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "scheduled-events",
+ Short: "Manage scheduled events",
+ }
+
+ cmd.AddCommand(newGuildsScheduledEventsCreateGuildCmd(flags))
+ cmd.AddCommand(newGuildsScheduledEventsDeleteGuildCmd(flags))
+ cmd.AddCommand(newGuildsScheduledEventsGetGuildCmd(flags))
+ cmd.AddCommand(newGuildsScheduledEventsListGuildCmd(flags))
+ cmd.AddCommand(newGuildsScheduledEventsListGuildUsersCmd(flags))
+ cmd.AddCommand(newGuildsScheduledEventsUpdateGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_create-guild.go b/discord-cli/internal/cli/guilds_scheduled-events_create-guild.go
new file mode 100644
index 00000000..606a413b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_create-guild.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsScheduledEventsCreateGuildCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-guild <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Create guild",
+ Example: " discord-cli guilds scheduled-events create-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/scheduled-events"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_delete-guild.go b/discord-cli/internal/cli/guilds_scheduled-events_delete-guild.go
new file mode 100644
index 00000000..a22a6600
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsScheduledEventsDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-guild <guild_id> <guild_scheduled_event_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete guild",
+ Example: " discord-cli guilds scheduled-events delete-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/scheduled-events/{guild_scheduled_event_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_scheduled_event_id is required"))
+ }
+ path = replacePathParam(path, "guild_scheduled_event_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_get-guild.go b/discord-cli/internal/cli/guilds_scheduled-events_get-guild.go
new file mode 100644
index 00000000..204d17f4
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_get-guild.go
@@ -0,0 +1,59 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsScheduledEventsGetGuildCmd(flags *rootFlags) *cobra.Command {
+ var flagWithUserCount bool
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id> <guild_scheduled_event_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds scheduled-events get-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/scheduled-events/{guild_scheduled_event_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_scheduled_event_id is required"))
+ }
+ path = replacePathParam(path, "guild_scheduled_event_id", args[1])
+ params := map[string]string{}
+ if flagWithUserCount != false {
+ params["with_user_count"] = fmt.Sprintf("%v", flagWithUserCount)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWithUserCount, "with-user-count", false, "With user count")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_list-guild-users.go b/discord-cli/internal/cli/guilds_scheduled-events_list-guild-users.go
new file mode 100644
index 00000000..e720b390
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_list-guild-users.go
@@ -0,0 +1,67 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsScheduledEventsListGuildUsersCmd(flags *rootFlags) *cobra.Command {
+ var flagWithMember bool
+ var flagLimit int
+ var flagBefore string
+ var flagAfter string
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list-guild-users <guild_id> <guild_scheduled_event_id>",
+ Short: "List guild users",
+ Example: " discord-cli guilds scheduled-events list-guild-users abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/scheduled-events/{guild_scheduled_event_id}/users"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_scheduled_event_id is required"))
+ }
+ path = replacePathParam(path, "guild_scheduled_event_id", args[1])
+ data, err := paginatedGet(c, path, map[string]string{
+ "with_member": fmt.Sprintf("%v", flagWithMember),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ "before": fmt.Sprintf("%v", flagBefore),
+ "after": fmt.Sprintf("%v", flagAfter),
+ }, flagAll, "after", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWithMember, "with-member", false, "With member")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+ cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_list-guild.go b/discord-cli/internal/cli/guilds_scheduled-events_list-guild.go
new file mode 100644
index 00000000..e5a74056
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_list-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsScheduledEventsListGuildCmd(flags *rootFlags) *cobra.Command {
+ var flagWithUserCount bool
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Short: "List guild",
+ Example: " discord-cli guilds scheduled-events list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/scheduled-events"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ if flagWithUserCount != false {
+ params["with_user_count"] = fmt.Sprintf("%v", flagWithUserCount)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWithUserCount, "with-user-count", false, "With user count")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_update-guild.go b/discord-cli/internal/cli/guilds_scheduled-events_update-guild.go
new file mode 100644
index 00000000..8d9c75e3
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_update-guild.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsScheduledEventsUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-guild <guild_id> <guild_scheduled_event_id>",
+ Aliases: []string{"update"},
+ Short: "Update guild",
+ Example: " discord-cli guilds scheduled-events update-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/scheduled-events/{guild_scheduled_event_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("guild_scheduled_event_id is required"))
+ }
+ path = replacePathParam(path, "guild_scheduled_event_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds.go b/discord-cli/internal/cli/guilds_soundboard-sounds.go
new file mode 100644
index 00000000..48af04ce
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsSoundboardSoundsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "soundboard-sounds",
+ Short: "Manage soundboard sounds",
+ }
+
+ cmd.AddCommand(newGuildsSoundboardSoundsCreateGuildCmd(flags))
+ cmd.AddCommand(newGuildsSoundboardSoundsDeleteGuildCmd(flags))
+ cmd.AddCommand(newGuildsSoundboardSoundsGetGuildCmd(flags))
+ cmd.AddCommand(newGuildsSoundboardSoundsListGuildCmd(flags))
+ cmd.AddCommand(newGuildsSoundboardSoundsUpdateGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds_create-guild.go b/discord-cli/internal/cli/guilds_soundboard-sounds_create-guild.go
new file mode 100644
index 00000000..50a79207
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds_create-guild.go
@@ -0,0 +1,92 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsSoundboardSoundsCreateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyEmojiId string
+ var bodyEmojiName string
+ var bodyName string
+ var bodySound string
+ var bodyVolume float64
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-guild <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Create guild",
+ Example: " discord-cli guilds soundboard-sounds create-guild abc123 --name my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/soundboard-sounds"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyEmojiId != "" {
+ body["emoji_id"] = bodyEmojiId
+ }
+ if bodyEmojiName != "" {
+ body["emoji_name"] = bodyEmojiName
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodySound != "" {
+ body["sound"] = bodySound
+ }
+ if bodyVolume != 0.0 {
+ body["volume"] = bodyVolume
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyEmojiId, "emoji-id", "", "Emoji id")
+ cmd.Flags().StringVar(&bodyEmojiName, "emoji-name", "", "Emoji name")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ _ = cmd.MarkFlagRequired("name")
+ cmd.Flags().StringVar(&bodySound, "sound", "", "Sound")
+ _ = cmd.MarkFlagRequired("sound")
+ cmd.Flags().Float64Var(&bodyVolume, "volume", 0.0, "Volume")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds_delete-guild.go b/discord-cli/internal/cli/guilds_soundboard-sounds_delete-guild.go
new file mode 100644
index 00000000..9b76f8d9
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsSoundboardSoundsDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-guild <guild_id> <sound_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete guild",
+ Example: " discord-cli guilds soundboard-sounds delete-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/soundboard-sounds/{sound_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("sound_id is required"))
+ }
+ path = replacePathParam(path, "sound_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds_get-guild.go b/discord-cli/internal/cli/guilds_soundboard-sounds_get-guild.go
new file mode 100644
index 00000000..f1c5ae52
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsSoundboardSoundsGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id> <sound_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds soundboard-sounds get-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/soundboard-sounds/{sound_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("sound_id is required"))
+ }
+ path = replacePathParam(path, "sound_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds_list-guild.go b/discord-cli/internal/cli/guilds_soundboard-sounds_list-guild.go
new file mode 100644
index 00000000..48965df2
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds_list-guild.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsSoundboardSoundsListGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Short: "List guild",
+ Example: " discord-cli guilds soundboard-sounds list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/soundboard-sounds"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds_update-guild.go b/discord-cli/internal/cli/guilds_soundboard-sounds_update-guild.go
new file mode 100644
index 00000000..2fe1907a
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds_update-guild.go
@@ -0,0 +1,89 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsSoundboardSoundsUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyEmojiId string
+ var bodyEmojiName string
+ var bodyName string
+ var bodyVolume float64
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-guild <guild_id> <sound_id>",
+ Aliases: []string{"update"},
+ Short: "Update guild",
+ Example: " discord-cli guilds soundboard-sounds update-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/soundboard-sounds/{sound_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("sound_id is required"))
+ }
+ path = replacePathParam(path, "sound_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyEmojiId != "" {
+ body["emoji_id"] = bodyEmojiId
+ }
+ if bodyEmojiName != "" {
+ body["emoji_name"] = bodyEmojiName
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodyVolume != 0.0 {
+ body["volume"] = bodyVolume
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyEmojiId, "emoji-id", "", "Emoji id")
+ cmd.Flags().StringVar(&bodyEmojiName, "emoji-name", "", "Emoji name")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().Float64Var(&bodyVolume, "volume", 0.0, "Volume")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers.go b/discord-cli/internal/cli/guilds_stickers.go
new file mode 100644
index 00000000..8f26a43b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsStickersCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "stickers",
+ Short: "Manage stickers",
+ }
+
+ cmd.AddCommand(newGuildsStickersCreateGuildCmd(flags))
+ cmd.AddCommand(newGuildsStickersDeleteGuildCmd(flags))
+ cmd.AddCommand(newGuildsStickersGetGuildCmd(flags))
+ cmd.AddCommand(newGuildsStickersListGuildCmd(flags))
+ cmd.AddCommand(newGuildsStickersUpdateGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers_create-guild.go b/discord-cli/internal/cli/guilds_stickers_create-guild.go
new file mode 100644
index 00000000..9690f973
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers_create-guild.go
@@ -0,0 +1,88 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsStickersCreateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyDescription string
+ var bodyFile string
+ var bodyName string
+ var bodyTags string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-guild <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Create guild",
+ Example: " discord-cli guilds stickers create-guild abc123 --file value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/stickers"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDescription != "" {
+ body["description"] = bodyDescription
+ }
+ if bodyFile != "" {
+ body["file"] = bodyFile
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodyTags != "" {
+ body["tags"] = bodyTags
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+ cmd.Flags().StringVar(&bodyFile, "file", "", "File")
+ _ = cmd.MarkFlagRequired("file")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ _ = cmd.MarkFlagRequired("name")
+ cmd.Flags().StringVar(&bodyTags, "tags", "", "Tags")
+ _ = cmd.MarkFlagRequired("tags")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers_delete-guild.go b/discord-cli/internal/cli/guilds_stickers_delete-guild.go
new file mode 100644
index 00000000..3db84fa0
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsStickersDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-guild <guild_id> <sticker_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete guild",
+ Example: " discord-cli guilds stickers delete-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/stickers/{sticker_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("sticker_id is required"))
+ }
+ path = replacePathParam(path, "sticker_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers_get-guild.go b/discord-cli/internal/cli/guilds_stickers_get-guild.go
new file mode 100644
index 00000000..31b69063
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsStickersGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id> <sticker_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds stickers get-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/stickers/{sticker_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("sticker_id is required"))
+ }
+ path = replacePathParam(path, "sticker_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers_list-guild.go b/discord-cli/internal/cli/guilds_stickers_list-guild.go
new file mode 100644
index 00000000..e1230c65
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers_list-guild.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsStickersListGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Short: "List guild",
+ Example: " discord-cli guilds stickers list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/stickers"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers_update-guild.go b/discord-cli/internal/cli/guilds_stickers_update-guild.go
new file mode 100644
index 00000000..2eead623
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers_update-guild.go
@@ -0,0 +1,84 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsStickersUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyDescription string
+ var bodyName string
+ var bodyTags string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-guild <guild_id> <sticker_id>",
+ Aliases: []string{"update"},
+ Short: "Update guild",
+ Example: " discord-cli guilds stickers update-guild abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/stickers/{sticker_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("sticker_id is required"))
+ }
+ path = replacePathParam(path, "sticker_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDescription != "" {
+ body["description"] = bodyDescription
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodyTags != "" {
+ body["tags"] = bodyTags
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().StringVar(&bodyTags, "tags", "", "Tags")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates.go b/discord-cli/internal/cli/guilds_templates.go
new file mode 100644
index 00000000..754b9c38
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsTemplatesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "templates",
+ Short: "Manage templates",
+ }
+
+ cmd.AddCommand(newGuildsTemplatesCreateGuildCmd(flags))
+ cmd.AddCommand(newGuildsTemplatesDeleteGuildCmd(flags))
+ cmd.AddCommand(newGuildsTemplatesListGuildCmd(flags))
+ cmd.AddCommand(newGuildsTemplatesSyncGuildCmd(flags))
+ cmd.AddCommand(newGuildsTemplatesUpdateGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates_create-guild.go b/discord-cli/internal/cli/guilds_templates_create-guild.go
new file mode 100644
index 00000000..4479ac89
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates_create-guild.go
@@ -0,0 +1,76 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsTemplatesCreateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyDescription string
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-guild <guild_id>",
+ Aliases: []string{"create"},
+ Short: "Create guild",
+ Example: " discord-cli guilds templates create-guild abc123 --name my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/templates"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDescription != "" {
+ body["description"] = bodyDescription
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ _ = cmd.MarkFlagRequired("name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates_delete-guild.go b/discord-cli/internal/cli/guilds_templates_delete-guild.go
new file mode 100644
index 00000000..17367ee7
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsTemplatesDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-guild <guild_id> <code>",
+ Aliases: []string{"delete"},
+ Short: "Delete guild",
+ Example: " discord-cli guilds templates delete-guild abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/templates/{code}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("code is required"))
+ }
+ path = replacePathParam(path, "code", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates_list-guild.go b/discord-cli/internal/cli/guilds_templates_list-guild.go
new file mode 100644
index 00000000..37e725c4
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates_list-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsTemplatesListGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "List guild",
+ Example: " discord-cli guilds templates list-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/templates"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates_sync-guild.go b/discord-cli/internal/cli/guilds_templates_sync-guild.go
new file mode 100644
index 00000000..a77b7973
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates_sync-guild.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsTemplatesSyncGuildCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "sync-guild <guild_id> <code>",
+ Aliases: []string{"update"},
+ Short: "Sync guild",
+ Example: " discord-cli guilds templates sync-guild abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/templates/{code}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("code is required"))
+ }
+ path = replacePathParam(path, "code", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates_update-guild.go b/discord-cli/internal/cli/guilds_templates_update-guild.go
new file mode 100644
index 00000000..b97606c4
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates_update-guild.go
@@ -0,0 +1,78 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsTemplatesUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyDescription string
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-guild <guild_id> <code>",
+ Short: "Update guild",
+ Example: " discord-cli guilds templates update-guild abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/templates/{code}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("code is required"))
+ }
+ path = replacePathParam(path, "code", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDescription != "" {
+ body["description"] = bodyDescription
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_threads.go b/discord-cli/internal/cli/guilds_threads.go
new file mode 100644
index 00000000..2c6c9fc3
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_threads.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsThreadsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "threads",
+ Short: "Manage threads",
+ }
+
+ cmd.AddCommand(newGuildsThreadsGetActiveGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_threads_get-active-guild.go b/discord-cli/internal/cli/guilds_threads_get-active-guild.go
new file mode 100644
index 00000000..54c17684
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_threads_get-active-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsThreadsGetActiveGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-active-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Get active guild",
+ Example: " discord-cli guilds threads get-active-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/threads/active"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_update.go b/discord-cli/internal/cli/guilds_update.go
new file mode 100644
index 00000000..7a415538
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_update.go
@@ -0,0 +1,164 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsUpdateCmd(flags *rootFlags) *cobra.Command {
+ var bodyAfkChannelId string
+ var bodyAfkTimeout string
+ var bodyBanner string
+ var bodyDefaultMessageNotifications string
+ var bodyDescription string
+ var bodyDiscoverySplash string
+ var bodyExplicitContentFilter string
+ var bodyHomeHeader string
+ var bodyIcon string
+ var bodyName string
+ var bodyPreferredLocale string
+ var bodyPremiumProgressBarEnabled bool
+ var bodyPublicUpdatesChannelId string
+ var bodyRegion string
+ var bodyRulesChannelId string
+ var bodySafetyAlertsChannelId string
+ var bodySplash string
+ var bodySystemChannelFlags int
+ var bodySystemChannelId string
+ var bodyVerificationLevel string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update <guild_id>",
+ Short: "Update",
+ Example: " discord-cli guilds update abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAfkChannelId != "" {
+ body["afk_channel_id"] = bodyAfkChannelId
+ }
+ if bodyAfkTimeout != "" {
+ body["afk_timeout"] = bodyAfkTimeout
+ }
+ if bodyBanner != "" {
+ body["banner"] = bodyBanner
+ }
+ if bodyDefaultMessageNotifications != "" {
+ body["default_message_notifications"] = bodyDefaultMessageNotifications
+ }
+ if bodyDescription != "" {
+ body["description"] = bodyDescription
+ }
+ if bodyDiscoverySplash != "" {
+ body["discovery_splash"] = bodyDiscoverySplash
+ }
+ if bodyExplicitContentFilter != "" {
+ body["explicit_content_filter"] = bodyExplicitContentFilter
+ }
+ if bodyHomeHeader != "" {
+ body["home_header"] = bodyHomeHeader
+ }
+ if bodyIcon != "" {
+ body["icon"] = bodyIcon
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ if bodyPreferredLocale != "" {
+ body["preferred_locale"] = bodyPreferredLocale
+ }
+ if bodyPremiumProgressBarEnabled != false {
+ body["premium_progress_bar_enabled"] = bodyPremiumProgressBarEnabled
+ }
+ if bodyPublicUpdatesChannelId != "" {
+ body["public_updates_channel_id"] = bodyPublicUpdatesChannelId
+ }
+ if bodyRegion != "" {
+ body["region"] = bodyRegion
+ }
+ if bodyRulesChannelId != "" {
+ body["rules_channel_id"] = bodyRulesChannelId
+ }
+ if bodySafetyAlertsChannelId != "" {
+ body["safety_alerts_channel_id"] = bodySafetyAlertsChannelId
+ }
+ if bodySplash != "" {
+ body["splash"] = bodySplash
+ }
+ if bodySystemChannelFlags != 0 {
+ body["system_channel_flags"] = bodySystemChannelFlags
+ }
+ if bodySystemChannelId != "" {
+ body["system_channel_id"] = bodySystemChannelId
+ }
+ if bodyVerificationLevel != "" {
+ body["verification_level"] = bodyVerificationLevel
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAfkChannelId, "afk-channel-id", "", "Afk channel id")
+ cmd.Flags().StringVar(&bodyAfkTimeout, "afk-timeout", "", "Afk timeout")
+ cmd.Flags().StringVar(&bodyBanner, "banner", "", "Banner")
+ cmd.Flags().StringVar(&bodyDefaultMessageNotifications, "default-message-notifications", "", "Default message notifications")
+ cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+ cmd.Flags().StringVar(&bodyDiscoverySplash, "discovery-splash", "", "Discovery splash")
+ cmd.Flags().StringVar(&bodyExplicitContentFilter, "explicit-content-filter", "", "Explicit content filter")
+ cmd.Flags().StringVar(&bodyHomeHeader, "home-header", "", "Home header")
+ cmd.Flags().StringVar(&bodyIcon, "icon", "", "Icon")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().StringVar(&bodyPreferredLocale, "preferred-locale", "", "Preferred locale")
+ cmd.Flags().BoolVar(&bodyPremiumProgressBarEnabled, "premium-progress-bar-enabled", false, "Premium progress bar enabled")
+ cmd.Flags().StringVar(&bodyPublicUpdatesChannelId, "public-updates-channel-id", "", "Public updates channel id")
+ cmd.Flags().StringVar(&bodyRegion, "region", "", "Region")
+ cmd.Flags().StringVar(&bodyRulesChannelId, "rules-channel-id", "", "Rules channel id")
+ cmd.Flags().StringVar(&bodySafetyAlertsChannelId, "safety-alerts-channel-id", "", "Safety alerts channel id")
+ cmd.Flags().StringVar(&bodySplash, "splash", "", "Splash")
+ cmd.Flags().IntVar(&bodySystemChannelFlags, "system-channel-flags", 0, "System channel flags")
+ cmd.Flags().StringVar(&bodySystemChannelId, "system-channel-id", "", "System channel id")
+ cmd.Flags().StringVar(&bodyVerificationLevel, "verification-level", "", "Verification level")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_vanity-url.go b/discord-cli/internal/cli/guilds_vanity-url.go
new file mode 100644
index 00000000..6664ec1b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_vanity-url.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsVanityUrlCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "vanity-url",
+ Short: "Manage vanity url",
+ }
+
+ cmd.AddCommand(newGuildsVanityUrlGetGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_vanity-url_get-guild.go b/discord-cli/internal/cli/guilds_vanity-url_get-guild.go
new file mode 100644
index 00000000..1753185e
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_vanity-url_get-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsVanityUrlGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds vanity-url get-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/vanity-url"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_voice-states.go b/discord-cli/internal/cli/guilds_voice-states.go
new file mode 100644
index 00000000..99312520
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_voice-states.go
@@ -0,0 +1,20 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsVoiceStatesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "voice-states",
+ Short: "Manage voice states",
+ }
+
+ cmd.AddCommand(newGuildsVoiceStatesGetCmd(flags))
+ cmd.AddCommand(newGuildsVoiceStatesGetSelfCmd(flags))
+ cmd.AddCommand(newGuildsVoiceStatesUpdateCmd(flags))
+ cmd.AddCommand(newGuildsVoiceStatesUpdateSelfCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_voice-states_get-self.go b/discord-cli/internal/cli/guilds_voice-states_get-self.go
new file mode 100644
index 00000000..a28b336b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_voice-states_get-self.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsVoiceStatesGetSelfCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-self <guild_id>",
+ Short: "Get self",
+ Example: " discord-cli guilds voice-states get-self abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/voice-states/@me"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_voice-states_get.go b/discord-cli/internal/cli/guilds_voice-states_get.go
new file mode 100644
index 00000000..e67e1266
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_voice-states_get.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsVoiceStatesGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get <guild_id> <user_id>",
+ Short: "Get",
+ Example: " discord-cli guilds voice-states get abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/voice-states/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_voice-states_update-self.go b/discord-cli/internal/cli/guilds_voice-states_update-self.go
new file mode 100644
index 00000000..1c0ab864
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_voice-states_update-self.go
@@ -0,0 +1,79 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsVoiceStatesUpdateSelfCmd(flags *rootFlags) *cobra.Command {
+ var bodyChannelId string
+ var bodyRequestToSpeakTimestamp string
+ var bodySuppress bool
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-self <guild_id>",
+ Short: "Update self",
+ Example: " discord-cli guilds voice-states update-self abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/voice-states/@me"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyChannelId != "" {
+ body["channel_id"] = bodyChannelId
+ }
+ if bodyRequestToSpeakTimestamp != "" {
+ body["request_to_speak_timestamp"] = bodyRequestToSpeakTimestamp
+ }
+ if bodySuppress != false {
+ body["suppress"] = bodySuppress
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+ cmd.Flags().StringVar(&bodyRequestToSpeakTimestamp, "request-to-speak-timestamp", "", "Request to speak timestamp")
+ cmd.Flags().BoolVar(&bodySuppress, "suppress", false, "Suppress")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_voice-states_update.go b/discord-cli/internal/cli/guilds_voice-states_update.go
new file mode 100644
index 00000000..b80ac9f3
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_voice-states_update.go
@@ -0,0 +1,78 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsVoiceStatesUpdateCmd(flags *rootFlags) *cobra.Command {
+ var bodyChannelId string
+ var bodySuppress bool
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update <guild_id> <user_id>",
+ Short: "Update",
+ Example: " discord-cli guilds voice-states update abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/voice-states/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyChannelId != "" {
+ body["channel_id"] = bodyChannelId
+ }
+ if bodySuppress != false {
+ body["suppress"] = bodySuppress
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+ cmd.Flags().BoolVar(&bodySuppress, "suppress", false, "Suppress")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_webhooks.go b/discord-cli/internal/cli/guilds_webhooks.go
new file mode 100644
index 00000000..8605ff24
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_webhooks.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsWebhooksCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "webhooks",
+ Short: "Manage webhooks",
+ }
+
+ cmd.AddCommand(newGuildsWebhooksGetGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_webhooks_get-guild.go b/discord-cli/internal/cli/guilds_webhooks_get-guild.go
new file mode 100644
index 00000000..98304a3c
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_webhooks_get-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsWebhooksGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds webhooks get-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/webhooks"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_welcome-screen.go b/discord-cli/internal/cli/guilds_welcome-screen.go
new file mode 100644
index 00000000..5331b76d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_welcome-screen.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsWelcomeScreenCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "welcome-screen",
+ Short: "Manage welcome screen",
+ }
+
+ cmd.AddCommand(newGuildsWelcomeScreenGetGuildCmd(flags))
+ cmd.AddCommand(newGuildsWelcomeScreenUpdateGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_welcome-screen_get-guild.go b/discord-cli/internal/cli/guilds_welcome-screen_get-guild.go
new file mode 100644
index 00000000..f1b9da48
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_welcome-screen_get-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsWelcomeScreenGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds welcome-screen get-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/welcome-screen"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_welcome-screen_update-guild.go b/discord-cli/internal/cli/guilds_welcome-screen_update-guild.go
new file mode 100644
index 00000000..2c11391e
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_welcome-screen_update-guild.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsWelcomeScreenUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+ var bodyDescription string
+ var bodyEnabled bool
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-guild <guild_id>",
+ Aliases: []string{"update"},
+ Short: "Update guild",
+ Example: " discord-cli guilds welcome-screen update-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/welcome-screen"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyDescription != "" {
+ body["description"] = bodyDescription
+ }
+ if bodyEnabled != false {
+ body["enabled"] = bodyEnabled
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+ cmd.Flags().BoolVar(&bodyEnabled, "enabled", false, "Enabled")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget-json.go b/discord-cli/internal/cli/guilds_widget-json.go
new file mode 100644
index 00000000..4c169a3b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget-json.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsWidgetJsonCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "widget-json",
+ Short: "Manage widget json",
+ }
+
+ cmd.AddCommand(newGuildsWidgetJsonGetGuildWidgetCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget-json_get-guild-widget.go b/discord-cli/internal/cli/guilds_widget-json_get-guild-widget.go
new file mode 100644
index 00000000..d3c66cb2
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget-json_get-guild-widget.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsWidgetJsonGetGuildWidgetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild-widget <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild widget",
+ Example: " discord-cli guilds widget-json get-guild-widget abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/widget.json"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget-png.go b/discord-cli/internal/cli/guilds_widget-png.go
new file mode 100644
index 00000000..66bcb460
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget-png.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsWidgetPngCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "widget-png",
+ Short: "Manage widget png",
+ }
+
+ cmd.AddCommand(newGuildsWidgetPngGetGuildCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget-png_get-guild.go b/discord-cli/internal/cli/guilds_widget-png_get-guild.go
new file mode 100644
index 00000000..6ab1f0d0
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget-png_get-guild.go
@@ -0,0 +1,55 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsWidgetPngGetGuildCmd(flags *rootFlags) *cobra.Command {
+ var flagStyle string
+
+ cmd := &cobra.Command{
+ Use: "get-guild <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild",
+ Example: " discord-cli guilds widget-png get-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/widget.png"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ if flagStyle != "" {
+ params["style"] = fmt.Sprintf("%v", flagStyle)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagStyle, "style", "", "Style")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget.go b/discord-cli/internal/cli/guilds_widget.go
new file mode 100644
index 00000000..5f5a5eb9
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newGuildsWidgetCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "widget",
+ Short: "Manage widget",
+ }
+
+ cmd.AddCommand(newGuildsWidgetGetGuildSettingsCmd(flags))
+ cmd.AddCommand(newGuildsWidgetUpdateGuildSettingsCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget_get-guild-settings.go b/discord-cli/internal/cli/guilds_widget_get-guild-settings.go
new file mode 100644
index 00000000..de90c420
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget_get-guild-settings.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsWidgetGetGuildSettingsCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-guild-settings <guild_id>",
+ Aliases: []string{"get"},
+ Short: "Get guild settings",
+ Example: " discord-cli guilds widget get-guild-settings abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/widget"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget_update-guild-settings.go b/discord-cli/internal/cli/guilds_widget_update-guild-settings.go
new file mode 100644
index 00000000..081f7816
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget_update-guild-settings.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newGuildsWidgetUpdateGuildSettingsCmd(flags *rootFlags) *cobra.Command {
+ var bodyChannelId string
+ var bodyEnabled bool
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-guild-settings <guild_id>",
+ Aliases: []string{"update"},
+ Short: "Update guild settings",
+ Example: " discord-cli guilds widget update-guild-settings abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/guilds/{guild_id}/widget"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyChannelId != "" {
+ body["channel_id"] = bodyChannelId
+ }
+ if bodyEnabled != false {
+ body["enabled"] = bodyEnabled
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+ cmd.Flags().BoolVar(&bodyEnabled, "enabled", false, "Enabled")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/helpers.go b/discord-cli/internal/cli/helpers.go
new file mode 100644
index 00000000..bce71523
--- /dev/null
+++ b/discord-cli/internal/cli/helpers.go
@@ -0,0 +1,385 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "io"
+ "os"
+ "sort"
+ "strings"
+ "text/tabwriter"
+
+ "github.com/mattn/go-isatty"
+)
+
+var As = errors.As
+
+// noColor is set by the --no-color flag
+var noColor bool
+
+// humanFriendly is set by the --human-friendly flag; colors are off by default (agent-safe)
+var humanFriendly bool
+
+func colorEnabled() bool {
+ if noColor {
+ return false
+ }
+ if !humanFriendly {
+ return false
+ }
+ if os.Getenv("NO_COLOR") != "" {
+ return false
+ }
+ if os.Getenv("TERM") == "dumb" {
+ return false
+ }
+ return isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd())
+}
+
+func bold(s string) string {
+ if !colorEnabled() {
+ return s
+ }
+ return "\033[1m" + s + "\033[0m"
+}
+
+func green(s string) string {
+ if !colorEnabled() {
+ return s
+ }
+ return "\033[32m" + s + "\033[0m"
+}
+
+func red(s string) string {
+ if !colorEnabled() {
+ return s
+ }
+ return "\033[31m" + s + "\033[0m"
+}
+
+func yellow(s string) string {
+ if !colorEnabled() {
+ return s
+ }
+ return "\033[33m" + s + "\033[0m"
+}
+
+type cliError struct {
+ code int
+ err error
+}
+
+func (e *cliError) Error() string { return e.err.Error() }
+func (e *cliError) Unwrap() error { return e.err }
+
+func usageErr(err error) error { return &cliError{code: 2, err: err} }
+func notFoundErr(err error) error { return &cliError{code: 3, err: err} }
+func authErr(err error) error { return &cliError{code: 4, err: err} }
+func apiErr(err error) error { return &cliError{code: 5, err: err} }
+func configErr(err error) error { return &cliError{code: 10, err: err} }
+func rateLimitErr(err error) error { return &cliError{code: 7, err: err} }
+
+// classifyAPIError maps API errors to structured exit codes with actionable hints.
+func classifyAPIError(err error) error {
+ msg := err.Error()
+ switch {
+ case strings.Contains(msg, "HTTP 409"):
+ // 409 Conflict = resource already exists. For agents retrying creates, this is success.
+ fmt.Fprintln(os.Stderr, "already exists (no-op)")
+ return nil
+ case strings.Contains(msg, "HTTP 401") || strings.Contains(msg, "HTTP 403"):
+ return authErr(fmt.Errorf("%w\nhint: check your API credentials. Run 'discord-cli doctor' to verify auth, or set the required environment variable", err))
+ case strings.Contains(msg, "HTTP 404"):
+ return notFoundErr(fmt.Errorf("%w\nhint: resource not found. Run the 'list' command to see available items", err))
+ case strings.Contains(msg, "HTTP 429"):
+ return rateLimitErr(err)
+ default:
+ return apiErr(err)
+ }
+}
+
+// classifyDeleteError treats 404 as success for DELETE (already deleted = idempotent no-op).
+func classifyDeleteError(err error) error {
+ msg := err.Error()
+ if strings.Contains(msg, "HTTP 404") {
+ fmt.Fprintln(os.Stderr, "already deleted (no-op)")
+ return nil
+ }
+ return classifyAPIError(err)
+}
+
+func truncate(s string, max int) string {
+ if len(s) <= max {
+ return s
+ }
+ if max <= 3 {
+ return s[:max]
+ }
+ return s[:max-3] + "..."
+}
+
+func firstNonEmpty(items ...string) string {
+ for _, s := range items {
+ if s != "" {
+ return s
+ }
+ }
+ return ""
+}
+
+func newTabWriter(w io.Writer) *tabwriter.Writer {
+ return tabwriter.NewWriter(w, 2, 4, 2, ' ', 0)
+}
+
+func replacePathParam(path, name, value string) string {
+ return strings.ReplaceAll(path, "{"+name+"}", value)
+}
+
+// paginatedGet fetches pages and concatenates array results.
+func paginatedGet(c interface {
+ Get(path string, params map[string]string) (json.RawMessage, error)
+}, path string, params map[string]string, fetchAll bool, cursorParam, nextCursorPath, hasMoreField string) (json.RawMessage, error) {
+ // Clean zero-value params
+ clean := map[string]string{}
+ for k, v := range params {
+ if v != "" && v != "0" && v != "false" {
+ clean[k] = v
+ }
+ }
+
+ if !fetchAll {
+ return c.Get(path, clean)
+ }
+
+ // Fetch all pages
+ var allItems []json.RawMessage
+ page := 0
+ for {
+ page++
+ if humanFriendly {
+ fmt.Fprintf(os.Stderr, "fetching page %d...\n", page)
+ } else {
+ fmt.Fprintf(os.Stderr, `{"event":"page_fetch","page":%d}`+"\n", page)
+ }
+
+ data, err := c.Get(path, clean)
+ if err != nil {
+ return nil, err
+ }
+
+ // Try to extract items array
+ var items []json.RawMessage
+ if json.Unmarshal(data, &items) == nil {
+ allItems = append(allItems, items...)
+ } else {
+ // Response is an object - look for array inside
+ var obj map[string]json.RawMessage
+ if json.Unmarshal(data, &obj) == nil {
+ // Try common data fields
+ for _, field := range []string{"data", "items", "results", "messages", "members", "values"} {
+ if arr, ok := obj[field]; ok {
+ var nested []json.RawMessage
+ if json.Unmarshal(arr, &nested) == nil {
+ allItems = append(allItems, nested...)
+ break
+ }
+ }
+ }
+
+ // Check for next cursor
+ if nextCursorPath != "" {
+ if tokenRaw, ok := obj[nextCursorPath]; ok {
+ var token string
+ if json.Unmarshal(tokenRaw, &token) == nil && token != "" {
+ clean[cursorParam] = token
+ continue
+ }
+ }
+ }
+
+ // Check has_more
+ if hasMoreField != "" {
+ if moreRaw, ok := obj[hasMoreField]; ok {
+ var more bool
+ if json.Unmarshal(moreRaw, &more) == nil && more {
+ continue
+ }
+ }
+ }
+ }
+ // No more pages
+ break
+ }
+
+ // For direct arrays, can't paginate without cursor
+ break
+ }
+
+ if humanFriendly {
+ fmt.Fprintf(os.Stderr, "fetched %d items across %d pages\n", len(allItems), page)
+ } else {
+ fmt.Fprintf(os.Stderr, `{"event":"complete","total":%d,"pages":%d}`+"\n", len(allItems), page)
+ }
+ result, _ := json.Marshal(allItems)
+ return json.RawMessage(result), nil
+}
+
+// selectFields is set from the --select flag; used by printOutputFiltered.
+var selectFieldsGlobal string
+
+// printOutputFiltered applies --select field filtering before rendering.
+func printOutputFiltered(w io.Writer, data json.RawMessage, asJSON bool, selectExpr string) error {
+ if selectExpr != "" {
+ data = filterFields(data, selectExpr)
+ }
+ return printOutput(w, data, asJSON)
+}
+
+// filterFields keeps only the specified comma-separated fields from JSON objects/arrays.
+func filterFields(data json.RawMessage, fields string) json.RawMessage {
+ wanted := map[string]bool{}
+ for _, f := range strings.Split(fields, ",") {
+ f = strings.TrimSpace(f)
+ if f != "" {
+ wanted[f] = true
+ }
+ }
+ if len(wanted) == 0 {
+ return data
+ }
+
+ // Try array of objects
+ var items []map[string]json.RawMessage
+ if json.Unmarshal(data, &items) == nil {
+ filtered := make([]map[string]json.RawMessage, len(items))
+ for i, item := range items {
+ m := map[string]json.RawMessage{}
+ for k, v := range item {
+ if wanted[k] {
+ m[k] = v
+ }
+ }
+ filtered[i] = m
+ }
+ out, _ := json.Marshal(filtered)
+ return out
+ }
+
+ // Try single object
+ var obj map[string]json.RawMessage
+ if json.Unmarshal(data, &obj) == nil {
+ m := map[string]json.RawMessage{}
+ for k, v := range obj {
+ if wanted[k] {
+ m[k] = v
+ }
+ }
+ out, _ := json.Marshal(m)
+ return out
+ }
+
+ return data
+}
+
+// printOutput auto-detects arrays and renders as tables, or prints raw JSON for objects.
+func printOutput(w io.Writer, data json.RawMessage, asJSON bool) error {
+ if asJSON {
+ enc := json.NewEncoder(w)
+ enc.SetIndent("", " ")
+ return enc.Encode(data)
+ }
+
+ // Try to detect if response is an array
+ var items []map[string]any
+ if err := json.Unmarshal(data, &items); err == nil && len(items) > 0 {
+ return printAutoTable(w, items)
+ }
+
+ // Single object - pretty print
+ var obj map[string]any
+ if err := json.Unmarshal(data, &obj); err == nil {
+ enc := json.NewEncoder(w)
+ enc.SetIndent("", " ")
+ return enc.Encode(obj)
+ }
+
+ // Fallback: print raw
+ fmt.Fprintln(w, string(data))
+ return nil
+}
+
+func printAutoTable(w io.Writer, items []map[string]any) error {
+ if len(items) == 0 {
+ return nil
+ }
+
+ // Collect headers from first item, prioritize common fields
+ priority := []string{"id", "name", "username", "title", "status", "type", "email", "description"}
+ headerSet := map[string]struct{}{}
+ for k := range items[0] {
+ headerSet[k] = struct{}{}
+ }
+
+ var headers []string
+ for _, p := range priority {
+ if _, ok := headerSet[p]; ok {
+ headers = append(headers, p)
+ delete(headerSet, p)
+ }
+ }
+ // Add remaining headers sorted
+ var rest []string
+ for k := range headerSet {
+ rest = append(rest, k)
+ }
+ sort.Strings(rest)
+ headers = append(headers, rest...)
+
+ // Limit to 6 columns max for readability
+ if len(headers) > 6 {
+ headers = headers[:6]
+ }
+
+ // Build rows
+ rows := make([][]string, 0, len(items))
+ for _, item := range items {
+ row := make([]string, len(headers))
+ for i, h := range headers {
+ v := item[h]
+ switch val := v.(type) {
+ case string:
+ row[i] = truncate(val, 40)
+ case float64:
+ if val == float64(int64(val)) {
+ row[i] = fmt.Sprintf("%d", int64(val))
+ } else {
+ row[i] = fmt.Sprintf("%g", val)
+ }
+ case bool:
+ row[i] = fmt.Sprintf("%t", val)
+ case nil:
+ row[i] = ""
+ default:
+ b, _ := json.Marshal(val)
+ row[i] = truncate(string(b), 40)
+ }
+ }
+ rows = append(rows, row)
+ }
+
+ // Print with tab alignment using tabwriter
+ tw := newTabWriter(w)
+ upperHeaders := make([]string, len(headers))
+ for i, h := range headers {
+ upperHeaders[i] = bold(strings.ToUpper(h))
+ }
+
+ fmt.Fprintln(tw, strings.Join(upperHeaders, "\t"))
+ for _, row := range rows {
+ fmt.Fprintln(tw, strings.Join(row, "\t"))
+ }
+ return tw.Flush()
+}
diff --git a/discord-cli/internal/cli/import.go b/discord-cli/internal/cli/import.go
new file mode 100644
index 00000000..ac378a84
--- /dev/null
+++ b/discord-cli/internal/cli/import.go
@@ -0,0 +1,100 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "bufio"
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+func newImportCmd(flags *rootFlags) *cobra.Command {
+ var inputFile string
+ var dryRun bool
+ var batchSize int
+
+ cmd := &cobra.Command{
+ Use: "import <resource>",
+ Short: "Import data from JSONL file via API create/upsert calls",
+ Long: `Import data from a JSONL file by issuing POST requests for each record.
+Each line must be a valid JSON object. Failed records are logged to stderr
+but do not stop the import.`,
+ Example: ` # Import from a JSONL file
+ discord-cli import <resource> --input data.jsonl
+
+ # Dry-run to preview without sending
+ discord-cli import <resource> --input data.jsonl --dry-run
+
+ # Import from stdin
+ cat data.jsonl | discord-cli import <resource> --input -`,
+ Args: cobra.ExactArgs(1),
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+ c.DryRun = dryRun
+
+ resource := args[0]
+ path := "/" + resource
+
+ var reader io.Reader
+ if inputFile == "-" || inputFile == "" {
+ reader = os.Stdin
+ } else {
+ f, err := os.Open(inputFile)
+ if err != nil {
+ return fmt.Errorf("opening input file: %w", err)
+ }
+ defer f.Close()
+ reader = f
+ }
+
+ scanner := bufio.NewScanner(reader)
+ scanner.Buffer(make([]byte, 1024*1024), 1024*1024) // 1MB line buffer
+
+ var success, failed, skipped int
+ for scanner.Scan() {
+ line := strings.TrimSpace(scanner.Text())
+ if line == "" || line[0] == '#' {
+ skipped++
+ continue
+ }
+
+ var body map[string]any
+ if err := json.Unmarshal([]byte(line), &body); err != nil {
+ fmt.Fprintf(os.Stderr, "warning: skipping invalid JSON line: %v\n", err)
+ failed++
+ continue
+ }
+
+ _, err := c.Post(path, body)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "warning: failed to import record: %v\n", err)
+ failed++
+ continue
+ }
+ success++
+ }
+
+ if err := scanner.Err(); err != nil {
+ return fmt.Errorf("reading input: %w", err)
+ }
+
+ fmt.Fprintf(os.Stderr, "Import complete: %d succeeded, %d failed, %d skipped\n", success, failed, skipped)
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVarP(&inputFile, "input", "i", "", "Input JSONL file path (use - for stdin)")
+ _ = cmd.MarkFlagRequired("input")
+ cmd.Flags().BoolVar(&dryRun, "dry-run", false, "Preview import without sending requests")
+ cmd.Flags().IntVar(&batchSize, "batch-size", 1, "Records per batch (future: batch API support)")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/interactions.go b/discord-cli/internal/cli/interactions.go
new file mode 100644
index 00000000..88991180
--- /dev/null
+++ b/discord-cli/internal/cli/interactions.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newInteractionsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "interactions",
+ Short: "Manage interactions",
+ }
+
+ cmd.AddCommand(newInteractionsCallbackCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/interactions_callback.go b/discord-cli/internal/cli/interactions_callback.go
new file mode 100644
index 00000000..348e6923
--- /dev/null
+++ b/discord-cli/internal/cli/interactions_callback.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newInteractionsCallbackCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "callback",
+ Short: "Manage callback",
+ }
+
+ cmd.AddCommand(newInteractionsCallbackCreateInteractionResponseCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/interactions_callback_create-interaction-response.go b/discord-cli/internal/cli/interactions_callback_create-interaction-response.go
new file mode 100644
index 00000000..f0384eff
--- /dev/null
+++ b/discord-cli/internal/cli/interactions_callback_create-interaction-response.go
@@ -0,0 +1,71 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newInteractionsCallbackCreateInteractionResponseCmd(flags *rootFlags) *cobra.Command {
+ var flagWithResponse bool
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-interaction-response <interaction_id> <interaction_token>",
+ Aliases: []string{"create"},
+ Short: "Create interaction response",
+ Example: " discord-cli interactions callback create-interaction-response abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/interactions/{interaction_id}/{interaction_token}/callback"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("interaction_id is required"))
+ }
+ path = replacePathParam(path, "interaction_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("interaction_token is required"))
+ }
+ path = replacePathParam(path, "interaction_token", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWithResponse, "with-response", false, "With response")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/invites.go b/discord-cli/internal/cli/invites.go
new file mode 100644
index 00000000..db2f64d5
--- /dev/null
+++ b/discord-cli/internal/cli/invites.go
@@ -0,0 +1,19 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newInvitesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "invites",
+ Short: "Manage invites",
+ }
+
+ cmd.AddCommand(newInvitesResolveCmd(flags))
+ cmd.AddCommand(newInvitesRevokeCmd(flags))
+ cmd.AddCommand(newInvitesTargetUsersCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/invites_resolve.go b/discord-cli/internal/cli/invites_resolve.go
new file mode 100644
index 00000000..04c78aad
--- /dev/null
+++ b/discord-cli/internal/cli/invites_resolve.go
@@ -0,0 +1,60 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newInvitesResolveCmd(flags *rootFlags) *cobra.Command {
+ var flagWithCounts bool
+ var flagGuildScheduledEventId string
+
+ cmd := &cobra.Command{
+ Use: "resolve <code>",
+ Aliases: []string{"get"},
+ Short: "Resolve",
+ Example: " discord-cli invites resolve value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/invites/{code}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("code is required"))
+ }
+ path = replacePathParam(path, "code", args[0])
+ params := map[string]string{}
+ if flagWithCounts != false {
+ params["with_counts"] = fmt.Sprintf("%v", flagWithCounts)
+ }
+ if flagGuildScheduledEventId != "" {
+ params["guild_scheduled_event_id"] = fmt.Sprintf("%v", flagGuildScheduledEventId)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWithCounts, "with-counts", false, "With counts")
+ cmd.Flags().StringVar(&flagGuildScheduledEventId, "guild-scheduled-event-id", "", "Guild scheduled event id")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/invites_revoke.go b/discord-cli/internal/cli/invites_revoke.go
new file mode 100644
index 00000000..b0437165
--- /dev/null
+++ b/discord-cli/internal/cli/invites_revoke.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newInvitesRevokeCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "revoke <code>",
+ Aliases: []string{"delete"},
+ Short: "Revoke",
+ Example: " discord-cli invites revoke value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/invites/{code}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("code is required"))
+ }
+ path = replacePathParam(path, "code", args[0])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/invites_target-users.go b/discord-cli/internal/cli/invites_target-users.go
new file mode 100644
index 00000000..76ebc1dd
--- /dev/null
+++ b/discord-cli/internal/cli/invites_target-users.go
@@ -0,0 +1,19 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newInvitesTargetUsersCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "target-users",
+ Short: "Manage target users",
+ }
+
+ cmd.AddCommand(newInvitesTargetUsersGetInviteCmd(flags))
+ cmd.AddCommand(newInvitesTargetUsersGetInviteJobStatusCmd(flags))
+ cmd.AddCommand(newInvitesTargetUsersUpdateInviteCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/invites_target-users_get-invite-job-status.go b/discord-cli/internal/cli/invites_target-users_get-invite-job-status.go
new file mode 100644
index 00000000..8f4a2757
--- /dev/null
+++ b/discord-cli/internal/cli/invites_target-users_get-invite-job-status.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newInvitesTargetUsersGetInviteJobStatusCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-invite-job-status <code>",
+ Short: "Get the target users job status for an invite.",
+ Example: " discord-cli invites target-users get-invite-job-status value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/invites/{code}/target-users/job-status"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("code is required"))
+ }
+ path = replacePathParam(path, "code", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/invites_target-users_get-invite.go b/discord-cli/internal/cli/invites_target-users_get-invite.go
new file mode 100644
index 00000000..4798676a
--- /dev/null
+++ b/discord-cli/internal/cli/invites_target-users_get-invite.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newInvitesTargetUsersGetInviteCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-invite <code>",
+ Aliases: []string{"get"},
+ Short: "Get the target users for an invite.",
+ Example: " discord-cli invites target-users get-invite value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/invites/{code}/target-users"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("code is required"))
+ }
+ path = replacePathParam(path, "code", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/invites_target-users_update-invite.go b/discord-cli/internal/cli/invites_target-users_update-invite.go
new file mode 100644
index 00000000..150a8e4f
--- /dev/null
+++ b/discord-cli/internal/cli/invites_target-users_update-invite.go
@@ -0,0 +1,71 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newInvitesTargetUsersUpdateInviteCmd(flags *rootFlags) *cobra.Command {
+ var bodyTargetUsersFile string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-invite <code>",
+ Aliases: []string{"update"},
+ Short: "Update the target users for an existing invite.",
+ Example: " discord-cli invites target-users update-invite value --target-users-file value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/invites/{code}/target-users"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("code is required"))
+ }
+ path = replacePathParam(path, "code", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyTargetUsersFile != "" {
+ body["target_users_file"] = bodyTargetUsersFile
+ }
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyTargetUsersFile, "target-users-file", "", "Target users file")
+ _ = cmd.MarkFlagRequired("target-users-file")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies.go b/discord-cli/internal/cli/lobbies.go
new file mode 100644
index 00000000..8ded6857
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies.go
@@ -0,0 +1,23 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newLobbiesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "lobbies",
+ Short: "Manage lobbies",
+ }
+
+ cmd.AddCommand(newLobbiesCreateLobbyCmd(flags))
+ cmd.AddCommand(newLobbiesCreateOrJoinLobbyCmd(flags))
+ cmd.AddCommand(newLobbiesEditLobbyCmd(flags))
+ cmd.AddCommand(newLobbiesGetLobbyCmd(flags))
+ cmd.AddCommand(newLobbiesChannelLinkingCmd(flags))
+ cmd.AddCommand(newLobbiesMembersCmd(flags))
+ cmd.AddCommand(newLobbiesMessagesCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_channel-linking.go b/discord-cli/internal/cli/lobbies_channel-linking.go
new file mode 100644
index 00000000..ea900e05
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_channel-linking.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newLobbiesChannelLinkingCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "channel-linking",
+ Short: "Manage channel linking",
+ }
+
+ cmd.AddCommand(newLobbiesChannelLinkingEditLobbyChannelLinkCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_channel-linking_edit-lobby-channel-link.go b/discord-cli/internal/cli/lobbies_channel-linking_edit-lobby-channel-link.go
new file mode 100644
index 00000000..b43b4a7e
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_channel-linking_edit-lobby-channel-link.go
@@ -0,0 +1,70 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesChannelLinkingEditLobbyChannelLinkCmd(flags *rootFlags) *cobra.Command {
+ var bodyChannelId string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "edit-lobby-channel-link <lobby_id>",
+ Aliases: []string{"update"},
+ Short: "Edit lobby channel link",
+ Example: " discord-cli lobbies channel-linking edit-lobby-channel-link abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}/channel-linking"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyChannelId != "" {
+ body["channel_id"] = bodyChannelId
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_create-lobby.go b/discord-cli/internal/cli/lobbies_create-lobby.go
new file mode 100644
index 00000000..979d2a99
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_create-lobby.go
@@ -0,0 +1,76 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesCreateLobbyCmd(flags *rootFlags) *cobra.Command {
+ var bodyFlags string
+ var bodyIdleTimeoutSeconds int
+ var bodyOverrideEventWebhooksUrl string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-lobby",
+ Aliases: []string{"create"},
+ Short: "Create lobby",
+ Example: " discord-cli lobbies create-lobby",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies"
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyFlags != "" {
+ body["flags"] = bodyFlags
+ }
+ if bodyIdleTimeoutSeconds != 0 {
+ body["idle_timeout_seconds"] = bodyIdleTimeoutSeconds
+ }
+ if bodyOverrideEventWebhooksUrl != "" {
+ body["override_event_webhooks_url"] = bodyOverrideEventWebhooksUrl
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyFlags, "flags", "", "Flags")
+ cmd.Flags().IntVar(&bodyIdleTimeoutSeconds, "idle-timeout-seconds", 0, "Idle timeout seconds")
+ cmd.Flags().StringVar(&bodyOverrideEventWebhooksUrl, "override-event-webhooks-url", "", "Override event webhooks url")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_create-or-join-lobby.go b/discord-cli/internal/cli/lobbies_create-or-join-lobby.go
new file mode 100644
index 00000000..9829a3b4
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_create-or-join-lobby.go
@@ -0,0 +1,77 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesCreateOrJoinLobbyCmd(flags *rootFlags) *cobra.Command {
+ var bodyFlags string
+ var bodyIdleTimeoutSeconds int
+ var bodySecret string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-or-join-lobby",
+ Aliases: []string{"update"},
+ Short: "Create or join lobby",
+ Example: " discord-cli lobbies create-or-join-lobby --secret value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies"
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyFlags != "" {
+ body["flags"] = bodyFlags
+ }
+ if bodyIdleTimeoutSeconds != 0 {
+ body["idle_timeout_seconds"] = bodyIdleTimeoutSeconds
+ }
+ if bodySecret != "" {
+ body["secret"] = bodySecret
+ }
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyFlags, "flags", "", "Flags")
+ cmd.Flags().IntVar(&bodyIdleTimeoutSeconds, "idle-timeout-seconds", 0, "Idle timeout seconds")
+ cmd.Flags().StringVar(&bodySecret, "secret", "", "Secret")
+ _ = cmd.MarkFlagRequired("secret")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_edit-lobby.go b/discord-cli/internal/cli/lobbies_edit-lobby.go
new file mode 100644
index 00000000..770b6f92
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_edit-lobby.go
@@ -0,0 +1,79 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesEditLobbyCmd(flags *rootFlags) *cobra.Command {
+ var bodyFlags string
+ var bodyIdleTimeoutSeconds int
+ var bodyOverrideEventWebhooksUrl string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "edit-lobby <lobby_id>",
+ Short: "Edit lobby",
+ Example: " discord-cli lobbies edit-lobby abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyFlags != "" {
+ body["flags"] = bodyFlags
+ }
+ if bodyIdleTimeoutSeconds != 0 {
+ body["idle_timeout_seconds"] = bodyIdleTimeoutSeconds
+ }
+ if bodyOverrideEventWebhooksUrl != "" {
+ body["override_event_webhooks_url"] = bodyOverrideEventWebhooksUrl
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyFlags, "flags", "", "Flags")
+ cmd.Flags().IntVar(&bodyIdleTimeoutSeconds, "idle-timeout-seconds", 0, "Idle timeout seconds")
+ cmd.Flags().StringVar(&bodyOverrideEventWebhooksUrl, "override-event-webhooks-url", "", "Override event webhooks url")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_get-lobby.go b/discord-cli/internal/cli/lobbies_get-lobby.go
new file mode 100644
index 00000000..1423f102
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_get-lobby.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesGetLobbyCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-lobby <lobby_id>",
+ Aliases: []string{"get"},
+ Short: "Get lobby",
+ Example: " discord-cli lobbies get-lobby abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members.go b/discord-cli/internal/cli/lobbies_members.go
new file mode 100644
index 00000000..0edda2c2
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members.go
@@ -0,0 +1,22 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newLobbiesMembersCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "members",
+ Short: "Manage members",
+ }
+
+ cmd.AddCommand(newLobbiesMembersAddLobbyCmd(flags))
+ cmd.AddCommand(newLobbiesMembersBulkUpdateLobbyCmd(flags))
+ cmd.AddCommand(newLobbiesMembersCreateLinkedLobbyGuildInviteForSelfCmd(flags))
+ cmd.AddCommand(newLobbiesMembersCreateLinkedLobbyGuildInviteForUserCmd(flags))
+ cmd.AddCommand(newLobbiesMembersDeleteLobbyCmd(flags))
+ cmd.AddCommand(newLobbiesMembersLeaveLobbyCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_add-lobby.go b/discord-cli/internal/cli/lobbies_members_add-lobby.go
new file mode 100644
index 00000000..397ec72a
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_add-lobby.go
@@ -0,0 +1,74 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesMembersAddLobbyCmd(flags *rootFlags) *cobra.Command {
+ var bodyFlags string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "add-lobby <lobby_id> <user_id>",
+ Aliases: []string{"update"},
+ Short: "Add lobby",
+ Example: " discord-cli lobbies members add-lobby abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}/members/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyFlags != "" {
+ body["flags"] = bodyFlags
+ }
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyFlags, "flags", "", "Flags")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_bulk-update-lobby.go b/discord-cli/internal/cli/lobbies_members_bulk-update-lobby.go
new file mode 100644
index 00000000..5b22f5a8
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_bulk-update-lobby.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesMembersBulkUpdateLobbyCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "bulk-update-lobby <lobby_id>",
+ Aliases: []string{"create"},
+ Short: "Bulk update lobby",
+ Example: " discord-cli lobbies members bulk-update-lobby abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}/members/bulk"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-self.go b/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-self.go
new file mode 100644
index 00000000..d90ac693
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-self.go
@@ -0,0 +1,64 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesMembersCreateLinkedLobbyGuildInviteForSelfCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-linked-lobby-guild-invite-for-self <lobby_id>",
+ Short: "Create linked lobby guild invite for self",
+ Example: " discord-cli lobbies members create-linked-lobby-guild-invite-for-self abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}/members/@me/invites"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-user.go b/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-user.go
new file mode 100644
index 00000000..17a3976d
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-user.go
@@ -0,0 +1,68 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesMembersCreateLinkedLobbyGuildInviteForUserCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-linked-lobby-guild-invite-for-user <lobby_id> <user_id>",
+ Short: "Create linked lobby guild invite for user",
+ Example: " discord-cli lobbies members create-linked-lobby-guild-invite-for-user abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}/members/{user_id}/invites"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_delete-lobby.go b/discord-cli/internal/cli/lobbies_members_delete-lobby.go
new file mode 100644
index 00000000..e8258e4a
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_delete-lobby.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesMembersDeleteLobbyCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-lobby <lobby_id> <user_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete lobby",
+ Example: " discord-cli lobbies members delete-lobby abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}/members/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_leave-lobby.go b/discord-cli/internal/cli/lobbies_members_leave-lobby.go
new file mode 100644
index 00000000..c54e1ae7
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_leave-lobby.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesMembersLeaveLobbyCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "leave-lobby <lobby_id>",
+ Short: "Leave lobby",
+ Example: " discord-cli lobbies members leave-lobby abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}/members/@me"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_messages.go b/discord-cli/internal/cli/lobbies_messages.go
new file mode 100644
index 00000000..07fab0dc
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_messages.go
@@ -0,0 +1,19 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newLobbiesMessagesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "messages",
+ Short: "Manage messages",
+ }
+
+ cmd.AddCommand(newLobbiesMessagesCreateLobbyCmd(flags))
+ cmd.AddCommand(newLobbiesMessagesGetLobbyCmd(flags))
+ cmd.AddCommand(newLobbiesMessagesUpdateLobbyExternalModerationMetadataCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_messages_create-lobby.go b/discord-cli/internal/cli/lobbies_messages_create-lobby.go
new file mode 100644
index 00000000..3790db98
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_messages_create-lobby.go
@@ -0,0 +1,110 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesMessagesCreateLobbyCmd(flags *rootFlags) *cobra.Command {
+ var bodyAllowedMentions string
+ var bodyContent string
+ var bodyEnforceNonce bool
+ var bodyFlags int
+ var bodyMessageReference string
+ var bodyNonce string
+ var bodyPoll string
+ var bodySharedClientTheme string
+ var bodyTts bool
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-lobby <lobby_id>",
+ Aliases: []string{"create"},
+ Short: "Create lobby",
+ Example: " discord-cli lobbies messages create-lobby abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}/messages"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAllowedMentions != "" {
+ body["allowed_mentions"] = bodyAllowedMentions
+ }
+ if bodyContent != "" {
+ body["content"] = bodyContent
+ }
+ if bodyEnforceNonce != false {
+ body["enforce_nonce"] = bodyEnforceNonce
+ }
+ if bodyFlags != 0 {
+ body["flags"] = bodyFlags
+ }
+ if bodyMessageReference != "" {
+ body["message_reference"] = bodyMessageReference
+ }
+ if bodyNonce != "" {
+ body["nonce"] = bodyNonce
+ }
+ if bodyPoll != "" {
+ body["poll"] = bodyPoll
+ }
+ if bodySharedClientTheme != "" {
+ body["shared_client_theme"] = bodySharedClientTheme
+ }
+ if bodyTts != false {
+ body["tts"] = bodyTts
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAllowedMentions, "allowed-mentions", "", "Allowed mentions")
+ cmd.Flags().StringVar(&bodyContent, "content", "", "Content")
+ cmd.Flags().BoolVar(&bodyEnforceNonce, "enforce-nonce", false, "Enforce nonce")
+ cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+ cmd.Flags().StringVar(&bodyMessageReference, "message-reference", "", "Message reference")
+ cmd.Flags().StringVar(&bodyNonce, "nonce", "", "Nonce")
+ cmd.Flags().StringVar(&bodyPoll, "poll", "", "Poll")
+ cmd.Flags().StringVar(&bodySharedClientTheme, "shared-client-theme", "", "Shared client theme")
+ cmd.Flags().BoolVar(&bodyTts, "tts", false, "Tts")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_messages_get-lobby.go b/discord-cli/internal/cli/lobbies_messages_get-lobby.go
new file mode 100644
index 00000000..03d166eb
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_messages_get-lobby.go
@@ -0,0 +1,55 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesMessagesGetLobbyCmd(flags *rootFlags) *cobra.Command {
+ var flagLimit int
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "get-lobby <lobby_id>",
+ Aliases: []string{"get"},
+ Short: "Get lobby",
+ Example: " discord-cli lobbies messages get-lobby abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}/messages"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ data, err := paginatedGet(c, path, map[string]string{
+ "limit": fmt.Sprintf("%v", flagLimit),
+ }, flagAll, "", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_messages_update-lobby-external-moderation-metadata.go b/discord-cli/internal/cli/lobbies_messages_update-lobby-external-moderation-metadata.go
new file mode 100644
index 00000000..7fbb01b3
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_messages_update-lobby-external-moderation-metadata.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newLobbiesMessagesUpdateLobbyExternalModerationMetadataCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-lobby-external-moderation-metadata <lobby_id> <message_id>",
+ Aliases: []string{"update"},
+ Short: "Update the external moderation metadata for a lobby message.",
+ Example: " discord-cli lobbies messages update-lobby-external-moderation-metadata abc123 abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/lobbies/{lobby_id}/messages/{message_id}/moderation-metadata"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("lobby_id is required"))
+ }
+ path = replacePathParam(path, "lobby_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/oauth2.go b/discord-cli/internal/cli/oauth2.go
new file mode 100644
index 00000000..20bdb015
--- /dev/null
+++ b/discord-cli/internal/cli/oauth2.go
@@ -0,0 +1,20 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newOauth2Cmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "oauth2",
+ Short: "Manage oauth2",
+ }
+
+ cmd.AddCommand(newOauth2GetMyApplicationCmd(flags))
+ cmd.AddCommand(newOauth2GetMyAuthorizationCmd(flags))
+ cmd.AddCommand(newOauth2GetOpenidConnectUserinfoCmd(flags))
+ cmd.AddCommand(newOauth2GetPublicKeysCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/oauth2_get-my-application.go b/discord-cli/internal/cli/oauth2_get-my-application.go
new file mode 100644
index 00000000..9559fb0a
--- /dev/null
+++ b/discord-cli/internal/cli/oauth2_get-my-application.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newOauth2GetMyApplicationCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-my-application",
+ Aliases: []string{"list"},
+ Short: "Get my application",
+ Example: " discord-cli oauth2 get-my-application",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/oauth2/applications/@me"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/oauth2_get-my-authorization.go b/discord-cli/internal/cli/oauth2_get-my-authorization.go
new file mode 100644
index 00000000..6a8acf8b
--- /dev/null
+++ b/discord-cli/internal/cli/oauth2_get-my-authorization.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newOauth2GetMyAuthorizationCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-my-authorization",
+ Short: "Get my authorization",
+ Example: " discord-cli oauth2 get-my-authorization",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/oauth2/@me"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/oauth2_get-openid-connect-userinfo.go b/discord-cli/internal/cli/oauth2_get-openid-connect-userinfo.go
new file mode 100644
index 00000000..ba60d09f
--- /dev/null
+++ b/discord-cli/internal/cli/oauth2_get-openid-connect-userinfo.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newOauth2GetOpenidConnectUserinfoCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-openid-connect-userinfo",
+ Short: "Get openid connect userinfo",
+ Example: " discord-cli oauth2 get-openid-connect-userinfo",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/oauth2/userinfo"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/oauth2_get-public-keys.go b/discord-cli/internal/cli/oauth2_get-public-keys.go
new file mode 100644
index 00000000..cf3c862d
--- /dev/null
+++ b/discord-cli/internal/cli/oauth2_get-public-keys.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newOauth2GetPublicKeysCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-public-keys",
+ Short: "Get public keys",
+ Example: " discord-cli oauth2 get-public-keys",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/oauth2/keys"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk.go b/discord-cli/internal/cli/partner-sdk.go
new file mode 100644
index 00000000..e3166bc6
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newPartnerSdkCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "partner-sdk",
+ Short: "Manage partner sdk",
+ }
+
+ cmd.AddCommand(newPartnerSdkBotTokenCmd(flags))
+ cmd.AddCommand(newPartnerSdkBotUnmergeProvisionalAccountCmd(flags))
+ cmd.AddCommand(newPartnerSdkTokenCmd(flags))
+ cmd.AddCommand(newPartnerSdkUnmergeProvisionalAccountCmd(flags))
+ cmd.AddCommand(newPartnerSdkUpdateUserMessageExternalModerationMetadataCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk_bot-token.go b/discord-cli/internal/cli/partner-sdk_bot-token.go
new file mode 100644
index 00000000..21113583
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk_bot-token.go
@@ -0,0 +1,72 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newPartnerSdkBotTokenCmd(flags *rootFlags) *cobra.Command {
+ var bodyExternalUserId string
+ var bodyPreferredGlobalName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "bot-token",
+ Aliases: []string{"create"},
+ Short: "Bot token",
+ Example: " discord-cli partner-sdk bot-token --external-user-id abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/partner-sdk/token/bot"
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyExternalUserId != "" {
+ body["external_user_id"] = bodyExternalUserId
+ }
+ if bodyPreferredGlobalName != "" {
+ body["preferred_global_name"] = bodyPreferredGlobalName
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyExternalUserId, "external-user-id", "", "External user id")
+ _ = cmd.MarkFlagRequired("external-user-id")
+ cmd.Flags().StringVar(&bodyPreferredGlobalName, "preferred-global-name", "", "Preferred global name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk_bot-unmerge-provisional-account.go b/discord-cli/internal/cli/partner-sdk_bot-unmerge-provisional-account.go
new file mode 100644
index 00000000..a825bf6e
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk_bot-unmerge-provisional-account.go
@@ -0,0 +1,66 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newPartnerSdkBotUnmergeProvisionalAccountCmd(flags *rootFlags) *cobra.Command {
+ var bodyExternalUserId string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "bot-unmerge-provisional-account",
+ Short: "Bot unmerge provisional account",
+ Example: " discord-cli partner-sdk bot-unmerge-provisional-account --external-user-id abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/partner-sdk/provisional-accounts/unmerge/bot"
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyExternalUserId != "" {
+ body["external_user_id"] = bodyExternalUserId
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyExternalUserId, "external-user-id", "", "External user id")
+ _ = cmd.MarkFlagRequired("external-user-id")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk_token.go b/discord-cli/internal/cli/partner-sdk_token.go
new file mode 100644
index 00000000..fabeddf6
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk_token.go
@@ -0,0 +1,83 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newPartnerSdkTokenCmd(flags *rootFlags) *cobra.Command {
+ var bodyClientId string
+ var bodyClientSecret string
+ var bodyExternalAuthToken string
+ var bodyExternalAuthType string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "token",
+ Short: "Token",
+ Example: " discord-cli partner-sdk token --client-id abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/partner-sdk/token"
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyClientId != "" {
+ body["client_id"] = bodyClientId
+ }
+ if bodyClientSecret != "" {
+ body["client_secret"] = bodyClientSecret
+ }
+ if bodyExternalAuthToken != "" {
+ body["external_auth_token"] = bodyExternalAuthToken
+ }
+ if bodyExternalAuthType != "" {
+ body["external_auth_type"] = bodyExternalAuthType
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyClientId, "client-id", "", "Client id")
+ _ = cmd.MarkFlagRequired("client-id")
+ cmd.Flags().StringVar(&bodyClientSecret, "client-secret", "", "Client secret")
+ cmd.Flags().StringVar(&bodyExternalAuthToken, "external-auth-token", "", "External auth token")
+ _ = cmd.MarkFlagRequired("external-auth-token")
+ cmd.Flags().StringVar(&bodyExternalAuthType, "external-auth-type", "", "External auth type")
+ _ = cmd.MarkFlagRequired("external-auth-type")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk_unmerge-provisional-account.go b/discord-cli/internal/cli/partner-sdk_unmerge-provisional-account.go
new file mode 100644
index 00000000..f8712798
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk_unmerge-provisional-account.go
@@ -0,0 +1,83 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newPartnerSdkUnmergeProvisionalAccountCmd(flags *rootFlags) *cobra.Command {
+ var bodyClientId string
+ var bodyClientSecret string
+ var bodyExternalAuthToken string
+ var bodyExternalAuthType string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "unmerge-provisional-account",
+ Short: "Unmerge provisional account",
+ Example: " discord-cli partner-sdk unmerge-provisional-account --client-id abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/partner-sdk/provisional-accounts/unmerge"
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyClientId != "" {
+ body["client_id"] = bodyClientId
+ }
+ if bodyClientSecret != "" {
+ body["client_secret"] = bodyClientSecret
+ }
+ if bodyExternalAuthToken != "" {
+ body["external_auth_token"] = bodyExternalAuthToken
+ }
+ if bodyExternalAuthType != "" {
+ body["external_auth_type"] = bodyExternalAuthType
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyClientId, "client-id", "", "Client id")
+ _ = cmd.MarkFlagRequired("client-id")
+ cmd.Flags().StringVar(&bodyClientSecret, "client-secret", "", "Client secret")
+ cmd.Flags().StringVar(&bodyExternalAuthToken, "external-auth-token", "", "External auth token")
+ _ = cmd.MarkFlagRequired("external-auth-token")
+ cmd.Flags().StringVar(&bodyExternalAuthType, "external-auth-type", "", "External auth type")
+ _ = cmd.MarkFlagRequired("external-auth-type")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk_update-user-message-external-moderation-metadata.go b/discord-cli/internal/cli/partner-sdk_update-user-message-external-moderation-metadata.go
new file mode 100644
index 00000000..09803fb4
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk_update-user-message-external-moderation-metadata.go
@@ -0,0 +1,73 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newPartnerSdkUpdateUserMessageExternalModerationMetadataCmd(flags *rootFlags) *cobra.Command {
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-user-message-external-moderation-metadata <user_id_1> <user_id_2> <message_id>",
+ Aliases: []string{"update"},
+ Short: "Update the external moderation metadata for a user message (DM).",
+ Example: " discord-cli partner-sdk update-user-message-external-moderation-metadata value value abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/partner-sdk/dms/{user_id_1}/{user_id_2}/messages/{message_id}/moderation-metadata"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("user_id_1 is required"))
+ }
+ path = replacePathParam(path, "user_id_1", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("user_id_2 is required"))
+ }
+ path = replacePathParam(path, "user_id_2", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[2])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/root.go b/discord-cli/internal/cli/root.go
new file mode 100644
index 00000000..0eb35e98
--- /dev/null
+++ b/discord-cli/internal/cli/root.go
@@ -0,0 +1,145 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "text/tabwriter"
+ "time"
+
+ "github.com/USER/discord-cli/internal/client"
+ "github.com/USER/discord-cli/internal/config"
+ "github.com/spf13/cobra"
+)
+
+var version = "10"
+
+type rootFlags struct {
+ asJSON bool
+ csv bool
+ plain bool
+ quiet bool
+ dryRun bool
+ noCache bool
+ yes bool
+ selectFields string
+ configPath string
+ timeout time.Duration
+}
+
+// Execute runs the CLI in non-interactive mode: never prompts, all values via flags or stdin.
+func Execute() error {
+ var flags rootFlags
+
+ rootCmd := &cobra.Command{
+ Use: "discord-cli",
+ Short: "Manage Discord servers, channels, messages, roles, and more from your terminal",
+ SilenceUsage: true,
+ SilenceErrors: true,
+ Version: version,
+ }
+ rootCmd.SetVersionTemplate("discord-cli {{ .Version }}\n")
+
+ rootCmd.PersistentFlags().BoolVar(&flags.asJSON, "json", false, "Output as JSON")
+ rootCmd.PersistentFlags().BoolVar(&flags.csv, "csv", false, "Output as CSV (table and array responses)")
+ rootCmd.PersistentFlags().BoolVar(&flags.plain, "plain", false, "Output as plain tab-separated text")
+ rootCmd.PersistentFlags().BoolVar(&flags.quiet, "quiet", false, "Bare output, one value per line")
+ rootCmd.PersistentFlags().StringVar(&flags.configPath, "config", "", "Config file path")
+ rootCmd.PersistentFlags().DurationVar(&flags.timeout, "timeout", 30*time.Second, "Request timeout")
+ rootCmd.PersistentFlags().BoolVar(&flags.dryRun, "dry-run", false, "Show request without sending")
+ rootCmd.PersistentFlags().BoolVar(&flags.noCache, "no-cache", false, "Bypass response cache")
+ rootCmd.PersistentFlags().StringVar(&flags.selectFields, "select", "", "Comma-separated fields to include in output (e.g. --select id,name,status)")
+ rootCmd.PersistentFlags().BoolVar(&flags.yes, "yes", false, "Skip confirmation prompts (for agents and scripts)")
+ rootCmd.PersistentFlags().BoolVar(&noColor, "no-color", false, "Disable colored output")
+ rootCmd.PersistentFlags().BoolVar(&humanFriendly, "human-friendly", false, "Enable colored output and rich formatting")
+ rootCmd.AddCommand(newApplicationsCmd(&flags))
+ rootCmd.AddCommand(newChannelsCmd(&flags))
+ rootCmd.AddCommand(newGatewayCmd(&flags))
+ rootCmd.AddCommand(newGuildsCmd(&flags))
+ rootCmd.AddCommand(newInteractionsCmd(&flags))
+ rootCmd.AddCommand(newInvitesCmd(&flags))
+ rootCmd.AddCommand(newLobbiesCmd(&flags))
+ rootCmd.AddCommand(newOauth2Cmd(&flags))
+ rootCmd.AddCommand(newPartnerSdkCmd(&flags))
+ rootCmd.AddCommand(newSoundboardDefaultSoundsCmd(&flags))
+ rootCmd.AddCommand(newStageInstancesCmd(&flags))
+ rootCmd.AddCommand(newStickerPacksCmd(&flags))
+ rootCmd.AddCommand(newStickersCmd(&flags))
+ rootCmd.AddCommand(newUsersCmd(&flags))
+ rootCmd.AddCommand(newVoiceCmd(&flags))
+ rootCmd.AddCommand(newWebhooksCmd(&flags))
+ rootCmd.AddCommand(newDoctorCmd(&flags))
+ rootCmd.AddCommand(newAuthCmd(&flags))
+ rootCmd.AddCommand(newExportCmd(&flags))
+ rootCmd.AddCommand(newImportCmd(&flags))
+ rootCmd.AddCommand(newSearchCmd(&flags))
+ rootCmd.AddCommand(newSyncCmd(&flags))
+ rootCmd.AddCommand(newTailCmd(&flags))
+ rootCmd.AddCommand(newAnalyticsCmd(&flags))
+ rootCmd.AddCommand(newWorkflowCmd(&flags))
+ rootCmd.AddCommand(newVersionCliCmd())
+
+ return rootCmd.Execute()
+}
+
+func ExitCode(err error) int {
+ var codeErr *cliError
+ if As(err, &codeErr) {
+ return codeErr.code
+ }
+ return 1
+}
+
+func (f *rootFlags) newClient() (*client.Client, error) {
+ cfg, err := config.Load(f.configPath)
+ if err != nil {
+ return nil, configErr(err)
+ }
+ c := client.New(cfg, f.timeout)
+ c.DryRun = f.dryRun
+ c.NoCache = f.noCache
+ return c, nil
+}
+
+func (f *rootFlags) printJSON(w *cobra.Command, v any) error {
+ enc := json.NewEncoder(w.OutOrStdout())
+ enc.SetIndent("", " ")
+ return enc.Encode(v)
+}
+
+func (f *rootFlags) printTable(w *cobra.Command, headers []string, rows [][]string) error {
+ if f.asJSON {
+ return fmt.Errorf("use printJSON for JSON output")
+ }
+ tw := tabwriter.NewWriter(w.OutOrStdout(), 2, 4, 2, ' ', 0)
+ header := ""
+ for i, h := range headers {
+ if i > 0 {
+ header += "\t"
+ }
+ header += h
+ }
+ fmt.Fprintln(tw, header)
+ for _, row := range rows {
+ line := ""
+ for i, cell := range row {
+ if i > 0 {
+ line += "\t"
+ }
+ line += cell
+ }
+ fmt.Fprintln(tw, line)
+ }
+ return tw.Flush()
+}
+
+func newVersionCliCmd() *cobra.Command {
+ return &cobra.Command{
+ Use: "version",
+ Short: "Print version",
+ Run: func(cmd *cobra.Command, args []string) {
+ fmt.Printf("discord-cli %s\n", version)
+ },
+ }
+}
diff --git a/discord-cli/internal/cli/search.go b/discord-cli/internal/cli/search.go
new file mode 100644
index 00000000..43d2243c
--- /dev/null
+++ b/discord-cli/internal/cli/search.go
@@ -0,0 +1,77 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "github.com/USER/discord-cli/internal/store"
+ "github.com/spf13/cobra"
+)
+
+func newSearchCmd(flags *rootFlags) *cobra.Command {
+ var resourceType string
+ var limit int
+ var dbPath string
+
+ cmd := &cobra.Command{
+ Use: "search <query>",
+ Short: "Full-text search across locally synced data",
+ Long: `Search locally cached data using FTS5 full-text search.
+Data must be synced first with the sync command. Searches are instant
+(millisecond-fast) since they query local SQLite, not the remote API.`,
+ Example: ` # Search all synced data
+ discord-cli search "error timeout"
+
+ # Search a specific resource type
+ discord-cli search "payment failed" --type transactions
+
+ # JSON output for piping
+ discord-cli search "critical" --json --limit 20`,
+ Args: cobra.ExactArgs(1),
+ RunE: func(cmd *cobra.Command, args []string) error {
+ query := args[0]
+
+ if dbPath == "" {
+ home, _ := os.UserHomeDir()
+ dbPath = filepath.Join(home, ".local", "share", "discord-cli", "data.db")
+ }
+
+ db, err := store.Open(dbPath)
+ if err != nil {
+ return fmt.Errorf("opening local database: %w\nRun 'discord-cli sync' first to populate the local database.", err)
+ }
+ defer db.Close()
+
+ results, err := db.Search(query, limit)
+ if err != nil {
+ return fmt.Errorf("search failed: %w", err)
+ }
+
+ if len(results) == 0 {
+ fmt.Fprintf(os.Stderr, "No results for %q\n", query)
+ return nil
+ }
+
+ if flags.asJSON {
+ enc := json.NewEncoder(os.Stdout)
+ enc.SetIndent("", " ")
+ return enc.Encode(results)
+ }
+
+ for _, r := range results {
+ fmt.Println(string(r))
+ }
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&resourceType, "type", "", "Filter by resource type")
+ cmd.Flags().IntVar(&limit, "limit", 50, "Maximum results to return")
+ cmd.Flags().StringVar(&dbPath, "db", "", "Database path (default: ~/.local/share/discord-cli/data.db)")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/soundboard-default-sounds.go b/discord-cli/internal/cli/soundboard-default-sounds.go
new file mode 100644
index 00000000..f95a6b5e
--- /dev/null
+++ b/discord-cli/internal/cli/soundboard-default-sounds.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newSoundboardDefaultSoundsCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "soundboard-default-sounds",
+ Short: "Manage soundboard default sounds",
+ }
+
+ cmd.AddCommand(newSoundboardDefaultSoundsGetCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/soundboard-default-sounds_get.go b/discord-cli/internal/cli/soundboard-default-sounds_get.go
new file mode 100644
index 00000000..fb8e9b54
--- /dev/null
+++ b/discord-cli/internal/cli/soundboard-default-sounds_get.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newSoundboardDefaultSoundsGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get",
+ Aliases: []string{"list"},
+ Short: "Get",
+ Example: " discord-cli soundboard-default-sounds get",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/soundboard-default-sounds"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/stage-instances.go b/discord-cli/internal/cli/stage-instances.go
new file mode 100644
index 00000000..6c64f3d3
--- /dev/null
+++ b/discord-cli/internal/cli/stage-instances.go
@@ -0,0 +1,20 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newStageInstancesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "stage-instances",
+ Short: "Manage stage instances",
+ }
+
+ cmd.AddCommand(newStageInstancesCreateCmd(flags))
+ cmd.AddCommand(newStageInstancesDeleteCmd(flags))
+ cmd.AddCommand(newStageInstancesGetCmd(flags))
+ cmd.AddCommand(newStageInstancesUpdateCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/stage-instances_create.go b/discord-cli/internal/cli/stage-instances_create.go
new file mode 100644
index 00000000..505f53ed
--- /dev/null
+++ b/discord-cli/internal/cli/stage-instances_create.go
@@ -0,0 +1,87 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newStageInstancesCreateCmd(flags *rootFlags) *cobra.Command {
+ var bodyChannelId string
+ var bodyGuildScheduledEventId string
+ var bodyPrivacyLevel string
+ var bodySendStartNotification bool
+ var bodyTopic string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create",
+ Short: "Create",
+ Example: " discord-cli stage-instances create --channel-id abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/stage-instances"
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyChannelId != "" {
+ body["channel_id"] = bodyChannelId
+ }
+ if bodyGuildScheduledEventId != "" {
+ body["guild_scheduled_event_id"] = bodyGuildScheduledEventId
+ }
+ if bodyPrivacyLevel != "" {
+ body["privacy_level"] = bodyPrivacyLevel
+ }
+ if bodySendStartNotification != false {
+ body["send_start_notification"] = bodySendStartNotification
+ }
+ if bodyTopic != "" {
+ body["topic"] = bodyTopic
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+ _ = cmd.MarkFlagRequired("channel-id")
+ cmd.Flags().StringVar(&bodyGuildScheduledEventId, "guild-scheduled-event-id", "", "Guild scheduled event id")
+ cmd.Flags().StringVar(&bodyPrivacyLevel, "privacy-level", "", "Privacy level")
+ cmd.Flags().BoolVar(&bodySendStartNotification, "send-start-notification", false, "Send start notification")
+ cmd.Flags().StringVar(&bodyTopic, "topic", "", "Topic")
+ _ = cmd.MarkFlagRequired("topic")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/stage-instances_delete.go b/discord-cli/internal/cli/stage-instances_delete.go
new file mode 100644
index 00000000..83010b10
--- /dev/null
+++ b/discord-cli/internal/cli/stage-instances_delete.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newStageInstancesDeleteCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete <channel_id>",
+ Short: "Delete",
+ Example: " discord-cli stage-instances delete abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/stage-instances/{channel_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/stage-instances_get.go b/discord-cli/internal/cli/stage-instances_get.go
new file mode 100644
index 00000000..c9fcca69
--- /dev/null
+++ b/discord-cli/internal/cli/stage-instances_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newStageInstancesGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get <channel_id>",
+ Short: "Get",
+ Example: " discord-cli stage-instances get abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/stage-instances/{channel_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/stage-instances_update.go b/discord-cli/internal/cli/stage-instances_update.go
new file mode 100644
index 00000000..1547c2c5
--- /dev/null
+++ b/discord-cli/internal/cli/stage-instances_update.go
@@ -0,0 +1,74 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newStageInstancesUpdateCmd(flags *rootFlags) *cobra.Command {
+ var bodyPrivacyLevel int
+ var bodyTopic string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update <channel_id>",
+ Short: "Update",
+ Example: " discord-cli stage-instances update abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/stage-instances/{channel_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("channel_id is required"))
+ }
+ path = replacePathParam(path, "channel_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyPrivacyLevel != 0 {
+ body["privacy_level"] = bodyPrivacyLevel
+ }
+ if bodyTopic != "" {
+ body["topic"] = bodyTopic
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().IntVar(&bodyPrivacyLevel, "privacy-level", 0, "Privacy level")
+ cmd.Flags().StringVar(&bodyTopic, "topic", "", "Topic")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/sticker-packs.go b/discord-cli/internal/cli/sticker-packs.go
new file mode 100644
index 00000000..088f782f
--- /dev/null
+++ b/discord-cli/internal/cli/sticker-packs.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newStickerPacksCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "sticker-packs",
+ Short: "Manage sticker packs",
+ }
+
+ cmd.AddCommand(newStickerPacksGetCmd(flags))
+ cmd.AddCommand(newStickerPacksListCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/sticker-packs_get.go b/discord-cli/internal/cli/sticker-packs_get.go
new file mode 100644
index 00000000..8ad099d8
--- /dev/null
+++ b/discord-cli/internal/cli/sticker-packs_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newStickerPacksGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get <pack_id>",
+ Short: "Get",
+ Example: " discord-cli sticker-packs get abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/sticker-packs/{pack_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("pack_id is required"))
+ }
+ path = replacePathParam(path, "pack_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/sticker-packs_list.go b/discord-cli/internal/cli/sticker-packs_list.go
new file mode 100644
index 00000000..fc397db8
--- /dev/null
+++ b/discord-cli/internal/cli/sticker-packs_list.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newStickerPacksListCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list",
+ Short: "List",
+ Example: " discord-cli sticker-packs list",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/sticker-packs"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/stickers.go b/discord-cli/internal/cli/stickers.go
new file mode 100644
index 00000000..9019c96e
--- /dev/null
+++ b/discord-cli/internal/cli/stickers.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newStickersCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "stickers",
+ Short: "Manage stickers",
+ }
+
+ cmd.AddCommand(newStickersGetCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/stickers_get.go b/discord-cli/internal/cli/stickers_get.go
new file mode 100644
index 00000000..2f4533fe
--- /dev/null
+++ b/discord-cli/internal/cli/stickers_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newStickersGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get <sticker_id>",
+ Short: "Get",
+ Example: " discord-cli stickers get abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/stickers/{sticker_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("sticker_id is required"))
+ }
+ path = replacePathParam(path, "sticker_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/sync.go b/discord-cli/internal/cli/sync.go
new file mode 100644
index 00000000..2346733a
--- /dev/null
+++ b/discord-cli/internal/cli/sync.go
@@ -0,0 +1,128 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "github.com/USER/discord-cli/internal/store"
+ "github.com/spf13/cobra"
+)
+
+func newSyncCmd(flags *rootFlags) *cobra.Command {
+ var resources []string
+ var full bool
+ var dbPath string
+
+ cmd := &cobra.Command{
+ Use: "sync",
+ Short: "Sync API data to local SQLite for offline search and analysis",
+ Long: `Sync data from the API into a local SQLite database. Supports resumable
+incremental sync (only fetches new data since last sync) and full resync.
+Once synced, use the 'search' command for instant full-text search.`,
+ Example: ` # Sync all resources
+ discord-cli sync
+
+ # Sync specific resources only
+ discord-cli sync --resources channels,messages
+
+ # Full resync (ignore previous checkpoint)
+ discord-cli sync --full`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+ c.NoCache = true
+
+ if dbPath == "" {
+ home, _ := os.UserHomeDir()
+ dbPath = filepath.Join(home, ".local", "share", "discord-cli", "data.db")
+ }
+
+ db, err := store.Open(dbPath)
+ if err != nil {
+ return fmt.Errorf("opening local database: %w", err)
+ }
+ defer db.Close()
+
+ // If no specific resources, sync top-level resources
+ if len(resources) == 0 {
+ resources = defaultSyncResources()
+ }
+
+ var totalSynced int
+ for _, resource := range resources {
+ fmt.Fprintf(os.Stderr, "Syncing %s...\n", resource)
+
+ path := "/" + resource
+ data, err := c.Get(path, nil)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "warning: failed to sync %s: %v\n", resource, err)
+ continue
+ }
+
+ var items []json.RawMessage
+ if err := json.Unmarshal(data, &items); err != nil {
+ // Single object response - store as-is
+ if err := db.Upsert(resource, resource, data); err != nil {
+ fmt.Fprintf(os.Stderr, "warning: failed to store %s: %v\n", resource, err)
+ } else {
+ totalSynced++
+ }
+ continue
+ }
+
+ count := 0
+ for _, item := range items {
+ var obj map[string]any
+ if err := json.Unmarshal(item, &obj); err != nil {
+ continue
+ }
+ id := extractID(obj)
+ if id == "" {
+ id = fmt.Sprintf("%s-%d", resource, count)
+ }
+ if err := db.Upsert(resource, id, item); err != nil {
+ fmt.Fprintf(os.Stderr, "warning: failed to store %s/%s: %v\n", resource, id, err)
+ continue
+ }
+ count++
+ }
+
+ if err := db.SaveSyncState(resource, "", count); err != nil {
+ fmt.Fprintf(os.Stderr, "warning: failed to save sync state for %s: %v\n", resource, err)
+ }
+
+ fmt.Fprintf(os.Stderr, " %s: %d records synced\n", resource, count)
+ totalSynced += count
+ }
+
+ fmt.Fprintf(os.Stderr, "Sync complete: %d total records across %d resources\n", totalSynced, len(resources))
+ return nil
+ },
+ }
+
+ cmd.Flags().StringSliceVar(&resources, "resources", nil, "Comma-separated resource types to sync")
+ cmd.Flags().BoolVar(&full, "full", false, "Full resync (ignore previous checkpoint)")
+ cmd.Flags().StringVar(&dbPath, "db", "", "Database path (default: ~/.local/share/discord-cli/data.db)")
+
+ return cmd
+}
+
+func defaultSyncResources() []string {
+ // Override this in the generated CLI to list the API's top-level list endpoints
+ return []string{}
+}
+
+func extractID(obj map[string]any) string {
+ for _, key := range []string{"id", "ID", "uuid", "slug", "name"} {
+ if v, ok := obj[key]; ok {
+ return fmt.Sprintf("%v", v)
+ }
+ }
+ return ""
+}
diff --git a/discord-cli/internal/cli/tail.go b/discord-cli/internal/cli/tail.go
new file mode 100644
index 00000000..5da944ba
--- /dev/null
+++ b/discord-cli/internal/cli/tail.go
@@ -0,0 +1,117 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "os/signal"
+ "syscall"
+ "time"
+
+ "github.com/spf13/cobra"
+)
+
+func newTailCmd(flags *rootFlags) *cobra.Command {
+ var resource string
+ var interval time.Duration
+ var follow bool
+
+ cmd := &cobra.Command{
+ Use: "tail [resource]",
+ Short: "Stream live changes by polling the API at regular intervals",
+ Long: `Tail streams live data changes by polling the API at configurable intervals.
+Events are emitted as NDJSON to stdout for piping to other tools.
+Gracefully shuts down on SIGTERM/SIGINT.
+
+Note: For APIs with WebSocket or SSE support, a future version will use
+native streaming instead of polling.`,
+ Example: ` # Tail all changes every 10 seconds
+ discord-cli tail --interval 10s
+
+ # Tail a specific resource
+ discord-cli tail messages --interval 5s
+
+ # Pipe to jq for filtering
+ discord-cli tail events --interval 30s | jq 'select(.type == "error")'`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+ c.NoCache = true
+
+ if len(args) > 0 {
+ resource = args[0]
+ }
+ if resource == "" {
+ return fmt.Errorf("resource name required (e.g., 'tail messages')")
+ }
+
+ path := "/" + resource
+
+ sig := make(chan os.Signal, 1)
+ signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)
+
+ ticker := time.NewTicker(interval)
+ defer ticker.Stop()
+
+ enc := json.NewEncoder(os.Stdout)
+
+ fmt.Fprintf(os.Stderr, "Tailing %s every %s (Ctrl+C to stop)\n", resource, interval)
+
+ // Initial fetch
+ if err := fetchAndEmit(c, path, enc); err != nil {
+ fmt.Fprintf(os.Stderr, "warning: initial fetch failed: %v\n", err)
+ }
+
+ for {
+ select {
+ case <-sig:
+ fmt.Fprintln(os.Stderr, "\nShutting down gracefully...")
+ return nil
+ case <-ticker.C:
+ if err := fetchAndEmit(c, path, enc); err != nil {
+ fmt.Fprintf(os.Stderr, "warning: poll failed: %v\n", err)
+ }
+ }
+ }
+ },
+ }
+
+ cmd.Flags().StringVar(&resource, "resource", "", "Resource type to tail")
+ cmd.Flags().DurationVar(&interval, "interval", 10*time.Second, "Poll interval")
+ cmd.Flags().BoolVar(&follow, "follow", true, "Keep running (set --follow=false for single poll)")
+
+ return cmd
+}
+
+func fetchAndEmit(c interface{ Get(string, map[string]string) (json.RawMessage, error) }, path string, enc *json.Encoder) error {
+ data, err := c.Get(path, nil)
+ if err != nil {
+ return err
+ }
+
+ var items []json.RawMessage
+ if err := json.Unmarshal(data, &items); err != nil {
+ event := map[string]any{
+ "event": "data",
+ "timestamp": time.Now().UTC().Format(time.RFC3339),
+ "data": json.RawMessage(data),
+ }
+ return enc.Encode(event)
+ }
+
+ for _, item := range items {
+ event := map[string]any{
+ "event": "data",
+ "timestamp": time.Now().UTC().Format(time.RFC3339),
+ "data": item,
+ }
+ if err := enc.Encode(event); err != nil {
+ return err
+ }
+ }
+ return nil
+}
diff --git a/discord-cli/internal/cli/users.go b/discord-cli/internal/cli/users.go
new file mode 100644
index 00000000..97eb9689
--- /dev/null
+++ b/discord-cli/internal/cli/users.go
@@ -0,0 +1,28 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newUsersCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "users",
+ Short: "Manage users",
+ }
+
+ cmd.AddCommand(newUsersCreateDmCmd(flags))
+ cmd.AddCommand(newUsersDeleteApplicationRoleConnectionCmd(flags))
+ cmd.AddCommand(newUsersGetCmd(flags))
+ cmd.AddCommand(newUsersGetApplicationRoleConnectionCmd(flags))
+ cmd.AddCommand(newUsersGetCurrentApplicationEntitlementsCmd(flags))
+ cmd.AddCommand(newUsersGetMyCmd(flags))
+ cmd.AddCommand(newUsersGetMyGuildMemberCmd(flags))
+ cmd.AddCommand(newUsersLeaveGuildCmd(flags))
+ cmd.AddCommand(newUsersListMyConnectionsCmd(flags))
+ cmd.AddCommand(newUsersListMyGuildsCmd(flags))
+ cmd.AddCommand(newUsersUpdateApplicationRoleConnectionCmd(flags))
+ cmd.AddCommand(newUsersUpdateMyCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_create-dm.go b/discord-cli/internal/cli/users_create-dm.go
new file mode 100644
index 00000000..889f66e0
--- /dev/null
+++ b/discord-cli/internal/cli/users_create-dm.go
@@ -0,0 +1,66 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersCreateDmCmd(flags *rootFlags) *cobra.Command {
+ var bodyRecipientId string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "create-dm",
+ Aliases: []string{"create"},
+ Short: "Create dm",
+ Example: " discord-cli users create-dm",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me/channels"
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyRecipientId != "" {
+ body["recipient_id"] = bodyRecipientId
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyRecipientId, "recipient-id", "", "Recipient id")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_delete-application-role-connection.go b/discord-cli/internal/cli/users_delete-application-role-connection.go
new file mode 100644
index 00000000..22c48a6c
--- /dev/null
+++ b/discord-cli/internal/cli/users_delete-application-role-connection.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersDeleteApplicationRoleConnectionCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-application-role-connection <application_id>",
+ Aliases: []string{"delete"},
+ Short: "Delete application role connection",
+ Example: " discord-cli users delete-application-role-connection abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me/applications/{application_id}/role-connection"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_get-application-role-connection.go b/discord-cli/internal/cli/users_get-application-role-connection.go
new file mode 100644
index 00000000..20231372
--- /dev/null
+++ b/discord-cli/internal/cli/users_get-application-role-connection.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersGetApplicationRoleConnectionCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-application-role-connection <application_id>",
+ Short: "Get application role connection",
+ Example: " discord-cli users get-application-role-connection abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me/applications/{application_id}/role-connection"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_get-current-application-entitlements.go b/discord-cli/internal/cli/users_get-current-application-entitlements.go
new file mode 100644
index 00000000..ed5a050c
--- /dev/null
+++ b/discord-cli/internal/cli/users_get-current-application-entitlements.go
@@ -0,0 +1,59 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersGetCurrentApplicationEntitlementsCmd(flags *rootFlags) *cobra.Command {
+ var flagSkuIds string
+ var flagExcludeConsumed bool
+
+ cmd := &cobra.Command{
+ Use: "get-current-application-entitlements <application_id>",
+ Short: "Get current application entitlements",
+ Example: " discord-cli users get-current-application-entitlements abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me/applications/{application_id}/entitlements"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ params := map[string]string{}
+ if flagSkuIds != "" {
+ params["sku_ids"] = fmt.Sprintf("%v", flagSkuIds)
+ }
+ if flagExcludeConsumed != false {
+ params["exclude_consumed"] = fmt.Sprintf("%v", flagExcludeConsumed)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagSkuIds, "sku-ids", "", "Sku ids")
+ cmd.Flags().BoolVar(&flagExcludeConsumed, "exclude-consumed", false, "Exclude consumed")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_get-my-guild-member.go b/discord-cli/internal/cli/users_get-my-guild-member.go
new file mode 100644
index 00000000..dd49dbab
--- /dev/null
+++ b/discord-cli/internal/cli/users_get-my-guild-member.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersGetMyGuildMemberCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-my-guild-member <guild_id>",
+ Short: "Get my guild member",
+ Example: " discord-cli users get-my-guild-member abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me/guilds/{guild_id}/member"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_get-my.go b/discord-cli/internal/cli/users_get-my.go
new file mode 100644
index 00000000..8cf29f57
--- /dev/null
+++ b/discord-cli/internal/cli/users_get-my.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersGetMyCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-my",
+ Aliases: []string{"list"},
+ Short: "Get my",
+ Example: " discord-cli users get-my",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_get.go b/discord-cli/internal/cli/users_get.go
new file mode 100644
index 00000000..44f8eb8f
--- /dev/null
+++ b/discord-cli/internal/cli/users_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get <user_id>",
+ Short: "Get",
+ Example: " discord-cli users get abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/{user_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("user_id is required"))
+ }
+ path = replacePathParam(path, "user_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_leave-guild.go b/discord-cli/internal/cli/users_leave-guild.go
new file mode 100644
index 00000000..4d6505a1
--- /dev/null
+++ b/discord-cli/internal/cli/users_leave-guild.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersLeaveGuildCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "leave-guild <guild_id>",
+ Short: "Leave guild",
+ Example: " discord-cli users leave-guild abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me/guilds/{guild_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("guild_id is required"))
+ }
+ path = replacePathParam(path, "guild_id", args[0])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_list-my-connections.go b/discord-cli/internal/cli/users_list-my-connections.go
new file mode 100644
index 00000000..6946614b
--- /dev/null
+++ b/discord-cli/internal/cli/users_list-my-connections.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersListMyConnectionsCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-my-connections",
+ Short: "List my connections",
+ Example: " discord-cli users list-my-connections",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me/connections"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_list-my-guilds.go b/discord-cli/internal/cli/users_list-my-guilds.go
new file mode 100644
index 00000000..cd72b18a
--- /dev/null
+++ b/discord-cli/internal/cli/users_list-my-guilds.go
@@ -0,0 +1,59 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersListMyGuildsCmd(flags *rootFlags) *cobra.Command {
+ var flagBefore string
+ var flagAfter string
+ var flagLimit int
+ var flagWithCounts bool
+ var flagAll bool
+
+ cmd := &cobra.Command{
+ Use: "list-my-guilds",
+ Short: "List my guilds",
+ Example: " discord-cli users list-my-guilds",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me/guilds"
+ data, err := paginatedGet(c, path, map[string]string{
+ "before": fmt.Sprintf("%v", flagBefore),
+ "after": fmt.Sprintf("%v", flagAfter),
+ "limit": fmt.Sprintf("%v", flagLimit),
+ "with_counts": fmt.Sprintf("%v", flagWithCounts),
+ }, flagAll, "after", "", "")
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+ cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+ cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+ cmd.Flags().BoolVar(&flagWithCounts, "with-counts", false, "With counts")
+ cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_update-application-role-connection.go b/discord-cli/internal/cli/users_update-application-role-connection.go
new file mode 100644
index 00000000..a657da4a
--- /dev/null
+++ b/discord-cli/internal/cli/users_update-application-role-connection.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersUpdateApplicationRoleConnectionCmd(flags *rootFlags) *cobra.Command {
+ var bodyPlatformName string
+ var bodyPlatformUsername string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-application-role-connection <application_id>",
+ Aliases: []string{"update"},
+ Short: "Update application role connection",
+ Example: " discord-cli users update-application-role-connection abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me/applications/{application_id}/role-connection"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("application_id is required"))
+ }
+ path = replacePathParam(path, "application_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyPlatformName != "" {
+ body["platform_name"] = bodyPlatformName
+ }
+ if bodyPlatformUsername != "" {
+ body["platform_username"] = bodyPlatformUsername
+ }
+ }
+ data, err := c.Put(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyPlatformName, "platform-name", "", "Platform name")
+ cmd.Flags().StringVar(&bodyPlatformUsername, "platform-username", "", "Platform username")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/users_update-my.go b/discord-cli/internal/cli/users_update-my.go
new file mode 100644
index 00000000..31ca0985
--- /dev/null
+++ b/discord-cli/internal/cli/users_update-my.go
@@ -0,0 +1,76 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newUsersUpdateMyCmd(flags *rootFlags) *cobra.Command {
+ var bodyAvatar string
+ var bodyBanner string
+ var bodyUsername string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-my",
+ Short: "Update my",
+ Example: " discord-cli users update-my --username my-resource",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/users/@me"
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAvatar != "" {
+ body["avatar"] = bodyAvatar
+ }
+ if bodyBanner != "" {
+ body["banner"] = bodyBanner
+ }
+ if bodyUsername != "" {
+ body["username"] = bodyUsername
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAvatar, "avatar", "", "Avatar")
+ cmd.Flags().StringVar(&bodyBanner, "banner", "", "Banner")
+ cmd.Flags().StringVar(&bodyUsername, "username", "", "Username")
+ _ = cmd.MarkFlagRequired("username")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/voice.go b/discord-cli/internal/cli/voice.go
new file mode 100644
index 00000000..d89092fd
--- /dev/null
+++ b/discord-cli/internal/cli/voice.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newVoiceCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "voice",
+ Short: "Manage voice",
+ }
+
+ cmd.AddCommand(newVoiceListRegionsCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/voice_list-regions.go b/discord-cli/internal/cli/voice_list-regions.go
new file mode 100644
index 00000000..5c2a6056
--- /dev/null
+++ b/discord-cli/internal/cli/voice_list-regions.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newVoiceListRegionsCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "list-regions",
+ Aliases: []string{"list"},
+ Short: "List regions",
+ Example: " discord-cli voice list-regions",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/voice/regions"
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks.go b/discord-cli/internal/cli/webhooks.go
new file mode 100644
index 00000000..97ee017e
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks.go
@@ -0,0 +1,26 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newWebhooksCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "webhooks",
+ Short: "Manage webhooks",
+ }
+
+ cmd.AddCommand(newWebhooksDeleteCmd(flags))
+ cmd.AddCommand(newWebhooksDeleteByTokenCmd(flags))
+ cmd.AddCommand(newWebhooksExecuteCmd(flags))
+ cmd.AddCommand(newWebhooksGetCmd(flags))
+ cmd.AddCommand(newWebhooksGetByTokenCmd(flags))
+ cmd.AddCommand(newWebhooksUpdateCmd(flags))
+ cmd.AddCommand(newWebhooksUpdateByTokenCmd(flags))
+ cmd.AddCommand(newWebhooksGithubCmd(flags))
+ cmd.AddCommand(newWebhooksMessagesCmd(flags))
+ cmd.AddCommand(newWebhooksSlackCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_delete-by-token.go b/discord-cli/internal/cli/webhooks_delete-by-token.go
new file mode 100644
index 00000000..2d818530
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_delete-by-token.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksDeleteByTokenCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete-by-token <webhook_id> <webhook_token>",
+ Short: "Delete by token",
+ Example: " discord-cli webhooks delete-by-token abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_delete.go b/discord-cli/internal/cli/webhooks_delete.go
new file mode 100644
index 00000000..9fe532d9
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_delete.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksDeleteCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "delete <webhook_id>",
+ Short: "Delete",
+ Example: " discord-cli webhooks delete abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_execute.go b/discord-cli/internal/cli/webhooks_execute.go
new file mode 100644
index 00000000..8b5e91cf
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_execute.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksExecuteCmd(flags *rootFlags) *cobra.Command {
+ var flagWait bool
+ var flagThreadId string
+ var flagWithComponents bool
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "execute <webhook_id> <webhook_token>",
+ Aliases: []string{"create"},
+ Short: "Execute",
+ Example: " discord-cli webhooks execute abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWait, "wait", false, "Wait")
+ cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+ cmd.Flags().BoolVar(&flagWithComponents, "with-components", false, "With components")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_get-by-token.go b/discord-cli/internal/cli/webhooks_get-by-token.go
new file mode 100644
index 00000000..41a6e537
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_get-by-token.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksGetByTokenCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get-by-token <webhook_id> <webhook_token>",
+ Short: "Get by token",
+ Example: " discord-cli webhooks get-by-token abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_get.go b/discord-cli/internal/cli/webhooks_get.go
new file mode 100644
index 00000000..2b84f0ba
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksGetCmd(flags *rootFlags) *cobra.Command {
+
+ cmd := &cobra.Command{
+ Use: "get <webhook_id>",
+ Short: "Get",
+ Example: " discord-cli webhooks get abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ params := map[string]string{}
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_github.go b/discord-cli/internal/cli/webhooks_github.go
new file mode 100644
index 00000000..efe17a25
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_github.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newWebhooksGithubCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "github",
+ Short: "Manage github",
+ }
+
+ cmd.AddCommand(newWebhooksGithubExecuteCompatibleWebhookCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_github_execute-compatible-webhook.go b/discord-cli/internal/cli/webhooks_github_execute-compatible-webhook.go
new file mode 100644
index 00000000..6c2d6279
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_github_execute-compatible-webhook.go
@@ -0,0 +1,163 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksGithubExecuteCompatibleWebhookCmd(flags *rootFlags) *cobra.Command {
+ var flagWait bool
+ var flagThreadId string
+ var bodyAction string
+ var bodyAnswer string
+ var bodyCheckRun string
+ var bodyCheckSuite string
+ var bodyComment string
+ var bodyCompare string
+ var bodyDiscussion string
+ var bodyForced bool
+ var bodyForkee string
+ var bodyHeadCommit string
+ var bodyIssue string
+ var bodyMember string
+ var bodyPullRequest string
+ var bodyRef string
+ var bodyRefType string
+ var bodyRelease string
+ var bodyRepository string
+ var bodyReview string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "execute-compatible-webhook <webhook_id> <webhook_token>",
+ Aliases: []string{"create"},
+ Short: "Execute compatible webhook",
+ Example: " discord-cli webhooks github execute-compatible-webhook abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}/github"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAction != "" {
+ body["action"] = bodyAction
+ }
+ if bodyAnswer != "" {
+ body["answer"] = bodyAnswer
+ }
+ if bodyCheckRun != "" {
+ body["check_run"] = bodyCheckRun
+ }
+ if bodyCheckSuite != "" {
+ body["check_suite"] = bodyCheckSuite
+ }
+ if bodyComment != "" {
+ body["comment"] = bodyComment
+ }
+ if bodyCompare != "" {
+ body["compare"] = bodyCompare
+ }
+ if bodyDiscussion != "" {
+ body["discussion"] = bodyDiscussion
+ }
+ if bodyForced != false {
+ body["forced"] = bodyForced
+ }
+ if bodyForkee != "" {
+ body["forkee"] = bodyForkee
+ }
+ if bodyHeadCommit != "" {
+ body["head_commit"] = bodyHeadCommit
+ }
+ if bodyIssue != "" {
+ body["issue"] = bodyIssue
+ }
+ if bodyMember != "" {
+ body["member"] = bodyMember
+ }
+ if bodyPullRequest != "" {
+ body["pull_request"] = bodyPullRequest
+ }
+ if bodyRef != "" {
+ body["ref"] = bodyRef
+ }
+ if bodyRefType != "" {
+ body["ref_type"] = bodyRefType
+ }
+ if bodyRelease != "" {
+ body["release"] = bodyRelease
+ }
+ if bodyRepository != "" {
+ body["repository"] = bodyRepository
+ }
+ if bodyReview != "" {
+ body["review"] = bodyReview
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWait, "wait", false, "Wait")
+ cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+ cmd.Flags().StringVar(&bodyAction, "action", "", "Action")
+ cmd.Flags().StringVar(&bodyAnswer, "answer", "", "Answer")
+ cmd.Flags().StringVar(&bodyCheckRun, "check-run", "", "Check run")
+ cmd.Flags().StringVar(&bodyCheckSuite, "check-suite", "", "Check suite")
+ cmd.Flags().StringVar(&bodyComment, "comment", "", "Comment")
+ cmd.Flags().StringVar(&bodyCompare, "compare", "", "Compare")
+ cmd.Flags().StringVar(&bodyDiscussion, "discussion", "", "Discussion")
+ cmd.Flags().BoolVar(&bodyForced, "forced", false, "Forced")
+ cmd.Flags().StringVar(&bodyForkee, "forkee", "", "Forkee")
+ cmd.Flags().StringVar(&bodyHeadCommit, "head-commit", "", "Head commit")
+ cmd.Flags().StringVar(&bodyIssue, "issue", "", "Issue")
+ cmd.Flags().StringVar(&bodyMember, "member", "", "Member")
+ cmd.Flags().StringVar(&bodyPullRequest, "pull-request", "", "Pull request")
+ cmd.Flags().StringVar(&bodyRef, "ref", "", "Ref")
+ cmd.Flags().StringVar(&bodyRefType, "ref-type", "", "Ref type")
+ cmd.Flags().StringVar(&bodyRelease, "release", "", "Release")
+ cmd.Flags().StringVar(&bodyRepository, "repository", "", "Repository")
+ cmd.Flags().StringVar(&bodyReview, "review", "", "Review")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages.go b/discord-cli/internal/cli/webhooks_messages.go
new file mode 100644
index 00000000..910ee238
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages.go
@@ -0,0 +1,22 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newWebhooksMessagesCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "messages",
+ Short: "Manage messages",
+ }
+
+ cmd.AddCommand(newWebhooksMessagesDeleteOriginalWebhookCmd(flags))
+ cmd.AddCommand(newWebhooksMessagesDeleteWebhookCmd(flags))
+ cmd.AddCommand(newWebhooksMessagesGetOriginalWebhookCmd(flags))
+ cmd.AddCommand(newWebhooksMessagesGetWebhookCmd(flags))
+ cmd.AddCommand(newWebhooksMessagesUpdateOriginalWebhookCmd(flags))
+ cmd.AddCommand(newWebhooksMessagesUpdateWebhookCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_delete-original-webhook.go b/discord-cli/internal/cli/webhooks_messages_delete-original-webhook.go
new file mode 100644
index 00000000..aa882aea
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_delete-original-webhook.go
@@ -0,0 +1,55 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksMessagesDeleteOriginalWebhookCmd(flags *rootFlags) *cobra.Command {
+ var flagThreadId string
+
+ cmd := &cobra.Command{
+ Use: "delete-original-webhook <webhook_id> <webhook_token>",
+ Aliases: []string{"delete"},
+ Short: "Delete original webhook",
+ Example: " discord-cli webhooks messages delete-original-webhook abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}/messages/@original"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_delete-webhook.go b/discord-cli/internal/cli/webhooks_messages_delete-webhook.go
new file mode 100644
index 00000000..72fad912
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_delete-webhook.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksMessagesDeleteWebhookCmd(flags *rootFlags) *cobra.Command {
+ var flagThreadId string
+
+ cmd := &cobra.Command{
+ Use: "delete-webhook <webhook_id> <webhook_token> <message_id>",
+ Short: "Delete webhook",
+ Example: " discord-cli webhooks messages delete-webhook abc123 value abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}/messages/{message_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[2])
+ data, err := c.Delete(path)
+ if err != nil {
+ return classifyDeleteError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_get-original-webhook.go b/discord-cli/internal/cli/webhooks_messages_get-original-webhook.go
new file mode 100644
index 00000000..bbaf2d0c
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_get-original-webhook.go
@@ -0,0 +1,59 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksMessagesGetOriginalWebhookCmd(flags *rootFlags) *cobra.Command {
+ var flagThreadId string
+
+ cmd := &cobra.Command{
+ Use: "get-original-webhook <webhook_id> <webhook_token>",
+ Aliases: []string{"get"},
+ Short: "Get original webhook",
+ Example: " discord-cli webhooks messages get-original-webhook abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}/messages/@original"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ params := map[string]string{}
+ if flagThreadId != "" {
+ params["thread_id"] = fmt.Sprintf("%v", flagThreadId)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_get-webhook.go b/discord-cli/internal/cli/webhooks_messages_get-webhook.go
new file mode 100644
index 00000000..401f5758
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_get-webhook.go
@@ -0,0 +1,62 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksMessagesGetWebhookCmd(flags *rootFlags) *cobra.Command {
+ var flagThreadId string
+
+ cmd := &cobra.Command{
+ Use: "get-webhook <webhook_id> <webhook_token> <message_id>",
+ Short: "Get webhook",
+ Example: " discord-cli webhooks messages get-webhook abc123 value abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}/messages/{message_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[2])
+ params := map[string]string{}
+ if flagThreadId != "" {
+ params["thread_id"] = fmt.Sprintf("%v", flagThreadId)
+ }
+ data, err := c.Get(path, params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_update-original-webhook.go b/discord-cli/internal/cli/webhooks_messages_update-original-webhook.go
new file mode 100644
index 00000000..b424e433
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_update-original-webhook.go
@@ -0,0 +1,93 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksMessagesUpdateOriginalWebhookCmd(flags *rootFlags) *cobra.Command {
+ var flagThreadId string
+ var flagWithComponents bool
+ var bodyAllowedMentions string
+ var bodyContent string
+ var bodyFlags int
+ var bodyPoll string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-original-webhook <webhook_id> <webhook_token>",
+ Aliases: []string{"update"},
+ Short: "Update original webhook",
+ Example: " discord-cli webhooks messages update-original-webhook abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}/messages/@original"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAllowedMentions != "" {
+ body["allowed_mentions"] = bodyAllowedMentions
+ }
+ if bodyContent != "" {
+ body["content"] = bodyContent
+ }
+ if bodyFlags != 0 {
+ body["flags"] = bodyFlags
+ }
+ if bodyPoll != "" {
+ body["poll"] = bodyPoll
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+ cmd.Flags().BoolVar(&flagWithComponents, "with-components", false, "With components")
+ cmd.Flags().StringVar(&bodyAllowedMentions, "allowed-mentions", "", "Allowed mentions")
+ cmd.Flags().StringVar(&bodyContent, "content", "", "Content")
+ cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+ cmd.Flags().StringVar(&bodyPoll, "poll", "", "Poll")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_update-webhook.go b/discord-cli/internal/cli/webhooks_messages_update-webhook.go
new file mode 100644
index 00000000..2aaed736
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_update-webhook.go
@@ -0,0 +1,96 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksMessagesUpdateWebhookCmd(flags *rootFlags) *cobra.Command {
+ var flagThreadId string
+ var flagWithComponents bool
+ var bodyAllowedMentions string
+ var bodyContent string
+ var bodyFlags int
+ var bodyPoll string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-webhook <webhook_id> <webhook_token> <message_id>",
+ Short: "Update webhook",
+ Example: " discord-cli webhooks messages update-webhook abc123 value abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}/messages/{message_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ if len(args) < 3 {
+ return usageErr(fmt.Errorf("message_id is required"))
+ }
+ path = replacePathParam(path, "message_id", args[2])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAllowedMentions != "" {
+ body["allowed_mentions"] = bodyAllowedMentions
+ }
+ if bodyContent != "" {
+ body["content"] = bodyContent
+ }
+ if bodyFlags != 0 {
+ body["flags"] = bodyFlags
+ }
+ if bodyPoll != "" {
+ body["poll"] = bodyPoll
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+ cmd.Flags().BoolVar(&flagWithComponents, "with-components", false, "With components")
+ cmd.Flags().StringVar(&bodyAllowedMentions, "allowed-mentions", "", "Allowed mentions")
+ cmd.Flags().StringVar(&bodyContent, "content", "", "Content")
+ cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+ cmd.Flags().StringVar(&bodyPoll, "poll", "", "Poll")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_slack.go b/discord-cli/internal/cli/webhooks_slack.go
new file mode 100644
index 00000000..98da2834
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_slack.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func newWebhooksSlackCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "slack",
+ Short: "Manage slack",
+ }
+
+ cmd.AddCommand(newWebhooksSlackExecuteCompatibleWebhookCmd(flags))
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_slack_execute-compatible-webhook.go b/discord-cli/internal/cli/webhooks_slack_execute-compatible-webhook.go
new file mode 100644
index 00000000..6ac52c32
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_slack_execute-compatible-webhook.go
@@ -0,0 +1,88 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksSlackExecuteCompatibleWebhookCmd(flags *rootFlags) *cobra.Command {
+ var flagWait bool
+ var flagThreadId string
+ var bodyIconUrl string
+ var bodyText string
+ var bodyUsername string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "execute-compatible-webhook <webhook_id> <webhook_token>",
+ Aliases: []string{"create"},
+ Short: "Execute compatible webhook",
+ Example: " discord-cli webhooks slack execute-compatible-webhook abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}/slack"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyIconUrl != "" {
+ body["icon_url"] = bodyIconUrl
+ }
+ if bodyText != "" {
+ body["text"] = bodyText
+ }
+ if bodyUsername != "" {
+ body["username"] = bodyUsername
+ }
+ }
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().BoolVar(&flagWait, "wait", false, "Wait")
+ cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+ cmd.Flags().StringVar(&bodyIconUrl, "icon-url", "", "Icon url")
+ cmd.Flags().StringVar(&bodyText, "text", "", "Text")
+ cmd.Flags().StringVar(&bodyUsername, "username", "", "Username")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_update-by-token.go b/discord-cli/internal/cli/webhooks_update-by-token.go
new file mode 100644
index 00000000..eba610e2
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_update-by-token.go
@@ -0,0 +1,78 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksUpdateByTokenCmd(flags *rootFlags) *cobra.Command {
+ var bodyAvatar string
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update-by-token <webhook_id> <webhook_token>",
+ Short: "Update by token",
+ Example: " discord-cli webhooks update-by-token abc123 value",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}/{webhook_token}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ if len(args) < 2 {
+ return usageErr(fmt.Errorf("webhook_token is required"))
+ }
+ path = replacePathParam(path, "webhook_token", args[1])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAvatar != "" {
+ body["avatar"] = bodyAvatar
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAvatar, "avatar", "", "Avatar")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_update.go b/discord-cli/internal/cli/webhooks_update.go
new file mode 100644
index 00000000..f43d3bd0
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_update.go
@@ -0,0 +1,79 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf // ensure import
+var _ = io.ReadAll // ensure import
+var _ = os.Stdin // ensure import
+var _ json.RawMessage // ensure import
+
+func newWebhooksUpdateCmd(flags *rootFlags) *cobra.Command {
+ var bodyAvatar string
+ var bodyChannelId string
+ var bodyName string
+ var stdinBody bool
+
+ cmd := &cobra.Command{
+ Use: "update <webhook_id>",
+ Short: "Update",
+ Example: " discord-cli webhooks update abc123",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ path := "/webhooks/{webhook_id}"
+ if len(args) < 1 {
+ return usageErr(fmt.Errorf("webhook_id is required"))
+ }
+ path = replacePathParam(path, "webhook_id", args[0])
+ var body map[string]any
+ if stdinBody {
+ stdinData, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return fmt.Errorf("reading stdin: %w", err)
+ }
+ var jsonBody map[string]any
+ if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+ return fmt.Errorf("parsing stdin JSON: %w", err)
+ }
+ body = jsonBody
+ } else {
+ body = map[string]any{}
+ if bodyAvatar != "" {
+ body["avatar"] = bodyAvatar
+ }
+ if bodyChannelId != "" {
+ body["channel_id"] = bodyChannelId
+ }
+ if bodyName != "" {
+ body["name"] = bodyName
+ }
+ }
+ data, err := c.Patch(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+ },
+ }
+ cmd.Flags().StringVar(&bodyAvatar, "avatar", "", "Avatar")
+ cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+ cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+ cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_audit_report.go b/discord-cli/internal/cli/workflow_audit_report.go
new file mode 100644
index 00000000..cdaeee58
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_audit_report.go
@@ -0,0 +1,139 @@
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "sort"
+
+ "github.com/spf13/cobra"
+)
+
+func newAuditReportCmd(flags *rootFlags) *cobra.Command {
+ var guildID string
+ var actionType string
+ var userID string
+ var limit int
+
+ cmd := &cobra.Command{
+ Use: "audit-report",
+ Short: "Analyze audit log entries grouped by action type, user, and date",
+ Long: `Fetches the audit log for a guild and produces a summary report.
+Groups entries by action type and user, showing who did what and when.
+Useful for security reviews, moderation tracking, and compliance.
+
+Combines: GET /guilds/{id}/audit-logs with analysis and grouping.`,
+ Example: ` # Full audit report for a guild
+ discord-cli audit-report --guild 123456789012345678
+
+ # Filter by action type (e.g., MEMBER_BAN_ADD=22)
+ discord-cli audit-report --guild 123456789012345678 --action 22
+
+ # Filter by user who performed the action
+ discord-cli audit-report --guild 123456789012345678 --user 987654321098765432
+
+ # JSON output
+ discord-cli audit-report --guild 123456789012345678 --json --limit 100`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ if guildID == "" {
+ return usageErr(fmt.Errorf("--guild is required"))
+ }
+
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+ c.NoCache = true
+
+ fmt.Fprintf(os.Stderr, "Fetching audit log for guild %s...\n", guildID)
+ params := map[string]string{"limit": fmt.Sprintf("%d", limit)}
+ if actionType != "" {
+ params["action_type"] = actionType
+ }
+ if userID != "" {
+ params["user_id"] = userID
+ }
+
+ data, err := c.Get(fmt.Sprintf("/guilds/%s/audit-logs", guildID), params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ var auditLog struct {
+ Entries []map[string]any `json:"audit_log_entries"`
+ Users []map[string]any `json:"users"`
+ }
+ if err := json.Unmarshal(data, &auditLog); err != nil {
+ return fmt.Errorf("parsing audit log: %w", err)
+ }
+
+ // Build user lookup
+ userNames := map[string]string{}
+ for _, u := range auditLog.Users {
+ id := fmt.Sprintf("%v", u["id"])
+ username, _ := u["username"].(string)
+ userNames[id] = username
+ }
+
+ // Group by action type
+ actionCounts := map[string]int{}
+ userActionCounts := map[string]int{}
+ for _, entry := range auditLog.Entries {
+ action := fmt.Sprintf("%v", entry["action_type"])
+ actionCounts[action]++
+
+ uid := fmt.Sprintf("%v", entry["user_id"])
+ name := userNames[uid]
+ if name == "" {
+ name = uid
+ }
+ userActionCounts[name]++
+ }
+
+ if flags.asJSON {
+ result := map[string]any{
+ "guild_id": guildID,
+ "total_entries": len(auditLog.Entries),
+ "by_action": actionCounts,
+ "by_user": userActionCounts,
+ "entries": auditLog.Entries,
+ }
+ enc := json.NewEncoder(os.Stdout)
+ enc.SetIndent("", " ")
+ return enc.Encode(result)
+ }
+
+ fmt.Printf("\nAudit Report (guild: %s, %d entries)\n\n", guildID, len(auditLog.Entries))
+
+ fmt.Println("By Action Type:")
+ printSortedCounts(actionCounts)
+
+ fmt.Println("\nBy User:")
+ printSortedCounts(userActionCounts)
+
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID (required)")
+ cmd.Flags().StringVar(&actionType, "action", "", "Filter by action type number")
+ cmd.Flags().StringVar(&userID, "user", "", "Filter by user ID who performed the action")
+ cmd.Flags().IntVar(&limit, "limit", 50, "Maximum audit log entries to fetch")
+
+ return cmd
+}
+
+func printSortedCounts(counts map[string]int) {
+ type kv struct {
+ Key string
+ Count int
+ }
+ var sorted []kv
+ for k, v := range counts {
+ sorted = append(sorted, kv{k, v})
+ }
+ sort.Slice(sorted, func(i, j int) bool { return sorted[i].Count > sorted[j].Count })
+ for _, item := range sorted {
+ fmt.Printf(" %-40s %d\n", item.Key, item.Count)
+ }
+}
diff --git a/discord-cli/internal/cli/workflow_channel_health.go b/discord-cli/internal/cli/workflow_channel_health.go
new file mode 100644
index 00000000..ec6b1cb7
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_channel_health.go
@@ -0,0 +1,167 @@
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "sort"
+ "time"
+
+ "github.com/spf13/cobra"
+)
+
+type channelHealthReport struct {
+ ID string `json:"id"`
+ Name string `json:"name"`
+ RecentCount int `json:"recent_messages"`
+ LastMessage string `json:"last_message_at"`
+ Stale bool `json:"stale"`
+ DaysSilent int `json:"days_silent"`
+}
+
+func newChannelHealthCmd(flags *rootFlags) *cobra.Command {
+ var guildID string
+ var days int
+
+ cmd := &cobra.Command{
+ Use: "channel-health",
+ Short: "Detect stale channels and show activity trends across a guild",
+ Long: `Fetches all text channels in a guild, samples recent messages from each,
+and reports activity levels. Identifies stale channels (no messages in N days)
+and ranks channels by message volume. Useful for server cleanup and understanding
+where your community is most active.
+
+Combines: GET /guilds/{id}/channels + GET /channels/{id}/messages for each channel.`,
+ Example: ` # Check channel health for a guild (default: 30 days)
+ discord-cli channel-health --guild 123456789012345678
+
+ # Check with custom staleness threshold
+ discord-cli channel-health --guild 123456789012345678 --days 14
+
+ # JSON output for agent consumption
+ discord-cli channel-health --guild 123456789012345678 --json`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ if guildID == "" {
+ return usageErr(fmt.Errorf("--guild is required"))
+ }
+
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+ c.NoCache = true
+
+ fmt.Fprintf(os.Stderr, "Fetching channels for guild %s...\n", guildID)
+ channelsData, err := c.Get(fmt.Sprintf("/guilds/%s/channels", guildID), nil)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ var channels []map[string]any
+ if err := json.Unmarshal(channelsData, &channels); err != nil {
+ return fmt.Errorf("parsing channels: %w", err)
+ }
+
+ var textChannels []map[string]any
+ for _, ch := range channels {
+ chType, _ := ch["type"].(float64)
+ if chType == 0 || chType == 5 {
+ textChannels = append(textChannels, ch)
+ }
+ }
+
+ fmt.Fprintf(os.Stderr, "Found %d text channels. Sampling messages...\n", len(textChannels))
+ cutoff := time.Now().AddDate(0, 0, -days)
+
+ var reports []channelHealthReport
+
+ for _, ch := range textChannels {
+ chID := fmt.Sprintf("%v", ch["id"])
+ chName, _ := ch["name"].(string)
+
+ params := map[string]string{"limit": "5"}
+ msgData, err := c.Get(fmt.Sprintf("/channels/%s/messages", chID), params)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, " #%s: skipped (access denied or error)\n", chName)
+ continue
+ }
+
+ var messages []map[string]any
+ if err := json.Unmarshal(msgData, &messages); err != nil {
+ continue
+ }
+
+ report := channelHealthReport{ID: chID, Name: chName}
+
+ if len(messages) == 0 {
+ report.Stale = true
+ report.DaysSilent = days
+ } else {
+ if ts, ok := messages[0]["timestamp"].(string); ok {
+ if t, err := time.Parse(time.RFC3339, ts); err == nil {
+ report.LastMessage = ts
+ report.DaysSilent = int(time.Since(t).Hours() / 24)
+ report.Stale = t.Before(cutoff)
+ }
+ }
+ for _, msg := range messages {
+ if ts, ok := msg["timestamp"].(string); ok {
+ if t, err := time.Parse(time.RFC3339, ts); err == nil && t.After(cutoff) {
+ report.RecentCount++
+ }
+ }
+ }
+ }
+ reports = append(reports, report)
+ }
+
+ sort.Slice(reports, func(i, j int) bool {
+ if reports[i].Stale != reports[j].Stale {
+ return !reports[i].Stale
+ }
+ return reports[i].RecentCount > reports[j].RecentCount
+ })
+
+ staleCount := 0
+ for _, r := range reports {
+ if r.Stale {
+ staleCount++
+ }
+ }
+
+ if flags.asJSON {
+ result := map[string]any{
+ "guild_id": guildID,
+ "threshold_days": days,
+ "total_channels": len(reports),
+ "stale_channels": staleCount,
+ "active_channels": len(reports) - staleCount,
+ "channels": reports,
+ }
+ enc := json.NewEncoder(os.Stdout)
+ enc.SetIndent("", " ")
+ return enc.Encode(result)
+ }
+
+ fmt.Printf("\nChannel Health Report (guild: %s, threshold: %d days)\n", guildID, days)
+ fmt.Printf("%-30s %8s %12s %s\n", "CHANNEL", "RECENT", "DAYS SILENT", "STATUS")
+ fmt.Printf("%-30s %8s %12s %s\n", "-------", "------", "-----------", "------")
+ for _, r := range reports {
+ status := green("active")
+ if r.Stale {
+ status = red("STALE")
+ }
+ fmt.Printf("%-30s %8d %12d %s\n", "#"+r.Name, r.RecentCount, r.DaysSilent, status)
+ }
+ fmt.Printf("\nTotal: %d channels (%d active, %d stale)\n",
+ len(reports), len(reports)-staleCount, staleCount)
+
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID (required)")
+ cmd.Flags().IntVar(&days, "days", 30, "Number of days to consider a channel stale")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_member_report.go b/discord-cli/internal/cli/workflow_member_report.go
new file mode 100644
index 00000000..f6ee2c3d
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_member_report.go
@@ -0,0 +1,134 @@
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "sort"
+
+ "github.com/spf13/cobra"
+)
+
+func newMemberReportCmd(flags *rootFlags) *cobra.Command {
+ var guildID string
+ var maxMembers int
+
+ cmd := &cobra.Command{
+ Use: "member-report",
+ Short: "Analyze member roles, join dates, and activity across a guild",
+ Long: `Fetches guild members and produces a report showing role distribution,
+join date timeline, and member counts per role. Useful for understanding
+your community composition and identifying role bloat.
+
+Combines: GET /guilds/{id}/members + GET /guilds/{id}/roles.`,
+ Example: ` # Member report for a guild
+ discord-cli member-report --guild 123456789012345678
+
+ # Fetch more members (default: 100)
+ discord-cli member-report --guild 123456789012345678 --max 500
+
+ # JSON output
+ discord-cli member-report --guild 123456789012345678 --json`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ if guildID == "" {
+ return usageErr(fmt.Errorf("--guild is required"))
+ }
+
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+ c.NoCache = true
+
+ // Fetch roles
+ fmt.Fprintf(os.Stderr, "Fetching roles...\n")
+ rolesData, err := c.Get(fmt.Sprintf("/guilds/%s/roles", guildID), nil)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+ var roles []map[string]any
+ json.Unmarshal(rolesData, &roles)
+
+ roleNames := map[string]string{}
+ for _, r := range roles {
+ id := fmt.Sprintf("%v", r["id"])
+ name, _ := r["name"].(string)
+ roleNames[id] = name
+ }
+
+ // Fetch members
+ fmt.Fprintf(os.Stderr, "Fetching members (max %d)...\n", maxMembers)
+ params := map[string]string{"limit": fmt.Sprintf("%d", maxMembers)}
+ membersData, err := c.Get(fmt.Sprintf("/guilds/%s/members", guildID), params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ var members []map[string]any
+ if err := json.Unmarshal(membersData, &members); err != nil {
+ return fmt.Errorf("parsing members: %w", err)
+ }
+
+ // Count members per role
+ roleCounts := map[string]int{}
+ botCount := 0
+ for _, m := range members {
+ user, _ := m["user"].(map[string]any)
+ if user != nil {
+ if bot, ok := user["bot"].(bool); ok && bot {
+ botCount++
+ }
+ }
+ if roleIDs, ok := m["roles"].([]any); ok {
+ for _, rid := range roleIDs {
+ roleID := fmt.Sprintf("%v", rid)
+ name := roleNames[roleID]
+ if name == "" {
+ name = roleID
+ }
+ roleCounts[name]++
+ }
+ }
+ }
+
+ if flags.asJSON {
+ result := map[string]any{
+ "guild_id": guildID,
+ "total_members": len(members),
+ "bot_count": botCount,
+ "human_count": len(members) - botCount,
+ "total_roles": len(roles),
+ "role_counts": roleCounts,
+ }
+ enc := json.NewEncoder(os.Stdout)
+ enc.SetIndent("", " ")
+ return enc.Encode(result)
+ }
+
+ fmt.Printf("\nMember Report (guild: %s)\n\n", guildID)
+ fmt.Printf("Total Members: %d (%d humans, %d bots)\n", len(members), len(members)-botCount, botCount)
+ fmt.Printf("Total Roles: %d\n\n", len(roles))
+
+ fmt.Println("Members per Role:")
+ type kv struct {
+ Role string
+ Count int
+ }
+ var sorted []kv
+ for k, v := range roleCounts {
+ sorted = append(sorted, kv{k, v})
+ }
+ sort.Slice(sorted, func(i, j int) bool { return sorted[i].Count > sorted[j].Count })
+ for _, item := range sorted {
+ fmt.Printf(" %-30s %d members\n", item.Role, item.Count)
+ }
+
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID (required)")
+ cmd.Flags().IntVar(&maxMembers, "max", 100, "Maximum members to fetch")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_message_stats.go b/discord-cli/internal/cli/workflow_message_stats.go
new file mode 100644
index 00000000..d1f6366c
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_message_stats.go
@@ -0,0 +1,173 @@
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "sort"
+ "time"
+
+ "github.com/spf13/cobra"
+)
+
+func newMessageStatsCmd(flags *rootFlags) *cobra.Command {
+ var guildID string
+ var channelID string
+ var limit int
+
+ cmd := &cobra.Command{
+ Use: "message-stats",
+ Short: "Show message volume and top contributors for a channel or guild",
+ Long: `Fetches recent messages and calculates statistics including message
+count per author, average message length, and activity by hour of day.
+Can analyze a single channel or sample across all text channels in a guild.
+
+Combines: GET /guilds/{id}/channels + GET /channels/{id}/messages with analysis.`,
+ Example: ` # Stats for a specific channel
+ discord-cli message-stats --channel 123456789012345678 --limit 100
+
+ # Stats across all channels in a guild (samples 20 messages per channel)
+ discord-cli message-stats --guild 123456789012345678
+
+ # JSON output
+ discord-cli message-stats --channel 123456789012345678 --json`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ if guildID == "" && channelID == "" {
+ return usageErr(fmt.Errorf("--guild or --channel is required"))
+ }
+
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+ c.NoCache = true
+
+ var allMessages []map[string]any
+
+ if channelID != "" {
+ // Single channel mode
+ fmt.Fprintf(os.Stderr, "Fetching messages from channel %s...\n", channelID)
+ params := map[string]string{"limit": fmt.Sprintf("%d", limit)}
+ data, err := c.Get(fmt.Sprintf("/channels/%s/messages", channelID), params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+ json.Unmarshal(data, &allMessages)
+ } else {
+ // Guild mode - sample all channels
+ fmt.Fprintf(os.Stderr, "Fetching channels for guild %s...\n", guildID)
+ chData, err := c.Get(fmt.Sprintf("/guilds/%s/channels", guildID), nil)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+ var channels []map[string]any
+ json.Unmarshal(chData, &channels)
+
+ for _, ch := range channels {
+ chType, _ := ch["type"].(float64)
+ if chType != 0 && chType != 5 {
+ continue
+ }
+ chID := fmt.Sprintf("%v", ch["id"])
+ params := map[string]string{"limit": "20"}
+ data, err := c.Get(fmt.Sprintf("/channels/%s/messages", chID), params)
+ if err != nil {
+ continue
+ }
+ var msgs []map[string]any
+ json.Unmarshal(data, &msgs)
+ allMessages = append(allMessages, msgs...)
+ }
+ }
+
+ // Analyze
+ authorCounts := map[string]int{}
+ hourCounts := map[int]int{}
+ totalLen := 0
+
+ for _, msg := range allMessages {
+ if author, ok := msg["author"].(map[string]any); ok {
+ name, _ := author["username"].(string)
+ if name == "" {
+ name = fmt.Sprintf("%v", author["id"])
+ }
+ authorCounts[name]++
+ }
+ if content, ok := msg["content"].(string); ok {
+ totalLen += len(content)
+ }
+ if ts, ok := msg["timestamp"].(string); ok {
+ if t, err := time.Parse(time.RFC3339, ts); err == nil {
+ hourCounts[t.Hour()]++
+ }
+ }
+ }
+
+ avgLen := 0
+ if len(allMessages) > 0 {
+ avgLen = totalLen / len(allMessages)
+ }
+
+ if flags.asJSON {
+ result := map[string]any{
+ "total_messages": len(allMessages),
+ "avg_length": avgLen,
+ "by_author": authorCounts,
+ "by_hour": hourCounts,
+ }
+ enc := json.NewEncoder(os.Stdout)
+ enc.SetIndent("", " ")
+ return enc.Encode(result)
+ }
+
+ fmt.Printf("\nMessage Stats (%d messages)\n\n", len(allMessages))
+ fmt.Printf("Average message length: %d chars\n\n", avgLen)
+
+ fmt.Println("Top Contributors:")
+ type kv struct {
+ Name string
+ Count int
+ }
+ var sorted []kv
+ for k, v := range authorCounts {
+ sorted = append(sorted, kv{k, v})
+ }
+ sort.Slice(sorted, func(i, j int) bool { return sorted[i].Count > sorted[j].Count })
+ topN := 15
+ if len(sorted) < topN {
+ topN = len(sorted)
+ }
+ for _, item := range sorted[:topN] {
+ fmt.Printf(" %-25s %d messages\n", item.Name, item.Count)
+ }
+
+ fmt.Println("\nActivity by Hour (UTC):")
+ for h := 0; h < 24; h++ {
+ bar := ""
+ count := hourCounts[h]
+ maxCount := 1
+ for _, v := range hourCounts {
+ if v > maxCount {
+ maxCount = v
+ }
+ }
+ barLen := 0
+ if maxCount > 0 {
+ barLen = count * 30 / maxCount
+ }
+ for i := 0; i < barLen; i++ {
+ bar += "#"
+ }
+ fmt.Printf(" %02d:00 %3d %s\n", h, count, bar)
+ }
+
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID")
+ cmd.Flags().StringVar(&channelID, "channel", "", "Channel ID (for single-channel mode)")
+ cmd.Flags().IntVar(&limit, "limit", 50, "Maximum messages to fetch per channel")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_prune_preview.go b/discord-cli/internal/cli/workflow_prune_preview.go
new file mode 100644
index 00000000..cadee1da
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_prune_preview.go
@@ -0,0 +1,90 @@
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+
+ "github.com/spf13/cobra"
+)
+
+func newPrunePreviewCmd(flags *rootFlags) *cobra.Command {
+ var guildID string
+ var days int
+ var roles string
+
+ cmd := &cobra.Command{
+ Use: "prune-preview",
+ Short: "Preview how many members would be pruned without executing",
+ Long: `Checks how many members would be removed by a prune operation
+without actually executing it. Shows the count of members who have not
+been active in N days. Always a dry-run - never modifies the guild.
+
+Uses: GET /guilds/{id}/prune?days=N (preview only, never POST).`,
+ Example: ` # Preview 7-day prune
+ discord-cli prune-preview --guild 123456789012345678 --days 7
+
+ # Preview 30-day prune with role filter
+ discord-cli prune-preview --guild 123456789012345678 --days 30 --roles 111222333444555666
+
+ # JSON output
+ discord-cli prune-preview --guild 123456789012345678 --days 7 --json`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ if guildID == "" {
+ return usageErr(fmt.Errorf("--guild is required"))
+ }
+
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ fmt.Fprintf(os.Stderr, "Checking prune count for guild %s (inactive %d+ days)...\n", guildID, days)
+
+ params := map[string]string{"days": fmt.Sprintf("%d", days)}
+ if roles != "" {
+ params["include_roles"] = roles
+ }
+
+ data, err := c.Get(fmt.Sprintf("/guilds/%s/prune", guildID), params)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ var result struct {
+ Pruned int `json:"pruned"`
+ }
+ if err := json.Unmarshal(data, &result); err != nil {
+ return fmt.Errorf("parsing response: %w", err)
+ }
+
+ if flags.asJSON {
+ output := map[string]any{
+ "guild_id": guildID,
+ "days_inactive": days,
+ "would_prune": result.Pruned,
+ "preview_only": true,
+ }
+ enc := json.NewEncoder(os.Stdout)
+ enc.SetIndent("", " ")
+ return enc.Encode(output)
+ }
+
+ if result.Pruned == 0 {
+ fmt.Printf("No members would be pruned (all active within %d days)\n", days)
+ } else {
+ fmt.Printf("%s %d members would be pruned (inactive %d+ days)\n",
+ yellow("WARNING:"), result.Pruned, days)
+ fmt.Println("This is a preview only. No members were removed.")
+ }
+
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID (required)")
+ cmd.Flags().IntVar(&days, "days", 7, "Number of days of inactivity")
+ cmd.Flags().StringVar(&roles, "roles", "", "Comma-separated role IDs to include in prune count")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_server_snapshot.go b/discord-cli/internal/cli/workflow_server_snapshot.go
new file mode 100644
index 00000000..91a2fe06
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_server_snapshot.go
@@ -0,0 +1,110 @@
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "time"
+
+ "github.com/spf13/cobra"
+)
+
+func newServerSnapshotCmd(flags *rootFlags) *cobra.Command {
+ var guildID string
+ var outputFile string
+
+ cmd := &cobra.Command{
+ Use: "server-snapshot",
+ Short: "Backup guild configuration (roles, channels, emojis) to JSON",
+ Long: `Creates a complete snapshot of a guild's configuration including roles,
+channels, emojis, and guild settings. Exports to a JSON file that can be
+used for backup, migration planning, or configuration diffing.
+
+Combines: GET /guilds/{id} + GET /guilds/{id}/channels + GET /guilds/{id}/roles + GET /guilds/{id}/emojis.`,
+ Example: ` # Snapshot to file
+ discord-cli server-snapshot --guild 123456789012345678 -o backup.json
+
+ # Snapshot to stdout as JSON
+ discord-cli server-snapshot --guild 123456789012345678 --json
+
+ # Snapshot with dry-run to see what would be fetched
+ discord-cli server-snapshot --guild 123456789012345678 --dry-run`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ if guildID == "" {
+ return usageErr(fmt.Errorf("--guild is required"))
+ }
+
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+ c.NoCache = true
+
+ snapshot := map[string]any{
+ "snapshot_at": time.Now().UTC().Format(time.RFC3339),
+ "guild_id": guildID,
+ }
+
+ // Fetch guild info
+ fmt.Fprintf(os.Stderr, "Fetching guild info...\n")
+ guildData, err := c.Get(fmt.Sprintf("/guilds/%s", guildID), map[string]string{"with_counts": "true"})
+ if err != nil {
+ return classifyAPIError(err)
+ }
+ var guild map[string]any
+ json.Unmarshal(guildData, &guild)
+ snapshot["guild"] = guild
+
+ // Fetch channels
+ fmt.Fprintf(os.Stderr, "Fetching channels...\n")
+ channelsData, err := c.Get(fmt.Sprintf("/guilds/%s/channels", guildID), nil)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, " warning: channels: %v\n", err)
+ } else {
+ var channels []any
+ json.Unmarshal(channelsData, &channels)
+ snapshot["channels"] = channels
+ }
+
+ // Fetch roles
+ fmt.Fprintf(os.Stderr, "Fetching roles...\n")
+ rolesData, err := c.Get(fmt.Sprintf("/guilds/%s/roles", guildID), nil)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, " warning: roles: %v\n", err)
+ } else {
+ var roles []any
+ json.Unmarshal(rolesData, &roles)
+ snapshot["roles"] = roles
+ }
+
+ // Fetch emojis
+ fmt.Fprintf(os.Stderr, "Fetching emojis...\n")
+ emojisData, err := c.Get(fmt.Sprintf("/guilds/%s/emojis", guildID), nil)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, " warning: emojis: %v\n", err)
+ } else {
+ var emojis []any
+ json.Unmarshal(emojisData, &emojis)
+ snapshot["emojis"] = emojis
+ }
+
+ result, _ := json.MarshalIndent(snapshot, "", " ")
+
+ if outputFile != "" {
+ if err := os.WriteFile(outputFile, result, 0o644); err != nil {
+ return fmt.Errorf("writing file: %w", err)
+ }
+ fmt.Fprintf(os.Stderr, "Snapshot saved to %s\n", outputFile)
+ return nil
+ }
+
+ fmt.Fprintln(os.Stdout, string(result))
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID (required)")
+ cmd.Flags().StringVarP(&outputFile, "output", "o", "", "Output file path (default: stdout)")
+
+ return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_webhook_send.go b/discord-cli/internal/cli/workflow_webhook_send.go
new file mode 100644
index 00000000..e619b120
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_webhook_send.go
@@ -0,0 +1,68 @@
+package cli
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/spf13/cobra"
+)
+
+func newWebhookTestCmd(flags *rootFlags) *cobra.Command {
+ var webhookID string
+ var webhookToken string
+ var message string
+
+ cmd := &cobra.Command{
+ Use: "webhook-test",
+ Short: "Send a test payload to a Discord webhook",
+ Long: `Sends a test message to a webhook URL to verify it's working.
+Supports plain text and rich embeds. Useful for validating webhook
+integrations before deploying to production.
+
+Uses: POST /webhooks/{id}/{token}.`,
+ Example: ` # Send a simple test message
+ discord-cli webhook-test --id 123456789012345678 --token abcdef123456 --message "Hello from CLI!"
+
+ # Send a rich embed via stdin
+ echo '{"content":"Deploy alert","embeds":[{"title":"Build #42","description":"All tests passed","color":3066993}]}' | discord-cli webhook-test --id 123456789012345678 --token abcdef123456 --stdin
+
+ # Dry run to preview the request
+ discord-cli webhook-test --id 123456789012345678 --token abcdef123456 --message "test" --dry-run`,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ if webhookID == "" || webhookToken == "" {
+ return usageErr(fmt.Errorf("--id and --token are required"))
+ }
+
+ c, err := flags.newClient()
+ if err != nil {
+ return err
+ }
+
+ body := map[string]any{"content": message}
+ if message == "" {
+ body["content"] = fmt.Sprintf("Test message from discord-cli (webhook %s)", webhookID)
+ }
+
+ fmt.Fprintf(os.Stderr, "Sending test payload to webhook %s...\n", webhookID)
+
+ path := fmt.Sprintf("/webhooks/%s/%s", webhookID, webhookToken)
+ data, err := c.Post(path, body)
+ if err != nil {
+ return classifyAPIError(err)
+ }
+
+ if flags.asJSON {
+ return printOutput(os.Stdout, data, true)
+ }
+
+ fmt.Fprintln(os.Stdout, green("Webhook test successful!"))
+ return nil
+ },
+ }
+
+ cmd.Flags().StringVar(&webhookID, "id", "", "Webhook ID (required)")
+ cmd.Flags().StringVar(&webhookToken, "token", "", "Webhook token (required)")
+ cmd.Flags().StringVar(&message, "message", "", "Test message content")
+
+ return cmd
+}
diff --git a/discord-cli/internal/client/client.go b/discord-cli/internal/client/client.go
new file mode 100644
index 00000000..a8a91cba
--- /dev/null
+++ b/discord-cli/internal/client/client.go
@@ -0,0 +1,346 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package client
+
+import (
+ "crypto/sha256"
+ "encoding/hex"
+ "encoding/json"
+ "fmt"
+ "io"
+ "math"
+ "net/http"
+ "net/url"
+ "os"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/USER/discord-cli/internal/config"
+)
+
+type Client struct {
+ BaseURL string
+ Config *config.Config
+ HTTPClient *http.Client
+ DryRun bool
+ NoCache bool
+ cacheDir string
+}
+
+// APIError carries HTTP status information for structured exit codes.
+type APIError struct {
+ Method string
+ Path string
+ StatusCode int
+ Body string
+}
+
+func (e *APIError) Error() string {
+ return fmt.Sprintf("%s %s returned HTTP %d: %s", e.Method, e.Path, e.StatusCode, e.Body)
+}
+
+func New(cfg *config.Config, timeout time.Duration) *Client {
+ homeDir, _ := os.UserHomeDir()
+ cacheDir := filepath.Join(homeDir, ".cache", "discord-cli")
+ return &Client{
+ BaseURL: strings.TrimRight(cfg.BaseURL, "/"),
+ Config: cfg,
+ HTTPClient: &http.Client{Timeout: timeout},
+ cacheDir: cacheDir,
+ }
+}
+
+func (c *Client) Get(path string, params map[string]string) (json.RawMessage, error) {
+ // Check cache for GET requests
+ if !c.NoCache && c.cacheDir != "" {
+ if cached, ok := c.readCache(path, params); ok {
+ return cached, nil
+ }
+ }
+ result, err := c.do("GET", path, params, nil)
+ if err == nil && !c.NoCache && c.cacheDir != "" {
+ c.writeCache(path, params, result)
+ }
+ return result, err
+}
+
+func (c *Client) cacheKey(path string, params map[string]string) string {
+ key := path
+ for k, v := range params {
+ key += k + "=" + v
+ }
+ h := sha256.Sum256([]byte(key))
+ return hex.EncodeToString(h[:8])
+}
+
+func (c *Client) readCache(path string, params map[string]string) (json.RawMessage, bool) {
+ cacheFile := filepath.Join(c.cacheDir, c.cacheKey(path, params)+".json")
+ info, err := os.Stat(cacheFile)
+ if err != nil || time.Since(info.ModTime()) > 5*time.Minute {
+ return nil, false
+ }
+ data, err := os.ReadFile(cacheFile)
+ if err != nil {
+ return nil, false
+ }
+ return json.RawMessage(data), true
+}
+
+func (c *Client) writeCache(path string, params map[string]string, data json.RawMessage) {
+ os.MkdirAll(c.cacheDir, 0o755)
+ cacheFile := filepath.Join(c.cacheDir, c.cacheKey(path, params)+".json")
+ os.WriteFile(cacheFile, []byte(data), 0o644)
+}
+
+func (c *Client) Post(path string, body any) (json.RawMessage, error) {
+ return c.do("POST", path, nil, body)
+}
+
+func (c *Client) Delete(path string) (json.RawMessage, error) {
+ return c.do("DELETE", path, nil, nil)
+}
+
+func (c *Client) Put(path string, body any) (json.RawMessage, error) {
+ return c.do("PUT", path, nil, body)
+}
+
+func (c *Client) Patch(path string, body any) (json.RawMessage, error) {
+ return c.do("PATCH", path, nil, body)
+}
+
+func (c *Client) do(method, path string, params map[string]string, body any) (json.RawMessage, error) {
+ url := c.BaseURL + path
+
+ var bodyBytes []byte
+ if body != nil {
+ b, err := json.Marshal(body)
+ if err != nil {
+ return nil, fmt.Errorf("marshaling body: %w", err)
+ }
+ bodyBytes = b
+ }
+
+ // Build the request for dry-run display or actual execution
+ if c.DryRun {
+ return c.dryRun(method, url, params, bodyBytes)
+ }
+
+ const maxRetries = 3
+ var lastErr error
+
+ for attempt := 0; attempt <= maxRetries; attempt++ {
+ var bodyReader io.Reader
+ if bodyBytes != nil {
+ bodyReader = strings.NewReader(string(bodyBytes))
+ }
+
+ req, err := http.NewRequest(method, url, bodyReader)
+ if err != nil {
+ return nil, fmt.Errorf("creating request: %w", err)
+ }
+
+ authHeader, err := c.authHeader()
+ if err != nil {
+ return nil, err
+ }
+ if authHeader != "" {
+ req.Header.Set("Authorization", authHeader)
+ }
+ if bodyBytes != nil {
+ req.Header.Set("Content-Type", "application/json")
+ }
+ req.Header.Set("User-Agent", "discord-cli/10")
+
+ if params != nil {
+ q := req.URL.Query()
+ for k, v := range params {
+ if v != "" {
+ q.Set(k, v)
+ }
+ }
+ req.URL.RawQuery = q.Encode()
+ }
+
+ resp, err := c.HTTPClient.Do(req)
+ if err != nil {
+ lastErr = fmt.Errorf("%s %s: %w", method, path, err)
+ continue
+ }
+
+ respBody, err := io.ReadAll(resp.Body)
+ resp.Body.Close()
+ if err != nil {
+ return nil, fmt.Errorf("reading response: %w", err)
+ }
+
+ // Success
+ if resp.StatusCode < 400 {
+ return json.RawMessage(respBody), nil
+ }
+
+ apiErr := &APIError{
+ Method: method,
+ Path: path,
+ StatusCode: resp.StatusCode,
+ Body: truncateBody(respBody),
+ }
+
+ // Rate limited - wait and retry
+ if resp.StatusCode == 429 && attempt < maxRetries {
+ wait := retryAfter(resp)
+ fmt.Fprintf(os.Stderr, "rate limited, waiting %s (attempt %d/%d)\n", wait, attempt+1, maxRetries)
+ time.Sleep(wait)
+ lastErr = apiErr
+ continue
+ }
+
+ // Server error - retry with backoff
+ if resp.StatusCode >= 500 && attempt < maxRetries {
+ wait := time.Duration(math.Pow(2, float64(attempt))) * time.Second
+ fmt.Fprintf(os.Stderr, "server error %d, retrying in %s (attempt %d/%d)\n", resp.StatusCode, wait, attempt+1, maxRetries)
+ time.Sleep(wait)
+ lastErr = apiErr
+ continue
+ }
+
+ // Client error or retries exhausted - return the error
+ return nil, apiErr
+ }
+
+ return nil, lastErr
+}
+
+func (c *Client) dryRun(method, url string, params map[string]string, body []byte) (json.RawMessage, error) {
+ fmt.Fprintf(os.Stderr, "%s %s\n", method, url)
+ if params != nil {
+ for k, v := range params {
+ if v != "" {
+ fmt.Fprintf(os.Stderr, " ?%s=%s\n", k, v)
+ }
+ }
+ }
+ authHeader, err := c.authHeader()
+ if err != nil {
+ return nil, err
+ }
+ if authHeader != "" {
+ // Mask token for safety
+ auth := authHeader
+ if len(auth) > 20 {
+ auth = auth[:15] + "..."
+ }
+ fmt.Fprintf(os.Stderr, " Authorization: %s\n", auth)
+ }
+ if body != nil {
+ var pretty json.RawMessage
+ if json.Unmarshal(body, &pretty) == nil {
+ enc := json.NewEncoder(os.Stderr)
+ enc.SetIndent(" ", " ")
+ fmt.Fprintf(os.Stderr, " Body:\n")
+ enc.Encode(pretty)
+ }
+ }
+ fmt.Fprintf(os.Stderr, "\n(dry run - no request sent)\n")
+ return json.RawMessage(`{"dry_run": true}`), nil
+}
+
+func (c *Client) authHeader() (string, error) {
+ if c.Config == nil {
+ return "", nil
+ }
+ if c.Config.AccessToken != "" && !c.Config.TokenExpiry.IsZero() && time.Now().After(c.Config.TokenExpiry) && c.Config.RefreshToken != "" {
+ if err := c.refreshAccessToken(); err != nil {
+ return "", err
+ }
+ }
+ return c.Config.AuthHeader(), nil
+}
+
+func (c *Client) refreshAccessToken() error {
+ if c.Config == nil {
+ return nil
+ }
+ if c.Config.RefreshToken == "" {
+ return nil
+ }
+
+ tokenURL := "https://discord.com/api/oauth2/token"
+ if tokenURL == "" {
+ return nil
+ }
+
+ params := url.Values{
+ "grant_type": {"refresh_token"},
+ "refresh_token": {c.Config.RefreshToken},
+ "client_id": {c.Config.ClientID},
+ }
+ if c.Config.ClientSecret != "" {
+ params.Set("client_secret", c.Config.ClientSecret)
+ }
+
+ resp, err := c.HTTPClient.PostForm(tokenURL, params)
+ if err != nil {
+ return fmt.Errorf("refreshing access token: %w", err)
+ }
+ defer resp.Body.Close()
+
+ if resp.StatusCode >= 400 {
+ body, _ := io.ReadAll(resp.Body)
+ return fmt.Errorf("refreshing access token: HTTP %d: %s", resp.StatusCode, truncateBody(body))
+ }
+
+ var tokenResp struct {
+ AccessToken string `json:"access_token"`
+ RefreshToken string `json:"refresh_token"`
+ ExpiresIn int `json:"expires_in"`
+ }
+ if err := json.NewDecoder(resp.Body).Decode(&tokenResp); err != nil {
+ return fmt.Errorf("parsing refresh response: %w", err)
+ }
+ if tokenResp.AccessToken == "" {
+ return fmt.Errorf("refreshing access token: no access token in response")
+ }
+
+ refreshToken := c.Config.RefreshToken
+ if tokenResp.RefreshToken != "" {
+ refreshToken = tokenResp.RefreshToken
+ }
+
+ expiry := time.Time{}
+ if tokenResp.ExpiresIn > 0 {
+ expiry = time.Now().Add(time.Duration(tokenResp.ExpiresIn) * time.Second)
+ }
+
+ if err := c.Config.SaveTokens(c.Config.ClientID, c.Config.ClientSecret, tokenResp.AccessToken, refreshToken, expiry); err != nil {
+ return fmt.Errorf("saving refreshed token: %w", err)
+ }
+
+ return nil
+}
+
+func retryAfter(resp *http.Response) time.Duration {
+ header := resp.Header.Get("Retry-After")
+ if header == "" {
+ return 5 * time.Second
+ }
+ if seconds, err := strconv.Atoi(header); err == nil {
+ return time.Duration(seconds) * time.Second
+ }
+ if t, err := http.ParseTime(header); err == nil {
+ wait := time.Until(t)
+ if wait > 0 {
+ return wait
+ }
+ }
+ return 5 * time.Second
+}
+
+func truncateBody(b []byte) string {
+ s := string(b)
+ if len(s) > 200 {
+ return s[:200] + "..."
+ }
+ return s
+}
diff --git a/discord-cli/internal/config/config.go b/discord-cli/internal/config/config.go
new file mode 100644
index 00000000..d3c544a8
--- /dev/null
+++ b/discord-cli/internal/config/config.go
@@ -0,0 +1,104 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package config
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+
+ "github.com/pelletier/go-toml/v2"
+)
+
+type Config struct {
+ BaseURL string `toml:"base_url"`
+ AuthHeaderVal string `toml:"auth_header"`
+ AuthSource string `toml:"-"`
+ AccessToken string `toml:"access_token"`
+ RefreshToken string `toml:"refresh_token"`
+ TokenExpiry time.Time `toml:"token_expiry"`
+ ClientID string `toml:"client_id"`
+ ClientSecret string `toml:"client_secret"`
+ Path string `toml:"-"`
+ DiscordToken string `toml:"token"`
+}
+
+func Load(configPath string) (*Config, error) {
+ cfg := &Config{
+ BaseURL: "https://discord.com/api/v10",
+ }
+
+ // Resolve config path
+ path := configPath
+ if path == "" {
+ path = os.Getenv("DISCORD_CONFIG")
+ }
+ if path == "" {
+ home, _ := os.UserHomeDir()
+ path = filepath.Join(home, ".config", "discord-cli", "config.toml")
+ }
+ cfg.Path = path
+
+ // Try to load config file
+ data, err := os.ReadFile(path)
+ if err == nil {
+ if err := toml.Unmarshal(data, cfg); err != nil {
+ return nil, fmt.Errorf("parsing config %s: %w", path, err)
+ }
+ }
+
+ // Env var overrides
+ if v := os.Getenv("DISCORD_TOKEN"); v != "" {
+ cfg.DiscordToken = v
+ cfg.AuthSource = "env:DISCORD_TOKEN"
+ }
+
+ return cfg, nil
+}
+
+func (c *Config) AuthHeader() string {
+ if c.AuthHeaderVal != "" {
+ return c.AuthHeaderVal
+ }
+ if c.AccessToken != "" {
+ c.AuthSource = "oauth2"
+ return "Bearer " + c.AccessToken
+ }
+ if c.DiscordToken != "" {
+ return "Bearer " + c.DiscordToken
+ }
+ return ""
+}
+
+func (c *Config) SaveTokens(clientID, clientSecret, accessToken, refreshToken string, expiry time.Time) error {
+ c.ClientID = clientID
+ c.ClientSecret = clientSecret
+ c.AccessToken = accessToken
+ c.RefreshToken = refreshToken
+ c.TokenExpiry = expiry
+ return c.save()
+}
+
+func (c *Config) ClearTokens() error {
+ c.AccessToken = ""
+ c.RefreshToken = ""
+ c.TokenExpiry = time.Time{}
+ return c.save()
+}
+
+func (c *Config) save() error {
+ dir := filepath.Dir(c.Path)
+ if err := os.MkdirAll(dir, 0o700); err != nil {
+ return fmt.Errorf("creating config dir: %w", err)
+ }
+ data, err := toml.Marshal(c)
+ if err != nil {
+ return fmt.Errorf("marshaling config: %w", err)
+ }
+ return os.WriteFile(c.Path, data, 0o600)
+}
+
+// Ensure strings import is used
+var _ = strings.ReplaceAll
diff --git a/discord-cli/internal/store/store.go b/discord-cli/internal/store/store.go
new file mode 100644
index 00000000..6d24278f
--- /dev/null
+++ b/discord-cli/internal/store/store.go
@@ -0,0 +1,277 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+// Package store provides local SQLite persistence for discord-cli.
+// Uses modernc.org/sqlite (pure Go, no CGO) for zero-dependency cross-compilation.
+// FTS5 full-text search indexes are created for searchable content.
+package store
+
+import (
+ "database/sql"
+ "encoding/json"
+ "fmt"
+ "os"
+ "path/filepath"
+ "time"
+
+ _ "modernc.org/sqlite"
+)
+
+type Store struct {
+ db *sql.DB
+ path string
+}
+
+func Open(dbPath string) (*Store, error) {
+ if err := os.MkdirAll(filepath.Dir(dbPath), 0o755); err != nil {
+ return nil, fmt.Errorf("creating db directory: %w", err)
+ }
+
+ db, err := sql.Open("sqlite", dbPath+"?_journal_mode=WAL&_busy_timeout=5000&_foreign_keys=ON")
+ if err != nil {
+ return nil, fmt.Errorf("opening database: %w", err)
+ }
+
+ db.SetMaxOpenConns(1)
+
+ s := &Store{db: db, path: dbPath}
+ if err := s.migrate(); err != nil {
+ db.Close()
+ return nil, fmt.Errorf("running migrations: %w", err)
+ }
+
+ return s, nil
+}
+
+func (s *Store) Close() error {
+ return s.db.Close()
+}
+
+func (s *Store) migrate() error {
+ migrations := []string{
+ `CREATE TABLE IF NOT EXISTS resources (
+ id TEXT PRIMARY KEY,
+ resource_type TEXT NOT NULL,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ `CREATE INDEX IF NOT EXISTS idx_resources_type ON resources(resource_type)`,
+ `CREATE INDEX IF NOT EXISTS idx_resources_synced ON resources(synced_at)`,
+ `CREATE TABLE IF NOT EXISTS sync_state (
+ resource_type TEXT PRIMARY KEY,
+ last_cursor TEXT,
+ last_synced_at DATETIME,
+ total_count INTEGER DEFAULT 0
+ )`,
+ `CREATE VIRTUAL TABLE IF NOT EXISTS resources_fts USING fts5(
+ id, resource_type, content, tokenize='porter unicode61'
+ )`,
+ `CREATE TABLE IF NOT EXISTS audit-logs (
+ id TEXT PRIMARY KEY,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ `CREATE TABLE IF NOT EXISTS bans (
+ id TEXT PRIMARY KEY,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ `CREATE TABLE IF NOT EXISTS entitlements (
+ id TEXT PRIMARY KEY,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ `CREATE TABLE IF NOT EXISTS members (
+ id TEXT PRIMARY KEY,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ `CREATE TABLE IF NOT EXISTS messages (
+ id TEXT PRIMARY KEY,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ `CREATE TABLE IF NOT EXISTS polls (
+ id TEXT PRIMARY KEY,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ `CREATE TABLE IF NOT EXISTS scheduled-events (
+ id TEXT PRIMARY KEY,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ `CREATE TABLE IF NOT EXISTS thread-members (
+ id TEXT PRIMARY KEY,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ `CREATE TABLE IF NOT EXISTS threads (
+ id TEXT PRIMARY KEY,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ `CREATE TABLE IF NOT EXISTS users (
+ id TEXT PRIMARY KEY,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+ )`,
+ }
+
+ for _, m := range migrations {
+ if _, err := s.db.Exec(m); err != nil {
+ return fmt.Errorf("migration failed: %w", err)
+ }
+ }
+ return nil
+}
+
+func (s *Store) Upsert(resourceType, id string, data json.RawMessage) error {
+ tx, err := s.db.Begin()
+ if err != nil {
+ return err
+ }
+ defer tx.Rollback()
+
+ _, err = tx.Exec(
+ `INSERT INTO resources (id, resource_type, data, synced_at, updated_at)
+ VALUES (?, ?, ?, ?, ?)
+ ON CONFLICT(id) DO UPDATE SET data = excluded.data, synced_at = excluded.synced_at, updated_at = excluded.updated_at`,
+ id, resourceType, string(data), time.Now(), time.Now(),
+ )
+ if err != nil {
+ return err
+ }
+
+ _, err = tx.Exec(
+ `INSERT INTO resources_fts (id, resource_type, content)
+ VALUES (?, ?, ?)
+ ON CONFLICT DO NOTHING`,
+ id, resourceType, string(data),
+ )
+ if err != nil {
+ // FTS insert failure is non-fatal
+ fmt.Fprintf(os.Stderr, "warning: FTS index update failed: %v\n", err)
+ }
+
+ return tx.Commit()
+}
+
+func (s *Store) Get(resourceType, id string) (json.RawMessage, error) {
+ var data string
+ err := s.db.QueryRow(
+ `SELECT data FROM resources WHERE resource_type = ? AND id = ?`,
+ resourceType, id,
+ ).Scan(&data)
+ if err == sql.ErrNoRows {
+ return nil, nil
+ }
+ if err != nil {
+ return nil, err
+ }
+ return json.RawMessage(data), nil
+}
+
+func (s *Store) List(resourceType string, limit int) ([]json.RawMessage, error) {
+ if limit <= 0 {
+ limit = 200
+ }
+ rows, err := s.db.Query(
+ `SELECT data FROM resources WHERE resource_type = ? ORDER BY updated_at DESC LIMIT ?`,
+ resourceType, limit,
+ )
+ if err != nil {
+ return nil, err
+ }
+ defer rows.Close()
+
+ var results []json.RawMessage
+ for rows.Next() {
+ var data string
+ if err := rows.Scan(&data); err != nil {
+ return nil, err
+ }
+ results = append(results, json.RawMessage(data))
+ }
+ return results, rows.Err()
+}
+
+func (s *Store) Search(query string, limit int) ([]json.RawMessage, error) {
+ if limit <= 0 {
+ limit = 50
+ }
+ rows, err := s.db.Query(
+ `SELECT r.data FROM resources r
+ JOIN resources_fts f ON r.id = f.id
+ WHERE resources_fts MATCH ?
+ ORDER BY rank
+ LIMIT ?`,
+ query, limit,
+ )
+ if err != nil {
+ return nil, err
+ }
+ defer rows.Close()
+
+ var results []json.RawMessage
+ for rows.Next() {
+ var data string
+ if err := rows.Scan(&data); err != nil {
+ return nil, err
+ }
+ results = append(results, json.RawMessage(data))
+ }
+ return results, rows.Err()
+}
+
+func (s *Store) SaveSyncState(resourceType, cursor string, count int) error {
+ _, err := s.db.Exec(
+ `INSERT INTO sync_state (resource_type, last_cursor, last_synced_at, total_count)
+ VALUES (?, ?, ?, ?)
+ ON CONFLICT(resource_type) DO UPDATE SET last_cursor = excluded.last_cursor,
+ last_synced_at = excluded.last_synced_at, total_count = excluded.total_count`,
+ resourceType, cursor, time.Now(), count,
+ )
+ return err
+}
+
+func (s *Store) GetSyncState(resourceType string) (cursor string, lastSynced time.Time, count int, err error) {
+ err = s.db.QueryRow(
+ `SELECT last_cursor, last_synced_at, total_count FROM sync_state WHERE resource_type = ?`,
+ resourceType,
+ ).Scan(&cursor, &lastSynced, &count)
+ if err == sql.ErrNoRows {
+ return "", time.Time{}, 0, nil
+ }
+ return
+}
+
+func (s *Store) Count(resourceType string) (int, error) {
+ var count int
+ err := s.db.QueryRow(
+ `SELECT COUNT(*) FROM resources WHERE resource_type = ?`,
+ resourceType,
+ ).Scan(&count)
+ return count, err
+}
+
+func (s *Store) Status() (map[string]int, error) {
+ rows, err := s.db.Query(
+ `SELECT resource_type, COUNT(*) FROM resources GROUP BY resource_type ORDER BY resource_type`,
+ )
+ if err != nil {
+ return nil, err
+ }
+ defer rows.Close()
+
+ status := make(map[string]int)
+ for rows.Next() {
+ var rt string
+ var count int
+ if err := rows.Scan(&rt, &count); err != nil {
+ return nil, err
+ }
+ status[rt] = count
+ }
+ return status, rows.Err()
+}
diff --git a/discord-cli/internal/types/types.go b/discord-cli/internal/types/types.go
new file mode 100644
index 00000000..9e6a9a25
--- /dev/null
+++ b/discord-cli/internal/types/types.go
@@ -0,0 +1,3877 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package types
+
+type AccountResponse struct {
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type ActionRowComponentForMessageRequest struct {
+ Components string `json:"components"`
+ Id int `json:"id"`
+ Type int `json:"type"`
+}
+
+type ActionRowComponentForModalRequest struct {
+ Components string `json:"components"`
+ Id int `json:"id"`
+ Type int `json:"type"`
+}
+
+type ActionRowComponentResponse struct {
+ Components string `json:"components"`
+ Id int `json:"id"`
+ Type int `json:"type"`
+}
+
+type ActivitiesAttachmentResponse struct {
+ Attachment string `json:"attachment"`
+}
+
+type ApplicationCommandAttachmentOption struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandAttachmentOptionResponse struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandAutocompleteCallbackRequest struct {
+ Data string `json:"data"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandBooleanOption struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandBooleanOptionResponse struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandChannelOption struct {
+ ChannelTypes string `json:"channel_types"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandChannelOptionResponse struct {
+ ChannelTypes string `json:"channel_types"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandCreateRequest struct {
+ Contexts string `json:"contexts"`
+ DefaultMemberPermissions int `json:"default_member_permissions"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DmPermission bool `json:"dm_permission"`
+ Handler string `json:"handler"`
+ IntegrationTypes string `json:"integration_types"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Options string `json:"options"`
+ Type string `json:"type"`
+}
+
+type ApplicationCommandIntegerOption struct {
+ Autocomplete bool `json:"autocomplete"`
+ Choices string `json:"choices"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ MaxValue string `json:"max_value"`
+ MinValue string `json:"min_value"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandIntegerOptionResponse struct {
+ Autocomplete bool `json:"autocomplete"`
+ Choices string `json:"choices"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ MaxValue int `json:"max_value"`
+ MinValue int `json:"min_value"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandInteractionMetadataResponse struct {
+ AuthorizingIntegrationOwners string `json:"authorizing_integration_owners"`
+ Id string `json:"id"`
+ OriginalResponseMessageId string `json:"original_response_message_id"`
+ TargetMessageId string `json:"target_message_id"`
+ TargetUser string `json:"target_user"`
+ Type int `json:"type"`
+ User string `json:"user"`
+}
+
+type ApplicationCommandMentionableOption struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandMentionableOptionResponse struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandNumberOption struct {
+ Autocomplete bool `json:"autocomplete"`
+ Choices string `json:"choices"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ MaxValue float64 `json:"max_value"`
+ MinValue float64 `json:"min_value"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandNumberOptionResponse struct {
+ Autocomplete bool `json:"autocomplete"`
+ Choices string `json:"choices"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ MaxValue float64 `json:"max_value"`
+ MinValue float64 `json:"min_value"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandOptionIntegerChoice struct {
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Value int `json:"value"`
+}
+
+type ApplicationCommandOptionIntegerChoiceResponse struct {
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Value int `json:"value"`
+}
+
+type ApplicationCommandOptionNumberChoice struct {
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Value float64 `json:"value"`
+}
+
+type ApplicationCommandOptionNumberChoiceResponse struct {
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Value float64 `json:"value"`
+}
+
+type ApplicationCommandOptionStringChoice struct {
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Value string `json:"value"`
+}
+
+type ApplicationCommandOptionStringChoiceResponse struct {
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Value string `json:"value"`
+}
+
+type ApplicationCommandPatchRequestPartial struct {
+ Contexts string `json:"contexts"`
+ DefaultMemberPermissions int `json:"default_member_permissions"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DmPermission bool `json:"dm_permission"`
+ Handler string `json:"handler"`
+ IntegrationTypes string `json:"integration_types"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Options string `json:"options"`
+}
+
+type ApplicationCommandPermission struct {
+ Id string `json:"id"`
+ Permission bool `json:"permission"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandResponse struct {
+ ApplicationId string `json:"application_id"`
+ Contexts string `json:"contexts"`
+ DefaultMemberPermissions string `json:"default_member_permissions"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ DmPermission bool `json:"dm_permission"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ IntegrationTypes string `json:"integration_types"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Nsfw bool `json:"nsfw"`
+ Options string `json:"options"`
+ Type int `json:"type"`
+ Version string `json:"version"`
+}
+
+type ApplicationCommandRoleOption struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandRoleOptionResponse struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandStringOption struct {
+ Autocomplete bool `json:"autocomplete"`
+ Choices string `json:"choices"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ MaxLength int `json:"max_length"`
+ MinLength int `json:"min_length"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandStringOptionResponse struct {
+ Autocomplete bool `json:"autocomplete"`
+ Choices string `json:"choices"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ MaxLength int `json:"max_length"`
+ MinLength int `json:"min_length"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandSubcommandGroupOption struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Options string `json:"options"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandSubcommandGroupOptionResponse struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Options string `json:"options"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandSubcommandOption struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Options string `json:"options"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandSubcommandOptionResponse struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Options string `json:"options"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandUpdateRequest struct {
+ Contexts string `json:"contexts"`
+ DefaultMemberPermissions int `json:"default_member_permissions"`
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DmPermission bool `json:"dm_permission"`
+ Handler string `json:"handler"`
+ Id string `json:"id"`
+ IntegrationTypes string `json:"integration_types"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Options string `json:"options"`
+ Type string `json:"type"`
+}
+
+type ApplicationCommandUserOption struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationCommandUserOptionResponse struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ DescriptionLocalized string `json:"description_localized"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ NameLocalized string `json:"name_localized"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ApplicationFormPartial struct {
+ CoverImage string `json:"cover_image"`
+ CustomInstallUrl string `json:"custom_install_url"`
+ Description string `json:"description"`
+ ExplicitContentFilter string `json:"explicit_content_filter"`
+ Flags int `json:"flags"`
+ Icon string `json:"icon"`
+ InstallParams string `json:"install_params"`
+ IntegrationTypesConfig string `json:"integration_types_config"`
+ InteractionsEndpointUrl string `json:"interactions_endpoint_url"`
+ MaxParticipants int `json:"max_participants"`
+ RoleConnectionsVerificationUrl string `json:"role_connections_verification_url"`
+ Tags string `json:"tags"`
+ TeamId string `json:"team_id"`
+ Type string `json:"type"`
+}
+
+type ApplicationIncomingWebhookResponse struct {
+ ApplicationId string `json:"application_id"`
+ Avatar string `json:"avatar"`
+ ChannelId string `json:"channel_id"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Type int `json:"type"`
+ User string `json:"user"`
+}
+
+type ApplicationIntegrationTypeConfiguration struct {
+ Oauth2InstallParams string `json:"oauth2_install_params"`
+}
+
+type ApplicationIntegrationTypeConfigurationResponse struct {
+ Oauth2InstallParams string `json:"oauth2_install_params"`
+}
+
+type ApplicationOAuth2InstallParams struct {
+ Permissions int `json:"permissions"`
+ Scopes string `json:"scopes"`
+}
+
+type ApplicationOAuth2InstallParamsResponse struct {
+ Permissions string `json:"permissions"`
+ Scopes string `json:"scopes"`
+}
+
+type ApplicationResponse struct {
+ Bot string `json:"bot"`
+ BotPublic bool `json:"bot_public"`
+ BotRequireCodeGrant bool `json:"bot_require_code_grant"`
+ CoverImage string `json:"cover_image"`
+ CustomInstallUrl string `json:"custom_install_url"`
+ Description string `json:"description"`
+ Flags int `json:"flags"`
+ GuildId string `json:"guild_id"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ InstallParams string `json:"install_params"`
+ IntegrationTypesConfig string `json:"integration_types_config"`
+ MaxParticipants int `json:"max_participants"`
+ Name string `json:"name"`
+ PrimarySkuId string `json:"primary_sku_id"`
+ PrivacyPolicyUrl string `json:"privacy_policy_url"`
+ RpcOrigins string `json:"rpc_origins"`
+ Slug string `json:"slug"`
+ Tags string `json:"tags"`
+ TermsOfServiceUrl string `json:"terms_of_service_url"`
+ Type string `json:"type"`
+ VerifyKey string `json:"verify_key"`
+}
+
+type ApplicationRoleConnectionsMetadataItemRequest struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ Key string `json:"key"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Type int `json:"type"`
+}
+
+type ApplicationRoleConnectionsMetadataItemResponse struct {
+ Description string `json:"description"`
+ DescriptionLocalizations string `json:"description_localizations"`
+ Key string `json:"key"`
+ Name string `json:"name"`
+ NameLocalizations string `json:"name_localizations"`
+ Type int `json:"type"`
+}
+
+type ApplicationUserRoleConnectionResponse struct {
+ Metadata string `json:"metadata"`
+ PlatformName string `json:"platform_name"`
+ PlatformUsername string `json:"platform_username"`
+}
+
+type AttachmentResponse struct {
+ Application string `json:"application"`
+ ClipCreatedAt string `json:"clip_created_at"`
+ ClipParticipants string `json:"clip_participants"`
+ ContentType string `json:"content_type"`
+ Description string `json:"description"`
+ DurationSecs float64 `json:"duration_secs"`
+ Ephemeral bool `json:"ephemeral"`
+ Filename string `json:"filename"`
+ Height int `json:"height"`
+ Id string `json:"id"`
+ ProxyUrl string `json:"proxy_url"`
+ Size int `json:"size"`
+ Title string `json:"title"`
+ Url string `json:"url"`
+ Waveform string `json:"waveform"`
+ Width int `json:"width"`
+}
+
+type AuditLogEntryResponse struct {
+ ActionType int `json:"action_type"`
+ Changes string `json:"changes"`
+ Id string `json:"id"`
+ Options string `json:"options"`
+ Reason string `json:"reason"`
+ TargetId string `json:"target_id"`
+ UserId string `json:"user_id"`
+}
+
+type AuditLogObjectChangeResponse struct {
+ Key string `json:"key"`
+ NewValue string `json:"new_value"`
+ OldValue string `json:"old_value"`
+}
+
+type BanUserFromGuildRequest struct {
+ DeleteMessageDays int `json:"delete_message_days"`
+ DeleteMessageSeconds int `json:"delete_message_seconds"`
+}
+
+type BaseCreateMessageCreateRequest struct {
+ AllowedMentions string `json:"allowed_mentions"`
+ Attachments string `json:"attachments"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ Embeds string `json:"embeds"`
+ Flags int `json:"flags"`
+ Poll string `json:"poll"`
+ SharedClientTheme string `json:"shared_client_theme"`
+ StickerIds string `json:"sticker_ids"`
+}
+
+type BasicApplicationResponse struct {
+ Bot string `json:"bot"`
+ CoverImage string `json:"cover_image"`
+ Description string `json:"description"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ PrimarySkuId string `json:"primary_sku_id"`
+ Type string `json:"type"`
+}
+
+type BasicGuildMemberResponse struct {
+ Avatar string `json:"avatar"`
+ AvatarDecorationData string `json:"avatar_decoration_data"`
+ Banner string `json:"banner"`
+ Collectibles string `json:"collectibles"`
+ CommunicationDisabledUntil string `json:"communication_disabled_until"`
+ Flags int `json:"flags"`
+ JoinedAt string `json:"joined_at"`
+ Nick string `json:"nick"`
+ Pending bool `json:"pending"`
+ PremiumSince string `json:"premium_since"`
+ Roles string `json:"roles"`
+}
+
+type BasicMessageResponse struct {
+ Activity string `json:"activity"`
+ Application string `json:"application"`
+ ApplicationId string `json:"application_id"`
+ Attachments string `json:"attachments"`
+ Author string `json:"author"`
+ Call string `json:"call"`
+ ChannelId string `json:"channel_id"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ EditedTimestamp string `json:"edited_timestamp"`
+ Embeds string `json:"embeds"`
+ Flags int `json:"flags"`
+ Id string `json:"id"`
+ Interaction string `json:"interaction"`
+ InteractionMetadata string `json:"interaction_metadata"`
+ MentionChannels string `json:"mention_channels"`
+ MentionEveryone bool `json:"mention_everyone"`
+ MentionRoles string `json:"mention_roles"`
+ Mentions string `json:"mentions"`
+ MessageReference string `json:"message_reference"`
+ MessageSnapshots string `json:"message_snapshots"`
+ Nonce string `json:"nonce"`
+ Pinned bool `json:"pinned"`
+ Poll string `json:"poll"`
+ Position int `json:"position"`
+ PurchaseNotification string `json:"purchase_notification"`
+ Resolved string `json:"resolved"`
+ RoleSubscriptionData string `json:"role_subscription_data"`
+ SharedClientTheme string `json:"shared_client_theme"`
+ StickerItems string `json:"sticker_items"`
+ Stickers string `json:"stickers"`
+ Thread string `json:"thread"`
+ Timestamp string `json:"timestamp"`
+ Tts bool `json:"tts"`
+ Type int `json:"type"`
+ WebhookId string `json:"webhook_id"`
+}
+
+type BlockMessageAction struct {
+ Metadata string `json:"metadata"`
+ Type int `json:"type"`
+}
+
+type BlockMessageActionMetadata struct {
+ CustomMessage string `json:"custom_message"`
+}
+
+type BlockMessageActionMetadataResponse struct {
+ CustomMessage string `json:"custom_message"`
+}
+
+type BlockMessageActionResponse struct {
+ Metadata string `json:"metadata"`
+ Type int `json:"type"`
+}
+
+type BotAccountPatchRequest struct {
+ Avatar string `json:"avatar"`
+ Banner string `json:"banner"`
+ Username string `json:"username"`
+}
+
+type BotAddGuildMemberRequest struct {
+ AccessToken string `json:"access_token"`
+ Deaf bool `json:"deaf"`
+ Flags int `json:"flags"`
+ Mute bool `json:"mute"`
+ Nick string `json:"nick"`
+ Roles string `json:"roles"`
+}
+
+type BulkBanUsersRequest struct {
+ DeleteMessageSeconds int `json:"delete_message_seconds"`
+ UserIds string `json:"user_ids"`
+}
+
+type BulkBanUsersResponse struct {
+ BannedUsers string `json:"banned_users"`
+ FailedUsers string `json:"failed_users"`
+}
+
+type BulkLobbyMemberRequest struct {
+ Flags string `json:"flags"`
+ Id string `json:"id"`
+ Metadata string `json:"metadata"`
+ RemoveMember bool `json:"remove_member"`
+}
+
+type ButtonComponentForMessageRequest struct {
+ CustomId string `json:"custom_id"`
+ Disabled bool `json:"disabled"`
+ Emoji string `json:"emoji"`
+ Id int `json:"id"`
+ Label string `json:"label"`
+ SkuId string `json:"sku_id"`
+ Style int `json:"style"`
+ Type int `json:"type"`
+ Url string `json:"url"`
+}
+
+type ButtonComponentResponse struct {
+ CustomId string `json:"custom_id"`
+ Disabled bool `json:"disabled"`
+ Emoji string `json:"emoji"`
+ Id int `json:"id"`
+ Label string `json:"label"`
+ SkuId string `json:"sku_id"`
+ Style int `json:"style"`
+ Type int `json:"type"`
+ Url string `json:"url"`
+}
+
+type ChannelFollowerResponse struct {
+ ChannelId string `json:"channel_id"`
+ WebhookId string `json:"webhook_id"`
+}
+
+type ChannelFollowerWebhookResponse struct {
+ ApplicationId string `json:"application_id"`
+ Avatar string `json:"avatar"`
+ ChannelId string `json:"channel_id"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ SourceChannel string `json:"source_channel"`
+ SourceGuild string `json:"source_guild"`
+ Type int `json:"type"`
+ User string `json:"user"`
+}
+
+type ChannelPermissionOverwriteRequest struct {
+ Allow int `json:"allow"`
+ Deny int `json:"deny"`
+ Id string `json:"id"`
+ Type string `json:"type"`
+}
+
+type ChannelPermissionOverwriteResponse struct {
+ Allow string `json:"allow"`
+ Deny string `json:"deny"`
+ Id string `json:"id"`
+ Type int `json:"type"`
+}
+
+type ChannelSelectComponentForMessageRequest struct {
+ ChannelTypes string `json:"channel_types"`
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ChannelSelectComponentForModalRequest struct {
+ ChannelTypes string `json:"channel_types"`
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type ChannelSelectComponentResponse struct {
+ ChannelTypes string `json:"channel_types"`
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Type int `json:"type"`
+}
+
+type ChannelSelectDefaultValue struct {
+ Id string `json:"id"`
+ Type string `json:"type"`
+}
+
+type ChannelSelectDefaultValueResponse struct {
+ Id string `json:"id"`
+ Type string `json:"type"`
+}
+
+type CheckboxComponentForModalRequest struct {
+ CustomId string `json:"custom_id"`
+ Default bool `json:"default"`
+ Id int `json:"id"`
+ Type int `json:"type"`
+}
+
+type CheckboxGroupComponentForModalRequest struct {
+ CustomId string `json:"custom_id"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Options string `json:"options"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type CheckboxGroupOptionForRequest struct {
+ Default bool `json:"default"`
+ Description string `json:"description"`
+ Label string `json:"label"`
+ Value string `json:"value"`
+}
+
+type CommandPermissionResponse struct {
+ Id string `json:"id"`
+ Permission bool `json:"permission"`
+ Type int `json:"type"`
+}
+
+type CommandPermissionsResponse struct {
+ ApplicationId string `json:"application_id"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Permissions string `json:"permissions"`
+}
+
+type ComponentEmojiForRequest struct {
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type ComponentEmojiResponse struct {
+ Animated bool `json:"animated"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type ConnectedAccountGuildResponse struct {
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type ConnectedAccountIntegrationResponse struct {
+ Account string `json:"account"`
+ Guild string `json:"guild"`
+ Id string `json:"id"`
+ Type string `json:"type"`
+}
+
+type ConnectedAccountResponse struct {
+ FriendSync bool `json:"friend_sync"`
+ Id string `json:"id"`
+ Integrations string `json:"integrations"`
+ Name string `json:"name"`
+ Revoked bool `json:"revoked"`
+ ShowActivity bool `json:"show_activity"`
+ TwoWayLink bool `json:"two_way_link"`
+ Type string `json:"type"`
+ Verified bool `json:"verified"`
+ Visibility int `json:"visibility"`
+}
+
+type ContainerComponentForMessageRequest struct {
+ AccentColor int `json:"accent_color"`
+ Components string `json:"components"`
+ Id int `json:"id"`
+ Spoiler bool `json:"spoiler"`
+ Type int `json:"type"`
+}
+
+type ContainerComponentResponse struct {
+ AccentColor int `json:"accent_color"`
+ Components string `json:"components"`
+ Id int `json:"id"`
+ Spoiler bool `json:"spoiler"`
+ Type int `json:"type"`
+}
+
+type CreateEntitlementRequestData struct {
+ OwnerId string `json:"owner_id"`
+ OwnerType int `json:"owner_type"`
+ SkuId string `json:"sku_id"`
+}
+
+type CreateForumThreadRequest struct {
+ AppliedTags string `json:"applied_tags"`
+ AutoArchiveDuration string `json:"auto_archive_duration"`
+ Message string `json:"message"`
+ Name string `json:"name"`
+ RateLimitPerUser int `json:"rate_limit_per_user"`
+}
+
+type CreateGroupDMInviteRequest struct {
+ MaxAge int `json:"max_age"`
+}
+
+type CreateGuildChannelRequest struct {
+ AvailableTags string `json:"available_tags"`
+ Bitrate int `json:"bitrate"`
+ DefaultAutoArchiveDuration string `json:"default_auto_archive_duration"`
+ DefaultForumLayout string `json:"default_forum_layout"`
+ DefaultReactionEmoji string `json:"default_reaction_emoji"`
+ DefaultSortOrder string `json:"default_sort_order"`
+ DefaultTagSetting string `json:"default_tag_setting"`
+ DefaultThreadRateLimitPerUser int `json:"default_thread_rate_limit_per_user"`
+ Name string `json:"name"`
+ Nsfw bool `json:"nsfw"`
+ ParentId string `json:"parent_id"`
+ PermissionOverwrites string `json:"permission_overwrites"`
+ Position int `json:"position"`
+ RateLimitPerUser int `json:"rate_limit_per_user"`
+ RtcRegion string `json:"rtc_region"`
+ Topic string `json:"topic"`
+ Type string `json:"type"`
+ UserLimit int `json:"user_limit"`
+ VideoQualityMode string `json:"video_quality_mode"`
+}
+
+type CreateGuildInviteRequest struct {
+ MaxAge int `json:"max_age"`
+ MaxUses int `json:"max_uses"`
+ TargetApplicationId string `json:"target_application_id"`
+ TargetType string `json:"target_type"`
+ TargetUserId string `json:"target_user_id"`
+ Temporary bool `json:"temporary"`
+ Unique bool `json:"unique"`
+}
+
+type CreateMessageInteractionCallbackRequest struct {
+ Data string `json:"data"`
+ Type int `json:"type"`
+}
+
+type CreateMessageInteractionCallbackResponse struct {
+ Message string `json:"message"`
+ Type int `json:"type"`
+}
+
+type CreateOrUpdateThreadTagRequest struct {
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+ Moderated bool `json:"moderated"`
+ Name string `json:"name"`
+}
+
+type CreatePrivateChannelRequest struct {
+ AccessTokens string `json:"access_tokens"`
+ Nicks string `json:"nicks"`
+ RecipientId string `json:"recipient_id"`
+}
+
+type CreateRoleRequest struct {
+ Color int `json:"color"`
+ Colors string `json:"colors"`
+ Hoist bool `json:"hoist"`
+ Icon string `json:"icon"`
+ Mentionable bool `json:"mentionable"`
+ Name string `json:"name"`
+ Permissions int `json:"permissions"`
+ UnicodeEmoji string `json:"unicode_emoji"`
+}
+
+type CreateTextThreadWithMessageRequest struct {
+ AutoArchiveDuration string `json:"auto_archive_duration"`
+ Name string `json:"name"`
+ RateLimitPerUser int `json:"rate_limit_per_user"`
+}
+
+type CreateTextThreadWithoutMessageRequest struct {
+ AutoArchiveDuration string `json:"auto_archive_duration"`
+ Invitable bool `json:"invitable"`
+ Name string `json:"name"`
+ RateLimitPerUser int `json:"rate_limit_per_user"`
+ Type string `json:"type"`
+}
+
+type CreatedThreadResponse struct {
+ AppliedTags string `json:"applied_tags"`
+ Bitrate int `json:"bitrate"`
+ Flags int `json:"flags"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ LastMessageId string `json:"last_message_id"`
+ LastPinTimestamp string `json:"last_pin_timestamp"`
+ Member string `json:"member"`
+ MemberCount int `json:"member_count"`
+ MessageCount int `json:"message_count"`
+ Name string `json:"name"`
+ OwnerId string `json:"owner_id"`
+ ParentId string `json:"parent_id"`
+ Permissions string `json:"permissions"`
+ RateLimitPerUser int `json:"rate_limit_per_user"`
+ RtcRegion string `json:"rtc_region"`
+ ThreadMetadata string `json:"thread_metadata"`
+ TotalMessageSent int `json:"total_message_sent"`
+ Type int `json:"type"`
+ UserLimit int `json:"user_limit"`
+ VideoQualityMode int `json:"video_quality_mode"`
+}
+
+type CustomClientThemeResponse struct {
+ BaseMix int `json:"base_mix"`
+ BaseTheme int `json:"base_theme"`
+ Colors string `json:"colors"`
+ GradientAngle int `json:"gradient_angle"`
+}
+
+type CustomClientThemeShareRequest struct {
+ BaseMix int `json:"base_mix"`
+ BaseTheme string `json:"base_theme"`
+ Colors string `json:"colors"`
+ GradientAngle int `json:"gradient_angle"`
+}
+
+type DefaultKeywordListTriggerMetadata struct {
+ AllowList string `json:"allow_list"`
+ Presets string `json:"presets"`
+}
+
+type DefaultKeywordListTriggerMetadataResponse struct {
+ AllowList string `json:"allow_list"`
+ Presets string `json:"presets"`
+}
+
+type DefaultKeywordListUpsertRequest struct {
+ Actions string `json:"actions"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type DefaultKeywordListUpsertRequestPartial struct {
+ Actions string `json:"actions"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type DefaultKeywordRuleResponse struct {
+ Actions string `json:"actions"`
+ CreatorId string `json:"creator_id"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type DefaultReactionEmojiResponse struct {
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+}
+
+type DiscordIntegrationResponse struct {
+ Account string `json:"account"`
+ Application string `json:"application"`
+ Enabled bool `json:"enabled"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Scopes string `json:"scopes"`
+ Type string `json:"type"`
+ User string `json:"user"`
+}
+
+type EmbeddedActivityInstance struct {
+ ApplicationId string `json:"application_id"`
+ InstanceId string `json:"instance_id"`
+ LaunchId string `json:"launch_id"`
+ Location string `json:"location"`
+ Users string `json:"users"`
+}
+
+type EmojiResponse struct {
+ Animated bool `json:"animated"`
+ Available bool `json:"available"`
+ Id string `json:"id"`
+ Managed bool `json:"managed"`
+ Name string `json:"name"`
+ RequireColons bool `json:"require_colons"`
+ Roles string `json:"roles"`
+ User string `json:"user"`
+}
+
+type EntitlementResponse struct {
+ ApplicationId string `json:"application_id"`
+ Consumed bool `json:"consumed"`
+ Deleted bool `json:"deleted"`
+ EndsAt string `json:"ends_at"`
+ FulfilledAt string `json:"fulfilled_at"`
+ FulfillmentStatus string `json:"fulfillment_status"`
+ GifterUserId string `json:"gifter_user_id"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ ParentId string `json:"parent_id"`
+ SkuId string `json:"sku_id"`
+ StartsAt string `json:"starts_at"`
+ Type int `json:"type"`
+ UserId string `json:"user_id"`
+}
+
+type EntityMetadataExternal struct {
+ Location string `json:"location"`
+}
+
+type EntityMetadataExternalResponse struct {
+ Location string `json:"location"`
+}
+
+type EntityMetadataStageInstance struct {
+}
+
+type EntityMetadataStageInstanceResponse struct {
+}
+
+type EntityMetadataVoice struct {
+}
+
+type EntityMetadataVoiceResponse struct {
+}
+
+type Error struct {
+ Code int `json:"code"`
+ Message string `json:"message"`
+}
+
+type ErrorResponse struct {
+ Code int `json:"code"`
+ Errors string `json:"errors"`
+ Message string `json:"message"`
+}
+
+type ExternalConnectionIntegrationResponse struct {
+ Account string `json:"account"`
+ EnableEmoticons bool `json:"enable_emoticons"`
+ Enabled bool `json:"enabled"`
+ ExpireBehavior int `json:"expire_behavior"`
+ ExpireGracePeriod int `json:"expire_grace_period"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Revoked bool `json:"revoked"`
+ RoleId string `json:"role_id"`
+ SubscriberCount int `json:"subscriber_count"`
+ SyncedAt string `json:"synced_at"`
+ Syncing bool `json:"syncing"`
+ Type string `json:"type"`
+ User string `json:"user"`
+}
+
+type ExternalScheduledEventCreateRequest struct {
+ ChannelId string `json:"channel_id"`
+ Description string `json:"description"`
+ EntityMetadata string `json:"entity_metadata"`
+ EntityType int `json:"entity_type"`
+ Image string `json:"image"`
+ Name string `json:"name"`
+ PrivacyLevel int `json:"privacy_level"`
+ ScheduledEndTime string `json:"scheduled_end_time"`
+ ScheduledStartTime string `json:"scheduled_start_time"`
+}
+
+type ExternalScheduledEventPatchRequestPartial struct {
+ ChannelId string `json:"channel_id"`
+ Description string `json:"description"`
+ EntityMetadata string `json:"entity_metadata"`
+ EntityType string `json:"entity_type"`
+ Image string `json:"image"`
+ Name string `json:"name"`
+ PrivacyLevel int `json:"privacy_level"`
+ ScheduledEndTime string `json:"scheduled_end_time"`
+ ScheduledStartTime string `json:"scheduled_start_time"`
+ Status string `json:"status"`
+}
+
+type ExternalScheduledEventResponse struct {
+ ChannelId string `json:"channel_id"`
+ Creator string `json:"creator"`
+ CreatorId string `json:"creator_id"`
+ Description string `json:"description"`
+ EntityId string `json:"entity_id"`
+ EntityMetadata string `json:"entity_metadata"`
+ EntityType int `json:"entity_type"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Image string `json:"image"`
+ Name string `json:"name"`
+ PrivacyLevel int `json:"privacy_level"`
+ ScheduledEndTime string `json:"scheduled_end_time"`
+ ScheduledStartTime string `json:"scheduled_start_time"`
+ Status int `json:"status"`
+ UserCount int `json:"user_count"`
+ UserRsvp string `json:"user_rsvp"`
+}
+
+type FileComponentForMessageRequest struct {
+ File string `json:"file"`
+ Id int `json:"id"`
+ Spoiler bool `json:"spoiler"`
+ Type int `json:"type"`
+}
+
+type FileComponentResponse struct {
+ File string `json:"file"`
+ Id int `json:"id"`
+ Name string `json:"name"`
+ Size int `json:"size"`
+ Spoiler bool `json:"spoiler"`
+ Type int `json:"type"`
+}
+
+type FileUploadComponentForModalRequest struct {
+ CustomId string `json:"custom_id"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type FlagToChannelAction struct {
+ Metadata string `json:"metadata"`
+ Type int `json:"type"`
+}
+
+type FlagToChannelActionMetadata struct {
+ ChannelId string `json:"channel_id"`
+}
+
+type FlagToChannelActionMetadataResponse struct {
+ ChannelId string `json:"channel_id"`
+}
+
+type FlagToChannelActionResponse struct {
+ Metadata string `json:"metadata"`
+ Type int `json:"type"`
+}
+
+type ForumTagResponse struct {
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+ Id string `json:"id"`
+ Moderated bool `json:"moderated"`
+ Name string `json:"name"`
+}
+
+type FriendInviteResponse struct {
+ Channel string `json:"channel"`
+ Code string `json:"code"`
+ CreatedAt string `json:"created_at"`
+ ExpiresAt string `json:"expires_at"`
+ Flags int `json:"flags"`
+ FriendsCount int `json:"friends_count"`
+ Inviter string `json:"inviter"`
+ IsContact bool `json:"is_contact"`
+ MaxAge int `json:"max_age"`
+ MaxUses int `json:"max_uses"`
+ Type int `json:"type"`
+ Uses int `json:"uses"`
+}
+
+type GatewayBotResponse struct {
+ SessionStartLimit string `json:"session_start_limit"`
+ Shards int `json:"shards"`
+ Url string `json:"url"`
+}
+
+type GatewayBotSessionStartLimitResponse struct {
+ MaxConcurrency int `json:"max_concurrency"`
+ Remaining int `json:"remaining"`
+ ResetAfter int `json:"reset_after"`
+ Total int `json:"total"`
+}
+
+type GatewayResponse struct {
+ Url string `json:"url"`
+}
+
+type GithubAuthor struct {
+ Name string `json:"name"`
+ Username string `json:"username"`
+}
+
+type GithubCheckApp struct {
+ Name string `json:"name"`
+}
+
+type GithubCheckPullRequest struct {
+ Number int `json:"number"`
+}
+
+type GithubCheckRun struct {
+ CheckSuite string `json:"check_suite"`
+ Conclusion string `json:"conclusion"`
+ DetailsUrl string `json:"details_url"`
+ HtmlUrl string `json:"html_url"`
+ Name string `json:"name"`
+ Output string `json:"output"`
+ PullRequests string `json:"pull_requests"`
+}
+
+type GithubCheckRunOutput struct {
+ Summary string `json:"summary"`
+ Title string `json:"title"`
+}
+
+type GithubCheckSuite struct {
+ App string `json:"app"`
+ Conclusion string `json:"conclusion"`
+ HeadBranch string `json:"head_branch"`
+ HeadSha string `json:"head_sha"`
+ PullRequests string `json:"pull_requests"`
+}
+
+type GithubComment struct {
+ Body string `json:"body"`
+ CommitId string `json:"commit_id"`
+ HtmlUrl string `json:"html_url"`
+ Id int `json:"id"`
+ User string `json:"user"`
+}
+
+type GithubCommit struct {
+ Author string `json:"author"`
+ Id string `json:"id"`
+ Message string `json:"message"`
+ Url string `json:"url"`
+}
+
+type GithubDiscussion struct {
+ AnswerHtmlUrl string `json:"answer_html_url"`
+ Body string `json:"body"`
+ HtmlUrl string `json:"html_url"`
+ Number int `json:"number"`
+ Title string `json:"title"`
+ User string `json:"user"`
+}
+
+type GithubIssue struct {
+ Body string `json:"body"`
+ HtmlUrl string `json:"html_url"`
+ Id int `json:"id"`
+ Number int `json:"number"`
+ PullRequest string `json:"pull_request"`
+ Title string `json:"title"`
+ User string `json:"user"`
+}
+
+type GithubRelease struct {
+ Author string `json:"author"`
+ HtmlUrl string `json:"html_url"`
+ Id int `json:"id"`
+ TagName string `json:"tag_name"`
+}
+
+type GithubRepository struct {
+ FullName string `json:"full_name"`
+ HtmlUrl string `json:"html_url"`
+ Id int `json:"id"`
+ Name string `json:"name"`
+}
+
+type GithubReview struct {
+ Body string `json:"body"`
+ HtmlUrl string `json:"html_url"`
+ State string `json:"state"`
+ User string `json:"user"`
+}
+
+type GithubUser struct {
+ AvatarUrl string `json:"avatar_url"`
+ HtmlUrl string `json:"html_url"`
+ Id int `json:"id"`
+ Login string `json:"login"`
+}
+
+type GithubWebhook struct {
+ Action string `json:"action"`
+ Answer string `json:"answer"`
+ CheckRun string `json:"check_run"`
+ CheckSuite string `json:"check_suite"`
+ Comment string `json:"comment"`
+ Commits string `json:"commits"`
+ Compare string `json:"compare"`
+ Discussion string `json:"discussion"`
+ Forced bool `json:"forced"`
+ Forkee string `json:"forkee"`
+ HeadCommit string `json:"head_commit"`
+ Issue string `json:"issue"`
+ Member string `json:"member"`
+ PullRequest string `json:"pull_request"`
+ Ref string `json:"ref"`
+ RefType string `json:"ref_type"`
+ Release string `json:"release"`
+ Repository string `json:"repository"`
+ Review string `json:"review"`
+ Sender string `json:"sender"`
+}
+
+type GroupDMInviteResponse struct {
+ ApproximateMemberCount int `json:"approximate_member_count"`
+ Channel string `json:"channel"`
+ Code string `json:"code"`
+ CreatedAt string `json:"created_at"`
+ ExpiresAt string `json:"expires_at"`
+ Inviter string `json:"inviter"`
+ MaxAge int `json:"max_age"`
+ Type int `json:"type"`
+}
+
+type GuildAuditLogResponse struct {
+ ApplicationCommands string `json:"application_commands"`
+ AuditLogEntries string `json:"audit_log_entries"`
+ AutoModerationRules string `json:"auto_moderation_rules"`
+ GuildScheduledEvents string `json:"guild_scheduled_events"`
+ Integrations string `json:"integrations"`
+ Threads string `json:"threads"`
+ Users string `json:"users"`
+ Webhooks string `json:"webhooks"`
+}
+
+type GuildBanResponse struct {
+ Reason string `json:"reason"`
+ User string `json:"user"`
+}
+
+type GuildChannelLocation struct {
+ ChannelId string `json:"channel_id"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Kind string `json:"kind"`
+}
+
+type GuildChannelResponse struct {
+ AvailableTags string `json:"available_tags"`
+ Bitrate int `json:"bitrate"`
+ DefaultAutoArchiveDuration int `json:"default_auto_archive_duration"`
+ DefaultForumLayout string `json:"default_forum_layout"`
+ DefaultReactionEmoji string `json:"default_reaction_emoji"`
+ DefaultSortOrder string `json:"default_sort_order"`
+ DefaultTagSetting string `json:"default_tag_setting"`
+ DefaultThreadRateLimitPerUser int `json:"default_thread_rate_limit_per_user"`
+ Flags int `json:"flags"`
+ GuildId string `json:"guild_id"`
+ HdStreamingBuyerId string `json:"hd_streaming_buyer_id"`
+ HdStreamingUntil string `json:"hd_streaming_until"`
+ Id string `json:"id"`
+ LastMessageId string `json:"last_message_id"`
+ LastPinTimestamp string `json:"last_pin_timestamp"`
+ Name string `json:"name"`
+ Nsfw bool `json:"nsfw"`
+ ParentId string `json:"parent_id"`
+ PermissionOverwrites string `json:"permission_overwrites"`
+ Permissions string `json:"permissions"`
+ Position int `json:"position"`
+ RateLimitPerUser int `json:"rate_limit_per_user"`
+ RtcRegion string `json:"rtc_region"`
+ Topic string `json:"topic"`
+ Type int `json:"type"`
+ UserLimit int `json:"user_limit"`
+ VideoQualityMode int `json:"video_quality_mode"`
+}
+
+type GuildHomeSettingsResponse struct {
+ Enabled bool `json:"enabled"`
+ GuildId string `json:"guild_id"`
+ NewMemberActions string `json:"new_member_actions"`
+ ResourceChannels string `json:"resource_channels"`
+ WelcomeMessage string `json:"welcome_message"`
+}
+
+type GuildIncomingWebhookResponse struct {
+ ApplicationId string `json:"application_id"`
+ Avatar string `json:"avatar"`
+ ChannelId string `json:"channel_id"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Token string `json:"token"`
+ Type int `json:"type"`
+ Url string `json:"url"`
+ User string `json:"user"`
+}
+
+type GuildInviteResponse struct {
+ ApproximateMemberCount int `json:"approximate_member_count"`
+ ApproximatePresenceCount int `json:"approximate_presence_count"`
+ Channel string `json:"channel"`
+ Code string `json:"code"`
+ CreatedAt string `json:"created_at"`
+ ExpiresAt string `json:"expires_at"`
+ Flags int `json:"flags"`
+ Guild string `json:"guild"`
+ GuildId string `json:"guild_id"`
+ GuildScheduledEvent string `json:"guild_scheduled_event"`
+ Inviter string `json:"inviter"`
+ IsContact bool `json:"is_contact"`
+ IsNicknameChangeable bool `json:"is_nickname_changeable"`
+ MaxAge int `json:"max_age"`
+ MaxUses int `json:"max_uses"`
+ Roles string `json:"roles"`
+ TargetApplication string `json:"target_application"`
+ TargetType int `json:"target_type"`
+ TargetUser string `json:"target_user"`
+ Temporary bool `json:"temporary"`
+ Type int `json:"type"`
+ Uses int `json:"uses"`
+}
+
+type GuildMemberResponse struct {
+ Avatar string `json:"avatar"`
+ AvatarDecorationData string `json:"avatar_decoration_data"`
+ Banner string `json:"banner"`
+ Collectibles string `json:"collectibles"`
+ CommunicationDisabledUntil string `json:"communication_disabled_until"`
+ Deaf bool `json:"deaf"`
+ Flags int `json:"flags"`
+ JoinedAt string `json:"joined_at"`
+ Mute bool `json:"mute"`
+ Nick string `json:"nick"`
+ Pending bool `json:"pending"`
+ PremiumSince string `json:"premium_since"`
+ Roles string `json:"roles"`
+ User string `json:"user"`
+}
+
+type GuildOnboardingResponse struct {
+ DefaultChannelIds string `json:"default_channel_ids"`
+ Enabled bool `json:"enabled"`
+ GuildId string `json:"guild_id"`
+ Prompts string `json:"prompts"`
+}
+
+type GuildPatchRequestPartial struct {
+ AfkChannelId string `json:"afk_channel_id"`
+ AfkTimeout string `json:"afk_timeout"`
+ Banner string `json:"banner"`
+ DefaultMessageNotifications string `json:"default_message_notifications"`
+ Description string `json:"description"`
+ DiscoverySplash string `json:"discovery_splash"`
+ ExplicitContentFilter string `json:"explicit_content_filter"`
+ Features string `json:"features"`
+ HomeHeader string `json:"home_header"`
+ Icon string `json:"icon"`
+ Name string `json:"name"`
+ PreferredLocale string `json:"preferred_locale"`
+ PremiumProgressBarEnabled bool `json:"premium_progress_bar_enabled"`
+ PublicUpdatesChannelId string `json:"public_updates_channel_id"`
+ Region string `json:"region"`
+ RulesChannelId string `json:"rules_channel_id"`
+ SafetyAlertsChannelId string `json:"safety_alerts_channel_id"`
+ Splash string `json:"splash"`
+ SystemChannelFlags int `json:"system_channel_flags"`
+ SystemChannelId string `json:"system_channel_id"`
+ VerificationLevel string `json:"verification_level"`
+}
+
+type GuildPreviewResponse struct {
+ ApproximateMemberCount int `json:"approximate_member_count"`
+ ApproximatePresenceCount int `json:"approximate_presence_count"`
+ Description string `json:"description"`
+ DiscoverySplash string `json:"discovery_splash"`
+ Emojis string `json:"emojis"`
+ Features string `json:"features"`
+ HomeHeader string `json:"home_header"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Splash string `json:"splash"`
+ Stickers string `json:"stickers"`
+}
+
+type GuildProductPurchaseResponse struct {
+ ListingId string `json:"listing_id"`
+ ProductName string `json:"product_name"`
+}
+
+type GuildPruneResponse struct {
+ Pruned int `json:"pruned"`
+}
+
+type GuildResponse struct {
+ AfkChannelId string `json:"afk_channel_id"`
+ AfkTimeout int `json:"afk_timeout"`
+ ApplicationId string `json:"application_id"`
+ Banner string `json:"banner"`
+ DefaultMessageNotifications int `json:"default_message_notifications"`
+ Description string `json:"description"`
+ DiscoverySplash string `json:"discovery_splash"`
+ Emojis string `json:"emojis"`
+ ExplicitContentFilter int `json:"explicit_content_filter"`
+ Features string `json:"features"`
+ HomeHeader string `json:"home_header"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ MaxMembers int `json:"max_members"`
+ MaxPresences int `json:"max_presences"`
+ MaxStageVideoChannelUsers int `json:"max_stage_video_channel_users"`
+ MaxVideoChannelUsers int `json:"max_video_channel_users"`
+ MfaLevel int `json:"mfa_level"`
+ Name string `json:"name"`
+ Nsfw bool `json:"nsfw"`
+ NsfwLevel int `json:"nsfw_level"`
+ OwnerId string `json:"owner_id"`
+ PreferredLocale string `json:"preferred_locale"`
+ PremiumProgressBarEnabled bool `json:"premium_progress_bar_enabled"`
+ PremiumProgressBarEnabledUserUpdatedAt string `json:"premium_progress_bar_enabled_user_updated_at"`
+ PremiumSubscriptionCount int `json:"premium_subscription_count"`
+ PremiumTier int `json:"premium_tier"`
+ PublicUpdatesChannelId string `json:"public_updates_channel_id"`
+ Region string `json:"region"`
+ Roles string `json:"roles"`
+ RulesChannelId string `json:"rules_channel_id"`
+ SafetyAlertsChannelId string `json:"safety_alerts_channel_id"`
+ Splash string `json:"splash"`
+ Stickers string `json:"stickers"`
+ SystemChannelFlags int `json:"system_channel_flags"`
+ SystemChannelId string `json:"system_channel_id"`
+ VanityUrlCode string `json:"vanity_url_code"`
+ VerificationLevel int `json:"verification_level"`
+ WidgetChannelId string `json:"widget_channel_id"`
+ WidgetEnabled bool `json:"widget_enabled"`
+}
+
+type GuildRoleColorsResponse struct {
+ PrimaryColor int `json:"primary_color"`
+ SecondaryColor int `json:"secondary_color"`
+ TertiaryColor int `json:"tertiary_color"`
+}
+
+type GuildRoleResponse struct {
+ Color int `json:"color"`
+ Colors string `json:"colors"`
+ Description string `json:"description"`
+ Flags int `json:"flags"`
+ Hoist bool `json:"hoist"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Managed bool `json:"managed"`
+ Mentionable bool `json:"mentionable"`
+ Name string `json:"name"`
+ Permissions string `json:"permissions"`
+ Position int `json:"position"`
+ Tags string `json:"tags"`
+ UnicodeEmoji string `json:"unicode_emoji"`
+}
+
+type GuildRoleTagsResponse struct {
+ AvailableForPurchase string `json:"available_for_purchase"`
+ BotId string `json:"bot_id"`
+ GuildConnections string `json:"guild_connections"`
+ IntegrationId string `json:"integration_id"`
+ PremiumSubscriber string `json:"premium_subscriber"`
+ SubscriptionListingId string `json:"subscription_listing_id"`
+}
+
+type GuildSearchResponse struct {
+ DocumentsIndexed int `json:"documents_indexed"`
+ DoingDeepHistoricalIndex bool `json:"doing_deep_historical_index"`
+ Members string `json:"members"`
+ Messages string `json:"messages"`
+ Threads string `json:"threads"`
+ TotalResults int `json:"total_results"`
+}
+
+type GuildStickerResponse struct {
+ Available bool `json:"available"`
+ Description string `json:"description"`
+ FormatType string `json:"format_type"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Tags string `json:"tags"`
+ Type int `json:"type"`
+ User string `json:"user"`
+}
+
+type GuildSubscriptionIntegrationResponse struct {
+ Account string `json:"account"`
+ Enabled bool `json:"enabled"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Type string `json:"type"`
+}
+
+type GuildTemplateChannelResponse struct {
+ AvailableTags string `json:"available_tags"`
+ Bitrate int `json:"bitrate"`
+ DefaultAutoArchiveDuration string `json:"default_auto_archive_duration"`
+ DefaultForumLayout string `json:"default_forum_layout"`
+ DefaultReactionEmoji string `json:"default_reaction_emoji"`
+ DefaultSortOrder string `json:"default_sort_order"`
+ DefaultTagSetting string `json:"default_tag_setting"`
+ DefaultThreadRateLimitPerUser int `json:"default_thread_rate_limit_per_user"`
+ IconEmoji string `json:"icon_emoji"`
+ Id int `json:"id"`
+ Name string `json:"name"`
+ Nsfw bool `json:"nsfw"`
+ ParentId string `json:"parent_id"`
+ PermissionOverwrites string `json:"permission_overwrites"`
+ Position int `json:"position"`
+ RateLimitPerUser int `json:"rate_limit_per_user"`
+ Template string `json:"template"`
+ ThemeColor int `json:"theme_color"`
+ Topic string `json:"topic"`
+ Type int `json:"type"`
+ UserLimit int `json:"user_limit"`
+}
+
+type GuildTemplateChannelTags struct {
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+ Id int `json:"id"`
+ Moderated bool `json:"moderated"`
+ Name string `json:"name"`
+}
+
+type GuildTemplateResponse struct {
+ Code string `json:"code"`
+ CreatedAt string `json:"created_at"`
+ Creator string `json:"creator"`
+ CreatorId string `json:"creator_id"`
+ Description string `json:"description"`
+ IsDirty bool `json:"is_dirty"`
+ Name string `json:"name"`
+ SerializedSourceGuild string `json:"serialized_source_guild"`
+ SourceGuildId string `json:"source_guild_id"`
+ UpdatedAt string `json:"updated_at"`
+ UsageCount int `json:"usage_count"`
+}
+
+type GuildTemplateRoleColorsResponse struct {
+ PrimaryColor int `json:"primary_color"`
+ SecondaryColor int `json:"secondary_color"`
+ TertiaryColor int `json:"tertiary_color"`
+}
+
+type GuildTemplateRoleResponse struct {
+ Color int `json:"color"`
+ Colors string `json:"colors"`
+ Hoist bool `json:"hoist"`
+ Icon string `json:"icon"`
+ Id int `json:"id"`
+ Mentionable bool `json:"mentionable"`
+ Name string `json:"name"`
+ Permissions string `json:"permissions"`
+ UnicodeEmoji string `json:"unicode_emoji"`
+}
+
+type GuildTemplateSnapshotResponse struct {
+ AfkChannelId string `json:"afk_channel_id"`
+ AfkTimeout int `json:"afk_timeout"`
+ Channels string `json:"channels"`
+ DefaultMessageNotifications int `json:"default_message_notifications"`
+ Description string `json:"description"`
+ ExplicitContentFilter int `json:"explicit_content_filter"`
+ Name string `json:"name"`
+ PreferredLocale string `json:"preferred_locale"`
+ Region string `json:"region"`
+ Roles string `json:"roles"`
+ SystemChannelFlags int `json:"system_channel_flags"`
+ SystemChannelId string `json:"system_channel_id"`
+ VerificationLevel int `json:"verification_level"`
+}
+
+type GuildWelcomeChannel struct {
+ ChannelId string `json:"channel_id"`
+ Description string `json:"description"`
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+}
+
+type GuildWelcomeScreenChannelResponse struct {
+ ChannelId string `json:"channel_id"`
+ Description string `json:"description"`
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+}
+
+type GuildWelcomeScreenResponse struct {
+ Description string `json:"description"`
+ WelcomeChannels string `json:"welcome_channels"`
+}
+
+type GuildWithCountsResponse struct {
+ AfkChannelId string `json:"afk_channel_id"`
+ AfkTimeout int `json:"afk_timeout"`
+ ApplicationId string `json:"application_id"`
+ ApproximateMemberCount int `json:"approximate_member_count"`
+ ApproximatePresenceCount int `json:"approximate_presence_count"`
+ Banner string `json:"banner"`
+ DefaultMessageNotifications int `json:"default_message_notifications"`
+ Description string `json:"description"`
+ DiscoverySplash string `json:"discovery_splash"`
+ Emojis string `json:"emojis"`
+ ExplicitContentFilter int `json:"explicit_content_filter"`
+ Features string `json:"features"`
+ HomeHeader string `json:"home_header"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ MaxMembers int `json:"max_members"`
+ MaxPresences int `json:"max_presences"`
+ MaxStageVideoChannelUsers int `json:"max_stage_video_channel_users"`
+ MaxVideoChannelUsers int `json:"max_video_channel_users"`
+ MfaLevel int `json:"mfa_level"`
+ Name string `json:"name"`
+ Nsfw bool `json:"nsfw"`
+ NsfwLevel int `json:"nsfw_level"`
+ OwnerId string `json:"owner_id"`
+ PreferredLocale string `json:"preferred_locale"`
+ PremiumProgressBarEnabled bool `json:"premium_progress_bar_enabled"`
+ PremiumProgressBarEnabledUserUpdatedAt string `json:"premium_progress_bar_enabled_user_updated_at"`
+ PremiumSubscriptionCount int `json:"premium_subscription_count"`
+ PremiumTier int `json:"premium_tier"`
+ PublicUpdatesChannelId string `json:"public_updates_channel_id"`
+ Region string `json:"region"`
+ Roles string `json:"roles"`
+ RulesChannelId string `json:"rules_channel_id"`
+ SafetyAlertsChannelId string `json:"safety_alerts_channel_id"`
+ Splash string `json:"splash"`
+ Stickers string `json:"stickers"`
+ SystemChannelFlags int `json:"system_channel_flags"`
+ SystemChannelId string `json:"system_channel_id"`
+ VanityUrlCode string `json:"vanity_url_code"`
+ VerificationLevel int `json:"verification_level"`
+ WidgetChannelId string `json:"widget_channel_id"`
+ WidgetEnabled bool `json:"widget_enabled"`
+}
+
+type IconEmojiResponse struct {
+}
+
+type IncomingWebhookInteractionRequest struct {
+ AllowedMentions string `json:"allowed_mentions"`
+ Attachments string `json:"attachments"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ Embeds string `json:"embeds"`
+ Flags int `json:"flags"`
+ Poll string `json:"poll"`
+ Tts bool `json:"tts"`
+}
+
+type IncomingWebhookRequestPartial struct {
+ AllowedMentions string `json:"allowed_mentions"`
+ AppliedTags string `json:"applied_tags"`
+ Attachments string `json:"attachments"`
+ AvatarUrl string `json:"avatar_url"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ Embeds string `json:"embeds"`
+ Flags int `json:"flags"`
+ Poll string `json:"poll"`
+ ThreadName string `json:"thread_name"`
+ Tts bool `json:"tts"`
+ Username string `json:"username"`
+}
+
+type IncomingWebhookUpdateForInteractionCallbackRequestPartial struct {
+ AllowedMentions string `json:"allowed_mentions"`
+ Attachments string `json:"attachments"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ Embeds string `json:"embeds"`
+ Flags int `json:"flags"`
+}
+
+type IncomingWebhookUpdateRequestPartial struct {
+ AllowedMentions string `json:"allowed_mentions"`
+ Attachments string `json:"attachments"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ Embeds string `json:"embeds"`
+ Flags int `json:"flags"`
+ Poll string `json:"poll"`
+}
+
+type InnerErrors struct {
+}
+
+type IntegrationApplicationResponse struct {
+ Bot string `json:"bot"`
+ CoverImage string `json:"cover_image"`
+ Description string `json:"description"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ PrimarySkuId string `json:"primary_sku_id"`
+ Type string `json:"type"`
+}
+
+type InteractionApplicationCommandAutocompleteCallbackIntegerData struct {
+ Choices string `json:"choices"`
+}
+
+type InteractionApplicationCommandAutocompleteCallbackNumberData struct {
+ Choices string `json:"choices"`
+}
+
+type InteractionApplicationCommandAutocompleteCallbackStringData struct {
+ Choices string `json:"choices"`
+}
+
+type InteractionCallbackResponse struct {
+ Interaction string `json:"interaction"`
+ Resource string `json:"resource"`
+}
+
+type InteractionResponse struct {
+ ChannelId string `json:"channel_id"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ ResponseMessageEphemeral bool `json:"response_message_ephemeral"`
+ ResponseMessageId string `json:"response_message_id"`
+ ResponseMessageLoading bool `json:"response_message_loading"`
+ Type int `json:"type"`
+}
+
+type InviteApplicationResponse struct {
+ Bot string `json:"bot"`
+ BotPublic bool `json:"bot_public"`
+ BotRequireCodeGrant bool `json:"bot_require_code_grant"`
+ CoverImage string `json:"cover_image"`
+ CustomInstallUrl string `json:"custom_install_url"`
+ Description string `json:"description"`
+ Flags int `json:"flags"`
+ GuildId string `json:"guild_id"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ InstallParams string `json:"install_params"`
+ IntegrationTypesConfig string `json:"integration_types_config"`
+ MaxParticipants int `json:"max_participants"`
+ Name string `json:"name"`
+ PrimarySkuId string `json:"primary_sku_id"`
+ PrivacyPolicyUrl string `json:"privacy_policy_url"`
+ RpcOrigins string `json:"rpc_origins"`
+ Slug string `json:"slug"`
+ Tags string `json:"tags"`
+ TermsOfServiceUrl string `json:"terms_of_service_url"`
+ Type string `json:"type"`
+ VerifyKey string `json:"verify_key"`
+}
+
+type InviteChannelRecipientResponse struct {
+ Username string `json:"username"`
+}
+
+type InviteChannelResponse struct {
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Recipients string `json:"recipients"`
+ Type int `json:"type"`
+}
+
+type InviteGuildResponse struct {
+ Banner string `json:"banner"`
+ Description string `json:"description"`
+ Features string `json:"features"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Nsfw bool `json:"nsfw"`
+ NsfwLevel string `json:"nsfw_level"`
+ PremiumSubscriptionCount int `json:"premium_subscription_count"`
+ Splash string `json:"splash"`
+ VanityUrlCode string `json:"vanity_url_code"`
+ VerificationLevel string `json:"verification_level"`
+}
+
+type InviteGuildRoleResponse struct {
+ Color int `json:"color"`
+ Colors string `json:"colors"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Permissions string `json:"permissions"`
+ Position int `json:"position"`
+ UnicodeEmoji string `json:"unicode_emoji"`
+}
+
+type KeywordRuleResponse struct {
+ Actions string `json:"actions"`
+ CreatorId string `json:"creator_id"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type KeywordTriggerMetadata struct {
+ AllowList string `json:"allow_list"`
+ KeywordFilter string `json:"keyword_filter"`
+ RegexPatterns string `json:"regex_patterns"`
+}
+
+type KeywordTriggerMetadataResponse struct {
+ AllowList string `json:"allow_list"`
+ KeywordFilter string `json:"keyword_filter"`
+ RegexPatterns string `json:"regex_patterns"`
+}
+
+type KeywordUpsertRequest struct {
+ Actions string `json:"actions"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type KeywordUpsertRequestPartial struct {
+ Actions string `json:"actions"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type LabelComponentForModalRequest struct {
+ Component string `json:"component"`
+ Description string `json:"description"`
+ Id int `json:"id"`
+ Label string `json:"label"`
+ Type int `json:"type"`
+}
+
+type LaunchActivityInteractionCallbackRequest struct {
+ Type int `json:"type"`
+}
+
+type LaunchActivityInteractionCallbackResponse struct {
+ Type int `json:"type"`
+}
+
+type ListApplicationEmojisResponse struct {
+ Items string `json:"items"`
+}
+
+type ListGuildSoundboardSoundsResponse struct {
+ Items string `json:"items"`
+}
+
+type LobbyGuildInviteResponse struct {
+ Code string `json:"code"`
+}
+
+type LobbyMemberRequest struct {
+ Flags string `json:"flags"`
+ Id string `json:"id"`
+ Metadata string `json:"metadata"`
+}
+
+type LobbyMemberResponse struct {
+ Flags int `json:"flags"`
+ Id string `json:"id"`
+ Metadata string `json:"metadata"`
+}
+
+type LobbyMessageResponse struct {
+ ApplicationId string `json:"application_id"`
+ Author string `json:"author"`
+ ChannelId string `json:"channel_id"`
+ Content string `json:"content"`
+ Flags int `json:"flags"`
+ Id string `json:"id"`
+ LobbyId string `json:"lobby_id"`
+ Metadata string `json:"metadata"`
+ ModerationMetadata string `json:"moderation_metadata"`
+ Type int `json:"type"`
+}
+
+type LobbyResponse struct {
+ ApplicationId string `json:"application_id"`
+ Flags int `json:"flags"`
+ Id string `json:"id"`
+ LinkedChannel string `json:"linked_channel"`
+ Members string `json:"members"`
+ Metadata string `json:"metadata"`
+ OverrideEventWebhooksUrl string `json:"override_event_webhooks_url"`
+}
+
+type MLSpamRuleResponse struct {
+ Actions string `json:"actions"`
+ CreatorId string `json:"creator_id"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type MLSpamTriggerMetadata struct {
+}
+
+type MLSpamTriggerMetadataResponse struct {
+}
+
+type MLSpamUpsertRequest struct {
+ Actions string `json:"actions"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type MLSpamUpsertRequestPartial struct {
+ Actions string `json:"actions"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type MediaGalleryComponentForMessageRequest struct {
+ Id int `json:"id"`
+ Items string `json:"items"`
+ Type int `json:"type"`
+}
+
+type MediaGalleryComponentResponse struct {
+ Id int `json:"id"`
+ Items string `json:"items"`
+ Type int `json:"type"`
+}
+
+type MediaGalleryItemRequest struct {
+ Description string `json:"description"`
+ Media string `json:"media"`
+ Spoiler bool `json:"spoiler"`
+}
+
+type MediaGalleryItemResponse struct {
+ Description string `json:"description"`
+ Media string `json:"media"`
+ Spoiler bool `json:"spoiler"`
+}
+
+type MentionSpamRuleResponse struct {
+ Actions string `json:"actions"`
+ CreatorId string `json:"creator_id"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type MentionSpamTriggerMetadata struct {
+ MentionRaidProtectionEnabled bool `json:"mention_raid_protection_enabled"`
+ MentionTotalLimit int `json:"mention_total_limit"`
+}
+
+type MentionSpamTriggerMetadataResponse struct {
+ MentionRaidProtectionEnabled bool `json:"mention_raid_protection_enabled"`
+ MentionTotalLimit int `json:"mention_total_limit"`
+}
+
+type MentionSpamUpsertRequest struct {
+ Actions string `json:"actions"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type MentionSpamUpsertRequestPartial struct {
+ Actions string `json:"actions"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type MentionableSelectComponentForMessageRequest struct {
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type MentionableSelectComponentForModalRequest struct {
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type MentionableSelectComponentResponse struct {
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Type int `json:"type"`
+}
+
+type MessageActivityResponse struct {
+}
+
+type MessageAllowedMentionsRequest struct {
+ Parse string `json:"parse"`
+ RepliedUser bool `json:"replied_user"`
+ Roles string `json:"roles"`
+ Users string `json:"users"`
+}
+
+type MessageAttachmentRequest struct {
+ Description string `json:"description"`
+ DurationSecs float64 `json:"duration_secs"`
+ Filename string `json:"filename"`
+ Id string `json:"id"`
+ IsRemix bool `json:"is_remix"`
+ Title string `json:"title"`
+ Waveform string `json:"waveform"`
+}
+
+type MessageAttachmentResponse struct {
+ Application string `json:"application"`
+ ClipCreatedAt string `json:"clip_created_at"`
+ ClipParticipants string `json:"clip_participants"`
+ ContentType string `json:"content_type"`
+ Description string `json:"description"`
+ DurationSecs float64 `json:"duration_secs"`
+ Ephemeral bool `json:"ephemeral"`
+ Filename string `json:"filename"`
+ Height int `json:"height"`
+ Id string `json:"id"`
+ ProxyUrl string `json:"proxy_url"`
+ Size int `json:"size"`
+ Title string `json:"title"`
+ Url string `json:"url"`
+ Waveform string `json:"waveform"`
+ Width int `json:"width"`
+}
+
+type MessageCallResponse struct {
+ EndedTimestamp string `json:"ended_timestamp"`
+ Participants string `json:"participants"`
+}
+
+type MessageComponentInteractionMetadataResponse struct {
+ AuthorizingIntegrationOwners string `json:"authorizing_integration_owners"`
+ Id string `json:"id"`
+ InteractedMessageId string `json:"interacted_message_id"`
+ OriginalResponseMessageId string `json:"original_response_message_id"`
+ Type int `json:"type"`
+ User string `json:"user"`
+}
+
+type MessageCreateRequest struct {
+ AllowedMentions string `json:"allowed_mentions"`
+ Attachments string `json:"attachments"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ Embeds string `json:"embeds"`
+ EnforceNonce bool `json:"enforce_nonce"`
+ Flags int `json:"flags"`
+ MessageReference string `json:"message_reference"`
+ Nonce string `json:"nonce"`
+ Poll string `json:"poll"`
+ SharedClientTheme string `json:"shared_client_theme"`
+ StickerIds string `json:"sticker_ids"`
+ Tts bool `json:"tts"`
+}
+
+type MessageEditRequestPartial struct {
+ AllowedMentions string `json:"allowed_mentions"`
+ Attachments string `json:"attachments"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ Embeds string `json:"embeds"`
+ Flags int `json:"flags"`
+ StickerIds string `json:"sticker_ids"`
+}
+
+type MessageEmbedAuthorResponse struct {
+ IconUrl string `json:"icon_url"`
+ Name string `json:"name"`
+ ProxyIconUrl string `json:"proxy_icon_url"`
+ Url string `json:"url"`
+}
+
+type MessageEmbedFieldResponse struct {
+ Inline bool `json:"inline"`
+ Name string `json:"name"`
+ Value string `json:"value"`
+}
+
+type MessageEmbedFooterResponse struct {
+ IconUrl string `json:"icon_url"`
+ ProxyIconUrl string `json:"proxy_icon_url"`
+ Text string `json:"text"`
+}
+
+type MessageEmbedImageResponse struct {
+ ContentType string `json:"content_type"`
+ Description string `json:"description"`
+ Flags int `json:"flags"`
+ Height int `json:"height"`
+ Placeholder string `json:"placeholder"`
+ PlaceholderVersion int `json:"placeholder_version"`
+ ProxyUrl string `json:"proxy_url"`
+ Url string `json:"url"`
+ Width int `json:"width"`
+}
+
+type MessageEmbedProviderResponse struct {
+ Name string `json:"name"`
+ Url string `json:"url"`
+}
+
+type MessageEmbedResponse struct {
+ Author string `json:"author"`
+ Color int `json:"color"`
+ Description string `json:"description"`
+ Fields string `json:"fields"`
+ Footer string `json:"footer"`
+ Image string `json:"image"`
+ Provider string `json:"provider"`
+ Thumbnail string `json:"thumbnail"`
+ Timestamp string `json:"timestamp"`
+ Title string `json:"title"`
+ Type string `json:"type"`
+ Url string `json:"url"`
+ Video string `json:"video"`
+}
+
+type MessageEmbedVideoResponse struct {
+ ContentType string `json:"content_type"`
+ Description string `json:"description"`
+ Flags int `json:"flags"`
+ Height int `json:"height"`
+ Placeholder string `json:"placeholder"`
+ PlaceholderVersion int `json:"placeholder_version"`
+ ProxyUrl string `json:"proxy_url"`
+ Url string `json:"url"`
+ Width int `json:"width"`
+}
+
+type MessageInteractionResponse struct {
+ Id string `json:"id"`
+ Name string `json:"name"`
+ NameLocalized string `json:"name_localized"`
+ Type int `json:"type"`
+ User string `json:"user"`
+}
+
+type MessageMentionChannelResponse struct {
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Type int `json:"type"`
+}
+
+type MessageReactionCountDetailsResponse struct {
+ Burst int `json:"burst"`
+ Normal int `json:"normal"`
+}
+
+type MessageReactionEmojiResponse struct {
+ Animated bool `json:"animated"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type MessageReactionResponse struct {
+ BurstColors string `json:"burst_colors"`
+ Count int `json:"count"`
+ CountDetails string `json:"count_details"`
+ Emoji string `json:"emoji"`
+ Me bool `json:"me"`
+ MeBurst bool `json:"me_burst"`
+}
+
+type MessageReferenceRequest struct {
+ ChannelId string `json:"channel_id"`
+ FailIfNotExists bool `json:"fail_if_not_exists"`
+ GuildId string `json:"guild_id"`
+ MessageId string `json:"message_id"`
+ Type string `json:"type"`
+}
+
+type MessageReferenceResponse struct {
+ ChannelId string `json:"channel_id"`
+ GuildId string `json:"guild_id"`
+ MessageId string `json:"message_id"`
+ Type int `json:"type"`
+}
+
+type MessageResponse struct {
+ Activity string `json:"activity"`
+ Application string `json:"application"`
+ ApplicationId string `json:"application_id"`
+ Attachments string `json:"attachments"`
+ Author string `json:"author"`
+ Call string `json:"call"`
+ ChannelId string `json:"channel_id"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ EditedTimestamp string `json:"edited_timestamp"`
+ Embeds string `json:"embeds"`
+ Flags int `json:"flags"`
+ Id string `json:"id"`
+ Interaction string `json:"interaction"`
+ InteractionMetadata string `json:"interaction_metadata"`
+ MentionChannels string `json:"mention_channels"`
+ MentionEveryone bool `json:"mention_everyone"`
+ MentionRoles string `json:"mention_roles"`
+ Mentions string `json:"mentions"`
+ MessageReference string `json:"message_reference"`
+ MessageSnapshots string `json:"message_snapshots"`
+ Nonce string `json:"nonce"`
+ Pinned bool `json:"pinned"`
+ Poll string `json:"poll"`
+ Position int `json:"position"`
+ PurchaseNotification string `json:"purchase_notification"`
+ Reactions string `json:"reactions"`
+ ReferencedMessage string `json:"referenced_message"`
+ Resolved string `json:"resolved"`
+ RoleSubscriptionData string `json:"role_subscription_data"`
+ SharedClientTheme string `json:"shared_client_theme"`
+ StickerItems string `json:"sticker_items"`
+ Stickers string `json:"stickers"`
+ Thread string `json:"thread"`
+ Timestamp string `json:"timestamp"`
+ Tts bool `json:"tts"`
+ Type int `json:"type"`
+ WebhookId string `json:"webhook_id"`
+}
+
+type MessageRoleSubscriptionDataResponse struct {
+ IsRenewal bool `json:"is_renewal"`
+ RoleSubscriptionListingId string `json:"role_subscription_listing_id"`
+ TierName string `json:"tier_name"`
+ TotalMonthsSubscribed int `json:"total_months_subscribed"`
+}
+
+type MessageSnapshotResponse struct {
+ Message string `json:"message"`
+}
+
+type MessageStickerItemResponse struct {
+ FormatType int `json:"format_type"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type MinimalContentMessageResponse struct {
+ Attachments string `json:"attachments"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ EditedTimestamp string `json:"edited_timestamp"`
+ Embeds string `json:"embeds"`
+ Flags int `json:"flags"`
+ MentionRoles string `json:"mention_roles"`
+ Mentions string `json:"mentions"`
+ StickerItems string `json:"sticker_items"`
+ Stickers string `json:"stickers"`
+ Timestamp string `json:"timestamp"`
+ Type int `json:"type"`
+}
+
+type ModalInteractionCallbackRequest struct {
+ Data string `json:"data"`
+ Type int `json:"type"`
+}
+
+type ModalInteractionCallbackRequestData struct {
+ Components string `json:"components"`
+ CustomId string `json:"custom_id"`
+ Title string `json:"title"`
+}
+
+type ModalSubmitInteractionMetadataResponse struct {
+ AuthorizingIntegrationOwners string `json:"authorizing_integration_owners"`
+ Id string `json:"id"`
+ OriginalResponseMessageId string `json:"original_response_message_id"`
+ TriggeringInteractionMetadata string `json:"triggering_interaction_metadata"`
+ Type int `json:"type"`
+ User string `json:"user"`
+}
+
+type MyGuildResponse struct {
+ ApproximateMemberCount int `json:"approximate_member_count"`
+ ApproximatePresenceCount int `json:"approximate_presence_count"`
+ Banner string `json:"banner"`
+ Features string `json:"features"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Owner bool `json:"owner"`
+ Permissions string `json:"permissions"`
+}
+
+type NewMemberActionResponse struct {
+ ActionType int `json:"action_type"`
+ ChannelId string `json:"channel_id"`
+ Description string `json:"description"`
+ Emoji string `json:"emoji"`
+ Icon string `json:"icon"`
+ Title string `json:"title"`
+}
+
+type OAuth2GetAuthorizationResponse struct {
+ Application string `json:"application"`
+ Expires string `json:"expires"`
+ Scopes string `json:"scopes"`
+ User string `json:"user"`
+}
+
+type OAuth2GetKeys struct {
+ Keys string `json:"keys"`
+}
+
+type OAuth2GetOpenIDConnectUserInfoResponse struct {
+ Email string `json:"email"`
+ EmailVerified bool `json:"email_verified"`
+ Locale string `json:"locale"`
+ Nickname string `json:"nickname"`
+ Picture string `json:"picture"`
+ PreferredUsername string `json:"preferred_username"`
+ Sub string `json:"sub"`
+}
+
+type OAuth2Key struct {
+ Alg string `json:"alg"`
+ E string `json:"e"`
+ Kid string `json:"kid"`
+ Kty string `json:"kty"`
+ N string `json:"n"`
+ Use string `json:"use"`
+}
+
+type OnboardingPromptOptionRequest struct {
+ ChannelIds string `json:"channel_ids"`
+ Description string `json:"description"`
+ EmojiAnimated bool `json:"emoji_animated"`
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+ Id string `json:"id"`
+ RoleIds string `json:"role_ids"`
+ Title string `json:"title"`
+}
+
+type OnboardingPromptOptionResponse struct {
+ ChannelIds string `json:"channel_ids"`
+ Description string `json:"description"`
+ Emoji string `json:"emoji"`
+ Id string `json:"id"`
+ RoleIds string `json:"role_ids"`
+ Title string `json:"title"`
+}
+
+type OnboardingPromptResponse struct {
+ Id string `json:"id"`
+ InOnboarding bool `json:"in_onboarding"`
+ Options string `json:"options"`
+ Required bool `json:"required"`
+ SingleSelect bool `json:"single_select"`
+ Title string `json:"title"`
+ Type int `json:"type"`
+}
+
+type PartialDiscordIntegrationResponse struct {
+ Account string `json:"account"`
+ ApplicationId string `json:"application_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Type string `json:"type"`
+}
+
+type PartialExternalConnectionIntegrationResponse struct {
+ Account string `json:"account"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Type string `json:"type"`
+}
+
+type PartialGuildSubscriptionIntegrationResponse struct {
+ Account string `json:"account"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Type string `json:"type"`
+}
+
+type PinnedMessageResponse struct {
+ Message string `json:"message"`
+ PinnedAt string `json:"pinned_at"`
+}
+
+type PinnedMessagesResponse struct {
+ HasMore bool `json:"has_more"`
+ Items string `json:"items"`
+}
+
+type PollAnswerCreateRequest struct {
+ PollMedia string `json:"poll_media"`
+}
+
+type PollAnswerDetailsResponse struct {
+ Users string `json:"users"`
+}
+
+type PollAnswerResponse struct {
+ AnswerId int `json:"answer_id"`
+ PollMedia string `json:"poll_media"`
+}
+
+type PollCreateRequest struct {
+ AllowMultiselect bool `json:"allow_multiselect"`
+ Answers string `json:"answers"`
+ Duration int `json:"duration"`
+ LayoutType string `json:"layout_type"`
+ Question string `json:"question"`
+}
+
+type PollEmoji struct {
+ Animated bool `json:"animated"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type PollEmojiCreateRequest struct {
+ Animated bool `json:"animated"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type PollMedia struct {
+ Emoji string `json:"emoji"`
+ Text string `json:"text"`
+}
+
+type PollMediaCreateRequest struct {
+ Emoji string `json:"emoji"`
+ Text string `json:"text"`
+}
+
+type PollMediaResponse struct {
+ Emoji string `json:"emoji"`
+ Text string `json:"text"`
+}
+
+type PollResponse struct {
+ AllowMultiselect bool `json:"allow_multiselect"`
+ Answers string `json:"answers"`
+ Expiry string `json:"expiry"`
+ LayoutType int `json:"layout_type"`
+ Question string `json:"question"`
+ Results string `json:"results"`
+}
+
+type PollResultsEntryResponse struct {
+ Count int `json:"count"`
+ Id int `json:"id"`
+ MeVoted bool `json:"me_voted"`
+}
+
+type PollResultsResponse struct {
+ AnswerCounts string `json:"answer_counts"`
+ IsFinalized bool `json:"is_finalized"`
+}
+
+type PongInteractionCallbackRequest struct {
+ Type int `json:"type"`
+}
+
+type PrivateApplicationResponse struct {
+ ApproximateGuildCount int `json:"approximate_guild_count"`
+ ApproximateUserAuthorizationCount int `json:"approximate_user_authorization_count"`
+ ApproximateUserInstallCount int `json:"approximate_user_install_count"`
+ Bot string `json:"bot"`
+ BotPublic bool `json:"bot_public"`
+ BotRequireCodeGrant bool `json:"bot_require_code_grant"`
+ CoverImage string `json:"cover_image"`
+ CustomInstallUrl string `json:"custom_install_url"`
+ Description string `json:"description"`
+ ExplicitContentFilter int `json:"explicit_content_filter"`
+ Flags int `json:"flags"`
+ GuildId string `json:"guild_id"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ InstallParams string `json:"install_params"`
+ IntegrationTypesConfig string `json:"integration_types_config"`
+ InteractionsEndpointUrl string `json:"interactions_endpoint_url"`
+ MaxParticipants int `json:"max_participants"`
+ Name string `json:"name"`
+ Owner string `json:"owner"`
+ PrimarySkuId string `json:"primary_sku_id"`
+ PrivacyPolicyUrl string `json:"privacy_policy_url"`
+ RedirectUris string `json:"redirect_uris"`
+ RoleConnectionsVerificationUrl string `json:"role_connections_verification_url"`
+ RpcOrigins string `json:"rpc_origins"`
+ Slug string `json:"slug"`
+ Tags string `json:"tags"`
+ Team string `json:"team"`
+ TermsOfServiceUrl string `json:"terms_of_service_url"`
+ Type string `json:"type"`
+ VerifyKey string `json:"verify_key"`
+}
+
+type PrivateChannelLocation struct {
+ ChannelId string `json:"channel_id"`
+ Id string `json:"id"`
+ Kind string `json:"kind"`
+}
+
+type PrivateChannelResponse struct {
+ Flags int `json:"flags"`
+ Id string `json:"id"`
+ LastMessageId string `json:"last_message_id"`
+ LastPinTimestamp string `json:"last_pin_timestamp"`
+ Recipients string `json:"recipients"`
+ Type int `json:"type"`
+}
+
+type PrivateGroupChannelResponse struct {
+ ApplicationId string `json:"application_id"`
+ Flags int `json:"flags"`
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ LastMessageId string `json:"last_message_id"`
+ LastPinTimestamp string `json:"last_pin_timestamp"`
+ Managed bool `json:"managed"`
+ Name string `json:"name"`
+ OwnerId string `json:"owner_id"`
+ Recipients string `json:"recipients"`
+ Type int `json:"type"`
+}
+
+type PrivateGuildMemberResponse struct {
+ Avatar string `json:"avatar"`
+ AvatarDecorationData string `json:"avatar_decoration_data"`
+ Banner string `json:"banner"`
+ Collectibles string `json:"collectibles"`
+ CommunicationDisabledUntil string `json:"communication_disabled_until"`
+ Deaf bool `json:"deaf"`
+ Flags int `json:"flags"`
+ JoinedAt string `json:"joined_at"`
+ Mute bool `json:"mute"`
+ Nick string `json:"nick"`
+ Pending bool `json:"pending"`
+ Permissions string `json:"permissions"`
+ PremiumSince string `json:"premium_since"`
+ Roles string `json:"roles"`
+ User string `json:"user"`
+}
+
+type ProvisionalTokenResponse struct {
+ AccessToken string `json:"access_token"`
+ ExpiresAtS int `json:"expires_at_s"`
+ ExpiresIn int `json:"expires_in"`
+ IdToken string `json:"id_token"`
+ RefreshToken string `json:"refresh_token"`
+ Scope string `json:"scope"`
+ Scopes string `json:"scopes"`
+ TokenType string `json:"token_type"`
+}
+
+type PruneGuildRequest struct {
+ ComputePruneCount bool `json:"compute_prune_count"`
+ Days int `json:"days"`
+ IncludeRoles string `json:"include_roles"`
+}
+
+type PurchaseNotificationResponse struct {
+ GuildProductPurchase string `json:"guild_product_purchase"`
+ Type int `json:"type"`
+}
+
+type QuarantineUserAction struct {
+ Metadata string `json:"metadata"`
+ Type int `json:"type"`
+}
+
+type QuarantineUserActionMetadata struct {
+}
+
+type QuarantineUserActionMetadataResponse struct {
+}
+
+type QuarantineUserActionResponse struct {
+ Metadata string `json:"metadata"`
+ Type int `json:"type"`
+}
+
+type RadioGroupComponentForModalRequest struct {
+ CustomId string `json:"custom_id"`
+ Id int `json:"id"`
+ Options string `json:"options"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type RadioGroupOptionForRequest struct {
+ Default bool `json:"default"`
+ Description string `json:"description"`
+ Label string `json:"label"`
+ Value string `json:"value"`
+}
+
+type RatelimitedResponse struct {
+ Code int `json:"code"`
+ Global bool `json:"global"`
+ Message string `json:"message"`
+ RetryAfter float64 `json:"retry_after"`
+}
+
+type ResolvedObjectsResponse struct {
+ Channels string `json:"channels"`
+ Members string `json:"members"`
+ Roles string `json:"roles"`
+ Users string `json:"users"`
+}
+
+type ResourceChannelResponse struct {
+ ChannelId string `json:"channel_id"`
+ Description string `json:"description"`
+ Emoji string `json:"emoji"`
+ Icon string `json:"icon"`
+ Title string `json:"title"`
+}
+
+type RichEmbed struct {
+ Author string `json:"author"`
+ Color int `json:"color"`
+ Description string `json:"description"`
+ Fields string `json:"fields"`
+ Footer string `json:"footer"`
+ Image string `json:"image"`
+ Provider string `json:"provider"`
+ Thumbnail string `json:"thumbnail"`
+ Timestamp string `json:"timestamp"`
+ Title string `json:"title"`
+ Type string `json:"type"`
+ Url string `json:"url"`
+ Video string `json:"video"`
+}
+
+type RichEmbedAuthor struct {
+ IconUrl string `json:"icon_url"`
+ Name string `json:"name"`
+ Url string `json:"url"`
+}
+
+type RichEmbedField struct {
+ Inline bool `json:"inline"`
+ Name string `json:"name"`
+ Value string `json:"value"`
+}
+
+type RichEmbedFooter struct {
+ IconUrl string `json:"icon_url"`
+ Text string `json:"text"`
+}
+
+type RichEmbedImage struct {
+ Description string `json:"description"`
+ Height int `json:"height"`
+ IsAnimated bool `json:"is_animated"`
+ Placeholder string `json:"placeholder"`
+ PlaceholderVersion int `json:"placeholder_version"`
+ Url string `json:"url"`
+ Width int `json:"width"`
+}
+
+type RichEmbedProvider struct {
+ Name string `json:"name"`
+ Url string `json:"url"`
+}
+
+type RichEmbedThumbnail struct {
+ Description string `json:"description"`
+ Height int `json:"height"`
+ IsAnimated bool `json:"is_animated"`
+ Placeholder string `json:"placeholder"`
+ PlaceholderVersion int `json:"placeholder_version"`
+ Url string `json:"url"`
+ Width int `json:"width"`
+}
+
+type RichEmbedVideo struct {
+ Description string `json:"description"`
+ Height int `json:"height"`
+ IsAnimated bool `json:"is_animated"`
+ Placeholder string `json:"placeholder"`
+ PlaceholderVersion int `json:"placeholder_version"`
+ Url string `json:"url"`
+ Width int `json:"width"`
+}
+
+type RoleColors struct {
+ PrimaryColor int `json:"primary_color"`
+ SecondaryColor int `json:"secondary_color"`
+ TertiaryColor int `json:"tertiary_color"`
+}
+
+type RoleSelectComponentForMessageRequest struct {
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type RoleSelectComponentForModalRequest struct {
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type RoleSelectComponentResponse struct {
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Type int `json:"type"`
+}
+
+type RoleSelectDefaultValue struct {
+ Id string `json:"id"`
+ Type string `json:"type"`
+}
+
+type RoleSelectDefaultValueResponse struct {
+ Id string `json:"id"`
+ Type string `json:"type"`
+}
+
+type SDKMessageRequest struct {
+ AllowedMentions string `json:"allowed_mentions"`
+ Attachments string `json:"attachments"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ Embeds string `json:"embeds"`
+ EnforceNonce bool `json:"enforce_nonce"`
+ Flags int `json:"flags"`
+ MessageReference string `json:"message_reference"`
+ Nonce string `json:"nonce"`
+ Poll string `json:"poll"`
+ SharedClientTheme string `json:"shared_client_theme"`
+ StickerIds string `json:"sticker_ids"`
+ Tts bool `json:"tts"`
+}
+
+type ScheduledEventResponse struct {
+ ChannelId string `json:"channel_id"`
+ Creator string `json:"creator"`
+ CreatorId string `json:"creator_id"`
+ Description string `json:"description"`
+ EntityId string `json:"entity_id"`
+ EntityType int `json:"entity_type"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Image string `json:"image"`
+ Name string `json:"name"`
+ PrivacyLevel int `json:"privacy_level"`
+ ScheduledEndTime string `json:"scheduled_end_time"`
+ ScheduledStartTime string `json:"scheduled_start_time"`
+ Status int `json:"status"`
+ UserCount int `json:"user_count"`
+ UserRsvp string `json:"user_rsvp"`
+}
+
+type ScheduledEventUserResponse struct {
+ GuildScheduledEventId string `json:"guild_scheduled_event_id"`
+ Member string `json:"member"`
+ User string `json:"user"`
+ UserId string `json:"user_id"`
+}
+
+type SearchIndexNotReadyResponse struct {
+ Code int `json:"code"`
+ DocumentsIndexed int `json:"documents_indexed"`
+ Message string `json:"message"`
+ RetryAfter int `json:"retry_after"`
+}
+
+type SearchMessageResponse struct {
+ Activity string `json:"activity"`
+ Application string `json:"application"`
+ ApplicationId string `json:"application_id"`
+ Attachments string `json:"attachments"`
+ Author string `json:"author"`
+ Call string `json:"call"`
+ ChannelId string `json:"channel_id"`
+ Components string `json:"components"`
+ Content string `json:"content"`
+ EditedTimestamp string `json:"edited_timestamp"`
+ Embeds string `json:"embeds"`
+ Flags int `json:"flags"`
+ Hit bool `json:"hit"`
+ Id string `json:"id"`
+ Interaction string `json:"interaction"`
+ InteractionMetadata string `json:"interaction_metadata"`
+ MentionChannels string `json:"mention_channels"`
+ MentionEveryone bool `json:"mention_everyone"`
+ MentionRoles string `json:"mention_roles"`
+ Mentions string `json:"mentions"`
+ MessageReference string `json:"message_reference"`
+ MessageSnapshots string `json:"message_snapshots"`
+ Nonce string `json:"nonce"`
+ Pinned bool `json:"pinned"`
+ Poll string `json:"poll"`
+ Position int `json:"position"`
+ PurchaseNotification string `json:"purchase_notification"`
+ Reactions string `json:"reactions"`
+ ReferencedMessage string `json:"referenced_message"`
+ Resolved string `json:"resolved"`
+ RoleSubscriptionData string `json:"role_subscription_data"`
+ SharedClientTheme string `json:"shared_client_theme"`
+ StickerItems string `json:"sticker_items"`
+ Stickers string `json:"stickers"`
+ Thread string `json:"thread"`
+ Timestamp string `json:"timestamp"`
+ Tts bool `json:"tts"`
+ Type int `json:"type"`
+ WebhookId string `json:"webhook_id"`
+}
+
+type SectionComponentForMessageRequest struct {
+ Accessory string `json:"accessory"`
+ Components string `json:"components"`
+ Id int `json:"id"`
+ Type int `json:"type"`
+}
+
+type SectionComponentResponse struct {
+ Accessory string `json:"accessory"`
+ Components string `json:"components"`
+ Id int `json:"id"`
+ Type int `json:"type"`
+}
+
+type SeparatorComponentForMessageRequest struct {
+ Divider bool `json:"divider"`
+ Id int `json:"id"`
+ Spacing string `json:"spacing"`
+ Type int `json:"type"`
+}
+
+type SeparatorComponentResponse struct {
+ Divider bool `json:"divider"`
+ Id int `json:"id"`
+ Spacing int `json:"spacing"`
+ Type int `json:"type"`
+}
+
+type SettingsEmojiResponse struct {
+ Animated bool `json:"animated"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type SlackWebhook struct {
+ Attachments string `json:"attachments"`
+ IconUrl string `json:"icon_url"`
+ Text string `json:"text"`
+ Username string `json:"username"`
+}
+
+type SocialLayerSKUPurchaseEligibilityCallbackData struct {
+ Eligible bool `json:"eligible"`
+ IneligibleReason string `json:"ineligible_reason"`
+ IneligibleReasonDescription string `json:"ineligible_reason_description"`
+}
+
+type SocialLayerSKUPurchaseEligibilityInteractionCallbackRequest struct {
+ Data string `json:"data"`
+ Type int `json:"type"`
+}
+
+type SoundboardCreateRequest struct {
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+ Name string `json:"name"`
+ Sound string `json:"sound"`
+ Volume float64 `json:"volume"`
+}
+
+type SoundboardPatchRequestPartial struct {
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+ Name string `json:"name"`
+ Volume float64 `json:"volume"`
+}
+
+type SoundboardSoundResponse struct {
+ Available bool `json:"available"`
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+ GuildId string `json:"guild_id"`
+ Name string `json:"name"`
+ SoundId string `json:"sound_id"`
+ User string `json:"user"`
+ Volume float64 `json:"volume"`
+}
+
+type SoundboardSoundSendRequest struct {
+ SoundId string `json:"sound_id"`
+ SourceGuildId string `json:"source_guild_id"`
+}
+
+type SpamLinkRuleResponse struct {
+ Actions string `json:"actions"`
+ CreatorId string `json:"creator_id"`
+ Enabled bool `json:"enabled"`
+ EventType int `json:"event_type"`
+ ExemptChannels string `json:"exempt_channels"`
+ ExemptRoles string `json:"exempt_roles"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ TriggerMetadata string `json:"trigger_metadata"`
+ TriggerType int `json:"trigger_type"`
+}
+
+type SpamLinkTriggerMetadataResponse struct {
+}
+
+type StageInstanceResponse struct {
+ ChannelId string `json:"channel_id"`
+ DiscoverableDisabled bool `json:"discoverable_disabled"`
+ GuildId string `json:"guild_id"`
+ GuildScheduledEventId string `json:"guild_scheduled_event_id"`
+ Id string `json:"id"`
+ PrivacyLevel int `json:"privacy_level"`
+ Topic string `json:"topic"`
+}
+
+type StageScheduledEventCreateRequest struct {
+ ChannelId string `json:"channel_id"`
+ Description string `json:"description"`
+ EntityMetadata string `json:"entity_metadata"`
+ EntityType int `json:"entity_type"`
+ Image string `json:"image"`
+ Name string `json:"name"`
+ PrivacyLevel int `json:"privacy_level"`
+ ScheduledEndTime string `json:"scheduled_end_time"`
+ ScheduledStartTime string `json:"scheduled_start_time"`
+}
+
+type StageScheduledEventPatchRequestPartial struct {
+ ChannelId string `json:"channel_id"`
+ Description string `json:"description"`
+ EntityMetadata string `json:"entity_metadata"`
+ EntityType string `json:"entity_type"`
+ Image string `json:"image"`
+ Name string `json:"name"`
+ PrivacyLevel int `json:"privacy_level"`
+ ScheduledEndTime string `json:"scheduled_end_time"`
+ ScheduledStartTime string `json:"scheduled_start_time"`
+ Status string `json:"status"`
+}
+
+type StageScheduledEventResponse struct {
+ ChannelId string `json:"channel_id"`
+ Creator string `json:"creator"`
+ CreatorId string `json:"creator_id"`
+ Description string `json:"description"`
+ EntityId string `json:"entity_id"`
+ EntityMetadata string `json:"entity_metadata"`
+ EntityType int `json:"entity_type"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Image string `json:"image"`
+ Name string `json:"name"`
+ PrivacyLevel int `json:"privacy_level"`
+ ScheduledEndTime string `json:"scheduled_end_time"`
+ ScheduledStartTime string `json:"scheduled_start_time"`
+ Status int `json:"status"`
+ UserCount int `json:"user_count"`
+ UserRsvp string `json:"user_rsvp"`
+}
+
+type StandardStickerResponse struct {
+ Description string `json:"description"`
+ FormatType string `json:"format_type"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ PackId string `json:"pack_id"`
+ SortValue int `json:"sort_value"`
+ Tags string `json:"tags"`
+ Type int `json:"type"`
+}
+
+type StickerPackCollectionResponse struct {
+ StickerPacks string `json:"sticker_packs"`
+}
+
+type StickerPackResponse struct {
+ BannerAssetId string `json:"banner_asset_id"`
+ CoverStickerId string `json:"cover_sticker_id"`
+ Description string `json:"description"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ SkuId string `json:"sku_id"`
+ Stickers string `json:"stickers"`
+}
+
+type StringSelectComponentForMessageRequest struct {
+ CustomId string `json:"custom_id"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Options string `json:"options"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type StringSelectComponentForModalRequest struct {
+ CustomId string `json:"custom_id"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Options string `json:"options"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type StringSelectComponentResponse struct {
+ CustomId string `json:"custom_id"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Options string `json:"options"`
+ Placeholder string `json:"placeholder"`
+ Type int `json:"type"`
+}
+
+type StringSelectOptionForRequest struct {
+ Default bool `json:"default"`
+ Description string `json:"description"`
+ Emoji string `json:"emoji"`
+ Label string `json:"label"`
+ Value string `json:"value"`
+}
+
+type StringSelectOptionResponse struct {
+ Default bool `json:"default"`
+ Description string `json:"description"`
+ Emoji string `json:"emoji"`
+ Label string `json:"label"`
+ Value string `json:"value"`
+}
+
+type TargetUsersJobStatusResponse struct {
+ CompletedAt string `json:"completed_at"`
+ CreatedAt string `json:"created_at"`
+ ErrorMessage string `json:"error_message"`
+ ProcessedUsers int `json:"processed_users"`
+ Status int `json:"status"`
+ TotalUsers int `json:"total_users"`
+}
+
+type TeamMemberResponse struct {
+ MembershipState int `json:"membership_state"`
+ TeamId string `json:"team_id"`
+ User string `json:"user"`
+}
+
+type TeamResponse struct {
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Members string `json:"members"`
+ Name string `json:"name"`
+ OwnerUserId string `json:"owner_user_id"`
+}
+
+type TextDisplayComponentForMessageRequest struct {
+ Content string `json:"content"`
+ Id int `json:"id"`
+ Type int `json:"type"`
+}
+
+type TextDisplayComponentForModalRequest struct {
+ Content string `json:"content"`
+ Id int `json:"id"`
+ Type int `json:"type"`
+}
+
+type TextDisplayComponentResponse struct {
+ Content string `json:"content"`
+ Id int `json:"id"`
+ Type int `json:"type"`
+}
+
+type TextInputComponentForModalRequest struct {
+ CustomId string `json:"custom_id"`
+ Id int `json:"id"`
+ Label string `json:"label"`
+ MaxLength int `json:"max_length"`
+ MinLength int `json:"min_length"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Style int `json:"style"`
+ Type int `json:"type"`
+ Value string `json:"value"`
+}
+
+type TextInputComponentResponse struct {
+ CustomId string `json:"custom_id"`
+ Id int `json:"id"`
+ Label string `json:"label"`
+ MaxLength int `json:"max_length"`
+ MinLength int `json:"min_length"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Style int `json:"style"`
+ Type int `json:"type"`
+ Value string `json:"value"`
+}
+
+type ThreadMemberResponse struct {
+ Flags int `json:"flags"`
+ Id string `json:"id"`
+ JoinTimestamp string `json:"join_timestamp"`
+ Member string `json:"member"`
+ UserId string `json:"user_id"`
+}
+
+type ThreadMetadataResponse struct {
+ ArchiveTimestamp string `json:"archive_timestamp"`
+ Archived bool `json:"archived"`
+ AutoArchiveDuration int `json:"auto_archive_duration"`
+ CreateTimestamp string `json:"create_timestamp"`
+ Invitable bool `json:"invitable"`
+ Locked bool `json:"locked"`
+}
+
+type ThreadResponse struct {
+ AppliedTags string `json:"applied_tags"`
+ Bitrate int `json:"bitrate"`
+ Flags int `json:"flags"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ LastMessageId string `json:"last_message_id"`
+ LastPinTimestamp string `json:"last_pin_timestamp"`
+ Member string `json:"member"`
+ MemberCount int `json:"member_count"`
+ MessageCount int `json:"message_count"`
+ Name string `json:"name"`
+ OwnerId string `json:"owner_id"`
+ ParentId string `json:"parent_id"`
+ Permissions string `json:"permissions"`
+ RateLimitPerUser int `json:"rate_limit_per_user"`
+ RtcRegion string `json:"rtc_region"`
+ ThreadMetadata string `json:"thread_metadata"`
+ TotalMessageSent int `json:"total_message_sent"`
+ Type int `json:"type"`
+ UserLimit int `json:"user_limit"`
+ VideoQualityMode int `json:"video_quality_mode"`
+}
+
+type ThreadSearchResponse struct {
+ FirstMessages string `json:"first_messages"`
+ HasMore bool `json:"has_more"`
+ Members string `json:"members"`
+ Threads string `json:"threads"`
+ TotalResults int `json:"total_results"`
+}
+
+type ThreadsResponse struct {
+ FirstMessages string `json:"first_messages"`
+ HasMore bool `json:"has_more"`
+ Members string `json:"members"`
+ Threads string `json:"threads"`
+}
+
+type ThumbnailComponentForMessageRequest struct {
+ Description string `json:"description"`
+ Id int `json:"id"`
+ Media string `json:"media"`
+ Spoiler bool `json:"spoiler"`
+ Type int `json:"type"`
+}
+
+type ThumbnailComponentResponse struct {
+ Description string `json:"description"`
+ Id int `json:"id"`
+ Media string `json:"media"`
+ Spoiler bool `json:"spoiler"`
+ Type int `json:"type"`
+}
+
+type TypingIndicatorResponse struct {
+}
+
+type UnbanUserFromGuildRequest struct {
+}
+
+type UnfurledMediaRequest struct {
+ Url string `json:"url"`
+}
+
+type UnfurledMediaRequestWithAttachmentReferenceRequired struct {
+ Url string `json:"url"`
+}
+
+type UnfurledMediaResponse struct {
+ AttachmentId string `json:"attachment_id"`
+ ContentType string `json:"content_type"`
+ Height int `json:"height"`
+ Id string `json:"id"`
+ ProxyUrl string `json:"proxy_url"`
+ Url string `json:"url"`
+ Width int `json:"width"`
+}
+
+type UpdateApplicationUserRoleConnectionRequest struct {
+ Metadata string `json:"metadata"`
+ PlatformName string `json:"platform_name"`
+ PlatformUsername string `json:"platform_username"`
+}
+
+type UpdateDMRequestPartial struct {
+ Name string `json:"name"`
+}
+
+type UpdateDefaultReactionEmojiRequest struct {
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+}
+
+type UpdateGroupDMRequestPartial struct {
+ Icon string `json:"icon"`
+ Name string `json:"name"`
+}
+
+type UpdateGuildChannelRequestPartial struct {
+ AvailableTags string `json:"available_tags"`
+ Bitrate int `json:"bitrate"`
+ DefaultAutoArchiveDuration string `json:"default_auto_archive_duration"`
+ DefaultForumLayout string `json:"default_forum_layout"`
+ DefaultReactionEmoji string `json:"default_reaction_emoji"`
+ DefaultSortOrder string `json:"default_sort_order"`
+ DefaultTagSetting string `json:"default_tag_setting"`
+ DefaultThreadRateLimitPerUser int `json:"default_thread_rate_limit_per_user"`
+ Flags int `json:"flags"`
+ Name string `json:"name"`
+ Nsfw bool `json:"nsfw"`
+ ParentId string `json:"parent_id"`
+ PermissionOverwrites string `json:"permission_overwrites"`
+ Position int `json:"position"`
+ RateLimitPerUser int `json:"rate_limit_per_user"`
+ RtcRegion string `json:"rtc_region"`
+ Topic string `json:"topic"`
+ Type string `json:"type"`
+ UserLimit int `json:"user_limit"`
+ VideoQualityMode string `json:"video_quality_mode"`
+}
+
+type UpdateGuildOnboardingRequest struct {
+ DefaultChannelIds string `json:"default_channel_ids"`
+ Enabled bool `json:"enabled"`
+ Mode string `json:"mode"`
+ Prompts string `json:"prompts"`
+}
+
+type UpdateMessageInteractionCallbackRequest struct {
+ Data string `json:"data"`
+ Type int `json:"type"`
+}
+
+type UpdateMessageInteractionCallbackResponse struct {
+ Message string `json:"message"`
+ Type int `json:"type"`
+}
+
+type UpdateOnboardingPromptRequest struct {
+ Id string `json:"id"`
+ InOnboarding bool `json:"in_onboarding"`
+ Options string `json:"options"`
+ Required bool `json:"required"`
+ SingleSelect bool `json:"single_select"`
+ Title string `json:"title"`
+ Type string `json:"type"`
+}
+
+type UpdateRolePositionsRequest struct {
+ Id string `json:"id"`
+ Position int `json:"position"`
+}
+
+type UpdateRoleRequestPartial struct {
+ Color int `json:"color"`
+ Colors string `json:"colors"`
+ Hoist bool `json:"hoist"`
+ Icon string `json:"icon"`
+ Mentionable bool `json:"mentionable"`
+ Name string `json:"name"`
+ Permissions int `json:"permissions"`
+ UnicodeEmoji string `json:"unicode_emoji"`
+}
+
+type UpdateSelfVoiceStateRequestPartial struct {
+ ChannelId string `json:"channel_id"`
+ RequestToSpeakTimestamp string `json:"request_to_speak_timestamp"`
+ Suppress bool `json:"suppress"`
+}
+
+type UpdateThreadRequestPartial struct {
+ AppliedTags string `json:"applied_tags"`
+ Archived bool `json:"archived"`
+ AutoArchiveDuration string `json:"auto_archive_duration"`
+ Bitrate int `json:"bitrate"`
+ Flags int `json:"flags"`
+ Invitable bool `json:"invitable"`
+ Locked bool `json:"locked"`
+ Name string `json:"name"`
+ RateLimitPerUser int `json:"rate_limit_per_user"`
+ RtcRegion string `json:"rtc_region"`
+ UserLimit int `json:"user_limit"`
+ VideoQualityMode string `json:"video_quality_mode"`
+}
+
+type UpdateThreadTagRequest struct {
+ EmojiId string `json:"emoji_id"`
+ EmojiName string `json:"emoji_name"`
+ Id string `json:"id"`
+ Moderated bool `json:"moderated"`
+ Name string `json:"name"`
+}
+
+type UpdateVoiceStateRequestPartial struct {
+ ChannelId string `json:"channel_id"`
+ Suppress bool `json:"suppress"`
+}
+
+type UserAvatarDecorationResponse struct {
+ Asset string `json:"asset"`
+ SkuId string `json:"sku_id"`
+}
+
+type UserCollectiblesResponse struct {
+ Nameplate string `json:"nameplate"`
+}
+
+type UserCommunicationDisabledAction struct {
+ Metadata string `json:"metadata"`
+ Type int `json:"type"`
+}
+
+type UserCommunicationDisabledActionMetadata struct {
+ DurationSeconds int `json:"duration_seconds"`
+}
+
+type UserCommunicationDisabledActionMetadataResponse struct {
+ DurationSeconds int `json:"duration_seconds"`
+}
+
+type UserCommunicationDisabledActionResponse struct {
+ Metadata string `json:"metadata"`
+ Type int `json:"type"`
+}
+
+type UserGuildOnboardingResponse struct {
+ DefaultChannelIds string `json:"default_channel_ids"`
+ Enabled bool `json:"enabled"`
+ GuildId string `json:"guild_id"`
+ Prompts string `json:"prompts"`
+}
+
+type UserNameplateResponse struct {
+ Asset string `json:"asset"`
+ Label string `json:"label"`
+ Palette string `json:"palette"`
+ SkuId string `json:"sku_id"`
+}
+
+type UserPIIResponse struct {
+ AccentColor int `json:"accent_color"`
+ Avatar string `json:"avatar"`
+ AvatarDecorationData string `json:"avatar_decoration_data"`
+ Banner string `json:"banner"`
+ Bot bool `json:"bot"`
+ Collectibles string `json:"collectibles"`
+ Discriminator string `json:"discriminator"`
+ Email string `json:"email"`
+ Flags int `json:"flags"`
+ GlobalName string `json:"global_name"`
+ Id string `json:"id"`
+ Locale string `json:"locale"`
+ MfaEnabled bool `json:"mfa_enabled"`
+ PremiumType int `json:"premium_type"`
+ PrimaryGuild string `json:"primary_guild"`
+ PublicFlags int `json:"public_flags"`
+ System bool `json:"system"`
+ Username string `json:"username"`
+ Verified bool `json:"verified"`
+}
+
+type UserPrimaryGuildResponse struct {
+ Badge string `json:"badge"`
+ IdentityEnabled bool `json:"identity_enabled"`
+ IdentityGuildId string `json:"identity_guild_id"`
+ Tag string `json:"tag"`
+}
+
+type UserResponse struct {
+ AccentColor int `json:"accent_color"`
+ Avatar string `json:"avatar"`
+ AvatarDecorationData string `json:"avatar_decoration_data"`
+ Banner string `json:"banner"`
+ Bot bool `json:"bot"`
+ Collectibles string `json:"collectibles"`
+ Discriminator string `json:"discriminator"`
+ Flags int `json:"flags"`
+ GlobalName string `json:"global_name"`
+ Id string `json:"id"`
+ PrimaryGuild string `json:"primary_guild"`
+ PublicFlags int `json:"public_flags"`
+ System bool `json:"system"`
+ Username string `json:"username"`
+}
+
+type UserSelectComponentForMessageRequest struct {
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type UserSelectComponentForModalRequest struct {
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Required bool `json:"required"`
+ Type int `json:"type"`
+}
+
+type UserSelectComponentResponse struct {
+ CustomId string `json:"custom_id"`
+ DefaultValues string `json:"default_values"`
+ Disabled bool `json:"disabled"`
+ Id int `json:"id"`
+ MaxValues int `json:"max_values"`
+ MinValues int `json:"min_values"`
+ Placeholder string `json:"placeholder"`
+ Type int `json:"type"`
+}
+
+type UserSelectDefaultValue struct {
+ Id string `json:"id"`
+ Type string `json:"type"`
+}
+
+type UserSelectDefaultValueResponse struct {
+ Id string `json:"id"`
+ Type string `json:"type"`
+}
+
+type VanityURLErrorResponse struct {
+ Code int `json:"code"`
+ Message string `json:"message"`
+}
+
+type VanityURLResponse struct {
+ Code string `json:"code"`
+ Error string `json:"error"`
+ Uses int `json:"uses"`
+}
+
+type VoiceRegionResponse struct {
+ Custom bool `json:"custom"`
+ Deprecated bool `json:"deprecated"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Optimal bool `json:"optimal"`
+}
+
+type VoiceScheduledEventCreateRequest struct {
+ ChannelId string `json:"channel_id"`
+ Description string `json:"description"`
+ EntityMetadata string `json:"entity_metadata"`
+ EntityType int `json:"entity_type"`
+ Image string `json:"image"`
+ Name string `json:"name"`
+ PrivacyLevel int `json:"privacy_level"`
+ ScheduledEndTime string `json:"scheduled_end_time"`
+ ScheduledStartTime string `json:"scheduled_start_time"`
+}
+
+type VoiceScheduledEventPatchRequestPartial struct {
+ ChannelId string `json:"channel_id"`
+ Description string `json:"description"`
+ EntityMetadata string `json:"entity_metadata"`
+ EntityType string `json:"entity_type"`
+ Image string `json:"image"`
+ Name string `json:"name"`
+ PrivacyLevel int `json:"privacy_level"`
+ ScheduledEndTime string `json:"scheduled_end_time"`
+ ScheduledStartTime string `json:"scheduled_start_time"`
+ Status string `json:"status"`
+}
+
+type VoiceScheduledEventResponse struct {
+ ChannelId string `json:"channel_id"`
+ Creator string `json:"creator"`
+ CreatorId string `json:"creator_id"`
+ Description string `json:"description"`
+ EntityId string `json:"entity_id"`
+ EntityMetadata string `json:"entity_metadata"`
+ EntityType int `json:"entity_type"`
+ GuildId string `json:"guild_id"`
+ Id string `json:"id"`
+ Image string `json:"image"`
+ Name string `json:"name"`
+ PrivacyLevel int `json:"privacy_level"`
+ ScheduledEndTime string `json:"scheduled_end_time"`
+ ScheduledStartTime string `json:"scheduled_start_time"`
+ Status int `json:"status"`
+ UserCount int `json:"user_count"`
+ UserRsvp string `json:"user_rsvp"`
+}
+
+type VoiceStateResponse struct {
+ ChannelId string `json:"channel_id"`
+ Deaf bool `json:"deaf"`
+ GuildId string `json:"guild_id"`
+ Member string `json:"member"`
+ Mute bool `json:"mute"`
+ RequestToSpeakTimestamp string `json:"request_to_speak_timestamp"`
+ SelfDeaf bool `json:"self_deaf"`
+ SelfMute bool `json:"self_mute"`
+ SelfStream bool `json:"self_stream"`
+ SelfVideo bool `json:"self_video"`
+ SessionId string `json:"session_id"`
+ Suppress bool `json:"suppress"`
+ UserId string `json:"user_id"`
+}
+
+type WebhookSlackEmbed struct {
+ AuthorIcon string `json:"author_icon"`
+ AuthorLink string `json:"author_link"`
+ AuthorName string `json:"author_name"`
+ Color string `json:"color"`
+ Fields string `json:"fields"`
+ Footer string `json:"footer"`
+ FooterIcon string `json:"footer_icon"`
+ ImageUrl string `json:"image_url"`
+ Pretext string `json:"pretext"`
+ Text string `json:"text"`
+ ThumbUrl string `json:"thumb_url"`
+ Title string `json:"title"`
+ TitleLink string `json:"title_link"`
+ Ts int `json:"ts"`
+}
+
+type WebhookSlackEmbedField struct {
+ Inline bool `json:"inline"`
+ Name string `json:"name"`
+ Value string `json:"value"`
+}
+
+type WebhookSourceChannelResponse struct {
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type WebhookSourceGuildResponse struct {
+ Icon string `json:"icon"`
+ Id string `json:"id"`
+ Name string `json:"name"`
+}
+
+type WelcomeMessageResponse struct {
+ AuthorIds string `json:"author_ids"`
+ Message string `json:"message"`
+}
+
+type WelcomeScreenPatchRequestPartial struct {
+ Description string `json:"description"`
+ Enabled bool `json:"enabled"`
+ WelcomeChannels string `json:"welcome_channels"`
+}
+
+type WidgetActivity struct {
+ Name string `json:"name"`
+}
+
+type WidgetChannel struct {
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Position int `json:"position"`
+}
+
+type WidgetMember struct {
+ Activity string `json:"activity"`
+ Avatar string `json:"avatar"`
+ AvatarUrl string `json:"avatar_url"`
+ ChannelId string `json:"channel_id"`
+ Deaf bool `json:"deaf"`
+ Discriminator string `json:"discriminator"`
+ Id string `json:"id"`
+ Mute bool `json:"mute"`
+ SelfDeaf bool `json:"self_deaf"`
+ SelfMute bool `json:"self_mute"`
+ Status string `json:"status"`
+ Suppress bool `json:"suppress"`
+ Username string `json:"username"`
+}
+
+type WidgetResponse struct {
+ Channels string `json:"channels"`
+ Id string `json:"id"`
+ InstantInvite string `json:"instant_invite"`
+ Members string `json:"members"`
+ Name string `json:"name"`
+ PresenceCount int `json:"presence_count"`
+}
+
+type WidgetSettingsResponse struct {
+ ChannelId string `json:"channel_id"`
+ Enabled bool `json:"enabled"`
+}
+
diff --git a/docs/plans/2026-03-25-feat-discord-cli-research.md b/docs/plans/2026-03-25-feat-discord-cli-research.md
index f896f995..9dff301e 100644
--- a/docs/plans/2026-03-25-feat-discord-cli-research.md
+++ b/docs/plans/2026-03-25-feat-discord-cli-research.md
@@ -9,48 +9,60 @@ date: 2026-03-25
## Spec Discovery
- Official OpenAPI spec: https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json
-- Source: Known-specs registry (discord/discord-api-spec GitHub repo)
-- Format: JSON, OpenAPI 3.1.0
-- Endpoint count: 200+ (Discord's full REST API)
+- Source: Known-specs registry (verified)
+- Format: OpenAPI 3.1.0 (JSON)
+- Endpoint count: 200+ (22 resource categories)
## Competitors (Deep Analysis)
-### discli (ibbybuilds/discli) - 6 stars
-- Repo: https://github.com/ibbybuilds/discli
-- Language: TypeScript/JavaScript (Node.js)
-- Commands: ~51 across 9 resource groups (server, invites, channels, roles, members, permissions, messages, emojis, audit)
-- Last commit: Recent (2026)
-- Open issues: 0
-- Maintained: Yes (new project)
-- Notable features: YAML output by default (token-efficient for AI), --confirm for destructive ops, SOUL.md personality customization, no WebSocket needed
-- Weaknesses: Only 6 stars, limited to subset of Discord API (no webhooks, slash commands, scheduled events, threads, auto-mod, stickers, stage instances, voice regions), TypeScript (requires Node.js runtime)
-
-### discordo (ayn2op/discordo) - 5,400 stars
+### DiscordChatExporter (10,700 stars)
+- Repo: https://github.com/Tyrrrz/DiscordChatExporter
+- Language: C# (91.3%)
+- Commands: ~10 (export-focused: exportdm, exportchannel, exportguild, exportall)
+- Last commit: March 21, 2026 (v2.47.1)
+- Open issues: 10
+- Contributors: 63
+- Maintained: YES (actively)
+- Notable features: GUI + CLI, HTML/JSON/CSV/TXT export, date range filtering, file partitioning, Docker
+- Weaknesses: Export-only (no search, no sync, no management), C# binary (large), no agent-native features (--json/--select/--dry-run), no server management, no audit log analysis
+
+### jackwener/discord-cli (78 stars)
+- Repo: https://github.com/jackwener/discord-cli
+- Language: Python (100%)
+- Commands: ~15 (sync, search, tail, export, stats, timeline, top, recent, today, purge, guilds, channels, members, info)
+- Last commit: January 2026
+- Open issues: unknown (new repo)
+- Maintained: YES (new, active)
+- Notable features: SQLite + FTS5 search, incremental sync, tail -f, YAML/JSON output, AI agent integration (SCHEMA.md), activity timeline
+- Weaknesses: Python (slow startup), uses user tokens (TOS-violating), no server management (no role/channel CRUD), no audit log, no webhooks, no --dry-run, no doctor command
+
+### discordo (5,400 stars)
- Repo: https://github.com/ayn2op/discordo
-- Language: Go
-- Commands: N/A (TUI chat client, not API management CLI)
-- Last commit: Active
-- Open issues: 45
-- Maintained: Yes, 40 contributors
-- Notable features: Terminal Discord chat client, QR code login, TOML config
-- Weaknesses: Different category entirely - interactive chat TUI, not an API management CLI. Violates Discord ToS (automated user accounts). Not comparable.
+- Language: Go (100%)
+- Purpose: TUI client (NOT a management CLI - different category)
+- Maintained: YES
+- Not a direct competitor - it's a chat client, not an API management tool
## User Pain Points
-> "Using external clients were against Discord's wish and terms of service" - discord-cli README (highlights the need for bot-token-based API CLIs that are ToS-compliant)
-> "Official plugin support and third party client" discussion on discord-api-docs shows demand for programmatic Discord access beyond the web UI - Discussion #3857
+> "Communities are moving en-masse to information blackholes like Discord that cannot be indexed by search engines." - discord-dl README
+> "Automated user accounts violate Discord's Terms of Service" - discordo README (applies to user-token tools)
+> Rate limiting is the #1 pain point - 429 errors, per-route limits not communicated through headers, IP bans after 10k failed requests
## Auth Method
-- Type: Bot token (Bearer) via Authorization header
-- Env var convention: DISCORD_BOT_TOKEN (discli uses this)
+- Type: Bot token (primary, TOS-compliant)
+- Env var convention: DISCORD_TOKEN or DISCORD_BOT_TOKEN
+- OAuth2 also supported for user-level access
## Demand Signals
-- discord/discord-api-docs Discussion #3857: users requesting official third-party client support
-- discli's "for AI agents and humans" framing shows the agent-native CLI demand is recognized but underserved (6 stars = early, not widely adopted)
+- HN: discordo (5.4k stars) shows strong demand for terminal Discord tools
+- HN: Discoding (2026) - AI CLI relay to Discord shows developer workflow integration demand
+- AnswerOverflow: Making Discord searchable is a validated business (Y Combinator backed)
+- n8n integration: Shows automation/workflow demand for Discord API
## Strategic Justification
-**Why this CLI should exist:** discli is the only API management CLI and has just 6 stars with ~51 commands covering a fraction of Discord's 200+ endpoint API. It requires Node.js runtime. Our CLI will be a single Go binary covering the full Discord API spec, with --json/--select/--dry-run/--stdin for agent workflows, and proper doctor/cache/auth patterns. We'll beat discli on breadth (full API coverage vs partial) and distribution (single binary vs npm install).
+**Why this CLI should exist:** No Go CLI exists that combines API management (full REST coverage) + data tool (SQLite sync/search/export) + workflow commands (audit-report, channel-health). DiscordChatExporter has 10.7k stars but is export-only with no search/sync/management. jackwener/discord-cli (78 stars) validates the data-tool approach but uses TOS-violating user tokens and is Python (slow). Our CLI is Go (fast binary), uses bot tokens (TOS-compliant), covers 200+ API endpoints, AND includes discrawl-class workflow commands. It's the first tool that combines all three: API wrapper + data tool + workflow engine.
## Target
-- Command count: 80+ (match full API spec coverage, beat discli's 51)
-- Key differentiator: Full API coverage in a single Go binary with agent-native features (--json, --select, --dry-run, --stdin, doctor, cache)
-- Quality bar: Steinberger Grade A (72+/90)
+- Command count: 50+ (beat jackwener at 15, match API breadth + 7 workflow commands)
+- Key differentiator: Go binary + bot-token compliant + SQLite sync/search + audit/health workflow commands
+- Quality bar: Steinberger Grade A (80+/100)
diff --git a/docs/plans/2026-03-25-feat-discord-cli-visionary-research.md b/docs/plans/2026-03-25-feat-discord-cli-visionary-research.md
new file mode 100644
index 00000000..1ebbfe34
--- /dev/null
+++ b/docs/plans/2026-03-25-feat-discord-cli-visionary-research.md
@@ -0,0 +1,69 @@
+---
+title: "Visionary Research: Discord CLI"
+type: feat
+status: active
+date: 2026-03-25
+---
+
+## Visionary Research: Discord CLI
+
+### API Identity
+- Domain: Communication (messaging, voice, communities)
+- Primary users: Bot developers, server admins, community managers, data analysts
+- Core entities: Guilds, Channels, Messages, Users, Roles, Emojis, Webhooks, Invites, Audit Log, Auto Moderation, Stage Instances, Scheduled Events, Polls, Stickers, Soundboard, SKUs, Entitlements, Subscriptions, Guild Templates, Lobbies
+- Data profile:
+ - Write pattern: Append-only (messages), mutable (guilds, channels, roles, members)
+ - Volume: HIGH (millions of messages across servers)
+ - Real-time: YES (Gateway/WebSocket for events, webhooks for notifications)
+ - Search need: HIGH (users constantly need to find messages, members, audit events)
+- Auth: Bot token (primary), OAuth2 (user auth)
+- Base URL: https://discord.com/api/v10
+- Rate limits: Per-route + global (10,000 req/10min = 429 ban for 1hr+)
+
+### Usage Patterns (Top 5 by Evidence)
+
+1. **Message export/archive** (Evidence: 10/10) - DiscordChatExporter 10.7k stars, multiple archive tools
+2. **Server backup/restore** (Evidence: 7/10) - discord-backup, discopy, discord-server-backup
+3. **Message search/analytics** (Evidence: 7/10) - AnswerOverflow, discord-analytics, discord-cli FTS5
+4. **Real-time channel monitoring** (Evidence: 5/10) - discord-dl, discord-cli tail, keyword alerting
+5. **Server management automation** (Evidence: 5/10) - Bot management, role CRUD, audit log review
+
+### Tool Landscape (Beyond API Wrappers)
+
+| Tool | Stars | Type | What it does |
+|------|-------|------|-------------|
+| DiscordChatExporter | 10,700 | Data Tool | Export messages to HTML/JSON/CSV/TXT |
+| discordo | 5,400 | Environment Tool | TUI Discord client |
+| jackwener/discord-cli | 78 | Data Tool | SQLite sync + FTS5 search + tail + export |
+| discord-dl | 26 | Data Tool | Archive to SQLite with web UI |
+| discord-migrate | 0 | Data Tool | Export to SQLite for Matrix migration |
+| Copycord | N/A | Integration Tool | Real-time server mirroring |
+| discopy | N/A | Data Tool | Server config backup/restore |
+
+### Workflows
+
+1. **Archive and Search**: sync messages -> SQLite -> FTS5 search -> export
+2. **Server Audit**: fetch audit log -> filter by action/user/date -> export report
+3. **Channel Health**: list channels -> message volume -> stale detection -> report
+4. **Member Analytics**: list members -> role grouping -> activity analysis -> export
+5. **Bulk Role Management**: list roles -> compare template -> bulk assign -> dry-run
+
+### Architecture Decisions
+
+| Decision | Choice | Rationale |
+|----------|--------|-----------|
+| Persistence | SQLite + FTS5 | High volume + high search need. Validated by discord-cli. |
+| Real-time | REST polling (tail) | Simpler than Gateway WebSocket for CLI use. |
+| Search | FTS5 local | Offline search, zero rate limit exposure. |
+| Bulk | Pagination + rate-limit | Transparent handling of Discord's per-route limits. |
+| Cache | SQLite IS the cache | Sync once, query many. --no-cache bypasses. |
+
+### Top 5 Features for the World
+
+| # | Feature | Score | Description |
+|---|---------|-------|-------------|
+| 1 | Local sync + FTS5 search | 14/16 | Sync to SQLite, search offline. |
+| 2 | Channel health detection | 12/16 | Inactive channels, volume trends. |
+| 3 | Audit log analysis + export | 12/16 | Query by action/user/date, export JSON. |
+| 4 | Server config backup/restore | 11/16 | Roles, channels, permissions to JSON. |
+| 5 | Message tail (real-time follow) | 10/16 | tail -f for Discord channels. |
diff --git a/docs/plans/2026-03-25-fix-discord-cli-audit.md b/docs/plans/2026-03-25-fix-discord-cli-audit.md
index 0a837989..4931176e 100644
--- a/docs/plans/2026-03-25-fix-discord-cli-audit.md
+++ b/docs/plans/2026-03-25-fix-discord-cli-audit.md
@@ -1,73 +1,73 @@
---
-title: "Audit: Discord CLI"
+title: "Steinberger Audit: Discord CLI"
type: fix
status: active
date: 2026-03-25
---
-# Audit: Discord CLI
-
-## Automated Scorecard Baseline
-90/90 (100%) - Grade A. All dimensions at 10/10.
-
-## Manual Code Review Findings
-
-### 1. Example values are placeholder garbage
-All examples use "abc123" instead of realistic Discord snowflake IDs (18-digit numbers like "1234567890123456789"). Webhook tokens should also be realistic.
-
-### 2. Short descriptions are too terse
-"Create" should be "Send a message to a channel". "Get" should be "Get a channel by ID". The descriptions are just the HTTP verb, not developer-friendly.
-
-### 3. Root command description is raw spec text
-"Preview of the Discord v10 HTTP API specification" - should be "Manage Discord servers, channels, messages, and more from the command line"
-
-### 4. Complex body fields lack --stdin examples
-79 complex fields were skipped. Key endpoints that NEED --stdin examples:
-- `channels messages create` - embeds, components, attachments, sticker_ids
-- `webhooks execute` - embeds, components, attachments
-- `guilds channels create` - permission_overwrites
-- `applications commands create` - options, integration_types
-
-### 5. Flag descriptions are raw spec jargon
-"Tts" should be "Send as text-to-speech message". "Enforce nonce" should be "Enforce nonce uniqueness for this message".
+# Steinberger Audit: Discord CLI
+
+## Command Comparison
+- Generated: 316 commands across 16 resource groups
+- Target: 50+ (beat jackwener/discord-cli at 15)
+- Result: 316 commands - massively exceeds target breadth
+
+## Help Text Quality Assessment
+- Root description: "Preview of the Discord v10 HTTP API specification" - NEEDS FIX (raw spec title, should describe what the CLI does)
+- Command descriptions: Many are lazy 1-word ("Create", "Get", "Delete") - NEEDS FIX
+- Examples: Placeholder values ("abc123") - NEEDS FIX with realistic Discord IDs
+- Resource group descriptions: Generic ("Manage channels") - OK but could be better
+
+## Agent-Native Checklist
+- [x] --json
+- [x] --select
+- [x] --dry-run
+- [x] --stdin
+- [x] --yes
+- [x] --no-cache
+- [x] doctor
+- [x] Typed exit codes (0,2,3,4,5,7,10)
+- [x] --csv, --plain, --quiet
+- [ ] --stdin example in help text for complex body fields
+
+## Complex Body Fields Plan
+Top 3 endpoints needing --stdin examples:
+1. **channels messages create** - embeds, components, attachments, sticker_ids skipped. Example: `echo '{"content":"Hello","embeds":[{"title":"Test","color":5814783}]}' | discord-cli channels messages create CHANNEL_ID --stdin`
+2. **guilds channels create** - permission_overwrites, available_tags skipped. Example: `echo '{"name":"new-channel","type":0,"permission_overwrites":[{"id":"ROLE_ID","type":0,"allow":"1024"}]}' | discord-cli guilds channels create GUILD_ID --stdin`
+3. **webhooks execute** - embeds, components, attachments skipped. Example: `echo '{"content":"Deploy complete","embeds":[{"title":"Build #123","color":3066993}]}' | discord-cli webhooks execute WEBHOOK_ID WEBHOOK_TOKEN --stdin`
## First Steinberger Analysis (Baseline)
| Dimension | Score | What 10 Looks Like | How to Get There |
|-----------|-------|-------------------|-----------------|
-| Output modes | 10/10 | gogcli: --json, --csv, --plain, --quiet, --select | Already has all output modes |
-| Auth | 10/10 | gogcli: env var, config file, doctor validates | Present |
-| Error handling | 10/10 | gogcli: typed exits, classifyAPIError | Present |
-| Terminal UX | 10/10 | gogcli: colors, tabwriter, no-color flag | Present but descriptions are terse |
-| README | 10/10 | gogcli: install, quickstart, every command, agent usage | Structure good, examples weak |
-| Doctor | 10/10 | gogcli: validates auth, version, config | Present |
-| Agent-native | 10/10 | gogcli: --json, --select, --dry-run, --stdin, --yes, typed exits | Complete |
-| Local Cache | 10/10 | gogcli: 5-min cache, --no-cache bypass | Present |
-| Breadth | 10/10 | gogcli: covers full API | 307 commands from full spec |
-
-**Baseline Total: 90/90 (Grade A)**
-
-## GOAT Improvement Plan (UX Polish - Not Scorecard-Measured)
-
-1. Fix root command description to be developer-friendly
-2. Fix all example values from "abc123" to realistic Discord snowflake IDs
-3. Add --stdin examples for top 3 complex body field endpoints
-4. Improve README with realistic examples and a cookbook section
-5. Fix terse flag descriptions for the most important commands
-
-## Complex Body Field Plan
-
-### channels messages create
-```bash
-echo '{"content":"Hello!","embeds":[{"title":"My Embed","description":"Rich content","color":5814783}]}' | discord-cli channels messages create 1234567890123456789 --stdin
-```
-
-### webhooks execute
-```bash
-echo '{"content":"Deploy complete","embeds":[{"title":"Status","color":3066993,"fields":[{"name":"Version","value":"v2.1.0"}]}]}' | discord-cli webhooks execute 1234567890123456789 WEBHOOK_TOKEN --stdin
-```
-
-### applications commands create
-```bash
-echo '{"name":"greet","description":"Say hello","options":[{"name":"user","type":6,"description":"User to greet","required":true}]}' | discord-cli applications commands create 1234567890123456789 --stdin
-```
+| Output modes | 10/10 | --json, --csv, --plain, --quiet, --select | Already at 10 |
+| Auth | 10/10 | Token via env var, doctor validates, config file | Already at 10 |
+| Error handling | 10/10 | Typed exits, retry with backoff, classifyAPIError | Already at 10 |
+| Terminal UX | 8/10 | Progress spinners, color themes, pager for long output | Add progress indicator for sync/tail |
+| README | 4/10 | Install, quickstart, every command with example, cookbook, FAQ | Add cookbook section with Discord-specific examples, realistic IDs, complex body examples |
+| Doctor | 10/10 | Validates auth, API version, config health | Already at 10 |
+| Agent-native | 8/10 | --json, --select, --dry-run, --stdin, idempotent, typed exits | Add --stdin examples in help text |
+| Local Cache | 10/10 | SQLite sync + search + FTS5 | Already at 10 |
+| Breadth | 6/10 | 100+ commands covering every endpoint + convenience wrappers | 316 commands but descriptions are lazy. Fix Short fields. |
+| Vision | 9/10 | Sync + search + tail + export + analytics | Already strong. Add workflow commands to reach 10. |
+| Workflows | 4/10 | Compound commands combining 2+ API calls | Build Phase 0.5 workflows |
+
+**Baseline Total: 89/110 (80%) - Grade A**
+
+## GOAT Improvement Plan
+
+### Top 5 Highest-Impact Improvements
+1. **Build 7 workflow commands** (Phase 0.5) - channel-health, audit-report, member-report, server-snapshot, prune-preview, webhook-test, message-stats
+2. **Fix README** - Add cookbook with Discord-specific examples, complex body --stdin examples, FAQ
+3. **Fix root description** - "Discord API CLI - manage servers, channels, messages, roles, and more from your terminal"
+4. **Fix lazy Short fields** - "Create" -> "Send a message to a channel", "Get" -> "Get channel details by ID"
+5. **Add --stdin examples** - Top 3 complex body endpoints in help text
+
+### Commands to ADD (Workflow commands)
+1. `discord-cli channel-health` - Stale channel detection + activity histogram
+2. `discord-cli audit-report` - Audit log analysis grouped by action/user/date
+3. `discord-cli member-report` - Member activity, role distribution, top contributors
+4. `discord-cli server-snapshot` - Backup guild config to JSON
+5. `discord-cli prune-preview` - Preview member prune before executing
+6. `discord-cli webhook-test` - Send test payloads to webhooks
+7. `discord-cli message-stats` - Per-channel message volume and activity trends
diff --git a/docs/plans/2026-03-26-feat-discord-cli-vs-discrawl-gap-analysis-plan.md b/docs/plans/2026-03-26-feat-discord-cli-vs-discrawl-gap-analysis-plan.md
new file mode 100644
index 00000000..0e3c48d2
--- /dev/null
+++ b/docs/plans/2026-03-26-feat-discord-cli-vs-discrawl-gap-analysis-plan.md
@@ -0,0 +1,318 @@
+---
+title: "discord-cli vs discrawl: Gap Analysis and Upgrade Plan"
+type: feat
+status: active
+date: 2026-03-26
+---
+
+# discord-cli vs discrawl: Gap Analysis and Upgrade Plan
+
+## Overview
+
+discrawl (540 stars, steipete/discrawl) is a Go CLI that mirrors Discord guild data into local SQLite with FTS5 search. It has 12 commands but each one is deeply purpose-built for Discord. The generated discord-cli has 330+ commands but its data layer is generic. This plan compares them feature-by-feature and identifies what discord-cli needs to steal from discrawl's playbook.
+
+**Bottom line:** discrawl is a far superior data tool. discord-cli is a far superior API wrapper. The ideal CLI combines both.
+
+---
+
+## Feature-by-Feature Comparison
+
+### Data Layer
+
+| Capability | discrawl | discord-cli | Winner |
+|---|---|---|---|
+| **Schema** | Discord-native: separate tables for messages, members, channels with proper columns | Generic `resources` table with JSON blobs | discrawl by a mile |
+| **FTS5 indexing** | Extracts message content, attachment text, embed text, filenames | Indexes raw JSON blobs | discrawl |
+| **Sync** | `--guild`, `--channels`, `--since`, `--concurrency` (auto-sized), `--with-embeddings` | Generic `--resources` flag, no Discord-specific filtering | discrawl |
+| **Tail** | Gateway WebSocket with repair loops (real-time, misses nothing) | REST polling at intervals (slow, misses events, rate-limited) | discrawl |
+| **Search** | `--guild`, `--channel`, `--author`, `--limit`, `--include-empty` | `--type`, `--limit` only (no Discord-specific filters) | discrawl |
+| **Messages** | Filter by channel, author, time range (`--days`/`--hours`/`--since`), `--sync` on-demand, `--all`, `--last N` | No equivalent command | discrawl |
+| **Mentions** | Structured user/role mention tracking with time filters | No equivalent | discrawl |
+| **Members** | list, show (with message history), search (username, bio, pronouns, social handles, URLs) | member-report (role counts only) | discrawl |
+| **Channels** | list, show (metadata inspection) | Via API commands only (no local query) | discrawl |
+| **SQL** | Raw read-only SQL access to the database | No equivalent | discrawl |
+| **Status** | Archive statistics and sync progress | No equivalent | discrawl |
+| **Init** | Multi-guild discovery with OpenClaw integration, config file generation | No equivalent | discrawl |
+| **Embeddings** | Optional OpenAI semantic search, batch-processed in background | No equivalent | discrawl |
+
+**Score: discrawl 13/13 on data capabilities.**
+
+### API Management
+
+| Capability | discrawl | discord-cli | Winner |
+|---|---|---|---|
+| **REST API coverage** | 0 commands | 316 commands across 20 resource groups | discord-cli |
+| **Guild management** | None (read-only crawler) | Create, update, delete guilds | discord-cli |
+| **Channel management** | None | Full CRUD + permissions | discord-cli |
+| **Role management** | None | Full CRUD + bulk operations | discord-cli |
+| **Ban management** | None | Ban, unban, list bans | discord-cli |
+| **Webhook management** | None | Full CRUD + execute | discord-cli |
+| **Application commands** | None | Full slash command management | discord-cli |
+| **Auto moderation** | None | Full rule management | discord-cli |
+| **Scheduled events** | None | Full CRUD | discord-cli |
+| **Stage instances** | None | Full management | discord-cli |
+
+**Score: discord-cli 10/10 on API management. discrawl has zero.**
+
+### Workflow Commands
+
+| Capability | discrawl | discord-cli | Winner |
+|---|---|---|---|
+| **channel-health** | Nothing | Stale channel detection + activity report | discord-cli |
+| **audit-report** | Nothing | Audit log analysis by action/user/date | discord-cli |
+| **member-report** | Nothing (members search is close) | Role distribution, bot/human counts | discord-cli |
+| **server-snapshot** | Nothing | Backup guild config to JSON | discord-cli |
+| **message-stats** | Nothing | Message volume, top contributors, hourly activity | discord-cli |
+| **webhook-test** | Nothing | Send test payloads to webhooks | discord-cli |
+| **prune-preview** | Nothing | Preview prune without executing | discord-cli |
+
+**Score: discord-cli 7/0. discrawl has no workflow commands.**
+
+### Agent-Native Features
+
+| Feature | discrawl | discord-cli | Winner |
+|---|---|---|---|
+| **--json** | Yes | Yes | Tie |
+| **--select** | No | Yes | discord-cli |
+| **--dry-run** | No | Yes | discord-cli |
+| **--stdin** | No | Yes | discord-cli |
+| **--yes** | No | Yes | discord-cli |
+| **--no-cache** | No | Yes | discord-cli |
+| **--csv** | No | Yes | discord-cli |
+| **--plain** | No | Yes | discord-cli |
+| **--quiet** | No | Yes | discord-cli |
+| **Typed exit codes** | Unknown | 0,2,3,4,5,7,10 | discord-cli |
+
+**Score: discord-cli 8/1.**
+
+---
+
+## The Verdict
+
+| Dimension | discrawl | discord-cli |
+|---|---|---|
+| Data tool | 13/13 | 0/13 |
+| API management | 0/10 | 10/10 |
+| Workflow commands | 0/7 | 7/7 |
+| Agent-native | 1/9 | 9/9 |
+| **Total** | **14/39** | **26/39** |
+
+discord-cli wins on breadth. discrawl wins on depth where it matters most - the data layer.
+
+The printing-press skill itself says it: **"discrawl has 12 commands and 539 stars. Depth beats breadth."** The 316 API wrapper commands are table stakes. The 7 workflow commands are differentiation. But the data layer - sync, search, tail, messages, mentions, members, SQL - is where discrawl demolishes us.
+
+---
+
+## What discord-cli Must Steal from discrawl
+
+### Priority 1: Discord-Native Schema (Critical)
+
+Replace the generic `resources` table with Discord-specific tables:
+
+```sql
+-- Messages table with proper columns
+CREATE TABLE messages (
+ id TEXT PRIMARY KEY,
+ channel_id TEXT NOT NULL,
+ guild_id TEXT,
+ author_id TEXT NOT NULL,
+ content TEXT,
+ timestamp DATETIME NOT NULL,
+ edited_timestamp DATETIME,
+ type INTEGER DEFAULT 0,
+ data JSON NOT NULL,
+ synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+);
+CREATE INDEX idx_messages_channel ON messages(channel_id);
+CREATE INDEX idx_messages_author ON messages(author_id);
+CREATE INDEX idx_messages_timestamp ON messages(timestamp);
+
+-- FTS on extracted content (not JSON blobs)
+CREATE VIRTUAL TABLE messages_fts USING fts5(
+ id, channel_id, author_id, content,
+ tokenize='porter unicode61'
+);
+
+-- Members table
+CREATE TABLE members (
+ user_id TEXT NOT NULL,
+ guild_id TEXT NOT NULL,
+ username TEXT,
+ display_name TEXT,
+ bio TEXT,
+ joined_at DATETIME,
+ roles JSON,
+ data JSON NOT NULL,
+ PRIMARY KEY (user_id, guild_id)
+);
+
+-- Mentions table
+CREATE TABLE mentions (
+ message_id TEXT NOT NULL,
+ target_id TEXT NOT NULL,
+ target_type TEXT NOT NULL, -- 'user' or 'role'
+ guild_id TEXT,
+ channel_id TEXT,
+ timestamp DATETIME,
+ FOREIGN KEY (message_id) REFERENCES messages(id)
+);
+```
+
+**Why:** Without this, search returns JSON blobs. With this, search returns `#channel-name @author: message content` with filters.
+
+### Priority 2: Discord-Aware Sync
+
+Replace the generic sync with Discord-specific backfill:
+
+- `discord-cli sync --guild GUILD_ID` - sync one guild
+- `discord-cli sync --channels CHANNEL_ID,CHANNEL_ID` - sync specific channels
+- `discord-cli sync --since 2026-01-01` - sync from date
+- `discord-cli sync --full` - full historical backfill
+- `discord-cli sync --concurrency 16` - auto-sized by default
+- Incremental: track last message ID per channel as cursor
+- Paginate with `GET /channels/{id}/messages?before=OLDEST_ID&limit=100`
+
+### Priority 3: Messages Command
+
+Add a `messages` command that queries the local database:
+
+```bash
+# Messages from a channel in the last 7 days
+discord-cli messages --channel general --days 7
+
+# Messages from a specific author
+discord-cli messages --author steipete --days 30
+
+# All messages, syncing on-demand if needed
+discord-cli messages --channel help --all --sync
+
+# Last 100 messages
+discord-cli messages --channel dev --last 100 --json
+```
+
+### Priority 4: Search Filtering
+
+Add Discord-specific filters to search:
+
+```bash
+# Search within a guild
+discord-cli search "error" --guild 123456789012345678
+
+# Search within a channel
+discord-cli search "timeout" --channel help
+
+# Search by author
+discord-cli search "fix" --author steipete
+
+# Combine filters
+discord-cli search "deploy" --guild 123 --channel releases --json
+```
+
+### Priority 5: SQL Command
+
+Expose raw read-only SQL access:
+
+```bash
+# Run a query
+discord-cli sql 'SELECT channel_id, COUNT(*) as cnt FROM messages GROUP BY channel_id ORDER BY cnt DESC LIMIT 10'
+
+# From stdin
+echo 'SELECT * FROM members WHERE bio LIKE "%rust%"' | discord-cli sql -
+```
+
+### Priority 6: Mentions Command
+
+Track and query structured mentions:
+
+```bash
+# Who mentioned me?
+discord-cli mentions --target @mybot --days 7
+
+# Role mentions in a channel
+discord-cli mentions --channel announcements --type role
+
+# JSON for agent consumption
+discord-cli mentions --target USER_ID --json
+```
+
+### Priority 7: Gateway Tail (Future)
+
+Replace REST polling with Gateway WebSocket:
+
+- Connect to `wss://gateway.discord.gg/` with bot token
+- Subscribe to MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE events
+- Write events to SQLite in real-time
+- Periodic repair syncs to catch missed events
+- Graceful reconnection with resume
+
+This is the hardest change (Gateway protocol is complex) but gives true real-time vs polling delay.
+
+---
+
+## What discord-cli Already Does Better
+
+These are advantages to preserve and highlight:
+
+1. **316 API wrapper commands** - discrawl can't create channels, manage roles, ban users, or execute webhooks
+2. **7 workflow commands** - channel-health, audit-report, server-snapshot are unique value
+3. **Agent-native features** - --select, --dry-run, --stdin, --yes, --csv, --plain, typed exits
+4. **Complex body support** - --stdin for embeds, components, attachments
+5. **Doctor with full diagnostics** - Both have this, parity
+
+---
+
+## Implementation Phases
+
+### Phase 1: Schema Migration (2-3 hours)
+- Replace generic `resources` table with Discord-specific tables
+- Update `store.go` with `UpsertMessage`, `UpsertMember`, `UpsertChannel` methods
+- Migrate FTS5 to index extracted content, not JSON blobs
+- Add mention extraction during message upsert
+
+### Phase 2: Discord-Aware Sync (3-4 hours)
+- Rewrite `sync.go` with Discord-specific logic
+- Paginate through channels using `?before=` cursor
+- Track per-channel sync state
+- Add `--guild`, `--channels`, `--since`, `--concurrency` flags
+- Auto-discover guilds from bot token
+
+### Phase 3: Messages + Search Filtering (2-3 hours)
+- New `messages` command with local database queries
+- Add `--guild`, `--channel`, `--author` filters to search
+- Add `--days`, `--hours`, `--since` time filters
+
+### Phase 4: SQL + Mentions (1-2 hours)
+- Read-only SQL command
+- Mentions command with structured queries
+
+### Phase 5: Gateway Tail (4-6 hours, optional)
+- WebSocket client for Discord Gateway
+- Event-to-SQLite pipeline
+- Repair loops
+- Resume on reconnect
+
+**Total estimated work: 8-12 hours for Phases 1-4, plus 4-6 hours for Gateway.**
+
+---
+
+## Acceptance Criteria
+
+- [ ] Discord-specific schema with messages, members, channels, mentions tables
+- [ ] FTS5 indexes extracted content (not JSON blobs)
+- [ ] Sync supports `--guild`, `--channels`, `--since`, `--concurrency`
+- [ ] `messages` command with channel/author/time filters
+- [ ] `search` supports `--guild`, `--channel`, `--author` filters
+- [ ] `sql` command for raw read-only queries
+- [ ] `mentions` command for structured mention queries
+- [ ] All existing 316 API commands still work
+- [ ] All 7 workflow commands still work
+- [ ] `go build ./...` and `go vet ./...` pass
+
+---
+
+## Sources
+
+- [steipete/discrawl](https://github.com/steipete/discrawl) - 540 stars, the reference implementation
+- [jackwener/discord-cli](https://github.com/jackwener/discord-cli) - 78 stars, Python alternative with similar approach
+- [Tyrrrz/DiscordChatExporter](https://github.com/Tyrrrz/DiscordChatExporter) - 10.7k stars, export-only (no search/sync)
+- [Discord API Docs](https://docs.discord.com/developers/intro) - Official REST + Gateway documentation
diff --git a/docs/plans/2026-03-26-feat-power-user-prediction-engine-plan.md b/docs/plans/2026-03-26-feat-power-user-prediction-engine-plan.md
new file mode 100644
index 00000000..dde38846
--- /dev/null
+++ b/docs/plans/2026-03-26-feat-power-user-prediction-engine-plan.md
@@ -0,0 +1,620 @@
+---
+title: "Power User Prediction Engine for Printing Press"
+type: feat
+status: completed
+date: 2026-03-26
+---
+
+# Power User Prediction Engine for Printing Press
+
+## Overview
+
+The printing-press generates Grade A API wrappers (Discord: 316 commands, 94/110 Steinberger). But it can't predict what a power user would build *on top* of those APIs - the domain-specific SQLite schema, incremental sync, full-text search with domain filters, real-time tail, structured mention tracking, and raw SQL access that make discrawl (12 commands, 540 stars) more valuable than a 316-command wrapper.
+
+This plan adds **Phase 0.7: Power User Prediction Engine** to the SKILL.md. It runs after Phase 0.5 (Power User Workflows) and before Phase 1 (Deep Research). It uses API surface analysis + social signal mining + data gravity scoring to generate a **Data Layer Specification** - a concrete blueprint for building discrawl-class features without knowing discrawl exists.
+
+## Problem Statement
+
+Phase 0.5 thinks in *commands* ("what compound CLI commands would a power user want?"). But power users don't just want commands - they want a **local data layer** that enables all of them. discrawl's killer feature isn't any single command - it's the SQLite database with domain-native tables.
+
+**Evidence from the Discord run (2026-03-25):**
+
+| What we predicted (Phase 0.5) | What we missed (discrawl has) |
+|---|---|
+| channel-health workflow | Discord-native schema (messages/members/channels tables) |
+| audit-report workflow | Gateway WebSocket tail (not REST polling) |
+| member-report workflow | `messages` command with --channel/--author/--days filters |
+| server-snapshot workflow | `mentions` command with structured mention tracking |
+| message-stats workflow | `members search` across bio, pronouns, social handles |
+| webhook-test workflow | `sql` command for raw read-only queries |
+| prune-preview workflow | FTS5 on extracted content (not JSON blobs) |
+
+The workflows we predicted are good - discrawl doesn't have them. But the data layer underneath is where discrawl wins 13/13 on capabilities.
+
+**Root cause:** The generator creates a generic `resources` table with JSON blobs and a generic FTS5 index on those blobs. It should create domain-specific tables with proper columns and FTS5 on extracted text fields.
+
+## Proposed Solution
+
+### New Phase: 0.7 - Power User Prediction Engine
+
+Insert between Phase 0.5 and Phase 1 in the SKILL.md. Five prediction steps, 15-25 minutes total.
+
+```
+Phase 0 -> Phase 0.5 -> [Phase 0.7] -> Phase 1 -> Phase 2 -> Phase 3 -> Phase 4 -> Phase 5
+Visionary Workflows Prediction Research Generate Audit Build Score
+Research (commands) Engine (specs) (code) (review) (fixes) (final)
+ (data layer)
+```
+
+---
+
+## Technical Approach
+
+### Step 0.7a: Entity Classification
+
+**Goal:** Map every API resource into one of four types.
+
+Read the OpenAPI spec (or use Phase 0's entity list) and classify each resource:
+
+| Type | Signal | Example | Persistence Need |
+|---|---|---|---|
+| **Accumulating** | Grows over time, has timestamps, paginated lists | Messages, Issues, Audit Logs, Commits | SQLite table + incremental sync |
+| **Reference** | Changes rarely, small cardinality, referenced by other entities | Users, Teams, Roles, Labels, Channels | SQLite table + periodic refresh |
+| **Append-only** | Never edited, only created | Events, Webhooks, Notifications | SQLite table + tail command |
+| **Ephemeral** | Short-lived, not worth persisting | OAuth tokens, Rate limit status, Gateway info | API-only, no persistence |
+
+**Output:** Entity classification table with type, estimated volume, update frequency, and key temporal field.
+
+**Heuristics for classification:**
+- Has `created_at`/`timestamp` + paginated list endpoint -> Accumulating
+- Referenced by 3+ other entities via `_id` fields -> Reference
+- Has no UPDATE/PATCH endpoint -> Append-only
+- No list endpoint or < 100 expected records -> Ephemeral
+- Has `updated_at` or `modified_at` -> needs incremental sync cursor
+
+### Step 0.7b: Social Signal Mining for Data Patterns
+
+**Goal:** Find evidence of what data power users actually store locally.
+
+Run 7 parallel WebSearches:
+
+```
+1. "<API name>" export OR backup OR archive site:github.com
+2. "<API name>" SQLite OR database OR local site:github.com
+3. "<API name>" analytics OR dashboard OR metrics site:github.com
+4. "<API name>" "I wish" OR "would be nice" OR "feature request" data
+5. "<API name>" offline OR search OR "full text" site:reddit.com OR site:news.ycombinator.com
+6. "<API name>" trend OR pattern OR anomaly detection
+7. "<API name>" graph OR visualization OR dependency
+```
+
+**For each finding, extract:**
+- What entities they store locally
+- What queries they run (joins, aggregations, time filters)
+- What temporal patterns they track
+- What cross-entity relationships they need
+
+**Score using Phase 0 evidence framework.** Anything with score >= 6 informs the data layer.
+
+### Step 0.7c: Data Gravity Scoring
+
+**Goal:** Rank entities by how much value they'd have in a local SQLite database.
+
+**Formula:** `DataGravity = Volume(0-3) + QueryFrequency(0-3) + JoinDemand(0-2) + SearchNeed(0-2) + TemporalValue(0-2)`
+
+| Factor | 0 | 1 | 2 | 3 |
+|---|---|---|---|---|
+| **Volume** | < 100 records | 100-10k | 10k-1M | > 1M |
+| **QueryFrequency** | Rarely queried | Monthly | Weekly | Daily |
+| **JoinDemand** | No references | 1-2 entities reference it | 3-4 | 5+ |
+| **SearchNeed** | No text fields | 1 text field | 2-3 text fields | Primary text content |
+| **TemporalValue** | No time dimension | Created date only | Updated + trends | Core to time-series analysis |
+
+**Thresholds:**
+- Score >= 8: **Primary entity** - gets its own SQLite table with proper columns
+- Score 5-7: **Support entity** - gets a table but simpler schema
+- Score < 5: **API-only** - no local persistence
+
+**Example scores that would have predicted discrawl:**
+
+| Entity | Volume | QueryFreq | JoinDemand | SearchNeed | TemporalValue | Total | Decision |
+|---|---|---|---|---|---|---|---|
+| Messages | 3 | 3 | 2 | 3 | 2 | **13** | Primary |
+| Members | 2 | 2 | 2 | 2 | 1 | **9** | Primary |
+| Channels | 1 | 2 | 2 | 1 | 0 | **6** | Support |
+| Roles | 1 | 1 | 2 | 0 | 0 | **4** | API-only |
+| Audit Logs | 2 | 2 | 1 | 1 | 2 | **8** | Primary |
+
+This scoring would have correctly predicted that messages, members, and audit logs need dedicated SQLite tables - exactly what discrawl builds.
+
+### Step 0.7d: Schema + Sync + Search Specification
+
+**Goal:** Write the concrete data layer specification.
+
+For each Primary entity (score >= 8):
+
+**1. SQLite Schema:**
+- Extract columns from the API's response schema (not just id + JSON blob)
+- Include foreign key columns for joins (e.g., `channel_id`, `author_id`)
+- Include the temporal field for sync cursors
+- Add indexes on foreign keys and temporal fields
+- Create FTS5 virtual table on text fields
+
+**2. Sync Strategy:**
+- Identify the incremental sync cursor (timestamp field, snowflake ID, cursor pagination)
+- Verify the API supports filtering by this cursor (check query params for `since`, `after`, `updated_after`)
+- Determine batch size from API's max `limit` parameter
+- Check if API has WebSocket/SSE/Gateway - if yes, note for tail command
+- **VALIDATE:** If the API doesn't support filtering by the cursor field, fall back to full sync + local dedup
+
+**3. Search Specification:**
+- List which text fields to extract into FTS5 (title, description, content, body, name)
+- Define domain-specific search filters as SQL WHERE clauses
+- Map CLI flags to SQL: `--channel` -> `WHERE channel_id = ?`, `--author` -> `WHERE author_id = ?`
+- **VALIDATE:** Check that the API actually returns these fields in list/get responses
+
+**4. Compound Queries:**
+- Define 3-5 useful cross-entity queries (e.g., "messages by author in channel in last N days")
+- Validate that the join columns exist in both tables
+- These become the basis for workflow commands that use the local database instead of live API calls
+
+### Step 0.7e: Write the Data Layer Specification Artifact
+
+Write to `~/cli-printing-press/docs/plans/<today>-feat-<api>-cli-data-layer-spec.md`:
+
+```markdown
+## Data Layer Specification: <API> CLI
+
+### Entity Classification
+[Table from Step 0.7a]
+
+### Data Gravity Scores
+[Table from Step 0.7c]
+
+### SQLite Schema
+[CREATE TABLE statements for each Primary/Support entity]
+[CREATE INDEX statements]
+[CREATE VIRTUAL TABLE ... USING fts5(...) for text-heavy entities]
+
+### Sync Strategy
+| Entity | Cursor Field | API Filter Param | Batch Size | Frequency |
+[Table]
+
+### Domain-Specific Search Filters
+| CLI Flag | SQL Mapping | Entities |
+[Table]
+
+### Compound Queries (for Phase 4 Workflows)
+| Query Name | SQL | Use Case |
+[Table]
+
+### Commands to Build in Phase 4
+| Command | Description | Uses Local DB? | API Calls |
+| sync | Incremental sync to SQLite | Yes (writes) | GET /entities?since=cursor |
+| search | FTS5 search with domain filters | Yes (reads) | None (local only) |
+| sql | Raw read-only SQL access | Yes (reads) | None (local only) |
+| messages/issues/etc | Entity-specific listing with filters | Yes (reads) | None (local only) |
+[Table]
+
+### Tail Strategy
+| Method | When to Use | Implementation |
+| WebSocket/Gateway | API has it (Discord, Slack) | Connect + event handler |
+| SSE | API has it (Linear, GitHub) | EventSource reader |
+| REST Polling | Fallback | GET with ?since= cursor |
+[Decision for this specific API]
+```
+
+### Phase Gate 0.7
+
+**STOP.** Verify ALL of these before proceeding:
+1. Entity classification table with type and volume estimates for every API resource
+2. At least 3 social signals with evidence scores >= 6
+3. Data gravity scores computed, with >= 1 primary entity (score >= 8)
+4. SQLite schema with proper columns (NOT generic JSON blobs) for each primary entity
+5. FTS5 virtual tables for entities with text fields
+6. Sync strategy with cursor fields validated against actual API filter params
+7. Domain-specific search filters mapped to SQL WHERE clauses
+8. At least 3 compound queries validated (joins work, columns exist)
+
+Tell the user: "Phase 0.7 complete: [N] primary entities for SQLite ([list]), [M] compound queries validated. Sync via [cursor type]. FTS5 on [fields]. Key prediction: [most valuable data-layer feature]. Proceeding to deep research."
+
+---
+
+## Artifact Pipeline: 6 Plans Per Run (via /ce:plan or Built-in)
+
+Every printing-press run should ship **6 comprehensive .md plans** in `docs/plans/`. Each phase pauses at its gate, **runs /ce:plan** (or its built-in equivalent) to write the artifact, then resumes. The artifacts ARE the product - the generated CLI is a side effect.
+
+### How artifact writing works:
+
+At the end of each phase, the skill runs a **plan generation step**. It detects whether the user has compound-engineering installed and routes accordingly:
+
+**Detection logic (add to SKILL.md at the top, before Phase 0):**
+
+```markdown
+### Artifact Writing: Plan Generation
+
+At the end of each phase, write a comprehensive plan document. Use this priority:
+
+**Option A: /ce:plan is available (compound-engineering installed)**
+
+Check if the `compound-engineering:ce:plan` skill exists. If yes, invoke it:
+
+ Skill tool: compound-engineering:ce:plan
+ Args: "<phase description with all research gathered so far>"
+
+This produces a full plan document with frontmatter, acceptance criteria, technical analysis, and sources. The skill handles the depth - just pass it all the research from this phase as the feature description.
+
+**Option B: Built-in plan writer (fallback when compound-engineering is NOT installed)**
+
+If /ce:plan is not available, write the artifact yourself using this structure:
+
+ ---
+ title: "<Phase Name>: <API> CLI"
+ type: feat
+ status: active
+ date: <today>
+ phase: "<phase number>"
+ api: "<api name>"
+ ---
+
+ # <Phase Name>: <API> CLI
+
+ ## Overview
+ [2-3 paragraph executive summary of what this phase discovered/decided]
+
+ ## Analysis
+ [Full analysis with tables, scores, evidence URLs, and reasoning]
+ [Every claim backed by evidence - WebSearch URLs, star counts, API docs]
+ [Scoring breakdowns showing how each number was computed]
+
+ ## Decisions
+ [What was decided and WHY - rationale for each decision]
+ [What was rejected and WHY]
+
+ ## Concrete Outputs
+ [SQL schemas, command definitions, sync strategies - real code, not pseudocode]
+ [Every output validated against the actual API]
+
+ ## Acceptance Criteria
+ - [ ] [Measurable criteria for this phase's outputs]
+
+ ## Sources
+ - [URLs, file paths, competitor repos with star counts]
+
+CRITICAL: The built-in writer must match /ce:plan depth. This means:
+- Full analysis, not bullet summaries
+- Evidence with source URLs, not assertions
+- Scoring breakdowns, not just final numbers
+- Concrete SQL/code examples, not pseudocode
+- Validation proof ("I verified the API supports ?after= filtering"), not assumptions
+- 200+ lines minimum per artifact
+```
+
+### The 6 artifacts and when to generate them:
+
+```
+Phase 0 -> [run plan writer] -> <today>-feat-<api>-cli-visionary-research.md
+Phase 0.5 -> [run plan writer] -> <today>-feat-<api>-cli-power-user-workflows.md
+Phase 0.7 -> [run plan writer] -> <today>-feat-<api>-cli-data-layer-spec.md
+Phase 1 -> [run plan writer] -> <today>-feat-<api>-cli-research.md
+Phase 3 -> [run plan writer] -> <today>-fix-<api>-cli-audit.md
+Phase 4 -> [run plan writer] -> <today>-fix-<api>-cli-goat-build-log.md
+```
+
+### What each plan must contain:
+
+**1. Visionary Research** (Phase 0):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a visionary research plan for the <API> CLI. Include:
+- API identity with data profile (write pattern, volume, real-time, search need)
+- Top 5 usage patterns with evidence scores and source URLs
+- Complete tool landscape with star counts and tool type classification
+- Architecture decisions with rationale
+- Top 5 features scored on 8 dimensions (evidence, impact, feasibility, uniqueness,
+ composability, data profile fit, maintainability, competitive moat)
+Use the research gathered in Phase 0 steps 0a-0g as input."
+```
+
+**2. Power User Workflows** (Phase 0.5):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a power user workflow plan for the <API> CLI. Include:
+- API archetype classification with justification
+- All 10-15 brainstormed workflow ideas with descriptions
+- Validation results per workflow (which API endpoints support each one)
+- Full scoring table (Frequency x Pain x Feasibility x Uniqueness)
+- Top 7 selected with implementation notes
+- Which workflows need local data vs live API calls
+Use the research from Phase 0 artifact + Phase 0.5 analysis as input."
+```
+
+**3. Data Layer Specification** (Phase 0.7):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a data layer specification for the <API> CLI. Include:
+- Entity classification table (Accumulating/Reference/Append-only/Ephemeral)
+- Social signal mining results with evidence scores
+- Data gravity scores with full breakdown (Volume + QueryFreq + JoinDemand + SearchNeed + TemporalValue)
+- Complete SQLite schema (CREATE TABLE + CREATE INDEX + CREATE VIRTUAL TABLE FTS5)
+- Sync strategy with cursor field validation (verified against API filter params)
+- Domain-specific search filters mapped to SQL WHERE clauses
+- 3-5 compound cross-entity queries
+- Tail strategy decision (WebSocket vs SSE vs REST polling with justification)
+Use the entity analysis from Phase 0.7 steps 0.7a-0.7d as input."
+```
+
+**4. Research** (Phase 1):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a deep research plan for the <API> CLI. Include:
+- Spec discovery (URL, format, version, endpoint count)
+- Deep competitor analysis for top 2 competitors (README, stars, maintenance status,
+ user complaints with quotes, open issues)
+- At least 2 user quotes with source URLs
+- Strategic justification answering 'why should this CLI exist when [competitor] has [N] stars?'
+- Target command count and key differentiators
+Use the competitor research from Phase 1 steps 1.1-1.5 as input."
+```
+
+**5. Steinberger Audit** (Phase 3):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a Steinberger audit plan for the <API> CLI. Include:
+- Automated scorecard baseline numbers (from running `printing-press scorecard`)
+- Hand-scored 11-dimension table with: current score, 'what 10/10 looks like', 'how to get there'
+- GOAT improvement plan with top 5 highest-impact fixes
+- Complex body field plan (top 3 endpoints needing --stdin examples)
+- Data layer integration notes (from Phase 0.7 spec - what schema changes to make)
+- Commands to ADD (new functionality, not just fixes)
+Use the code review from Phase 3 steps 3.1-3.8 as input."
+```
+
+**6. GOAT Build Log** (Phase 4):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a build log for the <API> CLI Phase 4. Include:
+- Data layer: what schema was implemented, which tables, which FTS5 indexes
+- Workflow commands: list of new commands with descriptions and which use local DB
+- Scorecard fixes: what was changed and which dimensions improved
+- What was skipped: features deferred to future work with reasons
+- Compilation verification: go build + go vet results
+- Before/after scorecard comparison
+Use the actual code changes made in Phase 4 as input."
+```
+
+### The chain pattern:
+
+Each artifact feeds the next. The LLM **reads** the previous artifact before writing the next one:
+```
+Phase 0 artifact -> read before Phase 0.5 (what workflows match this API?)
+Phase 0.5 artifact -> read before Phase 0.7 (what data layer supports these workflows?)
+Phase 0.7 artifact -> read before Phase 2 (what schema to generate?)
+Phase 0.7 artifact -> read before Phase 4 (what to build in Priority 0: Data Layer)
+Phase 3 artifact -> read before Phase 4 (what scorecard gaps to fix)
+```
+
+**IMPORTANT:** Before each phase, the SKILL.md should instruct: "Read the previous phase's artifact file before proceeding. The artifact contains decisions and analysis you need."
+
+---
+
+## Implementation Plan
+
+### Session 1: Update SKILL.md (1-2 hours)
+
+**File:** `~/.claude/skills/printing-press/SKILL.md`
+
+**Key principle:** Each phase artifact is produced by actually running `/ce:plan` (if compound-engineering is installed) or a built-in equivalent. The SKILL.md instructs the LLM to invoke the Skill tool at each phase gate.
+
+**Changes:**
+
+0. **Add Artifact Writing section** at the top of SKILL.md (before Phase 0):
+ - Detection logic: check if `compound-engineering:ce:plan` skill is available
+ - Option A: invoke `/ce:plan` with phase research as feature description
+ - Option B: built-in plan writer with 200+ line minimum, same depth as /ce:plan
+ - Both options produce the same artifact structure (frontmatter, analysis, decisions, outputs, acceptance criteria, sources)
+
+1. **Update phase flow diagram** at the top:
+```
+PHASE 0 -> PHASE 0.5 -> PHASE 0.7 -> PHASE 1 -> PHASE 2 -> PHASE 3 -> PHASE 4 -> PHASE 5
+(3-5 min) (2-3 min) (15-25 min) (5-8 min) (1-2 min) (5-8 min) (5-10 min) (2-3 min)
+```
+
+2. **Insert Phase 0.7 section** between Phase 0.5 and Phase 1 with:
+ - Steps 0.7a through 0.7e (full text from this plan)
+ - Phase Gate 0.7 checklist
+ - Data Layer Specification template
+
+3. **Update Phase 4 priority order:**
+
+Current:
+```
+Priority 1: Power User Workflows (from Phase 0.5)
+Priority 2: Scorecard-Gap Fixes
+Priority 3: Polish
+```
+
+New:
+```
+Priority 0: Data Layer Foundation (from Phase 0.7)
+ - Replace generic store.go with domain-specific schema
+ - Implement domain-aware sync with proper cursors
+ - Add domain-specific search filters
+ - Add `sql` command for raw read-only queries
+ - Add entity-specific list commands (e.g., `messages --channel --author --days`)
+Priority 1: Power User Workflows (from Phase 0.5) - NOW powered by local DB
+Priority 2: Scorecard-Gap Fixes
+Priority 3: Polish
+```
+
+4. **Add to Anti-Shortcut Rules:**
+```
+- "The API doesn't need local persistence" (Check data gravity scores. If any entity >= 8, it needs SQLite.)
+- "FTS5 is overkill for this API" (If entity has 2+ text fields and score >= 8, it needs FTS5.)
+- "REST polling is fine for tail" (Check if API has WebSocket/SSE/Gateway. If yes, use it.)
+- "The generic store is good enough" (Domain-native tables always beat JSON blobs. Write the schema.)
+- "I'll build the data layer later" (Phase 0.7 runs BEFORE generation. The spec informs the schema.)
+```
+
+5. **Update Phase 2 to use Phase 0.7 output:**
+
+After generation, the data layer spec should be used to:
+- Override the generic store.go.tmpl output with domain-specific tables
+- Or: Phase 4 Priority 0 replaces the generated store.go
+
+### Session 2: Test on Discord (1-2 hours)
+
+Run `/printing-press Discord` with the updated SKILL.md and verify:
+
+**Expected Phase 0.7 output for Discord:**
+
+Entity Classification:
+- Messages: Accumulating, Very High volume, Continuous updates, `timestamp` (snowflake)
+- Members: Accumulating, High volume, Weekly updates, `joined_at`
+- Channels: Reference, Low volume, Monthly updates, N/A
+- Audit Logs: Append-only, High volume, Continuous, `id`
+- Roles: Reference, Low volume, Monthly, N/A
+- Emojis: Reference, Low volume, Monthly, N/A
+
+Data Gravity Scores:
+- Messages: 13/12 -> Primary
+- Members: 9/12 -> Primary
+- Audit Logs: 8/12 -> Primary
+- Channels: 6/12 -> Support
+
+Schema should include:
+```sql
+CREATE TABLE messages (
+ id TEXT PRIMARY KEY,
+ channel_id TEXT NOT NULL,
+ guild_id TEXT,
+ author_id TEXT NOT NULL,
+ content TEXT NOT NULL DEFAULT '',
+ timestamp TEXT NOT NULL,
+ edited_timestamp TEXT,
+ type INTEGER DEFAULT 0,
+ data JSON NOT NULL,
+ synced_at TEXT NOT NULL
+);
+CREATE INDEX idx_messages_channel ON messages(channel_id);
+CREATE INDEX idx_messages_author ON messages(author_id);
+CREATE INDEX idx_messages_timestamp ON messages(timestamp);
+CREATE VIRTUAL TABLE messages_fts USING fts5(content, tokenize='porter unicode61');
+```
+
+Sync should use snowflake ID pagination (`?before=OLDEST_ID`).
+
+Search should support `--guild`, `--channel`, `--author` filters.
+
+**Compare against discrawl features (12 commands):**
+- [x] init -> guild discovery during sync
+- [x] sync -> incremental sync with snowflake cursors
+- [x] tail -> Gateway WebSocket (predicted from API surface)
+- [x] search -> FTS5 with domain filters
+- [x] messages -> channel/author/time filtering
+- [x] mentions -> extracted from message content during sync
+- [x] members -> list/show/search across profiles
+- [x] channels -> list/show from local DB
+- [x] sql -> raw read-only SQLite access
+- [x] status -> archive statistics
+- [x] doctor -> already generated
+- [ ] embeddings -> optional, not predicted (acceptable miss)
+
+**Success criteria:** Engine predicts 10/12 discrawl features without seeing discrawl.
+
+### Session 3: Test on a Third API (1-2 hours)
+
+Run on Stripe to verify generalization:
+
+Expected predictions:
+- Charges/PaymentIntents: Primary (high volume, temporal, searchable)
+- Customers: Primary (reference but high join demand)
+- Subscriptions: Primary (lifecycle tracking)
+- Events: Append-only (tail command)
+- Schema: charges table with amount, currency, customer_id, status, created columns
+- Sync: cursor-based pagination via `starting_after`
+- Search: FTS5 on charge description, customer name/email
+
+---
+
+## Acceptance Criteria
+
+### SKILL.md Changes
+- [ ] Phase 0.7 section inserted between Phase 0.5 and Phase 1
+- [ ] Phase flow diagram updated with Phase 0.7 (15-25 min)
+- [ ] Steps 0.7a-0.7e documented with clear instructions
+- [ ] Phase Gate 0.7 with 8 verification items
+- [ ] Entity classification heuristics (Accumulating/Reference/Append-only/Ephemeral)
+- [ ] Data gravity scoring formula with weights and thresholds
+- [ ] Data Layer Specification template with all required sections
+- [ ] Phase 4 priorities reordered (data layer first)
+- [ ] 5 new anti-shortcut rules added
+- [ ] Total time estimate updated to 35-65 minutes
+
+### Validation
+- [ ] Discord re-run predicts messages/members/audit_logs as Primary entities
+- [ ] Discord re-run generates domain-specific SQLite schema (not JSON blobs)
+- [ ] Discord re-run predicts Gateway WebSocket for tail
+- [ ] Discord re-run generates --guild/--channel/--author search filters
+- [ ] 10/12 discrawl features predicted without knowing discrawl exists
+- [ ] Third API (Stripe) produces sensible predictions (not hallucinated)
+
+### Quality Gates
+- [ ] Every predicted feature validates against actual API capabilities (grounding step in 0.7d)
+- [ ] Sync cursors verified to be filterable via API query params
+- [ ] FTS5 fields verified to contain meaningful text in API responses
+- [ ] No hallucinated columns - every column maps to an actual API response field
+
+---
+
+## Risk Analysis
+
+| Risk | Likelihood | Impact | Mitigation |
+|---|---|---|---|
+| Over-prediction for simple APIs | Medium | Low | Data gravity threshold (>= 8) prevents unnecessary SQLite for small APIs |
+| Hallucinated schema columns | Medium | High | Step 0.7d validates every column against API response schema |
+| 15-25 min adds too much to pipeline | Low | Low | Only runs web searches + analysis, no code generation |
+| Sync cursor doesn't work | Medium | Medium | Fallback to full sync + local dedup if API lacks filter params |
+| GraphQL APIs lack OpenAPI spec | Medium | Medium | Phase 0.7a works from any schema source (OpenAPI, GraphQL introspection, docs) |
+
+---
+
+## What This Enables
+
+**Before:**
+```
+OpenAPI Spec -> Generator -> 316 commands + generic JSON blob store
+ -> Phase 4 -> 7 workflow commands (API calls only)
+ = Good API client, weak data tool
+```
+
+**After:**
+```
+OpenAPI Spec -> Generator -> 316 commands
+ -> Phase 0.7 -> Data Layer Specification
+ -> Phase 4 -> Domain SQLite schema + sync + search + sql
+ -> 7 workflow commands (powered by local DB)
+ = Strong API client + strong data tool
+ = discrawl-class without knowing discrawl exists
+```
+
+The prediction engine doesn't replace Phase 0.5's workflow ideation. It ADDS a data layer underneath. `discord-cli workflow channel-health` goes from "make N API calls per channel" to "query local SQLite with one JOIN, instant results."
+
+---
+
+## Sources
+
+- Discord CLI generation run (2026-03-25): `docs/plans/2026-03-25-feat-discord-cli-visionary-research.md`
+- discrawl gap analysis (2026-03-26): `docs/plans/2026-03-26-feat-discord-cli-vs-discrawl-gap-analysis-plan.md`
+- [steipete/discrawl](https://github.com/steipete/discrawl) - 540 stars, the reference data-tool CLI
+- Printing-press SKILL.md: `~/.claude/skills/printing-press/SKILL.md`
+- Generator templates: `~/cli-printing-press/internal/generator/templates/`
+- Profiler: `~/cli-printing-press/internal/profiler/profiler.go`
+- Vision templates: `~/cli-printing-press/internal/generator/vision_templates.go`
+- Scorecard: `~/cli-printing-press/internal/pipeline/scorecard.go`
diff --git a/skills/printing-press/SKILL.md b/skills/printing-press/SKILL.md
index d90466d5..034dcbce 100644
--- a/skills/printing-press/SKILL.md
+++ b/skills/printing-press/SKILL.md
@@ -33,14 +33,29 @@ Generate the best CLI that has ever existed for any API. Five mandatory phases.
## How This Works
-Every run produces the GOAT CLI through 6 mandatory phases:
+Every run produces the GOAT CLI through 7 mandatory phases + 6 comprehensive plan documents:
```
-PHASE 0: VISIONARY RESEARCH -> PHASE 0.5: POWER USER WORKFLOWS -> PHASE 1: DEEP RESEARCH -> PHASE 2: GENERATE -> PHASE 3: STEINBERGER AUDIT -> PHASE 4: GOAT BUILD -> PHASE 5: FINAL STEINBERGER
- (3-5 min) (2-3 min) (5-8 min) (1-2 min) (5-8 min) (5-10 min) (2-3 min)
+PHASE 0: VISIONARY RESEARCH -> PHASE 0.5: POWER USER WORKFLOWS -> PHASE 0.7: PREDICTION ENGINE -> PHASE 1: DEEP RESEARCH -> PHASE 2: GENERATE -> PHASE 3: STEINBERGER AUDIT -> PHASE 4: GOAT BUILD -> PHASE 5: FINAL STEINBERGER
+ (3-5 min) (2-3 min) (15-25 min) (5-8 min) (1-2 min) (5-8 min) (5-10 min) (2-3 min)
```
-Total expected time: 20-40 minutes. Phase 4 is longer now because it builds real workflow commands, not just polishes READMEs.
+Total expected time: 35-65 minutes. Phase 0.7 adds 15-25 minutes for the prediction engine. Phase 4 is longer because it builds data layer + workflow commands.
+
+**6 Plan Artifacts Per Run:**
+
+Every phase gate produces a comprehensive plan document in `~/cli-printing-press/docs/plans/`:
+
+```
+Phase 0 -> <today>-feat-<api>-cli-visionary-research.md
+Phase 0.5 -> <today>-feat-<api>-cli-power-user-workflows.md
+Phase 0.7 -> <today>-feat-<api>-cli-data-layer-spec.md
+Phase 1 -> <today>-feat-<api>-cli-research.md
+Phase 3 -> <today>-fix-<api>-cli-audit.md
+Phase 4 -> <today>-fix-<api>-cli-goat-build-log.md
+```
+
+Each artifact chains into the next. **Read the previous phase's artifact before starting the next phase.**
**The Steinberger bar:** Peter Steinberger's gogcli is the 10/10 reference. Every generated CLI is scored against it TWICE - once during audit to find gaps, once after fixes to prove improvement. The delta is the proof of work.
@@ -51,6 +66,70 @@ Total expected time: 20-40 minutes. Phase 4 is longer now because it builds real
---
+## Artifact Writing: Plan Generation at Each Phase Gate
+
+At the end of each phase, write a comprehensive plan document. This is NOT optional - the artifacts ARE the product.
+
+**Option A: /ce:plan is available (compound-engineering plugin installed)**
+
+Try to invoke the `compound-engineering:ce:plan` skill. If it exists, use it:
+
+```
+Skill tool: compound-engineering:ce:plan
+Args: "<phase description with all research gathered so far>"
+```
+
+The /ce:plan skill produces a full plan document with frontmatter, analysis, acceptance criteria, and sources. Pass it all the research from this phase as the feature description.
+
+**Option B: Built-in plan writer (fallback when compound-engineering is NOT installed)**
+
+If /ce:plan is not available, write the artifact yourself with this structure:
+
+```markdown
+---
+title: "<Phase Name>: <API> CLI"
+type: feat
+status: active
+date: <today>
+phase: "<phase number>"
+api: "<api name>"
+---
+
+# <Phase Name>: <API> CLI
+
+## Overview
+[2-3 paragraph executive summary of what this phase discovered/decided]
+
+## Analysis
+[Full analysis with tables, scores, evidence URLs, and reasoning]
+[Every claim backed by evidence - WebSearch URLs, star counts, API docs]
+[Scoring breakdowns showing how each number was computed]
+
+## Decisions
+[What was decided and WHY - rationale for each decision]
+[What was rejected and WHY]
+
+## Concrete Outputs
+[SQL schemas, command definitions, sync strategies - real code, not pseudocode]
+[Every output validated against the actual API]
+
+## Acceptance Criteria
+- [ ] [Measurable criteria for this phase's outputs]
+
+## Sources
+- [URLs, file paths, competitor repos with star counts]
+```
+
+**CRITICAL:** The built-in writer must match /ce:plan depth:
+- Full analysis, not bullet summaries
+- Evidence with source URLs, not assertions
+- Scoring breakdowns, not just final numbers
+- Concrete SQL/code examples, not pseudocode
+- Validation proof ("I verified the API supports ?after= filtering"), not assumptions
+- 200+ lines minimum per artifact
+
+---
+
## Workflow: `--spec` shortcut
When the user provides `--spec <path-or-url>`, skip Phase 1 spec search (spec is provided). STILL run competitor research (Steps 1.2-1.5). Run all other phases.
@@ -240,7 +319,9 @@ Score < 8: **Won't-have.** Skip or future work.
5. Architecture decisions match data profile
6. Top 5 features scored and ranked
-Tell the user: "Phase 0 complete: Domain: [category]. Data profile: [volume]/[realtime]/[search]. Found [N] non-wrapper tools. Top feature: [name] (score [X]/16). Architecture: [key decision]. Proceeding to deep research."
+**Write Phase 0 Artifact:** Run the Artifact Writing plan generator (see top of skill) with all Phase 0 research as input. Write to `~/cli-printing-press/docs/plans/<today>-feat-<api>-cli-visionary-research.md`. Include: API identity, data profile, usage patterns with evidence, tool landscape, architecture decisions, top 5 features with full scoring.
+
+Tell the user: "Phase 0 complete: Domain: [category]. Data profile: [volume]/[realtime]/[search]. Found [N] non-wrapper tools. Top feature: [name] (score [X]/16). Architecture: [key decision]. Proceeding to power user workflows."
---
@@ -306,6 +387,147 @@ These become **mandatory Phase 4 work items**. They are NOT optional polish. The
2. ...
These will be built as real commands in Phase 4, alongside the API wrapper."
+**Write Phase 0.5 Artifact:** Run the Artifact Writing plan generator (see top of skill) with all Phase 0.5 analysis as input. Write to `~/cli-printing-press/docs/plans/<today>-feat-<api>-cli-power-user-workflows.md`. Include: API archetype, all 10-15 workflow ideas, validation results, full scoring table, top 7 with implementation notes.
+
+---
+
+# PHASE 0.7: POWER USER PREDICTION ENGINE
+
+## THIS PHASE IS MANDATORY. DO NOT SKIP IT.
+
+The generator produces API wrappers. Power users want a local data layer - domain-specific SQLite tables, incremental sync, full-text search with domain filters, raw SQL access, and trend detection. This phase predicts that data layer from the API surface + social signals, WITHOUT looking at competitors (that's Phase 1's job).
+
+**Read the Phase 0 and Phase 0.5 artifacts before starting this phase.**
+
+### Step 0.7a: Entity Classification
+
+Map every API resource into one of four types by reading the OpenAPI spec or Phase 0's entity list:
+
+| Type | Signal | Example | Persistence Need |
+|---|---|---|---|
+| **Accumulating** | Grows over time, has timestamps, paginated lists | Messages, Issues, Audit Logs, Commits | SQLite table + incremental sync |
+| **Reference** | Changes rarely, small cardinality, referenced by other entities | Users, Teams, Roles, Labels, Channels | SQLite table + periodic refresh |
+| **Append-only** | Never edited, only created | Events, Webhooks, Notifications | SQLite table + tail command |
+| **Ephemeral** | Short-lived, not worth persisting | OAuth tokens, Rate limit status, Gateway info | API-only, no persistence |
+
+**Heuristics:**
+- Has `created_at`/`timestamp` + paginated list endpoint -> Accumulating
+- Referenced by 3+ other entities via `_id` fields -> Reference
+- Has no UPDATE/PATCH endpoint -> Append-only
+- No list endpoint or < 100 expected records -> Ephemeral
+- Has `updated_at` or `modified_at` -> needs incremental sync cursor
+
+**Output:** Entity classification table with type, estimated volume, update frequency, and key temporal field for ALL API resources.
+
+### Step 0.7b: Social Signal Mining for Data Patterns
+
+Find evidence of what data power users actually store locally. Run 7 parallel WebSearches:
+
+1. **WebSearch**: `"<API name>" export OR backup OR archive site:github.com`
+2. **WebSearch**: `"<API name>" SQLite OR database OR local site:github.com`
+3. **WebSearch**: `"<API name>" analytics OR dashboard OR metrics site:github.com`
+4. **WebSearch**: `"<API name>" "I wish" OR "would be nice" OR "feature request" data`
+5. **WebSearch**: `"<API name>" offline OR search OR "full text" site:reddit.com OR site:news.ycombinator.com`
+6. **WebSearch**: `"<API name>" trend OR pattern OR anomaly detection`
+7. **WebSearch**: `"<API name>" graph OR visualization OR dependency`
+
+**For each finding, extract:**
+- What entities they store locally
+- What queries they run (joins, aggregations, time filters)
+- What temporal patterns they track (trends, anomalies, velocity)
+- What cross-entity relationships they need
+
+**Score using Phase 0 evidence framework.** Anything with score >= 6 informs the data layer.
+
+### Step 0.7c: Data Gravity Scoring
+
+Rank entities by how much value they'd have in a local SQLite database.
+
+**Formula:** `DataGravity = Volume(0-3) + QueryFrequency(0-3) + JoinDemand(0-2) + SearchNeed(0-2) + TemporalValue(0-2)`
+
+| Factor | 0 | 1 | 2 | 3 |
+|---|---|---|---|---|
+| **Volume** | < 100 records | 100-10k | 10k-1M | > 1M |
+| **QueryFrequency** | Rarely queried | Monthly | Weekly | Daily |
+| **JoinDemand** | No references | 1-2 entities reference it | 3-4 | 5+ |
+| **SearchNeed** | No text fields | 1 text field | 2-3 text fields | Primary text content |
+| **TemporalValue** | No time dimension | Created date only | Updated + trends | Core to time-series analysis |
+
+**Thresholds:**
+- Score >= 8: **Primary entity** - gets its own SQLite table with proper columns, FTS5 if text-heavy
+- Score 5-7: **Support entity** - gets a simpler table
+- Score < 5: **API-only** - no local persistence
+
+Score EVERY entity from Step 0.7a. Show the full breakdown.
+
+### Step 0.7d: Schema + Sync + Search Specification
+
+For each Primary entity (score >= 8), produce:
+
+**1. SQLite Schema:**
+- Extract columns from the API's response schema (NOT just id + JSON blob)
+- Include foreign key columns for joins (e.g., `channel_id`, `author_id`)
+- Include the temporal field for sync cursors
+- Add indexes on foreign keys and temporal fields
+- Create FTS5 virtual table on text fields (title, description, content, body, name)
+- Keep a `data JSON NOT NULL` column for the full API response
+
+**2. Sync Strategy:**
+- Identify the incremental sync cursor (timestamp field, snowflake ID, cursor pagination)
+- **VALIDATE:** Check that the API supports filtering by this cursor - look for `since`, `after`, `updated_after`, `before` query params in the spec
+- Determine batch size from API's max `limit` parameter
+- Check if API has WebSocket/SSE/Gateway - note for tail command
+- If the API doesn't support cursor filtering, fall back to full sync + local dedup
+
+**3. Search Specification:**
+- List which text fields to extract into FTS5
+- Define domain-specific search filters as SQL WHERE clauses
+- Map CLI flags to SQL: `--channel` -> `WHERE channel_id = ?`, `--author` -> `WHERE author_id = ?`
+- **VALIDATE:** Confirm these fields actually appear in API list/get responses
+
+**4. Compound Queries:**
+- Define 3-5 cross-entity queries (e.g., "messages by author in channel in last N days")
+- Validate join columns exist in both tables
+- These become Phase 4 workflow commands that use local DB instead of live API
+
+**5. Tail Strategy:**
+
+| Method | When to Use |
+|---|---|
+| WebSocket/Gateway | API has it (Discord Gateway, Slack RTM) |
+| SSE | API has it (GitHub, Linear webhooks) |
+| REST Polling | Fallback - GET with ?since= cursor |
+
+Decide which method this API supports. If WebSocket/SSE, the tail command should use it instead of REST polling.
+
+### Step 0.7e: Write the Data Layer Specification Artifact
+
+**Run the Artifact Writing plan generator** (see top of skill) with all Phase 0.7 analysis as input. Write to `~/cli-printing-press/docs/plans/<today>-feat-<api>-cli-data-layer-spec.md`.
+
+The artifact MUST include:
+- Entity classification table for every API resource
+- Data gravity scores with full breakdown per entity
+- Complete SQLite schema (CREATE TABLE + CREATE INDEX + FTS5)
+- Sync strategy with cursor validation proof
+- Domain-specific search filters mapped to SQL WHERE clauses
+- 3-5 compound cross-entity queries
+- Tail strategy decision with justification
+- Commands to build in Phase 4 Priority 0
+
+### PHASE GATE 0.7
+
+**STOP.** Verify ALL of these before proceeding:
+1. Entity classification table with type and volume estimates for every API resource
+2. At least 3 social signals with evidence scores >= 6
+3. Data gravity scores computed, with >= 1 primary entity (score >= 8)
+4. SQLite schema with proper columns (NOT generic JSON blobs) for each primary entity
+5. FTS5 virtual tables for entities with text fields
+6. Sync strategy with cursor fields validated against actual API filter params
+7. Domain-specific search filters mapped to SQL WHERE clauses
+8. At least 3 compound queries validated (joins work, columns exist)
+
+Tell the user: "Phase 0.7 complete: [N] primary entities for SQLite ([list]), [M] compound queries validated. Sync via [cursor type]. FTS5 on [fields]. Key prediction: [most valuable data-layer feature]. Proceeding to deep research."
+
---
# PHASE 1: DEEP RESEARCH
@@ -428,6 +650,8 @@ date: <today>
4. Strategic justification answers "why should this exist?"
5. Target command count is set
+**Write Phase 1 Artifact:** Run the Artifact Writing plan generator with all Phase 1 research as input. Write to `~/cli-printing-press/docs/plans/<today>-feat-<api>-cli-research.md`. Include: spec discovery, deep competitor analysis with quotes, demand signals, strategic justification, target command count.
+
Tell the user: "Phase 1 complete: Found [spec/no spec], [N] competitors. Best: [name] ([stars] stars, [commands] commands, last commit [date]). Strategic angle: [1-sentence justification]. Proceeding to generation."
---
@@ -619,7 +843,9 @@ Include ALL of:
4. Complex body fields have a plan (not just "limitation")
5. Baseline total score is recorded
-Tell the user: "Phase 3 complete: Baseline Steinberger Score: [X]/100 (Grade [X]). Found [N] tactical fixes + [M] GOAT improvements. Top improvement: [description]. Proceeding to fixes."
+**Write Phase 3 Artifact:** Run the Artifact Writing plan generator with all Phase 3 analysis as input. Write to `~/cli-printing-press/docs/plans/<today>-fix-<api>-cli-audit.md`. Include: scorecard baseline, full 11-dimension hand-scored table, GOAT improvement plan, complex body field plan, data layer integration notes from Phase 0.7.
+
+Tell the user: "Phase 3 complete: Baseline Steinberger Score: [X]/100 (Grade [X]). Found [N] tactical fixes + [M] GOAT improvements. Top improvement: [description]. Proceeding to GOAT build."
---
@@ -627,13 +853,59 @@ Tell the user: "Phase 3 complete: Baseline Steinberger Score: [X]/100 (Grade [X]
## THIS PHASE IS MANDATORY.
-**The generator output is scaffolding, not the product. The workflows are the product.**
+**The generator output is scaffolding, not the product. The data layer + workflows are the product.**
+
+**Read the Phase 0.7 Data Layer Specification and Phase 3 Audit artifacts before starting.**
+
+Execute in this priority order. Do NOT skip Priority 0 to go straight to workflows.
+
+### Priority 0: Data Layer Foundation (from Phase 0.7)
+
+**This is the most important work in the entire pipeline.** Replace the generic store with domain-specific tables.
+
+1. **Replace `internal/store/store.go`** with domain-specific schema from Phase 0.7 spec:
+ - CREATE TABLE with proper columns for each Primary entity (not JSON blobs)
+ - CREATE INDEX on foreign keys and temporal fields
+ - CREATE VIRTUAL TABLE ... USING fts5() on text fields
+ - UpsertMessage/UpsertMember/etc methods that extract fields from JSON
-Execute in this priority order. Do NOT skip Priority 1 to polish the README.
+2. **Rewrite `sync` command** with domain-aware sync:
+ - Use the cursor field identified in Phase 0.7 (e.g., snowflake ID, updatedAt)
+ - Add `--guild`/`--team`/`--project` scoping flags (domain-specific)
+ - Add `--since` time filter
+ - Paginate with the validated cursor params
-### Priority 1: Power User Workflows (from Phase 0.5)
+3. **Add domain-specific search filters:**
+ - Map Phase 0.7's filter table into search command flags
+ - `--channel`, `--author`, `--team`, etc -> SQL WHERE clauses
+ - FTS5 on extracted text content, not raw JSON
-This is the most important work in the entire pipeline. Implement the top 5-7 workflows identified in Phase 0.5 as real, hand-written Go commands.
+4. **Add `sql` command** for raw read-only queries:
+ ```go
+ func newSqlCmd(flags *rootFlags) *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "sql <query>",
+ Short: "Run read-only SQL queries against the local database",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ // Open DB, execute query, print results as table or JSON
+ },
+ }
+ }
+ ```
+
+5. **Add entity-specific list commands** (e.g., `messages`, `members`):
+ - Query local SQLite, not the API
+ - Support `--channel`, `--author`, `--days`, `--hours`, `--since` filters
+ - Support `--sync` flag to trigger on-demand sync before querying
+
+6. **Update tail command** based on Phase 0.7's tail strategy:
+ - If WebSocket/Gateway: implement real-time connection
+ - If SSE: implement EventSource reader
+ - If REST polling: keep current implementation but use domain-aware cursors
+
+### Priority 1: Power User Workflows (from Phase 0.5) - NOW powered by local DB
+
+Implement the top 5-7 workflows identified in Phase 0.5 as real, hand-written Go commands. **Where possible, query the local SQLite database instead of making live API calls.** This makes workflows instant and avoids rate limits.
For each workflow:
1. **Create a dedicated command file** (e.g., `internal/cli/stale.go`, `internal/cli/velocity.go`)
@@ -695,13 +967,19 @@ cd ~/cli-printing-press/<api>-cli && go build ./... && go vet ./... && echo "ALL
### PHASE GATE 4
**STOP.** Verify:
-1. At least 3 workflow commands implemented (from Phase 0.5)
-2. Workflow commands combine 2+ API calls each
-3. Scorecard gaps addressed
-4. `go build ./...` and `go vet ./...` pass
-5. README cookbook includes workflow examples
+1. Data layer implemented: domain-specific SQLite tables (NOT generic JSON blobs)
+2. Sync command uses domain-aware cursors (validated in Phase 0.7)
+3. Search supports domain-specific filters (--channel, --author, --team, etc.)
+4. `sql` command exists for raw read-only queries
+5. At least 3 workflow commands implemented (from Phase 0.5)
+6. Workflow commands use local DB where possible (not just live API calls)
+7. Scorecard gaps addressed
+8. `go build ./...` and `go vet ./...` pass
+9. README cookbook includes data layer + workflow examples
+
+**Write Phase 4 Artifact:** Run the Artifact Writing plan generator with all Phase 4 work as input. Write to `~/cli-printing-press/docs/plans/<today>-fix-<api>-cli-goat-build-log.md`. Include: data layer implementation details, workflow commands built, scorecard fixes, what was skipped, before/after scorecard comparison.
-Tell the user: "Phase 4 complete: Built [N] workflow commands, applied [M] scorecard fixes. Top workflow: [name]. Compilation verified. Proceeding to final scoring."
+Tell the user: "Phase 4 complete: Built [N] data layer tables + [M] workflow commands, applied [K] scorecard fixes. Data layer: [list tables]. Top workflow: [name]. Compilation verified. Proceeding to final scoring."
---
@@ -836,3 +1114,9 @@ These phrases indicate a phase was shortcut. If you catch yourself writing them,
- "I'll polish the README instead of building workflows" (Phase 4 Priority 1 is workflows. README is Priority 3. Do not skip ahead.)
- "The Phase 0.5 workflows are future work" (They are the product. Build them now or the CLI is just an API wrapper.)
- "316 commands is better than 12" (discrawl has 12 commands and 539 stars. Depth beats breadth. Build the workflows.)
+- "The API doesn't need local persistence" (Check data gravity scores from Phase 0.7. If any entity scores >= 8, it needs SQLite with proper columns.)
+- "FTS5 is overkill for this API" (If any entity has 2+ text fields AND data gravity >= 8, it needs FTS5. That's how search works.)
+- "REST polling is fine for tail" (Check if the API has WebSocket/SSE/Gateway. If yes, use it. REST polling misses events and wastes rate limit budget.)
+- "The generic store is good enough" (Domain-native tables ALWAYS beat JSON blob tables. A `messages` table with `channel_id`, `author_id`, `content` columns enables joins and filters that JSON blobs can't. Write the schema.)
+- "I'll build the data layer later" (Phase 0.7 runs BEFORE generation. The data layer spec informs Phase 4 Priority 0. Build it first, then workflows use it.)
+- "The artifact is just documentation" (The 6 plan artifacts ARE the product. They capture reasoning, evidence, and decisions. The generated CLI is a side effect.)
← 13860ec0 feat(press): v2 - depth over breadth, creativity over mechan
·
back to Cli Printing Press
·
feat(press): add Phase 4.5 Dogfood Emulation - spec-derived 7b5ce383 →