This repository has been archived on 2020-01-26. You can view files and clone it, but cannot push or open issues or pull requests.
robo-rat/bot_commands.py

305 lines
13 KiB
Python
Raw Normal View History

2018-07-07 23:25:54 +12:00
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))