883 lines
34 KiB
Python
883 lines
34 KiB
Python
import asyncio
|
|
import discord
|
|
from discord.ext import commands
|
|
from urllib import request
|
|
import requests
|
|
import json, requests
|
|
import math
|
|
from datetime import datetime
|
|
import sys
|
|
import os
|
|
import random
|
|
|
|
class Shitpost(commands.Cog):
|
|
"""Schijtpaal commando's. Alleen bruikbaar in de daarvoor toegewezen schijtpaal kanalen."""
|
|
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
self.voice_states = {}
|
|
self.hdConImpatientEvents = []
|
|
self.zwarte_lijst = [line.rstrip('\n') for line in open('black.txt')]
|
|
self.witte_lijst = [line.rstrip('\n') for line in open('white.txt')] # nihao
|
|
self.insult = ['koekenbakker','stumperd','knurft','oelewapper','klungel','stoethaspel',
|
|
'onnozelaar','beunhaas','uilskuiken','bamibal','zwakzinnige','oenemeloen',
|
|
'klaphark','rompeknonker','bal gehakt','ongewassen vlerk','droeftoeter','omgedraaid pak hagelslag',
|
|
'prutser','domkop','non-valeur','ontzettende debiel','paljas','simpeltje',
|
|
'knoeier','sufferd','slaapkop','onbenul','enorme nerf herder','geinponem',
|
|
'clownsfiguur','krotenkoker','hansworst','grappenmaker','flapdrol','oen',
|
|
'achterlijk gebakje','demente dibbes','geitenbreier','koekwous','sufkop']
|
|
|
|
def __check(self, ctx): #Todo: Is dit het shitpost kanaal?
|
|
return True
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
@asyncio.coroutine
|
|
def ishetalhdcon(self, ctx):
|
|
"""Hoe lang nog tot Hoestende Dranken Con 2020?
|
|
Gebruik: !ishetalhdcon
|
|
"""
|
|
|
|
#year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
|
|
Now = datetime.now()
|
|
HdConDate = datetime(2021, 9, 3, 4, 0, 1) #om 4 uur lig je toch wel al op bed?
|
|
Distance = HdConDate - Now
|
|
Message = Message = "HD Con 2021 is al voorbij. HD Con 2022 zal in 2022 plaatsvinden." #init
|
|
if Distance.days < 0:
|
|
if Now.month == 9:
|
|
if Now.day == 3:
|
|
Message = "HD Con 2021 begint vandaag! HYPE!"
|
|
elif Now.day == 4 or Now.day == 5:
|
|
Message = "HD Con 2021 is nu bezig!!"
|
|
elif Now.day == 6:
|
|
Message = "HD Con 2021 is vandaag alweer afgelopen... F"
|
|
yield from ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
|
return
|
|
else:
|
|
NachtjesSlapen = Distance.days + 1
|
|
if NachtjesSlapen == 1:
|
|
Message = "Nog " + str(NachtjesSlapen) + " nachtje slapen..."
|
|
else:
|
|
Message = "Nog " + str(NachtjesSlapen) + " nachtjes slapen..."
|
|
|
|
#Hou bij hoe vaak dit wordt gevraagd:
|
|
eventsMinutesAgo = 0;
|
|
eventsMinutesAgoSameAuthor = 0;
|
|
eventsLastDays = 0;
|
|
for evt in self.hdConImpatientEvents:
|
|
eventDistance = Now - evt[1]
|
|
if eventDistance.days < 1 and eventDistance.seconds < 600:
|
|
eventsMinutesAgo += 1
|
|
if evt[0] == ctx.author.id:
|
|
eventsMinutesAgoSameAuthor +=1
|
|
if eventDistance.days < 2:
|
|
eventsLastDays += 1
|
|
if not "DMChannel" in type(ctx.channel).__name__: #ignore personal chats
|
|
self.hdConImpatientEvents.append([ctx.author.id, Now])
|
|
|
|
#Als dezelfde persoon het blijft vragen pikken we het niet:
|
|
if eventsMinutesAgoSameAuthor > 3:
|
|
return #fuck it.
|
|
if eventsMinutesAgoSameAuthor > 0:
|
|
if eventsMinutesAgoSameAuthor > 2:
|
|
yield from ctx.channel.send("...")
|
|
return
|
|
yield from ctx.channel.send("Dat vroeg je net ook al, " + ctx.author.mention + "!")
|
|
return
|
|
#Hoe vaker er wordt gevraagd, hoe ongeduldiger de antwoorden:
|
|
if not "DMChannel" in type(ctx.channel).__name__: #ignore personal chats
|
|
impatientFactor = 10 + eventsMinutesAgo*25 + eventsLastDays*10;
|
|
impatientFactor *= random.random()
|
|
if impatientFactor > 100:
|
|
yield from ctx.channel.send("Nee!")
|
|
return
|
|
elif impatientFactor > 15 and eventsMinutesAgo > 0:
|
|
Message = "Dat hebben jullie net gevraagd."
|
|
elif impatientFactor > 9:
|
|
Message = "Nee."
|
|
|
|
yield from ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
@asyncio.coroutine
|
|
def zalgo(self, ctx, *, arg):
|
|
"""z̴̬̘͇̗͇̦̤̩̜͜ą̷̟̯̪̩̣̭̭͇̹l̴̗͓̟̠̤̳̗͉̠ͅg̵̜͎̪̞̫͎͈͉͉͍o̵̧̧͇̱̱̜̮͉͉̳ ̴̨̡͖̘̪̭̖͖̘̝h̸̭̰̫̲̺̹̻̜͕ͅe̴̢̘̪̱̱̩̠̣̘̱ ̴̡̢̲̞̙̝̮̻̻͇c̶̡̢̺͙̮̗̲̹̱̱o̷̢̡̺̘͈͎̫̬͔̤m̷͕͍͍̥͖̻̲̞̝ͅe̷̱̟͕̥͕̞̜̫̳̙s̷̨͍̼̝̙̩̥̰̠ͅ
|
|
̵͓̥̼͉̹̫̦͉̰͉h̷̦̰̣̗̭͕̩͓͈̠i̶̗̰̹̤̖͙̰̹͙̹j̸̧̜̬̬̜̹͔̰̫͜ ̶̧͉͔̠̻͈̜̳̥̭k̸̯̳̠̼̙̗̘̳͜ͅǫ̵̝̱̩͎̫͈̣̪̦m̶̺̙̟̫͔͈̭̖̱ͅt̶̜̠̟͙̞̠̗̗̥ͅ ̸̢̹̜͉͙̩̬̖ͅͅh̷̯̮̘̭͈̜̺͎̳̯i̴̩̯̼̱͇̟̫̻̘̖j̵̪̤̦͖̮̜̦̼̺̮ ̶̧͇̭̞̮̩̼͚̮ͅḵ̴̢̨̢͉͉͖̹̬̺o̵̢̪̥̻͙͕̫̥̗͜m̶̧̡͔̠̺͖̝̳̪ͅt̷̢̮̭̜̥̠̼̫͍̯
|
|
d̷̢̪͍͓̭̣̼̠͎̠e̴̡̢̩̱͙̻̥̯͎͜ ̵̲̪͖̖͖͍͈͎̮̼ļ̴̯̗̝̦͍͍͖̰͜i̶̡̘̟̳̖͙͕͔̺͜ȩ̸̤͎̣͖͔̭͔̫̯v̷͔̺͖̖̞̙̘̖̠͓e̶̲͍̮̳͎̗̳̞̹͔ ̸̡̬̫͎͎̝͍̤̯ͅg̴̨̞̻͙̠̰͖͖̝ͅǫ̴̘̥͇̙̖͈͍̹̥e̵̥͇̫̱̬̝̥̲̞̜d̷͈͙̝͍͔̘͕̼̜̦e̴̡̯̦͉͙̪̭͕̻̝
|
|
S̴̼͂ ̴̤͘I̴̯͌ ̸̹͛N̵̙͂ ̴̥̅T̶̡̀ ̵̼́E̷̞͌ ̵͚͗R̸͔͑ ̶̢͝K̴̭͂ ̷̨͋L̴̖͂ ̶̪͝A̵̹͗ ̸͓̑Ȁ̶̘ ̸̟́S̵̯̆
|
|
Gebruik: !zalgo [text]
|
|
Bijv: !zalgo "Je moeder"
|
|
"""
|
|
factor = 4
|
|
message = ''
|
|
#from https://github.com/Aethylia/zalgo-cli:
|
|
for letter in arg:
|
|
for i in range(factor):
|
|
letter += random.randint(0x300, 0x36f).to_bytes(2, byteorder='big').decode('utf-16be')
|
|
message += letter
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
yield from ctx.channel.send(ctx.author.mention + ' ' + str(message))
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
@asyncio.coroutine
|
|
def coronaold(self, ctx):
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
params = (
|
|
('minimal/', 'true'),
|
|
('format/', 'json')
|
|
)
|
|
response = requests.get('https://corona-stats.online/NL/?format=json&source=2')
|
|
answer = json.loads(response.content.decode('utf-8'))
|
|
answer = answer["data"]
|
|
message = "Er zijn in Nederland " + str(answer[0]["cases"]) + " bevestigde gevallen 😷"
|
|
message += " dat is 🔺" + str(answer[0]["todayCases"]) + "🔺 meer dan gisteren! "
|
|
message += "Er zijn ondertussen " + str(answer[0]["deaths"]) + " mensen dood 💀"
|
|
message += " waarvan " + str(answer[0]["todayDeaths"]) + " ☠️ in de afgelopen 24 uur. "
|
|
message += "Ook liggen er " + str(answer[0]["critical"]) + " mensen op de IC 🏥"
|
|
yield from ctx.channel.send(ctx.author.mention + ' ' + str(message))
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
@asyncio.coroutine
|
|
def corona(self, ctx):
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
params = (
|
|
('minimal/', 'true'),
|
|
('format/', 'json')
|
|
)
|
|
response = requests.get('https://covid.ourworldindata.org/data/latest/owid-covid-latest.json')
|
|
answer = json.loads(response.content.decode('utf-8'))
|
|
d = answer["NLD"]
|
|
message = f"Dit is mijn informatie van **{d['last_updated_date']}**: \n\n"
|
|
message += f"Er zijn in Nederland {d['total_cases']:.0f} bevestigde gevallen 😷"
|
|
message += f" dat is 🔺{d['new_cases']:.0f}🔺 meer dan de dag er voor! \n"
|
|
message += f"Er zijn ondertussen {d['total_deaths']:.0f} mensen dood 💀"
|
|
message += f" waarvan {d['new_deaths']:.0f} ☠️ in de meest recente 24 uur. \n"
|
|
message += f"Er zijn ondertussen {d['people_vaccinated']:.0f} mensen gevaccineerd! 💉 "
|
|
message += f"En het r-getal is {d['reproduction_rate']}!\n\n"
|
|
message += "*Data van https://ourworldindata.org/coronavirus*"
|
|
yield from ctx.channel.send(ctx.author.mention + ' ' + str(message))
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
@asyncio.coroutine
|
|
def viertwintig(self, ctx):
|
|
"""Hoe lang nog tot 420?
|
|
Gebruik: !viertwintig
|
|
"""
|
|
#year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
|
|
Now = datetime.now()
|
|
Next420 = datetime(Now.year, 4, 20, 16, 20, 00)
|
|
Distance = Next420 - Now
|
|
print("Time till 420: " + str(Distance.days) + ", " + str(Distance.seconds))
|
|
Message = ""
|
|
if Distance.days < 0:
|
|
if Distance.days == -1 and Now.day == 20: #is it still 420 today?
|
|
Message += ":leaf: **BLAZE IT** :leaf: "
|
|
else:
|
|
Message += "420 is al geweest dit jaar. Blaze het volgend jaar nog eens."
|
|
else:
|
|
days = Distance.days #bv 4
|
|
secondsLeft = (Distance.seconds)
|
|
print(secondsLeft)
|
|
hours = math.floor(secondsLeft / 3600)
|
|
print(hours)
|
|
secondsLeft = secondsLeft - hours*3600
|
|
minutes = math.floor(secondsLeft / 60)
|
|
seconds = secondsLeft - minutes * 60
|
|
Message += "Nog " + str(days) + " dagen, " + str(hours) + " uur, " + str(minutes) + " minuten en " + str(seconds) + " seconden tot 420!!"
|
|
|
|
yield from ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
@asyncio.coroutine
|
|
def iselderscrolls6aluit(self, ctx):
|
|
"""Hoe lang nog tot Elder Scrolls 6? 11-11-11? 20-20-20?
|
|
Gebruik: !iselderscrolls6aluit
|
|
"""
|
|
Now = datetime.now()
|
|
|
|
if Now.month == 4 and Now.day == 1:
|
|
Message = "JA! :hushed: " #1 april, motherfucker.
|
|
else:
|
|
Message = "Nee. :frowning2: Nog even geduld..."
|
|
|
|
yield from ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
@asyncio.coroutine
|
|
def giethetaloan(self, ctx):
|
|
"""Giet het al oan?
|
|
Ja of Nee.. kom op nou.
|
|
"""
|
|
#We halen dit op van de twitter account @gietitaloan die vertrouwen wij als de ultieme waarheid
|
|
consumer = oauth.Consumer(key=self.bot.tokens["twitterKey"], secret=self.bot.tokens["twitterSecret"])
|
|
client = oauth.Client(consumer)
|
|
resp, content = client.request("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=gietitaloan&count=1", "GET")
|
|
#TODO kijken of resp iets zinnigs teruggeeft.. of iets doen met een try of catch ofzow
|
|
content_str = content.decode('utf-8') #converteren naar str voor welke stomme reden dan ook
|
|
answer = json.loads(content_str)[0]["text"] #inhoud van de tweet
|
|
answer = answer.lower()
|
|
reactie = ""
|
|
if 'ja' in answer:
|
|
if 'nee' in answer:
|
|
reactie += 'Het is onduidelijk..'
|
|
else:
|
|
reactie += 'Het giet oan!'
|
|
else:
|
|
if 'nee' in answer:
|
|
reactie += 'Nee helaas..'
|
|
yield from ctx.channel.send(ctx.author.mention + ' ' + reactie)
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
@asyncio.coroutine
|
|
def inspire(self, ctx):
|
|
"""Laat je inspireren
|
|
Bijvoorbeeld:
|
|
!inspire
|
|
"""
|
|
r = requests.get(url='http://inspirobot.me/api?generate=true')
|
|
if r.status_code is 200:
|
|
url = r.text
|
|
em = discord.Embed(title='Uw wijze woorden:', type='photo')
|
|
em.set_image(url=url)
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
|
else:
|
|
yield from ctx.channel.send(ctx.author.mention + ' helaas, geen quote gevonden.')
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
@asyncio.coroutine
|
|
def tering(self, ctx, boven: str, onder: str):
|
|
"""Vanavond gaan we helemaal naar de tering
|
|
Bijvoorbeeld:
|
|
!tering \"Vanavond\" \"gaan we helemaal naar de tering\"
|
|
"""
|
|
params = dict(
|
|
template_id = '78416340', #party hard
|
|
username = 'Stroopwafel',
|
|
password = self.bot.passwords["imgflip"],
|
|
text0 = boven,
|
|
text1 = onder
|
|
)
|
|
resp = requests.get(url='https://api.imgflip.com/caption_image', params=params)
|
|
#todo check for success
|
|
photourl = resp.json()['data']['url']
|
|
em = discord.Embed(type='photo')
|
|
em.set_image(url=photourl)
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
@asyncio.coroutine
|
|
def mark(self, ctx, boven: str, onder: str):
|
|
"""Maakt een mark meem.
|
|
Bijvoorbeeld:
|
|
!mark \"je moeder\" \"is een hoer\"
|
|
"""
|
|
params = dict(
|
|
template_id = '112898841', #de marku
|
|
username = 'Stroopwafel',
|
|
password = self.bot.passwords["imgflip"],
|
|
text0 = boven,
|
|
text1 = onder
|
|
)
|
|
#self.bot.say("deed ik het ding?")
|
|
resp = requests.get(url='https://api.imgflip.com/caption_image', params=params)
|
|
#todo check for success
|
|
photourl = resp.json()['data']['url']
|
|
em = discord.Embed(title='De Mark heeft gesproken.', type='photo')
|
|
em.set_image(url=photourl)
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
@asyncio.coroutine
|
|
def eriku(self, ctx, boven: str, onder: str):
|
|
"""Maakt een erik meem.
|
|
Bijvoorbeeld:
|
|
!eriku \"je moeder\" \"is een hoer\"
|
|
"""
|
|
params = dict(
|
|
template_id = '93296473', #de eriku
|
|
username = 'Stroopwafel',
|
|
password = self.bot.passwords["imgflip"],
|
|
text0 = boven,
|
|
text1 = onder
|
|
)
|
|
#self.bot.say("deed ik het ding?")
|
|
resp = requests.get(url='https://api.imgflip.com/caption_image', params=params)
|
|
#todo check for success
|
|
photourl = resp.json()['data']['url']
|
|
em = discord.Embed(title='De Eriku heeft gesproken. Prijs hem!', type='photo')
|
|
em.set_image(url=photourl)
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
@asyncio.coroutine
|
|
def tegeltje(self, ctx, tekst: str, auteur: str=" "):
|
|
"""Maak een mooi tegeltje met volkswijsheid
|
|
Bijvoorbeeld:
|
|
!tegeltje \"Oost west, 420 best\" \"Lourens\"
|
|
"""
|
|
|
|
params = {
|
|
'template_id': '121572521', #delfts blauw
|
|
'username': 'Stroopwafel',
|
|
'password': self.bot.passwords["imgflip"],
|
|
'text0': 'dummy0',
|
|
'text1': 'dummy1',
|
|
'font': 'arial',
|
|
'max_font_size': 27,
|
|
'boxes[0][text]': tekst,
|
|
'boxes[0][x]': 40,
|
|
'boxes[0][y]': 85,
|
|
'boxes[0][width]': 220,
|
|
'boxes[0][height]': 150,
|
|
'boxes[0][color]': '#0044cc',
|
|
'boxes[0][outline_color]': '#ffffff',
|
|
'boxes[1][text]': auteur,
|
|
'boxes[1][x]': 80,
|
|
'boxes[1][y]': 245,
|
|
'boxes[1][width]': 140,
|
|
'boxes[1][height]': 12,
|
|
'boxes[1][color]': '#0044cc',
|
|
'boxes[1][outline_color]': '#ffffff'
|
|
}
|
|
|
|
resp = requests.get(url='https://api.imgflip.com/caption_image', params=params)
|
|
#todo check for success
|
|
photourl = resp.json()['data']['url']
|
|
em = discord.Embed(title='Tegeltjeswijsheid:', type='photo')
|
|
em.set_image(url=photourl)
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
|
|
|
@commands.command(pass_context=True)
|
|
@asyncio.coroutine
|
|
def relevantxkcd(self, ctx, query: str):
|
|
"""There is always a relevant XKCD
|
|
Bijvoorbeeld:
|
|
!relevantxkcd python
|
|
"""
|
|
|
|
#self.bot.say("deed ik het ding?")
|
|
response = requests.get("https://relevantxkcd.appspot.com/process?action=xkcd&query=" + query)
|
|
|
|
splitResponse = response.text.split(" ")
|
|
|
|
if (float(splitResponse[0]) == 0.0):
|
|
yield from ctx.channel.send('Ik kan helaas geen XKCD vinden met als onderwerp "' + query + '".')
|
|
return
|
|
|
|
photoUrl = "http://www.explainxkcd.com" + splitResponse[3]
|
|
|
|
print(photoUrl)
|
|
|
|
em = discord.Embed(title='', type='photo')
|
|
em.set_image(url=photoUrl)
|
|
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
yield from ctx.channel.send(ctx.author.mention +
|
|
' een XKCD over "' + query + '"', embed=em)
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
@asyncio.coroutine
|
|
def zout(self, ctx, boven: str, onder: str):
|
|
"""Maakt een martijn-zout meem.
|
|
Bijvoorbeeld:
|
|
!zout \"je moeder\" \"is een hoer\"
|
|
"""
|
|
params = dict(
|
|
template_id = '116231806', #de martijn
|
|
username = 'Stroopwafel',
|
|
password = self.bot.passwords["imgflip"],
|
|
text0 = boven,
|
|
text1 = onder
|
|
)
|
|
#self.bot.say("deed ik het ding?")
|
|
resp = requests.get(url='https://api.imgflip.com/caption_image', params=params)
|
|
#todo check for success
|
|
photourl = resp.json()['data']['url']
|
|
em = discord.Embed(title='De Martijn heeft gesproken.', type='photo')
|
|
em.set_image(url=photourl)
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
@asyncio.coroutine
|
|
def nihao(self,ctx):
|
|
#yield from self.bot.say("Kankerlauw")
|
|
yield from ctx.channel.send("kankerlauw")
|
|
|
|
@commands.command(pass_context=True)
|
|
@asyncio.coroutine
|
|
def tijd(self, ctx, *args):
|
|
"""Vertelt je hoe laat het is..
|
|
Misschien geeft het ook wel een leuke meem terug.
|
|
Wie weet.
|
|
Probeer het eens op verschillende tijdstippen.
|
|
"""
|
|
|
|
time=datetime.now().strftime('%H%M')
|
|
for argument in args:
|
|
time = argument
|
|
filepath = ''
|
|
#filejpg = './tijd/' + time + '.jpg'
|
|
#filepng = './tijd/' + time + '.png'
|
|
filejpg = os.path.join('tijd', time) + '.jpg'
|
|
filepng = os.path.join('tijd', time) + '.png'
|
|
filegif = os.path.join('tijd', time) + '.gif'
|
|
if os.path.isfile(filejpg):
|
|
filepath = filejpg
|
|
elif os.path.isfile(filegif):
|
|
filepath = filegif
|
|
elif os.path.isfile(filepng):
|
|
filepath = filepng
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
if filepath is not '':
|
|
#file = open(filepath, 'rb')
|
|
#yield from self.bot.upload(file, filename = filepath)
|
|
yield from ctx.channel.send(ctx.author.mention + ' Het is nu ' + datetime.now().strftime('%H:%M'), file=discord.File(filepath, 'tijd.png'))
|
|
else:
|
|
yield from ctx.channel.send(ctx.author.mention + ' Het is nu ' + datetime.now().strftime('%H:%M'))
|
|
|
|
|
|
@commands.command(pass_context=True)
|
|
@asyncio.coroutine
|
|
def roll(self, ctx, dice="1d20", modifier1="", modifier2=""):
|
|
"""Roll een dobbelsteen. Of een paar. Bijvoorbeeld:
|
|
!roll 4d20
|
|
!roll 1d6 + 5
|
|
"""
|
|
diceSplit = dice.lower().split('d')
|
|
if len(diceSplit) != 2:
|
|
return
|
|
modifier1 = modifier1.replace("+", "") #this is both possible: "1d20 + 1" and "1d20 +1"
|
|
modifier2 = modifier2.replace("+", "")
|
|
if modifier1 == "-":
|
|
modifier1 = ""; #this is also possible: "1d20 - 1"
|
|
modifier2 = "-" + modifier2
|
|
try: #check if they are numbers:
|
|
nrOfDice = 1 if (diceSplit[0]=="") else int(diceSplit[0]) #allow input like: "!roll d20"
|
|
dieType = int(diceSplit[1])
|
|
mod1 = 0 if (modifier1=="") else int(modifier1)
|
|
mod2 = 0 if (modifier2=="") else int(modifier2)
|
|
except ValueError:
|
|
return
|
|
#validate values:
|
|
if nrOfDice < 1 or nrOfDice > 99 or dieType < 2 or dieType > 100:
|
|
return
|
|
if mod1 < -999 or mod1 > 999 or mod2 < -999 or mod2 > 999:
|
|
return
|
|
|
|
#roll:
|
|
random.seed(datetime.now())
|
|
total = 0
|
|
returnText = "Rolling " + str(nrOfDice) + "d" + str(dieType) + "...\n"
|
|
for x in range(0, nrOfDice):
|
|
if x != 0:
|
|
returnText += "+ "
|
|
roll = random.randint(1, dieType)
|
|
total += roll
|
|
if dieType >= 10 and (roll == 1 or roll == dieType):
|
|
returnText += "[**" + str(roll) + "**] " #make significant numbers bold
|
|
else:
|
|
returnText += "[" + str(roll) + "] "
|
|
total += mod1 + mod2
|
|
if mod1 != 0:
|
|
if mod1 > 0:
|
|
returnText += "+"
|
|
returnText += str(mod1) + " "
|
|
if mod2 != 0:
|
|
if mod2 > 0:
|
|
returnText += "+"
|
|
returnText += str(mod2) + " "
|
|
if nrOfDice > 1 or mod1 != 0 or mod2 != 0: #only show calculation if it makes sense:
|
|
returnText += " = __**" + str(total) + "**__"
|
|
|
|
yield from ctx.channel.send(returnText)
|
|
|
|
|
|
@commands.command(pass_context=True)
|
|
@asyncio.coroutine
|
|
def weer(self, ctx, location="Leiden", verbose="False"):
|
|
"""Vertelt je het weer.
|
|
Omdat je te lui bent om naar buiten te kijken.
|
|
Oant Moarn!
|
|
"""
|
|
if(location == ""):
|
|
location = "Leiden"
|
|
if(str(verbose).lower() == "false"):
|
|
v = False
|
|
else:
|
|
v = True
|
|
|
|
url = f"http://weerlive.nl/api/json-data-10min.php?key={self.bot.tokens['weerLive']}&locatie={location}"
|
|
response = requests.get(url)
|
|
#Oant Moarn
|
|
|
|
if (response.ok):
|
|
wData = json.loads(response.content.decode('utf-8'))
|
|
message = ""
|
|
|
|
# Weather alert:
|
|
alertCode, alertMessage = self.getWeerAlarm(wData["liveweer"][0])
|
|
if (v and alertCode != None):
|
|
message += alertMessage + "\n\n"
|
|
elif (not v and alertCode != None):
|
|
if (alertCode == "rood"):
|
|
message += alertMessage + "\n\n"
|
|
else:
|
|
message += ":warning: Er is een weeralarm van kracht. Code " + alertCode + ".\n\n"
|
|
|
|
# Today:
|
|
message += self.getWeatherIconTranslation( wData["liveweer"][0]["image"] )
|
|
message += " Het is " + wData["liveweer"][0]["temp"] + " graden "
|
|
message += "en het weer is: " + wData["liveweer"][0]["samenv"] + ". "
|
|
message += "De verwachting: " + wData["liveweer"][0]["verw"]
|
|
|
|
if (v):
|
|
# Only print tomorrow, the day after and the BBQ grade if verbose is on:
|
|
message += "\n\nMorgen: " + self.getWeatherIconTranslation( wData["liveweer"][0]["d1weer"] )
|
|
message += " " + wData["liveweer"][0]["d1tmin"] + " tot "
|
|
message += wData["liveweer"][0]["d1tmax"] + " graden. "
|
|
if (wData["liveweer"][0]["d1neerslag"] == "0"):
|
|
message += "Geen neerslag. "
|
|
else:
|
|
message += "Kans op neerslag: " + wData["liveweer"][0]["d1neerslag"] + "%. "
|
|
if (int(wData["liveweer"][0]["d1windk"]) > 5):
|
|
message += "Windkracht " + wData["liveweer"][0]["d1windk"] + ". Blow it."
|
|
|
|
message += "\n\nOvermorgen: "+ self.getWeatherIconTranslation( wData["liveweer"][0]["d2weer"] )
|
|
message += " " + wData["liveweer"][0]["d2tmin"] + " tot "
|
|
message += wData["liveweer"][0]["d2tmax"] + " graden. "
|
|
if (wData["liveweer"][0]["d2neerslag"] == "0"):
|
|
message += "Geen neerslag. "
|
|
else:
|
|
message += "Kans op neerslag: " + wData["liveweer"][0]["d2neerslag"] + "%. "
|
|
if (int(wData["liveweer"][0]["d2windk"]) > 5):
|
|
message += "Windkracht " + wData["liveweer"][0]["d2windk"] + ". "
|
|
|
|
bbqGrade = self.getBbqGrade(wData["liveweer"][0])
|
|
message += "\n\nHet BBQ cijfer voor vandaag is: " + '{0:g}'.format(round(bbqGrade, 1))
|
|
|
|
message += "\n\nOant Moarn!"
|
|
|
|
yield from ctx.channel.send(message)
|
|
else:
|
|
print("API ERROR. :robot:")
|
|
|
|
#returns a nice weather icon. Sometimes the API uses non-documented icons, so we return something else
|
|
def getWeatherIconTranslation(self, iconKey):
|
|
WEATHER_ICONS = {
|
|
"zonnig" : ":sun_with_face:",
|
|
"bliksem" : ":cloud_lightning:",
|
|
"regen" : ":cloud_rain:",
|
|
"buien" : ":umbrella:",
|
|
"hagel" : ":cloud_snow:",
|
|
"mist" : ":white_large_square:",
|
|
"sneeuw" : ":cloud_snow:",
|
|
"bewolkt" : ":white_sun_cloud:",
|
|
"halfbewolkt" : ":partly_sunny:",
|
|
"halfbewolkt_regen" : ":white_sun_rain_cloud:",
|
|
"zwaarbewolkt" : ":cloud:",
|
|
"nachtmist" : ":ghost:",
|
|
"helderenacht" : ":first_quarter_moon_with_face:",
|
|
"wolkennacht" : ":cloud:"
|
|
}
|
|
try:
|
|
return WEATHER_ICONS[iconKey]
|
|
except KeyError:
|
|
print("WARN Unknown iconKey:", str(iconKey))
|
|
return ":park:"
|
|
|
|
#returns which the current weatheralert code and returns a message
|
|
def getWeerAlarm(self, weatherObj):
|
|
if (weatherObj["alarm"] != "1"):
|
|
return None, ""
|
|
if ("code rood" in weatherObj["alarmtxt"].lower()):
|
|
return "rood", "HOLY SHIT :scream: HET IS :red_circle:CODE ROOD:red_circle:!! " + weatherObj["alarmtxt"] + ". Hide yo kids, hide yo wife!"
|
|
if ("code oranje" in weatherObj["alarmtxt"].lower()):
|
|
return "oranje", "PAS OP! :large_orange_diamond: Code Oranje :large_orange_diamond: is van kracht! <:willy:505886070668263426> " + weatherObj["alarmtxt"]
|
|
return "geel", ":warning: Kennelijk is er een weeralarm: " + weatherObj["alarmtxt"]
|
|
|
|
#determines a BBQ grade based on the current weather
|
|
def getBbqGrade(self, weatherObj):
|
|
grade = 1.0
|
|
try:
|
|
#add up to 4.0 points for sun:
|
|
grade += float(weatherObj["d0zon"]) / 25
|
|
#add up to 5.0 points for temperature:
|
|
grade += min(5.0, float(weatherObj["gtemp"])*float(weatherObj["d0tmax"])/100)
|
|
|
|
#remove up to 5.0 points for rain/snow:
|
|
grade -= float(weatherObj["d0neerslag"]) / 20
|
|
#but since d0neerslag is very unreliable:
|
|
if float(weatherObj["d0neerslag"]) < 10:
|
|
if weatherObj["image"] in ["regen", "buien", "bliksem", "hagel", "sneeuw", "halfbewolkt_regen"]:
|
|
grade -= 2.0
|
|
|
|
#remove points for very hot weather: (above 30)
|
|
grade -= max(0, (float(weatherObj["d0tmax"]) - 30.0)/10 )
|
|
except:
|
|
return -1.0
|
|
|
|
return max(1.0, min(10.0, grade))
|
|
|
|
@commands.command(pass_context=True)
|
|
@asyncio.coroutine
|
|
def ktdm(self, ctx, *args):
|
|
'''Speel Kaarten Tegen De Mensheid! Genereer een kaart of geef zelf opties.
|
|
Bijvoorbeeld: !ktdm <"1"><"2"><"3"> (aanbevolen 1 of 2, max 3)'''
|
|
random.shuffle(self.witte_lijst) # schudden voor gebruik
|
|
zwarte_kaart = random.choice(self.zwarte_lijst).replace("___", "**{}**") # kies en maak het juiste format
|
|
aantal_wit = zwarte_kaart.count("{}") # tel hoeveel witte kaarten er nodig zijn
|
|
if aantal_wit == 0: # Soms staat er geen ___ in de kaart
|
|
zwarte_kaart = zwarte_kaart + " **{}**"
|
|
aantal_wit = 1
|
|
arg_count = len(args)
|
|
if arg_count > 3:
|
|
yield from ctx.channel.send(ctx.author.mention + ", " + random.choice(insult) + ", 3 is het maximum.")
|
|
elif arg_count > 0:
|
|
for elem in args:
|
|
self.witte_lijst.append(elem)
|
|
|
|
if arg_count != 0: # Indien extra args gegeven
|
|
while arg_count != aantal_wit: # Match het aantal args aan het aantal dat nodig is
|
|
zwarte_kaart = random.choice(self.zwarte_lijst).replace("___", "**{}**")
|
|
aantal_wit = zwarte_kaart.count("{}")
|
|
|
|
wit={} # maak dynamisch dict aan met de witte kaarten die ingevuld worden
|
|
for x in range(aantal_wit, 0, -1):
|
|
key = "wit" + str(x)
|
|
wit[key] = self.witte_lijst.pop()
|
|
|
|
# Dit gedeelte print de zwarte kaart mooi af
|
|
if aantal_wit == 1:
|
|
print(zwarte_kaart.format(wit['wit1']))
|
|
yield from ctx.channel.send(ctx.author.mention + "\n" + zwarte_kaart.format(wit['wit1']))
|
|
elif aantal_wit == 2:
|
|
print(zwarte_kaart.format(wit['wit1'],wit['wit2']))
|
|
yield from ctx.channel.send(ctx.author.mention + "\n" + zwarte_kaart.format(wit['wit1'],wit['wit2']))
|
|
elif aantal_wit == 3:
|
|
print(zwarte_kaart.format(wit['wit1'],wit['wit2'],wit['wit3']))
|
|
yield from ctx.channel.send(ctx.author.mention + "\n" + zwarte_kaart.format(wit['wit1'],wit['wit2'],wit['wit3']))
|
|
else:
|
|
print("Dit is een vreemd aantal witte kaarten: " + str(aantal_wit) + "\nDe boosdoener: " + zwarte_kaart)
|
|
yield from ctx.channel.send("Arme " + random.choice(insult) + ", er is iets foutgegaan!")
|
|
yield from ctx.message.delete()
|
|
|
|
@commands.command(pass_context=True)
|
|
@asyncio.coroutine
|
|
def beledig(self, ctx, member:discord.User):
|
|
'''Je vindt iemand stom maar je hebt geen inspiratie? Beledig al je vriendjes met deze handige beledig-i-fier!
|
|
Bijvoorbeeld: !beledig @jemoeder'''
|
|
yield from ctx.channel.send(member.mention+ ", " + ctx.author.mention + " vindt jou een " + random.choice(self.insult) + "! :angry:")
|
|
yield from ctx.message.delete()
|
|
|
|
@commands.command(pass_context=True)
|
|
@asyncio.coroutine
|
|
def watspelenwe(self, ctx):
|
|
"""Stroop weet wat we spelen op vrijdag.
|
|
Geeft elke week een pseudo-random antwoord.
|
|
Geseed op weeknummer + jaar.
|
|
"""
|
|
SASS = [
|
|
"Pathfinder. Nee lmao wie speelt er nu nog pathfinder?",
|
|
"Midfloat. Oh wacht dat is? Oh in Apeldoorn zeg je? Jeetje.",
|
|
"D&D? Denk je dat we mainstream zijn ofzo?",
|
|
"GUR- nee fuck GURPS.",
|
|
"dat ene systeem voor een one-shot waarna we stellen dat het voor herhaling vatbaar is maar volgende keer doen we toch weer een ander systeem.",
|
|
"dat spel over Cuba. Was leuk. Erg naar mijn zin gehad."
|
|
]
|
|
SPELLEN = [
|
|
"DND", "Ars Magica",
|
|
#"5e", "4e",
|
|
#"Pathfinder", "Pathfinder 2",
|
|
"CoC", "Delta Green",
|
|
"een one-shot", "Kaarten tegen de Mensheid",
|
|
#"Midfloat", "Isle of Arden",
|
|
"Cyberpunk 2020", "Star Wars",
|
|
"Blades in the Dark", "Vampire the Masquerade",
|
|
"MAGE the Ascension"
|
|
]
|
|
PLAATSEN = [
|
|
# het is de lockdown-patch
|
|
#"bij Mark thuis", "bij Freek thuis",
|
|
#"bij JP thuis", "bij Erik thuis",
|
|
#"bij Lourens thuis", "in de Vrouwensteeg",
|
|
#"bij Martijn thuis", "bij je moeder thuis",
|
|
#"bij de Privé2000"
|
|
"op Roll-20", "op Roll-20, bij jezelf thuis, het is lockdown immers",
|
|
"op de digitale vrouwensteeg, te weten Roll-20", "op tabletop simulator? Oh maar dit is bizar kut, toch maar weer Roll-20",
|
|
"bij Freek thuis. Echt. Heus"
|
|
]
|
|
AANVANG = [
|
|
"17:00.", "17:30.",
|
|
"18:00.", "wanneer Lourens vrijgelaten wordt door de burgemeester.",
|
|
"nadat de big in de bakfiets is langsgeweest.", "na Lourens' t-break.",
|
|
"als Mark zijn frikadelbroodjes heeft.", "als Guus zijn GPU werkend heeft gekregen"
|
|
"nadat iedereen tot 20:30 het uitgebreid over databases \"bij ons op het werk\" heeft gehad en de DM er een sarcastische opmerking over maakt",
|
|
"wanneer Martijn klaar is met nakijken", "als Mark klaar is met zijn dailies",
|
|
"wanneer iedereen thuis is van zijn werk."
|
|
#"als Martijn aanbelt.",
|
|
#"als iedereen heeft gekookt.",
|
|
#"ongeveer een uur voordat JP's trein gaat.",
|
|
]
|
|
PERSONEN = [
|
|
"Mark", "Lourens", "JP",
|
|
"Freek", "Martijn", "Erik"
|
|
]
|
|
VIDYA = [
|
|
"Factorio.", "Terraria.",
|
|
"Factorio maar dan moet Martijn 5gr wiet inhaleren en Lourens 5mg ritalin slikken en dan kunnen JP en Mark fijn spelen.",
|
|
"Terraria prepare to restart world edition.",
|
|
"Dota 2.", "Minecraft.",
|
|
"Barotrauma.", "Among Us.",
|
|
"Minecraft met mods waardoor Guus niet mee kan doen maar maakt niet uit ik vond mijn huis toch leuker zonder TNT-traps.",
|
|
"Golf with y- oh het werkt niet op Linux? Oh jeetje oh nee, ja wat moeten we? Misschien kunnen we een ander spelletje - ja echt sorry ik weet het ook niet.",
|
|
"dat ene flavour-of-the-week lockdown spel leuk jongens.", "allemaal afzonderlijk Dark Souls omdat we het JP hebben zien spelen en nu begint het toch weer te kriebelen heh? Toch weer een spelletje wat over het algemeen als moeilijk wordt ervaren even opnieuw doen zodat je je goed voelt over jezelf. Oh je doet het voor de achievements? Uhuh ja die heb ik ook. Alsjeblieft JP mag ik je invaden? JP stop niet zo goed zijn in het spel toe.",
|
|
"Elder Scrolls Online."
|
|
#"Monster Hunter.", "Grim Dawn.",
|
|
#"Diablo.", "PoE.",
|
|
#"dat ene spel dat net uit is gekomen in de Humble Bundle waar we na 2 dagen klaar mee zijn precies wanneer Martijn wel tijd heeft mee te spelen."
|
|
]
|
|
|
|
Now = datetime.now()
|
|
week = Now.isocalendar()[1]
|
|
lekkerzaad = week + Now.year
|
|
|
|
if (Now.weekday() == 5) or (Now.weekday() == 6):
|
|
lekkerzaad += 1
|
|
|
|
random.seed(lekkerzaad)
|
|
|
|
if Now.weekday() == 4:
|
|
DAG = "vandaag "
|
|
else:
|
|
DAG = "vrijdag "
|
|
|
|
message = ""
|
|
KEUZEMOGELIJKHEDEN = random.randint(0, 10)
|
|
if KEUZEMOGELIJKHEDEN == 10:
|
|
message = "We spelen " + DAG + random.choice(SASS) + " Nee, we spelen eigenlijk " + random.choice(SPELLEN) + ", aanvang " + random.choice(AANVANG)
|
|
#message = "We gaan " + DAG + "poppetjes verven " + random.choice(PLAATSEN) + ", aanvang " + random.choice(AANVANG)
|
|
elif KEUZEMOGELIJKHEDEN == 9:
|
|
message = random.choice(PERSONEN) + " heeft mogelijk corona en we zijn toch een risicogroep, we spelen " + random.choice(VIDYA)
|
|
#message = random.choice(PERSONEN) + " is ziek, we spelen " + random.choice(VIDYA)
|
|
elif KEUZEMOGELIJKHEDEN == 8:
|
|
message = "We spelen " + DAG + random.choice(SPELLEN) + " " + random.choice(PLAATSEN) + ", aanvang " + random.choice(AANVANG) + " Zelfs Guus doet mee."
|
|
elif KEUZEMOGELIJKHEDEN == 7:
|
|
message = "We spelen " + DAG + random.choice(SPELLEN) + " " + random.choice(PLAATSEN) + ", aanvang " + random.choice(AANVANG) + " Erik blijft zelfs in Apeldoorn."
|
|
#message = "We spelen " + DAG + random.choice(SPELLEN) + " " + random.choice(PLAATSEN) + ", aanvang " + random.choice(AANVANG) + " Erik komt zelfs uit Apeldoorn."
|
|
elif KEUZEMOGELIJKHEDEN == 6:
|
|
message = random.choice(PERSONEN) + " moet overwerken want ze hebben het weer verneukt. Iets met IT. Of parkieten op teams. De rest speelt " + random.choice(VIDYA)
|
|
#message = random.choice(PERSONEN) + " moet overwerken want ze hebben het weer verneukt. Iets met IT. De rest speelt " + random.choice(VIDYA)
|
|
elif KEUZEMOGELIJKHEDEN == 5:
|
|
message = "We spelen " + DAG + random.choice(VIDYA) + " Ja, ik weet het, eigenlijk \"D&D\"-avond maar ja. Wees nou eerlijk heh. Aanvang " + random.choice(AANVANG)
|
|
elif KEUZEMOGELIJKHEDEN > 2:
|
|
message = "We spelen " + DAG + "omwille van de lockdown " + random.choice(VIDYA) + " Aanvang op discord " + random.choice(AANVANG)
|
|
else:
|
|
message = "We spelen " + DAG + random.choice(SPELLEN) + " " + random.choice(PLAATSEN) + ", aanvang " + random.choice(AANVANG)
|
|
|
|
try:
|
|
yield from ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
yield from ctx.channel.send(message)
|
|
|
|
@commands.command(pass_context=True)
|
|
@asyncio.coroutine
|
|
def review(self, ctx, *args):
|
|
"""Stroop heeft (bijna) overal een mening over. Vraag het hem!
|
|
"""
|
|
|
|
topic = " ".join(args)
|
|
|
|
if topic == "":
|
|
random.seed(datetime.now())
|
|
else:
|
|
random.seed(topic.lower().replace(" ", ""))
|
|
|
|
message = ""
|
|
|
|
if topic == "":
|
|
REVIEW_START = [
|
|
"Ik vond 'm", "Ik vind 'm", "Ik vond het", "Ik vind het", "Als je het mij vraagt was ie", "Mijn mening:",
|
|
"Als je het mij vraagt was hij", "Ik ben geen expert, maar ik vond 'm", "Hij was"
|
|
]
|
|
else:
|
|
REVIEW_START = [
|
|
"Ik vond "+topic, "Ik vind "+topic, "Als je het mij vraagt was "+topic, "Als je het mij vraagt is "+topic,
|
|
"Ik ben geen expert, maar ik vond "+topic, topic+" was", topic+" is", topic+" is gewoon", "Mijn mening over "+topic+ ":",
|
|
"Mijn review van "+topic+ ":"
|
|
]
|
|
|
|
SHORT_REVIEW = [
|
|
"goed.", "goed!", "echt goed!", "prima.", "top.", "helemaal toppie!", "ruk.", "middelmatig.",
|
|
"goed te doen.", "belabberd.", "uitstekend!", "uitmuntend.", "een beetje saai.", "supersick, yo.",
|
|
"wel OK.", "ronduit kut.", "indrukwekkend.", "\"bijzonder\".", "raar.", "slecht.", "heel slecht."
|
|
]
|
|
#todo: long review
|
|
EMOJI = [
|
|
":watermelon:", ":middle_finger:", ":poop:", ":banana:", ":eggplant:", ":red_car:", ":gem:",
|
|
":heart:", ":flag_nl: ", ":cow:", ":dolphin:", ":four_leaf_clover:", ":basketball: ", ":thumbsup:"
|
|
]
|
|
|
|
message = random.choice(REVIEW_START) + " "
|
|
message += random.choice(SHORT_REVIEW) + " "
|
|
|
|
pickerScore = random.randint(1, 10)
|
|
if pickerScore < 7:
|
|
rating = random.randint(1, 5)
|
|
message += str(rating) + " ster" + ("" if (rating==1) else "ren") + ". " + ":star:"*rating
|
|
elif pickerScore < 8:
|
|
rating = random.randint(0, 5)
|
|
message += str(rating) + " reet" + ("" if (rating==1) else "en") + ". " + ":peach:"*rating
|
|
else:
|
|
maxRating = random.randint(3, 12)
|
|
rating = random.randint(1, maxRating)
|
|
emoj = random.choice(EMOJI)
|
|
message += str(rating) + " " + emoj*rating + " out of " + str(maxRating) + "."
|
|
|
|
yield from ctx.channel.send(message)
|
|
|
|
|
|
|
|
|
|
|
|
def setup(bot):
|
|
bot.add_cog(Shitpost(bot))
|