first public commit
This commit is contained in:
commit
fc56adaaa7
|
@ -0,0 +1,11 @@
|
|||
platform: linux/arm32v6
|
||||
clone:
|
||||
git:
|
||||
image: "arm32v6local:dronegit"
|
||||
pipeline:
|
||||
build:
|
||||
image: arm32v6/python:3.6-alpine3.6
|
||||
commands:
|
||||
- pip3 install -r requirements.txt
|
||||
- pip3 install pycodestyle
|
||||
- python3 -m pycodestyle .
|
|
@ -0,0 +1,3 @@
|
|||
__pycache__
|
||||
b64.txt
|
||||
.env
|
|
@ -0,0 +1,5 @@
|
|||
FROM arm32v6/python:3.6.4-alpine3.7
|
||||
COPY . /code
|
||||
WORKDIR /code
|
||||
RUN pip install -Ur requirements.txt
|
||||
CMD [ "python3", "bot.py" ]
|
|
@ -0,0 +1,53 @@
|
|||
import logging
|
||||
import os
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
import datetime
|
||||
|
||||
logging.basicConfig(level=logging.INFO, style='{', datefmt="%d.%m.%Y %H:%M:%S",
|
||||
format="{asctime} - {levelname} - {name} - {message}")
|
||||
|
||||
bot = commands.Bot(description="🧀 Accepting Cheese!!! 🧀", command_prefix='&')
|
||||
|
||||
|
||||
@bot.command(pass_context=True)
|
||||
async def load(ctx, module):
|
||||
if ctx.message.author.id == '140652945032216576':
|
||||
bot.load_extension(module)
|
||||
await bot.say('{} loaded'.format(module))
|
||||
|
||||
|
||||
@bot.command(pass_context=True)
|
||||
async def unload(ctx, module):
|
||||
if ctx.message.author.id == '140652945032216576':
|
||||
bot.unload_extension(module)
|
||||
await bot.say('{} unloaded'.format(module))
|
||||
|
||||
|
||||
@bot.command(pass_context=True)
|
||||
async def reload(ctx, module):
|
||||
if ctx.message.author.id == '140652945032216576':
|
||||
bot.load_extension(module)
|
||||
bot.unload_extension(module)
|
||||
await bot.say('{} reloaded'.format(module))
|
||||
|
||||
|
||||
@bot.event
|
||||
async def on_ready():
|
||||
bot.load_extension("repl")
|
||||
bot.load_extension("runescape")
|
||||
bot.load_extension("dogs")
|
||||
bot.load_extension("bot_commands")
|
||||
bot.load_extension('discordinfo')
|
||||
await bot.change_presence(game=discord.Game(name='CHEESE', type=2))
|
||||
await bot.send_message(discord.Object(id="408902143119196161"),
|
||||
"**Im ready!** " + str(datetime.datetime.now()))
|
||||
|
||||
|
||||
@bot.event
|
||||
async def on_message(message):
|
||||
if message.server.get_member('140652945032216576') in message.mentions:
|
||||
await bot.add_reaction(message, '🐀')
|
||||
await bot.process_commands(message)
|
||||
|
||||
bot.run(os.getenv('TOKEN'))
|
|
@ -0,0 +1,304 @@
|
|||
import discord
|
||||
from discord.ext import commands
|
||||
import random
|
||||
import os
|
||||
from datetime import datetime
|
||||
import requests
|
||||
import wikia
|
||||
import base64
|
||||
import aiohttp
|
||||
import runescapeapi
|
||||
|
||||
|
||||
class bots_commands:
|
||||
def __init__(self, bot: commands.Bot):
|
||||
self.bot = bot
|
||||
self.picked_wikis = {}
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def ping(self, ctx):
|
||||
"""bot replys with pong"""
|
||||
now = ctx.message.timestamp
|
||||
msg = await self.bot.say("Pong! 🏓")
|
||||
msg_timestamp = msg.timestamp
|
||||
sub = msg_timestamp - now
|
||||
await self.bot.edit_message(msg, new_content="Pong! 🏓 **took {}ms**"
|
||||
.format(sub.total_seconds()*1000))
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def say(self, ctx, *, something):
|
||||
"""bot echos what you say then deletes your message"""
|
||||
await self.bot.say("**{ctx.message.author} said:** {something}")
|
||||
await self.bot.delete_message(ctx.message)
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def am_i_cool(self, ctx):
|
||||
"""decides whether ur cool or not"""
|
||||
mention = ctx.message.author.mention
|
||||
if ctx.message.author.id == "140652945032216576":
|
||||
await self.bot.say(f"yes you are {mention}")
|
||||
else:
|
||||
n = random.randint(0, 1)
|
||||
if n == 1:
|
||||
await self.bot.say("only my master is cool")
|
||||
else:
|
||||
await self.bot.say(f"i guess ill let you be cool this time \
|
||||
{mention}")
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def echo(self, ctx, *, something):
|
||||
"""bot echos what you say"""
|
||||
await self.bot.say("{}".format(something))
|
||||
|
||||
@commands.cooldown(rate=3, per=300, type=commands.BucketType.channel)
|
||||
@commands.command(pass_context=True)
|
||||
async def spam(self, ctx, n, *, something):
|
||||
"""&spam number message, max 20"""
|
||||
if int(n) > 10:
|
||||
await self.bot.say("not aloud")
|
||||
else:
|
||||
times = int(n) - 1
|
||||
while (times >= 0):
|
||||
await self.bot.say("{}".format(something))
|
||||
times = times - 1
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def embed(self, ctx, *, message):
|
||||
"""bot says what you type in embeded text"""
|
||||
em = discord.Embed(title=str(ctx.message.author), description=message,
|
||||
colour=discord.Colour.green())
|
||||
await self.bot.say(embed=em)
|
||||
|
||||
@commands.command(name='8ball')
|
||||
async def eight_ball(self, *, quest=None):
|
||||
responses = ['🧀The cheese says it is certain',
|
||||
'🧀The cheese says it is decidedly so',
|
||||
'🧀The cheese says without a doubt',
|
||||
'🧀The cheese says yes definitely',
|
||||
'🧀The cheese says you may rely on it',
|
||||
'🧀The cheese says as I see it, yes',
|
||||
'🧀The cheese says most likely',
|
||||
'🧀The cheese says outlook good',
|
||||
'🧀The cheese says yes',
|
||||
'🧀The cheese says sighns point to yes',
|
||||
'🧀The cheese says reply hazy try again',
|
||||
'🧀The cheese says ask again later',
|
||||
'🧀The cheese says better not tell you now',
|
||||
'🧀The cheese says cannot predict now',
|
||||
'🧀The cheese says concentrate and ask again',
|
||||
'🧀The cheese says don\'t count on it',
|
||||
'🧀The cheese says my reply is no',
|
||||
'🧀The cheese says my sources say no',
|
||||
'🧀The cheese says outlook not so good',
|
||||
'🧀The cheese says very doubtful']
|
||||
if quest is None:
|
||||
await self.bot.say('Ask me a question noob!')
|
||||
else:
|
||||
await self.bot.say(random.choice(responses))
|
||||
|
||||
@commands.command(pass_context=True, aliases=['crc'])
|
||||
async def cat_rat_cheese(self, ctx):
|
||||
msg = await self.bot.say('react with your choice, '
|
||||
'wait for the 3 reactions to load tho')
|
||||
await self.bot.add_reaction(msg, '🐀')
|
||||
await self.bot.add_reaction(msg, '🧀')
|
||||
await self.bot.add_reaction(msg, '🐱')
|
||||
bot_score = 0
|
||||
usr_score = 0
|
||||
author = ctx.message.author
|
||||
while True:
|
||||
scorestr = f'your score: {usr_score} my score: {bot_score}\n'
|
||||
if bot_score == 3 or usr_score == 3:
|
||||
if usr_score > bot_score:
|
||||
await self.bot.edit_message(msg, scorestr +
|
||||
'you won best out of 3')
|
||||
break
|
||||
else:
|
||||
await self.bot.edit_message(msg, scorestr +
|
||||
'bot won best out of 3')
|
||||
break
|
||||
response = await self.bot.wait_for_reaction(
|
||||
emoji=['🐀', '🧀', '🐱'], user=author, timeout=10, message=msg)
|
||||
bot_choice = random.choice(['🐀', '🧀', '🐱'])
|
||||
|
||||
try:
|
||||
response = response.reaction.emoji
|
||||
if response == bot_choice:
|
||||
await self.bot.edit_message(msg, scorestr + 'draw')
|
||||
await self.bot.remove_reaction(msg, response, author)
|
||||
continue
|
||||
elif response == '🐀':
|
||||
if bot_choice == '🧀':
|
||||
usr_score = usr_score + 1
|
||||
message = 'bot picked 🧀 your rat eats ' \
|
||||
'the cheese and you win'
|
||||
await self.bot.edit_message(msg, scorestr + message)
|
||||
await self.bot.remove_reaction(msg, '🐀', author)
|
||||
continue
|
||||
else:
|
||||
bot_score = bot_score + 1
|
||||
message = 'bot picked 🐱 my cat eats your rat and i win'
|
||||
await self.bot.edit_message(msg, scorestr + message)
|
||||
await self.bot.remove_reaction(msg, '🐀', author)
|
||||
continue
|
||||
elif response == '🧀':
|
||||
if bot_choice == '🐀':
|
||||
bot_score = bot_score + 1
|
||||
message = 'bot picked 🐀 bots rat eats the cheese ' \
|
||||
'and u lose'
|
||||
await self.bot.edit_message(msg, scorestr + message)
|
||||
await self.bot.remove_reaction(msg, '🧀', author)
|
||||
continue
|
||||
else:
|
||||
usr_score = usr_score + 1
|
||||
message = 'bot picked 🐱 bots cat eats your cheese ' \
|
||||
'but its poisonous so you win'
|
||||
await self.bot.edit_message(msg, scorestr + message)
|
||||
await self.bot.remove_reaction(msg, '🧀', author)
|
||||
continue
|
||||
elif response == '🐱':
|
||||
if bot_choice == '🐀':
|
||||
usr_score = usr_score + 1
|
||||
message = 'bot picked 🐀 your cat eats the rat so ' \
|
||||
'you win'
|
||||
await self.bot.edit_message(msg, scorestr + message)
|
||||
await self.bot.remove_reaction(msg, '🐱', author)
|
||||
continue
|
||||
else:
|
||||
bot_score = bot_score + 1
|
||||
message = 'bot picked 🧀 your cat eats the cheese ' \
|
||||
'but gets poisoned and dies i win'
|
||||
await self.bot.edit_message(msg, scorestr + message)
|
||||
await self.bot.remove_reaction(msg, '🐱', author)
|
||||
continue
|
||||
except AttributeError:
|
||||
await self.bot.edit_message(msg, 'too slow')
|
||||
break
|
||||
|
||||
@commands.group()
|
||||
async def invite(self):
|
||||
pass
|
||||
|
||||
@commands.has_permissions(administrator=True)
|
||||
@invite.command(pass_context=True)
|
||||
async def temp(self, ctx):
|
||||
inv = await self.bot.create_invite(ctx.message.channel, max_age=600,
|
||||
max_uses=1, temporary=True,
|
||||
unique=True)
|
||||
await self.bot.say(inv)
|
||||
|
||||
@commands.has_permissions(administrator=True)
|
||||
@invite.command(pass_context=True)
|
||||
async def perm(self, ctx):
|
||||
inv = await self.bot.create_invite(ctx.message.channel, max_age=600,
|
||||
max_uses=1, temporary=False,
|
||||
unique=True)
|
||||
await self.bot.say(inv)
|
||||
|
||||
class patched_wikia(runescapeapi.runescapeapi._Wikia):
|
||||
def isearch(self, searchTerm: str):
|
||||
'''
|
||||
returns a generator that iterates though
|
||||
the search results pages
|
||||
'''
|
||||
for i in wikia.search(self.wiki, searchTerm):
|
||||
if not i.startswith('Transcript'):
|
||||
yield wikia.page(self.wiki, i)
|
||||
|
||||
# wikia stuffs
|
||||
@commands.group(pass_context=True)
|
||||
async def wikia(self, ctx):
|
||||
pass
|
||||
|
||||
@wikia.command(pass_context=True)
|
||||
async def setwiki(self, ctx, wiki):
|
||||
self.picked_wikis[ctx.message.author.id] = wiki
|
||||
await self.bot.say('Successfully set your current wikia to: '
|
||||
f'**{wiki}**')
|
||||
|
||||
@wikia.command(pass_context=True)
|
||||
async def search(self, ctx, *, query):
|
||||
try:
|
||||
s = self.patched_wikia(self.picked_wikis[ctx.message.author.id]) \
|
||||
.isearch(query)
|
||||
|
||||
def next_page(page):
|
||||
em = discord.Embed(title=page.title, description=page.summary,
|
||||
url=page.url.replace(' ', '_'))
|
||||
if page.images != []:
|
||||
em.set_image(url=page.images[0])
|
||||
return em
|
||||
|
||||
msg = await self.bot.say(embed=next_page(next(s)))
|
||||
await self.bot.add_reaction(msg, '▶')
|
||||
while True:
|
||||
try:
|
||||
await self.bot.wait_for_reaction(emoji='▶',
|
||||
user=ctx.message.author)
|
||||
await self.bot.remove_reaction(msg, '▶',
|
||||
ctx.message.author)
|
||||
await self.bot.edit_message(msg, embed=next_page(next(s)))
|
||||
except StopIteration:
|
||||
await self.bot.say('Thats all the results')
|
||||
break
|
||||
except KeyError:
|
||||
err_msg = 'Please set your current wikia using: ' \
|
||||
'&wikia setwiki ' \
|
||||
'<name of wiki here>'
|
||||
await self.bot.say(err_msg)
|
||||
|
||||
@wikia.command(pass_context=True)
|
||||
async def page(self, ctx, *, query):
|
||||
try:
|
||||
q = wikia.page(self.picked_wikis[ctx.message.author.id], query)
|
||||
em = discord.Embed(title=q.title, description=q.summary,
|
||||
url=q.url.replace(' ', '_'))
|
||||
if q.images != []:
|
||||
em.set_image(url=q.images[0])
|
||||
await self.bot.say(embed=em)
|
||||
except KeyError:
|
||||
err_msg = 'Please set your current wikia using: ' \
|
||||
'&wikia setwiki ' \
|
||||
'<name of wiki here>'
|
||||
await self.bot.say(err_msg)
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def b64(self, ctx: commands.context, *, text=None):
|
||||
if text is None:
|
||||
url = ctx.message.attachments[0]['url']
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(url) as r:
|
||||
print(dir(r))
|
||||
image = await r.read()
|
||||
with open('b64.txt', 'wb') as file:
|
||||
file.write(base64.b64encode(image))
|
||||
file.close()
|
||||
await self.bot.upload('b64.txt')
|
||||
else:
|
||||
await self.bot.say(base64.b64encode(text.encode('utf-8'))
|
||||
.decode('utf-8'))
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def shutup(self, ctx):
|
||||
def check(msg):
|
||||
return msg.author.id == '388859625585508376'
|
||||
await self.bot.purge_from(ctx.message.channel, check=check)
|
||||
await self.bot.say('**:(**')
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def shell(self, ctx, *, command):
|
||||
if ctx.message.author.id == '140652945032216576':
|
||||
pag = commands.Paginator()
|
||||
out = os.popen(command).read().split('\n')
|
||||
for i in out:
|
||||
try:
|
||||
pag.add_line(line=i)
|
||||
except RuntimeError:
|
||||
pag.close_page()
|
||||
pag.add_line(line=i)
|
||||
for i in pag.pages:
|
||||
await self.bot.say(i)
|
||||
|
||||
|
||||
def setup(bot):
|
||||
bot.add_cog(bots_commands(bot))
|
|
@ -0,0 +1,47 @@
|
|||
import discord
|
||||
from discord.ext import commands
|
||||
|
||||
|
||||
class discordinfo:
|
||||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def user(self, ctx):
|
||||
em = discord.Embed(title=f"**{ctx.message.author}**",
|
||||
color=discord.Color(4359924))
|
||||
em.set_thumbnail(url=ctx.message.author.avatar_url)
|
||||
em.add_field(value=[i.name for i in ctx.message.author.roles
|
||||
if i.name != '@everyone'], name='Roles')
|
||||
await self.bot.say(embed=em)
|
||||
|
||||
@commands.group(pass_context=True)
|
||||
async def server(self, ctx):
|
||||
if ctx.invoked_subcommand is None:
|
||||
out = f'{ctx.message.server.name}\n'
|
||||
humans = {"online": 0, "offline": 0, "idle": 0, "dnd": 0}
|
||||
bots = {"online": 0, "offline": 0, "idle": 0, "dnd": 0}
|
||||
for m in ctx.message.server.members:
|
||||
if m.bot:
|
||||
bots[str(m.status)] = bots[str(m.status)] + 1
|
||||
else:
|
||||
humans[str(m.status)] = humans[str(m.status)] + 1
|
||||
out += f'**Bots**: {bots["online"]}**online**, ' \
|
||||
f'{bots["offline"]}**offline**, {bots["idle"]}**idle**, ' \
|
||||
f'{bots["dnd"]}**dnd**\n' \
|
||||
f'**Humans**: {humans["online"]}**online**, ' \
|
||||
f'{humans["offline"]}**offline**, ' \
|
||||
f'{humans["idle"]}**idle**, {humans["dnd"]}**dnd**\n'
|
||||
await self.bot.say(out)
|
||||
|
||||
@server.command(pass_context=True)
|
||||
async def roles(self, ctx):
|
||||
out = f'**{ctx.message.server.name}, roles**\n'
|
||||
for r in ctx.message.server.roles:
|
||||
if r.name != '@everyone':
|
||||
out = out + f'**{r.name}**: {r.id}\n'
|
||||
await self.bot.say(out)
|
||||
|
||||
|
||||
def setup(bot):
|
||||
bot.add_cog(discordinfo(bot))
|
|
@ -0,0 +1,67 @@
|
|||
import discord
|
||||
from discord.ext import commands
|
||||
import requests
|
||||
import aiohttp
|
||||
|
||||
import random
|
||||
import asyncio
|
||||
|
||||
durls = {"random": "https://dog.ceo/api/breeds/image/random",
|
||||
"list": "https://dog.ceo/api/breeds/list",
|
||||
"breed": "https://dog.ceo/api/breed/{}/images/random"}
|
||||
|
||||
|
||||
class wp:
|
||||
@staticmethod
|
||||
async def jsondecoder(url, req):
|
||||
req = req.replace(' ', '%20')
|
||||
url = url.format(req)
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(url) as r:
|
||||
if r.status == 200:
|
||||
return await r.json()
|
||||
|
||||
|
||||
class dogs:
|
||||
def __init__(self, bot, breeds):
|
||||
self.bot = bot
|
||||
self.bot.breeds = breeds
|
||||
|
||||
@commands.command()
|
||||
async def pug(self):
|
||||
'''generates a random pug'''
|
||||
em = discord.Embed(color=discord.Color(value=random.randint(000000,
|
||||
999999)))
|
||||
p = await wp.jsondecoder(durls["breed"], "pug")
|
||||
em.set_image(url=p["message"])
|
||||
await self.bot.say(embed=em)
|
||||
|
||||
@commands.command()
|
||||
async def dog(self, breed=None):
|
||||
"""generates a random picture of a dog use:
|
||||
'&dog' to see a random dog of any bread,
|
||||
'&dog list' will give u a list of callable breads and finally
|
||||
'&dog [breedname]' will give u a dog of the selected bread"""
|
||||
if breed is None:
|
||||
color = discord.Color(value=random.randint(000000, 999999))
|
||||
em = discord.Embed(color=color)
|
||||
u = await wp.jsondecoder(durls["random"], "")
|
||||
em.set_image(url=u["message"])
|
||||
await self.bot.say(embed=em)
|
||||
elif breed == "list":
|
||||
await self.bot.say("**Here is a list of the valid breeds:**")
|
||||
await self.bot.say(self.bot.breeds)
|
||||
else:
|
||||
if breed not in self.bot.breeds:
|
||||
await self.bot.say("Learn to spell noob!")
|
||||
else:
|
||||
color = discord.Color(value=random.randint(000000, 999999))
|
||||
em = discord.Embed(color=color)
|
||||
d = await wp.jsondecoder(durls["breed"], breed)
|
||||
em.set_image(url=d["message"])
|
||||
await self.bot.say(embed=em)
|
||||
|
||||
|
||||
def setup(bot):
|
||||
breeds = requests.get(url=durls['list']).json()
|
||||
bot.add_cog(dogs(bot, breeds["message"]))
|
|
@ -0,0 +1,190 @@
|
|||
from discord.ext import commands
|
||||
import time
|
||||
import datetime
|
||||
import math
|
||||
import asyncio
|
||||
import traceback
|
||||
import discord
|
||||
import inspect
|
||||
import textwrap
|
||||
from contextlib import redirect_stdout
|
||||
import io
|
||||
|
||||
ownerid = "140652945032216576"
|
||||
|
||||
|
||||
class REPL:
|
||||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
self._last_result = None
|
||||
self.sessions = set()
|
||||
|
||||
def cleanup_code(self, content):
|
||||
"""Automatically removes code blocks from the code."""
|
||||
# remove ```py\n```
|
||||
if content.startswith('```') and content.endswith('```'):
|
||||
return '\n'.join(content.split('\n')[1:-1])
|
||||
|
||||
# remove `foo`
|
||||
return content.strip('` \n')
|
||||
|
||||
def get_syntax_error(self, e):
|
||||
if e.text is None:
|
||||
return '```py\n{0.__class__.__name__}: {0}\n```'.format(e)
|
||||
return '```py\n{0.text}{1:>{0.offset}}\n{2}: {0}```' \
|
||||
.format(e, '^', type(e).__name__)
|
||||
|
||||
@commands.command(pass_context=True, hidden=True, name='exec')
|
||||
async def _eval(self, ctx, *, body: str):
|
||||
if ctx.message.author.id != ownerid:
|
||||
return
|
||||
env = {
|
||||
'bot': self.bot,
|
||||
'ctx': ctx,
|
||||
'channel': ctx.message.channel,
|
||||
'author': ctx.message.author,
|
||||
'server': ctx.message.server,
|
||||
'message': ctx.message,
|
||||
'_': self._last_result
|
||||
}
|
||||
|
||||
env.update(globals())
|
||||
|
||||
body = self.cleanup_code(body)
|
||||
stdout = io.StringIO()
|
||||
|
||||
to_compile = 'async def func():\n%s' % textwrap.indent(body, ' ')
|
||||
|
||||
try:
|
||||
exec(to_compile, env)
|
||||
except SyntaxError as e:
|
||||
return await self.bot.say(self.get_syntax_error(e))
|
||||
|
||||
func = env['func']
|
||||
try:
|
||||
with redirect_stdout(stdout):
|
||||
ret = await func()
|
||||
except Exception as e:
|
||||
value = stdout.getvalue()
|
||||
await self.bot.say('```py\n{}{}\n```'
|
||||
.format(value, traceback.format_exc()))
|
||||
else:
|
||||
value = stdout.getvalue()
|
||||
try:
|
||||
await self.bot.add_reaction(ctx.message, '\U0001F400')
|
||||
await self.bot.send_message(discord.Object(
|
||||
id="394242425151029248"), f"```py\n{body}\n```")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if ret is None:
|
||||
if value:
|
||||
out = '\n%s\n' % value
|
||||
else:
|
||||
self._last_result = ret
|
||||
out = '\n%s%s\n' % (value, ret)
|
||||
|
||||
pag = commands.Paginator(prefix='```py\n')
|
||||
out = out.split('\n')
|
||||
for i in out:
|
||||
try:
|
||||
pag.add_line(line=i)
|
||||
except RuntimeError:
|
||||
pag.close_page()
|
||||
pag.add_line(line=i)
|
||||
for i in pag.pages:
|
||||
await self.bot.say(i)
|
||||
|
||||
@commands.command(pass_context=True, hidden=True)
|
||||
async def repl(self, ctx):
|
||||
if ctx.message.author.id != ownerid:
|
||||
return
|
||||
msg = ctx.message
|
||||
|
||||
variables = {
|
||||
'ctx': ctx,
|
||||
'bot': self.bot,
|
||||
'message': msg,
|
||||
'server': msg.server,
|
||||
'channel': msg.channel,
|
||||
'author': msg.author,
|
||||
'_': None,
|
||||
}
|
||||
|
||||
if msg.channel.id in self.sessions:
|
||||
await self.bot.say('Already running a REPL session in this'
|
||||
'channel. Exit it with `quit`.')
|
||||
return
|
||||
|
||||
self.sessions.add(msg.channel.id)
|
||||
await self.bot.say('Enter code to execute or evaluate. `exit()` or'
|
||||
'`quit` to exit.')
|
||||
while True:
|
||||
response = await self.bot.wait_for_message(author=msg.author,
|
||||
channel=msg.channel,
|
||||
check=lambda m: m
|
||||
.content.startswith('`')
|
||||
)
|
||||
|
||||
cleaned = self.cleanup_code(response.content)
|
||||
|
||||
if cleaned in ('quit', 'exit', 'exit()'):
|
||||
await self.bot.say('Exiting.')
|
||||
self.sessions.remove(msg.channel.id)
|
||||
return
|
||||
|
||||
executor = exec
|
||||
if cleaned.count('\n') == 0:
|
||||
# single statement, potentially 'eval'
|
||||
try:
|
||||
code = compile(cleaned, '<repl session>', 'eval')
|
||||
except SyntaxError:
|
||||
pass
|
||||
else:
|
||||
executor = eval
|
||||
|
||||
if executor is exec:
|
||||
try:
|
||||
code = compile(cleaned, '<repl session>', 'exec')
|
||||
except SyntaxError as e:
|
||||
await self.bot.say(self.get_syntax_error(e))
|
||||
continue
|
||||
|
||||
variables['message'] = response
|
||||
|
||||
fmt = None
|
||||
stdout = io.StringIO()
|
||||
|
||||
try:
|
||||
with redirect_stdout(stdout):
|
||||
result = executor(code, variables)
|
||||
if inspect.isawaitable(result):
|
||||
result = await result
|
||||
except Exception as e:
|
||||
value = stdout.getvalue()
|
||||
fmt = '```py\n{}{}\n```'.format(value, traceback.format_exc())
|
||||
else:
|
||||
value = stdout.getvalue()
|
||||
if result is not None:
|
||||
fmt = '```py\n{}{}\n```'.format(value, result)
|
||||
variables['_'] = result
|
||||
elif value:
|
||||
fmt = '```py\n{}\n```'.format(value)
|
||||
|
||||
try:
|
||||
if fmt is not None:
|
||||
if len(fmt) > 2000:
|
||||
await self.bot.send_message(msg.channel,
|
||||
'Content too big to be'
|
||||
'printed.')
|
||||
else:
|
||||
await self.bot.send_message(msg.channel, fmt)
|
||||
except discord.Forbidden:
|
||||
pass
|
||||
except discord.HTTPException as e:
|
||||
await self.bot.send_message(msg.channel, 'Unexpected error:'
|
||||
f'`{e}`')
|
||||
|
||||
|
||||
def setup(bot):
|
||||
bot.add_cog(REPL(bot))
|
|
@ -0,0 +1,3 @@
|
|||
discord.py
|
||||
requests
|
||||
runescapeapi
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"Crafting": "<:Crafting:406361343168610305>",
|
||||
"Agility": "<:Agility:406361343210553344>",
|
||||
"Constitution": "<:Constitution:406361343222874112>",
|
||||
"Attack": "<:Attack:406361343223136256>",
|
||||
"Ranged": "<:Ranged:406361343298502658>",
|
||||
"Construction": "<:Construction:406361343302565888>",
|
||||
"Thieving": "<:Thieving:406361343302696962>",
|
||||
"Defence": "<:Defence:406361343348834304>",
|
||||
"Fletching": "<:Fletching:406361343353159691>",
|
||||
"Strength": "<:Strength:406361343357222914>",
|
||||
"Cooking": "<:Cooking:406361343361548298>",
|
||||
"Divination": "<:Divination:406361343374131211>",
|
||||
"Dungeoneering": "<:Dungeoneering:406361343386451979>",
|
||||
"Slayer": "<:Slayer:406361343407685633>",
|
||||
"Hunter": "<:Hunter:406361343474532353>",
|
||||
"Smithing": "<:Smithing:406361343487115265>",
|
||||
"Mining": "<:Mining:406361343583584256>",
|
||||
"Fishing": "<:Fishing:406361343583846410>",
|
||||
"Invention": "<:Invention:406361343591972864>",
|
||||
"Runecrafting": "<:Runecrafting:406361343596298250>",
|
||||
"Woodcutting": "<:Woodcutting:406361343718064128>",
|
||||
"Firemaking": "<:Firemaking:406361343718064129>",
|
||||
"Summoning": "<:Summoning:406361343843631107>",
|
||||
"blank": "<:blank:406378361418547201>",
|
||||
"Farming": "<:Farming:406361343407423498>",
|
||||
"Prayer": "<:Prayer:406361343445434390>",
|
||||
"Magic": "<:Magic:406361343608881152>",
|
||||
"Herblore": "<:Herblore:406361343554355210>"
|
||||
}
|
|
@ -0,0 +1,118 @@
|
|||
import discord
|
||||
from discord.ext import commands
|
||||
import asyncio
|
||||
import runescapeapi
|
||||
import json
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
import functools
|
||||
|
||||
with open('rs_emojis.json', 'r') as f:
|
||||
emojis = json.load(f)
|
||||
|
||||
|
||||
tpe = ThreadPoolExecutor()
|
||||
|
||||
|
||||
async def execute(func, *args, **kwargs):
|
||||
partial = functools.partial(func, *args, **kwargs)
|
||||
loop = asyncio.get_event_loop()
|
||||
return await loop.run_in_executor(tpe, partial)
|
||||
|
||||
|
||||
class runescape:
|
||||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def profile(self, ctx, *, rsn=""):
|
||||
"""returns the runescape stats of a given rsn"""
|
||||
this = runescapeapi.Player(rsn)
|
||||
em = discord.Embed()
|
||||
try:
|
||||
em.set_author(name="RuneMetrics profile of: {}"
|
||||
.format(await execute(this.rsn)))
|
||||
except LookupError:
|
||||
await self.bot.send_message(ctx.message.channel,
|
||||
'No profile found')
|
||||
return
|
||||
levels = await execute(this.stats)
|
||||
left = ''
|
||||
for c, i in enumerate(levels, 1):
|
||||
left += f"{emojis[i['name']]}{i['level']}"
|
||||
if c % 3 == 0:
|
||||
left += '\n'
|
||||
em.add_field(name="Levels", value=left, inline=True)
|
||||
q_ = await execute(this.quest_summary)
|
||||
overalltotal = await execute(this.overall_total)
|
||||
combat = await execute(this.combat)
|
||||
clan = await execute(this.clan)
|
||||
title = await execute(this.title)
|
||||
try:
|
||||
quest_total = sum(q_.values())
|
||||
except TypeError:
|
||||
quest_total = None
|
||||
right = f'**Quests:** {q_["complete"]}/{quest_total} ' \
|
||||
f'({q_["started"]} in progress)\n' \
|
||||
f'**Rank:** {overalltotal["rank"]}\n' \
|
||||
f'**Total level:** {overalltotal["level"]}\n' \
|
||||
f'**Total xp:** {overalltotal["xp"]:,}\n' \
|
||||
f'**Combat level:** {combat["combatlevel"]}\n' \
|
||||
f'**Clan:** {clan}\n' \
|
||||
f'**Title:** {title["title"]}'
|
||||
em.add_field(name='Info', value=right, inline=True)
|
||||
em.set_thumbnail(url=await execute(this.forum_pic))
|
||||
await self.bot.say(embed=em)
|
||||
activities = await execute(this.alog)
|
||||
if activities == []:
|
||||
return
|
||||
act = ""
|
||||
for a in activities[:10]:
|
||||
act = act + f'**{a["date"]}** {a["text"]}\n' \
|
||||
f'```{" ".join(a["details"].split())}```'
|
||||
await self.bot.say(act)
|
||||
act = ""
|
||||
for a in activities[10:]:
|
||||
act = act + f'**{a["date"]}** {a["text"]}\n' \
|
||||
f'```{" ".join(a["details"].split())}```'
|
||||
await self.bot.say(act)
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def map(self, ctx):
|
||||
url = 'http://167.99.150.82/maps/tiles/2_0_{}_{}.png'
|
||||
x = 51
|
||||
y = 50
|
||||
em = discord.Embed()
|
||||
em.set_image(url=url.format(x, y))
|
||||
msg = await self.bot.say(embed=em)
|
||||
await self.bot.add_reaction(msg, '⬆')
|
||||
await self.bot.add_reaction(msg, '⬇')
|
||||
await self.bot.add_reaction(msg, '⬅')
|
||||
await self.bot.add_reaction(msg, '➡')
|
||||
while True:
|
||||
r = await self.bot.wait_for_reaction(message=msg,
|
||||
user=ctx.message.author,
|
||||
emoji=['⬆', '⬇', '⬅', '➡'])
|
||||
if r.reaction.emoji == '⬆':
|
||||
y = y + 1
|
||||
em.set_image(url=url.format(x, y))
|
||||
await self.bot.remove_reaction(msg, '⬆', ctx.message.author)
|
||||
await self.bot.edit_message(msg, embed=em)
|
||||
elif r.reaction.emoji == '⬇':
|
||||
y = y - 1
|
||||
em.set_image(url=url.format(x, y))
|
||||
await self.bot.remove_reaction(msg, '⬇', ctx.message.author)
|
||||
await self.bot.edit_message(msg, embed=em)
|
||||
elif r.reaction.emoji == '⬅':
|
||||
x = x - 1
|
||||
em.set_image(url=url.format(x, y))
|
||||
await self.bot.remove_reaction(msg, '⬅', ctx.message.author)
|
||||
await self.bot.edit_message(msg, embed=em)
|
||||
elif r.reaction.emoji == '➡':
|
||||
x = x + 1
|
||||
em.set_image(url=url.format(x, y))
|
||||
await self.bot.remove_reaction(msg, '➡', ctx.message.author)
|
||||
await self.bot.edit_message(msg, embed=em)
|
||||
|
||||
|
||||
def setup(bot):
|
||||
bot.add_cog(runescape(bot))
|
|
@ -0,0 +1 @@
|
|||
python-3.6.4
|
Reference in New Issue