private async Task ArchiveRoleplayAsync(SocketGuild guild, Roleplay roleplay) { if (roleplay.DedicatedChannelID is null) { return; } if (roleplay.IsPublic) { await PostArchivedRoleplayAsync(guild, roleplay); } var dedicatedChannel = guild.GetTextChannel((ulong)roleplay.DedicatedChannelID); if (dedicatedChannel is null) { return; } // Ensure the messages are all caught up foreach (var message in await dedicatedChannel.GetMessagesAsync().FlattenAsync()) { // We don't care about the results here. await _roleplays.AddToOrUpdateMessageInRoleplayAsync(roleplay, message); } await _roleplays.DeleteDedicatedRoleplayChannelAsync(guild, roleplay); }
public async Task IncludePreviousMessagesAsync ( [NotNull] [RequireEntityOwnerOrPermission(typeof(EditRoleplay), PermissionTarget.Other)] Roleplay roleplay, [OverrideTypeReader(typeof(UncachedMessageTypeReader <IMessage>))] IMessage startMessage, [CanBeNull] [OverrideTypeReader(typeof(UncachedMessageTypeReader <IMessage>))] IMessage finalMessage = null ) { finalMessage = finalMessage ?? this.Context.Message; if (startMessage.Channel != finalMessage.Channel) { await _feedback.SendErrorAsync(this.Context, "The messages are not in the same channel."); return; } var addedOrUpdatedMessageCount = 0; var latestMessage = startMessage; while (latestMessage.Timestamp < finalMessage.Timestamp) { var messages = (await this.Context.Channel.GetMessagesAsync(latestMessage, Direction.After).FlattenAsync()).OrderBy(m => m.Timestamp).ToList(); latestMessage = messages.Last(); foreach (var message in messages) { // Jump out if we've passed the final message if (message.Timestamp > finalMessage.Timestamp) { break; } var modifyResult = await _roleplays.AddToOrUpdateMessageInRoleplayAsync(roleplay, message); if (modifyResult.IsSuccess) { ++addedOrUpdatedMessageCount; } } } await _feedback.SendConfirmationAsync(this.Context, $"{addedOrUpdatedMessageCount} messages added to \"{roleplay.Name}\"."); }
/// <summary> /// Ensures active roleplays are rescanned on startup in order to catch missed messages. /// </summary> /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns> protected override async Task Connected() { var activeRoleplays = _roleplays.GetRoleplays() .Where(r => r.DedicatedChannelID.HasValue); foreach (var activeRoleplay in activeRoleplays) { var guild = this.Client.GetGuild((ulong)activeRoleplay.ServerID); // ReSharper disable once PossibleInvalidOperationException var channel = guild.GetTextChannel((ulong)activeRoleplay.DedicatedChannelID.Value); if (channel is null) { continue; } var updatedMessages = 0; foreach (var message in await channel.GetMessagesAsync().FlattenAsync()) { // We don't care about the results here. var updateResult = await _roleplays.AddToOrUpdateMessageInRoleplayAsync(activeRoleplay, message); if (updateResult.IsSuccess) { ++updatedMessages; } } if (updatedMessages > 0) { this.Log.Info ( $"Added or updated {updatedMessages} missed {(updatedMessages > 1 ? "messages" : "message")} " + $"in \"{activeRoleplay.Name}\"." ); } } }