api-surface #1
3 changed files with 296 additions and 0 deletions
feat(model): core enum and flags tables (channel/message/user/permissions/...)
commit
76e3248d96
124
lib/dexcord/model/enums.ex
Normal file
124
lib/dexcord/model/enums.ex
Normal 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, 33–35, 40–43, 45;
|
||||
# ChannelType 6–9.
|
||||
|
||||
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
133
lib/dexcord/model/flags.ex
Normal 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 4–5, 11–13, 15, 20+; Permissions bit 47; GuildMemberFlags
|
||||
# bit 8; AttachmentFlags bit 4; ChannelFlags bits 0, 2–3, 5–14.
|
||||
|
||||
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
|
||||
39
test/dexcord/model_enums_test.exs
Normal file
39
test/dexcord/model_enums_test.exs
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue