From f0b98bd0114df1e1ebb82ff300f9532d86b3eb18 Mon Sep 17 00:00:00 2001
From: tv <tv@krebsco.de>
Date: Wed, 24 May 2017 01:43:50 +0200
Subject: krebs/5pkgs: move simple pkgs to a subdir

---
 krebs/5pkgs/simple/Reaktor/default.nix             |  22 ++++
 krebs/5pkgs/simple/Reaktor/plugins.nix             | 131 +++++++++++++++++++++
 krebs/5pkgs/simple/Reaktor/scripts/random-emoji.sh |   6 +
 krebs/5pkgs/simple/Reaktor/scripts/random-issue.sh |  20 ++++
 krebs/5pkgs/simple/Reaktor/scripts/sed-plugin.py   |  41 +++++++
 .../5pkgs/simple/Reaktor/scripts/shack-correct.sh  |   6 +
 6 files changed, 226 insertions(+)
 create mode 100644 krebs/5pkgs/simple/Reaktor/default.nix
 create mode 100644 krebs/5pkgs/simple/Reaktor/plugins.nix
 create mode 100644 krebs/5pkgs/simple/Reaktor/scripts/random-emoji.sh
 create mode 100644 krebs/5pkgs/simple/Reaktor/scripts/random-issue.sh
 create mode 100644 krebs/5pkgs/simple/Reaktor/scripts/sed-plugin.py
 create mode 100644 krebs/5pkgs/simple/Reaktor/scripts/shack-correct.sh

(limited to 'krebs/5pkgs/simple/Reaktor')

diff --git a/krebs/5pkgs/simple/Reaktor/default.nix b/krebs/5pkgs/simple/Reaktor/default.nix
new file mode 100644
index 000000000..fc3710820
--- /dev/null
+++ b/krebs/5pkgs/simple/Reaktor/default.nix
@@ -0,0 +1,22 @@
+{ lib, pkgs,python3Packages,fetchurl, ... }:
+
+python3Packages.buildPythonPackage rec {
+  name = "Reaktor-${version}";
+  version = "0.5.1";
+
+  doCheck = false;
+
+  propagatedBuildInputs = with pkgs;[
+    python3Packages.docopt
+    python3Packages.requests2
+  ];
+  src = fetchurl {
+    url = "https://pypi.python.org/packages/source/R/Reaktor/Reaktor-${version}.tar.gz";
+    sha256 = "0dn9r0cyxi1sji2pnybsrc4hhaaq7hmf235nlgkrxqlsdb7y6n6n";
+  };
+  meta = {
+    homepage = http://krebsco.de/;
+    description = "An IRC bot based on asynchat";
+    license = lib.licenses.wtfpl;
+  };
+}
diff --git a/krebs/5pkgs/simple/Reaktor/plugins.nix b/krebs/5pkgs/simple/Reaktor/plugins.nix
new file mode 100644
index 000000000..e85e41cfe
--- /dev/null
+++ b/krebs/5pkgs/simple/Reaktor/plugins.nix
@@ -0,0 +1,131 @@
+{ stdenv, lib, pkgs, makeWrapper }:
+
+rec {
+  # Begin API
+  buildBaseReaktorPlugin = { name
+                        , config # python extra configuration for plugin
+                        , phases ? []
+                        , ... } @ attrs:
+    stdenv.mkDerivation (attrs // {
+      name = "Reaktor-plugin-" + name;
+      isReaktorPlugin = true;
+    });
+
+  buildSimpleReaktorPlugin = name: { script
+                        , path ? []
+                        , env ? {}
+                        , append_rule ? false # append the rule instead of insert
+                        , pattern ? ""
+                        , ... } @ attrs:
+    let
+      path_env = { "PATH" = lib.makeSearchPath "bin" (path ++ [ pkgs.coreutils ]); };
+      src_dir = pkgs.substituteAll ( {
+        inherit name;
+        dir = "bin";
+        isExecutable = true;
+        src = script;
+      });
+      src_file = "${src_dir}/bin/${name}";
+      config = ''
+        public_commands.${if append_rule then "append(" else "insert(0," }{
+          'capname' : "${name}",
+          'pattern' : ${if pattern == "" then
+                          ''indirect_pattern.format("${name}")'' else
+                          ''"${pattern}"'' },
+          'argv'    : ["${src_file}"],
+          'env'     : ${builtins.toJSON (path_env // env)} })
+      '';
+      config_file = pkgs.writeText "plugin.py" config;
+    in buildBaseReaktorPlugin (attrs // rec {
+      inherit name config;
+
+      phases = [ "installPhase" ];
+      buildInputs = [ makeWrapper ];
+      installPhase = ''
+        mkdir -p $out/bin $out/etc/Reaktor
+        ln -s ${src_file} $out/bin
+        wrapProgram $out/bin/${name} \
+          --prefix PATH : ${path_env.PATH}
+        ln -s ${config_file} $out/etc/Reaktor/plugin.py
+      '';
+
+    });
+  # End API
+
+  # Begin Plugins
+  random-emoji = buildSimpleReaktorPlugin "emoji" {
+    path = with pkgs; [ gnused gnugrep xmlstarlet curl ];
+    script = ./scripts/random-emoji.sh;
+  };
+
+  sed-plugin = buildSimpleReaktorPlugin "sed-plugin" {
+    path = [ pkgs.gnused pkgs.python3 ];
+    # only support s///gi the plugin needs to see every msg
+    # TODO: this will eat up the last regex, fix Reaktor to support fallthru
+    append_rule = true;
+    pattern = "^(?P<args>.*)$$";
+    script = ./scripts/sed-plugin.py;
+  };
+
+  shack-correct = buildSimpleReaktorPlugin "shack-correct" {
+    path = [ pkgs.gnused ];
+    pattern = "^(?P<args>.*Shack.*)$$";
+    script = ./scripts/shack-correct.sh;
+  };
+
+  nixos-version = buildSimpleReaktorPlugin "nixos-version" {
+    script = pkgs.writeDash "nixos-version" ''
+      . /etc/os-release
+      echo "$PRETTY_NAME"
+      '';
+  };
+  stockholm-issue = buildSimpleReaktorPlugin "stockholm-issue" {
+    script = ./scripts/random-issue.sh;
+    path = with pkgs; [ git gnused haskellPackages.lentil ];
+    env = { "origin" = "http://cgit.gum/stockholm"; };
+  };
+
+  titlebot =
+  let
+    pypkgs = pkgs.python3Packages;
+    titlebot_cmds =  pypkgs.buildPythonPackage {
+      name = "titlebot_cmds";
+      propagatedBuildInputs =  with pypkgs; [ setuptools ];
+      src = pkgs.fetchurl {
+        url = "https://github.com/makefu/reaktor-titlebot/archive/2.1.0.tar.gz";
+        sha256 = "0wvf09wmk8b52f9j65qrw81nwrhs9pfhijwrlkzp5l7l2q8cjkp6";
+        };
+      };
+  in buildBaseReaktorPlugin rec {
+    name = "titlebot";
+    phases = [ "installPhase" ];
+    installPhase = ''
+      mkdir -p $out
+      ln -s ${titlebot_cmds}/* $out
+    '';
+    config = ''
+      def titlebot_cmd(cmd):
+        from os import environ
+        return {  'capname': None,
+                  'env': { 'TITLEDB':
+                    environ['state_dir']+'/suggestions.json' },
+                  'pattern': '^\\.' + cmd + '\\s*(?:\\s+(?P<args>.*))?$$',
+                  'argv': [ '${titlebot_cmds}/bin/' + cmd ] }
+      for i in ['up','help','list','top','new']:
+        public_commands.insert(0,titlebot_cmd(i))
+      commands.insert(0,titlebot_cmd('clear'))
+    '';
+  };
+
+  url-title = (buildSimpleReaktorPlugin "url-title" {
+    pattern = "^.*(?P<args>http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+).*$$";
+    path = with pkgs; [ curl perl ];
+    script = pkgs.writeDash "lambda-pl" ''
+      if [ "$#" -gt 0 ]; then
+        curl -SsL --max-time 5 "$1" |
+          perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)(?: - youtube)?\s*<\/title/si'
+      fi
+    '';
+  });
+
+}
diff --git a/krebs/5pkgs/simple/Reaktor/scripts/random-emoji.sh b/krebs/5pkgs/simple/Reaktor/scripts/random-emoji.sh
new file mode 100644
index 000000000..386aa68b9
--- /dev/null
+++ b/krebs/5pkgs/simple/Reaktor/scripts/random-emoji.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+curl http://emojicons.com/random -s | \
+  grep data-text | \
+  sed -n 's/.*>\(.*\)<\/textarea>/\1/p' | \
+  head -n 1 | \
+  xmlstarlet unesc
diff --git a/krebs/5pkgs/simple/Reaktor/scripts/random-issue.sh b/krebs/5pkgs/simple/Reaktor/scripts/random-issue.sh
new file mode 100644
index 000000000..5c47c6156
--- /dev/null
+++ b/krebs/5pkgs/simple/Reaktor/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/Reaktor/scripts/sed-plugin.py b/krebs/5pkgs/simple/Reaktor/scripts/sed-plugin.py
new file mode 100644
index 000000000..da8e2f726
--- /dev/null
+++ b/krebs/5pkgs/simple/Reaktor/scripts/sed-plugin.py
@@ -0,0 +1,41 @@
+#!/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
+import re
+
+d = shelve.open(join(environ['state_dir'], 'sed-plugin.shelve'), writeback=True)
+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)
+        so, se = p.communicate(bytes("{}\n".format(last), "UTF-8"))
+        if p.returncode:
+            print("something went wrong when trying to process your regex: {}".format(se.decode()))
+        ret = so.decode()
+        print("\x1b[1m{}\x1b[0m 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/Reaktor/scripts/shack-correct.sh b/krebs/5pkgs/simple/Reaktor/scripts/shack-correct.sh
new file mode 100644
index 000000000..3b4d04f80
--- /dev/null
+++ b/krebs/5pkgs/simple/Reaktor/scripts/shack-correct.sh
@@ -0,0 +1,6 @@
+#! /bin/sh
+set -eu
+printf "Sie meinten wohl \""
+echo -n $@ | sed 's/Shack/shack/g'
+echo "\""
+echo "${_from}--"
-- 
cgit v1.2.3