massmention.lisp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. (in-package :cl-user)
  2. (defpackage chatikbot.plugins.massmention
  3. (:use :cl :chatikbot.common))
  4. (in-package :chatikbot.plugins.massmention)
  5. (defparameter +default-group+ "all")
  6. (defun format-mention-group (group)
  7. (format nil "Але!~{ ~a~^~}" (loop for (user-name) in (db-select "select user_tag from mention_groups where mention_group = ?" group)
  8. collect (format nil "@~a" user-name))))
  9. (defun handle-mass-mention (group)
  10. (bot-send-message (format-mention-group group) :reply-to *message-id*))
  11. (defun add-user-to-group (group mentions)
  12. (apply-to-mentions group mentions #'db/add-user-to-group "Добавил ~{~a~^,~} в группу ~a."))
  13. (defun remove-user-from-group (group mentions)
  14. (apply-to-mentions group mentions #'db/remove-user-from-group "Удалил ~{~a~^,~} из группы ~a."))
  15. (defun apply-to-mentions (group mentions func message)
  16. (handler-case (progn
  17. (loop for name in mentions
  18. do (funcall func group (subseq name 1)))
  19. (bot-send-message (format nil message mentions group)))
  20. (error (e) (progn
  21. (bot-send-message "Не получилось, попробуй еще раз.")
  22. (log:error "~A" e)))))
  23. (defun db/add-user-to-group (group user-tag)
  24. (db-execute "insert or ignore into mention_groups (mention_group, user_tag) VALUES (?, ?)" group user-tag))
  25. (defun db/remove-user-from-group (group user-tag)
  26. (db-execute "delete from mention_groups where mention_group = ? and user_tag = ?" group user-tag))
  27. (def-db-init
  28. (db-execute "create table if not exists mention_groups (mention_group TEXT, user_tag TEXT, primary key (mention_group, user_tag)) without rowid"))
  29. (def-message-cmd-handler handle-cmd-all (:all)
  30. (cond
  31. ((= 1 (length *args*)) (handle-mass-mention (car *args*)))
  32. ((equalp "add" (car *args*)) (add-user-to-group (second *args*) (subseq *args* 2)))
  33. ((equalp "remove" (car *args*)) (remove-user-from-group (second *args*) (subseq *args* 2)))
  34. (:otherwise (handle-mass-mention +default-group+))))