Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions lib/api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ 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/guilds/guild_scheduled_event.dart' show ScheduledEventStatus, ScheduledEventEntityType, GuildScheduledEvent, ScheduledEventUser;

export 'src/api/webhook.dart' show Webhook;

export 'src/api/channels/channel.dart' show Channel, ChannelType;
Expand Down
4 changes: 4 additions & 0 deletions lib/src/api/client/mineral_client.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -71,13 +72,15 @@ class ClientActivity {
class MineralClient {
User user;
GuildManager guilds;
UserManager users;
String sessionId;
Application application;
List<Intent> intents;

MineralClient({
required this.user,
required this.guilds,
required this.users,
required this.sessionId,
required this.application,
required this.intents,
Expand Down Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions lib/src/api/guild.dart → lib/src/api/guilds/guild.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -75,6 +76,7 @@ class Guild {
EmojiManager emojis;
ModerationRuleManager moderationRules;
GuildWebhookManager webhooks;
GuildScheduledEventManager scheduledEvents;

Guild({
required this.id,
Expand Down Expand Up @@ -121,6 +123,7 @@ class Guild {
required this.features,
required this.moderationRules,
required this.webhooks,
required this.scheduledEvents,
});

/// Modifies the [name] of this.
Expand Down Expand Up @@ -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']);
Expand Down Expand Up @@ -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
);
}
}
File renamed without changes.
85 changes: 85 additions & 0 deletions lib/src/api/guilds/guild_scheduled_event.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
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 ScheduledEventUser {
User user;
GuildScheduledEvent event;
GuildMember? member;

ScheduledEventUser({
required this.user,
required this.event,
required this.member
});
}

class GuildScheduledEvent {
Snowflake id;
Channel? channel;
GuildMember? creator;
String name;
String? description;
DateTime startTime;
DateTime? endTime;
ScheduledEventStatus status;
ScheduledEventEntityType entityType;
Snowflake? entityId;
String? location;
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.image,
required this.location,
});

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'] != 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'],
image: payload['image'],
location: payload['entity_metadata'] != null && payload['entity_metadata']['location'] != null ? payload['entity_metadata']['location'] : null
);
}
}
39 changes: 39 additions & 0 deletions lib/src/api/managers/guild_scheduled_event_manager.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import 'dart:convert';

import 'package:http/http.dart';
import 'package:mineral/api.dart';
import 'package:mineral/core.dart';
import 'package:mineral/src/api/managers/cache_manager.dart';

class GuildScheduledEventManager implements CacheManager<GuildScheduledEvent> {
@override
Map<Snowflake, GuildScheduledEvent> cache = {};

Snowflake? guildId;
late Guild guild;

GuildScheduledEventManager({required this.guildId});

@override
Future<Map<Snowflake, GuildScheduledEvent>> sync() async {
final Http http = ioc.singleton(ioc.services.http);

Response response = await http.get(url: "/guilds/$guildId/scheduled-events");
if (response.statusCode == 200) {
cache.clear();

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;
}
}
12 changes: 12 additions & 0 deletions lib/src/api/managers/user_manager.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:mineral/api.dart';
import 'package:mineral/src/api/managers/cache_manager.dart';

class UserManager implements CacheManager<User> {
@override
Map<Snowflake, User> cache = {};

@override
Future<Map<Snowflake, User>> sync() {
throw UnimplementedError();
}
}
6 changes: 6 additions & 0 deletions lib/src/constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
Expand Down
6 changes: 6 additions & 0 deletions lib/src/internal/entities/event_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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 }),
Expand Down
21 changes: 19 additions & 2 deletions lib/src/internal/websockets/packets/guild_create.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -33,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']);
Expand All @@ -66,6 +71,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']);
Expand All @@ -77,6 +93,7 @@ class GuildCreate implements WebsocketPacket {
channelManager: channelManager,
moderationRuleManager: moderationManager,
webhookManager: webhookManager,
guildScheduledEventManager: guildScheduledManager,
payload: websocketResponse.payload,
);

Expand Down Expand Up @@ -110,7 +127,7 @@ class GuildCreate implements WebsocketPacket {
guild.publicUpdatesChannel = guild.channels.cache.get<TextChannel>(guild.publicUpdatesChannelId);
guild.emojis.guild = guild;
guild.roles.guild = guild;
webhookManager.guild = guild;
guild.scheduledEvents.guild = guild;
guild.webhooks.guild = guild;

Map<Snowflake, ModerationRule>? autoModerationRules = await getAutoModerationRules(guild);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<void> 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(event: Events.guildScheduledEventCreate, params: [event]);
}
}
}
Original file line number Diff line number Diff line change
@@ -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<void> 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(event: Events.guildScheduledEventDelete, params: [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]);
}*/
}
}
Loading