26 Commits

Author SHA1 Message Date
mark b3efbaa291 Merge pull request 'beleefdheid' (#36) from beleefd into master
continuous-integration/drone/push Build is failing
Reviewed-on: #36
2026-08-03 21:49:26 +02:00
mark 896bc3afd7 belefd
continuous-integration/drone/push Build is failing
2026-08-03 21:49:18 +02:00
mark 99513b16d4 Merge pull request 'De grote kankerhomo update' (#35) from kankerhomo into master
continuous-integration/drone/push Build is failing
Reviewed-on: #35
2026-08-03 21:43:16 +02:00
mark cc7a5f2f28 adds kankerhomo to insult
continuous-integration/drone/push Build is failing
2026-08-03 21:39:20 +02:00
mark c919386fcb muzak
continuous-integration/drone/push Build is failing
2025-08-12 09:56:23 +02:00
mark 9d00b319aa update drone config to 3.13
continuous-integration/drone/push Build is passing
2025-07-13 15:25:09 +02:00
mark 3b9ac14719 fixt hopelijk build issues
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is failing
maar garanties heb je alleen in de hemel. ofzo.
2025-07-13 15:22:42 +02:00
jp d6bc6327a2 iets minder sass in ishetalhdcon
continuous-integration/drone Build is failing
2025-07-13 14:10:43 +02:00
mark 916a45715b adds audioop requirement 2025-04-10 11:03:50 +02:00
mark 3f5fc17833 adds useragent to zaagmans request 2025-04-10 11:03:18 +02:00
mark 29da1d218b fixes muzak date nachtjes slapen
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is failing
hopelijk. wie weet. lmao @ testen
2024-08-02 23:45:10 +02:00
mark 07d22768fe hdcon date fix
continuous-integration/drone/push Build is passing
2024-07-27 10:30:00 +02:00
mark 392e19f4b3 Datetime support and updates for muzak endpoint
continuous-integration/drone/push Build is passing
Now supports ISO date. Hardcoded at UTC+2.
2024-07-26 13:34:02 +02:00
mark 9852f21ef7 Merge branch 'master' of git.hoekveen.net:mark/stroopwafel 2024-02-29 12:27:55 +01:00
mark 41c2dc17d1 Fixes pollen
Welke klapmongool heeft dat parsen in een one-liner gedaan? Man man man.
2024-02-29 12:26:35 +01:00
mark d1a699ee46 vijf minuten NOS timer
continuous-integration/drone/push Build is passing
2023-12-08 20:43:13 +01:00
mark acbe8c6110 adds feedparser to requirements
continuous-integration/drone Build is passing
2023-12-07 09:27:37 +01:00
mark a53598b2c3 Voorkomt nos reposts. fixes #28 2023-12-06 21:51:59 +01:00
mark be6380d6b8 nos 2023-12-03 12:45:08 +01:00
mark 527164a040 nachtjes slapen en url
continuous-integration/drone/push Build is passing
2023-08-16 16:56:40 +02:00
mark f76f7a48c9 Merge pull request 'Nieuw muzak eindpunt.' (#27) from muzak into master
continuous-integration/drone/push Build is passing
Reviewed-on: #27
2023-08-16 16:08:13 +02:00
mark a2319f0fac oeps 2023-08-16 14:54:35 +02:00
mark a4ca645e3e nieuw muzak eindpunt 2023-08-16 14:53:10 +02:00
mark acb9df8616 hdcon2023 bitchesss 2023-08-02 14:25:40 +02:00
mark 1f848861e3 stroop scheldt je niet meer uit als je hem pingt.
want het was eigenlijk al een aardige tijd niet echt heel grappig meer.
2023-07-26 20:02:10 +02:00
jp ecc3ae8853 Merge pull request 'updates crypto module with newer async code' (#25) from crypto-update into master
continuous-integration/drone/push Build is passing
Reviewed-on: #25
2023-06-25 21:24:51 +02:00
8 changed files with 151 additions and 72 deletions
+2 -2
View File
@@ -2,8 +2,8 @@ kind: pipeline
name: default name: default
steps: steps:
- name: test - name: test
image: python:3.11 image: python:3.13
environment: environment:
STROOP_DISCORD_TOKEN: STROOP_DISCORD_TOKEN:
from_secret: STROOP_DISCORD_TOKEN from_secret: STROOP_DISCORD_TOKEN
+57 -3
View File
@@ -5,6 +5,8 @@ import random
import requests import requests
import asyncio import asyncio
import os import os
import feedparser
import json
from datetime import datetime from datetime import datetime
import re import re
@@ -18,6 +20,8 @@ class Chatbot(commands.Cog):
self.START_OF_MESSAGE = "<SOM>" self.START_OF_MESSAGE = "<SOM>"
self.pmLast = datetime(2018, 1, 1, 1, 1, 1) self.pmLast = datetime(2018, 1, 1, 1, 1, 1)
self.pmCount = 0 self.pmCount = 0
self.nosLast = datetime(2018, 1, 1, 1, 1, 1)
self.nosPosts = []
try: try:
np.load('markov_dict.npy', allow_pickle=True) np.load('markov_dict.npy', allow_pickle=True)
except FileNotFoundError: except FileNotFoundError:
@@ -46,7 +50,6 @@ class Chatbot(commands.Cog):
"Hoi", "Hoi",
"hmm?", "hmm?",
"JA WAT?", "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.getResponseForMessageLocal("stroopwafel") self.getResponseForMessageLocal("stroopwafel")
] ]
try: try:
@@ -222,6 +225,11 @@ class Chatbot(commands.Cog):
pass # Dit is een commando. Negeer. pass # Dit is een commando. Negeer.
elif "```" in messageContent: elif "```" in messageContent:
pass # Daar zit een codeblok in. Negeer. 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://": 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 pass # Een link. Negeer. TODO: post af en toe een random link die geen repost is
else: else:
@@ -288,8 +296,8 @@ class Chatbot(commands.Cog):
await message.channel.send(response) await message.channel.send(response)
#Gets a response #Gets a response
async def getResponseForMessage(self, wordsToRespondTo): async def getResponseForMessage(self, wordsToRespondTo, gptChance=0.1):
if random.random() > 0.9: if random.random() < 1-gptChance:
try: try:
# GPT request moet echt even in een non-blocking executortje, anders loopt de hele boel vast # 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) response = await self.bot.loop.run_in_executor(None,self.getResponseForMessageOnline, wordsToRespondTo)
@@ -474,3 +482,49 @@ class Chatbot(commands.Cog):
await ctx.channel.send(message) await ctx.channel.send(message)
except: except:
pass 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)
+1 -1
View File
@@ -1,4 +1,4 @@
FROM python:3.11 FROM python:3.13
WORKDIR /opt/stroopwafel WORKDIR /opt/stroopwafel
+23 -9
View File
@@ -5,6 +5,7 @@ import random
import re import re
import json, requests import json, requests
import warnings import warnings
from datetime import timedelta, datetime, timezone
from discord.ext import commands from discord.ext import commands
class General(commands.Cog): class General(commands.Cog):
@@ -12,7 +13,7 @@ class General(commands.Cog):
def __init__(self, bot): def __init__(self, bot):
self.bot = bot self.bot = bot
self.muzak_url = 'https://hdcon-muzak.herokuapp.com' self.muzak_url = 'http://muzak.hoekveen.net:8001'
self.r = praw.Reddit( self.r = praw.Reddit(
user_agent='StroopwafelBot', user_agent='StroopwafelBot',
client_secret=os.getenv("STROOP_REDDIT_SECRET"), client_secret=os.getenv("STROOP_REDDIT_SECRET"),
@@ -22,7 +23,7 @@ class General(commands.Cog):
warnings.simplefilter("ignore") warnings.simplefilter("ignore")
def get_emoji_embed(self, tag: str): 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') embed = discord.Embed(title=emoji.group(1), type='photo')
hugemoji = 'https://cdn.discordapp.com/emojis/' + emoji.group(2) + '.png' hugemoji = 'https://cdn.discordapp.com/emojis/' + emoji.group(2) + '.png'
embed.set_image(url=hugemoji) embed.set_image(url=hugemoji)
@@ -58,19 +59,25 @@ class General(commands.Cog):
def get_kopieerpasta(self): def get_kopieerpasta(self):
rkopieerpasta = self.r.subreddit('kopieerpasta') rkopieerpasta = self.r.subreddit('kopieerpasta')
try:
post = rkopieerpasta.random() post = rkopieerpasta.random()
# Subreddits kunnen de random functie uitzetten, dus dit is de fallback: # Subreddits kunnen de random functie uitzetten, dus dit is de fallback:
if post == None: if post == None:
listing = list(rkopieerpasta.top('month', limit=250)) listing = list(rkopieerpasta.top(time_filter='month', limit=250))
post = random.choice(listing) post = random.choice(listing)
return post return post
except:
return None
@commands.command(pass_context=True) @commands.command(pass_context=True)
async def kopieerpasta(self, ctx): async def kopieerpasta(self, ctx):
"""Een willekeurige shitpost""" """Een willekeurige shitpost"""
post = self.get_kopieerpasta() post = self.get_kopieerpasta()
if not post:
await ctx.channel.send("Geen kopieerpasta voor jou vandaag.")
return
print(post.url) print(post.url)
ATTEMPTS = 10 ATTEMPTS = 10
a = 0 a = 0
@@ -92,11 +99,19 @@ class General(commands.Cog):
return requests.get(self.muzak_url + '/stroopwafel') return requests.get(self.muzak_url + '/stroopwafel')
@commands.command(pass_context=True) @commands.command(pass_context=True)
async def playlist(self, ctx): async def muzak(self, ctx):
"""HDcon2021 playlist""" """HD muzak playlist"""
data = json.loads(self.get_playlist_json().content) data = json.loads(self.get_playlist_json().content)
msg = 'Stemmen en nomineren kan hier: {}\n'.format(self.muzak_url) msg = ""
msg += '*Er zijn al {} nummers genomineerd*\n'.format(data['stemCount']) 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) await ctx.channel.send(msg)
@commands.command(pass_context=True) @commands.command(pass_context=True)
@@ -106,7 +121,7 @@ class General(commands.Cog):
response = requests.get(poll) response = requests.get(poll)
if response: if response:
# one-liner want eet stront # one-liner want eet stront
cijfer = float(re.findall(r";\d\.?\d?;", json.loads([x for x in response.text.splitlines() if "var options =" in x][0].partition("=")[2].strip(";, "))["data"]["csv"])[-1].strip(";")) 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 = "" msg = ""
if cijfer < 3: if cijfer < 3:
msg = f"Nou, het lijkt goed te gaan. Recentelijk gaven mensen hun klachten maar een {cijfer}. Lekker!" msg = f"Nou, het lijkt goed te gaan. Recentelijk gaven mensen hun klachten maar een {cijfer}. Lekker!"
@@ -119,4 +134,3 @@ class General(commands.Cog):
await ctx.channel.send(ctx.author.mention + ' ' + msg) await ctx.channel.send(ctx.author.mention + ' ' + msg)
else: else:
await ctx.channel.send(ctx.author.mention + ' Er lijkt even geen klachtencijfer beschikbaar te zijn. Probeer het later nog eens') await ctx.channel.send(ctx.author.mention + ' Er lijkt even geen klachtencijfer beschikbaar te zijn. Probeer het later nog eens')
+22 -15
View File
@@ -16,6 +16,7 @@ class Shitpost(commands.Cog):
def __init__(self, bot): def __init__(self, bot):
self.bot = bot self.bot = bot
self.hdConImpatientEvents = [] self.hdConImpatientEvents = []
self.userAgent = 'Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0'
try: try:
with open('black.txt') as zwart: with open('black.txt') as zwart:
self.zwarte_lijst = [line.rstrip('\n') for line in zwart] self.zwarte_lijst = [line.rstrip('\n') for line in zwart]
@@ -40,33 +41,36 @@ class Shitpost(commands.Cog):
'zout': '116231806' 'zout': '116231806'
} }
warnings.simplefilter("ignore") 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) @commands.command(pass_context=True, hidden=False)
async def ishetalhdcon(self, ctx): async def ishetalhdcon(self, ctx):
"""Hoe lang nog tot Hoestende Draken Con 2022? """Hoe lang nog tot Hoestende Draken Con dit jaar? Of is het pas volgend jaar?
Gebruik: !ishetalhdcon Gebruik: !ishetalhdcon
""" """
Now = datetime.now() Now = datetime.now()
HdConDate = datetime(2022, 10, 14, 4, 0, 1) #om 4 uur lig je toch wel al op bed? Message = f"Geen HD Con! >:|"
Distance = HdConDate - Now if self.HdConDate:
Message = Message = "HD Con 2022 is al voorbij. HD Con 2023 zal in 2023 plaatsvinden." Message = f"HD Con {self.HdConDate.year} "
Distance = self.HdConDate - Now
if Distance.days == -1: if Distance.days == -1:
Message = "HD Con 2022 begint vandaag! HYPE!" Message += "begint vandaag! HYPE!"
elif Distance.days < 0 and Distance.days > -4: elif Distance.days < 0 and Distance.days > -4:
Message = "HD Con 2022 is nu bezig!!" Message += "is nu bezig!!"
elif Distance.days == -4: elif Distance.days == -4:
Message = "HD Con 2022 is vandaag alweer afgelopen... F" 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: if Distance.days < 0:
await ctx.channel.send(ctx.author.mention + ' ' + str(Message)) await ctx.channel.send(ctx.author.mention + ' ' + str(Message))
return return
NachtjesSlapen = Distance.days + 1 NachtjesSlapen = Distance.days + 1
if NachtjesSlapen == 1: Message = f"Nog {NachtjesSlapen} nachtje{'s' if NachtjesSlapen > 1 else ''} slapen..."
Message = "Nog " + str(NachtjesSlapen) + " nachtje slapen..."
else:
Message = "Nog " + str(NachtjesSlapen) + " nachtjes slapen..."
#Hou bij hoe vaak dit wordt gevraagd: #Hou bij hoe vaak dit wordt gevraagd:
eventsMinutesAgo = 0; eventsMinutesAgo = 0;
@@ -94,14 +98,14 @@ class Shitpost(commands.Cog):
return return
#Hoe vaker er wordt gevraagd, hoe ongeduldiger de antwoorden: #Hoe vaker er wordt gevraagd, hoe ongeduldiger de antwoorden:
if not "DMChannel" in type(ctx.channel).__name__: #ignore personal chats 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() impatientFactor *= random.random()
if impatientFactor > 100: if impatientFactor > 100:
await ctx.channel.send("Nee!") await ctx.channel.send("Nee!")
return return
elif impatientFactor > 15 and eventsMinutesAgo > 0: elif impatientFactor > 15 and eventsMinutesAgo > 0:
Message = "Dat hebben jullie net gevraagd." Message = "Dat hebben jullie net gevraagd."
elif impatientFactor > 9: elif impatientFactor > 12:
Message = "Nee." Message = "Nee."
await ctx.channel.send(ctx.author.mention + ' ' + str(Message)) await ctx.channel.send(ctx.author.mention + ' ' + str(Message))
@@ -808,7 +812,10 @@ class Shitpost(commands.Cog):
def get_zaagmans(self): def get_zaagmans(self):
zaagman_url = "http://iszaagmansallangsgeweest.nl/" zaagman_url = "http://iszaagmansallangsgeweest.nl/"
zreq = requests.get(zaagman_url) headers = {
'User-Agent': self.userAgent,
}
zreq = requests.get(zaagman_url, headers=headers)
if zreq: if zreq:
return zreq.text.partition("<h1>")[2].partition("</h1>")[0] return zreq.text.partition("<h1>")[2].partition("</h1>")[0]
else: else:
+1
View File
@@ -14,3 +14,4 @@ STROOP_IMGFLIP_PASSWORD=
STROOP_RESET_PASSWORD= STROOP_RESET_PASSWORD=
STROOP_CHANNEL_SHITPOST= STROOP_CHANNEL_SHITPOST=
STROOP_CHANNEL_BELANGRIJK= STROOP_CHANNEL_BELANGRIJK=
STROOP_HDCON_DATE=2025-12-01
+3
View File
@@ -3,3 +3,6 @@ discord.py
praw praw
numpy numpy
python-dotenv python-dotenv
feedparser
audioop-lts
vobject
+1 -1
View File
@@ -41,9 +41,9 @@ class TestGeneral(unittest.TestCase):
if not isinstance(self.cog.r, praw.Reddit): if not isinstance(self.cog.r, praw.Reddit):
self.skipTest("PRAW Reddit instance failed to create") self.skipTest("PRAW Reddit instance failed to create")
post = self.cog.get_kopieerpasta() post = self.cog.get_kopieerpasta()
if post:
self.assertIsInstance(post.url, str) self.assertIsInstance(post.url, str)
def test_huge(self): def test_huge(self):
embed = self.cog.get_emoji_embed("<:test:123456789>") embed = self.cog.get_emoji_embed("<:test:123456789>")
self.assertIsInstance(embed, discord.Embed) self.assertIsInstance(embed, discord.Embed)