1
0
فهرست منبع

Merge branch 'mass-mention-plugin' of termina1/chatikbot into master

Innocenty Enikeev 5 سال پیش
والد
کامیت
eaf7ce640c
1فایلهای تغییر یافته به همراه44 افزوده شده و 0 حذف شده
  1. 44 0
      plugins/massmention.lisp

+ 44 - 0
plugins/massmention.lisp

@@ -0,0 +1,44 @@
+(in-package :cl-user)
+(defpackage chatikbot.plugins.massmention
+  (:use :cl :chatikbot.common))
+(in-package :chatikbot.plugins.massmention)
+
+(defparameter +default-group+ "all")
+
+(defun format-mention-group (group)
+  (format nil "Але!~{ @~a~^~}" (alexandria:flatten (db-select "select user_tag from mention_groups where mention_group = ? and chat_id = ?" group *chat-id*))))
+
+(defun handle-mass-mention (group)
+  (bot-send-message (format-mention-group group) :reply-to *message-id*))
+
+(defun add-user-to-group (group mentions)
+  (apply-to-mentions group mentions #'db/add-user-to-group "Добавил ~{~a~^,~} в группу ~a."))
+
+(defun remove-user-from-group (group mentions)
+  (apply-to-mentions group mentions #'db/remove-user-from-group "Удалил ~{~a~^,~} из группы ~a."))
+
+(defun apply-to-mentions (group mentions func message)
+  (handler-case (progn
+                 (loop for name in mentions
+                   do (funcall func group (subseq name 1)))
+                 (bot-send-message (format nil message mentions group)))
+                (error (e) (progn
+                            (bot-send-message "Не получилось, попробуй еще раз.")
+                            (log:error "~A" e)))))
+
+(defun db/add-user-to-group (group user-tag)
+  (db-execute "insert or ignore into mention_groups (mention_group, user_tag, chat_id) VALUES (?, ?, ?)" group user-tag *chat-id*))
+
+(defun db/remove-user-from-group (group user-tag)
+  (db-execute "delete from mention_groups where mention_group = ? and user_tag = ? and chat_id = ?" group user-tag *chat-id*))
+
+(def-db-init
+  (db-execute "create table if not exists mention_groups (mention_group TEXT, user_tag TEXT, chat_id INTEGER, primary key (mention_group, user_tag, chat_id)) without rowid"))
+
+
+(def-message-cmd-handler handle-cmd-all (:all)
+  (cond
+    ((= 1 (length *args*)) (handle-mass-mention (car *args*)))
+    ((equalp "add" (car *args*)) (add-user-to-group (second *args*) (subseq *args* 2)))
+    ((equalp "remove" (car *args*)) (remove-user-from-group (second *args*) (subseq *args* 2)))
+    (:otherwise (handle-mass-mention +default-group+))))