yuya373 / emacs-slack

slack client for emacs
1.11k stars 117 forks source link

Slack groups cause frequent "Unbound slot" errors #563

Open ieure opened 2 years ago

ieure commented 2 years ago

Describe the bug

I see regular errors:

error in process sentinel: Unbound slot: slack-group, "#<slack-group slack-group-156f878f1a74>", id, oref

To Reproduce Steps to reproduce the behavior:

I'm not sure. It happens intermittently & seems to depend on what others are doing on Slack, rather than what I'm doing.

Backtrace

Debugger entered--Lisp error: (unbound-slot slack-group "#<slack-group slack-group-156f94d0f02e>" id oref)
  signal(unbound-slot (slack-group "#<slack-group slack-group-156f94d0f02e>" id oref))
  #f(compiled-function (object class slot-name fn) "Slot unbound is invoked during an attempt to reference an unbound slot.\nOBJECT is the instance of the object being reference.  CLASS is the\nclass of OBJECT, and SLOT-NAME is the offending slot.  This function\nthrows the signal `unbound-slot'.  You can overload this function and\nreturn the value to use in place of the unbound value.\nArgument FN is the function signaling this error.\nUse `slot-boundp' to determine if a slot is bound or not.\n\nIn CLOS, the argument list is (CLASS OBJECT SLOT-NAME), but\nEIEIO can only dispatch on the first argument, so the first two are swapped." #<bytecode 0x493175e13ca1128>)(#<slack-group slack-group-156f94d0f02e> #s(eieio--class :name slack-group :docstring nil :parents (#s(eieio--class :name slack-room :docstring nil :parents nil :slots [... ... ... ... ... ... ...] :index-table #<hash-table eq 7/65 0x156f831b27c1> :children (slack-search-result slack-im slack-group) :initarg-tuples (... ... ... ... ...) :class-slots [] :class-allocation-values [] :default-object-cache #<slack-room slack-room-156f831b33bc> :options (:custom-groups nil))) :slots [#s(cl-slot-descriptor :name id :initform 'eieio--unbound :type t :props nil) #s(cl-slot-descriptor :name created :initform 'eieio--unbound :type t :props nil) #s(cl-slot-descriptor :name unread-count :initform 0 :type integer :props nil) #s(cl-slot-descriptor :name unread-count-display :initform 0 :type integer :props nil) #s(cl-slot-descriptor :name message-ids :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name messages :initform (make-hash-table :test ... :size 300) :type t :props nil) #s(cl-slot-descriptor :name last-read :initform "0" :type string :props nil) #s(cl-slot-descriptor :name name :initform "" :type string :props nil) #s(cl-slot-descriptor :name name-normalized :initform "" :type string :props nil) #s(cl-slot-descriptor :name num-members :initform 0 :type t :props nil) #s(cl-slot-descriptor :name creator :initform nil :type (or null string) :props nil) #s(cl-slot-descriptor :name is-archived :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-channel :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-ext-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-pending-ext-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-general :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-group :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-im :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-member :initform t :type boolean :props nil) #s(cl-slot-descriptor :name is-mpim :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-org-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-private :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-read-only :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name parent-conversation :initform nil :type t :props nil) #s(cl-slot-descriptor :name pending-shared :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name previous-names :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name purpose :initform nil :type t :props nil) #s(cl-slot-descriptor :name shared-team-ids :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name topic :initform nil :type t :props nil) #s(cl-slot-descriptor :name members :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name members-loaded-p :initform nil :type boolean :props nil)] :index-table #<hash-table eq 32/65 0x156f831dc105> :children (slack-channel) :initarg-tuples ((:id . id) (:created . created) (:unread_count . unread-count) (:unread_count_display . unread-count-display) (:last_read . last-read) (:name . name) (:name_normalized . name-normalized) (:num_members . num-members) (:creator . creator) (:is_archived . is-archived) (:is_channel . is-channel) (:is_ext_shared . is-ext-shared) (:is_pending_ext_shared . is-pending-ext-shared) (:is_general . is-general) (:is_group . is-group) (:is_im . is-im) (:is_member . is-member) (:is_mpim . is-mpim) (:is_org_shared . is-org-shared) (:is_private . is-private) (:is_read_only . is-read-only) (:is_shared . is-shared) (:parent_conversation . parent-conversation) (:pending_shared . pending-shared) (:previous_names . previous-names) (:purpose . purpose) (:shared_team_ids . shared-team-ids) (:topic . topic) (:members . members)) :class-slots [] :class-allocation-values [] :default-object-cache #<slack-group slack-group-156f82c786f0> :options (:custom-groups nil)) id oref)
  apply(#f(compiled-function (object class slot-name fn) "Slot unbound is invoked during an attempt to reference an unbound slot.\nOBJECT is the instance of the object being reference.  CLASS is the\nclass of OBJECT, and SLOT-NAME is the offending slot.  This function\nthrows the signal `unbound-slot'.  You can overload this function and\nreturn the value to use in place of the unbound value.\nArgument FN is the function signaling this error.\nUse `slot-boundp' to determine if a slot is bound or not.\n\nIn CLOS, the argument list is (CLASS OBJECT SLOT-NAME), but\nEIEIO can only dispatch on the first argument, so the first two are swapped." #<bytecode 0x493175e13ca1128>) #<slack-group slack-group-156f94d0f02e> (#s(eieio--class :name slack-group :docstring nil :parents (#s(eieio--class :name slack-room :docstring nil :parents nil :slots [... ... ... ... ... ... ...] :index-table #<hash-table eq 7/65 0x156f831b27c1> :children (slack-search-result slack-im slack-group) :initarg-tuples (... ... ... ... ...) :class-slots [] :class-allocation-values [] :default-object-cache #<slack-room slack-room-156f831b33bc> :options (:custom-groups nil))) :slots [#s(cl-slot-descriptor :name id :initform 'eieio--unbound :type t :props nil) #s(cl-slot-descriptor :name created :initform 'eieio--unbound :type t :props nil) #s(cl-slot-descriptor :name unread-count :initform 0 :type integer :props nil) #s(cl-slot-descriptor :name unread-count-display :initform 0 :type integer :props nil) #s(cl-slot-descriptor :name message-ids :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name messages :initform (make-hash-table :test ... :size 300) :type t :props nil) #s(cl-slot-descriptor :name last-read :initform "0" :type string :props nil) #s(cl-slot-descriptor :name name :initform "" :type string :props nil) #s(cl-slot-descriptor :name name-normalized :initform "" :type string :props nil) #s(cl-slot-descriptor :name num-members :initform 0 :type t :props nil) #s(cl-slot-descriptor :name creator :initform nil :type (or null string) :props nil) #s(cl-slot-descriptor :name is-archived :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-channel :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-ext-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-pending-ext-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-general :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-group :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-im :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-member :initform t :type boolean :props nil) #s(cl-slot-descriptor :name is-mpim :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-org-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-private :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-read-only :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name parent-conversation :initform nil :type t :props nil) #s(cl-slot-descriptor :name pending-shared :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name previous-names :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name purpose :initform nil :type t :props nil) #s(cl-slot-descriptor :name shared-team-ids :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name topic :initform nil :type t :props nil) #s(cl-slot-descriptor :name members :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name members-loaded-p :initform nil :type boolean :props nil)] :index-table #<hash-table eq 32/65 0x156f831dc105> :children (slack-channel) :initarg-tuples ((:id . id) (:created . created) (:unread_count . unread-count) (:unread_count_display . unread-count-display) (:last_read . last-read) (:name . name) (:name_normalized . name-normalized) (:num_members . num-members) (:creator . creator) (:is_archived . is-archived) (:is_channel . is-channel) (:is_ext_shared . is-ext-shared) (:is_pending_ext_shared . is-pending-ext-shared) (:is_general . is-general) (:is_group . is-group) (:is_im . is-im) (:is_member . is-member) (:is_mpim . is-mpim) (:is_org_shared . is-org-shared) (:is_private . is-private) (:is_read_only . is-read-only) (:is_shared . is-shared) (:parent_conversation . parent-conversation) (:pending_shared . pending-shared) (:previous_names . previous-names) (:purpose . purpose) (:shared_team_ids . shared-team-ids) (:topic . topic) (:members . members)) :class-slots [] :class-allocation-values [] :default-object-cache #<slack-group slack-group-156f82c786f0> :options (:custom-groups nil)) id oref))
  slot-unbound(#<slack-group slack-group-156f94d0f02e> #s(eieio--class :name slack-group :docstring nil :parents (#s(eieio--class :name slack-room :docstring nil :parents nil :slots [#s(cl-slot-descriptor :name id :initform 'eieio--unbound :type t :props nil) #s(cl-slot-descriptor :name created :initform 'eieio--unbound :type t :props nil) #s(cl-slot-descriptor :name unread-count :initform 0 :type integer :props nil) #s(cl-slot-descriptor :name unread-count-display :initform 0 :type integer :props nil) #s(cl-slot-descriptor :name message-ids :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name messages :initform (make-hash-table :test 'equal :size 300) :type t :props nil) #s(cl-slot-descriptor :name last-read :initform "0" :type string :props nil)] :index-table #<hash-table eq 7/65 0x156f831b27c1> :children (slack-search-result slack-im slack-group) :initarg-tuples ((:id . id) (:created . created) (:unread_count . unread-count) (:unread_count_display . unread-count-display) (:last_read . last-read)) :class-slots [] :class-allocation-values [] :default-object-cache #<slack-room slack-room-156f831b33bc> :options (:custom-groups nil))) :slots [#s(cl-slot-descriptor :name id :initform 'eieio--unbound :type t :props nil) #s(cl-slot-descriptor :name created :initform 'eieio--unbound :type t :props nil) #s(cl-slot-descriptor :name unread-count :initform 0 :type integer :props nil) #s(cl-slot-descriptor :name unread-count-display :initform 0 :type integer :props nil) #s(cl-slot-descriptor :name message-ids :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name messages :initform (make-hash-table :test 'equal :size 300) :type t :props nil) #s(cl-slot-descriptor :name last-read :initform "0" :type string :props nil) #s(cl-slot-descriptor :name name :initform "" :type string :props nil) #s(cl-slot-descriptor :name name-normalized :initform "" :type string :props nil) #s(cl-slot-descriptor :name num-members :initform 0 :type t :props nil) #s(cl-slot-descriptor :name creator :initform nil :type (or null string) :props nil) #s(cl-slot-descriptor :name is-archived :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-channel :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-ext-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-pending-ext-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-general :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-group :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-im :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-member :initform t :type boolean :props nil) #s(cl-slot-descriptor :name is-mpim :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-org-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-private :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-read-only :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name is-shared :initform nil :type boolean :props nil) #s(cl-slot-descriptor :name parent-conversation :initform nil :type t :props nil) #s(cl-slot-descriptor :name pending-shared :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name previous-names :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name purpose :initform nil :type t :props nil) #s(cl-slot-descriptor :name shared-team-ids :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name topic :initform nil :type t :props nil) #s(cl-slot-descriptor :name members :initform 'nil :type list :props nil) #s(cl-slot-descriptor :name members-loaded-p :initform nil :type boolean :props nil)] :index-table #<hash-table eq 32/65 0x156f831dc105> :children (slack-channel) :initarg-tuples ((:id . id) (:created . created) (:unread_count . unread-count) (:unread_count_display . unread-count-display) (:last_read . last-read) (:name . name) (:name_normalized . name-normalized) (:num_members . num-members) (:creator . creator) (:is_archived . is-archived) (:is_channel . is-channel) (:is_ext_shared . is-ext-shared) (:is_pending_ext_shared . is-pending-ext-shared) (:is_general . is-general) (:is_group . is-group) (:is_im . is-im) (:is_member . is-member) (:is_mpim . is-mpim) (:is_org_shared . is-org-shared) (:is_private . is-private) (:is_read_only . is-read-only) (:is_shared . is-shared) (:parent_conversation . parent-conversation) (:pending_shared . pending-shared) (:previous_names . previous-names) (:purpose . purpose) (:shared_team_ids . shared-team-ids) (:topic . topic) (:members . members)) :class-slots [] :class-allocation-values [] :default-object-cache #<slack-group slack-group-156f82c786f0> :options (:custom-groups nil)) id oref)
  eieio-barf-if-slot-unbound(eieio--unbound #<slack-group slack-group-156f94d0f02e> id oref)
  eieio-oref(#<slack-group slack-group-156f94d0f02e> id)
  #f(compiled-function (this groups) #<bytecode 0x11d378621b3cf249>)(#<slack-team slack-team-156f836d0380> (#<slack-group slack-group-156f94d0f02e>))
  apply(#f(compiled-function (this groups) #<bytecode 0x11d378621b3cf249>) #<slack-team slack-team-156f836d0380> (#<slack-group slack-group-156f94d0f02e>))
  slack-team-set-groups(#<slack-team slack-team-156f836d0380> (#<slack-group slack-group-156f94d0f02e>))
  #f(compiled-function (this room) #<bytecode 0x131cb70b12aa1dc5>)(#<slack-team slack-team-156f836d0380> #<slack-group slack-group-156f94d0f02e>)
  apply(#f(compiled-function (this room) #<bytecode 0x131cb70b12aa1dc5>) #<slack-team slack-team-156f836d0380> #<slack-group slack-group-156f94d0f02e>)
  slack-team-set-room(#<slack-team slack-team-156f836d0380> #<slack-group slack-group-156f94d0f02e>)
  #f(compiled-function (&rest rest) #<bytecode -0xf5fa221f5704805>)(:data (:ok t :history ... :users ... :bots nil :self ... :channels nil :emojis ... ...))
  #f(compiled-function (&rest rest) #<bytecode -0xd4b81cf99b93bab>)(:data (:ok t :history ... :users ... :bots nil :self ... :channels nil :emojis ... ...) :symbol-status success :error-thrown nil :response #s(request-response :status-code 200 :history nil :data ... :error-thrown nil :symbol-status success :url "https://slack...." :done-p nil :settings ... :-buffer #<killed buffer> :-raw-header "HTTP/2 200 \nda..." :-timer nil :-backend curl))
  apply(#f(compiled-function (&rest rest) #<bytecode -0xd4b81cf99b93bab>) (:data ... :symbol-status success :error-thrown nil :response ...))
  request--callback(#<killed buffer> :type "POST" :sync nil :params (... ... ... ... nil nil nil nil) :data nil :files nil :headers (... ...) :parser ...)
  apply(request--callback #<killed buffer> (:type "POST" :sync nil :params ... :data nil :files nil :headers ... :parser slack-parse ...))
  request--curl-callback("https://slack.com/api/conversations.view?name=C039..." #<process request curl<1>> "finished\n")
  apply(request--curl-callback ("https://slack.com/api/conversations.view?name=C039..." #<process request curl<1>> "finished\n"))
  #f(compiled-function (&rest args2) #<bytecode -0xf8e2796307220c5>)(#<process request curl<1>> "finished\n")

Expected behavior Emacs-Slack shouldn't be accessing unbound slots.

Environment:

Additional context

It might be related to being added to a team, and/or receiving a team mention.