25 Commits

Author SHA1 Message Date
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
+28 -28
View File
@@ -2,34 +2,34 @@ kind: pipeline
name: default
steps:
- name: test
image: python:3.11
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:
+57 -3
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:
@@ -46,7 +50,6 @@ class Chatbot(commands.Cog):
"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.getResponseForMessageLocal("stroopwafel")
]
try:
@@ -222,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:
@@ -288,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)
@@ -474,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
+28 -14
View File
@@ -5,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):
@@ -12,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"),
@@ -22,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)
@@ -58,19 +59,25 @@ class General(commands.Cog):
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)
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
@@ -92,11 +99,19 @@ class General(commands.Cog):
return requests.get(self.muzak_url + '/stroopwafel')
@commands.command(pass_context=True)
async 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'])
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)
@@ -106,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!"
@@ -119,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')
+29 -22
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]
@@ -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 2022?
"""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:
await 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;
@@ -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
+2 -2
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()
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)