Skip to content

Instantly share code, notes, and snippets.

@magnars
Created November 24, 2012 21:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save magnars/4141489 to your computer and use it in GitHub Desktop.
Save magnars/4141489 to your computer and use it in GitHub Desktop.
Emacs bot til Kodemakers irc-kanal
(require 's)
(require 'cl)
(require 'assoc)
(defvar kmbot--file ".kmbot-memory.el")
(defvar kmbot--definitions nil)
(defun kmbot--dump-list (list-symbol)
"Insert (setq LIST-SYMBOL LIST-VALUE) to current buffer."
(let ((value (symbol-value list-symbol)))
(insert "(setq " (symbol-name list-symbol) "\n"
" '(")
(newline-and-indent)
(mapc #'(lambda (cmd) (insert (format "%S" cmd)) (newline-and-indent))
value)
(insert "))")
(newline)))
(defun kmbot--persist (ret)
(with-temp-file kmbot--file
(emacs-lisp-mode)
(insert ";; This file is automatically generated by kmbot.")
(newline)
(insert ";; It stores all there is that kmbot knows about the world.")
(newline)
(newline)
(kmbot--dump-list 'kmbot--definitions))
ret)
(defun kmbot--username (string)
(when (string-match "^<\\(.+?\\)> " string)
(match-string-no-properties 1 string)))
(defun kmbot--message (string)
(when (string-match "^<.+?> \\(.+\\)$" string)
(match-string-no-properties 1 string)))
(defun kmbot--send (message)
(if (listp message)
(mapc 'kmbot--send message)
(with-current-buffer "#kodemaker"
(goto-char (point-max))
(insert message)
(erc-send-current-line))))
(defun kmbot--random-answer ()
(let ((answers '("Ja." "Nei." "Definitivt." "Såklart ikke!" "Jeg ville ikke satsa på det." "Mine kilder sier nei." "Det ser ikke så bra ut." "Spør igjen senere." "Tegnene tyder på ja." "Utvilsomt." "Det er sikkert og visst." "Det er snickers og twist." "Høyst sannsynlig." "Er du sikker på at du vil vite det?")))
(nth (random (length answers)) answers)))
(defun kmbot--random-soothe ()
(let ((soothe '("/me gir %s en pakke valium og en kosebamse." "/me gir %s en ukomfortabelt lang klem." "/me trykker mute-knappen gjentatte ganger, uten at det hjelper stort." "/me gjemmer hodet under en pute." "/me tar på Bose Quiet Comfort for å stenge bråket ute." "/me henter en kopp kaffe til %s." "/me peker megetsigende på stillevognskiltet.")))
(nth (random (length soothe)) soothe)))
(defun kmbot--random-definition-prefix ()
(let ((prefix '("Jeg hørte at %s er %s" "%s er, liksom, %s" "Etter hukommelsen så er %s %s")))
(nth (random (length prefix)) prefix)))
(defun kmbot--random-definition-ack ()
(let ((msg '("Det skal jeg prøve å huske." "Den er roger." "Mottatt." "Hvis du sier det så." "Jeg skriver det ned jeg, så husker jeg det nok.")))
(nth (random (length msg)) msg)))
(defun kmbot--indexify (ss)
(if (not ss)
nil
(if (not (cdr ss))
(list (format "%s." (s-chop-suffix "." (car ss))))
(let ((index 0)
(result nil))
(while ss
(setq result (cons (format "[%s] %s%s"
index
(s-chop-suffix "." (car ss))
(if (cdr ss) "," "."))
result))
(setq index (1+ index))
(setq ss (cdr ss)))
(nreverse result)))))
(defun kmbot--without (seq n)
(if (> n (length seq))
seq
(append (subseq seq 0 n) (subseq seq (1+ n)))))
(defun kmbot--create-definition (key value)
(if (aget kmbot--definitions key)
(format "Du, %s er allerede definert - legg til med 'er også'." key)
(aput 'kmbot--definitions key (list value))
(kmbot--random-definition-ack)))
(defun kmbot--rm-definition (key index)
(if (and index (stringp index))
(setq index (string-to-number index)))
(let ((definitions (aget kmbot--definitions key)))
(if (not definitions)
"Det har jeg tydeligvis allerede glemt."
(if (not index)
(if (cdr definitions)
"Du må spesifisere hvilken index du vil fjerne."
(adelete 'kmbot--definitions key)
"Borte!")
(aput 'kmbot--definitions key (kmbot--without definitions index))
"Ja, da er den borte."))))
(defun kmbot--add-definition (key value)
(let ((definitions (aget kmbot--definitions key)))
(if (not definitions)
(kmbot--create-definition key value)
(if (member value definitions)
"Ja, det visste jeg i grunn allerede."
(aput 'kmbot--definitions key (append definitions (list value)))
(kmbot--random-definition-ack)))))
(defun kmbot--regurgitate-definitions (key)
(let ((definitions (kmbot--indexify (aget kmbot--definitions key)))
(prefix (kmbot--random-definition-prefix)))
(when definitions
(cons (format prefix key (car definitions))
(cdr definitions)))))
(defun kmbot--get-response (message username)
(cond
((s-equals? "botsnack" message)
(format "Steike, takker %s! *gnafs gnafs gnafs*" username))
((s-equals? "@" message)
"IRC konvensjonen for å adressere noen er 'augustl: macen din ser rar ut', ikke '@augustl macen din ser rar ut'")
((string-match "glem \\([^ ]+\\)\\( [0-9]+\\)?" message)
(kmbot--persist (kmbot--rm-definition (match-string 1 message) (match-string 2 message))))
((string-match "\\([^ ]+\\) er også \\(.+\\)" message)
(kmbot--persist (kmbot--add-definition (match-string 1 message) (match-string 2 message))))
((string-match "\\([^ ]+\\) er \\(.+\\)" message)
(kmbot--persist (kmbot--create-definition (match-string 1 message) (match-string 2 message))))
(t (or (kmbot--regurgitate-definitions message)
(concat "Ehhm... " (kmbot--random-answer))))
))
(defun kmbot-listen-up (string)
(let ((username (kmbot--username string))
(message (kmbot--message string)))
(cond
((s-starts-with? "," message)
(kmbot--send (kmbot--get-response (substring message 1) username)))
((s-ends-with? "??" message)
(kmbot--send (kmbot--random-answer)))
((s-ends-with? "!!" message)
(kmbot--send (format (kmbot--random-soothe) username)))
)))
(defun kmbot-start ()
(interactive)
(unless (get-buffer "#kodemaker")
(error "Logg inn på erc og join #kodemaker først."))
(load kmbot--file t)
(add-hook 'erc-insert-pre-hook 'kmbot-listen-up))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment