<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <title>EnigmaCurry</title>
    <link>http://www.enigmacurry.com/</link>
    <description>The Curry Enigma</description>
    <pubDate>Thu, 07 Feb 2013 01:43:41 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Emacs IRC (ERC) with Noticeable Notifications</title>
      <link>http://www.enigmacurry.com/2008/08/07/emacs-irc-erc-with-noticeable-notifications/</link>
      <pubDate>Thu, 07 Aug 2008 00:35:50 EDT</pubDate>
      <category><![CDATA[python]]></category>
      <category><![CDATA[lisp]]></category>
      <category><![CDATA[emacs]]></category>
      <category><![CDATA[linux]]></category>
      <guid>http://www.enigmacurry.com/?p=151</guid>
      <description>Emacs IRC (ERC) with Noticeable Notifications</description>
      <content:encoded><![CDATA[
<p>I use <a href="http://www.emacswiki.org/cgi-bin/wiki?action=browse;oldid=EmacsIRCClient;id=ERC">ERC </a> for all my IRC chatting. I finally got fed up with not noticing someones message because I didn't have emacs focused. So I spent my evening concocting a more noticeable messaging system through Pymacs and libnotify.</p>

<p>Half way though implementing this, wouldn't you know it, I found <a href="http://www.emacswiki.org/cgi-bin/wiki/ErcPageMe">ErcPageMe</a> which does exactly what I wanted. I figured I was learning quite a bit and I continued writing my own version. I expanded on their code and (at least for me) made some improvements. So kudos go to whoever wrote ErcPageMe :)</p>

<p>The following code will pop up a message on your gnome desktop alerting you whenever you receive a personal message or when someone mentions your nickname in a channel. It also avoids notification for the same user in the same channel if they triggered a message within the last 30 seconds.</p>

<center> <img src="/blog-post-images/Emacs-ERC-Notification.png" alt="Emacs ERC Notification through libnotify" /></center>

<p>Here is my lisp and embedded python/pymacs code:</p>


<div class="pygments_murphy"><pre><span class="p">(</span><span class="nb">defun</span> <span class="nv">notify-desktop</span> <span class="p">(</span><span class="nv">title</span> <span class="nv">message</span> <span class="k">&amp;optional</span> <span class="nv">duration</span> <span class="k">&amp;optional</span> <span class="nv">icon</span><span class="p">)</span>
  <span class="s">&quot;Pop up a message on the desktop with an optional duration (forever otherwise)&quot;</span>
  <span class="p">(</span><span class="nv">pymacs-exec</span> <span class="s">&quot;import pynotify&quot;</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">pymacs-exec</span> <span class="s">&quot;pynotify.init(&#39;Emacs&#39;)&quot;</span><span class="p">)</span>
  <span class="p">(</span><span class="k">if</span> <span class="nv">icon</span> 
      <span class="p">(</span><span class="nv">pymacs-exec</span> <span class="p">(</span><span class="nb">format</span> <span class="s">&quot;msg = pynotify.Notification(&#39;%s&#39;,&#39;%s&#39;,&#39;%s&#39;)&quot;</span>
                           <span class="nv">title</span> <span class="nv">message</span> <span class="nv">icon</span><span class="p">))</span>
    <span class="p">(</span><span class="nv">pymacs-exec</span> <span class="p">(</span><span class="nb">format</span> <span class="s">&quot;msg = pynotify.Notification(&#39;%s&#39;,&#39;%s&#39;)&quot;</span> <span class="nv">title</span> <span class="nv">message</span><span class="p">))</span>
    <span class="p">)</span> 
  <span class="p">(</span><span class="k">if</span> <span class="nv">duration</span> 
      <span class="p">(</span><span class="nv">pymacs-exec</span> <span class="p">(</span><span class="nb">format</span> <span class="s">&quot;msg.set_timeout(%s)&quot;</span> <span class="nv">duration</span><span class="p">))</span>
    <span class="p">)</span>
  <span class="p">(</span><span class="nv">pymacs-exec</span> <span class="s">&quot;msg.show()&quot;</span><span class="p">)</span>
  <span class="p">)</span>

<span class="c1">;; Notify me when someone wants to talk to me.</span>
<span class="c1">;; Heavily based off of ErcPageMe on emacswiki.org, with some improvements.</span>
<span class="c1">;; I wanted to learn and I used my own notification system with pymacs</span>
<span class="c1">;; Delay is on a per user, per channel basis now.</span>
<span class="p">(</span><span class="nb">defvar</span> <span class="nv">erc-page-nick-alist</span> <span class="no">nil</span>
  <span class="s">&quot;Alist of &#39;nickname|target&#39; and last time they triggered a notification&quot;</span>
  <span class="p">)</span>
<span class="p">(</span><span class="nb">defun</span> <span class="nv">erc-notify-allowed</span> <span class="p">(</span><span class="nv">nick</span> <span class="nv">target</span> <span class="k">&amp;optional</span> <span class="nv">delay</span><span class="p">)</span>
  <span class="s">&quot;Return true if a certain nick has waited long enough to notify&quot;</span>
  <span class="p">(</span><span class="nb">unless</span> <span class="nv">delay</span> <span class="p">(</span><span class="k">setq</span> <span class="nv">delay</span> <span class="mi">30</span><span class="p">))</span>
  <span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">cur-time</span> <span class="p">(</span><span class="nv">time-to-seconds</span> <span class="p">(</span><span class="nv">current-time</span><span class="p">)))</span>
        <span class="p">(</span><span class="nv">cur-assoc</span> <span class="p">(</span><span class="nb">assoc</span> <span class="p">(</span><span class="nb">format</span> <span class="s">&quot;%s|%s&quot;</span> <span class="nv">nick</span> <span class="nv">target</span><span class="p">)</span> <span class="nv">erc-page-nick-alist</span><span class="p">))</span>
        <span class="p">(</span><span class="nv">last-time</span><span class="p">))</span>
    <span class="p">(</span><span class="k">if</span> <span class="nv">cur-assoc</span>
        <span class="p">(</span><span class="k">progn</span>
          <span class="p">(</span><span class="k">setq</span> <span class="nv">last-time</span> <span class="p">(</span><span class="nb">cdr</span> <span class="nv">cur-assoc</span><span class="p">))</span>
          <span class="p">(</span><span class="nv">setcdr</span> <span class="nv">cur-assoc</span> <span class="nv">cur-time</span><span class="p">)</span>
          <span class="p">(</span><span class="nb">&gt;</span> <span class="p">(</span><span class="nb">abs</span> <span class="p">(</span><span class="nb">-</span> <span class="nv">cur-time</span> <span class="nv">last-time</span><span class="p">))</span> <span class="nv">delay</span><span class="p">))</span>
      <span class="p">(</span><span class="nb">push</span> <span class="p">(</span><span class="nb">cons</span> <span class="p">(</span><span class="nb">format</span> <span class="s">&quot;%s|%s&quot;</span> <span class="nv">nick</span> <span class="nv">target</span><span class="p">)</span> <span class="nv">cur-time</span><span class="p">)</span> <span class="nv">erc-page-nick-alist</span><span class="p">)</span>
      <span class="no">t</span><span class="p">)</span>
    <span class="p">)</span>
  <span class="p">)</span>
<span class="p">(</span><span class="nb">defun</span> <span class="nv">erc-notify-PRIVMSG</span> <span class="p">(</span><span class="nv">proc</span> <span class="nv">parsed</span><span class="p">)</span>
  <span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">nick</span> <span class="p">(</span><span class="nb">car</span> <span class="p">(</span><span class="nv">erc-parse-user</span> <span class="p">(</span><span class="nv">erc-response.sender</span> <span class="nv">parsed</span><span class="p">))))</span>
	<span class="p">(</span><span class="nv">target</span> <span class="p">(</span><span class="nb">car</span> <span class="p">(</span><span class="nv">erc-response.command-args</span> <span class="nv">parsed</span><span class="p">)))</span>
	<span class="p">(</span><span class="nv">msg</span> <span class="p">(</span><span class="nv">erc-response.contents</span> <span class="nv">parsed</span><span class="p">)))</span>
    <span class="c1">;;Handle true private/direct messages (non channel)</span>
    <span class="p">(</span><span class="nb">when</span> <span class="p">(</span><span class="nb">and</span> <span class="p">(</span><span class="nb">not</span> <span class="p">(</span><span class="nv">erc-is-message-ctcp-and-not-action-p</span> <span class="nv">msg</span><span class="p">))</span>
               <span class="p">(</span><span class="nv">erc-current-nick-p</span> <span class="nv">target</span><span class="p">)</span>
	       <span class="p">(</span><span class="nv">erc-notify-allowed</span> <span class="nv">nick</span> <span class="nv">target</span><span class="p">)</span>
	       <span class="p">)</span>
      <span class="c1">;Do actual notification</span>
      <span class="p">(</span><span class="nv">ding</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">notify-desktop</span> <span class="p">(</span><span class="nb">format</span> <span class="s">&quot;%s - %s&quot;</span> <span class="nv">nick</span>
                              <span class="p">(</span><span class="nv">format-time-string</span> <span class="s">&quot;%b %d %I:%M %p&quot;</span><span class="p">))</span>
                      <span class="nv">msg</span> <span class="mi">0</span> <span class="s">&quot;gnome-emacs&quot;</span><span class="p">)</span>
      <span class="p">)</span>
    <span class="c1">;;Handle channel messages when my nick is mentioned</span>
    <span class="p">(</span><span class="nb">when</span> <span class="p">(</span><span class="nb">and</span> <span class="p">(</span><span class="nb">not</span> <span class="p">(</span><span class="nv">erc-is-message-ctcp-and-not-action-p</span> <span class="nv">msg</span><span class="p">))</span>
               <span class="p">(</span><span class="nv">string-match</span> <span class="p">(</span><span class="nv">erc-current-nick</span><span class="p">)</span> <span class="nv">msg</span><span class="p">)</span>
               <span class="p">(</span><span class="nv">erc-notify-allowed</span> <span class="nv">nick</span> <span class="nv">target</span><span class="p">)</span>
	       <span class="p">)</span>
      <span class="c1">;Do actual notification</span>
      <span class="p">(</span><span class="nv">ding</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">notify-desktop</span> <span class="p">(</span><span class="nb">format</span> <span class="s">&quot;%s - %s&quot;</span> <span class="nv">target</span>
                              <span class="p">(</span><span class="nv">format-time-string</span> <span class="s">&quot;%b %d %I:%M %p&quot;</span><span class="p">))</span>
                      <span class="p">(</span><span class="nb">format</span> <span class="s">&quot;%s: %s&quot;</span> <span class="nv">nick</span> <span class="nv">msg</span><span class="p">)</span> <span class="mi">0</span> <span class="s">&quot;gnome-emacs&quot;</span><span class="p">)</span>
      <span class="p">)</span>
    <span class="p">)</span>
      
  <span class="p">)</span>

<span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;erc-server-PRIVMSG-functions</span> <span class="ss">&#39;erc-notify-PRIVMSG</span><span class="p">)</span>
</pre></div>



]]></content:encoded>
    </item>
  </channel>
</rss>
