async def raffle_setup(self, ctx): predicate1 = MessagePredicate.length_less(200, ctx, ctx.channel, ctx.author) predicate2 = MessagePredicate.greater(1, ctx, ctx.channel, ctx.author) predicate3 = MessagePredicate.yes_or_no(ctx, ctx.channel, ctx.author) predicate4 = MessagePredicate.greater(0, ctx, ctx.channel, ctx.author) q1 = "Please set a brief description (200 chars max)" q2 = ("Please set how many winners are pulled.\n**Note**: If there are " "more winners than entries, I will make everyone a winner.") q3 = "Would you like to set a 'days on server' requirement?" q4 = "Do you want to limit this raffle to specific roles?" description = await self._get_response(ctx, q1, predicate1) winners = await self._get_response(ctx, q2, predicate2) dos = 0 roles = [] if await self._get_response(ctx, q3, predicate3) == 'yes': dos = await self._get_response(ctx, "How many days on the server are required?", predicate4) if await self._get_response(ctx, q4, predicate3) == 'yes': roles = await self._get_roles(ctx) return description, int(winners), int(dos), roles
async def create_slash_tag(self, ctx: commands.Context, tag_name: str, tagscript: str, *, is_global: bool = False): options: List[SlashOption] = [] guild_id = None if is_global else ctx.guild.id try: description = await self.send_and_query_response( ctx, "What should the tag description to be? (maximum 100 characters)", pred=MessagePredicate.length_less(101, ctx), ) except asyncio.TimeoutError: return await ctx.send("Tag addition timed out.") pred = MessagePredicate.yes_or_no(ctx) try: await self.send_and_query_response( ctx, "Would you like to add arguments to this tag? (Y/n)", pred) except asyncio.TimeoutError: await ctx.send("Query timed out, not adding arguments.") else: if pred.result is True: await self.get_options(ctx, options) command = SlashCommand(self, name=tag_name, description=description, guild_id=guild_id, options=options) try: await command.register() except discord.Forbidden as error: log.error( f"Failed to create command {command!r} on guild {ctx.guild!r}", exc_info=error) text = ( "Looks like I don't have permission to add Slash Commands here. Reinvite me " "with this invite link and try again: <https://discordapp.com/oauth2/authorize" f"?client_id={self.bot.user.id}&scope=bot%20applications.commands>" ) return await ctx.send(text) except Exception as error: log.error( f"Failed to create command {command!r} on guild {ctx.guild!r}") # exc info unneeded since error handler should print it, however info on the command options is needed raise tag = SlashTag( self, tagscript, guild_id=guild_id, author_id=ctx.author.id, command=command, ) self.command_cache[tag.command.id] = tag.command await ctx.send(await tag.initialize())
async def slashtag_add(self, ctx: commands.Context, tag_name: TagName, *, tagscript: TagScriptConverter): """ Add a slash tag with TagScript. [Slash tag usage guide](https://phen-cogs.readthedocs.io/en/latest/blocks.html#usage) """ options: List[SlashOption] = [] try: description = await self.send_and_query_response( ctx, "What should the tag description to be? (maximum 100 characters)", pred=MessagePredicate.length_less(101, ctx), ) except asyncio.TimeoutError: await ctx.send("Tag addition timed out.") pred = MessagePredicate.yes_or_no(ctx) try: await self.send_and_query_response( ctx, "Would you like to add arguments to this tag? (Y/n)", pred) except asyncio.TimeoutError: await ctx.send("Query timed out, not adding arguments.") else: if pred.result is True: await self.get_options(ctx, options) command = CommandModel(self, name=tag_name, description=description, guild_id=ctx.guild.id, options=options) try: await command.register() except discord.Forbidden: text = ( "Looks like I don't have permission to add Slash Commands here. Reinvite me " "with this invite link and try again: <https://discordapp.com/oauth2/authorize" f"?client_id={self.bot.user.id}&scope=bot%20applications.commands>" ) return await ctx.send(text) tag = SlashTag( self, tagscript, guild_id=ctx.guild.id, author_id=ctx.author.id, command=command, ) self.guild_tag_cache[ctx.guild.id][command.id] = tag self.command_cache[tag.command.id] = tag.command await tag.update_config() await ctx.send( f"Slash tag `{tag}` added with {len(command.options)} options.")
async def get_option(self, ctx: commands.Context) -> SlashOption: name_desc = ( "What should the argument name be?\n" "Slash argument names may not exceed 32 characters and can only contain characters " "that are alphanumeric or '_' or '-'.") name_pred = MessagePredicate.regex(SLASH_NAME, ctx) await self.send_and_query_response(ctx, name_desc, name_pred) title = name_pred.result.group(1) description = await self.send_and_query_response( ctx, "What should the argument description be? (maximum 100 characters)", MessagePredicate.length_less(101, ctx), ) valid_option_types = [ name.lower() for name in SlashOptionType.__members__.keys() if not name.startswith("SUB") ] option_query = [ "What should the argument type be?", f"Valid option types: {humanize_list([inline(n) for n in valid_option_types])}", "(select `string` if you don't understand)", ] option_type = await self.send_and_query_response( ctx, "\n".join(option_query), MessagePredicate.lower_contained_in(valid_option_types, ctx), ) option_type = SlashOptionType[option_type.upper()] pred = MessagePredicate.yes_or_no(ctx) await self.send_and_query_response(ctx, "Is this argument required? (Y/n)", pred) required = pred.result return SlashOption(name=title, description=description, option_type=option_type, required=required)
async def basic_setup(self, ctx): predicate = MessagePredicate.yes_or_no(ctx, ctx.channel, ctx.author) predicate1 = MessagePredicate.greater(0, ctx, ctx.channel, ctx.author) predicate2 = MessagePredicate.length_less(200, ctx, ctx.channel, ctx.author) question1 = "Would you like to setup Anti Mention Spam?" question2 = "Would you like the user to be banned when exceeding the max mentions?" question3 = ("Would you like to setup timed mention spam? " "(mentions from multiple messages in a set time)") question4 = "Would you like to setup an automatic role when a user joins?" question5 = ( "Would you like to setup bancheck, which checks new users against " "several databases to see if they have been banned?") question6 = "Would you like to set up the bots bank settings?" question7 = "Would you like to set up logs for things that happen in the server?" question8 = "Would you like to change the name of the casino?" question9 = ( "Would you like the bot to respond to messages when the bot " "is mentioned at the start of the message?") question10 = "Would you like to setup the dungeon?" question11 = "Would you like to setup the economy settings?" question12 = "Would you like to setup filtered words?" question13 = "Would you like to add a channel that shows the amount of users in the server?" question14 = ( "Would you like to add a channel that recieves a message when a " "user leaves the server?") question15 = "Would you like a channel for recieving lyrics when using the lyrics command?" question16 = "Would you like to setup basic auto mod features?" question17 = "Would you like to setup a mod log?" question18 = "Would you like to setup reports?" question19 = "Would you like to setup starboard?" question20 = "Would you like to setup tickets?" question21 = "Would you like to setup a welcome message for new users?" question22 = "Would you like to setup the mod and admin role?" question23 = "Would you like to setup reaction roles?" try: cog = self.bot.get_cog("AntiMentionSpam") if cog: if (await self._get_response(ctx, question1, predicate)).lower() == "yes": number = await self._get_response( ctx, "How many mentions from a single user in a single message " "should be acted upon?", predicate1, ) number = int(number) await ctx.invoke( ctx.bot.get_command("antimentionspam max"), number) await asyncio.sleep(1) autoban = await self._get_response(ctx, question2, predicate) == "yes" if autoban.lower() == "yes": await ctx.invoke( ctx.bot.get_command( "antimentionspam autobantoggle")) await asyncio.sleep(1) mentions = await self._get_response( ctx, question3, predicate) == "yes" if mentions.lower() == "yes": number = int(await self._get_response( ctx, "How many mentions?", predicate1)) await asyncio.sleep(0.5) number1 = int(await self._get_response(ctx, "In how many seconds?", predicate1)) await ctx.invoke( ctx.bot.get_command("antimentionspam maxinterval"), number, number1) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Autorole") if cog: if (await self._get_response(ctx, question4, predicate)).lower() == "yes": await ctx.invoke(ctx.bot.get_command("autorole toggle")) await asyncio.sleep(1) rolemessage = await self._get_response( ctx, "What role would you like to be added to new users?", predicate2) role = await commands.RoleConverter().convert( ctx, rolemessage) await ctx.invoke(ctx.bot.get_command("autorole add"), role=role) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("BanCheck") if cog: if (await self._get_response(ctx, question5, predicate)).lower() == "yes": channelmessage = await self._get_response( ctx, "What channel would you like to be used as log?", predicate2) channel = await (TextChannelConverter()).convert( ctx, channelmessage) await ctx.invoke( ctx.bot.get_command("bancheckset enablechannel"), channel) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Bank") if cog: if (await self._get_response(ctx, question6, predicate)).lower() == "yes": name = await self._get_response( ctx, "What would you like the bank to be called?", predicate2) await ctx.invoke(ctx.bot.get_command("bankset bankname"), name=name) await asyncio.sleep(1) name1 = await self._get_response( ctx, "What would you like the credits to be called?", predicate2) await ctx.invoke( ctx.bot.get_command("bankset creditsname"), name=name1) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Grenzpolizei") if cog: if (await self._get_response(ctx, question7, predicate)).lower() == "yes": await ctx.invoke(ctx.bot.get_command("gp autosetup")) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Casino") if cog: if (await self._get_response(ctx, question8, predicate)).lower() == "yes": name = await self._get_response( ctx, "What would you like the casino to be called?", predicate2) await ctx.invoke(ctx.bot.get_command("casinoset name"), name=name) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("CleverBot") if cog: if (await self._get_response(ctx, question9, predicate)).lower() == "yes": await ctx.invoke(ctx.bot.get_command("cleverbotset toggle") ) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Dungeon") if cog: if (await self._get_response(ctx, question10, predicate)).lower() == "yes": await ctx.invoke(ctx.bot.get_command("dungeon toggle")) await asyncio.sleep(0.5) await ctx.invoke(ctx.bot.get_command("dungeon autoban")) await asyncio.sleep(1) days = await self._get_response( ctx, "How many days old must an account be before I automatically ban them?", predicate1, ) await ctx.invoke(ctx.bot.get_command("dungeon joindays"), days=days) await asyncio.sleep(1) ans = await self._get_response( ctx, "Would you like users with default profile pics to be banned?", predicate, ) if ans.lower() == "yes": await ctx.invoke( ctx.bot.get_command("dungeon profiletoggle`")) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Economy") if cog: if (await self._get_response(ctx, question11, predicate)).lower() == "yes": amount = await self._get_response( ctx, "How many credits should be given for using the payday command?", predicate1, ) await ctx.invoke( ctx.bot.get_command("economyset paydayamount"), creds=int(amount)) await asyncio.sleep(1) ans = await self._get_response( ctx, "Would you like to change the cooldown time for the payday command?", predicate, ) if ans.lower() == "yes": await asyncio.sleep(1) time = int(await self._get_response( ctx, "How many seconds would you like the cooldown to be?", predicate1, )) await ctx.invoke( ctx.bot.get_command("economyset paydaytime"), seconds=time) await asyncio.sleep(1) register = await self._get_response( ctx, "Would you like to change the amount of credits new " "accounts start with?", predicate, ) if register.lower() == "yes": await asyncio.sleep(1) amount1 = await self._get_response( ctx, "How many credits would you like new accounts to start with?", predicate1, ) await ctx.invoke(ctx.bot.get_command( "economyset registeramount"), creds=int(amount1)) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Filter") if cog: if (await self._get_response(ctx, question12, predicate)).lower() == "yes": filt = await self._get_response( ctx, "What words would you like to be added to the filter? " "(separate each word with a space, if it is a sentence " "or phrase put it inside " "quotes" ")", predicate2, ) await ctx.invoke(ctx.bot.get_command("filter add"), *filt) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("InfoChannel") if cog: if (await self._get_response(ctx, question13, predicate)).lower() == "yes": await ctx.invoke(ctx.bot.get_command("infochannel")) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Leaver") if cog: if (await self._get_response(ctx, question14, predicate)).lower() == "yes": await ctx.send( "**Use `]leaverset channel` in the channel you wish to " "recieve the messages**") await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Mod") if cog: if (await self._get_response(ctx, question16, predicate)).lower() == "yes": repeats = await self._get_response( ctx, "Would you like to automatically delete repeated messages?", predicate) if repeats.lower() == "yes": await asyncio.sleep(1) await ctx.invoke( ctx.bot.get_command("modset deleterepeats")) await asyncio.sleep(1) delay = await self._get_response( ctx, "Would you like to automatically delete command messages?", predicate, ) if delay.lower() == "yes": await asyncio.sleep(1) delay1 = await self._get_response( ctx, "How many seconds should I wait before deleting them?", predicate1, ) await ctx.invoke( ctx.bot.get_command("modset deletedelay"), time=delay1) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("ModLog") if cog: if (await self._get_response(ctx, question17, predicate)).lower() == "yes": await asyncio.sleep(1) channelmessage = await self._get_response( ctx, "What channel would you like the logs to go to?", predicate2) channel = await (TextChannelConverter()).convert( ctx, channelmessage) await ctx.invoke(ctx.bot.get_command("modlogset modlog"), channel=channel) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Reports") if cog: if (await self._get_response(ctx, question18, predicate)).lower() == "yes": await asyncio.sleep(1) channelmessage = await self._get_response( ctx, "What channel would you like the reports to go to?", predicate2) channel = await (TextChannelConverter()).convert( ctx, channelmessage) await ctx.invoke(ctx.bot.get_command("reportset toggle")) await asyncio.sleep(0.5) await ctx.invoke(ctx.bot.get_command("reportset output"), channel=channel) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Starboard") if cog: if (await self._get_response(ctx, question19, predicate)).lower() == "yes": await asyncio.sleep(1) name = await self._get_response( ctx, "What would you like the starboard to be called?", predicate2) await asyncio.sleep(0.5) channelmessage = await self._get_response( ctx, "What channel would you like the starboard to be in?", predicate2) channel = await (TextChannelConverter()).convert( ctx, channelmessage) await ctx.invoke(ctx.bot.get_command("starboard create"), name=name, channel=channel) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Tickets") if cog: if (await self._get_response(ctx, question20, predicate)).lower() == "yes": await ctx.invoke(ctx.bot.get_command("ticket set setup")) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Welcome") if cog: if (await self._get_response(ctx, question21, predicate)).lower() == "yes": await ctx.invoke( ctx.bot.get_command("welcomeset leave toggle")) await ctx.invoke( ctx.bot.get_command("welcomeset ban toggle")) await ctx.invoke( ctx.bot.get_command("welcomeset unban toggle")) await ctx.invoke(ctx.bot.get_command("welcomeset toggle")) await ctx.send("Now do [p]welcomeset join msg add") await ctx.send( "**After you have added the new message do the following command and " "then type the number of the old default message**\n" "`]welcomeset join msg del`") await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("Core") if cog: if (await self._get_response(ctx, question22, predicate)).lower() == "yes": await asyncio.sleep(1) rolemessage = await self._get_response( ctx, "What role would you like mods to have?", predicate2) role = await commands.RoleConverter().convert( ctx, rolemessage) await ctx.invoke(ctx.bot.get_command("set addmodrole"), role=role) await asyncio.sleep(1) role1 = await self._get_response( ctx, "What role would you like admins to have?", predicate2) role2 = await commands.RoleConverter().convert(ctx, role1) await ctx.invoke(ctx.bot.get_command("set addadminrole"), role=role2) await asyncio.sleep(1) except asyncio.TimeoutError: pass try: cog = self.bot.get_cog("ReactRoles") if cog: if (await self._get_response(ctx, question23, predicate)).lower() == "yes": await ctx.send( "Use `[p]reactroles add ` with the message ID, channel, emoji and role.\n" "**Hint: To get the message ID, turn on developer mode in Discord's " "appearance settings and then right click the message and click copy ID **" ) except asyncio.TimeoutError: return