api-surface #1

Merged
luna merged 51 commits from api-surface into mistress 2026-07-05 14:43:13 +00:00
3 changed files with 296 additions and 0 deletions
Showing only changes of commit 76e3248d96 - Show all commits

feat(model): core enum and flags tables (channel/message/user/permissions/...)

Luna 2026-07-05 03:49:59 -03:00

124
lib/dexcord/model/enums.ex Normal file
View file

@ -0,0 +1,124 @@
# Model enums — all `Dexcord.Enum` declarations for the Phase 2 object graph.
#
# Tables transcribed verbatim from official Discord docs source (2026-07-05).
# Gaps in the numbering are REAL (Discord removed/reserved values) and must
# not be "fixed". Real gaps: MessageType 13, 30, 3335, 4043, 45;
# ChannelType 69.
defmodule Dexcord.ChannelType do
use Dexcord.Enum,
guild_text: 0,
dm: 1,
guild_voice: 2,
group_dm: 3,
guild_category: 4,
guild_announcement: 5,
announcement_thread: 10,
public_thread: 11,
private_thread: 12,
guild_stage_voice: 13,
guild_directory: 14,
guild_forum: 15,
guild_media: 16
end
defmodule Dexcord.MessageType do
use Dexcord.Enum,
default: 0,
recipient_add: 1,
recipient_remove: 2,
call: 3,
channel_name_change: 4,
channel_icon_change: 5,
channel_pinned_message: 6,
user_join: 7,
guild_boost: 8,
guild_boost_tier_1: 9,
guild_boost_tier_2: 10,
guild_boost_tier_3: 11,
channel_follow_add: 12,
guild_discovery_disqualified: 14,
guild_discovery_requalified: 15,
guild_discovery_grace_period_initial_warning: 16,
guild_discovery_grace_period_final_warning: 17,
thread_created: 18,
reply: 19,
chat_input_command: 20,
thread_starter_message: 21,
guild_invite_reminder: 22,
context_menu_command: 23,
auto_moderation_action: 24,
role_subscription_purchase: 25,
interaction_premium_upsell: 26,
stage_start: 27,
stage_end: 28,
stage_speaker: 29,
stage_topic: 31,
guild_application_premium_subscription: 32,
guild_incident_alert_mode_enabled: 36,
guild_incident_alert_mode_disabled: 37,
guild_incident_report_raid: 38,
guild_incident_report_false_alarm: 39,
purchase_notification: 44,
poll_result: 46
end
defmodule Dexcord.MessageReferenceType do
use Dexcord.Enum, default: 0, forward: 1
end
defmodule Dexcord.PremiumType do
use Dexcord.Enum, none: 0, nitro_classic: 1, nitro: 2, nitro_basic: 3
end
defmodule Dexcord.StickerType do
use Dexcord.Enum, standard: 1, guild: 2
end
defmodule Dexcord.StickerFormatType do
use Dexcord.Enum, png: 1, apng: 2, lottie: 3, gif: 4
end
defmodule Dexcord.VerificationLevel do
use Dexcord.Enum, none: 0, low: 1, medium: 2, high: 3, very_high: 4
end
defmodule Dexcord.DefaultMessageNotificationLevel do
use Dexcord.Enum, all_messages: 0, only_mentions: 1
end
defmodule Dexcord.ExplicitContentFilterLevel do
use Dexcord.Enum, disabled: 0, members_without_roles: 1, all_members: 2
end
defmodule Dexcord.MfaLevel do
use Dexcord.Enum, none: 0, elevated: 1
end
defmodule Dexcord.GuildNsfwLevel do
use Dexcord.Enum, default: 0, explicit: 1, safe: 2, age_restricted: 3
end
defmodule Dexcord.PremiumTier do
use Dexcord.Enum, none: 0, tier_1: 1, tier_2: 2, tier_3: 3
end
defmodule Dexcord.SortOrderType do
use Dexcord.Enum, latest_activity: 0, creation_date: 1
end
defmodule Dexcord.ForumLayoutType do
use Dexcord.Enum, not_set: 0, list_view: 1, gallery_view: 2
end
defmodule Dexcord.VideoQualityMode do
use Dexcord.Enum, auto: 1, full: 2
end
defmodule Dexcord.OverwriteType do
use Dexcord.Enum, role: 0, member: 1
end
defmodule Dexcord.ReactionType do
use Dexcord.Enum, normal: 0, burst: 1
end

133
lib/dexcord/model/flags.ex Normal file
View file

@ -0,0 +1,133 @@
# Model flags — all `Dexcord.Flags` declarations (bit POSITIONS) for Phase 2.
#
# Tables transcribed verbatim from official Discord docs source (2026-07-05).
# Gaps in the bit positions are REAL and must not be "fixed". Real gaps:
# UserFlags bits 45, 1113, 15, 20+; Permissions bit 47; GuildMemberFlags
# bit 8; AttachmentFlags bit 4; ChannelFlags bits 0, 23, 514.
defmodule Dexcord.UserFlags do
use Dexcord.Flags,
staff: 0,
partner: 1,
hypesquad: 2,
bug_hunter_level_1: 3,
hypesquad_online_house_1: 6,
hypesquad_online_house_2: 7,
hypesquad_online_house_3: 8,
premium_early_supporter: 9,
team_pseudo_user: 10,
bug_hunter_level_2: 14,
verified_bot: 16,
verified_developer: 17,
certified_moderator: 18,
bot_http_interactions: 19
end
defmodule Dexcord.MessageFlags do
use Dexcord.Flags,
crossposted: 0,
is_crosspost: 1,
suppress_embeds: 2,
source_message_deleted: 3,
urgent: 4,
has_thread: 5,
ephemeral: 6,
loading: 7,
failed_to_mention_some_roles_in_thread: 8,
suppress_notifications: 12,
is_voice_message: 13,
has_snapshot: 14,
is_components_v2: 15
end
defmodule Dexcord.Permissions do
use Dexcord.Flags,
create_instant_invite: 0,
kick_members: 1,
ban_members: 2,
administrator: 3,
manage_channels: 4,
manage_guild: 5,
add_reactions: 6,
view_audit_log: 7,
priority_speaker: 8,
stream: 9,
view_channel: 10,
send_messages: 11,
send_tts_messages: 12,
manage_messages: 13,
embed_links: 14,
attach_files: 15,
read_message_history: 16,
mention_everyone: 17,
use_external_emojis: 18,
view_guild_insights: 19,
connect: 20,
speak: 21,
mute_members: 22,
deafen_members: 23,
move_members: 24,
use_vad: 25,
change_nickname: 26,
manage_nicknames: 27,
manage_roles: 28,
manage_webhooks: 29,
manage_guild_expressions: 30,
use_application_commands: 31,
request_to_speak: 32,
manage_events: 33,
manage_threads: 34,
create_public_threads: 35,
create_private_threads: 36,
use_external_stickers: 37,
send_messages_in_threads: 38,
use_embedded_activities: 39,
moderate_members: 40,
view_creator_monetization_analytics: 41,
use_soundboard: 42,
create_guild_expressions: 43,
create_events: 44,
use_external_sounds: 45,
send_voice_messages: 46,
set_voice_channel_status: 48,
send_polls: 49,
use_external_apps: 50,
pin_messages: 51,
bypass_slowmode: 52
end
defmodule Dexcord.SystemChannelFlags do
use Dexcord.Flags,
suppress_join_notifications: 0,
suppress_premium_subscriptions: 1,
suppress_guild_reminder_notifications: 2,
suppress_join_notification_replies: 3,
suppress_role_subscription_purchase_notifications: 4,
suppress_role_subscription_purchase_notification_replies: 5
end
defmodule Dexcord.GuildMemberFlags do
use Dexcord.Flags,
did_rejoin: 0,
completed_onboarding: 1,
bypasses_verification: 2,
started_onboarding: 3,
is_guest: 4,
started_home_actions: 5,
completed_home_actions: 6,
automod_quarantined_username: 7,
dm_settings_upsell_acknowledged: 9,
automod_quarantined_guild_tag: 10
end
defmodule Dexcord.AttachmentFlags do
use Dexcord.Flags, is_clip: 0, is_thumbnail: 1, is_remix: 2, is_spoiler: 3, is_animated: 5
end
defmodule Dexcord.ChannelFlags do
use Dexcord.Flags, pinned: 1, require_tag: 4, hide_media_download_options: 15
end
defmodule Dexcord.RoleFlags do
use Dexcord.Flags, in_prompt: 0
end

View file

@ -0,0 +1,39 @@
defmodule Dexcord.ModelEnumsTest do
use ExUnit.Case, async: true
describe "ChannelType" do
test "decodes a live value" do
assert Dexcord.ChannelType.decode(16) == :guild_media
end
test "removed store type 6 is unknown" do
assert Dexcord.ChannelType.decode(6) == {:unknown, 6}
end
end
describe "MessageType" do
test "decodes a live value" do
assert Dexcord.MessageType.decode(46) == :poll_result
end
test "real gap 13 is unknown" do
assert Dexcord.MessageType.decode(13) == {:unknown, 13}
end
end
describe "Permissions" do
test "has? checks a named bit" do
assert Dexcord.Permissions.has?(8, :administrator)
end
test "highest bit value is 2^52" do
assert Dexcord.Permissions.all()[:bypass_slowmode] == Bitwise.bsl(1, 52)
end
end
describe "UserFlags" do
test "to_list picks bit 0 and bit 16, ordered by value" do
assert Dexcord.UserFlags.to_list(0b1_0000_0000_0000_0001) == [:staff, :verified_bot]
end
end
end