aboutsummaryrefslogtreecommitdiffstats
path: root/alfred/mlmmj.py
blob: 5dfbfc3d25a691a6139afd8474317c0fb97939c7 (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
92
93
94
95
96
97
"""
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, tempfile
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(None, 1)
    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(
            ["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(
            ["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 = args[1].strip()
        msg = (
            f"From: {OWNER_ADDR}\n"
            f"To: {LIST_ADDR}\n"
            f"Subject: {message}\n"
            f"Date: {email.utils.formatdate(localtime=True)}\n"
            f"\n"
            f"{message}\n"
        )
        with tempfile.NamedTemporaryFile(mode="w", suffix=".eml", delete=False) as f:
            f.write(msg)
            tmpname = f.name
        try:
            r = subprocess.run(
                ["mlmmj-send", "-L", LIST_DIR, "-l", "1", "-m", tmpname],
                capture_output=True, text=True
            )
            bot.say("sent" if r.returncode == 0
                    else f"error: {(r.stderr or r.stdout).strip()}")
        finally:
            os.unlink(tmpname)

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