From 807cd81e786d71c4083b258e56cc0207b7053c4e Mon Sep 17 00:00:00 2001 From: Vic256 Date: Thu, 30 Jun 2022 00:22:06 +0200 Subject: [PATCH 1/9] feat: WIP Implement scheduled event --- lib/api.dart | 4 +- lib/src/api/{ => guilds}/guild.dart | 0 lib/src/api/{ => guilds}/guild_member.dart | 0 lib/src/api/guilds/guild_scheduled_event.dart | 76 +++++++++++++++++++ .../guild_scheduled_event_manager.dart | 20 +++++ 5 files changed, 98 insertions(+), 2 deletions(-) rename lib/src/api/{ => guilds}/guild.dart (100%) rename lib/src/api/{ => guilds}/guild_member.dart (100%) create mode 100644 lib/src/api/guilds/guild_scheduled_event.dart create mode 100644 lib/src/api/managers/guild_scheduled_event_manager.dart diff --git a/lib/api.dart b/lib/api.dart index e3ff51861..36062255f 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -10,10 +10,10 @@ export 'src/api/application.dart' show Application; export 'src/api/user.dart' show User; export 'src/api/status.dart' show Status, StatusType; export 'src/api/activity.dart' show Activity; -export 'src/api/guild_member.dart' show GuildMember; +export 'src/api/guilds/guild_member.dart' show GuildMember; export 'src/api/voice.dart' show Voice; -export 'src/api/guild.dart' show Guild; +export 'src/api/guilds/guild.dart' show Guild; export 'src/api/moderation_rule.dart' show ModerationEventType, ModerationTriggerType, ModerationPresetType, ModerationActionType, ModerationTriggerMetadata, ModerationActionMetadata, ModerationAction, ModerationRule; export 'src/api/webhook.dart' show Webhook; diff --git a/lib/src/api/guild.dart b/lib/src/api/guilds/guild.dart similarity index 100% rename from lib/src/api/guild.dart rename to lib/src/api/guilds/guild.dart diff --git a/lib/src/api/guild_member.dart b/lib/src/api/guilds/guild_member.dart similarity index 100% rename from lib/src/api/guild_member.dart rename to lib/src/api/guilds/guild_member.dart diff --git a/lib/src/api/guilds/guild_scheduled_event.dart b/lib/src/api/guilds/guild_scheduled_event.dart new file mode 100644 index 000000000..c16ca3557 --- /dev/null +++ b/lib/src/api/guilds/guild_scheduled_event.dart @@ -0,0 +1,76 @@ +import 'package:mineral/api.dart'; +import 'package:mineral/src/api/managers/channel_manager.dart'; +import 'package:mineral/src/api/managers/member_manager.dart'; + +import 'package:collection/collection.dart'; + +enum ScheduledEventStatus { + scheduled(1), + active(2), + completed(3), + canceled(4); + + final int value; + const ScheduledEventStatus(this.value); +} + +enum ScheduledEventEntityType { + stageInstance(1), + voice(2), + external(3); + + final int value; + const ScheduledEventEntityType(this.value); +} + +class GuildScheduledEvent { + Snowflake id; + //Guild guild; + Channel? channel; + User? creator; + String name; + String? description; + DateTime startTime; + DateTime? endTime; + ScheduledEventStatus status; + ScheduledEventEntityType entityType; + Snowflake entityId; + int? subscribers; + String? image; + + GuildScheduledEvent({ + required this.id, + //required this.guild, + required this.channel, + required this.creator, + required this.name, + required this.description, + required this.startTime, + required this.endTime, + required this.status, + required this.entityType, + required this.entityId, + required this.subscribers, + required this.image + }); + + factory GuildScheduledEvent.from({ required ChannelManager channelManager, required MemberManager memberManager, required payload }) { + return GuildScheduledEvent( + id: payload['id'], + //guild: guild, + channel: payload['channel_id'] != null ? channelManager.cache.get(payload['channel_id']) : null, + creator: payload['creator_id'] != null ? memberManager.cache.get(payload['creator_id']) : null, + name: payload['name'], + description: payload['description'], + startTime: DateTime.parse(payload['scheduled_start_time']), + endTime: payload['scheduled_end_time'] ? DateTime.parse(payload['scheduled_end_time']) : null, + status: ScheduledEventStatus.values.firstWhere((element) => element.value == payload['status']), + entityType: ScheduledEventEntityType.values.firstWhere((element) => element.value == payload['entity_type']), + entityId: payload['entity_id'], + subscribers: payload['user_count'], + image: payload['image'] + ); + } + + +} \ No newline at end of file diff --git a/lib/src/api/managers/guild_scheduled_event_manager.dart b/lib/src/api/managers/guild_scheduled_event_manager.dart new file mode 100644 index 000000000..820e784e2 --- /dev/null +++ b/lib/src/api/managers/guild_scheduled_event_manager.dart @@ -0,0 +1,20 @@ +import 'package:mineral/api.dart'; +import 'package:mineral/src/api/guilds/guild_scheduled_event.dart'; +import 'package:mineral/src/api/managers/cache_manager.dart'; + +class GuildScheduledEventManager implements CacheManager { + @override + Map cache = {}; + + Snowflake? guildId; + late Guild guild; + + GuildScheduledEventManager({ required this.guildId }); + + @override + Future> sync() async { + // TODO: implement sync + throw UnimplementedError(); + } + +} \ No newline at end of file From 93ca6cb95bc8be461a5484d2857ec20ae2baa007 Mon Sep 17 00:00:00 2001 From: Vic256 Date: Thu, 30 Jun 2022 15:28:29 +0200 Subject: [PATCH 2/9] feat: Implements GSEvent in Guild --- lib/src/api/guilds/guild.dart | 5 +++++ lib/src/api/guilds/guild_scheduled_event.dart | 8 +++----- .../internal/websockets/packets/guild_create.dart | 14 ++++++++++++++ .../internal/websockets/packets/guild_update.dart | 7 ++++++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/lib/src/api/guilds/guild.dart b/lib/src/api/guilds/guild.dart index 146725e25..de3dfd14e 100644 --- a/lib/src/api/guilds/guild.dart +++ b/lib/src/api/guilds/guild.dart @@ -12,6 +12,7 @@ import 'package:mineral/src/api/managers/moderation_rule_manager.dart'; import 'package:mineral/src/api/managers/role_manager.dart'; import 'package:mineral/src/api/managers/sticker_manager.dart'; import 'package:mineral/src/api/managers/webhook_manager.dart'; +import 'package:mineral/src/api/managers/guild_scheduled_event_manager.dart'; import 'package:mineral/src/api/sticker.dart'; import 'package:mineral/src/api/welcome_screen.dart'; @@ -75,6 +76,7 @@ class Guild { EmojiManager emojis; ModerationRuleManager moderationRules; GuildWebhookManager webhooks; + GuildScheduledEventManager scheduledEvents; Guild({ required this.id, @@ -121,6 +123,7 @@ class Guild { required this.features, required this.moderationRules, required this.webhooks, + required this.scheduledEvents, }); /// Modifies the [name] of this. @@ -348,6 +351,7 @@ class Guild { required ChannelManager channelManager, required ModerationRuleManager moderationRuleManager, required WebhookManager webhookManager, + required GuildScheduledEventManager guildScheduledEventManager, required dynamic payload }) { StickerManager stickerManager = StickerManager(guildId: payload['id']); @@ -407,6 +411,7 @@ class Guild { welcomeScreen: payload['welcome_screen'] != null ? WelcomeScreen.from(payload['welcome_screen']) : null, moderationRules: moderationRuleManager, webhooks: GuildWebhookManager.fromManager(webhookManager: webhookManager), + scheduledEvents: guildScheduledEventManager ); } } diff --git a/lib/src/api/guilds/guild_scheduled_event.dart b/lib/src/api/guilds/guild_scheduled_event.dart index c16ca3557..39575fc44 100644 --- a/lib/src/api/guilds/guild_scheduled_event.dart +++ b/lib/src/api/guilds/guild_scheduled_event.dart @@ -27,14 +27,14 @@ class GuildScheduledEvent { Snowflake id; //Guild guild; Channel? channel; - User? creator; + GuildMember? creator; String name; String? description; DateTime startTime; DateTime? endTime; ScheduledEventStatus status; ScheduledEventEntityType entityType; - Snowflake entityId; + Snowflake? entityId; int? subscribers; String? image; @@ -63,7 +63,7 @@ class GuildScheduledEvent { name: payload['name'], description: payload['description'], startTime: DateTime.parse(payload['scheduled_start_time']), - endTime: payload['scheduled_end_time'] ? DateTime.parse(payload['scheduled_end_time']) : null, + endTime: payload['scheduled_end_time'] != null ? DateTime.parse(payload['scheduled_end_time']) : null, status: ScheduledEventStatus.values.firstWhere((element) => element.value == payload['status']), entityType: ScheduledEventEntityType.values.firstWhere((element) => element.value == payload['entity_type']), entityId: payload['entity_id'], @@ -71,6 +71,4 @@ class GuildScheduledEvent { image: payload['image'] ); } - - } \ No newline at end of file diff --git a/lib/src/internal/websockets/packets/guild_create.dart b/lib/src/internal/websockets/packets/guild_create.dart index 2c0caadc1..937c7c4e7 100644 --- a/lib/src/internal/websockets/packets/guild_create.dart +++ b/lib/src/internal/websockets/packets/guild_create.dart @@ -4,8 +4,10 @@ import 'package:http/http.dart'; import 'package:mineral/api.dart'; import 'package:mineral/core.dart'; import 'package:mineral/src/api/channels/channel.dart'; +import 'package:mineral/src/api/guilds/guild_scheduled_event.dart'; import 'package:mineral/src/api/managers/channel_manager.dart'; import 'package:mineral/src/api/managers/emoji_manager.dart'; +import 'package:mineral/src/api/managers/guild_scheduled_event_manager.dart'; import 'package:mineral/src/api/managers/member_manager.dart'; import 'package:mineral/src/api/managers/moderation_rule_manager.dart'; import 'package:mineral/src/api/managers/role_manager.dart'; @@ -66,6 +68,17 @@ class GuildCreate implements WebsocketPacket { emojiManager.cache.putIfAbsent(emoji.id, () => emoji); } + GuildScheduledEventManager guildScheduledManager = GuildScheduledEventManager(guildId: websocketResponse.payload['id']); + for(dynamic payload in websocketResponse.payload['guild_scheduled_events']) { + GuildScheduledEvent event = GuildScheduledEvent.from( + channelManager: channelManager, + memberManager: memberManager, + payload: payload + ); + + guildScheduledManager.cache.putIfAbsent(event.id, () => event); + } + ModerationRuleManager moderationManager = ModerationRuleManager(guildId: websocketResponse.payload['id']); WebhookManager webhookManager = WebhookManager(guildId: websocketResponse.payload['id']); @@ -77,6 +90,7 @@ class GuildCreate implements WebsocketPacket { channelManager: channelManager, moderationRuleManager: moderationManager, webhookManager: webhookManager, + guildScheduledEventManager: guildScheduledManager, payload: websocketResponse.payload, ); diff --git a/lib/src/internal/websockets/packets/guild_update.dart b/lib/src/internal/websockets/packets/guild_update.dart index 90d540fd9..c1d08a31f 100644 --- a/lib/src/internal/websockets/packets/guild_update.dart +++ b/lib/src/internal/websockets/packets/guild_update.dart @@ -2,6 +2,7 @@ import 'package:mineral/api.dart'; import 'package:mineral/core.dart'; import 'package:mineral/src/api/managers/channel_manager.dart'; import 'package:mineral/src/api/managers/emoji_manager.dart'; +import 'package:mineral/src/api/managers/guild_scheduled_event_manager.dart'; import 'package:mineral/src/api/managers/member_manager.dart'; import 'package:mineral/src/api/managers/moderation_rule_manager.dart'; import 'package:mineral/src/api/managers/role_manager.dart'; @@ -41,6 +42,9 @@ class GuildUpdate implements WebsocketPacket { WebhookManager webhookManager = WebhookManager(guildId: websocketResponse.payload['id']); webhookManager.cache.addAll(before.webhooks.cache); + GuildScheduledEventManager guildScheduledEventManager = GuildScheduledEventManager(guildId: websocketResponse.payload['id']); + guildScheduledEventManager.cache.addAll(before.scheduledEvents.cache); + Guild after = Guild.from( emojiManager: emojiManager, memberManager: memberManager, @@ -48,7 +52,8 @@ class GuildUpdate implements WebsocketPacket { channelManager: channelManager, moderationRuleManager: moderationManager, webhookManager: webhookManager, - payload: websocketResponse.payload + payload: websocketResponse.payload, + guildScheduledEventManager: guildScheduledEventManager ); moderationManager.guild = after; From be7994a17d856c031f55fd5d74b58f3c96a21bcf Mon Sep 17 00:00:00 2001 From: Vic256 Date: Tue, 5 Jul 2022 18:02:38 +0200 Subject: [PATCH 3/9] feat: Implement create and edit events --- lib/api.dart | 2 ++ lib/src/api/guilds/guild_scheduled_event.dart | 7 +++-- lib/src/constants.dart | 6 +++++ .../packets/guild_scheduled_event_create.dart | 26 ++++++++++++++++++ .../packets/guild_scheduled_event_update.dart | 27 +++++++++++++++++++ .../internal/websockets/sharding/shard.dart | 2 +- .../websockets/sharding/shard_handler.dart | 9 ++++++- .../websockets/websocket_dispatcher.dart | 4 +++ 8 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 lib/src/internal/websockets/packets/guild_scheduled_event_create.dart create mode 100644 lib/src/internal/websockets/packets/guild_scheduled_event_update.dart diff --git a/lib/api.dart b/lib/api.dart index 36062255f..cab09ba5f 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -16,6 +16,8 @@ export 'src/api/voice.dart' show Voice; export 'src/api/guilds/guild.dart' show Guild; export 'src/api/moderation_rule.dart' show ModerationEventType, ModerationTriggerType, ModerationPresetType, ModerationActionType, ModerationTriggerMetadata, ModerationActionMetadata, ModerationAction, ModerationRule; +export 'src/api/guilds/guild_scheduled_event.dart' show ScheduledEventStatus, ScheduledEventEntityType, GuildScheduledEvent; + export 'src/api/webhook.dart' show Webhook; export 'src/api/channels/channel.dart' show Channel, ChannelType; diff --git a/lib/src/api/guilds/guild_scheduled_event.dart b/lib/src/api/guilds/guild_scheduled_event.dart index 39575fc44..5bcfe03e7 100644 --- a/lib/src/api/guilds/guild_scheduled_event.dart +++ b/lib/src/api/guilds/guild_scheduled_event.dart @@ -35,6 +35,7 @@ class GuildScheduledEvent { ScheduledEventStatus status; ScheduledEventEntityType entityType; Snowflake? entityId; + String? location; int? subscribers; String? image; @@ -51,7 +52,8 @@ class GuildScheduledEvent { required this.entityType, required this.entityId, required this.subscribers, - required this.image + required this.image, + required this.location, }); factory GuildScheduledEvent.from({ required ChannelManager channelManager, required MemberManager memberManager, required payload }) { @@ -68,7 +70,8 @@ class GuildScheduledEvent { entityType: ScheduledEventEntityType.values.firstWhere((element) => element.value == payload['entity_type']), entityId: payload['entity_id'], subscribers: payload['user_count'], - image: payload['image'] + image: payload['image'], + location: payload['entity_metadata'] != null && payload['entity_metadata']['location'] != null ? payload['entity_metadata']['location'] : null ); } } \ No newline at end of file diff --git a/lib/src/constants.dart b/lib/src/constants.dart index 39e3b678d..33d6b121d 100644 --- a/lib/src/constants.dart +++ b/lib/src/constants.dart @@ -29,6 +29,12 @@ enum PacketType { autoModerationRuleCreate('AUTO_MODERATION_RULE_CREATE'), autoModerationRuleDelete('AUTO_MODERATION_RULE_DELETE'), + guildScheduledEventCreate('GUILD_SCHEDULED_EVENT_CREATE'), + guildScheduledEventDelete('GUILD_SCHEDULED_EVENT_DELETE'), + guildScheduledEventUpdate('GUILD_SCHEDULED_EVENT_UPDATE'), + guildScheduledEventUserAdd('GUILD_SCHEDULED_EVENT_USER_ADD'), + guildScheduledEventUserRemove('GUILD_SCHEDULED_EVENT_USER_REMOVE'), + webhookUpdate('WEBHOOKS_UPDATE'), messageCreate('MESSAGE_CREATE'), diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_create.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_create.dart new file mode 100644 index 000000000..52140d80b --- /dev/null +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_create.dart @@ -0,0 +1,26 @@ +import 'package:mineral/api.dart'; +import 'package:mineral/core.dart'; +import 'package:mineral/src/internal/entities/event_manager.dart'; +import 'package:mineral/src/internal/websockets/websocket_packet.dart'; +import 'package:mineral/src/internal/websockets/websocket_response.dart'; + +class GuildScheduledEventCreate implements WebsocketPacket { + @override + PacketType packetType = PacketType.guildScheduledEventCreate; + + @override + Future handle(WebsocketResponse websocketResponse) async { + EventManager manager = ioc.singleton(ioc.services.event); + MineralClient client = ioc.singleton(ioc.services.client); + + dynamic payload = websocketResponse.payload; + + Guild? guild = client.guilds.cache.get(payload['guild_id']); + if (guild != null) { + GuildScheduledEvent event = GuildScheduledEvent.from(channelManager: guild.channels, memberManager: guild.members, payload: payload); + guild.scheduledEvents.cache.set(event.id, event); + + manager.emit(Events.guildScheduledEventCreate, [event]); + } + } +} diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_update.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_update.dart new file mode 100644 index 000000000..c0495b2e7 --- /dev/null +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_update.dart @@ -0,0 +1,27 @@ +import 'package:mineral/api.dart'; +import 'package:mineral/core.dart'; +import 'package:mineral/src/internal/entities/event_manager.dart'; +import 'package:mineral/src/internal/websockets/websocket_packet.dart'; +import 'package:mineral/src/internal/websockets/websocket_response.dart'; + +class GuildScheduledEventUpdate implements WebsocketPacket { + @override + PacketType packetType = PacketType.guildScheduledEventCreate; + + @override + Future handle(WebsocketResponse websocketResponse) async { + EventManager manager = ioc.singleton(ioc.services.event); + MineralClient client = ioc.singleton(ioc.services.client); + + dynamic payload = websocketResponse.payload; + + Guild? guild = client.guilds.cache.get(payload['guild_id']); + if (guild != null) { + GuildScheduledEvent? before = guild.scheduledEvents.cache.get(payload['id']); + GuildScheduledEvent after = GuildScheduledEvent.from(channelManager: guild.channels, memberManager: guild.members, payload: payload); + guild.scheduledEvents.cache.set(after.id, after); + + manager.emit(Events.guildScheduledEventUpdate, [before, after]); + } + } +} diff --git a/lib/src/internal/websockets/sharding/shard.dart b/lib/src/internal/websockets/sharding/shard.dart index afbafd449..66d2895c6 100644 --- a/lib/src/internal/websockets/sharding/shard.dart +++ b/lib/src/internal/websockets/sharding/shard.dart @@ -90,7 +90,7 @@ class Shard { final WebsocketResponse data = message.data as WebsocketResponse; final OpCode? opCode = OpCode.values.firstWhereOrNull((element) => element.value == data.op); - Console.debug(message: '[DATA] ${opCode.toString()} | ${data.payload}', prefix: 'Shard #$id'); + Console.debug(message: '[DATA] ${opCode.toString()} | ${data.type ?? ''} ${data.payload}', prefix: 'Shard #$id'); switch(opCode) { case OpCode.heartbeat: return _heartbeat.reset(); diff --git a/lib/src/internal/websockets/sharding/shard_handler.dart b/lib/src/internal/websockets/sharding/shard_handler.dart index b6b89943f..39f301c97 100644 --- a/lib/src/internal/websockets/sharding/shard_handler.dart +++ b/lib/src/internal/websockets/sharding/shard_handler.dart @@ -44,7 +44,14 @@ Future shardHandler(SendPort shardPort) async { })); } - _connect(); + try { + _connect(); + } catch (exception) { + shardPort.send(ShardMessage(command: ShardCommand.error, data: { + 'reason': exception, + 'code': socket.closeCode + })); + } /// Disconnect from the websocket Future disconnect() async { diff --git a/lib/src/internal/websockets/websocket_dispatcher.dart b/lib/src/internal/websockets/websocket_dispatcher.dart index 04129c1df..db21938ed 100644 --- a/lib/src/internal/websockets/websocket_dispatcher.dart +++ b/lib/src/internal/websockets/websocket_dispatcher.dart @@ -8,6 +8,8 @@ import 'package:mineral/src/internal/websockets/packets/channel_update.dart'; import 'package:mineral/src/internal/websockets/packets/guild_create.dart'; import 'package:mineral/src/internal/websockets/packets/guild_integrations_update.dart'; import 'package:mineral/src/internal/websockets/packets/guild_member_update.dart'; +import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_create.dart'; +import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_update.dart'; import 'package:mineral/src/internal/websockets/packets/guild_update.dart'; import 'package:mineral/src/internal/websockets/packets/interaction_create.dart'; import 'package:mineral/src/internal/websockets/packets/message_create.dart'; @@ -41,6 +43,8 @@ class WebsocketDispatcher { register(PacketType.interactionCreate, InteractionCreate()); register(PacketType.autoModerationRuleCreate, AutoModerationRuleCreate()); register(PacketType.autoModerationRuleDelete, AutoModerationRuleDelete()); + register(PacketType.guildScheduledEventCreate, GuildScheduledEventCreate()); + register(PacketType.guildScheduledEventUpdate, GuildScheduledEventUpdate()); register(PacketType.webhookUpdate, WebhookUpdate()); register(PacketType.guildIntegrationsUpdate, GuildIntegrationsUpdate()); } From 6b890d6d6ac6014fb68dbef410e67ae26faac284 Mon Sep 17 00:00:00 2001 From: Vic256 Date: Tue, 5 Jul 2022 18:21:30 +0200 Subject: [PATCH 4/9] feat: Implement delete event --- .../packets/guild_scheduled_event_delete.dart | 37 +++++++++++++++++++ .../internal/websockets/sharding/shard.dart | 3 +- .../websockets/websocket_dispatcher.dart | 2 + 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 lib/src/internal/websockets/packets/guild_scheduled_event_delete.dart diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_delete.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_delete.dart new file mode 100644 index 000000000..2cb7e7a57 --- /dev/null +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_delete.dart @@ -0,0 +1,37 @@ +import 'dart:convert'; + +import 'package:mineral/api.dart'; +import 'package:mineral/core.dart'; +import 'package:mineral/src/internal/entities/event_manager.dart'; +import 'package:mineral/src/internal/websockets/websocket_packet.dart'; +import 'package:mineral/src/internal/websockets/websocket_response.dart'; + +class GuildScheduledEventDelete implements WebsocketPacket { + @override + PacketType packetType = PacketType.guildScheduledEventCreate; + + @override + Future handle(WebsocketResponse websocketResponse) async { + EventManager manager = ioc.singleton(ioc.services.event); + MineralClient client = ioc.singleton(ioc.services.client); + + dynamic payload = websocketResponse.payload; + + Guild? guild = client.guilds.cache.get(payload['guild_id']); + GuildScheduledEvent? event = guild?.scheduledEvents.cache.get(payload['id']); + + if(event != null) { + guild?.scheduledEvents.cache.remove(event.id); + manager.emit(Events.guildScheduledEventDelete, [event]); + } + + /* + if (guild != null) { + GuildScheduledEvent? before = guild.scheduledEvents.cache.get(payload['id']); + GuildScheduledEvent after = GuildScheduledEvent.from(channelManager: guild.channels, memberManager: guild.members, payload: payload); + guild.scheduledEvents.cache.set(after.id, after); + + manager.emit(Events.guildScheduledEventUpdate, [before, after]); + }*/ + } +} diff --git a/lib/src/internal/websockets/sharding/shard.dart b/lib/src/internal/websockets/sharding/shard.dart index 66d2895c6..090609100 100644 --- a/lib/src/internal/websockets/sharding/shard.dart +++ b/lib/src/internal/websockets/sharding/shard.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:io'; import 'dart:isolate'; import 'dart:async'; @@ -90,7 +91,7 @@ class Shard { final WebsocketResponse data = message.data as WebsocketResponse; final OpCode? opCode = OpCode.values.firstWhereOrNull((element) => element.value == data.op); - Console.debug(message: '[DATA] ${opCode.toString()} | ${data.type ?? ''} ${data.payload}', prefix: 'Shard #$id'); + Console.debug(message: '[DATA] ${opCode.toString()} | ${data.type ?? ''} ${jsonEncode(data.payload)}', prefix: 'Shard #$id'); switch(opCode) { case OpCode.heartbeat: return _heartbeat.reset(); diff --git a/lib/src/internal/websockets/websocket_dispatcher.dart b/lib/src/internal/websockets/websocket_dispatcher.dart index db21938ed..b7f238942 100644 --- a/lib/src/internal/websockets/websocket_dispatcher.dart +++ b/lib/src/internal/websockets/websocket_dispatcher.dart @@ -9,6 +9,7 @@ import 'package:mineral/src/internal/websockets/packets/guild_create.dart'; import 'package:mineral/src/internal/websockets/packets/guild_integrations_update.dart'; import 'package:mineral/src/internal/websockets/packets/guild_member_update.dart'; import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_create.dart'; +import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_delete.dart'; import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_update.dart'; import 'package:mineral/src/internal/websockets/packets/guild_update.dart'; import 'package:mineral/src/internal/websockets/packets/interaction_create.dart'; @@ -45,6 +46,7 @@ class WebsocketDispatcher { register(PacketType.autoModerationRuleDelete, AutoModerationRuleDelete()); register(PacketType.guildScheduledEventCreate, GuildScheduledEventCreate()); register(PacketType.guildScheduledEventUpdate, GuildScheduledEventUpdate()); + register(PacketType.guildScheduledEventDelete, GuildScheduledEventDelete()); register(PacketType.webhookUpdate, WebhookUpdate()); register(PacketType.guildIntegrationsUpdate, GuildIntegrationsUpdate()); } From 4431546c7ff97078573c424b3872fcfc0057713a Mon Sep 17 00:00:00 2001 From: Vic256 Date: Tue, 5 Jul 2022 22:23:55 +0200 Subject: [PATCH 5/9] feat: Implement users cache and user add event --- lib/api.dart | 2 +- lib/src/api/client/mineral_client.dart | 4 +++ lib/src/api/guilds/guild_scheduled_event.dart | 12 +++++++ lib/src/api/managers/user_manager.dart | 12 +++++++ .../websockets/packets/guild_create.dart | 5 ++- .../guild_scheduled_event_user_add.dart | 32 +++++++++++++++++++ .../websockets/websocket_dispatcher.dart | 2 ++ 7 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 lib/src/api/managers/user_manager.dart create mode 100644 lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart diff --git a/lib/api.dart b/lib/api.dart index cab09ba5f..f4095faf6 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -16,7 +16,7 @@ export 'src/api/voice.dart' show Voice; export 'src/api/guilds/guild.dart' show Guild; export 'src/api/moderation_rule.dart' show ModerationEventType, ModerationTriggerType, ModerationPresetType, ModerationActionType, ModerationTriggerMetadata, ModerationActionMetadata, ModerationAction, ModerationRule; -export 'src/api/guilds/guild_scheduled_event.dart' show ScheduledEventStatus, ScheduledEventEntityType, GuildScheduledEvent; +export 'src/api/guilds/guild_scheduled_event.dart' show ScheduledEventStatus, ScheduledEventEntityType, GuildScheduledEvent, ScheduledEventUser; export 'src/api/webhook.dart' show Webhook; diff --git a/lib/src/api/client/mineral_client.dart b/lib/src/api/client/mineral_client.dart index 2a7d1f2c1..03314a7de 100644 --- a/lib/src/api/client/mineral_client.dart +++ b/lib/src/api/client/mineral_client.dart @@ -1,6 +1,7 @@ import 'package:mineral/api.dart'; import 'package:mineral/core.dart'; import 'package:mineral/src/api/managers/guild_manager.dart'; +import 'package:mineral/src/api/managers/user_manager.dart'; import 'package:mineral/src/internal/websockets/sharding/shard_manager.dart'; import '../../internal/entities/command_manager.dart'; @@ -71,6 +72,7 @@ class ClientActivity { class MineralClient { User user; GuildManager guilds; + UserManager users; String sessionId; Application application; List intents; @@ -78,6 +80,7 @@ class MineralClient { MineralClient({ required this.user, required this.guilds, + required this.users, required this.sessionId, required this.application, required this.intents, @@ -122,6 +125,7 @@ class MineralClient { return MineralClient( user: User.from(payload['user']), guilds: GuildManager(), + users: UserManager(), sessionId: payload['session_id'], application: Application.from(payload['application']), intents: manager.intents diff --git a/lib/src/api/guilds/guild_scheduled_event.dart b/lib/src/api/guilds/guild_scheduled_event.dart index 5bcfe03e7..15c14fd99 100644 --- a/lib/src/api/guilds/guild_scheduled_event.dart +++ b/lib/src/api/guilds/guild_scheduled_event.dart @@ -23,6 +23,18 @@ enum ScheduledEventEntityType { const ScheduledEventEntityType(this.value); } +class ScheduledEventUser { + User user; + GuildScheduledEvent event; + GuildMember? member; + + ScheduledEventUser({ + required this.user, + required this.event, + required this.member + }); +} + class GuildScheduledEvent { Snowflake id; //Guild guild; diff --git a/lib/src/api/managers/user_manager.dart b/lib/src/api/managers/user_manager.dart new file mode 100644 index 000000000..222ccf179 --- /dev/null +++ b/lib/src/api/managers/user_manager.dart @@ -0,0 +1,12 @@ +import 'package:mineral/api.dart'; +import 'package:mineral/src/api/managers/cache_manager.dart'; + +class UserManager implements CacheManager { + @override + Map cache = {}; + + @override + Future> sync() { + throw UnimplementedError(); + } +} diff --git a/lib/src/internal/websockets/packets/guild_create.dart b/lib/src/internal/websockets/packets/guild_create.dart index 937c7c4e7..187440e3f 100644 --- a/lib/src/internal/websockets/packets/guild_create.dart +++ b/lib/src/internal/websockets/packets/guild_create.dart @@ -35,14 +35,17 @@ class GuildCreate implements WebsocketPacket { MemberManager memberManager = MemberManager(guildId: websocketResponse.payload['id']); for (dynamic member in websocketResponse.payload['members']) { + User user = User.from(member['user']); + GuildMember guildMember = GuildMember.from( roles: roleManager, - user: User.from(member['user']), + user: user, member: member, guildId: websocketResponse.payload['id'] ); memberManager.cache.putIfAbsent(guildMember.user.id, () => guildMember); + client.users.cache.putIfAbsent(user.id, () => user); } ChannelManager channelManager = ChannelManager(guildId: websocketResponse.payload['id']); diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart new file mode 100644 index 000000000..fd2c3ccbd --- /dev/null +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart @@ -0,0 +1,32 @@ +import 'package:mineral/api.dart'; +import 'package:mineral/core.dart'; +import 'package:mineral/src/internal/entities/event_manager.dart'; +import 'package:mineral/src/internal/websockets/websocket_packet.dart'; +import 'package:mineral/src/internal/websockets/websocket_response.dart'; + +class GuildScheduledEventUserAdd implements WebsocketPacket { + @override + PacketType packetType = PacketType.guildScheduledEventUserAdd; + + @override + Future handle(WebsocketResponse websocketResponse) async { + EventManager manager = ioc.singleton(ioc.services.event); + MineralClient client = ioc.singleton(ioc.services.client); + + dynamic payload = websocketResponse.payload; + final Snowflake eventId = payload['guild_scheduled_event_id']; + + final Guild? guild = payload['guild_id'] != null + ? client.guilds.cache.get(payload['guild_id']) + : client.guilds.cache.values.firstWhere((g) => g.scheduledEvents.cache.containsKey(eventId)); + + final User? user = client.users.cache.get(payload['user_id']); + + if(guild != null && user != null) { + final GuildMember? member = payload['guild_id'] != null ? guild.members.cache.get(user.id) : null; + + GuildScheduledEvent event = guild.scheduledEvents.cache.get(eventId)!; + manager.emit(Events.guildScheduledEventUserAdd, [user, event, member]); + } + } +} diff --git a/lib/src/internal/websockets/websocket_dispatcher.dart b/lib/src/internal/websockets/websocket_dispatcher.dart index b7f238942..05302f831 100644 --- a/lib/src/internal/websockets/websocket_dispatcher.dart +++ b/lib/src/internal/websockets/websocket_dispatcher.dart @@ -11,6 +11,7 @@ import 'package:mineral/src/internal/websockets/packets/guild_member_update.dart import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_create.dart'; import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_delete.dart'; import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_update.dart'; +import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_user_add.dart'; import 'package:mineral/src/internal/websockets/packets/guild_update.dart'; import 'package:mineral/src/internal/websockets/packets/interaction_create.dart'; import 'package:mineral/src/internal/websockets/packets/message_create.dart'; @@ -47,6 +48,7 @@ class WebsocketDispatcher { register(PacketType.guildScheduledEventCreate, GuildScheduledEventCreate()); register(PacketType.guildScheduledEventUpdate, GuildScheduledEventUpdate()); register(PacketType.guildScheduledEventDelete, GuildScheduledEventDelete()); + register(PacketType.guildScheduledEventUserAdd, GuildScheduledEventUserAdd()); register(PacketType.webhookUpdate, WebhookUpdate()); register(PacketType.guildIntegrationsUpdate, GuildIntegrationsUpdate()); } From 6e776c78279aa108ac71fdda412f314a8f0303e3 Mon Sep 17 00:00:00 2001 From: Vic256 Date: Tue, 5 Jul 2022 22:34:15 +0200 Subject: [PATCH 6/9] feat: Implement user remove event --- .../guild_scheduled_event_user_add.dart | 2 +- .../guild_scheduled_event_user_remove.dart | 32 +++++++++++++++++++ .../websockets/websocket_dispatcher.dart | 2 ++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 lib/src/internal/websockets/packets/guild_scheduled_event_user_remove.dart diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart index fd2c3ccbd..d93f96a2f 100644 --- a/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart @@ -26,7 +26,7 @@ class GuildScheduledEventUserAdd implements WebsocketPacket { final GuildMember? member = payload['guild_id'] != null ? guild.members.cache.get(user.id) : null; GuildScheduledEvent event = guild.scheduledEvents.cache.get(eventId)!; - manager.emit(Events.guildScheduledEventUserAdd, [user, event, member]); + manager.emit(Events.guildScheduledEventUserAdd, [event, user, member]); } } } diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_user_remove.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_user_remove.dart new file mode 100644 index 000000000..0bce0b712 --- /dev/null +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_user_remove.dart @@ -0,0 +1,32 @@ +import 'package:mineral/api.dart'; +import 'package:mineral/core.dart'; +import 'package:mineral/src/internal/entities/event_manager.dart'; +import 'package:mineral/src/internal/websockets/websocket_packet.dart'; +import 'package:mineral/src/internal/websockets/websocket_response.dart'; + +class GuildScheduledEventUserRemove implements WebsocketPacket { + @override + PacketType packetType = PacketType.guildScheduledEventUserRemove; + + @override + Future handle(WebsocketResponse websocketResponse) async { + EventManager manager = ioc.singleton(ioc.services.event); + MineralClient client = ioc.singleton(ioc.services.client); + + dynamic payload = websocketResponse.payload; + final Snowflake eventId = payload['guild_scheduled_event_id']; + + final Guild? guild = payload['guild_id'] != null + ? client.guilds.cache.get(payload['guild_id']) + : client.guilds.cache.values.firstWhere((g) => g.scheduledEvents.cache.containsKey(eventId)); + + final User? user = client.users.cache.get(payload['user_id']); + + if(guild != null && user != null) { + final GuildMember? member = payload['guild_id'] != null ? guild.members.cache.get(user.id) : null; + + GuildScheduledEvent event = guild.scheduledEvents.cache.get(eventId)!; + manager.emit(Events.guildScheduledEventUserRemove, [event, user, member]); + } + } +} diff --git a/lib/src/internal/websockets/websocket_dispatcher.dart b/lib/src/internal/websockets/websocket_dispatcher.dart index 05302f831..aa91dbf35 100644 --- a/lib/src/internal/websockets/websocket_dispatcher.dart +++ b/lib/src/internal/websockets/websocket_dispatcher.dart @@ -12,6 +12,7 @@ import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_cr import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_delete.dart'; import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_update.dart'; import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_user_add.dart'; +import 'package:mineral/src/internal/websockets/packets/guild_scheduled_event_user_remove.dart'; import 'package:mineral/src/internal/websockets/packets/guild_update.dart'; import 'package:mineral/src/internal/websockets/packets/interaction_create.dart'; import 'package:mineral/src/internal/websockets/packets/message_create.dart'; @@ -49,6 +50,7 @@ class WebsocketDispatcher { register(PacketType.guildScheduledEventUpdate, GuildScheduledEventUpdate()); register(PacketType.guildScheduledEventDelete, GuildScheduledEventDelete()); register(PacketType.guildScheduledEventUserAdd, GuildScheduledEventUserAdd()); + register(PacketType.guildScheduledEventUserRemove, GuildScheduledEventUserRemove()); register(PacketType.webhookUpdate, WebhookUpdate()); register(PacketType.guildIntegrationsUpdate, GuildIntegrationsUpdate()); } From 8c04b267e589bdc608b7cac1fa83ece9297ce42f Mon Sep 17 00:00:00 2001 From: Vic256 Date: Tue, 5 Jul 2022 22:49:52 +0200 Subject: [PATCH 7/9] fix: Adapt to the new event system --- lib/src/internal/entities/event_manager.dart | 6 ++++++ .../websockets/packets/guild_scheduled_event_create.dart | 2 +- .../websockets/packets/guild_scheduled_event_delete.dart | 2 +- .../websockets/packets/guild_scheduled_event_update.dart | 2 +- .../websockets/packets/guild_scheduled_event_user_add.dart | 2 +- .../packets/guild_scheduled_event_user_remove.dart | 2 +- 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/src/internal/entities/event_manager.dart b/lib/src/internal/entities/event_manager.dart index 4a748cfa2..3da661513 100644 --- a/lib/src/internal/entities/event_manager.dart +++ b/lib/src/internal/entities/event_manager.dart @@ -69,6 +69,12 @@ enum Events { moderationRuleUpdate('update::moderation-rule', { 'before': ModerationRule, 'after': ModerationRule }), moderationRuleDelete('delete::moderation-rule', { 'rule': ModerationRule }), + guildScheduledEventCreate('create::scheduled-event', { 'event': GuildScheduledEvent }), + guildScheduledEventDelete('delete::scheduled-event', { 'event': GuildScheduledEvent }), + guildScheduledEventUpdate('update::scheduled-event', { 'before': GuildScheduledEvent, 'after': GuildScheduledEvent }), + guildScheduledEventUserAdd('user-add::scheduled-event', { 'event': GuildScheduledEvent, 'user': User, 'member': 'GuildMember?' }), + guildScheduledEventUserRemove('user-remove::scheduled-event', { 'event': GuildScheduledEvent, 'user': User, 'member': 'GuildMember?' }), + messageCreate('create::message', { 'message': Message }), messageUpdate('update::message', { 'before': Message, 'after': Message }), messageDelete('delete::message', { 'message': Message }), diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_create.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_create.dart index 52140d80b..7bf8d0c6a 100644 --- a/lib/src/internal/websockets/packets/guild_scheduled_event_create.dart +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_create.dart @@ -20,7 +20,7 @@ class GuildScheduledEventCreate implements WebsocketPacket { GuildScheduledEvent event = GuildScheduledEvent.from(channelManager: guild.channels, memberManager: guild.members, payload: payload); guild.scheduledEvents.cache.set(event.id, event); - manager.emit(Events.guildScheduledEventCreate, [event]); + manager.emit(event: Events.guildScheduledEventCreate, params: [event]); } } } diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_delete.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_delete.dart index 2cb7e7a57..d4890c1fc 100644 --- a/lib/src/internal/websockets/packets/guild_scheduled_event_delete.dart +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_delete.dart @@ -22,7 +22,7 @@ class GuildScheduledEventDelete implements WebsocketPacket { if(event != null) { guild?.scheduledEvents.cache.remove(event.id); - manager.emit(Events.guildScheduledEventDelete, [event]); + manager.emit(event: Events.guildScheduledEventDelete, params: [event]); } /* diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_update.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_update.dart index c0495b2e7..7f88a8168 100644 --- a/lib/src/internal/websockets/packets/guild_scheduled_event_update.dart +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_update.dart @@ -21,7 +21,7 @@ class GuildScheduledEventUpdate implements WebsocketPacket { GuildScheduledEvent after = GuildScheduledEvent.from(channelManager: guild.channels, memberManager: guild.members, payload: payload); guild.scheduledEvents.cache.set(after.id, after); - manager.emit(Events.guildScheduledEventUpdate, [before, after]); + manager.emit(event: Events.guildScheduledEventUpdate, params: [before, after]); } } } diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart index d93f96a2f..3347223de 100644 --- a/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_user_add.dart @@ -26,7 +26,7 @@ class GuildScheduledEventUserAdd implements WebsocketPacket { final GuildMember? member = payload['guild_id'] != null ? guild.members.cache.get(user.id) : null; GuildScheduledEvent event = guild.scheduledEvents.cache.get(eventId)!; - manager.emit(Events.guildScheduledEventUserAdd, [event, user, member]); + manager.emit(event: Events.guildScheduledEventUserAdd, params: [event, user, member]); } } } diff --git a/lib/src/internal/websockets/packets/guild_scheduled_event_user_remove.dart b/lib/src/internal/websockets/packets/guild_scheduled_event_user_remove.dart index 0bce0b712..92b22fb3c 100644 --- a/lib/src/internal/websockets/packets/guild_scheduled_event_user_remove.dart +++ b/lib/src/internal/websockets/packets/guild_scheduled_event_user_remove.dart @@ -26,7 +26,7 @@ class GuildScheduledEventUserRemove implements WebsocketPacket { final GuildMember? member = payload['guild_id'] != null ? guild.members.cache.get(user.id) : null; GuildScheduledEvent event = guild.scheduledEvents.cache.get(eventId)!; - manager.emit(Events.guildScheduledEventUserRemove, [event, user, member]); + manager.emit(event: Events.guildScheduledEventUserRemove, params: [event, user, member]); } } } From 111d0736e9b39e9943f616f48376cd9863082c03 Mon Sep 17 00:00:00 2001 From: Vic256 Date: Tue, 5 Jul 2022 23:18:44 +0200 Subject: [PATCH 8/9] feat: Add cache sync --- .../guild_scheduled_event_manager.dart | 31 +++++++++++++++---- .../websockets/packets/guild_create.dart | 2 +- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/lib/src/api/managers/guild_scheduled_event_manager.dart b/lib/src/api/managers/guild_scheduled_event_manager.dart index 820e784e2..943f67c5c 100644 --- a/lib/src/api/managers/guild_scheduled_event_manager.dart +++ b/lib/src/api/managers/guild_scheduled_event_manager.dart @@ -1,5 +1,8 @@ +import 'dart:convert'; + +import 'package:http/http.dart'; import 'package:mineral/api.dart'; -import 'package:mineral/src/api/guilds/guild_scheduled_event.dart'; +import 'package:mineral/core.dart'; import 'package:mineral/src/api/managers/cache_manager.dart'; class GuildScheduledEventManager implements CacheManager { @@ -9,12 +12,28 @@ class GuildScheduledEventManager implements CacheManager { Snowflake? guildId; late Guild guild; - GuildScheduledEventManager({ required this.guildId }); + GuildScheduledEventManager({required this.guildId}); @override Future> sync() async { - // TODO: implement sync - throw UnimplementedError(); - } + final Http http = ioc.singleton(ioc.services.http); + + Response response = await http.get(url: "/guilds/$guildId/scheduled-events"); + if (response.statusCode == 200) { + cache.clear(); -} \ No newline at end of file + dynamic payload = jsonDecode(response.body); + for (dynamic element in payload) { + GuildScheduledEvent event = GuildScheduledEvent.from( + channelManager: guild.channels, + memberManager: guild.members, + payload: element + ); + + cache.putIfAbsent(event.id, () => event); + } + } + + return cache; + } +} diff --git a/lib/src/internal/websockets/packets/guild_create.dart b/lib/src/internal/websockets/packets/guild_create.dart index 187440e3f..ca0dc959c 100644 --- a/lib/src/internal/websockets/packets/guild_create.dart +++ b/lib/src/internal/websockets/packets/guild_create.dart @@ -127,7 +127,7 @@ class GuildCreate implements WebsocketPacket { guild.publicUpdatesChannel = guild.channels.cache.get(guild.publicUpdatesChannelId); guild.emojis.guild = guild; guild.roles.guild = guild; - webhookManager.guild = guild; + guild.scheduledEvents.guild = guild; guild.webhooks.guild = guild; Map? autoModerationRules = await getAutoModerationRules(guild); From 6cb996257884e4d91e9899c1d027f36a1b89b041 Mon Sep 17 00:00:00 2001 From: Vic256 Date: Tue, 5 Jul 2022 23:24:47 +0200 Subject: [PATCH 9/9] fix: Remove subscribers --- lib/src/api/guilds/guild_scheduled_event.dart | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/src/api/guilds/guild_scheduled_event.dart b/lib/src/api/guilds/guild_scheduled_event.dart index 15c14fd99..2a1db3cba 100644 --- a/lib/src/api/guilds/guild_scheduled_event.dart +++ b/lib/src/api/guilds/guild_scheduled_event.dart @@ -37,7 +37,6 @@ class ScheduledEventUser { class GuildScheduledEvent { Snowflake id; - //Guild guild; Channel? channel; GuildMember? creator; String name; @@ -48,7 +47,6 @@ class GuildScheduledEvent { ScheduledEventEntityType entityType; Snowflake? entityId; String? location; - int? subscribers; String? image; GuildScheduledEvent({ @@ -63,7 +61,6 @@ class GuildScheduledEvent { required this.status, required this.entityType, required this.entityId, - required this.subscribers, required this.image, required this.location, }); @@ -81,7 +78,6 @@ class GuildScheduledEvent { status: ScheduledEventStatus.values.firstWhere((element) => element.value == payload['status']), entityType: ScheduledEventEntityType.values.firstWhere((element) => element.value == payload['entity_type']), entityId: payload['entity_id'], - subscribers: payload['user_count'], image: payload['image'], location: payload['entity_metadata'] != null && payload['entity_metadata']['location'] != null ? payload['entity_metadata']['location'] : null );