aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2023-08-11 15:10:54 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2023-08-11 15:10:54 +0200
commita6760a5857a719e50e956f882f6ba0ae81f3d4cb (patch)
tree4cd4ce7e334b368327cdcd7fb9bcc153f2843c9e
parentc5177c7a4e0fb23c245d083d1da79045bbaeb0c5 (diff)
downloadgeldschieberbot-a6760a5857a719e50e956f882f6ba0ae81f3d4cb.tar.gz
geldschieberbot-a6760a5857a719e50e956f882f6ba0ae81f3d4cb.zip
extract reading and sending messages into separate script
-rw-r--r--geldschieberbot.py81
-rwxr-xr-xrun.sh2
-rwxr-xr-xsingle_shot.py104
3 files changed, 106 insertions, 81 deletions
diff --git a/geldschieberbot.py b/geldschieberbot.py
index a568db0..99ff43a 100644
--- a/geldschieberbot.py
+++ b/geldschieberbot.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
# Copyright (c) 2017-2023 Florian Fischer. All rights reserved.
#
# This file is part of geldschieberbot.
@@ -17,15 +16,12 @@
# see <https://www.gnu.org/licenses/>.
"""Bot to manage a groups finances"""
-import argparse
from datetime import date, datetime, timedelta
import json
import os
-import subprocess
-import sys
import typing as T
-from models import MessageContext, Modification, Change, Quote, GeldschieberbotJSONEncoder, Reply
+from models import MessageContext, Modification, Change, GeldschieberbotJSONEncoder, Reply
from utils import to_euro, to_cent
@@ -1170,78 +1166,3 @@ class Geldschieberbot:
else:
break
return replies
-
-
-def send(_cmd, msgs: list[Reply], quote: T.Optional[Quote] = None):
- """Send a message with optional attachment"""
- for msg in msgs:
- cmd = _cmd
- if msg.attachment:
- cmd += f' -a {msg.attachment}'
-
- if quote:
- cmd += f' --quote-timestamp={quote.timestamp} --quote-author={quote.author}'
-
- subprocess.run(cmd.split(' '), input=msg.msg.encode(), check=False)
-
-
-def die(msg: str, status=1):
- """Exit because an error ocurred"""
- print(msg, file=sys.stderr)
- sys.exit(status)
-
-
-def main():
- """Read messages from stdin and send the bot's replies back"""
- parser = argparse.ArgumentParser()
- parser.add_argument('-d',
- '--dry-run',
- help='do not persist changes',
- action='store_true')
- parser.add_argument('-f', '--state-file', help='the state file')
- parser.add_argument('-g', '--group-id', help='the group id to listen to')
- parser.add_argument('--send-cmd',
- help='the shell command used to send messages')
- parser.add_argument('-nq',
- '--no-quote',
- help='not quote the message causing the reply',
- action='store_true')
- args = parser.parse_args()
-
- if args.dry_run:
- print("Dry Run no changes will apply!")
-
- state_path = args.state_file or os.environ['GSB_STATE_FILE']
- if not state_path:
- die('A state path must be provided')
-
- send_cmd = args.send_cmd or os.environ['GSB_SEND_CMD']
- if not send_cmd:
- die('A send command must be provided')
-
- group_id = args.group_id or os.environ['GSB_GROUP_ID']
- if not group_id:
- die('A group id must be provided')
-
- bot = Geldschieberbot(state_path, group_id, dry_run=args.dry_run)
-
- # Read cmds from stdin
- for line in sys.stdin.read().splitlines():
- try:
- envelope = json.loads(line)['envelope']
- except json.JSONDecodeError:
- print(datetime.now(), line, "not valid json")
- continue
-
- quote = None
- if not args.no_quote:
- quote = Quote(timestamp=envelope['timestamp'],
- author=envelope['source'])
-
- send(send_cmd, bot.handle(envelope), quote)
-
- send(send_cmd, bot.run_scheduled_cmds())
-
-
-if __name__ == "__main__":
- main()
diff --git a/run.sh b/run.sh
index 6f47929..0e487d5 100755
--- a/run.sh
+++ b/run.sh
@@ -19,7 +19,7 @@ do
d=$(date -Ins)
week=$(date +%U)
- signal-cli --output=json -u ${GSB_USER} receive | tee msgs/msg${d}.log | python3 geldschieberbot.py
+ signal-cli --output=json -u ${GSB_USER} receive | tee msgs/msg${d}.log | python3 single_shot.py
# only keep non empty logs
[[ $(du msgs/msg${d}.log | cut -f 1) == 0 ]] && rm msgs/msg${d}.log
diff --git a/single_shot.py b/single_shot.py
new file mode 100755
index 0000000..41d9849
--- /dev/null
+++ b/single_shot.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python3
+# Copyright (c) 2023 Florian Fischer. All rights reserved.
+#
+# This file is part of geldschieberbot.
+#
+# geldschieberbot is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# geldschieberbot is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# geldschieberbot found in the LICENSE file. If not,
+# see <https://www.gnu.org/licenses/>.
+"""Run geldschieberbot on all received messages, send replies, and exit"""
+
+import argparse
+from datetime import datetime
+import json
+import os
+import subprocess
+import sys
+import typing as T
+
+from geldschieberbot import Geldschieberbot
+from models import Reply, Quote
+
+
+def send(_cmd, msgs: list[Reply], quote: T.Optional[Quote] = None):
+ """Send a message with optional attachment"""
+ for msg in msgs:
+ cmd = _cmd
+ if msg.attachment:
+ cmd += f' -a {msg.attachment}'
+
+ if quote:
+ cmd += f' --quote-timestamp={quote.timestamp} --quote-author={quote.author}'
+
+ subprocess.run(cmd.split(' '), input=msg.msg.encode(), check=False)
+
+
+def die(msg: str, status=1):
+ """Exit because an error ocurred"""
+ print(msg, file=sys.stderr)
+ sys.exit(status)
+
+
+def main():
+ """Read messages from stdin and send the bot's replies back"""
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-d',
+ '--dry-run',
+ help='do not persist changes',
+ action='store_true')
+ parser.add_argument('-f', '--state-file', help='the state file')
+ parser.add_argument('-g', '--group-id', help='the group id to listen to')
+ parser.add_argument('--send-cmd',
+ help='the shell command used to send messages')
+ parser.add_argument('-nq',
+ '--no-quote',
+ help='not quote the message causing the reply',
+ action='store_true')
+ args = parser.parse_args()
+
+ if args.dry_run:
+ print("Dry Run no changes will apply!")
+
+ state_path = args.state_file or os.environ['GSB_STATE_FILE']
+ if not state_path:
+ die('A state path must be provided')
+
+ send_cmd = args.send_cmd or os.environ['GSB_SEND_CMD']
+ if not send_cmd:
+ die('A send command must be provided')
+
+ group_id = args.group_id or os.environ['GSB_GROUP_ID']
+ if not group_id:
+ die('A group id must be provided')
+
+ bot = Geldschieberbot(state_path, group_id, dry_run=args.dry_run)
+
+ # Read cmds from stdin
+ for line in sys.stdin.read().splitlines():
+ try:
+ envelope = json.loads(line)['envelope']
+ except json.JSONDecodeError:
+ print(datetime.now(), line, "not valid json")
+ continue
+
+ quote = None
+ if not args.no_quote:
+ quote = Quote(timestamp=envelope['timestamp'],
+ author=envelope['source'])
+
+ send(send_cmd, bot.handle(envelope), quote)
+
+ send(send_cmd, bot.run_scheduled_cmds())
+
+
+if __name__ == "__main__":
+ main()