Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 99513b16d4 | |||
| cc7a5f2f28 | |||
| c919386fcb | |||
| 9d00b319aa | |||
| 3b9ac14719 | |||
| d6bc6327a2 | |||
| 916a45715b | |||
| 3f5fc17833 | |||
| 29da1d218b | |||
| 07d22768fe | |||
| 392e19f4b3 | |||
| 9852f21ef7 | |||
| 41c2dc17d1 | |||
| d1a699ee46 | |||
| acbe8c6110 | |||
| a53598b2c3 | |||
| be6380d6b8 | |||
| 527164a040 | |||
| f76f7a48c9 | |||
| a2319f0fac | |||
| a4ca645e3e | |||
| acb9df8616 | |||
| 1f848861e3 | |||
| ecc3ae8853 | |||
| e904451037 | |||
| cde205aad7 | |||
| 2e91781fad | |||
| 58ce3a8565 | |||
| cf89809c30 | |||
| 301314bec8 | |||
| a142b299f4 | |||
| a80ac831f0 | |||
| 4f55dd9dd6 | |||
| 2baa32055d | |||
| 08f99b856a | |||
| 23e4a30e14 | |||
| 9e2389b9b0 | |||
| 2d58948e78 | |||
| 1adc2096a0 | |||
| 904f1c48ea | |||
| f8db215b31 | |||
| ad2324d53c | |||
| 1c3318c24c | |||
| 9effd126dd |
+28
-28
@@ -2,34 +2,34 @@ kind: pipeline
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: test
|
||||
image: python:3.10
|
||||
environment:
|
||||
STROOP_DISCORD_TOKEN:
|
||||
from_secret: STROOP_DISCORD_TOKEN
|
||||
STROOP_TWITTER_KEY:
|
||||
from_secret: STROOP_TWITTER_KEY
|
||||
STROOP_TWITTER_SECRET:
|
||||
from_secret: STROOP_TWITTER_SECRET
|
||||
STROOP_REDDIT_ID:
|
||||
from_secret: STROOP_REDDIT_ID
|
||||
STROOP_REDDIT_SECRET:
|
||||
from_secret: STROOP_REDDIT_SECRET
|
||||
STROOP_WEERLIVE:
|
||||
from_secret: STROOP_WEERLIVE
|
||||
STROOP_CALDAV_HOST:
|
||||
from_secret: STROOP_CALDAV_HOST
|
||||
STROOP_CALDAV_CAL:
|
||||
from_secret: STROOP_CALDAV_CAL
|
||||
STROOP_IMGFLIP_PASSWORD:
|
||||
from_secret: STROOP_IMGFLIP_PASSWORD
|
||||
STROOP_RESET_PASSWORD:
|
||||
from_secret: STROOP_RESET_PASSWORD
|
||||
STROOP_CHANNEL_SHITPOST:
|
||||
from_secret: STROOP_CHANNEL_SHITPOST
|
||||
commands:
|
||||
- pip install -r requirements.txt
|
||||
- python -m unittest tests
|
||||
- name: test
|
||||
image: python:3.13
|
||||
environment:
|
||||
STROOP_DISCORD_TOKEN:
|
||||
from_secret: STROOP_DISCORD_TOKEN
|
||||
STROOP_TWITTER_KEY:
|
||||
from_secret: STROOP_TWITTER_KEY
|
||||
STROOP_TWITTER_SECRET:
|
||||
from_secret: STROOP_TWITTER_SECRET
|
||||
STROOP_REDDIT_ID:
|
||||
from_secret: STROOP_REDDIT_ID
|
||||
STROOP_REDDIT_SECRET:
|
||||
from_secret: STROOP_REDDIT_SECRET
|
||||
STROOP_WEERLIVE:
|
||||
from_secret: STROOP_WEERLIVE
|
||||
STROOP_CALDAV_HOST:
|
||||
from_secret: STROOP_CALDAV_HOST
|
||||
STROOP_CALDAV_CAL:
|
||||
from_secret: STROOP_CALDAV_CAL
|
||||
STROOP_IMGFLIP_PASSWORD:
|
||||
from_secret: STROOP_IMGFLIP_PASSWORD
|
||||
STROOP_RESET_PASSWORD:
|
||||
from_secret: STROOP_RESET_PASSWORD
|
||||
STROOP_CHANNEL_SHITPOST:
|
||||
from_secret: STROOP_CHANNEL_SHITPOST
|
||||
commands:
|
||||
- pip install -r requirements.txt
|
||||
- python -m unittest tests
|
||||
trigger:
|
||||
event:
|
||||
exclude:
|
||||
|
||||
+120
-46
@@ -1,8 +1,12 @@
|
||||
import asyncio
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
import numpy as np
|
||||
import random
|
||||
import requests
|
||||
import asyncio
|
||||
import os
|
||||
import feedparser
|
||||
import json
|
||||
from datetime import datetime
|
||||
import re
|
||||
|
||||
@@ -16,6 +20,8 @@ class Chatbot(commands.Cog):
|
||||
self.START_OF_MESSAGE = "<SOM>"
|
||||
self.pmLast = datetime(2018, 1, 1, 1, 1, 1)
|
||||
self.pmCount = 0
|
||||
self.nosLast = datetime(2018, 1, 1, 1, 1, 1)
|
||||
self.nosPosts = []
|
||||
try:
|
||||
np.load('markov_dict.npy', allow_pickle=True)
|
||||
except FileNotFoundError:
|
||||
@@ -28,56 +34,52 @@ class Chatbot(commands.Cog):
|
||||
|
||||
#Do stuff when a message comes in:
|
||||
@self.bot.event
|
||||
@asyncio.coroutine
|
||||
def on_message(message):
|
||||
async def on_message(message):
|
||||
if message.author.bot:
|
||||
return #ignore your own messages, Stroop
|
||||
|
||||
if message.content.strip() == "" or message.content.strip()[0] != '!': #don't respond to a command
|
||||
if message.content.lower() == "nihao":
|
||||
yield from message.channel.send("kankerlauw")
|
||||
await message.channel.send("kankerlauw")
|
||||
return
|
||||
if message.content.lower() == "lol":
|
||||
yield from message.channel.send("laffing aut laut")
|
||||
await message.channel.send("laffing aut laut")
|
||||
return
|
||||
if self.bot.user.mentioned_in(message) and "@everyone" not in message.content:
|
||||
MENTIONED_RESPONSES = [
|
||||
"Hoi",
|
||||
"hmm?",
|
||||
"JA WAT?",
|
||||
"Godve...Godver-fucking-domme! Wie de fuck heeft me zojuist gepingt? Wie de fuck heeft de ballen om mij te pingen?! Als ik jou vind hè, ik ram je helemaal de tyfus in. Ik ga je kapot maken. Welke breincel in jouw hoofd dacht dat het grappig was om mij te pingen? Noem jij dat 'grappig'? Ik zal je godverdomme iets laten zien wat grappig is, ja. Ik neuk je moeder zo hard dat ze van me gaat houden, godverdomme. Dat krijg je er van als je me pingt, vuile teringleijer. Jouw soort mag wat mij betreft uitsterven. Weet je, ik ga je helemaal geen aandacht meer geven. Je mag de tering krijgen, en daar blijft het bij. Kutjong.",
|
||||
self.getResponseForMessage("stroopwafel")
|
||||
self.getResponseForMessageLocal("stroopwafel")
|
||||
]
|
||||
try:
|
||||
MENTIONED_RESPONSES.append("Wat mot je, " + random.choice(self.bot.get_cog("Shitpost").insult) + "?")
|
||||
except:
|
||||
print("ERROR! - Could not import insults")
|
||||
yield from message.channel.send(random.choice(MENTIONED_RESPONSES))
|
||||
await message.channel.send(random.choice(MENTIONED_RESPONSES))
|
||||
return
|
||||
if re.match("^[0-9]+([,.]?[0-9]+)*?$", message.content.strip()) and random.randint(0,9) == 0:
|
||||
yield from message.channel.send("That's Numberwang!") # https://www.youtube.com/watch?v=0obMRztklqU
|
||||
await message.channel.send("That's Numberwang!") # https://www.youtube.com/watch?v=0obMRztklqU
|
||||
return
|
||||
if "DMChannel" in type(message.channel).__name__: #respond to messages in PM channels
|
||||
if (self.isAllowedToLearnFromPm(message)): #avoid spam-learning
|
||||
self.pmCount += 1
|
||||
self.pmLast = datetime.now()
|
||||
yield from self.learnFromMessagesInChannel(message.channel, 1)
|
||||
yield from self.respondToMessage(message)
|
||||
elif message.channel.id == self.bot.hdChannels["belangrijk"]: #don't abuse the "belangrijk" channel
|
||||
pass
|
||||
await self.learnFromMessagesInChannel(message.channel, 1)
|
||||
await self.respondToMessage(message)
|
||||
else:
|
||||
a = random.randint(0,999) # probablity
|
||||
if a < 40:
|
||||
yield from self.learnFromMessagesInChannel(message.channel, 10)
|
||||
await self.learnFromMessagesInChannel(message.channel, 10)
|
||||
if "stroop" in message.content.lower():
|
||||
a = a / 20 # significantly increase the chance of responding if somebody talks about him.
|
||||
if message.channel.id == self.bot.hdChannels["shitpost"] and a < 40: #shitpost channel
|
||||
yield from self.respondToMessage(message)
|
||||
if message.channel.id == os.getenv('STROOP_CHANNEL_SHITPOST') and a < 40: #shitpost channel
|
||||
await self.respondToMessage(message)
|
||||
elif a < 10: #all other channels
|
||||
yield from self.respondToMessage(message)
|
||||
await self.respondToMessage(message)
|
||||
|
||||
#process commands:
|
||||
yield from self.bot.process_commands(message)
|
||||
await self.bot.process_commands(message)
|
||||
|
||||
def __check(self, ctx):
|
||||
return True
|
||||
@@ -183,22 +185,20 @@ class Chatbot(commands.Cog):
|
||||
|
||||
|
||||
@commands.command(pass_context=True, hidden=True)
|
||||
@asyncio.coroutine
|
||||
def trainmarkovchat(self, ctx, channelId=409751773595566081, nrOfMessages=50):
|
||||
async def trainmarkovchat(self, ctx, channelId=409751773595566081, nrOfMessages=50):
|
||||
"""Train that chain, jermaine
|
||||
param channelId: use this channel to train
|
||||
param nrOfMessages: use the x most recent messages
|
||||
"""
|
||||
|
||||
channel=self.bot.get_channel(channelId)
|
||||
yield from self.learnFromMessagesInChannel(channel, nrOfMessages)
|
||||
await self.learnFromMessagesInChannel(channel, nrOfMessages)
|
||||
|
||||
yield from ctx.channel.send("Ik heb weer wat nieuwe woordjes geleerd. :slight_smile:")
|
||||
await ctx.channel.send("Ik heb weer wat nieuwe woordjes geleerd. :slight_smile:")
|
||||
|
||||
|
||||
#Learns from an x number of messages from a certain channel
|
||||
@asyncio.coroutine
|
||||
def learnFromMessagesInChannel(self, channel, nrOfMessages):
|
||||
async def learnFromMessagesInChannel(self, channel, nrOfMessages):
|
||||
|
||||
#Open current chain:
|
||||
wordDict = np.load('markov_dict.npy', allow_pickle=True).item()
|
||||
@@ -207,7 +207,7 @@ class Chatbot(commands.Cog):
|
||||
messageIterator = channel.history(limit=nrOfMessages, before=None, after=None, oldest_first=False, around=None)
|
||||
allMessages = []
|
||||
for i in range(nrOfMessages):
|
||||
msg = yield from anext(messageIterator)
|
||||
msg = await anext(messageIterator)
|
||||
allMessages.append(msg)
|
||||
|
||||
i = 0
|
||||
@@ -225,6 +225,11 @@ class Chatbot(commands.Cog):
|
||||
pass # Dit is een commando. Negeer.
|
||||
elif "```" in messageContent:
|
||||
pass # Daar zit een codeblok in. Negeer.
|
||||
elif "http" in messageContent and "nos" in messageContent:
|
||||
# NOS link
|
||||
nosIds = re.findall(r'\d+', messageContent)
|
||||
if nosIds:
|
||||
self.nosPosts.append(nosIds[0])
|
||||
elif messageContent[0:7] == "http://" or messageContent[0:8] == "https://":
|
||||
pass # Een link. Negeer. TODO: post af en toe een random link die geen repost is
|
||||
else:
|
||||
@@ -248,18 +253,17 @@ class Chatbot(commands.Cog):
|
||||
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def reageer(self, ctx):
|
||||
async def reageer(self, ctx):
|
||||
"""Laat Stroop ergens op reageren.
|
||||
Stroop leert van onze gesprekken. Hij kan zich nu voordoen als een van ons. Soort van.
|
||||
"""
|
||||
|
||||
#Get previous message to respond to
|
||||
messageIterator = ctx.channel.history(limit=3, before=None, after=None, oldest_first=False, around=None)
|
||||
messageToRespondTo = yield from anext(messageIterator) #this will be the !reageer command. skip
|
||||
messageToRespondTo = yield from anext(messageIterator)
|
||||
messageToRespondTo = await anext(messageIterator) #this will be the !reageer command. skip
|
||||
messageToRespondTo = await anext(messageIterator)
|
||||
if messageToRespondTo.content.strip()[0] == '!' or messageToRespondTo.author.bot: #another chance
|
||||
messageToRespondTo = yield from anext(messageIterator) #but it's not a huge problem if he responds to himself
|
||||
messageToRespondTo = await anext(messageIterator) #but it's not a huge problem if he responds to himself
|
||||
if messageToRespondTo.content.strip()[0] == '!':
|
||||
wordsToRespondTo = []
|
||||
else:
|
||||
@@ -268,12 +272,12 @@ class Chatbot(commands.Cog):
|
||||
|
||||
#Delete command
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
pass
|
||||
|
||||
response = self.getResponseForMessage(wordsToRespondTo)
|
||||
yield from ctx.channel.send(response)
|
||||
response = await self.getResponseForMessage(wordsToRespondTo)
|
||||
await ctx.channel.send(response)
|
||||
|
||||
# Calculate probabilities and pick a next word from a word pair dict:
|
||||
# https://stackoverflow.com/questions/835092/python-dictionary-are-keys-and-values-always-the-same-order
|
||||
@@ -285,15 +289,41 @@ class Chatbot(commands.Cog):
|
||||
|
||||
#Respond to a message.
|
||||
#Assumes the message isn't a command
|
||||
@asyncio.coroutine
|
||||
def respondToMessage(self, message):
|
||||
async def respondToMessage(self, message):
|
||||
wordsToRespondTo = message.content.strip().split()
|
||||
|
||||
response = self.getResponseForMessage(wordsToRespondTo)
|
||||
yield from message.channel.send(response)
|
||||
response = await self.getResponseForMessage(wordsToRespondTo)
|
||||
await message.channel.send(response)
|
||||
|
||||
#Gets a response
|
||||
def getResponseForMessage(self, wordsToRespondTo):
|
||||
async def getResponseForMessage(self, wordsToRespondTo, gptChance=0.1):
|
||||
if random.random() < 1-gptChance:
|
||||
try:
|
||||
# GPT request moet echt even in een non-blocking executortje, anders loopt de hele boel vast
|
||||
response = await self.bot.loop.run_in_executor(None,self.getResponseForMessageOnline, wordsToRespondTo)
|
||||
if response:
|
||||
return response # Anders door naar local
|
||||
except:
|
||||
pass # Door naar local call
|
||||
return self.getResponseForMessageLocal(wordsToRespondTo)
|
||||
|
||||
def translateTo(self, language, text):
|
||||
req = requests.post('http://gpt.hoekveen.net/translate', json={"text": text, "source_lang": "auto", "target_lang": language})
|
||||
print(req.json())
|
||||
return req.json()["translations"][0]["text"]
|
||||
|
||||
def getResponseForMessageOnline(self, wordsToRespondTo):
|
||||
prompt = " ".join(wordsToRespondTo)
|
||||
if not prompt:
|
||||
prompt = self.getResponseForMessageLocal([])
|
||||
text = self.translateTo("en", prompt)
|
||||
req = requests.post('http://gpt.hoekveen.net/complete', json={"prompt": text, "max_tokens": 80})
|
||||
print(req.json())
|
||||
respons = req.json()["text"]
|
||||
respons = respons[0:respons.rfind(".")+1] # Alles weg na de laatste punt
|
||||
return self.translateTo("nl", respons)
|
||||
|
||||
def getResponseForMessageLocal(self, wordsToRespondTo):
|
||||
|
||||
MAX_N_WORDS = 100 #Don't use more words than this
|
||||
|
||||
@@ -351,7 +381,7 @@ class Chatbot(commands.Cog):
|
||||
chain[n] = "@jemoeder"
|
||||
|
||||
#print(' '.join(chain))
|
||||
#yield from ctx.channel.send(' '.join(chain))
|
||||
#await ctx.channel.send(' '.join(chain))
|
||||
return ' '.join(chain)
|
||||
|
||||
|
||||
@@ -424,22 +454,20 @@ class Chatbot(commands.Cog):
|
||||
return ' '.join(chain)
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def haiku(self, ctx):
|
||||
async def haiku(self, ctx):
|
||||
"""Stroop is een poëet. Laat hem een Haiku maken.
|
||||
"""
|
||||
|
||||
response = self.getHaiku()
|
||||
yield from ctx.channel.send(response)
|
||||
await ctx.channel.send(response)
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def uitspraak(self, ctx, numPosts=1):
|
||||
async def uitspraak(self, ctx, numPosts=1):
|
||||
"""Random uitspraak uit de hall of fame.
|
||||
Optioneel kan je een nummer meegeven voor meerdere uitspraken
|
||||
0 voor alle uitspraken."""
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
@@ -451,6 +479,52 @@ class Chatbot(commands.Cog):
|
||||
numPosts = len(uitspraken)
|
||||
for i in range(numPosts):
|
||||
message += uitspraken[i]
|
||||
yield from ctx.channel.send(message)
|
||||
await ctx.channel.send(message)
|
||||
except:
|
||||
pass
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def nos(self, ctx, categorie=None):
|
||||
"""Een leuk NOS artikel. Hoef je het zelf niet meer op te zoeken.
|
||||
Mag optioneel een categorie aangeven:
|
||||
algemeen binnenland buitenland politiek economie opmerkelijk koningshuis cultuurenmedia tech """
|
||||
try:
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
pass
|
||||
diff = datetime.now() - self.nosLast
|
||||
self.nosLast = datetime.now()
|
||||
if diff.days <= 0 and diff.seconds <= 300:
|
||||
await ctx.channel.send(f"Kappen nou {ctx.author.mention}")
|
||||
return
|
||||
opties = [
|
||||
"algemeen",
|
||||
"binnenland",
|
||||
"buitenland",
|
||||
"politiek",
|
||||
"economie",
|
||||
"opmerkelijk",
|
||||
"koningshuis",
|
||||
"cultuurenmedia",
|
||||
"tech"
|
||||
]
|
||||
artikel = None
|
||||
tries = 0
|
||||
while artikel is None:
|
||||
tries += 1
|
||||
if not categorie:
|
||||
categorie = random.choice(opties)
|
||||
categorie = categorie.lower()
|
||||
if categorie in opties:
|
||||
artikelen = feedparser.parse("https://feeds.nos.nl/nosnieuws" + categorie).entries
|
||||
artikel = random.choice(artikelen)
|
||||
#print(json.dumps(artikel, indent=4))
|
||||
nosId = re.findall(r'\d+', artikel.id)[0]
|
||||
if nosId not in self.nosPosts:
|
||||
self.nosPosts.append(nosId)
|
||||
response = await self.getResponseForMessage(artikel.title, gptChance=0.5)
|
||||
elif tries > 100:
|
||||
print("Oneindige loop voorkomen. Damn.")
|
||||
else:
|
||||
artikel = None
|
||||
await ctx.channel.send(response + '\n' + artikel.link)
|
||||
|
||||
+8
-10
@@ -197,8 +197,7 @@ class Cryptocoin(commands.Cog):
|
||||
#user functions below
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def coinprice(self, ctx, coinId: str, currencyId: str="USD"):
|
||||
async def coinprice(self, ctx, coinId: str, currencyId: str="USD"):
|
||||
"""Geeft de huidige prijs van de desbetreffende crypto currency
|
||||
Bijv:
|
||||
!coinprice BTC
|
||||
@@ -211,20 +210,19 @@ class Cryptocoin(commands.Cog):
|
||||
currencyId = currencyId.upper()
|
||||
|
||||
if (currencyId not in allowedCurrencies):
|
||||
yield from ctx.channel.send("Valuta " + currencyId + " ken ik niet. :disappointed: ")
|
||||
await ctx.channel.send("Valuta " + currencyId + " ken ik niet. :disappointed: ")
|
||||
return
|
||||
|
||||
price = self.getCoinPrice(coinId, currencyId)
|
||||
|
||||
if (price == -1):
|
||||
yield from ctx.channel.send("Die cryptocoin ken ik niet... :frowning2: ")
|
||||
await ctx.channel.send("Die cryptocoin ken ik niet... :frowning2: ")
|
||||
return
|
||||
|
||||
yield from ctx.channel.send(coinId + " is nu " + str(price) + " " + currencyId + " waard.")
|
||||
await ctx.channel.send(coinId + " is nu " + str(price) + " " + currencyId + " waard.")
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def coinadvice(self, ctx, coinId: str=""):
|
||||
async def coinadvice(self, ctx, coinId: str=""):
|
||||
"""Voor al uw adviezen in monopolygeld
|
||||
Vraag Stroop's mening over een specifieke coin:
|
||||
!coinadvice NLG
|
||||
@@ -237,7 +235,7 @@ class Cryptocoin(commands.Cog):
|
||||
|
||||
#Geen specieke coin? Doe random.
|
||||
if(coinId == ""):
|
||||
yield from ctx.channel.send( self.getRandomCoinAdvice() )
|
||||
await ctx.channel.send( self.getRandomCoinAdvice() )
|
||||
return
|
||||
|
||||
coinId = coinId.upper()
|
||||
@@ -245,7 +243,7 @@ class Cryptocoin(commands.Cog):
|
||||
growPercentage, coinStability, dummy = self.analyseCoin(coinId)
|
||||
|
||||
if (growPercentage == 0 and coinStability == 1.0): #aanname. anders moet je weer een extra call doen.
|
||||
yield from ctx.channel.send("Die cryptocoin ken ik niet... :frowning2: ")
|
||||
await ctx.channel.send("Die cryptocoin ken ik niet... :frowning2: ")
|
||||
return
|
||||
|
||||
time.sleep(0.1) #don't overload the API
|
||||
@@ -302,5 +300,5 @@ class Cryptocoin(commands.Cog):
|
||||
if (coinStability < 0.3):
|
||||
message += "Denk ik?"
|
||||
|
||||
yield from ctx.channel.send(message)
|
||||
await ctx.channel.send(message)
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
FROM python:3.10
|
||||
FROM python:3.13
|
||||
|
||||
WORKDIR /opt/stroopwafel
|
||||
|
||||
|
||||
+59
-28
@@ -1,4 +1,3 @@
|
||||
import asyncio
|
||||
import discord
|
||||
import os
|
||||
import praw
|
||||
@@ -6,6 +5,7 @@ import random
|
||||
import re
|
||||
import json, requests
|
||||
import warnings
|
||||
from datetime import timedelta, datetime, timezone
|
||||
from discord.ext import commands
|
||||
|
||||
class General(commands.Cog):
|
||||
@@ -13,7 +13,7 @@ class General(commands.Cog):
|
||||
|
||||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
self.muzak_url = 'https://hdcon-muzak.herokuapp.com'
|
||||
self.muzak_url = 'http://muzak.hoekveen.net:8001'
|
||||
self.r = praw.Reddit(
|
||||
user_agent='StroopwafelBot',
|
||||
client_secret=os.getenv("STROOP_REDDIT_SECRET"),
|
||||
@@ -23,25 +23,24 @@ class General(commands.Cog):
|
||||
warnings.simplefilter("ignore")
|
||||
|
||||
def get_emoji_embed(self, tag: str):
|
||||
emoji = re.search(".*\<\:([A-z]*)\:(\d*)\>.*", tag)
|
||||
emoji = re.search(r'.*\<\:([A-z]*)\:(\d*)\>.*', tag)
|
||||
embed = discord.Embed(title=emoji.group(1), type='photo')
|
||||
hugemoji = 'https://cdn.discordapp.com/emojis/' + emoji.group(2) + '.png'
|
||||
embed.set_image(url=hugemoji)
|
||||
return embed
|
||||
|
||||
@commands.command()
|
||||
@asyncio.coroutine
|
||||
def huge(self, ctx, *, arg):
|
||||
async def huge(self, ctx, *, arg):
|
||||
"""YUGE. Geeft een grote versie van de gegeven emoji terug. Werkt alleen voor custom emoji.
|
||||
Bijvoorbeeld:
|
||||
!huge :ancilla:
|
||||
"""
|
||||
em = self.get_emoji_embed(arg)
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
||||
await ctx.channel.send(ctx.author.mention, embed=em)
|
||||
|
||||
def get_aww_post(self):
|
||||
raww = self.r.subreddit('aww+catloaf+tuckedinkitties+babyelephantgifs+babybigcatgifs+blep+holdmynip+gingerkitty+cathighfive+catsstandingup+catsareassholes+eyebleach')
|
||||
@@ -49,32 +48,36 @@ class General(commands.Cog):
|
||||
return random.choice(listing)
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def aww(self, ctx):
|
||||
async def aww(self, ctx):
|
||||
""" iets schattigs... """
|
||||
post = self.get_aww_post()
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
yield from ctx.channel.send(ctx.author.mention + ' ' + post.url)
|
||||
await ctx.channel.send(ctx.author.mention + ' ' + post.url)
|
||||
|
||||
def get_kopieerpasta(self):
|
||||
rkopieerpasta = self.r.subreddit('kopieerpasta')
|
||||
post = rkopieerpasta.random()
|
||||
try:
|
||||
post = rkopieerpasta.random()
|
||||
|
||||
# Subreddits kunnen de random functie uitzetten, dus dit is de fallback:
|
||||
if post == None:
|
||||
listing = list(rkopieerpasta.top('month', limit=250))
|
||||
post = random.choice(listing)
|
||||
# Subreddits kunnen de random functie uitzetten, dus dit is de fallback:
|
||||
if post == None:
|
||||
listing = list(rkopieerpasta.top(time_filter='month', limit=250))
|
||||
post = random.choice(listing)
|
||||
|
||||
return post
|
||||
return post
|
||||
except:
|
||||
return None
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def kopieerpasta(self, ctx):
|
||||
async def kopieerpasta(self, ctx):
|
||||
"""Een willekeurige shitpost"""
|
||||
post = self.get_kopieerpasta()
|
||||
if not post:
|
||||
await ctx.channel.send("Geen kopieerpasta voor jou vandaag.")
|
||||
return
|
||||
print(post.url)
|
||||
ATTEMPTS = 10
|
||||
a = 0
|
||||
@@ -83,23 +86,51 @@ class General(commands.Cog):
|
||||
print(post.url)
|
||||
a += 1
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
|
||||
if len(post.selftext + post.title) < 1990:
|
||||
yield from ctx.channel.send('**'+post.title+'**```'+post.selftext+'```')
|
||||
await ctx.channel.send('**'+post.title+'**```'+post.selftext+'```')
|
||||
else:
|
||||
yield from ctx.channel.send("Geen kopieerpasta voor jou vandaag.")
|
||||
await ctx.channel.send("Geen kopieerpasta voor jou vandaag.")
|
||||
|
||||
def get_playlist_json(self):
|
||||
return requests.get(self.muzak_url + '/stroopwafel')
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def playlist(self, ctx):
|
||||
"""HDcon2021 playlist"""
|
||||
async def muzak(self, ctx):
|
||||
"""HD muzak playlist"""
|
||||
data = json.loads(self.get_playlist_json().content)
|
||||
msg = 'Stemmen en nomineren kan hier: {}\n'.format(self.muzak_url)
|
||||
msg += '*Er zijn al {} nummers genomineerd*\n'.format(data['stemCount'])
|
||||
yield from ctx.channel.send(msg)
|
||||
msg = ""
|
||||
open = datetime.fromisoformat(data['openDate'])
|
||||
nom = datetime.fromisoformat(data['deadlineNominations'])
|
||||
vote = datetime.fromisoformat(data['deadlineVoting'])
|
||||
today = datetime.now(tz=timezone(timedelta(hours=2)))
|
||||
if open > today:
|
||||
msg = "Muwat?"
|
||||
else:
|
||||
msg += f"Stemmen en nomineren kan hier: https://muzak.hoekveen.net/ \n"
|
||||
msg += f"*Er zijn al {data['stemCount']} nummers genomineerd!*\n"
|
||||
await ctx.channel.send(msg)
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
async def pollen(self, ctx):
|
||||
"Hoe veel last van pollen kun je verwachten?"
|
||||
poll = 'https://app.everviz.com/embed/apyvera/' # Thanks hooikoortsradar
|
||||
response = requests.get(poll)
|
||||
if response:
|
||||
# one-liner want eet stront
|
||||
cijfer = float(re.findall(r";\d\.?\d?\n", json.loads([x for x in response.text.splitlines() if "var options =" in x][0].partition("=")[2].strip(";, "))["data"]["csv"])[-1].strip(";\n"))
|
||||
msg = ""
|
||||
if cijfer < 3:
|
||||
msg = f"Nou, het lijkt goed te gaan. Recentelijk gaven mensen hun klachten maar een {cijfer}. Lekker!"
|
||||
elif cijfer < 6:
|
||||
msg = f"Het lijkt allemaal mee te vallen. Men gaf hun klachten een {cijfer} deze week. Moet te doen zijn."
|
||||
elif cijfer < 7.5:
|
||||
msg = f"Ai. Het gaat lekker met de pollen, maar het ergste moet nog komen of is al geweest. Klachtencijfer van {cijfer}; Sterkte alvast."
|
||||
else:
|
||||
msg = f"Balen dit. Klachtencijfer van {cijfer}, dus bekijk het maar. Joe."
|
||||
await ctx.channel.send(ctx.author.mention + ' ' + msg)
|
||||
else:
|
||||
await ctx.channel.send(ctx.author.mention + ' Er lijkt even geen klachtencijfer beschikbaar te zijn. Probeer het later nog eens')
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import asyncio
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
from pprint import pprint
|
||||
@@ -25,8 +24,7 @@ class Points(commands.Cog):
|
||||
return True
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def geefpunten(self, ctx, user, points: int):
|
||||
async def geefpunten(self, ctx, user, points: int):
|
||||
"""Wees eens lief. Geef iemand wat punten.
|
||||
Bijvoorbeeld:
|
||||
!geefpunten @ikbenjp 42
|
||||
@@ -37,29 +35,29 @@ class Points(commands.Cog):
|
||||
self.reloadPointsCount()
|
||||
|
||||
if points == 0:
|
||||
yield from ctx.channel.send("0 punten? Gul hoor.")
|
||||
await ctx.channel.send("0 punten? Gul hoor.")
|
||||
return
|
||||
if points < 0:
|
||||
yield from self.sendErrorDm(ctx, "Daar hebben we de !neempunten functie voor. Voor meer info typ: ```!help neempunten```")
|
||||
await self.sendErrorDm(ctx, "Daar hebben we de !neempunten functie voor. Voor meer info typ: ```!help neempunten```")
|
||||
return
|
||||
|
||||
if user[0:2] != "<@":
|
||||
yield from self.sendErrorDm(ctx, "Je moet iemand taggen om punten te geven. :)")
|
||||
await self.sendErrorDm(ctx, "Je moet iemand taggen om punten te geven. :)")
|
||||
#TODO ook userId oid toestaan?
|
||||
return
|
||||
|
||||
userObj = ctx.message.mentions[0]
|
||||
|
||||
if userObj.id == ctx.author.id:
|
||||
yield from ctx.channel.send("Nee. Je mag niet jezelf punten geven.")
|
||||
await ctx.channel.send("Nee. Je mag niet jezelf punten geven.")
|
||||
time.sleep(0.6)
|
||||
yield from ctx.channel.send("Gekkie.")
|
||||
await ctx.channel.send("Gekkie.")
|
||||
return
|
||||
if not self.isUserOnList(userObj):
|
||||
yield from ctx.channel.send("Nee. Die krijgt geen punten.")
|
||||
await ctx.channel.send("Nee. Die krijgt geen punten.")
|
||||
return
|
||||
if self.getUserBalance(ctx.author) < points:
|
||||
yield from ctx.channel.send("Daar heb jij niet genoeg puntjes voor. :bell:")
|
||||
await ctx.channel.send("Daar heb jij niet genoeg puntjes voor. :bell:")
|
||||
return
|
||||
|
||||
# Execute the transaction:
|
||||
@@ -68,7 +66,7 @@ class Points(commands.Cog):
|
||||
self.savePointsCount()
|
||||
|
||||
message = self.getMessageForAwardingPoints(ctx.author.name, userObj.name, points)
|
||||
yield from ctx.channel.send(message)
|
||||
await ctx.channel.send(message)
|
||||
|
||||
def execute_geefpunten(self, giverId, recieverId, points):
|
||||
# First, try to give away (at most 10) bankpoints
|
||||
@@ -86,8 +84,7 @@ class Points(commands.Cog):
|
||||
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def neempunten(self, ctx, user, points: int):
|
||||
async def neempunten(self, ctx, user, points: int):
|
||||
"""Tijd om iemand the shamen. Haal wat punten weg.
|
||||
Bijvoorbeeld:
|
||||
!neempunten @mark 5
|
||||
@@ -98,27 +95,27 @@ class Points(commands.Cog):
|
||||
self.reloadPointsCount()
|
||||
|
||||
if points < 1:
|
||||
yield from ctx.channel.send("Volgens mij snap je het niet.")
|
||||
await ctx.channel.send("Volgens mij snap je het niet.")
|
||||
return
|
||||
if points > 10:
|
||||
yield from self.sendErrorDm(ctx, "Je mag niet meer dan 10 punten afnemen.")
|
||||
await self.sendErrorDm(ctx, "Je mag niet meer dan 10 punten afnemen.")
|
||||
return
|
||||
remainingToTakeAway = self.getUsersRemainingPointsToTakeToday(ctx.author.id)
|
||||
if points > remainingToTakeAway: # The limit per day is 10
|
||||
yield from self.sendErrorDm(ctx, "Je mag vandaag nog maar " + str(remainingToTakeAway) + " punten wegnemen.")
|
||||
await self.sendErrorDm(ctx, "Je mag vandaag nog maar " + str(remainingToTakeAway) + " punten wegnemen.")
|
||||
return
|
||||
|
||||
if user[0:2] != "<@":
|
||||
yield from self.sendErrorDm(ctx, "Je moet iemand taggen. :)")
|
||||
await self.sendErrorDm(ctx, "Je moet iemand taggen. :)")
|
||||
return
|
||||
|
||||
userObj = ctx.message.mentions[0]
|
||||
|
||||
if not self.isUserOnList(userObj):
|
||||
yield from ctx.channel.send("Nee.")
|
||||
await ctx.channel.send("Nee.")
|
||||
return
|
||||
if self.getUserBalance(userObj) < points:
|
||||
yield from ctx.channel.send(userObj.name + " mag niet rood staan.")
|
||||
await ctx.channel.send(userObj.name + " mag niet rood staan.")
|
||||
return
|
||||
|
||||
# Execute the transaction:
|
||||
@@ -127,7 +124,7 @@ class Points(commands.Cog):
|
||||
self.savePointsCount()
|
||||
|
||||
message = self.getMessageForTakingPoints(userObj.name, ctx.author.name, points)
|
||||
yield from ctx.channel.send(message)
|
||||
await ctx.channel.send(message)
|
||||
|
||||
def execute_neempunten(self, takerId, victimId, points):
|
||||
self.increaseUsersPointTakenOnDate(takerId, points)
|
||||
@@ -135,8 +132,7 @@ class Points(commands.Cog):
|
||||
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def puntentelling(self, ctx):
|
||||
async def puntentelling(self, ctx):
|
||||
"""Hoeveel punten heeft iedereen?
|
||||
"""
|
||||
|
||||
@@ -148,18 +144,17 @@ class Points(commands.Cog):
|
||||
if user[0] != self.BANK_ID:
|
||||
message += str(user[1]["points"]).rjust(4) + " " + user[1]["name"] + "\n"
|
||||
message += str(self.pointsCount[self.BANK_ID]["points"]).rjust(4) + " " + self.pointsCount[self.BANK_ID]["name"] + "```"
|
||||
yield from ctx.channel.send(message)
|
||||
await ctx.channel.send(message)
|
||||
|
||||
|
||||
# No public shaming. Send somebody a direct correction message.
|
||||
@asyncio.coroutine
|
||||
def sendErrorDm(self, ctx, message):
|
||||
async def sendErrorDm(self, ctx, message):
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
try:
|
||||
yield from ctx.message.author.send(message)
|
||||
await ctx.message.author.send(message)
|
||||
except:
|
||||
print("No permission to send DM")
|
||||
|
||||
|
||||
+109
-104
@@ -1,4 +1,3 @@
|
||||
import asyncio
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
from urllib import request
|
||||
@@ -17,6 +16,7 @@ class Shitpost(commands.Cog):
|
||||
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]
|
||||
@@ -25,7 +25,7 @@ class Shitpost(commands.Cog):
|
||||
except:
|
||||
self.zwarte_lijst = ["___", "___, ___", "___, ___, ___"]
|
||||
self.witte_lijst = ["A", "B", "C"]
|
||||
self.insult = ['koekenbakker','stumperd','knurft','oelewapper','klungel','stoethaspel',
|
||||
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',
|
||||
@@ -41,34 +41,36 @@ class Shitpost(commands.Cog):
|
||||
'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)
|
||||
@asyncio.coroutine
|
||||
def ishetalhdcon(self, ctx):
|
||||
"""Hoe lang nog tot Hoestende Draken Con 2022?
|
||||
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()
|
||||
HdConDate = datetime(2022, 10, 14, 4, 0, 1) #om 4 uur lig je toch wel al op bed?
|
||||
Distance = HdConDate - Now
|
||||
Message = Message = "HD Con 2022 is al voorbij. HD Con 2023 zal in 2023 plaatsvinden."
|
||||
if Distance.days == -1:
|
||||
Message = "HD Con 2022 begint vandaag! HYPE!"
|
||||
elif Distance.days < 0 and Distance.days > -4:
|
||||
Message = "HD Con 2022 is nu bezig!!"
|
||||
elif Distance.days == -4:
|
||||
Message = "HD Con 2022 is vandaag alweer afgelopen... F"
|
||||
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:
|
||||
yield from ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
||||
return
|
||||
if Distance.days < 0:
|
||||
await ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
||||
return
|
||||
|
||||
NachtjesSlapen = Distance.days + 1
|
||||
if NachtjesSlapen == 1:
|
||||
Message = "Nog " + str(NachtjesSlapen) + " nachtje slapen..."
|
||||
else:
|
||||
Message = "Nog " + str(NachtjesSlapen) + " nachtjes slapen..."
|
||||
NachtjesSlapen = Distance.days + 1
|
||||
Message = f"Nog {NachtjesSlapen} nachtje{'s' if NachtjesSlapen > 1 else ''} slapen..."
|
||||
|
||||
#Hou bij hoe vaak dit wordt gevraagd:
|
||||
eventsMinutesAgo = 0;
|
||||
@@ -90,23 +92,23 @@ class Shitpost(commands.Cog):
|
||||
return #fuck it.
|
||||
if eventsMinutesAgoSameAuthor > 0:
|
||||
if eventsMinutesAgoSameAuthor > 2:
|
||||
yield from ctx.channel.send("...")
|
||||
await ctx.channel.send("...")
|
||||
return
|
||||
yield from ctx.channel.send("Dat vroeg je net ook al, " + ctx.author.mention + "!")
|
||||
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 + eventsLastDays*10;
|
||||
impatientFactor = 10 + eventsMinutesAgo*25 + min(10, eventsLastDays)*2;
|
||||
impatientFactor *= random.random()
|
||||
if impatientFactor > 100:
|
||||
yield from ctx.channel.send("Nee!")
|
||||
await ctx.channel.send("Nee!")
|
||||
return
|
||||
elif impatientFactor > 15 and eventsMinutesAgo > 0:
|
||||
Message = "Dat hebben jullie net gevraagd."
|
||||
elif impatientFactor > 9:
|
||||
elif impatientFactor > 12:
|
||||
Message = "Nee."
|
||||
|
||||
yield from ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
||||
await ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
||||
|
||||
def zalgofy(self, sentence, factor = 4):
|
||||
random.seed(datetime.now().timestamp())
|
||||
@@ -119,8 +121,7 @@ class Shitpost(commands.Cog):
|
||||
return message
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def zalgo(self, ctx, *, arg):
|
||||
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̴̡̯̦͉͙̪̭͕̻̝
|
||||
@@ -130,10 +131,10 @@ class Shitpost(commands.Cog):
|
||||
"""
|
||||
message = self.zalgofy(arg)
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
yield from ctx.channel.send(str(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')
|
||||
@@ -151,18 +152,16 @@ class Shitpost(commands.Cog):
|
||||
return None
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def corona(self, ctx):
|
||||
async def corona(self, ctx):
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
message = self.get_corona_message()
|
||||
yield from ctx.channel.send(ctx.author.mention + ' ' + str(message))
|
||||
await ctx.channel.send(ctx.author.mention + ' ' + str(message))
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def viertwintig(self, ctx):
|
||||
async def viertwintig(self, ctx):
|
||||
"""Hoe lang nog tot 420?
|
||||
Gebruik: !viertwintig
|
||||
"""
|
||||
@@ -188,11 +187,10 @@ class Shitpost(commands.Cog):
|
||||
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))
|
||||
await ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def iselderscrolls6aluit(self, ctx):
|
||||
async def iselderscrolls6aluit(self, ctx):
|
||||
"""Hoe lang nog tot Elder Scrolls 6? 11-11-11? 20-20-20?
|
||||
Gebruik: !iselderscrolls6aluit
|
||||
"""
|
||||
@@ -203,15 +201,14 @@ class Shitpost(commands.Cog):
|
||||
else:
|
||||
Message = "Nee. :frowning2: Nog even geduld..."
|
||||
|
||||
yield from ctx.channel.send(ctx.author.mention + ' ' + str(Message))
|
||||
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)
|
||||
@asyncio.coroutine
|
||||
def giethetaloan(self, ctx):
|
||||
async def giethetaloan(self, ctx):
|
||||
"""Giet het al oan?
|
||||
Ja of Nee.. kom op nou.
|
||||
"""
|
||||
@@ -225,7 +222,7 @@ class Shitpost(commands.Cog):
|
||||
else:
|
||||
if 'nee' in answer:
|
||||
reactie += 'Nee helaas..'
|
||||
yield from ctx.channel.send(ctx.author.mention + ' ' + reactie)
|
||||
await ctx.channel.send(ctx.author.mention + ' ' + reactie)
|
||||
|
||||
def get_inspiration(self):
|
||||
inspiration = requests.get(url='http://inspirobot.me/api?generate=true')
|
||||
@@ -235,8 +232,7 @@ class Shitpost(commands.Cog):
|
||||
|
||||
|
||||
@commands.command(pass_context=True, hidden=False)
|
||||
@asyncio.coroutine
|
||||
def inspire(self, ctx):
|
||||
async def inspire(self, ctx):
|
||||
"""Laat je inspireren
|
||||
Bijvoorbeeld:
|
||||
!inspire
|
||||
@@ -246,12 +242,12 @@ class Shitpost(commands.Cog):
|
||||
em = discord.Embed(title='Uw wijze woorden:', type='photo')
|
||||
em.set_image(url=inspo)
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
||||
await ctx.channel.send(ctx.author.mention, embed=em)
|
||||
else:
|
||||
yield from ctx.channel.send(ctx.author.mention + ' helaas, geen quote gevonden.')
|
||||
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(
|
||||
@@ -273,49 +269,46 @@ class Shitpost(commands.Cog):
|
||||
|
||||
|
||||
@commands.command(pass_context=True, hidden=True)
|
||||
@asyncio.coroutine
|
||||
def tering(self, ctx, boven: str, onder: str):
|
||||
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:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
if em:
|
||||
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
||||
await 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):
|
||||
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:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
if em:
|
||||
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
||||
await 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):
|
||||
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:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
if em:
|
||||
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
||||
await ctx.channel.send(ctx.author.mention, embed=em)
|
||||
|
||||
def get_tegeltje(self, tekst, auteur):
|
||||
params = {
|
||||
@@ -341,43 +334,39 @@ class Shitpost(commands.Cog):
|
||||
return self.get_imgflip_embed(self.imgflips['tegeltje'], "", "", params)
|
||||
|
||||
@commands.command(pass_context=True, hidden=True)
|
||||
@asyncio.coroutine
|
||||
def tegeltje(self, ctx, tekst: str, auteur: str=" "):
|
||||
async def tegeltje(self, ctx, tekst: str, auteur: str=" "):
|
||||
"""Maak een mooi tegeltje met volkswijsheid
|
||||
Bijvoorbeeld:
|
||||
!tegeltje \"Oost west, 420 best\" \"Lourens\"
|
||||
"""
|
||||
em = get_tegeltje(tekst, auteur)
|
||||
em = self.get_tegeltje(tekst, auteur)
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
if em:
|
||||
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
||||
await ctx.channel.send(ctx.author.mention, embed=em)
|
||||
|
||||
@commands.command(pass_context=True, hidden=True)
|
||||
@asyncio.coroutine
|
||||
def zout(self, ctx, boven: str, onder: str):
|
||||
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:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
if em:
|
||||
yield from ctx.channel.send(ctx.author.mention, embed=em)
|
||||
await ctx.channel.send(ctx.author.mention, embed=em)
|
||||
|
||||
@commands.command(pass_context=True, hidden=True)
|
||||
@asyncio.coroutine
|
||||
def nihao(self,ctx):
|
||||
yield from ctx.channel.send("kankerlauw")
|
||||
async def nihao(self,ctx):
|
||||
await ctx.channel.send("kankerlauw")
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def tijd(self, ctx, *args):
|
||||
async def tijd(self, ctx, *args):
|
||||
"""Vertelt je hoe laat het is..
|
||||
Misschien geeft het ook wel een leuke meem terug.
|
||||
Wie weet.
|
||||
@@ -398,20 +387,20 @@ class Shitpost(commands.Cog):
|
||||
elif os.path.isfile(filepng):
|
||||
filepath = filepng
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
if filepath != '':
|
||||
yield from ctx.channel.send(ctx.author.mention + ' Het is nu ' + datetime.now().strftime('%H:%M'), file=discord.File(filepath, 'tijd.png'))
|
||||
await 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'))
|
||||
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())
|
||||
random.seed(datetime.now().timestamp())
|
||||
total = 0
|
||||
rolls = []
|
||||
for x in range(0, nrOfDice):
|
||||
@@ -447,8 +436,7 @@ class Shitpost(commands.Cog):
|
||||
return (numDice, die, modifier)
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def roll(self, ctx, *, dice):
|
||||
async def roll(self, ctx, *, dice):
|
||||
"""Roll een dobbelsteen. Of een paar. Bijvoorbeeld:
|
||||
!roll 4d20
|
||||
!roll 1d6 + 5
|
||||
@@ -456,9 +444,9 @@ class Shitpost(commands.Cog):
|
||||
(nrOfDice, dieType, modifier) = self.get_dice_parameters(dice)
|
||||
message = self.get_dice_roll(nrOfDice, dieType, modifier)
|
||||
if message:
|
||||
yield from ctx.channel.send(message)
|
||||
await ctx.channel.send(message)
|
||||
else:
|
||||
yield from ctx.channel.send("Die roll vind ik echt een beetje te mal..")
|
||||
await ctx.channel.send("Die roll vind ik echt een beetje te mal..")
|
||||
|
||||
def get_weerbericht(self, wData, verbose=None):
|
||||
if not wData:
|
||||
@@ -519,8 +507,7 @@ class Shitpost(commands.Cog):
|
||||
return None
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def weer(self, ctx, location="Leiden", verbose=None):
|
||||
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!
|
||||
@@ -530,7 +517,7 @@ class Shitpost(commands.Cog):
|
||||
message = self.get_weerbericht(wData, verbose)
|
||||
if not wData or not message:
|
||||
message = "Weer ophalen niet gelukt. Probeer het later nogmaals.."
|
||||
yield from ctx.channel.send(message)
|
||||
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):
|
||||
@@ -610,27 +597,25 @@ class Shitpost(commands.Cog):
|
||||
return zwarte_kaart.replace("___", "**{}**").format(*wit)
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def ktdm(self, ctx, *args):
|
||||
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:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
resultaat = self.get_ktdm(args)
|
||||
if resultaat:
|
||||
yield from ctx.channel.send(f"{ctx.author.mention}\n{resultaat}")
|
||||
await ctx.channel.send(f"{ctx.author.mention}\n{resultaat}")
|
||||
else:
|
||||
yield from ctx.channel.send(f"{ctx.author.mention}\nIets ging niet helemaal lekker")
|
||||
await ctx.channel.send(f"{ctx.author.mention}\nIets ging niet helemaal lekker")
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def beledig(self, ctx, member:discord.User):
|
||||
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'''
|
||||
yield from ctx.channel.send(member.mention+ ", " + ctx.author.mention + " vindt jou een " + random.choice(self.insult) + "! :angry:")
|
||||
yield from ctx.message.delete()
|
||||
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"""
|
||||
@@ -749,8 +734,7 @@ class Shitpost(commands.Cog):
|
||||
return message
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def watspelenwe(self, ctx):
|
||||
async def watspelenwe(self, ctx):
|
||||
"""Stroop weet wat we spelen op vrijdag.
|
||||
Geeft elke week een pseudo-random antwoord.
|
||||
Geseed op weeknummer + jaar.
|
||||
@@ -764,10 +748,10 @@ class Shitpost(commands.Cog):
|
||||
message += ". En wilt iemand even aan Mark vragen of hij de kalender bijhoudt?"
|
||||
|
||||
try:
|
||||
yield from ctx.message.delete()
|
||||
await ctx.message.delete()
|
||||
except:
|
||||
print("No permission to delete message")
|
||||
yield from ctx.channel.send(message)
|
||||
await ctx.channel.send(message)
|
||||
|
||||
def get_review_string(self, topic = ""):
|
||||
if topic == "":
|
||||
@@ -819,10 +803,31 @@ class Shitpost(commands.Cog):
|
||||
return message
|
||||
|
||||
@commands.command(pass_context=True)
|
||||
@asyncio.coroutine
|
||||
def review(self, ctx, *args):
|
||||
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)
|
||||
yield from ctx.channel.send(message)
|
||||
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)
|
||||
|
||||
@@ -14,3 +14,4 @@ STROOP_IMGFLIP_PASSWORD=
|
||||
STROOP_RESET_PASSWORD=
|
||||
STROOP_CHANNEL_SHITPOST=
|
||||
STROOP_CHANNEL_BELANGRIJK=
|
||||
STROOP_HDCON_DATE=2025-12-01
|
||||
@@ -3,3 +3,6 @@ discord.py
|
||||
praw
|
||||
numpy
|
||||
python-dotenv
|
||||
feedparser
|
||||
audioop-lts
|
||||
vobject
|
||||
|
||||
+2
-2
@@ -41,9 +41,9 @@ class TestGeneral(unittest.TestCase):
|
||||
if not isinstance(self.cog.r, praw.Reddit):
|
||||
self.skipTest("PRAW Reddit instance failed to create")
|
||||
post = self.cog.get_kopieerpasta()
|
||||
self.assertIsInstance(post.url, str)
|
||||
if post:
|
||||
self.assertIsInstance(post.url, str)
|
||||
|
||||
def test_huge(self):
|
||||
embed = self.cog.get_emoji_embed("<:test:123456789>")
|
||||
self.assertIsInstance(embed, discord.Embed)
|
||||
|
||||
|
||||
+9
-1
@@ -3,6 +3,7 @@ import dotenv
|
||||
import os
|
||||
import discord
|
||||
import requests
|
||||
from datetime import datetime
|
||||
from discord.ext import commands
|
||||
|
||||
import Shitpost
|
||||
@@ -39,7 +40,7 @@ class TestShitpost(unittest.TestCase):
|
||||
def test_watspelenwe_cal(self):
|
||||
data = requests.get(os.getenv('STROOP_CALDAV_CAL'))
|
||||
if not data:
|
||||
self.skipTest(f"Server at {self.cog.muzak_url} has an error, or is unavailable")
|
||||
self.skipTest(f"Server at {os.getenv('STROOP_CALDAV_HOST')} has an error, or is unavailable")
|
||||
|
||||
(activiteit, reden) = self.cog.get_watspelenwe_cal()
|
||||
with self.subTest(msg="Watspelenwe activiteit does not return a string"):
|
||||
@@ -169,3 +170,10 @@ class TestShitpost(unittest.TestCase):
|
||||
message = self.cog.zalgofy(inmsg)
|
||||
self.assertIsInstance(message, str)
|
||||
self.assertEqual(len(message), len(inmsg)*5)
|
||||
|
||||
def test_zaagmans(self):
|
||||
zaag = self.cog.get_zaagmans()
|
||||
if zaag is None:
|
||||
self.skipTest(f"Server at iszaagmansallangsgeweest.nl has an error, or is unavailable")
|
||||
else:
|
||||
self.assertIsInstance(zaag, str)
|
||||
|
||||
Reference in New Issue
Block a user