async def xp(self, ctx, *, msg): parser = Arguments(allow_abbrev=False, prog='xp') parser.add_argument('level1', type=between(1, 120), help='The lower of the two levels.') parser.add_argument('level2', type=between(1, 120), help='The higher of the two levels.') await self.bot.send_typing(ctx.message.channel) try: args = parser.parse_args(split(msg)) except SystemExit: await self.bot.say('```%s```' % parser.format_help()) return except Exception as e: await self.bot.say('```%s```' % str(e)) return if args.level1 >= args.level2: await self.bot.say('Level1 must be less than level2.') return await self.bot.say( 'The total experience between levels **{:,}** and **{:,}** is **{:,}**.' .format(args.level1, args.level2, runescape.get_exp_between_levels(args.level1, args.level2)))
async def jot(self, *, msg): parser = Arguments(allow_abbrev=False, prog='jot') parser.add_argument('type', choices=['legendary', 'normal', 'master', 'supreme'], help='The type the aura.') parser.add_argument('level', type=choices.between(1, 120), help='The level the amount of exp will be granted to.') try: args = parser.parse_args(split(msg)) except SystemExit: await self.bot.say('```%s```' % parser.format_help()) return except Exception as e: await self.bot.say('```%s```' % str(e)) return factor = { 'normal': 1.5, 'master': 2, 'supreme': 2.5, 'legendary': 5 } xp = factor[args.type] * ((args.level**2) - (2 * args.level) + 100) m = "At level **{}** from a **{}** Jack of Trades aura, you'd gain **{:,}** XP.".format(args.level, args.type, xp) await self.bot.say(m)
async def clear(self, ctx, *, msg='100'): parser = Arguments(allow_abbrev=False, prog='clear') parser.add_argument('num', nargs='?', type=between(1, 100), default=100, help='The number of messages to search through.') parser.add_argument('-s', '--self', action='store_true', help='Only deletes messages from this bot.') await self.bot.send_typing(ctx.message.channel) try: args = parser.parse_args(split(msg)) except SystemExit: await self.bot.say('```%s```' % parser.format_help()) return except Exception as e: await self.bot.say('```%s```' % str(e)) return # Only deleting messages from bot if args.self: await self.delete_self(ctx, args.num) return def check(m): """Checks if the message should be deleted""" pattern = '^(?:%s)' % '|'.join( re.escape(c) for c in self.bot.command_prefix(self.bot, ctx.message)) return m.author.id == self.bot.user.id or m.id == ctx.message.id or re.search( pattern, m.content) # Getting messages deleted = Counter(m.author.id for m in await self.bot.purge_from( ctx.message.channel, limit=args.num, check=check)) total = sum(deleted.values()) server = ctx.message.channel.server # Displaying the number of messages deleted e = discord.Embed() e.colour = 0x3572a7 e.title = 'Deleted {:,} message{}.'.format(total, 's' if total != 1 else '') e.description = '\n'.join( '**{:,}** {}'.format(c[1], server.get_member(c[0]).name) for c in deleted.most_common()) await self.bot.say(embed=e, delete_after=5)
async def lamp(self, *, msg): parser = Arguments(allow_abbrev=False, prog='lamp') parser.add_argument('size', choices=['small', 'medium', 'large', 'huge'], help='The size of the lamp') parser.add_argument('level', type=choices.between(1, 120), help='The level in your stat you wish to use the lamp on.') try: args = parser.parse_args(split(msg)) except SystemExit: await self.bot.say('```%s```' % parser.format_help()) return except Exception as e: await self.bot.say('```%s```' % str(e)) return await self.execute(args)
async def star(self, *, msg): parser = Arguments(allow_abbrev=False, prog='star') parser.add_argument('size', choices=['small', 'medium', 'large', 'huge'], help='The size of the prismatic star.') parser.add_argument('level', type=between(1, 120), help='The level the prismatic star will be used on.') try: args = parser.parse_args(split(msg)) except SystemExit: await self.bot.say('```%s```' % parser.format_help()) return except Exception as e: await self.bot.say('```%s```' % str(e)) return xp = PrismaticStar.get_star_dict()[args.size][min(97, args.level - 1)] await self.bot.say('A **{}** prismatic start at level **{:,}** would yield **{:,}** XP.' .format(args.size, args.level, xp))
async def roll(self, *, msg): parser = Arguments(allow_abbrev=True, prog='roll') parser.add_argument( 'number', type=choices.between(2, 2**31 - 1), help='The maximum number the roll can be (inclusive.)') try: args = parser.parse_args(split(msg)) except SystemExit: await self.bot.say('```%s```' % parser.format_help()) return except Exception as e: await self.bot.say('```%s```' % str(e)) return x = random.SystemRandom().randint(1, args.number) await self.bot.say('\U0001f3b2 Rolled a **{:,}**.'.format(x))
async def invasion(self, *, msg): parser = Arguments(allow_abbrev=False, prog='invasion') parser.add_argument('level', type=choices.between(1, 120), help='The level to get the reward XP for.') try: args = parser.parse_args(split(msg)) except SystemExit: await self.bot.say('```%s```' % parser.format_help()) return except Exception as e: await self.bot.say('```%s```' % str(e)) return xp = 8 * (20 / 20) * (args.level**2) - 2 * args.level + 100 xp = int(xp) if xp % 1 == 0 else round(xp, 1) await self.bot.say( "At level **{}**, fully completing Toll Invasion will yield **{:,}** XP." .format(args.level, xp))
async def prefix(self, ctx, *, msg=''): parser = Arguments(allow_abbrev=False, prog='config prefix') parser.add_argument( 'prefix', nargs='?', type=between(1, 3, False), help= 'The character(s) that prefixes a command call. Leaving this argument out will reset ' 'the command prefix to default.') await self.bot.send_typing(ctx.message.channel) try: args = parser.parse_args(split(msg)) except SystemExit: await self.bot.say('```%s```' % parser.format_help()) return except Exception as e: await self.bot.say('```%s```' % str(e)) return configs = self.bot.configurations.get(ctx.message.channel.server.id) con = Config() con.server_id = ctx.message.channel.server.id # Resetting trigger if not args.prefix: configs['prefix'] = '`' con.prefix = None await objects.update(con, only=['prefix']) await self.bot.say('Command prefix has been **reset**.') return # Setting new trigger configs['prefix'] = args.prefix con.prefix = args.prefix await objects.update(con, only=['prefix']) await self.bot.say('Command prefix has been **updated**.')
async def price(self, ctx, *, msg: str): parser = Arguments(allow_abbrev=False, prog='price') parser.add_argument('name', nargs='+', help='The name if the item to get the price for.') parser.add_argument( '-u', '--units', type=int, help="Multiplies the item's price by the units given.") parser.add_argument( '-c', '--chart', type=between(1, 6), help="Plots the item's price history for number of given months.") await self.bot.send_typing(ctx.message.channel) try: args = parser.parse_args(split(msg)) except SystemExit: await self.bot.say('```%s```' % parser.format_help()) return except Exception as e: await self.bot.say('```%s```' % str(e)) return args.name = ' '.join(args.name) item = await util.fuzzy_match_name(args.name) if not item: await self.bot.say( 'An item with the name, **%s**, could not be found.' % args.name) return history = await item.get_history() hist_vals = list(history['daily'].values()) # Getting price change day_change = item.price - hist_vals[-2] one_month_change = item.price - hist_vals[-30] three_month_change = item.price - hist_vals[-90] six_month_change = item.price - hist_vals[-180] day_change_per = int(day_change / hist_vals[-2] * 100) one_month_change_per = int(one_month_change / hist_vals[-30] * 100) three_month_change_per = int(three_month_change / hist_vals[-90] * 100) six_month_change_per = int(six_month_change / hist_vals[-180] * 100) # Building message e = discord.Embed() e.description = item.description e.colour = 0x3572a7 e.title = item.name e.url = 'http://services.runescape.com/m=itemdb_rs/viewitem?obj=%s' % item.id change = '**24 hours**: `{:,}` GP `{}%` {}\n' \ '**30 days**: `{:,}` GP `{}%` {}\n' \ '**90 days**: `{:,}` GP `{}%` {}\n' \ '**180 days**: `{:,}` GP `{}%` {}'\ .format(day_change, day_change_per, Price.get_change_arrow(day_change), one_month_change, one_month_change_per, Price.get_change_arrow(one_month_change), three_month_change, three_month_change_per, Price.get_change_arrow(three_month_change), six_month_change, six_month_change_per, Price.get_change_arrow(six_month_change)) e.set_thumbnail(url=item.icon_url) e.add_field(name='Price', value='`{:,}` GP'.format(item.price)) e.add_field(name='Price changes', value=change, inline=False) e.add_field(name='High alch', value='`{:,}` GP'.format(item.high_alch)) e.add_field(name='Low alch', value='`{:,}` GP\n\u200B'.format(item.low_alch)) e.set_footer(text='Members' if item.members else 'F2P', icon_url=item.type_url) # Totaling if args.units: e.add_field(name='Total Price (x{:,})'.format(args.units), value='{:,} GP'.format(args.units * item.price)) m = await self.bot.say(embed=e) # Adding chart if args.chart: link = await Price.plot_history(history, args.chart, item.name) # Checking if plot was uploaded to imgur if link: e.set_image(url=link) await self.bot.edit_message(m, embed=e)
async def train(self, ctx, *, msg): parser = Arguments(allow_abbrev=False, prog='train') parser.add_argument('skill', type=enum(agility=['agil'], crafting=['craft'], firemaking=['fm'], herblore=['herb'], mining=['mine'], smithing=['smith'], woodcutting=['wc'], construction=['con'], divination=['div'], fishing=['fish'], hunter=['hunt'], prayer=['pray'], summoning=['summon', 'sum', 'summ'], cooking=['cook'], farming=['farm'], fletching=['fletch'], magic=['mage'], runecrafting=['rc'], thieving=['thiev', 'theiving']), help='The name of the skill you wish to train.') parser.add_argument('level', type=between(2, 120), help='The level you wish to reach.') parser.add_argument('username', nargs='+', help='Your Runescape username.') parser.add_argument( '-l', '--limit', type=between(1, 30), default=10, help= 'The number of training methods per page. If above 15 the results will be outputted ' 'as an image.') parser.add_argument('-p', '--page', type=minimum(1), default=1, help='The page of results to return.') parser.add_argument( '-i', '--image', action='store_true', help='Displays the results as an image. (Useful for mobile).') parser.add_argument( '-o', '--order', nargs='+', type=enum('number-', 'number', 'level', 'level-', 'exp', 'exp-', 'name', 'name-'), help= 'Sorts the results in the order specified. Add a \'-\' to the end of the order string ' 'to specify descending. Eg. number-', default=['number']) await self.bot.send_typing(ctx.message.channel) try: args = parser.parse_args(split(msg)) except SystemExit: await self.bot.say('```%s```' % parser.format_help()) return except Exception as e: await self.bot.say('```%s```' % str(e)) return args.username = '******'.join(args.username) await self.execute(args)