Skip to content

Commit f1b876e

Browse files
committed
Added new Models (WIP)
1 parent d01638e commit f1b876e

27 files changed

+963
-33
lines changed

lib/src/discord_client.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import 'dart:async';
22

3+
import 'package:discord_api/src/exceptions/discord_api_exceptions.dart';
4+
35
import 'models/discord_api_scope.dart';
6+
import 'models/discord_authorization_information.dart';
47
import 'models/discord_token.dart';
58
import 'providers/discord_http_client.dart';
69

@@ -76,7 +79,12 @@ class DiscordClient {
7679

7780
Future<DiscordAuthorizationInformation>
7881
getCurrentAuthorizationInformation() async {
79-
final data = await discordHttpClient
80-
.getCall([apiPath, versionPath, oauth2Path, '@me']);
82+
try {
83+
final data = await discordHttpClient
84+
.getCall([apiPath, versionPath, oauth2Path, '@me']);
85+
return DiscordAuthorizationInformation.fromJson(data);
86+
} catch (e) {
87+
throw DiscordApiException(e.toString());
88+
}
8189
}
8290
}

lib/src/models/discord_application.dart

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import 'package:discord_api/src/models/discord_application_flag.dart';
2+
import 'package:discord_api/src/models/discord_snowflake.dart';
3+
14
import 'discord_team.dart';
25
import 'discord_user.dart';
36

47
class DiscordApplication {
5-
/// The id of the application as a Discord snowflake.
6-
final String id;
8+
final DiscordSnowflake id;
79

810
final String name;
911
final String? icon;
@@ -18,11 +20,12 @@ class DiscordApplication {
1820
final String summary;
1921
final String verifyKey;
2022
final DiscordTeam? team;
21-
final String? guildId; // This is a snowflake too.
22-
final String? primarySkuId; // This is a snowflake too.
23+
final DiscordSnowflake? guildId;
24+
final DiscordSnowflake? primarySkuId;
2325
final String? slug;
2426
final String? coverImage;
2527
final int? flags;
28+
late final List<DiscordApplicationFlag>? _flagsAsEnum;
2629

2730
static const idEntry = 'id';
2831
static const nameEntry = 'name';
@@ -64,9 +67,41 @@ class DiscordApplication {
6467
this.flags,
6568
});
6669

70+
void _addFlagAsEnum(String r, int index, DiscordApplicationFlag flag) {
71+
if (r.length >= index + 1 && r.substring(index, index + 1) == '1') {
72+
_flagsAsEnum!.add(flag);
73+
}
74+
}
75+
76+
List<DiscordApplicationFlag> get flagsAsEnum {
77+
if (flags == null) {
78+
return <DiscordApplicationFlag>[];
79+
}
80+
if (_flagsAsEnum != null) {
81+
return _flagsAsEnum!;
82+
}
83+
_flagsAsEnum = <DiscordApplicationFlag>[];
84+
final radixString =
85+
String.fromCharCodes(flags!.toRadixString(2).runes.toList().reversed);
86+
_addFlagAsEnum(radixString, 12, DiscordApplicationFlag.gatewayPresence);
87+
_addFlagAsEnum(
88+
radixString, 13, DiscordApplicationFlag.gatewayPresenceLimited);
89+
_addFlagAsEnum(radixString, 14, DiscordApplicationFlag.gatewayGuildMembers);
90+
_addFlagAsEnum(
91+
radixString, 15, DiscordApplicationFlag.gatewayGuildMembersLimited);
92+
_addFlagAsEnum(
93+
radixString, 16, DiscordApplicationFlag.verificationPendingGuildLimit);
94+
_addFlagAsEnum(radixString, 17, DiscordApplicationFlag.embedded);
95+
_addFlagAsEnum(
96+
radixString, 18, DiscordApplicationFlag.gatewayMessageContent);
97+
_addFlagAsEnum(
98+
radixString, 19, DiscordApplicationFlag.gatewayMessageContentLimited);
99+
return _flagsAsEnum!;
100+
}
101+
67102
factory DiscordApplication.fromJson(Map<String, dynamic> json) =>
68103
DiscordApplication(
69-
id: json[idEntry] as String,
104+
id: DiscordSnowflake(json[idEntry]),
70105
name: json[nameEntry] as String,
71106
icon: json[iconEntry] as String?,
72107
description: json[descriptionEntry] as String,
@@ -83,8 +118,12 @@ class DiscordApplication {
83118
team: json[teamEntry] != null
84119
? DiscordTeam.fromJson(json[teamEntry])
85120
: null,
86-
guildId: json[guildIdEntry] as String?,
87-
primarySkuId: json[primarySkuIdEntry] as String?,
121+
guildId: json[guildIdEntry] != null
122+
? DiscordSnowflake(json[guildIdEntry])
123+
: null,
124+
primarySkuId: json[primarySkuIdEntry] != null
125+
? DiscordSnowflake(json[primarySkuIdEntry])
126+
: null,
88127
slug: json[slugEntry] as String?,
89128
coverImage: json[coverImageEntry] as String?,
90129
flags: json[flagsEntry] as int?,
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
import 'package:discord_api/src/models/discord_overwrite.dart';
2+
import 'package:discord_api/src/models/discord_snowflake.dart';
3+
import 'package:discord_api/src/models/discord_thread_member.dart';
4+
import 'package:discord_api/src/models/discord_thread_metadata.dart';
5+
import 'package:discord_api/src/models/discord_user.dart';
6+
import 'package:discord_api/src/models/discord_video_quality_mode.dart';
7+
8+
import 'discord_channel_type.dart';
9+
10+
class DiscordChannel {
11+
final DiscordSnowflake id;
12+
final int type;
13+
late final DiscordChannelType? _typeAsEnum;
14+
final DiscordSnowflake? guildId;
15+
final int? position;
16+
final List<DiscordOverwrite>? permissionOverwrites;
17+
final String? name;
18+
final String? topic;
19+
final bool? nsfw;
20+
final DiscordSnowflake? lastMessageId;
21+
final int? bitrate;
22+
final int? userLimit;
23+
final int? rateLimitPerUser;
24+
final List<DiscordUser>? recipients;
25+
final String? icon;
26+
final DiscordSnowflake? ownerId;
27+
final DiscordSnowflake? parentId;
28+
final String? lastPinTimestamp;
29+
late final DateTime? _lastPinTimestampAsDateTime;
30+
final String? rtcRegion; // Id of a voice region
31+
final int? videoQualityMode;
32+
late final DiscordVideoQualityMode? _videoQualityModeAsEnum;
33+
final int? messageCount; // approximative + caps at 50
34+
final int? memberCount; // approximative + caps at 50
35+
final DiscordThreadMetadata? threadMetadata;
36+
final DiscordThreadMember? member;
37+
final int? defaultAutoArchiveDuration;
38+
final String? permissions;
39+
40+
static const idEntry = 'id';
41+
static const typeEntry = 'type';
42+
static const guildIdEntry = 'guild_id';
43+
static const positionEntry = 'position';
44+
static const permissionOverwritesEntry = 'permission_overwrites';
45+
static const nameEntry = 'name';
46+
static const topicEntry = 'topic';
47+
static const nsfwEntry = 'nsfw';
48+
static const lastMessageIdEntry = 'last_message_id';
49+
static const bitrateEntry = 'bitrate';
50+
static const userLimitEntry = 'user_limit';
51+
static const rateLimitPerUserEntry = 'rate_limit_per_user';
52+
static const recipientsEntry = 'recipients';
53+
static const iconEntry = 'icon';
54+
static const ownerIdEntry = 'owner_id';
55+
static const parentIdEntry = 'parent_id';
56+
static const lastPinTimestampEntry = 'last_pin_timestamp';
57+
static const rtcRegionEntry = 'rtc_region';
58+
static const videoQualityModeEntry = 'video_quality_mode';
59+
static const messageCountEntry = 'message_count';
60+
static const memberCountEntry = 'member_count';
61+
static const threadMetadataEntry = 'thread_metadata';
62+
static const memberEntry = 'member';
63+
static const defaultAutoArchiveDurationEntry =
64+
'default_auto_archive_duration';
65+
static const permissionsEntry = 'permissions';
66+
67+
DiscordChannel({
68+
required this.id,
69+
required this.type,
70+
this.guildId,
71+
this.position,
72+
this.permissionOverwrites,
73+
this.name,
74+
this.topic,
75+
this.nsfw,
76+
this.lastMessageId,
77+
this.bitrate,
78+
this.userLimit,
79+
this.rateLimitPerUser,
80+
this.recipients,
81+
this.icon,
82+
this.ownerId,
83+
this.parentId,
84+
this.lastPinTimestamp,
85+
this.rtcRegion,
86+
this.videoQualityMode,
87+
this.messageCount,
88+
this.memberCount,
89+
this.threadMetadata,
90+
this.member,
91+
this.defaultAutoArchiveDuration,
92+
this.permissions,
93+
});
94+
95+
DateTime? get lastPinTimestampAsDateTime {
96+
if (lastPinTimestamp == null) return null;
97+
_lastPinTimestampAsDateTime ??= DateTime.parse(lastPinTimestamp!);
98+
return _lastPinTimestampAsDateTime;
99+
}
100+
101+
DiscordVideoQualityMode? get videoQualityModeAsEnum {
102+
if (videoQualityMode == null) return null;
103+
_videoQualityModeAsEnum ??=
104+
DiscordVideoQualityMode.values[videoQualityMode!];
105+
}
106+
107+
factory DiscordChannel.fromJson(Map<String, dynamic> json) => DiscordChannel(
108+
id: DiscordSnowflake(json[idEntry]),
109+
type: json[typeEntry] as int,
110+
guildId: json[guildIdEntry] != null
111+
? DiscordSnowflake(json[guildIdEntry])
112+
: null,
113+
position: json[positionEntry] as int?,
114+
permissionOverwrites: json[permissionOverwritesEntry] != null
115+
? List<DiscordOverwrite>.from(
116+
json[permissionOverwritesEntry]!.map(DiscordOverwrite.fromJson))
117+
: null,
118+
name: json[nameEntry] as String?,
119+
topic: json[topicEntry] as String?,
120+
nsfw: json[nsfwEntry] as bool?,
121+
lastMessageId: json[lastMessageIdEntry] != null
122+
? DiscordSnowflake(json[lastMessageIdEntry])
123+
: null,
124+
bitrate: json[bitrateEntry] as int?,
125+
userLimit: json[userLimitEntry] as int?,
126+
rateLimitPerUser: json[rateLimitPerUserEntry] as int?,
127+
recipients: json[recipientsEntry] != null
128+
? List<DiscordUser>.from(
129+
json[recipientsEntry]!.map(DiscordUser.fromJson))
130+
: null,
131+
icon: json[iconEntry] as String?,
132+
ownerId: json[ownerIdEntry] != null
133+
? DiscordSnowflake(json[ownerIdEntry])
134+
: null,
135+
parentId: json[parentIdEntry] != null
136+
? DiscordSnowflake(json[parentIdEntry])
137+
: null,
138+
lastPinTimestamp: json[lastPinTimestampEntry] as String?,
139+
rtcRegion: json[rtcRegionEntry] as String?,
140+
videoQualityMode: json[videoQualityModeEntry] as int?,
141+
messageCount: json[messageCountEntry] as int?,
142+
memberCount: json[memberCountEntry] as int?,
143+
threadMetadata: json[threadMetadataEntry] != null
144+
? DiscordThreadMetadata.fromJson(json[threadMetadataEntry])
145+
: null,
146+
member: json[memberEntry] != null
147+
? DiscordThreadMember.fromJson(json[memberEntry])
148+
: null,
149+
defaultAutoArchiveDuration:
150+
json[defaultAutoArchiveDurationEntry] as int?,
151+
permissions: json[permissionsEntry] as String?,
152+
);
153+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
enum DiscordChannelType {
2+
guildText,
3+
dm,
4+
guildVoice,
5+
groupDm,
6+
guildCategory,
7+
guildNews,
8+
guildStore,
9+
unused7,
10+
unused8,
11+
unused9,
12+
guildNewsThread,
13+
guildPublicThread,
14+
guildPrivateThread,
15+
guildStageVoice,
16+
}

0 commit comments

Comments
 (0)