1
0

huiza.lisp 4.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. (in-package #:chatikbot)
  2. ;; Load pattern matching facility
  3. (load "patmatch.lisp")
  4. (defparameter *fuck-off*
  5. '((отъебись) (мне похуй) (ебаный ты нахуй!))
  6. "Fuck-off responses")
  7. (defun goto-p (input) (member input '(иди пошел вали)))
  8. (defun prep-p (i) (member i '(в на)))
  9. (defun dirty-p (i) (member i '(лох хуй мудак ебалай пидор сука уебок мудило еблан говнюк уебище ебантяй пидрила)))
  10. (defparameter *eliza-rules*
  11. `(
  12. (((?is ?g goto-p) (?is ?prep prep-p) (?* ?х))
  13. (а самому не пойти ?prep ?х ?) (мамку свою посылай ?prep ?х) (покомандуй тут еще) ,@*fuck-off*)
  14. (((?is ?g goto-p) (?* ?x))
  15. (сам иди ?x) (покомандуй тут еще) ,@*fuck-off*)
  16. (((?* ?a) ты (?* ?x))
  17. (сам ?x) (сам ты ?x) (а по ебалу?) (сейчас мы разберемся кто еще тут ?x) ,@*fuck-off*)
  18. (((?is ?x dirty-p))
  19. (сам ?x) (сам ты ?x) (а по ебалу?) (сейчас мы разберемся кто еще тут ?x))
  20. (((?* ?a) (?or хуита хуета хуйня лажа говно бред) (?* ?b))
  21. ("вам, сударь," не угодить) (и что?) (бывает) (мопед не мой) (сам получше придумывай) ,@*fuck-off*)
  22. (((?* ?a) (?or норм хорошо молодец ниплохо ниплоха ниеплоха) (?* ?b))
  23. (спасибо) (я старался) (как себе) ,@*fuck-off*)
  24. (((?or спасибо) (?* ?x))
  25. (всё для вас) (пожалуйста) (на здоровье) ,@*fuck-off*)
  26. (((?* ?x) (?or уровень) (?* ?y))
  27. (в жопу себе его засунь) (хуюровень) ,@*fuck-off*)
  28. (((?* ?a) (?is ?x ,(lambda (i) (and (symbolp i) (search "ХАХА" (symbol-name i))))) (?* ?b))
  29. (очень смешно) (клоунов тут нашел?) (посмейся мне еще) ,@*fuck-off*)
  30. (((?* x))
  31. (:text . "И чё?")
  32. (:text . "Сам-то понял?")
  33. (:text . "Ну хуй знает")
  34. (:text . "Бля...")
  35. (:text . "В душе не ебу")
  36. (:text . "Мне похуй")
  37. (:text . "Eбаный ты нахуй")
  38. (:text . "Отъебись")
  39. (:sticker . "BQADAgADFAADOoERAAGoLKS_Vgs6GgI") ;; ЭЭ епта Чо
  40. (:sticker . "BQADAgADGQADOoERAAFDXJisD4fClgI") ;; Ну чё ты несёшь
  41. (:sticker . "BQADAgADFwADOoERAAHCw-fBiFjACgI") ;; А у меня собака, я не могу
  42. (:sticker . "BQADAgADEgADOoERAAFtU3uF9HvtQgI") ;; Бухнём?
  43. (:sticker . "BQADBAADQAEAAnscSQABqWydSKTnASoC"))))
  44. (defun punctuation-p (char)
  45. (find char ".,;:'!?#-()\\\""))
  46. (defun read-from-string-no-punct (input)
  47. "Read from an input string, ignoring punctuation."
  48. (let ((*package* (find-package 'chatikbot)))
  49. (read-from-string
  50. (concatenate 'string "(" (substitute-if #\space #'punctuation-p input) ")"))))
  51. (defun print-with-spaces (list)
  52. (format nil "~@(~{~a~^ ~}~)" list))
  53. (defun switch-viewpoint (words)
  54. "Change I to you and vice versa, and so on."
  55. (sublis '((I . you) (you . I) (me . you) (am . are)
  56. (я ты) (ты я) (меня тебя) (тебя меня))
  57. words))
  58. (defun use-eliza-rules (input)
  59. "Find some rule with which to transform the input."
  60. (rule-based-translator input *eliza-rules*
  61. :action #'(lambda (bindings responses)
  62. (sublis (switch-viewpoint bindings)
  63. (random-elt responses)))))
  64. (defun eliza (input)
  65. (let ((r (use-eliza-rules
  66. (read-from-string-no-punct input))))
  67. (cond
  68. ((null r) nil)
  69. ((and (consp (car r)) (eq 'function (caar r)))
  70. (apply (cadar r) (cdr r)))
  71. ((keywordp (car r)) r)
  72. (t (print-with-spaces (flatten r))))))
  73. (defun send-dont-understand (chat-id &optional text reply-id)
  74. (let ((resp (eliza text)))
  75. (log:info text resp)
  76. (when resp
  77. (send-response chat-id resp reply-id))))
  78. (defun handle-unknown-message (message)
  79. (let ((chat-id (aget "id" (aget "chat" message)))
  80. (text (aget "text" message)))
  81. (log:info "handle-unknown-message" message)
  82. (send-dont-understand chat-id (preprocess-input text))
  83. t))
  84. (add-hook :update-message 'handle-unknown-message t)