123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- title: Emacs appointment notifications via XMPP
- date: 2010-11-21 16:11
- tags: orgmode, xmpp, foss, emacs
- author: Christine Lemmer-Webber
- slug: emacs-appointment-notifications-via-xmpp
- ---
- <p>
- Since I've started using Emacs' appointment notifications with
- orgmode, I've wished that I could get notifications via XMPP. I
- think it's the most sensible system to use; I have it running on
- both my desktop, my phone, and my laptop, and the whole issue of
- "figuring out which device to send this notification to" has already
- been evaluated and solved by the XMPP community long long ago (back
- when everyone called XMPP Jabber, even ;)).
- </p>
- <p>
- I initially thought I'd use a
- <a href="https://github.com/fritzy/SleekXMPP/wiki">SleekXMPP</a>
- bot connected to emacs via D-Bus, but then I decided that maybe I would
- eventually want to add more commands to this that integrated more
- closely with emacs, so maybe I should use emacs lisp directly. I
- had heard of
- <a href="http://www.emacswiki.org/cgi-bin/wiki/JabberEl">Jabber.el</a>
- but thought that it was mainly aimed at users who want a client, and
- that writing a bot in it would end up cluttering up my emacs with
- extra UI stuff I don't want. Then I was pointed at
- <a href="http://www.emacswiki.org/emacs/steersman.el">Steersman.el</a>,
- and that seemed like a cleanly written bot, so I decided to give it
- a shot.
- </p>
- <p>
- I was running a newer version of JabberEl than the copy of
- Steersman's code I looked at, so it took a little bit to figure out
- how to adjust for the multi-account code, but once I did that the
- implementation happened fairly quickly. Here's the relevant code:
- </p>
- <p>
- <pre>;; Copyright (C) 2010 Chris Lemmer-Webber
- ;; This program 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, or (at your option)
- ;; any later version.
- ;;
- ;; This program 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.
- (require 'jabber)
- (load-file "~/.emacs.d/emacs-jabberbot-login.el")
- (defun botler->appt-message-me (min-to-app new-time appt-msg)
- "Message me about an upcoming appointment."
- (let ((message-body
- (format "Appointment %s: %s%s"
- (if (string-equal "0" min-to-app) "now"
- (format "in %s minute%s" min-to-app
- (if (string-equal "1" min-to-app) "" "s")))
- new-time appt-msg)))
- (jabber-send-sexp
- (jabber-find-connection "thisbot@example.org")
- `(message ((to . "sendto@example.org")
- (type . "normal"))
- (body () ,message-body)))))
- ; I don't care when people come online to my bot's roster.
- (setq jabber-alert-presence-hooks nil)
- (setq appt-display-format 'window)
- (setq appt-disp-window-function 'botler->appt-message-me)
- (setq appt-delete-window-function (lambda ()))</pre></p>
- <p>
- Adjust "thisbot@example.org" with your bot's JID and
- "sendto@example.org" with who you want to send messages to. You can
- replace emacs-jabber-bot-login.el with whatevever you want to login
- with, but you probably want to setq jabber-account-list and then run
- (jabber-connect-all). Note that if you're connecting with a
- self-signed cert with Jabber.el you'll need to do:
- </p>
- <p><pre>(setq starttls-extra-arguments '("--insecure"))
- (setq starttls-use-gnutls t)</pre></p>
- <p>
- I haven't yet figured how to whitelist my own self-signed cert yet,
- and passing in --insecure makes me feel like a monster, but it works
- for now. Maybe it's about time I finally got my ssl cert signed for
- dustycloud.org.
- </p>
- <p>
- Anyway! It works, and I've been successfully getting appointment
- messages from my emacs session over IM for the last week, and it's
- pretty great. Next up, configuring things so that I can retrieve my
- agenda over IM when I request it and be able to IM myself new tasks
- and events.
- </p>
|