summaryrefslogtreecommitdiffstats
path: root/krebs/5pkgs/simple/reaktor2-plugins
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-01-11 20:55:04 +0100
committertv <tv@krebsco.de>2026-01-11 20:55:04 +0100
commit114a129b977863db2cba719fca1e213f518ca3b1 (patch)
treeb029c1ee96dc160c9c6f0e3ab623e4707de70c74 /krebs/5pkgs/simple/reaktor2-plugins
parentf60ccbad0558542b0a803c6947f98f393facad1e (diff)
parent68d3c925b0edb958fcbafa589d35967dfb2a979c (diff)
Merge remote-tracking branch 'krebs/master'HEADmaster
Diffstat (limited to 'krebs/5pkgs/simple/reaktor2-plugins')
-rw-r--r--krebs/5pkgs/simple/reaktor2-plugins/default.nix108
-rwxr-xr-xkrebs/5pkgs/simple/reaktor2-plugins/scripts/random-emoji.sh6
-rwxr-xr-xkrebs/5pkgs/simple/reaktor2-plugins/scripts/random-issue.sh20
-rwxr-xr-xkrebs/5pkgs/simple/reaktor2-plugins/scripts/sed-plugin.py58
-rwxr-xr-xkrebs/5pkgs/simple/reaktor2-plugins/scripts/shack-correct.sh6
-rwxr-xr-xkrebs/5pkgs/simple/reaktor2-plugins/scripts/tell-on_join.sh25
-rwxr-xr-xkrebs/5pkgs/simple/reaktor2-plugins/scripts/tell-on_privmsg.sh18
7 files changed, 241 insertions, 0 deletions
diff --git a/krebs/5pkgs/simple/reaktor2-plugins/default.nix b/krebs/5pkgs/simple/reaktor2-plugins/default.nix
new file mode 100644
index 000000000..3f2f6eac2
--- /dev/null
+++ b/krebs/5pkgs/simple/reaktor2-plugins/default.nix
@@ -0,0 +1,108 @@
+{ pkgs, stockholm, ... }:
+with stockholm.lib;
+
+{
+ generators = {
+ command_hook = commands: {
+ pattern =
+ "^\\s*([0-9A-Za-z._][0-9A-Za-z._-]*)(?:\\s+(.*\\S))?\\s*$";
+ command = 1;
+ arguments = [2];
+ commands = commands;
+ };
+ };
+
+ commands = {
+
+ random-emoji = {
+ filename = ./scripts/random-emoji.sh;
+ env = {
+ PATH = makeBinPath (with pkgs; [ coreutils gnused gnugrep xmlstarlet wget ]);
+ };
+ };
+
+ dance = {
+ filename = pkgs.writers.writeDash "dance" ''
+ ${pkgs.krebsdance}/bin/krebsdance --dance "$@";
+ '';
+ };
+
+ nixos-version = {
+ filename = pkgs.writers.writeDash "nixos-version" ''
+ . /etc/os-release
+ echo "$PRETTY_NAME"
+ '';
+ };
+
+ stockholm-issue = {
+ filename = ./scripts/random-issue.sh;
+ env = {
+ PATH = makeBinPath (with pkgs; [ coreutils git gnused haskellPackages.lentil ]);
+ origin = "http://cgit.gum/stockholm";
+ state_dir = "/tmp/stockholm-issue";
+ };
+ };
+
+ };
+
+ hooks = {
+
+ sed = {
+ activate = "always";
+ pattern = "^(.*)$";
+ arguments = [1];
+ command = {
+ env = {
+ PATH = makeBinPath (with pkgs; [ gnused ]);
+ state_dir = "/tmp";
+ };
+ filename = pkgs.writers.writeDash "sed-plugin" ''
+ set -efu
+ exec ${pkgs.python3}/bin/python \
+ ${./scripts/sed-plugin.py} "$@"
+ '';
+ };
+ };
+
+ shack-correct = {
+ activate = "match";
+ pattern = "^(.*Shack.*)$";
+ arguments = [1];
+ command.filename = ./scripts/shack-correct.sh;
+ };
+
+
+ url-title = {
+ #pattern = "^.*(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+).*$";
+ pattern = "^.*(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+).*$";
+ activate = "match";
+ arguments = [1];
+ command = {
+ filename = pkgs.writePython3 "url-title" { deps = with pkgs.python3Packages; [ beautifulsoup4 lxml ]; } ''
+ import cgi
+ import sys
+ import urllib.request
+ from bs4 import BeautifulSoup
+
+ try:
+ req = urllib.request.Request(sys.argv[1])
+ req.add_header('user-agent', 'Reaktor-url-title')
+ resp = urllib.request.urlopen(req)
+ if resp.headers['content-type'].find('text/html') >= 0:
+ soup = BeautifulSoup(resp.read(16000), "lxml")
+ title = soup.find('title').string
+
+ if len(title.split('\n')) > 5:
+ title = '\n'.join(title.split('\n')[:5])
+
+ print(title[:450])
+ else:
+ cd_header = resp.headers['content-disposition']
+ print(cgi.parse_header(cd_header)[1]['filename'])
+ except: # noqa: E722
+ pass
+ '';
+ };
+ };
+ };
+}
diff --git a/krebs/5pkgs/simple/reaktor2-plugins/scripts/random-emoji.sh b/krebs/5pkgs/simple/reaktor2-plugins/scripts/random-emoji.sh
new file mode 100755
index 000000000..6f3dd4a3f
--- /dev/null
+++ b/krebs/5pkgs/simple/reaktor2-plugins/scripts/random-emoji.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+curl -sS http://emojicons.com/random | \
+ grep data-text | \
+ sed -n 's/.*>\(.*\)<\/textarea>/\1/p' | \
+ head -n 1 | \
+ xmlstarlet unesc
diff --git a/krebs/5pkgs/simple/reaktor2-plugins/scripts/random-issue.sh b/krebs/5pkgs/simple/reaktor2-plugins/scripts/random-issue.sh
new file mode 100755
index 000000000..5c47c6156
--- /dev/null
+++ b/krebs/5pkgs/simple/reaktor2-plugins/scripts/random-issue.sh
@@ -0,0 +1,20 @@
+#! /bin/sh
+set -eu
+# requires env:
+# $state_dir
+# $origin
+
+# in PATH: git,lentil,coreutils
+subdir=`echo "$1" | tr -dc "[:alnum:]"`
+name=`echo "$origin" | tr -dc "[:alnum:]"`
+track="$state_dir/$name-checkout"
+(if test -e "$track" ;then
+ cd "$track"
+ git fetch origin master
+ git reset --hard origin/master
+else
+ git clone "$origin" "$track"
+fi) >&2
+
+cd "$track"
+lentil "${subdir:-.}" -f csv | sed 1d | shuf | head -1
diff --git a/krebs/5pkgs/simple/reaktor2-plugins/scripts/sed-plugin.py b/krebs/5pkgs/simple/reaktor2-plugins/scripts/sed-plugin.py
new file mode 100755
index 000000000..4925b25bb
--- /dev/null
+++ b/krebs/5pkgs/simple/reaktor2-plugins/scripts/sed-plugin.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python3
+
+# Usage:
+# _from=krebs state_dir=. python sed-plugin.py 'dick butt'
+# _from=krebs state_dir=. python sed-plugin.py 's/t/l/g'
+# > dick bull
+import shelve
+from os import environ
+from os.path import join
+from sys import argv
+from time import sleep
+import re
+
+# try to open the shelve file until it succeeds
+while True:
+ try:
+ d = shelve.open(
+ join(environ['state_dir'], 'sed-plugin.shelve'),
+ writeback=True
+ )
+ break
+ except: # noqa: E722
+ sleep(0.2)
+usr = environ['_from']
+
+
+def is_regex(line):
+ myre = re.compile(r'^s/(?:\\/|[^/])+/(?:\\/|[^/])*/[ig]?$')
+ return myre.match(line)
+
+
+line = argv[1]
+
+if is_regex(line):
+ last = d.get(usr, None)
+ if last:
+ from subprocess import Popen, PIPE
+ p = Popen(['sed', line], stdin=PIPE, stdout=PIPE, stderr=PIPE)
+ so, se = p.communicate(bytes("{}\n".format(last), "UTF-8"))
+ if p.returncode:
+ print("something went wrong when trying to process your regex: {}".format(line.strip()))
+ ret = so.decode()
+ if len(ret) > 512:
+ print('message to long, skipped')
+ elif len(ret.split('\n')) > 5:
+ print('to many lines, skipped')
+ else:
+ if last.strip() != ret.strip():
+ print("\x02{}\x02 meant: {}".format(usr, ret.strip()))
+ if ret:
+ d[usr] = ret
+
+ else:
+ print("no last message")
+else:
+ d[usr] = line
+
+d.close()
diff --git a/krebs/5pkgs/simple/reaktor2-plugins/scripts/shack-correct.sh b/krebs/5pkgs/simple/reaktor2-plugins/scripts/shack-correct.sh
new file mode 100755
index 000000000..d500b3cb3
--- /dev/null
+++ b/krebs/5pkgs/simple/reaktor2-plugins/scripts/shack-correct.sh
@@ -0,0 +1,6 @@
+#! /bin/sh
+set -eu
+printf "Sie meinten wohl \""
+echo -n $@ | sed 's/Shack/shack/g'
+echo "\" check out https://wiki.shackspace.de/project/logo_and_ci#name_ci"
+echo "${_from}--"
diff --git a/krebs/5pkgs/simple/reaktor2-plugins/scripts/tell-on_join.sh b/krebs/5pkgs/simple/reaktor2-plugins/scripts/tell-on_join.sh
new file mode 100755
index 000000000..6978e38c6
--- /dev/null
+++ b/krebs/5pkgs/simple/reaktor2-plugins/scripts/tell-on_join.sh
@@ -0,0 +1,25 @@
+#! /bin/sh
+set -euf
+
+# require flock from util-linux (pkgs.util-linux)
+if test "${FLOCK-}" != "$state_file"; then
+ exec env FLOCK="$state_file" flock "$state_file" "$0" "$@"
+fi
+
+# TODO tell now, if already joined
+jq -r <"$state_file" \
+ --arg to "$_from" \
+ --arg msgtarget "$_msgtarget" \
+ '
+ select(.to == $to and .msgtarget == $msgtarget) |
+ "\(.to): \(.text) \u00032-- \(.from)\u00032 \(.date)"
+ '
+
+jq -c <"$state_file" >"$state_file.tmp" \
+ --arg to "$_from" \
+ --arg msgtarget "$_msgtarget" \
+ '
+ select((.to == $to and .msgtarget == $msgtarget) | not)
+ '
+
+mv "$state_file.tmp" "$state_file"
diff --git a/krebs/5pkgs/simple/reaktor2-plugins/scripts/tell-on_privmsg.sh b/krebs/5pkgs/simple/reaktor2-plugins/scripts/tell-on_privmsg.sh
new file mode 100755
index 000000000..fc05bdefb
--- /dev/null
+++ b/krebs/5pkgs/simple/reaktor2-plugins/scripts/tell-on_privmsg.sh
@@ -0,0 +1,18 @@
+#! /bin/sh
+set -euf
+
+# require flock from util-linux
+if test "${FLOCK-}" != "$state_file"; then
+ exec env FLOCK="$state_file" flock "$state_file" "$0" "$@"
+fi
+
+# TODO tell now, if already joined
+jq -cn \
+ --arg from "$_from" \
+ --arg to "${1%% *}" \
+ --arg text "${1#* }" \
+ --arg msgtarget "$_msgtarget" \
+ '{ $from, $to, $text, $msgtarget, date: (now | todate) }' \
+ >> "$state_file"
+
+echo 'Consider it noted.' # that's what lambdabot says...