Add some more data structures

This commit is contained in:
zontreck 2024-07-11 02:15:08 -07:00
parent 8cbf2466cf
commit eae1f391de
5 changed files with 818 additions and 1 deletions

View file

View file

View file

@ -0,0 +1,705 @@
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<Role> roles;
List<Emoji> emojis;
List<GuildFeatures> 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<Sticker>? 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<String, dynamic> toJson() {
List<Map<String, dynamic>> rolesJs = [];
for (Role role in roles) {
rolesJs.add(role.toJson());
}
List<Map<String, dynamic>> emojiJs = [];
for (Emoji emoji in emojis) {
emojiJs.add(emoji.toJson());
}
List<String> featureJs = [];
for (GuildFeatures feature in features) {
featureJs.add(feature.name);
}
List<Map<String, dynamic>>? 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<String, dynamic> js) {
List<Role> JsRoles = [];
List<Map<String, dynamic>> rolesJs =
js['roles'] as List<Map<String, dynamic>>;
for (var entry in rolesJs) {
JsRoles.add(Role.decode(entry));
}
List<Emoji> JsEmoji = [];
for (var entry in js['emojis'] as List<Map<String, dynamic>>) {
JsEmoji.add(Emoji.decode(entry));
}
List<GuildFeatures> JsFeatures = [];
for (var entry in js['features'] as List<String>) {
GuildFeatures? gf = GuildFeatures.byName(entry);
if (gf != null) JsFeatures.add(gf);
}
List<Sticker>? JsSStickers = null;
if (js.containsKey("stickers")) {
JsSStickers = [];
for (var entry in js['stickers'] as List<Map<String, dynamic>>) {
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<String, dynamic> 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<String, dynamic> 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<String, dynamic>),
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<String, dynamic> 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<String, dynamic> 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<Role>? 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<String, dynamic> toJson() {
List<Map<String, dynamic>> 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<String, dynamic> js) {
List<Role>? JsRoles = null;
if (js.containsKey("roles")) {
JsRoles = [];
for (var entry in js['roles'] as List<Map<String, dynamic>>) {
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<WelcomeScreenChannel> welcomeChannels;
WelcomeScreen({required this.description, required this.welcomeChannels});
String encode() {
return json.encode(toJson());
}
Map<String, dynamic> toJson() {
List<Map<String, dynamic>> 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<String, dynamic> js) {
List<WelcomeScreenChannel> 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<String, dynamic> 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<String, dynamic> 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']);
}
}

View file

@ -0,0 +1,112 @@
import 'dart:convert';
import 'package:libac_dart/discord/structures/user.dart';
import '../../structs/Snowflake.dart';
class Sticker {
Snowflake id;
Snowflake? packId;
String name;
String? description;
String tags;
String? asset;
int type;
int formatType;
bool? available;
Snowflake? guildId;
User? user;
int? sortValue;
Sticker(
{required this.id,
this.packId,
required this.name,
required this.description,
required this.tags,
this.asset,
required this.type,
required this.formatType,
this.available,
this.guildId,
this.user,
this.sortValue});
String encode() {
return json.encode(toJson());
}
Map<String, dynamic> toJson() {
return {
"id": id.toString(),
if (packId != null) "pack_id": packId.toString(),
"name": name,
"description": description,
"tags": tags,
if (asset != null) "asset": asset,
"type": type,
"format_type": formatType,
if (available != null) "available": available,
if (guildId != null) "guild_id": guildId,
if (user != null) "user": user!.toJson(),
if (sortValue != null) "sort_value": sortValue
};
}
factory Sticker.fromJson(String js) {
return Sticker.decode(json.decode(js));
}
factory Sticker.decode(Map<String, dynamic> js) {
return Sticker(
id: Snowflake.parse(js['id'], Snowflake.DiscordEpoch),
packId: js.containsKey("pack_id")
? Snowflake.parse(js['pack_id'], Snowflake.DiscordEpoch)
: null,
name: js['name'],
description: js['description'],
tags: js['tags'],
asset: js['asset'],
type: js['type'],
formatType: js['format_type'],
available:
js.containsKey("available") ? bool.parse(js['available']) : null,
guildId: js.containsKey("guild_id")
? Snowflake.parse(js['guild_id'], Snowflake.DiscordEpoch)
: null,
user: js.containsKey("user") ? User.decode(js['user']) : null,
sortValue:
js.containsKey("sort_value") ? int.parse(js['sort_value']) : null);
}
}
enum StickerType { STANDARD, GUILD }
enum StickerFormatTypes { PNG, APNG, LOTTIE, GIF }
class StickerItem {
Snowflake id;
String name;
int formatType;
StickerItem({required this.id, required this.name, required this.formatType});
String encode() {
return json.encode(toJson());
}
Map<String, dynamic> toJson() {
return {"id": id.toString(), "name": name, "format_type": formatType};
}
factory StickerItem.fromJson(String js) {
return StickerItem.decode(json.decode(js));
}
factory StickerItem.decode(Map<String, dynamic> js) {
return StickerItem(
id: Snowflake.parse(js['id'], Snowflake.DiscordEpoch),
name: js['name'],
formatType: int.parse(js['format_type']));
}
}

View file

@ -1,6 +1,6 @@
name: libac_dart
description: "Aria's Creations code library"
version: 1.2.071024+0309
version: 1.2.071124+0214
homepage: "https://zontreck.com"