コード例 #1
0
        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);
        }
コード例 #2
0
        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}\".");
        }
コード例 #3
0
        /// <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}\"."
                    );
                }
            }
        }