305 lines
13 KiB
Python
305 lines
13 KiB
Python
|
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))
|