eliza.lisp 4.2 KB

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