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(2020, 10, 2, 4, 0, 1) #om 4 uur lig je toch wel al op bed? Distance = HdConDate - Now Message = Message = "HD Con 2020 is al voorbij. HD Con 2021 zal in 2021 plaatsvinden." #init if Distance.days < 0: if Now.month == 10: if Now.day == 2: Message = "HD Con 2020 begint vandaag! HYPE!" elif Now.day == 3 or Now.day == 4: Message = "HD Con 2020 is nu bezig!!" elif Now.day == 5: Message = "HD Con 2020 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 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://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 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 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' if os.path.isfile(filejpg): filepath = filejpg 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 = "http://weerlive.nl/api/json-10min.php?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. """ SPELLEN = [ "DND", "Ars Magica", "5e", "4e", "Pathfinder", "Pathfinder 2", "CoC", "Delta Green", "een one-shot", "Kaarten tegen de Mensheid", "Midfloat", "Isle of Arden", "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", "Cyberpunk 2020" ] 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", "op ROLL20", "bij de Privé2000" ] AANVANG = [ "17:00.", "17:30.", "18:00.", "als Martijn aanbelt.", "nadat de big in de bakfiets is langsgeweest.", "na Lourens' t-break.", "als iedereen heeft gekookt.", "als Mark zijn frikadelbroodjes heeft.", "ongeveer een uur voordat JP's trein gaat.", "wanneer Lourens vrijgelaten wordt door de burgemeester." ] PERSONEN = [ "Mark", "Lourens", "JP", "Freek", "Martijn", "Erik" ] VIDYA = [ "Monster Hunter.", "Grim Dawn.", "Diablo.", "PoE.", "Dota 2.", "Minecraft", "Factorio", "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 gaan " + DAG + "poppetjes verven " + random.choice(PLAATSEN) + ", aanvang " + random.choice(AANVANG) elif KEUZEMOGELIJKHEDEN == 9: 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 komt zelfs uit Apeldoorn." elif KEUZEMOGELIJKHEDEN == 6: message = random.choice(PERSONEN) + " moet overwerken want ze hebben het weer verneukt. Iets met IT. De rest speelt " + random.choice(VIDYA) 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))