import 'dart:convert'; import 'package:libac_dart/discord/structures/sticker.dart'; import 'package:libac_dart/discord/structures/user.dart'; import 'package:libac_dart/structs/Bitmasks.dart'; import 'package:libac_dart/structs/Snowflake.dart'; import 'package:libac_dart/utils/DictTools.dart'; class Guild { Snowflake id; String name; String? icon; String? icon_hash; String? splash; String? discoverySplash; bool? owner; Snowflake owner_id; BitMask? permissions; String? region; Snowflake? afk_channel_id; int afkTimeout; bool? widgetEnabled; Snowflake? widgetChannelID; int verificationLevel; int defaultMessageNotify; int explicitContentFilter; List roles; List emojis; List features; int mfaLevel; Snowflake? applicationId; Snowflake? systemChannelId; int systemChannelFlags; Snowflake? rulesChannelId; int? maxPresences; int? maxMembers; String? vanityUrlCode; String? description; String? banner; int premiumTier; int? premiumSubscriptionCount; String preferredLocale; Snowflake? publicUpdateChannelId; int? maxVideoChannelUsers; int? maxStageVideoChannelUsers; int? approximateMemberCount; int? approximatePresenceCount; WelcomeScreen? welcomeScreen; int nsfwLevel; List? stickers; bool premiumProgressBarEnabled; Snowflake? safetyAlertsChannelId; Guild( {required this.id, required this.name, required this.icon, this.icon_hash, required this.splash, required this.discoverySplash, this.owner, required this.owner_id, this.permissions, this.region, required this.afk_channel_id, required this.afkTimeout, this.widgetEnabled, this.widgetChannelID, required this.verificationLevel, required this.defaultMessageNotify, required this.explicitContentFilter, required this.roles, required this.emojis, required this.features, required this.mfaLevel, required this.applicationId, required this.systemChannelId, required this.systemChannelFlags, required this.rulesChannelId, this.maxPresences, this.maxMembers, required this.vanityUrlCode, required this.description, required this.banner, required this.premiumTier, this.premiumSubscriptionCount, required this.preferredLocale, required this.publicUpdateChannelId, this.maxVideoChannelUsers, this.maxStageVideoChannelUsers, this.approximateMemberCount, this.approximatePresenceCount, this.welcomeScreen, required this.nsfwLevel, this.stickers, required this.premiumProgressBarEnabled, required this.safetyAlertsChannelId}); String encode() { return json.encode(toJson()); } Map toJson() { List> rolesJs = []; for (Role role in roles) { rolesJs.add(role.toJson()); } List> emojiJs = []; for (Emoji emoji in emojis) { emojiJs.add(emoji.toJson()); } List featureJs = []; for (GuildFeatures feature in features) { featureJs.add(feature.name); } List>? stickersJs = null; if (stickers != null) { stickersJs = []; for (Sticker sticker in stickers!) { stickersJs.add(sticker.toJson()); } } return { "id": id.toString(), "name": name, "icon": icon ?? null, if (icon_hash != null) "icon_hash": icon_hash, "splash": splash ?? null, "discovery_splash": discoverySplash ?? null, if (owner != null) "owner": owner, "owner_id": owner_id.toString(), if (permissions != null) "permissions": permissions.toString(), if (region != null) "region": region, "afk_channel_id": afk_channel_id ?? null, if (widgetEnabled != null) "widget_enabled": widgetEnabled, if (widgetChannelID != null) "widget_channel_id": widgetChannelID, "verification_level": verificationLevel, "default_message_notifications": defaultMessageNotify, "explicit_content_filter": explicitContentFilter, "roles": rolesJs, "emojis": emojiJs, "features": featureJs, "mfa_level": mfaLevel, "application_id": applicationId == null ? null : applicationId.toString(), "system_channel_id": systemChannelId == null ? null : systemChannelId.toString(), "system_channel_flags": systemChannelFlags, "rules_channel_id": rulesChannelId != null ? rulesChannelId.toString() : null, if (maxPresences != null) "max_presences": maxPresences, if (maxMembers != null) "max_members": maxMembers, "vanity_url_code": vanityUrlCode, "description": description, "banner": banner, "premium_tier": premiumTier, if (premiumSubscriptionCount != null) "premium_subscription_count": premiumSubscriptionCount, "preferred_locale": preferredLocale, "public_updates_channel_id": publicUpdateChannelId == null ? null : publicUpdateChannelId.toString(), if (maxVideoChannelUsers != null) "max_video_channel_users": maxVideoChannelUsers, if (maxStageVideoChannelUsers != null) "max_stage_video_channel_users": maxStageVideoChannelUsers, if (approximateMemberCount != null) "approximate_member_count": approximateMemberCount, if (approximatePresenceCount != null) "approximate_presence_count": approximatePresenceCount, if (welcomeScreen != null) "welcome_screen": welcomeScreen!.toJson(), "nsfw_level": nsfwLevel, if (stickers != null) "stickers": stickersJs, "premium_progress_bar_enabled": premiumProgressBarEnabled, "safety_alerts_channel_id": safetyAlertsChannelId == null ? null : safetyAlertsChannelId.toString() }; } factory Guild.fromJson(String js) { return Guild.decode(json.decode(js)); } factory Guild.decode(Map js) { List JsRoles = []; List> rolesJs = js['roles'] as List>; for (var entry in rolesJs) { JsRoles.add(Role.decode(entry)); } List JsEmoji = []; for (var entry in js['emojis'] as List>) { JsEmoji.add(Emoji.decode(entry)); } List JsFeatures = []; for (var entry in js['features'] as List) { GuildFeatures? gf = GuildFeatures.byName(entry); if (gf != null) JsFeatures.add(gf); } List? JsSStickers = null; if (js.containsKey("stickers")) { JsSStickers = []; for (var entry in js['stickers'] as List>) { JsSStickers.add(Sticker.decode(entry)); } } return Guild( id: Snowflake.parse(js['id'], Snowflake.DiscordEpoch), name: js['name'], icon: js['icon'], icon_hash: setor(js, "icon_hash", null), splash: js['splash'], discoverySplash: js['discovery_splash'], permissions: js.containsKey("permissions") ? BitMask.of(int.parse(js['permissions'])) : null, owner_id: Snowflake.parse(js['owner_id'], Snowflake.DiscordEpoch), afk_channel_id: js['afk_channel_id'] == null ? null : Snowflake.parse(js['afk_channel_id'], Snowflake.DiscordEpoch), afkTimeout: int.parse(js['afk_timeout']), widgetEnabled: js['widget_enabled'] == null ? null : bool.parse(js['widget_enabled']), verificationLevel: int.parse(js['verification_level']), defaultMessageNotify: int.parse(js['default_message_notifications']), explicitContentFilter: int.parse(js['explicit_content_filter']), roles: JsRoles, emojis: JsEmoji, features: JsFeatures, mfaLevel: int.parse(js['mfa_level']), applicationId: js['application_id'] == null ? null : Snowflake.parse(js['application_id'], Snowflake.DiscordEpoch), systemChannelId: js['system_channel_id'] == null ? null : Snowflake.parse(js['system_channel_id'], Snowflake.DiscordEpoch), systemChannelFlags: int.parse(js['system_channel_flags']), rulesChannelId: js['rules_channel_id'] == null ? null : Snowflake.parse(js['rules_channel_id'], Snowflake.DiscordEpoch), maxPresences: js.containsKey("max_presences") ? int.parse(js['max_presences']) : null, maxMembers: js.containsKey("max_members") ? int.parse(js['max_members']) : null, vanityUrlCode: setor(js, "vanity_url_code", null), description: setor(js, "description", null), banner: setor(js, "banner", null), premiumTier: int.parse(js['premium_tier']), premiumSubscriptionCount: js.containsKey("premium_subscription_count") ? int.parse(js['premium_subscription_count']) : null, preferredLocale: js['preferred_locale'], publicUpdateChannelId: js['public_updates_channel_id'] == null ? null : Snowflake.parse( js['public_updates_channel_id'], Snowflake.DiscordEpoch), maxVideoChannelUsers: js.containsKey("max_video_channel_users") ? int.parse(js['max_video_channel_users']) : null, maxStageVideoChannelUsers: js.containsKey("max_stage_video_channel_users") ? int.parse(js['max_stage_video_channel_users']) : null, approximateMemberCount: js.containsKey("approximate_member_count") ? int.parse(js['approximate_member_count']) : null, approximatePresenceCount: js.containsKey("approximate_presence_count") ? int.parse(js['approximate_presence_count']) : null, welcomeScreen: js.containsKey("welcome_screen") ? WelcomeScreen.decode(js['welcome_screen']) : null, nsfwLevel: int.parse(js['nsfw_level']), stickers: JsSStickers, premiumProgressBarEnabled: bool.parse(js['premium_progress_bar_enabled']), safetyAlertsChannelId: js['safety_alerts_channel_id'] != null ? Snowflake.parse( js['safety_alerts_channel_id'], Snowflake.DiscordEpoch) : null); } } class Role { Snowflake id; String name; int color; bool hoist; String? icon; String? unicodeEmoji; int position; BitMask perms; bool managed; bool mentionable; RoleTags? tags; BitMask flags; Role( {required this.id, required this.name, required this.color, required this.hoist, this.icon, this.unicodeEmoji, required this.position, required this.perms, required this.managed, required this.mentionable, this.tags, required this.flags}); String encode() { return json.encode(toJson()); } Map toJson() { return { "id": id.toString(), "name": name, "color": color, "hoist": hoist, if (icon != null) "icon": icon, if (unicodeEmoji != null) "unicode_emoji": unicodeEmoji, "position": position, "permissions": perms.toString(), "managed": managed, "mentionable": mentionable, if (tags != null) "tags": tags, "flags": flags }; } factory Role.fromJson(String js) { return Role.decode(json.decode(js)); } factory Role.decode(Map js) { return Role( id: Snowflake.parse(js['id'], Snowflake.DiscordEpoch), name: js['name'], color: int.parse(js['color']), hoist: bool.parse(js['hoist']), icon: js['icon'] == null ? null : js['icon'], unicodeEmoji: js['unicode_emoji'] == null ? null : js['unicode_emoji'], position: int.parse(js['position']), perms: BitMask.of(int.parse(js['permissions'])), managed: bool.parse(js['managed']), mentionable: bool.parse(js['mentionable']), tags: js['tags'] == null ? null : RoleTags.decode(js['tags'] as Map), flags: BitMask.of(int.parse(js['flags']))); } } /// Represents one of discord's weird booleans in JSON that is null when true, and not present when false. class NullBool { dynamic getValue() { return null; } } class RoleTags { Snowflake? bot_id; Snowflake? integrationId; NullBool? premiumSubscriber; Snowflake? subscriptionListingId; NullBool? availableForPurchase; NullBool? guildConnections; RoleTags( {this.bot_id, this.integrationId, this.premiumSubscriber, this.subscriptionListingId, this.availableForPurchase, this.guildConnections}); String encode() { return json.encode(toJson()); } Map toJson() { return { if (bot_id != null) "bot_id": bot_id.toString(), if (integrationId != null) "integration_id": integrationId.toString(), if (premiumSubscriber != null) "premium_subscriber": null, if (subscriptionListingId != null) "subscription_listing_id": subscriptionListingId.toString(), if (availableForPurchase != null) "available_for_purchase": null, if (guildConnections != null) "guild_connections": null }; } factory RoleTags.fromJson(String js) { return RoleTags.decode(json.decode(js)); } factory RoleTags.decode(Map js) { return RoleTags( bot_id: js['bot_id'] == null ? null : Snowflake.parse(js['bot_id'], Snowflake.DiscordEpoch), integrationId: js['integration_id'] == null ? null : Snowflake.parse(js['integration_id'], Snowflake.DiscordEpoch), premiumSubscriber: js.containsKey("premium_subscriber") ? NullBool() : null, subscriptionListingId: js['subscription_listing_id'] == null ? null : Snowflake.parse( js['subscription_listing_id'], Snowflake.DiscordEpoch), availableForPurchase: js.containsKey("available_for_purchase") ? NullBool() : null, guildConnections: js.containsKey("guild_connections") ? NullBool() : null); } } enum PermissionFlags { CREATE_INSTANT_INVITE, KICK_MEMBERS, BAN_MEMBERS, ADMINISTRATOR, MANAGE_CHANNELS, MANAGE_GUILD, ADD_REACTIONS, VIEW_AUDIT_LOGS, PRIORITY_SPEAKER, STREAM, VIEW_CHANNEL, SEND_MESSAGES, SEND_TTS_MESSAGES, MANAGE_MESSAGES, EMBED_LINKS, ATTACH_FILES, READ_MESSAGE_HISTORY, MENTION_EVERYONE, USE_EXTERNAL_EMOJIS, VIEW_GUILD_INSIGHTS, CONNECT, SPEAK, MUTE_MEMBERS, DEAFEN_MEMBERS, MOVE_MEMBERS, USE_VAD, CHANGE_NICKNAME, MANAGE_NICKNAMES, MANAGE_ROLES, MANAGE_WEBHOOKS, MANAGE_GUILD_EXPRESSIONS, USE_APPLICATION_COMMANDS, REQUEST_TO_SPEAK, MANAGE_EVENTS, MANAGE_THREADS, CREATE_PUBLIC_THREADS, CREATE_PRIVATE_THREADS, USE_EXTERNAL_STICKERS, SEND_MESSAGES_IN_THREADS, USE_EMBEDDED_ACTIVITIES, MODERATE_MEMBERS, VIEW_CREATOR_MONETIZATION_ANALYTICS, USE_SOUNDBOARD, CREATE_GUILD_EXPRESSIONS, CREATE_EVENTS, USE_EXTERNAL_SOUNDS, SEND_VOICE_MESSAGES, SEND_POLLS, USE_EXTERNAL_APPS } class Emoji { Snowflake id; String? name; List? roles; User? user; bool? requireColons; bool? managed; bool? animated; bool? available; Emoji( {required this.id, required this.name, this.roles, this.user, this.requireColons, this.managed, this.animated, this.available}); String encode() { return json.encode(toJson()); } Map toJson() { List> rolesJs = []; if (roles != null) { for (Role role in roles!) { rolesJs.add(role.toJson()); } } return { "id": id.toString(), "name": name, if (roles != null) "roles": rolesJs, if (user != null) "user": user!.toJson(), if (requireColons != null) "require_colons": requireColons, if (managed != null) "managed": managed, if (animated != null) "animated": animated, if (available != null) "available": available }; } factory Emoji.fromJson(String js) { return Emoji.decode(json.decode(js)); } factory Emoji.decode(Map js) { List? JsRoles = null; if (js.containsKey("roles")) { JsRoles = []; for (var entry in js['roles'] as List>) { JsRoles.add(Role.decode(entry)); } } return Emoji( id: Snowflake.parse(js['id'], Snowflake.DiscordEpoch), name: js['name'], roles: JsRoles, user: js.containsKey("user") ? User.decode(js['user']) : null, requireColons: js.containsKey("require_colons") ? bool.parse(js['require_colons']) : null, managed: js.containsKey("managed") ? bool.parse(js['managed']) : null, animated: js.containsKey("animated") ? bool.parse(js['animated']) : null, available: js.containsKey("available") ? bool.parse(js['available']) : null); } } /// Values obtained by names enum GuildFeatures { ANIMATED_BANNER, ANIMATED_ICON, APPLICATION_COMMAND_PERMISSIONS_V2, AUTO_MODERATION, BANNER, /// Required Administrator COMMUNITY, CREATOR_MONETIZABLE_PROVISIONAL, CREATOR_STORE_PAGE, DEVELOPER_SUPPORT_SERVER, /// Required Administrator DISCOVERABLE, FEATURABLE, /// Requires Manage Guild INVITES_DISABLED, INVITE_SPLASH, MEMBER_VERIFICATION_GATE_ENABLED, MORE_STICKERS, NEWS, PARTNERED, PREVIEW_ENABLED, /// Requires Manage Guild RAID_ALERTS_DISABLED, ROLE_ICONS, ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE, ROLE_SUBSCRIPTIONS_ENABLED, TICKETED_EVENTS_ENABLED, VANITY_URL, VERIFIED, VIP_REGIONS, WELCOME_SCREEN_ENABLED; static GuildFeatures? byName(String sName) { for (GuildFeatures gf in GuildFeatures.values) { if (gf.name == sName) return gf; } return null; } } /// Flags obtained by value enum SystemChannelFlags { SUPPRESS_JOIN_NOTIFICATIONS, SUPPRESS_PREMIUM_SUBSCRIPTIONS, SUPPRESS_GUILD_REMINDER_NOTIFICATIONS, SUPPRESS_JOIN_NOTIFICATION_REPLIES, SUPPRESS_ROLE_SUBSCRIPTION_PURCHASE_NOTIFICATIONS, SUPPRESS_ROLE_SUBSCRIPTION_PURCHASE_NOTIFICATION_REPLIES } /// Levels obtained by index enum PremiumTiers { NONE, TIER_1, TIER_2, TIER_3 } /// Levels obtained by index enum GuildNSFWLevel { DEFAULT, EXPLICIT, SAFE, AGE_RESTRICTED } /// Levels obtained by index enum VerificationLevel { NONE, LOW, MEDIUM, HIGH, VERY_HIGH } /// Levels obtained by index enum MFALevel { NONE, ELEVATED } /// Levels obtains by index enum ExplicitContentFilterLevels { DISABLED, MEMBERS_WITHOUT_ROLES, ALL_MEMBERS } /// Levels obtained via index enum DefaultMessageNotificationLevel { ALL_MESSAGES, ONLY_MEMBERS } class WelcomeScreen { String? description; List welcomeChannels; WelcomeScreen({required this.description, required this.welcomeChannels}); String encode() { return json.encode(toJson()); } Map toJson() { List> wscJs = []; for (WelcomeScreenChannel wsc in welcomeChannels) { wscJs.add(wsc.toJson()); } return {"description": description, "welcome_channels": wscJs}; } factory WelcomeScreen.fromJson(String js) { return WelcomeScreen.decode(json.decode(js)); } factory WelcomeScreen.decode(Map js) { List wsc = []; for (var entry in js['welcome_channels']) { wsc.add(WelcomeScreenChannel.decode(entry)); } return WelcomeScreen(description: js['description'], welcomeChannels: wsc); } } class WelcomeScreenChannel { Snowflake channelId; String description; Snowflake? emojiId; String? emojiName; WelcomeScreenChannel( {required this.channelId, required this.description, required this.emojiId, required this.emojiName}); String encode() { return json.encode(toJson()); } Map toJson() { return { "channel_id": channelId.toString(), "description": description, "emoji_id": emojiId == null ? null : emojiId.toString(), "emoji_name": emojiName }; } factory WelcomeScreenChannel.fromJson(String js) { return WelcomeScreenChannel.decode(json.decode(js)); } factory WelcomeScreenChannel.decode(Map js) { return WelcomeScreenChannel( channelId: Snowflake.parse(js['channel_id'], Snowflake.DiscordEpoch), description: js['description'], emojiId: js['emoji_id'] == null ? null : Snowflake.parse(js['emoji_id'], Snowflake.DiscordEpoch), emojiName: js['emoji_name']); } }