2016-05-18 6 views
3

Я использую библиотеку cl-irc для подключения к Slack через шлюз IRC Slack.Ошибка подключения к шлюзу Slack IRC

Однако я получаю следующее сообщение об ошибке, когда я пытаюсь запустить цикл обработки сообщений с read-message-loop:

error while parsing arguments to DESTRUCTURING-BIND: 
    invalid number of elements in 
    ("duncan_bayne" "Welcome" "to" "Slack" "IRC" "Gateway" 
    "server" "[email protected]") 
    to satisfy lambda list 
    (CL-IRC:NICKNAME CL-IRC::WELCOME-MESSAGE): 
    exactly 2 expected, but 8 found 
    [Condition of type SB-KERNEL::ARG-COUNT-ERROR] 

... 

Backtrace: 
    0: ((:METHOD CL-IRC::DEFAULT-HOOK (CL-IRC:IRC-RPL_WELCOME-MESSAGE)) #<CL-IRC:IRC-RPL_WELCOME-MESSAGE irc.tinyspeck.com RPL_WELCOME {1007FC6293}>) [fast-method] 
    1: ((:METHOD CL-IRC::APPLY-TO-HOOKS (T)) #<CL-IRC:IRC-RPL_WELCOME-MESSAGE irc.tinyspeck.com RPL_WELCOME {1007FC6293}>) [fast-method] 
    2: ((:METHOD CL-IRC:IRC-MESSAGE-EVENT (T CL-IRC:IRC-MESSAGE)) #<unavailable argument> #<CL-IRC:IRC-RPL_WELCOME-MESSAGE irc.tinyspeck.com RPL_WELCOME {1007FC6293}>) [fast-method] 
    3: ((:METHOD CL-IRC:READ-MESSAGE (CL-IRC:CONNECTION)) #<CL-IRC:CONNECTION myob.irc.slack.com {10068E8ED3}>) [fast-method] 
    4: ((:METHOD CL-IRC:READ-MESSAGE-LOOP (T)) #<CL-IRC:CONNECTION myob.irc.slack.com {10068E8ED3}>) [fast-method] 
    5: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CL-IRC:READ-MESSAGE-LOOP *CONN*) #<NULL-LEXENV>) 
    6: (EVAL (CL-IRC:READ-MESSAGE-LOOP *CONN*)) 

В то время как в РЕПЛ я вижу:

UNHANDLED-EVENT:3672562852: RPL_MYINFO: irc.tinyspeck.com duncan_bayne "IRC-SLACK gateway" 

Я не уверен, что Я делаю неправильно здесь; Я уверен, что это не мои крючки, потому что проблема сохраняется, даже если я отключу их всех.

Кроме того, я могу использовать соединение как ожидается - скажем, соединение канала и отправка сообщений - при условии, что я не пытаюсь запустить цикл сообщений.

Угадайте, я бы сказал, что Slack отвечает на связь с неожиданным сообщением?

+3

Посмотрите, есть ли у вас какие-либо другие ошибки, если вы измените destructuring-bind (в строке события.lisp 149) на '(nickname & rest welcome-message)'. «ДОБРО ПОЖАЛОВАТЬ-СООБЩЕНИЕ», похоже, не используется ни для чего, поэтому, возможно, разработчик просто забыл об отдыхе, и это случилось с его тестовыми примерами. – jkiiski

+1

Если вы можете исправить это и отправить патч, это здорово. В противном случае, в последний раз, когда я пытался что-то с IRC, я использовал https://github.com/Shinmera/colleen, и он сработал. – coredump

ответ

5

Исправление как предложено @jkilski является изменение CL-ИРЦ, чтобы принять немного необычно (но, вероятно, стандартов compilant?) Ответы от Слэка:

(in-package #:cl-irc) 
(defmethod default-hook ((message irc-rpl_welcome-message)) 
    (with-slots 
     (connection host user arguments) 
     message 
    (destructuring-bind 
      (nickname &rest welcome-message) 
     arguments 
     (setf (user connection) 
      (make-user connection 
         :nickname nickname 
         :hostname host 
         :username user))))) 

(in-package #:irc) 
(defmethod default-hook ((message irc-rpl_namreply-message)) 
    (let* ((connection (connection message))) 
    (destructuring-bind 
      (nick chan-visibility channel &optional names) 
     (arguments message) 
     (declare (ignore nick)) 
     (let ((channel (find-channel connection channel))) 
     (setf (visibility channel) 
       (or (second (assoc chan-visibility 
           '(("=" :public) ("*" :private) ("@" :secret)) 
           :test #'string=)) 
        :unknown)) 
     (unless (has-mode-p channel 'namreply-in-progress) 
      (add-mode channel 'namreply-in-progress 
        (make-instance 'list-value-mode :value-type :user))) 
     (dolist (nickname (tokenize-string names)) 
      (let ((user (find-or-make-user connection 
             (canonicalize-nickname connection 
                   nickname)))) 
      (unless (equal user (user connection)) 
       (add-user connection user) 
       (add-user channel user)) 
      (set-mode channel 'namreply-in-progress user) 
      (let* ((mode-char (getf (nick-prefixes connection) 
            (elt nickname 0))) 
        (mode-name (when mode-char 
           (mode-name-from-char connection 
                channel mode-char)))) 
       (when mode-name 
       (if (has-mode-p channel mode-name) 
        (set-mode channel mode-name user) 
        (set-mode-value (add-mode channel mode-name 
               (make-mode connection 
                 channel mode-name)) 
            user)))))))))) 

Я подал заявку на вступление в DEV рассылки список и вскоре представит патч.

 Смежные вопросы

  • Нет связанных вопросов^_^