834 lines
32 KiB
Python
834 lines
32 KiB
Python
import discord
|
|
from discord.ext import commands
|
|
from urllib import request
|
|
import json, requests
|
|
import math
|
|
from datetime import datetime, timedelta
|
|
import os
|
|
import random
|
|
import caldav
|
|
import warnings
|
|
import re
|
|
|
|
class Shitpost(commands.Cog):
|
|
"""Schijtpaal commando's. Alleen bruikbaar in de daarvoor toegewezen schijtpaal kanalen."""
|
|
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
self.hdConImpatientEvents = []
|
|
self.userAgent = 'Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0'
|
|
try:
|
|
with open('black.txt') as zwart:
|
|
self.zwarte_lijst = [line.rstrip('\n') for line in zwart]
|
|
with open('white.txt') as wit:
|
|
self.witte_lijst = [line.rstrip('\n') for line in wit]
|
|
except:
|
|
self.zwarte_lijst = ["___", "___, ___", "___, ___, ___"]
|
|
self.witte_lijst = ["A", "B", "C"]
|
|
self.insult = ['kankerhomo', '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']
|
|
self.caldav_client = caldav.DAVClient(url=os.getenv('STROOP_CALDAV_HOST'))
|
|
self.imgflips = {
|
|
'tering': '78416340',
|
|
'mark': '112898841',
|
|
'eriku': '93296473',
|
|
'tegeltje': '121572521',
|
|
'zout': '116231806'
|
|
}
|
|
warnings.simplefilter("ignore")
|
|
datestring = os.getenv('STROOP_HDCON_DATE') or None
|
|
self.HdConDate = None
|
|
if datestring:
|
|
self.HdConDate = datetime.fromisoformat(datestring)
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
async def ishetalhdcon(self, ctx):
|
|
"""Hoe lang nog tot Hoestende Draken Con dit jaar? Of is het pas volgend jaar?
|
|
Gebruik: !ishetalhdcon
|
|
"""
|
|
Now = datetime.now()
|
|
Message = f"Geen HD Con! >:|"
|
|
if self.HdConDate:
|
|
Message = f"HD Con {self.HdConDate.year} "
|
|
Distance = self.HdConDate - Now
|
|
if Distance.days == -1:
|
|
Message += "begint vandaag! HYPE!"
|
|
elif Distance.days < 0 and Distance.days > -4:
|
|
Message += "is nu bezig!!"
|
|
elif Distance.days == -4:
|
|
Message += "is vandaag afgelopen :(\nWe hebben gelachen, we hebben gehuild. Het was gezellig. Volgend jaar bij mij."
|
|
else: # distance < -4
|
|
Message += f"is geweest. HD Con {self.HdConDate.year+1} zal komen."
|
|
|
|
if Distance.days < 0:
|
|
await ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
|
return
|
|
|
|
NachtjesSlapen = Distance.days + 1
|
|
Message = f"Nog {NachtjesSlapen} nachtje{'s' if NachtjesSlapen > 1 else ''} 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:
|
|
await ctx.channel.send("...")
|
|
return
|
|
await 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 + min(10, eventsLastDays)*2;
|
|
impatientFactor *= random.random()
|
|
if impatientFactor > 100:
|
|
await ctx.channel.send("Nee!")
|
|
return
|
|
elif impatientFactor > 15 and eventsMinutesAgo > 0:
|
|
Message = "Dat hebben jullie net gevraagd."
|
|
elif impatientFactor > 12:
|
|
Message = "Nee."
|
|
|
|
await ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
|
|
|
def zalgofy(self, sentence, factor = 4):
|
|
random.seed(datetime.now().timestamp())
|
|
message = ''
|
|
#from https://github.com/Aethylia/zalgo-cli:
|
|
for letter in sentence:
|
|
for i in range(factor):
|
|
letter += random.randint(0x300, 0x36f).to_bytes(2, byteorder='big').decode('utf-16be')
|
|
message += letter
|
|
return message
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
async 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"
|
|
"""
|
|
message = self.zalgofy(arg)
|
|
try:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
await ctx.channel.send(str(message))
|
|
|
|
def get_corona_message(self):
|
|
response = requests.get('https://covid.ourworldindata.org/data/latest/owid-covid-latest.json')
|
|
if response:
|
|
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"En het r-getal is {d['reproduction_rate']}!\n\n"
|
|
message += "*Data van https://ourworldindata.org/coronavirus*"
|
|
return message
|
|
return None
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
async def corona(self, ctx):
|
|
try:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
message = self.get_corona_message()
|
|
await ctx.channel.send(ctx.author.mention + ' ' + str(message))
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
async 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!!"
|
|
|
|
await ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
async 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..."
|
|
|
|
await ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
|
|
|
def get_giet_het_oan(self):
|
|
# Alsof we ooit nog een elfstedentocht gaan krijgen.
|
|
return "nee"
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
async def giethetaloan(self, ctx):
|
|
"""Giet het al oan?
|
|
Ja of Nee.. kom op nou.
|
|
"""
|
|
answer = self.get_giet_het_oan()
|
|
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..'
|
|
await ctx.channel.send(ctx.author.mention + ' ' + reactie)
|
|
|
|
def get_inspiration(self):
|
|
inspiration = requests.get(url='http://inspirobot.me/api?generate=true')
|
|
if inspiration:
|
|
return inspiration.text
|
|
return None
|
|
|
|
|
|
@commands.command(pass_context=True, hidden=False)
|
|
async def inspire(self, ctx):
|
|
"""Laat je inspireren
|
|
Bijvoorbeeld:
|
|
!inspire
|
|
"""
|
|
inspo = self.get_inspiration()
|
|
if inspo:
|
|
em = discord.Embed(title='Uw wijze woorden:', type='photo')
|
|
em.set_image(url=inspo)
|
|
try:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
await ctx.channel.send(ctx.author.mention, embed=em)
|
|
else:
|
|
await ctx.channel.send(ctx.author.mention + ' helaas, geen quote gevonden.')
|
|
|
|
def get_imgflip_embed(self, template: str, boven: str, onder: str, extra_options: dict = None):
|
|
params = dict(
|
|
template_id = template,
|
|
username = 'Stroopwafel',
|
|
password = os.getenv("STROOP_IMGFLIP_PASSWORD"),
|
|
text0 = boven,
|
|
text1 = onder
|
|
)
|
|
if extra_options:
|
|
params.update(extra_options)
|
|
resp = requests.get(url='https://api.imgflip.com/caption_image', params=params)
|
|
if resp:
|
|
photourl = resp.json()['data']['url']
|
|
em = discord.Embed(type='photo')
|
|
em.set_image(url=photourl)
|
|
return em
|
|
return None
|
|
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
async def tering(self, ctx, boven: str, onder: str):
|
|
"""Vanavond gaan we helemaal naar de tering
|
|
Bijvoorbeeld:
|
|
!tering \"Vanavond\" \"gaan we helemaal naar de tering\"
|
|
"""
|
|
em = self.get_imgflip_embed(self.imgflips['tering'], boven, onder)
|
|
try:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
if em:
|
|
await ctx.channel.send(ctx.author.mention, embed=em)
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
async def mark(self, ctx, boven: str, onder: str):
|
|
"""Maakt een mark meem.
|
|
Bijvoorbeeld:
|
|
!mark \"je moeder\" \"is een hoer\"
|
|
"""
|
|
em = self.get_imgflip_embed(self.imgflips['mark'], boven, onder)
|
|
try:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
if em:
|
|
await ctx.channel.send(ctx.author.mention, embed=em)
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
async def eriku(self, ctx, boven: str, onder: str):
|
|
"""Maakt een erik meem.
|
|
Bijvoorbeeld:
|
|
!eriku \"je moeder\" \"is een hoer\"
|
|
"""
|
|
em = self.get_imgflip_embed(self.imgflips['eriku'], boven, onder)
|
|
try:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
if em:
|
|
await ctx.channel.send(ctx.author.mention, embed=em)
|
|
|
|
def get_tegeltje(self, tekst, auteur):
|
|
params = {
|
|
'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'
|
|
}
|
|
return self.get_imgflip_embed(self.imgflips['tegeltje'], "", "", params)
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
async def tegeltje(self, ctx, tekst: str, auteur: str=" "):
|
|
"""Maak een mooi tegeltje met volkswijsheid
|
|
Bijvoorbeeld:
|
|
!tegeltje \"Oost west, 420 best\" \"Lourens\"
|
|
"""
|
|
em = self.get_tegeltje(tekst, auteur)
|
|
try:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
if em:
|
|
await ctx.channel.send(ctx.author.mention, embed=em)
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
async def zout(self, ctx, boven: str, onder: str):
|
|
"""Maakt een martijn-zout meem.
|
|
Bijvoorbeeld:
|
|
!zout \"je moeder\" \"is een hoer\"
|
|
"""
|
|
em = self.get_imgflip_embed(self.imgflips['zout'], boven, onder)
|
|
try:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
if em:
|
|
await ctx.channel.send(ctx.author.mention, embed=em)
|
|
|
|
@commands.command(pass_context=True, hidden=True)
|
|
async def nihao(self,ctx):
|
|
await ctx.channel.send("kankerlauw")
|
|
|
|
@commands.command(pass_context=True)
|
|
async 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 = 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:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
if filepath != '':
|
|
await ctx.channel.send(ctx.author.mention + ' Het is nu ' + datetime.now().strftime('%H:%M'), file=discord.File(filepath, 'tijd.png'))
|
|
else:
|
|
await ctx.channel.send(ctx.author.mention + ' Het is nu ' + datetime.now().strftime('%H:%M'))
|
|
|
|
def get_dice_roll(self, nrOfDice, dieType, modifier=None):
|
|
if nrOfDice > 99 or dieType > 9999 or dieType < 2 or (modifier and abs(modifier) > 9999):
|
|
return None
|
|
|
|
# Do the rolling
|
|
random.seed(datetime.now().timestamp())
|
|
total = 0
|
|
rolls = []
|
|
for x in range(0, nrOfDice):
|
|
roll = random.randint(1, dieType)
|
|
total += roll
|
|
rolls.append(roll)
|
|
total += modifier if modifier else 0
|
|
|
|
#Tally results
|
|
modifierText = "%+d" % modifier if modifier else "" # print modifier with sign
|
|
returnText = f"Rolling {nrOfDice}d{dieType}{modifierText}...\n"
|
|
rolls = [f"[**{roll}**]" if dieType >= 10 and (roll == 1 or roll == dieType) else f"[{roll}]" for roll in rolls]
|
|
returnText += "+".join(rolls)
|
|
returnText += modifierText
|
|
if nrOfDice > 1 or modifier: # only show calculation if it makes sense:
|
|
returnText += " = **" + str(total) + "**"
|
|
return returnText
|
|
|
|
def get_dice_parameters(self, dice):
|
|
match = re.match(r"(\d+)d(\d+)(\s*([+-])\s*(\d+))?\s*", dice.lower())
|
|
if not match:
|
|
return None
|
|
numDice = int(match.group(1))
|
|
die = int(match.group(2))
|
|
modifier = None
|
|
|
|
modified = match.group(3)
|
|
if modified:
|
|
modifierType = match.group(4)
|
|
modifier = int(match.group(5))
|
|
if "-" in modifierType:
|
|
modifier = -modifier
|
|
return (numDice, die, modifier)
|
|
|
|
@commands.command(pass_context=True)
|
|
async def roll(self, ctx, *, dice):
|
|
"""Roll een dobbelsteen. Of een paar. Bijvoorbeeld:
|
|
!roll 4d20
|
|
!roll 1d6 + 5
|
|
"""
|
|
(nrOfDice, dieType, modifier) = self.get_dice_parameters(dice)
|
|
message = self.get_dice_roll(nrOfDice, dieType, modifier)
|
|
if message:
|
|
await ctx.channel.send(message)
|
|
else:
|
|
await ctx.channel.send("Die roll vind ik echt een beetje te mal..")
|
|
|
|
def get_weerbericht(self, wData, verbose=None):
|
|
if not wData:
|
|
return None
|
|
message = ""
|
|
# Weather alert:
|
|
alertCode, alertMessage = self.getWeerAlarm(wData)
|
|
if (verbose and alertCode):
|
|
message += alertMessage + "\n\n"
|
|
elif (not verbose and alertCode):
|
|
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["image"] )
|
|
message += " Het is " + wData["temp"] + " graden "
|
|
message += "en het weer is: " + wData["samenv"] + ". "
|
|
message += "De verwachting: " + wData["verw"]
|
|
|
|
if (verbose):
|
|
# Only print tomorrow, the day after and the BBQ grade if verbose is on:
|
|
message += "\n\nMorgen: " + self.getWeatherIconTranslation( wData["d1weer"] )
|
|
message += " " + wData["d1tmin"] + " tot "
|
|
message += wData["d1tmax"] + " graden. "
|
|
if (wData["d1neerslag"] == "0"):
|
|
message += "Geen neerslag. "
|
|
else:
|
|
message += "Kans op neerslag: " + wData["d1neerslag"] + "%. "
|
|
if (int(wData["d1windk"]) > 5):
|
|
message += "Windkracht " + wData["d1windk"] + ". Blow it."
|
|
|
|
message += "\n\nOvermorgen: "+ self.getWeatherIconTranslation( wData["d2weer"] )
|
|
message += " " + wData["d2tmin"] + " tot "
|
|
message += wData["d2tmax"] + " graden. "
|
|
if (wData["d2neerslag"] == "0"):
|
|
message += "Geen neerslag. "
|
|
else:
|
|
message += "Kans op neerslag: " + wData["d2neerslag"] + "%. "
|
|
if (int(wData["d2windk"]) > 5):
|
|
message += "Windkracht " + wData["d2windk"] + ". "
|
|
|
|
bbqGrade = self.getBbqGrade(wData)
|
|
message += "\n\nHet BBQ cijfer voor vandaag is: " + '{0:g}'.format(round(bbqGrade, 1))
|
|
|
|
message += "\n\nOant Moarn!"
|
|
return message
|
|
|
|
|
|
def get_weer_json(self, location=None):
|
|
if not location:
|
|
location = "Leiden"
|
|
url = f"http://weerlive.nl/api/json-data-10min.php?key={os.getenv('STROOP_WEERLIVE')}&locatie={location}"
|
|
response = requests.get(url)
|
|
if response:
|
|
return json.loads(response.content.decode('utf-8'))["liveweer"][0]
|
|
return None
|
|
|
|
@commands.command(pass_context=True)
|
|
async def weer(self, ctx, location="Leiden", verbose=None):
|
|
"""Vertelt je het weer.
|
|
Omdat je te lui bent om naar buiten te kijken.
|
|
Oant Moarn!
|
|
"""
|
|
wData = self.get_weer_json(location)
|
|
if wData:
|
|
message = self.get_weerbericht(wData, verbose)
|
|
if not wData or not message:
|
|
message = "Weer ophalen niet gelukt. Probeer het later nogmaals.."
|
|
await ctx.channel.send(message)
|
|
|
|
#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:
|
|
return ":park:"
|
|
|
|
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))
|
|
|
|
def get_ktdm(self, wit = []):
|
|
if not wit:
|
|
zwarte_kaart = random.choice(self.zwarte_lijst)
|
|
aantal_wit = zwarte_kaart.count("___")
|
|
if aantal_wit == 0: # Soms staat er geen ___ in de kaart
|
|
zwarte_kaart = zwarte_kaart + " ___"
|
|
aantal_wit = 1
|
|
wit = random.sample(self.witte_lijst, k=aantal_wit)
|
|
else:
|
|
if len(wit) > 3:
|
|
return None
|
|
zwarte_kaart = None
|
|
random.shuffle(self.zwarte_lijst)
|
|
for zwart in self.zwarte_lijst:
|
|
if zwart.count("___") == len(wit):
|
|
zwarte_kaart = zwart
|
|
break
|
|
if not zwarte_kaart:
|
|
return None
|
|
|
|
return zwarte_kaart.replace("___", "**{}**").format(*wit)
|
|
|
|
@commands.command(pass_context=True)
|
|
async 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)'''
|
|
try:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
resultaat = self.get_ktdm(args)
|
|
if resultaat:
|
|
await ctx.channel.send(f"{ctx.author.mention}\n{resultaat}")
|
|
else:
|
|
await ctx.channel.send(f"{ctx.author.mention}\nIets ging niet helemaal lekker")
|
|
|
|
@commands.command(pass_context=True)
|
|
async 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'''
|
|
await ctx.channel.send(member.mention+ ", " + ctx.author.mention + " vindt jou een " + random.choice(self.insult) + "! :angry:")
|
|
await ctx.message.delete()
|
|
|
|
def get_watspelenwe_cal(self):
|
|
"""Geeft een paar terug, met de titel en omschrijving van het eerstvolgende event uit de kalender"""
|
|
calendar = self.caldav_client.calendar(url=os.getenv('STROOP_CALDAV_CAL')) # refresh kalender
|
|
|
|
# geen errorchecking hier, de caller doet dat maar gewoon ofzo, yolo
|
|
events = calendar.date_search(
|
|
start=datetime.now(),
|
|
end=datetime.now()+timedelta(days=7),
|
|
expand=True
|
|
)
|
|
return (events[0].vobject_instance.vevent.summary.value, events[0].vobject_instance.vevent.description.value)
|
|
|
|
def get_watspelenwe_sass(self):
|
|
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.",
|
|
"Ars Magica maar ik wil de zaken even op orde hebben. Kunnen we allemaal even covenants doorlezen en de belastingaangifte per speelbaar karakter doen over de periode 1220 tot 1225? Bedankt.",
|
|
"Cyberpunk RED. Ik hoop dat je de afgelopen jaren alle Zondag met Lubach hebt gezien, anders komen de grapjes misschien niet aan.",
|
|
"een systeem waar Lourens impulsief de boeken van heeft gekocht. FYI Mark speelt een wijf met dikke tieten, Guus iemand die goed kan schieten, Martijn een raar soort tovenaar, Freek is de face en JP heeft een leuk idee dat in de praktijk niet zo goed werkt maar we houden toch van die jongen.",
|
|
"een systeem waar Lourens al lang geleden de boeken van heeft gekocht. FYI Mark speelt een recalcitrant kutjong, Guus iemand die goed mensen kan neersteken, Martijn een gothic waifu, Freek heeft een hele grote hamer en JP speelt een karakter met Harrison Ford in de hoofdrol.",
|
|
"een systeem waar Lourens de boeken van online heeft gezet. FYI Mark speelt een dwerg, Guus is er in sessie twee pas bij (speelt ook een dwerg), Martijn iets met een accent en explosieven, Freek speelt Bob de Rooij en JP speelt het enige karakter wat het plot vooruit helpt godzijdank."
|
|
]
|
|
SPELLEN = [
|
|
"DND", "Ars Magica",
|
|
"een one-shot", "Kaarten tegen de Mensheid",
|
|
"Cyberpunk 2020", "Star Wars",
|
|
"Blades in the Dark",
|
|
"Expeditie Acquisitie", "Starfinder"
|
|
]
|
|
PLAATSEN = [
|
|
"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", "Vakantiepark Landal Kasteeldomein de Cauberg"
|
|
]
|
|
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.", "wanneer Martijn de datumprikker heeft ingevuld",
|
|
"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.",
|
|
"na een flinke portie slap gelul.", "nadat Mark tenminste 20 plaatjes in #tiger-girls heeft gepost.",
|
|
"wanneer iedereen thuis is van zijn werk.", "nadat JP met de klantenservice heeft gebeld.",
|
|
"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.",
|
|
"Crusader Kings III.", "Deep Rock Galactic.",
|
|
"Dota 2.", "Minecraft.",
|
|
"Minecraft met mods waardoor Guus niet mee kan doen maar maakt niet uit ik vond mijn huis toch leuker zonder TNT-traps.",
|
|
"Minecraft met een of andere kutmodpack die Martijn gevonden heeft waardoor je de meeste troep niet zo maar kunt craften.",
|
|
"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.",
|
|
"Warcraft 3 met een hamachi-server.", #Martijn poogt onironisch dit idee te pushen
|
|
"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.",
|
|
"Subnautica. Te weten: we kijken hoe Martijn zijn broek volpoept op stream.",
|
|
"SOMA. Lmao knul niemand speelt SOMA. We gaan Minecraft doen en je gaat het maar naar je zin hebben.",
|
|
"een best wel okee spel wat net uit is. Misschien hebben we het nog eens naar ons zin."
|
|
]
|
|
GEBEURTENIS = [
|
|
"is ziek. We spelen",
|
|
"moet overwerken want ze hebben het weer verneukt. Iets met IT. De rest speelt",
|
|
"heeft mogelijk corona en we zijn toch een risicogroep. We spelen",
|
|
"zijn kat is van de trap gekankerd. De rest speelt",
|
|
"heeft best wel hard zijn teen gestoten. De rest doet",
|
|
"is vergeten dat er dan een verjaardag was. De rest speelt",
|
|
"heeft een borrel bij OGD. Ja ik weet het, ik ga ook liever dood. De rest doet"
|
|
]
|
|
EXTRA = [
|
|
" Zelfs Guus doet mee.",
|
|
" Erik komt zelfs uit Apeldoorn.",
|
|
" Erik blijft zelfs in Apeldoorn.",
|
|
" Oh by the by Pawel komt ook en speelt een elfje oid."
|
|
]
|
|
|
|
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)
|
|
elif KEUZEMOGELIJKHEDEN == 9:
|
|
message = random.choice(PERSONEN) + " " + random.choice(GEBEURTENIS) + " " + random.choice(VIDYA)
|
|
elif KEUZEMOGELIJKHEDEN == 8:
|
|
message = "We gaan " + DAG + "poppetjes verven " + random.choice(PLAATSEN) + ", aanvang " + random.choice(AANVANG)
|
|
elif KEUZEMOGELIJKHEDEN == 7:
|
|
message = "We spelen " + DAG + random.choice(SPELLEN) + " " + random.choice(PLAATSEN) + ", aanvang " + random.choice(AANVANG) + random.choice(EXTRA)
|
|
elif KEUZEMOGELIJKHEDEN == 6:
|
|
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)
|
|
else:
|
|
message = "We spelen " + DAG + random.choice(SPELLEN) + " " + random.choice(PLAATSEN) + ", aanvang " + random.choice(AANVANG)
|
|
|
|
return message
|
|
|
|
@commands.command(pass_context=True)
|
|
async def watspelenwe(self, ctx):
|
|
"""Stroop weet wat we spelen op vrijdag.
|
|
Geeft elke week een pseudo-random antwoord.
|
|
Geseed op weeknummer + jaar.
|
|
"""
|
|
message = self.get_watspelenwe_sass()
|
|
|
|
try:
|
|
(activiteit, reden) = self.get_watspelenwe_cal()
|
|
message += f"\nNee, we doen eigenlijk {activiteit} want {reden}"
|
|
except:
|
|
message += ". En wilt iemand even aan Mark vragen of hij de kalender bijhoudt?"
|
|
|
|
try:
|
|
await ctx.message.delete()
|
|
except:
|
|
print("No permission to delete message")
|
|
await ctx.channel.send(message)
|
|
|
|
def get_review_string(self, topic = ""):
|
|
if topic == "":
|
|
random.seed(datetime.now().timestamp())
|
|
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) + "."
|
|
|
|
return message
|
|
|
|
@commands.command(pass_context=True)
|
|
async def review(self, ctx, *args):
|
|
"""Stroop heeft (bijna) overal een mening over. Vraag het hem!
|
|
"""
|
|
topic = " ".join(args)
|
|
message = self.get_review_string(topic)
|
|
await ctx.channel.send(message)
|
|
|
|
def get_zaagmans(self):
|
|
zaagman_url = "http://iszaagmansallangsgeweest.nl/"
|
|
headers = {
|
|
'User-Agent': self.userAgent,
|
|
}
|
|
zreq = requests.get(zaagman_url, headers=headers)
|
|
if zreq:
|
|
return zreq.text.partition("<h1>")[2].partition("</h1>")[0]
|
|
else:
|
|
return None
|
|
|
|
@commands.command(pass_context=True)
|
|
async def zaagmans(self, ctx):
|
|
"""Is zaagmans al langsgeweest? Is de week al doormidden. Wie weet."""
|
|
gezaagd = self.get_zaagmans()
|
|
message = ctx.author.mention + ": "
|
|
if gezaagd:
|
|
message += gezaagd
|
|
else:
|
|
message += "De waarheid over zaagmans is niet te doorgronden."
|
|
await ctx.channel.send(message)
|