/// <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); } }
/// <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); } }