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:
- name: test
image: python:3.11
image: python:3.13
environment:
STROOP_DISCORD_TOKEN:
from_secret: STROOP_DISCORD_TOKEN
+57 -2
View File
@@ -5,6 +5,8 @@ import random
import requests
import asyncio
import os
import feedparser
import json
from datetime import datetime
import re
@@ -18,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:
@@ -221,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:
@@ -287,8 +296,8 @@ class Chatbot(commands.Cog):
await message.channel.send(response)
#Gets a response
async def getResponseForMessage(self, wordsToRespondTo):
if random.random() > 0.9:
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)
@@ -473,3 +482,49 @@ class Chatbot(commands.Cog):
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)
+1 -1
View File
@@ -1,4 +1,4 @@
FROM python:3.11
FROM python:3.13
WORKDIR /opt/stroopwafel
+17 -22
View File
@@ -5,7 +5,7 @@ import random
import re
import json, requests
import warnings
from datetime import date, timedelta
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://muzak.hoekveen.net'
self.muzak_url = 'http://muzak.hoekveen.net:8001'
self.r = praw.Reddit(
user_agent='StroopwafelBot',
client_secret=os.getenv("STROOP_REDDIT_SECRET"),
@@ -23,7 +23,7 @@ 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)
@@ -59,19 +59,25 @@ class General(commands.Cog):
def get_kopieerpasta(self):
rkopieerpasta = self.r.subreddit('kopieerpasta')
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))
listing = list(rkopieerpasta.top(time_filter='month', limit=250))
post = random.choice(listing)
return post
except:
return None
@commands.command(pass_context=True)
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
@@ -97,25 +103,15 @@ class General(commands.Cog):
"""HD muzak playlist"""
data = json.loads(self.get_playlist_json().content)
msg = ""
open = date.fromisoformat(data['openDate'])
nom = date.fromisoformat(data['deadlineNominations'])
vote = date.fromisoformat(data['deadlineVoting'])
today = date.today()
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 += "Het stemmen is nog niet geopend voor dit jaar.\n"
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."
msg = "Muwat?"
else:
if open == today:
msg += "Jawel mensen! Vanaf vandaag mag het stemmen beginnen!\n"
msg += f"Stemmen en nomineren kan hier: {self.muzak_url}\n"
msg += f"Stemmen en nomineren kan hier: https://muzak.hoekveen.net/ \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)
@commands.command(pass_context=True)
@@ -125,7 +121,7 @@ class General(commands.Cog):
response = requests.get(poll)
if response:
# 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 = ""
if cijfer < 3:
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)
else:
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):
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]
@@ -24,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',
@@ -40,33 +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)
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
"""
Now = datetime.now()
HdConDate = datetime(2023, 10, 20, 4, 0, 1) #om 4 uur lig je toch wel al op bed?
Distance = HdConDate - Now
Message = Message = "HD Con 2023 is al voorbij. HD Con 2024 zal in 2024 plaatsvinden."
Message = f"Geen HD Con! >:|"
if self.HdConDate:
Message = f"HD Con {self.HdConDate.year} "
Distance = self.HdConDate - Now
if Distance.days == -1:
Message = "HD Con 2023 begint vandaag! HYPE!"
Message += "begint vandaag! HYPE!"
elif Distance.days < 0 and Distance.days > -4:
Message = "HD Con 2023 is nu bezig!!"
Message += "is nu bezig!!"
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:
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..."
Message = f"Nog {NachtjesSlapen} nachtje{'s' if NachtjesSlapen > 1 else ''} slapen..."
#Hou bij hoe vaak dit wordt gevraagd:
eventsMinutesAgo = 0;
@@ -94,14 +98,14 @@ class Shitpost(commands.Cog):
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:
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."
await ctx.channel.send(ctx.author.mention + ' ' + str(Message))
@@ -808,7 +812,10 @@ class Shitpost(commands.Cog):
def get_zaagmans(self):
zaagman_url = "http://iszaagmansallangsgeweest.nl/"
zreq = requests.get(zaagman_url)
headers = {
'User-Agent': self.userAgent,
}
zreq = requests.get(zaagman_url, headers=headers)
if zreq:
return zreq.text.partition("<h1>")[2].partition("</h1>")[0]
else:
+1
View File
@@ -14,3 +14,4 @@ STROOP_IMGFLIP_PASSWORD=
STROOP_RESET_PASSWORD=
STROOP_CHANNEL_SHITPOST=
STROOP_CHANNEL_BELANGRIJK=
STROOP_HDCON_DATE=2025-12-01
+3
View File
@@ -3,3 +3,6 @@ discord.py
praw
numpy
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):
self.skipTest("PRAW Reddit instance failed to create")
post = self.cog.get_kopieerpasta()
if post:
self.assertIsInstance(post.url, str)
def test_huge(self):
embed = self.cog.get_emoji_embed("<:test:123456789>")
self.assertIsInstance(embed, discord.Embed)