18 Commits

Author SHA1 Message Date
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
8 changed files with 146 additions and 85 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ 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 -2
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:
@@ -221,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:
@@ -287,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)
@@ -473,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
+17 -22
View File
@@ -5,7 +5,7 @@ import random
import re import re
import json, requests import json, requests
import warnings import warnings
from datetime import date, timedelta from datetime import timedelta, datetime, timezone
from discord.ext import commands from discord.ext import commands
class General(commands.Cog): class General(commands.Cog):
@@ -13,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://muzak.hoekveen.net' 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"),
@@ -23,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)
@@ -59,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
@@ -97,25 +103,15 @@ class General(commands.Cog):
"""HD muzak playlist""" """HD muzak playlist"""
data = json.loads(self.get_playlist_json().content) data = json.loads(self.get_playlist_json().content)
msg = "" msg = ""
open = date.fromisoformat(data['openDate']) open = datetime.fromisoformat(data['openDate'])
nom = date.fromisoformat(data['deadlineNominations']) nom = datetime.fromisoformat(data['deadlineNominations'])
vote = date.fromisoformat(data['deadlineVoting']) vote = datetime.fromisoformat(data['deadlineVoting'])
today = date.today() today = datetime.now(tz=timezone(timedelta(hours=2)))
if open > today: if open > today:
msg += "Het stemmen is nog niet geopend voor dit jaar.\n" msg = "Muwat?"
msg += f"Nog even geduld; Vanaf {open} is de muzak open en kun je naar hartelust stemmen en nomineren.\n"
elif today > nom and today > vote and (today - vote) < timedelta(days=8):
msg += "Het nomineren en stemmen is alweer voorbij.\n"
msg += "Je zult nog even geduld moeten hebben tot de lijst klaar is.\n"
elif today > nom and today > vote:
msg += "De lijst is al helemaal klaar. Goed gedaan jongens. Applausje voor jezelf."
else: else:
if open == today: msg += f"Stemmen en nomineren kan hier: https://muzak.hoekveen.net/ \n"
msg += "Jawel mensen! Vanaf vandaag mag het stemmen beginnen!\n"
msg += f"Stemmen en nomineren kan hier: {self.muzak_url}\n"
msg += f"*Er zijn al {data['stemCount']} nummers genomineerd!*\n" msg += f"*Er zijn al {data['stemCount']} nummers genomineerd!*\n"
msg += f"Nomineren kan tot {nom}, stemmen kan tot {vote}.\n"
msg += "\nIk hoop dat jullie allemaal je beste nummers insturen!"
await ctx.channel.send(msg) await ctx.channel.send(msg)
@commands.command(pass_context=True) @commands.command(pass_context=True)
@@ -125,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!"
@@ -138,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')
+23 -16
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]
@@ -24,7 +25,7 @@ class Shitpost(commands.Cog):
except: except:
self.zwarte_lijst = ["___", "___, ___", "___, ___, ___"] self.zwarte_lijst = ["___", "___, ___", "___, ___, ___"]
self.witte_lijst = ["A", "B", "C"] 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', 'onnozelaar','beunhaas','uilskuiken','bamibal','zwakzinnige','oenemeloen',
'klaphark','rompeknonker','bal gehakt','ongewassen vlerk','droeftoeter','omgedraaid pak hagelslag', 'klaphark','rompeknonker','bal gehakt','ongewassen vlerk','droeftoeter','omgedraaid pak hagelslag',
'prutser','domkop','non-valeur','ontzettende debiel','paljas','simpeltje', 'prutser','domkop','non-valeur','ontzettende debiel','paljas','simpeltje',
@@ -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 2023? """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(2023, 10, 20, 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 2023 is al voorbij. HD Con 2024 zal in 2024 plaatsvinden." Message = f"HD Con {self.HdConDate.year} "
Distance = self.HdConDate - Now
if Distance.days == -1: if Distance.days == -1:
Message = "HD Con 2023 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 2023 is nu bezig!!" Message += "is nu bezig!!"
elif Distance.days == -4: elif Distance.days == -4:
Message = "HD Con 2023 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)