The following is code that implements a simple robot for ERC. Four things are required:
The first of these, the lisp, is available from http://www.hollytree-house.co.uk/dme/emacs/erc-robot.el. ← This link is dead Aurélien.
The code to hook the robot into ERC is simple: (load-library “erc-robot”) (add-hook ‘erc-server-PRIVMSG-hook ‘erc-robot-remote t) (add-hook ‘erc-send-completed-hook ‘erc-robot-local t)
Finally, you must declare some commands that the robot can execute. Each of these takes the form of a tuple with three elements:
Here’s an example that I use:
(setq erc-robot-commands
'(
("cmds" t (lambda (args)
(concat "commands available: "
(mapconcat
(lambda (e)
(car e))
erc-robot-commands " "))))
("hello" t (lambda (args) "hello to you too !"))
("zippy" t (lambda (args)
(erc-replace-regexp-in-string "\n" " " (yow))))
("music" t (lambda (args)
(concat "now playing: "
(let ((track (dme:now-playing)))
(if track
track
"nothing.")))))
("echo" t (lambda (args) args))
("doctor" t erc-doctor)
("version" t (lambda (args) (erc-version)))
("fortune" t (lambda (args)
(require 'fortune)
(fortune-in-buffer nil)
(let ((f (get-buffer fortune-buffer-name)))
(if f
(progn
(set-buffer f)
(erc-replace-regexp-in-string
"\n" " " (buffer-substring (point-min)
(point-max))))
"no fortunes!"))))
("diary" t (lambda (args)
(require 'calendar)
(let ((entries (mapconcat
'(lambda (l) (cadr l))
(let ((diary-display-hook '(lambda () nil)))
(list-diary-entries (calendar-current-date) 1))
"\n")))
(if (string-equal "" entries)
"Nothing."
entries))))
; dangerous !
("eval" nil (lambda (args)
(condition-case err
(pp-to-string (eval (read args)))
(error
(error-message-string err)))))
; dangerous !
("sh" nil (lambda (args)
(shell-command-to-string args)))
))
Command functions are passed a single string argument which is the remainder of the command line.
When talking to the robot, use the following format: nick: !command arg1 arg2 … where:
So, based on the example above, I might ask my own robot for a Zippy quote: ERC> dme: !zippy <dme> dme: Do I have a lifestyle yet?
Have fun, and please let me (DavidEdmondson) know if you do anything interesting with the robot.
Hey, this is really cool. I’m using it for MallowBot. I had to comment out two small parts of erc-robot.el to make it work on my system. Specifically, the call to ‘erc-format-timestamp’ on line 166, and the call to ‘erc-log’ on line 155.
Also, don’t you think it should probably (require ‘erc)? (and erc-stamp, for the timestamp thingy to work)
Updated 2002-11-28 to work with the current CVS version of EmacsIRCClient. The patches mentioned above for ‘erc-format-timestamp’ and ‘erc-log’ should no longer be required.
I’m using this as a template for writing an AIM bot. I’m using BitlBee + the EmacsIRCClient + erc-robot. I had to make a change to the command processing. Because of how InstantMessaging works, I’m assuming everything addressed to the bot is a command. Therefore, I removed the necessity for the “!” preceeding the command. You might want to add a variable for something like erc-robot-command-prefix that gets regexp-quoted.
My ultimate goal is to write an AIM → b2 blog gateway. I’ll end up using xml-rpc to interface the b2 server engine.
– LathI - 02 Dec 2002
Thanks for erc-robot.el, it is awesome. I used it for ErBot. – DeepakGoel
As the source doesn’t seem to be on the net anymore, I’ll post it here. – OlliH?
(add-hook ‘erc-server-PRIVMSG-hook ‘erc-robot-remote t) should be (add-hook ‘erc-server-PRIVMSG-functions ‘erc-robot-remote t) in erc 5.3 ? – ChangyingLi?