async def ask(self, context, type=None): """ Asks you a random question about your character or your world, to get the creative juices flowing. Initial questions taken from (novel-software). Examples: !ask c(haracter) - Asks you a question about your character !ask w(orld) - Asks you a question about your world """ user = User(context.message.author.id, context.guild.id, context) # Check the arguments were all supplied and get a dict list of them and their values, after any prompts args = await self.check_arguments(context, type=type) if not args: return # Overwrite the variables passed in, with the values from the prompt and convert to lowercase type = args['type'].lower() if type in ('c', 'char', 'character'): options = lib.get_asset('q_char', user.get_guild()) elif type in ('w', 'world'): options = lib.get_asset('q_world', user.get_guild()) max = len(options) - 1 rand = random.randint(1, max) question = options[rand] await context.send(f'[{rand}] {question}')
async def reassure(self, context, who=None): """ Reassures you that everything will be okay. Examples: !reassure """ guild_id = context.guild.id # If no name passed through, default to the author of the command if who is None: mention = context.message.author.mention else: user = context.guild.get_member_named(who) # If we couldn't find the user, display an error if user is None: await context.send( lib.get_string('err:nouser', guild_id) + ' (There is a known issue with the reassure command, as well as the leaderboards in the Event and XP commands. We are waiting for Discord to respond to an email to get these fixed)' ) return mention = user.mention # Load the JSON file with the quotes quotes = lib.get_asset('reassure', guild_id) max = len(quotes) - 1 quote = quotes[random.randint(1, max)] # Send the message await context.send(mention + ', ' + format(quote))
async def todo(self, context): """ Displays current TODO list """ user = User(context.message.author.id, context.guild.id, context) todo = lib.get_asset('todo', user.get_guild()) output = '```ini\n' for type in todo.keys(): output += '********** ' + lib.get_string( 'todo:' + str(type), user.get_guild()) + ' **********\n' items = todo[type] if len(items): n = 1 for item in items: output += str(n) + '. ' + item + '\n' n += 1 else: output += '-' output += '\n\n' output += '```' return await context.send(output)
async def reassure(self, context, who=None): """ Reassures you that everything will be okay. Examples: !reassure """ guild_id = context.guild.id # If no name passed through, default to the author of the command if who is None: who = context.message.author.name user = context.guild.get_member_named(who) # If we couldn't find the user, display an error if user is None: await context.send( lib.get_string('err:nouser', guild_id) ) return # Load the JSON file with the quotes quotes = lib.get_asset('reassure', guild_id) max = len(quotes) - 1 quote = quotes[random.randint(1, max)] # Send the message await context.send( user.mention + ', ' + format(quote) )
async def reassure(self, context, who=None): """ Reassures you that everything will be okay. Examples: !reassure """ guild_id = context.guild.id # If no name passed through, default to the author of the command if who is None: mention = context.message.author.mention else: # We must now mention the user directly, as we can't easily lookup users any more if not who.startswith('<@!') or not who.endswith('>'): return await context.send( lib.get_string('reassure:nomention', guild_id)) mention = who # Load the JSON file with the quotes messages = lib.get_asset('reassure', guild_id) max = len(messages) - 1 quote = messages[random.randint(1, max)] # Send the message await context.send(mention + ', ' + format(quote))
async def quote(self, context): """ A random motivational quote to inspire you. Examples: !quote """ guild_id = context.guild.id # Load the JSON file with the quotes quotes = lib.get_asset('quotes', guild_id) max = len(quotes) - 1 quote = quotes[random.randint(1, max)] # Send the message await context.send( format(quote['quote'] + ' - *' + quote['name'] + '*'))
async def quote(self, context): """ A random motivational quote to inspire you. Examples: !quote """ if not Guild(context.guild).is_command_enabled('quote'): return await context.send( lib.get_string('err:disabled', context.guild.id)) guild_id = context.guild.id # Load the JSON file with the quotes quotes = lib.get_asset('quotes', guild_id) max = len(quotes) - 1 quote = quotes[random.randint(1, max)] # Send the message await context.send( format(quote['quote'] + ' - *' + quote['name'] + '*'))
def generate(self, amount): generated_names = [] # If the amount if higher than the max, set it to the max if amount > self.MAX_AMOUNT: amount = self.MAX_AMOUNT # If it's less than 1 for any reason, just use the default if amount is None or amount < 1: amount = self.DEFAULT_AMOUNT # # If the type is 'idea' or 'prompt', change the amount to 1, as that will take up too much space. # if self.type == 'idea' or self.type == 'prompt': # amount = 1 asset_file = 'gen_' + self.type source = lib.get_asset(asset_file, self.context.guild.id) retry_attempts = 0 # If we loaded the asset source okay, then let's loop through and generate some responses if source: # Store all the name choices before we start the loop choices = source['names'] def replace(match): match = match.group().replace('$', '') if match in choices.keys(): # Generate a choice choice = random.choice(choices[match]) i = 0 # Make sure it's not the same as the last one. # Only try a maximum of self.MAX_RETRIES times though, we don't want a situation where an infinite loop could happen while len( choice ) > 2 and choice == self._last and i < self.MAX_RETRIES: i += 1 choice = random.choice(choices[match]) self._last = choice return choice else: self._last = match return match # Loop as many times as the amount we requested, and build up a generated name for each x = 0 while x < amount: x += 1 # Get the formats from the source data formats = source['formats'] # Pick a random one to use format = random.choice(formats) # Variable to store the last chosen element, so we don't have the same thing twice in a row self._last = '' # Generate a name name = re.sub(r"\$([a-z0-9]+)", replace, format) # If we've already had this exact one, try again, up to self.MAX_RETRIES times if name in generated_names and retry_attempts < self.MAX_RETRIES: x -= 1 retry_attempts += 1 else: # Add it to the return array generated_names.append(name) retry_attempts = 0 # Sort the results alphabetically generated_names.sort() # Uppercase the first letter of each word, if it's anything but idea generation or prompt generatio if self.type != 'idea' and self.type != 'prompt': generated_names = map(lambda el: string.capwords(el), generated_names) # Generate the message message = lib.get_string('generate:message', self.context.guild.id).format( amount, lib.get_string( 'generate:type:' + self.type, self.context.guild.id)) return {'names': generated_names, 'message': message}