/// <summary>
        /// Given guild data, list all of the optin channels.
        /// </summary>
        /// <param name="message">The source message (for replying to). May not be null.</param>
        /// <param name="guildConnection">A connection to the guild. May not be null.</param>
        /// <param name="guildData">The guild data. May not be null.</param>
        /// <returns>When listing has completed.</returns>
        private static async Task ListOptinChannels(SocketMessage message, SocketGuild guildConnection, Guild guildData)
        {
            var messageReference = new MessageReference(message.Id, message.Channel.Id, guildConnection.Id);
            var listResult       = listResultPool.Get();

            try
            {
                listResult = OptinChannel.List(guildConnection, guildData, listResult);

                switch (listResult.Result)
                {
                case OptinChannel.ListResult.ResultType.Success:
                    var namesDescriptions = listResult.NamesDescriptions;
                    if (namesDescriptions.Count > 0)
                    {
                        await message.Channel.SendMessageAsync(
                            ListOptinsGuildHandler.GetListingMessage(namesDescriptions),
                            messageReference : messageReference)
                        .ConfigureAwait(false);
                    }
                    else
                    {
                        await message.Channel.SendMessageAsync(
                            text : "This server deosn't have any opt-in channels yet. Try creating one with \"@Chill Bot new opt-in channel-name A description of your channel!\"",
                            messageReference : messageReference)
                        .ConfigureAwait(false);
                    }
                    break;

                case OptinChannel.ListResult.ResultType.NoOptinCategory:
                    await message.Channel.SendMessageAsync(
                        text : "This server is not set up for opt-in channels.",
                        messageReference : messageReference)
                    .ConfigureAwait(false);

                    break;

                default:
                    throw new NotImplementedException(listResult.Result.ToString());
                }
            }
            finally
            {
                listResult.ClearReferences();
                listResultPool.Return(listResult);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Implementers should derive from this to handle a matched message.
        /// </summary>
        /// <param name="message">The message received.</param>
        /// <param name="handleCache">The match object returned from the regex match.</param>
        /// <returns>The handle task.</returns>
        protected override async Task HandleMatchedMessage(SocketMessage message, Match handleCache)
        {
            var messageChannel   = message.Channel as SocketGuildChannel;
            var author           = message.Author as SocketGuildUser;
            var guildConnection  = messageChannel.Guild;
            var messageReference = new MessageReference(message.Id, messageChannel.Id, guildConnection.Id);
            var channelName      = handleCache.Groups[1].Captures[0].Value;

            if (!NewOptinGuildHandler.TryGetSecondMatch(handleCache, out string description))
            {
                await message.Channel.SendMessageAsync(
                    text : "The new channel's description must be something meaningful. Ideally something that explains what it is.",
                    messageReference : messageReference);

                return;
            }

            var checkoutResult = checkoutResultPool.Get();

            try
            {
                checkoutResult = await this.guildRepository.Checkout(guildConnection.Id, checkoutResult);

                switch (checkoutResult.Result)
                {
                case GuildCheckoutResult.ResultType.Success:
                    using (var borrowedGuild = checkoutResult.BorrowedGuild)
                    {
                        var guildData    = borrowedGuild.Instance;
                        var createResult = await OptinChannel.Create(
                            guildConnection : guildConnection,
                            guildData : guildData,
                            requestAuthor : author,
                            channelName : channelName,
                            description : description);

                        borrowedGuild.Commit = createResult == OptinChannel.CreateResult.Success;

                        switch (createResult)
                        {
                        case OptinChannel.CreateResult.Success:
                            await message.AddReactionAsync(NewOptinGuildHandler.SuccessEmoji)
                            .ConfigureAwait(false);

                            break;

                        case OptinChannel.CreateResult.NoPermissions:
                            await message.Channel.SendMessageAsync(
                                text : "You do not have permission to create opt-in channels.",
                                messageReference : messageReference)
                            .ConfigureAwait(false);

                            break;

                        case OptinChannel.CreateResult.NoOptinCategory:
                            await message.Channel.SendMessageAsync(
                                text : "This server is not set up for opt-in channels.",
                                messageReference : messageReference)
                            .ConfigureAwait(false);

                            break;

                        case OptinChannel.CreateResult.ChannelNameUsed:
                            await message.Channel.SendMessageAsync(
                                text : "An opt-in channel with this name already exists.",
                                messageReference : messageReference)
                            .ConfigureAwait(false);

                            break;

                        default:
                            throw new NotImplementedException(createResult.ToString());
                        }
                    }
                    break;

                case GuildCheckoutResult.ResultType.DoesNotExist:
                    await message.Channel.SendMessageAsync(
                        text : "This server has not been configured for Chill Bot yet.",
                        messageReference : messageReference)
                    .ConfigureAwait(false);

                    break;

                case GuildCheckoutResult.ResultType.Locked:
                    await message.Channel.SendMessageAsync(
                        text : "Please try again.",
                        messageReference : messageReference)
                    .ConfigureAwait(false);

                    break;

                default:
                    throw new NotImplementedException(checkoutResult.Result.ToString());
                }
            }
            catch (Exception e)
            {
                Logger.LogError(e, "Request dropped - exception thrown");
                await message.Channel.SendMessageAsync(
                    text : "Something went wrong trying to do this for you. File a bug report with Chill Bot.",
                    messageReference : messageReference)
                .ConfigureAwait(false);
            }
            finally
            {
                checkoutResult.ClearReferences();
                checkoutResultPool.Return(checkoutResult);
            }
        }
        /// <summary>
        /// Implementers should derive from this to handle a matched message.
        /// </summary>
        /// <param name="message">The message received.</param>
        /// <param name="handleCache">The match object returned from the regex match.</param>
        /// <returns>The handle task.</returns>
        protected override async Task HandleMatchedMessage(SocketMessage message, Match handleCache)
        {
            var messageChannel   = message.Channel as SocketGuildChannel;
            var author           = message.Author as SocketGuildUser;
            var guildConnection  = messageChannel.Guild;
            var messageReference = new MessageReference(message.Id, messageChannel.Id, guildConnection.Id);
            var channelName      = handleCache.Groups["channel"].Captures[0].Value;

            var checkoutResult = checkoutResultPool.Get();

            try
            {
                checkoutResult = await this.guildRepository.Checkout(guildConnection.Id, checkoutResult);

                switch (checkoutResult.Result)
                {
                case GuildCheckoutResult.ResultType.Success:
                    using (var borrowedGuild = checkoutResult.BorrowedGuild)
                    {
                        var guildData  = borrowedGuild.Instance;
                        var joinResult = await OptinChannel.Join(
                            guildConnection : guildConnection,
                            guildData : guildData,
                            requestAuthor : author,
                            channelName : channelName);

                        borrowedGuild.Commit = joinResult == OptinChannel.JoinResult.Success;

                        switch (joinResult)
                        {
                        case OptinChannel.JoinResult.Success:
                            await message.AddReactionAsync(JoinOptinGuildHandler.SuccessEmoji)
                            .ConfigureAwait(false);

                            break;

                        case OptinChannel.JoinResult.NoSuchChannel:
                            await message.Channel.SendMessageAsync(
                                text : "An opt-in channel with this name does not exist.",
                                messageReference : messageReference)
                            .ConfigureAwait(false);

                            break;

                        case OptinChannel.JoinResult.NoOptinCategory:
                            await message.Channel.SendMessageAsync(
                                text : "This server is not set up for opt-in channels.",
                                messageReference : messageReference)
                            .ConfigureAwait(false);

                            break;

                        case OptinChannel.JoinResult.RoleMissing:
                            await message.Channel.SendMessageAsync(
                                text : "The role for this channel went missing. Talk to your server admin.",
                                messageReference : messageReference)
                            .ConfigureAwait(false);

                            break;

                        default:
                            throw new NotImplementedException(joinResult.ToString());
                        }
                    }
                    break;

                case GuildCheckoutResult.ResultType.DoesNotExist:
                    await message.Channel.SendMessageAsync(
                        text : "This server has not been configured for Chill Bot yet.",
                        messageReference : messageReference)
                    .ConfigureAwait(false);

                    break;

                case GuildCheckoutResult.ResultType.Locked:
                    await message.Channel.SendMessageAsync(
                        text : "Please try again.",
                        messageReference : messageReference)
                    .ConfigureAwait(false);

                    break;

                default:
                    throw new NotImplementedException(checkoutResult.Result.ToString());
                }
            }
            catch (Exception e)
            {
                Logger.LogError(e, "Request dropped - exception thrown");
                await message.Channel.SendMessageAsync(
                    text : "Something went wrong trying to do this for you. File a bug report with Chill Bot.",
                    messageReference : messageReference)
                .ConfigureAwait(false);
            }
            finally
            {
                checkoutResult.ClearReferences();
                checkoutResultPool.Return(checkoutResult);
            }
        }
        /// <summary>
        /// Implementers should derive from this to handle a matched message.
        /// </summary>
        /// <param name="message">The message received.</param>
        /// <param name="handleCache">The match object returned from the regex match.</param>
        /// <returns>The handle task.</returns>
        protected override async Task HandleMatchedMessage(SocketMessage message, Match handleCache)
        {
            var messageChannel = message.Channel as SocketDMChannel;
            var author         = message.Author;
            var mutualGuilds   = message.Author.MutualGuilds;

            if (mutualGuilds.Count < 1)
            {
                await messageChannel.SendMessageAsync("We're not in any servers together.").ConfigureAwait(false);

                return;
            }
            else if (mutualGuilds.Count > 1)
            {
                await messageChannel.SendMessageAsync("Sorry, right now I'm not programmed to handle DMs from people that I'm in multiple servers with.")
                .ConfigureAwait(false);

                return;
            }

            var guildConnection = mutualGuilds.Single();//this.discordClient.GetGuild(mutualGuilds.Single().Value);
            var requestAuthor   = guildConnection.GetUser(author.Id);
            var channelName     = handleCache.Groups["channel"].Captures[0].Value;

            var checkoutResult = checkoutResultPool.Get();

            try
            {
                checkoutResult = await this.guildRepository.Checkout(guildConnection.Id, checkoutResult)
                                 .ConfigureAwait(false);

                switch (checkoutResult.Result)
                {
                case GuildCheckoutResult.ResultType.Success:
                    using (var borrowedGuild = checkoutResult.BorrowedGuild)
                    {
                        borrowedGuild.Commit = false;
                        var guildData = borrowedGuild.Instance;

                        var leaveResult = await OptinChannel.Leave(
                            guildConnection : guildConnection,
                            guildData : guildData,
                            requestAuthor : requestAuthor,
                            channelName : channelName)
                                          .ConfigureAwait(false);

                        switch (leaveResult)
                        {
                        case OptinChannel.LeaveResult.Success:
                            await message.AddReactionAsync(LeaveOptinDmHandler.SuccessEmoji)
                            .ConfigureAwait(false);

                            break;

                        case OptinChannel.LeaveResult.NoSuchChannel:
                            await messageChannel.SendMessageAsync("There is no opt-in channel with that name. Did you mean something else?")
                            .ConfigureAwait(false);

                            break;

                        case OptinChannel.LeaveResult.NoOptinCategory:
                            await messageChannel.SendMessageAsync("This server is not set up with any opt-in channels right now.")
                            .ConfigureAwait(false);

                            break;

                        case OptinChannel.LeaveResult.RoleMissing:
                            await messageChannel.SendMessageAsync("This channel is not set up correctly. Contact the server admin.")
                            .ConfigureAwait(false);

                            break;

                        default:
                            throw new NotImplementedException(leaveResult.ToString());
                        }
                    }
                    break;

                case GuildCheckoutResult.ResultType.DoesNotExist:
                    await message.Channel.SendMessageAsync(
                        text : "This server has not been configured for Chill Bot yet.")
                    .ConfigureAwait(false);

                    break;

                case GuildCheckoutResult.ResultType.Locked:
                    await message.Channel.SendMessageAsync(
                        text : "Please try again.")
                    .ConfigureAwait(false);

                    break;

                default:
                    throw new NotImplementedException(checkoutResult.Result.ToString());
                }
            }
            catch (Exception e)
            {
                Logger.LogError(e, "Request dropped - exception thrown");
                await message.Channel.SendMessageAsync(
                    text : "Something went wrong trying to do this for you. File a bug report with Chill Bot.")
                .ConfigureAwait(false);
            }
            finally
            {
                checkoutResult.ClearReferences();
                checkoutResultPool.Return(checkoutResult);
            }
        }