aboutsummaryrefslogtreecommitdiffstats
path: root/alfred/mlmmj.py
blob: 88a6333e21080df60557d6f24123940c93b8e60c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""
Sopel plugin: mlmmj mailing list management

  !list subscribe <email>      - subscribe to list@gumx.cc
  !list unsubscribe <email>    - unsubscribe
  !list members                - show all subscribers
  !list send <message>         - send a message to the list as owner
"""

import email.utils, glob, os, subprocess
from sopel import plugin

LIST_DIR   = "/var/spool/mlmmj/list"
LIST_ADDR  = "list@gumx.cc"
OWNER_ADDR = "ahmed@gumx.cc"


def _owner(bot, trigger):
    return trigger.nick == bot.settings.core.owner


@plugin.command("list")
def cmd_list(bot, trigger):
    if not _owner(bot, trigger):
        return

    args = (trigger.group(2) or "").split()
    if not args:
        bot.say("usage: !list <subscribe|unsubscribe|members|send>")
        return

    action = args[0]

    if action == "subscribe":
        if len(args) < 2:
            bot.say("usage: !list subscribe <email>")
            return
        email_addr = args[1].strip()
        r = subprocess.run(
            ["/usr/bin/mlmmj-sub", "-L", LIST_DIR, "-a", email_addr, "-s", "-f"],
            capture_output=True, text=True
        )
        bot.say(f"subscribed: {email_addr}" if r.returncode == 0
                else f"error: {(r.stderr or r.stdout).strip()}")

    elif action == "unsubscribe":
        if len(args) < 2:
            bot.say("usage: !list unsubscribe <email>")
            return
        email_addr = args[1].strip()
        r = subprocess.run(
            ["/usr/bin/mlmmj-unsub", "-L", LIST_DIR, "-a", email_addr, "-s", "-f"],
            capture_output=True, text=True
        )
        bot.say(f"unsubscribed: {email_addr}" if r.returncode == 0
                else f"error: {(r.stderr or r.stdout).strip()}")

    elif action == "members":
        subs_dir = os.path.join(LIST_DIR, "subscribers.d")
        subs = []
        if os.path.isdir(subs_dir):
            for fname in sorted(glob.glob(os.path.join(subs_dir, "*"))):
                with open(fname) as f:
                    subs.extend(line.strip() for line in f if line.strip())
        if subs:
            bot.say(f"{len(subs)} subscriber(s): " + ", ".join(subs))
        else:
            bot.say("no subscribers")

    elif action == "send":
        if len(args) < 2:
            bot.say("usage: !list send <message>")
            return
        message = " ".join(args[1:]).strip()
        msg = (
            f"From: {OWNER_ADDR}\r\n"
            f"To: {LIST_ADDR}\r\n"
            f"Subject: {message}\r\n"
            f"Date: {email.utils.formatdate(localtime=True)}\r\n"
            f"\r\n"
            f"{message}\r\n"
        )
        r = subprocess.run(
            ["/usr/sbin/sendmail", "-f", OWNER_ADDR, LIST_ADDR],
            input=msg, capture_output=True, text=True
        )
        bot.say("queued" if r.returncode == 0
                else f"error: {(r.stderr or r.stdout).strip()}")

    else:
        bot.say("usage: !list <subscribe|unsubscribe|members|send>")