You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.4 KiB
125 lines
3.4 KiB
;;; twister.el --- A client for the twister distribute microblogging system |
|
|
|
;; Copyright (C) 2014 Marcel van der Boom <marcel@hsdev.com> |
|
|
|
;;; Commentary: |
|
;; The original idea for this client was to minimally implement: |
|
;; - make it possible to post to twister directly from Emacs; |
|
;; - have autocompletion for 'known users' when posting a message |
|
;; (this probably means defining a 'mode') |
|
|
|
;; During the implementation of the above the following nice-to-have |
|
;; came to mind: |
|
;; - get a timeline in a buffer in emacs |
|
;; - allow for replies |
|
;; - allow for direct messages |
|
;; - manage follow lists |
|
;; - have avatars obviously. (including the checkmark, which is brilliant) |
|
;; |
|
|
|
;; Requirements |
|
;; - json-rpc : https://github.com/mrvdb/elisp-json-rpc |
|
;; This repository is included as submodule |
|
|
|
;; Installation |
|
;; (add-to-list 'load-path "/path/to/twister.el") |
|
;; (require 'twister) |
|
;; (setq twister-user "yournick") |
|
;; |
|
;;; Credits |
|
;; - The elisp-json-rpc library of Christopher Wellons <wellons@nullprogrma.com> |
|
;; does the real work |
|
|
|
;;; Code: |
|
(require 'json-rpc) |
|
|
|
;; Configuration variables |
|
(defgroup twister nil |
|
"Using the twister microblogging system" |
|
:tag "Microblogging" |
|
:group 'applications |
|
) |
|
|
|
(defcustom twister-user "twister_user" |
|
"The nickname you use on your twister instance. When posting |
|
messages, this will be the name used" |
|
:type 'string |
|
:group 'twister) |
|
|
|
(defcustom twister-rpcuser "user" |
|
"The RPC username configured in the twister.conf file" |
|
:type 'string |
|
:group 'twister) |
|
|
|
(defcustom twister-rpcpassword "pwd" |
|
"The RPC password for the `twister-rpcuser configured in the |
|
twister.conf file" |
|
:type 'string |
|
:group 'twitter) |
|
|
|
(defcustom twister-host "localhost" |
|
"Host where the twister daemon runs" |
|
:type 'string |
|
:group 'twister) |
|
|
|
(defcustom twister-port 28332 |
|
"Port on which twister daemon runs and serves RPC commands" |
|
:type 'integer |
|
:group 'twister) |
|
|
|
;; Preliminary convention |
|
;; tw-* methods -> sorta private for now, don't use directly |
|
;; twister-* methods -> public API |
|
(defun twister-rpc (method &rest params) |
|
"Wrapper for the json-rpc method for twister use. |
|
The connection is closed afer each use. This is not necessarily |
|
the most effective. METHOD is the RPC method we are calling |
|
while PARAMS contain the rest of the parameters." |
|
|
|
(let* ((twisterd (json-rpc-connect |
|
twister-host twister-port |
|
twister-rpcuser twister-rpcpassword)) |
|
|
|
(result (apply 'json-rpc twisterd method params))) |
|
(json-rpc-close twisterd) |
|
result)) |
|
|
|
(defun tw-get-last-post(user) |
|
"Get the last post of a user" |
|
(let (obj (json-new-object)) |
|
(twister-rpc "getposts" 1 |
|
(vector (json-add-to-object obj "username" user))))) |
|
|
|
(defun tw-get-next-k(user) |
|
"Get the next 'k' for a user; this is a post sequence" |
|
;; Data structure visible here: http://twister.net.co/?page_id=21 |
|
(+ 1 (plist-get |
|
(plist-get |
|
(elt (tw-get-last-post user) 0) |
|
:userpost) :k))) |
|
|
|
(defun twister-post(msg) |
|
"Post msg to the configured twister daemon" |
|
(interactive) |
|
|
|
(twister-rpc "newpostmsg" |
|
twister-user |
|
(tw-get-next-k twister-user) msg)) |
|
|
|
(defun twister-post-region (begin end) |
|
"Post the current region to twister" |
|
(interactive "r") |
|
|
|
(twister-post |
|
(buffer-substring-no-properties begin end))) |
|
|
|
(defun twister-post-buffer() |
|
"Post the current buffer to twister" |
|
(interactive) |
|
|
|
(twister-post-region |
|
(point-min point-max))) |
|
|
|
|
|
(provide 'twister) |
|
;;; twister.el ends here
|
|
|