humhub: in bestehenden Konversationen antworten (mail-reply)
mail-send legt immer eine neue Konversation an; fuer eine Antwort braucht es POST /mail/<id>/entry. Die ID steht in der URL der Konversation. Holt den Verlauf nicht ab, sondern prueft nur die Erreichbarkeit — fremde Nachrichten gehoeren nicht ungefragt in einen Modellkontext. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
e00395fc64
commit
2bfc62bcb8
2 files changed
+32
-4
No files matched your search
@@ -94,13 +94,18 @@ und Wiki-Seiten.
|
|||||||
### Direktnachrichten
|
### Direktnachrichten
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./humhub.py mail-send <empfaenger> "<betreff>" [datei|-]
|
./humhub.py mail-send <empfaenger> "<betreff>" [datei|-]
|
||||||
./humhub.py mail-send https://humhub.inmedias.it/u/serge/ "Betreff" entwurf.md
|
./humhub.py mail-send https://humhub.inmedias.it/u/serge/ "Betreff" entwurf.md
|
||||||
./humhub.py mail-send jan.stobbe,26 "Betreff" -
|
./humhub.py mail-send jan.stobbe,26 "Betreff" -
|
||||||
|
./humhub.py mail-reply <konversations-id> [datei|-]
|
||||||
```
|
```
|
||||||
|
|
||||||
Empfänger sind Benutzername, Profil-URL oder numerische ID; mehrere mit Komma.
|
Empfänger sind Benutzername, Profil-URL oder numerische ID; mehrere mit Komma.
|
||||||
|
|
||||||
|
`mail-reply` hängt einen Beitrag an eine bestehende Konversation
|
||||||
|
(`POST /mail/<id>/entry`). Die ID steht in der URL der Konversation:
|
||||||
|
`…/mail/mail/index?id=35`.
|
||||||
|
|
||||||
**Slug ≠ Benutzername.** Zur Profil-URL `/u/serge/` gehört der Benutzername
|
**Slug ≠ Benutzername.** Zur Profil-URL `/u/serge/` gehört der Benutzername
|
||||||
`Serge`, und `get-by-username` unterscheidet Groß-/Kleinschreibung. Wer den
|
`Serge`, und `get-by-username` unterscheidet Groß-/Kleinschreibung. Wer den
|
||||||
Slug einsetzt, bekommt sonst `User not found!`. `mail-send` fängt das ab: erst
|
Slug einsetzt, bekommt sonst `User not found!`. `mail-send` fängt das ab: erst
|
||||||
@@ -108,7 +113,9 @@ Slug einsetzt, bekommt sonst `User not found!`. `mail-send` fängt das ab: erst
|
|||||||
Slug ohne Rücksicht auf Groß-/Kleinschreibung vergleicht.
|
Slug ohne Rücksicht auf Groß-/Kleinschreibung vergleicht.
|
||||||
|
|
||||||
Zum Lesen von Konversationen gibt es bewusst keinen Befehl — Nachrichten
|
Zum Lesen von Konversationen gibt es bewusst keinen Befehl — Nachrichten
|
||||||
anderer gehören nicht ungefragt in einen Modellkontext.
|
anderer gehören nicht ungefragt in einen Modellkontext. Auch `mail-reply`
|
||||||
|
holt den Verlauf nicht ab, sondern prüft nur, ob die Konversation erreichbar
|
||||||
|
ist.
|
||||||
|
|
||||||
Inhalte (Markdown) aus Datei oder `-` (stdin) übergeben — nicht als langes
|
Inhalte (Markdown) aus Datei oder `-` (stdin) übergeben — nicht als langes
|
||||||
Shell-Argument (Sonderzeichen). `container_id` akzeptiert eine numerische
|
Shell-Argument (Sonderzeichen). `container_id` akzeptiert eine numerische
|
||||||
|
|||||||
@@ -403,6 +403,21 @@ def cmd_mail_send(args: argparse.Namespace) -> None:
|
|||||||
print(f"Nachricht gesendet (Konversation {data.get('id')}) an Benutzer {empfaenger}")
|
print(f"Nachricht gesendet (Konversation {data.get('id')}) an Benutzer {empfaenger}")
|
||||||
|
|
||||||
|
|
||||||
|
def cmd_mail_reply(args: argparse.Namespace) -> None:
|
||||||
|
"""Antwortet in einer bestehenden Konversation.
|
||||||
|
|
||||||
|
Bewusst ohne Lesebefehl: der Text der Konversation wird nicht abgerufen,
|
||||||
|
nur ihre Erreichbarkeit geprueft.
|
||||||
|
"""
|
||||||
|
session, _ = get_session()
|
||||||
|
message = read_file(args.file)
|
||||||
|
r = session.get(f"{BASE_URL}/mail/{args.id}")
|
||||||
|
if not r.ok:
|
||||||
|
sys.exit(f"Error {r.status_code}: Konversation {args.id} nicht erreichbar")
|
||||||
|
data = api_post(session, f"/mail/{args.id}/entry", {"message": message})
|
||||||
|
print(f"Antwort geschrieben (Eintrag {data.get('id')}) in Konversation {args.id}")
|
||||||
|
|
||||||
|
|
||||||
# ── Fetch (perma-/content-id-agnostisch) ─────────────────────────────────────
|
# ── Fetch (perma-/content-id-agnostisch) ─────────────────────────────────────
|
||||||
|
|
||||||
def parse_content_ref(ref: str) -> int:
|
def parse_content_ref(ref: str) -> int:
|
||||||
@@ -575,6 +590,12 @@ def main() -> None:
|
|||||||
p.add_argument("file", help="Markdown-Datei oder '-' für stdin")
|
p.add_argument("file", help="Markdown-Datei oder '-' für stdin")
|
||||||
p.set_defaults(func=cmd_mail_send)
|
p.set_defaults(func=cmd_mail_send)
|
||||||
|
|
||||||
|
# mail-reply
|
||||||
|
p = sub.add_parser("mail-reply", help="In einer bestehenden Konversation antworten")
|
||||||
|
p.add_argument("id", type=int, help="Konversations-ID (aus /mail/mail/index?id=NN)")
|
||||||
|
p.add_argument("file", help="Markdown-Datei oder '-' für stdin")
|
||||||
|
p.set_defaults(func=cmd_mail_reply)
|
||||||
|
|
||||||
# post-update
|
# post-update
|
||||||
p = sub.add_parser("post-update", help="Post aktualisieren")
|
p = sub.add_parser("post-update", help="Post aktualisieren")
|
||||||
p.add_argument("id", type=int, help="Post-ID")
|
p.add_argument("id", type=int, help="Post-ID")
|
||||||
|
|||||||
Reference in new issue
Block a user