[トップ][一覧][最近の更新]

編集履歴:差分

2008/12/15 10:49:21 JSTと2008/12/15 10:50:38 JST間のChicken/Scheme/2008/12/15/loudmouth.eggの変更箇所

編集履歴ページに戻る

  XMPPクライアントをまっさらのschemeで書くのに挫折したので、
  かわりに[http://www.loudmouth-project.org/ loudmouth]をchickenから呼べるようにした。
  
  - [[files:egg/loudmouth.egg]]
  
  マニュアルはないけど、[http://www.loudmouth-project.org/docs/api/loudmouth/ch01.html C API]を移しかえただけなので、
  サンプルのloudmouthのコードそのまま持ってくれば動く。
  
  コールバックの形式だけは普通にforeign-lambdaできないので、
  ヘルパーマクロを使って、
  
  {{{
  (lm:define-message-handler
   presence-cb
   (conn mes data)
-  (let ((node (lm:message-node? mes))
-        (send-jid (slot-ref microblog:server-config 'send)))
-    (lm:debug-print "presence"
-                    (lm:message-node-to-string node))
-    (lm-ext:send-online conn send-jid)
-    (microblog->xmpp conn send-jid)
-    *LM-HANDLER-RESULT-REMOVE-MESSAGE*))
+  (begin ここにコールバック関数))
  
  (lm:call-with-message-handler
          presence-cb #f #f
          (lambda (handler)
            (lm:connection-register-message-handler conn handler
                                                    *LM-MESSAGE-TYPE-PRESENCE*
                                                    *LM-HANDLER-PRIORITY-LAST*)))
  }}}
  
  みたいに書く。
  
  コールバックの第一引数がvoid*なものだから、
  データの移送はかなり面倒なことに。
  これをscheme-objectにすると、gcされちゃう。
  
  とりあえずこれを使ったtwitter->xmppボットは安定動作しているようなので、
  公開してみる。
  
  CLだとcl-xmppなんてのがあって、
  asdf-installで簡単インストールできたりしてちょっと羨ましかったり。