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>")
|