yuya373 / emacs-slack

slack client for emacs
1.12k stars 117 forks source link

Unbound slot: slack-team, "#<slack-team slack-team>", ims, oref #156

Closed jgkamat closed 4 years ago

jgkamat commented 7 years ago

My setup was working for me perfectly a few days ago, and it broke today. I tried reverting to a known good configuration and it still didn't work, so this is probably a change in the slack api. I'm not sure if anyone else is seeing this. I use two slack teams, but only one of them is affected right now. Maybe slack is doing a slow rollout?

The error appears when I try to select a channel, running slack-start seems to work fine, but slack-channel-select throws this error. I've removed my tokens/slack team name.

Debugger entered--Lisp error: (unbound-slot slack-team "#<slack-team slack-team>" ims oref)
  signal(unbound-slot (slack-team "#<slack-team slack-team>" ims oref))
  #[1028 "\300\301\302!\303!F\"\207" [signal unbound-slot eieio-class-name eieio-object-name] 10 "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.\n\n(fn OBJECT CLASS SLOT-NAME FN)"]([eieio-class-tag--slack-team "<MY_SLACK_TEAM_ID>" "<MY_TOKEN>" "<MY_CLIENT_ID>" "<MY_CLIENT_SECRET>" "<MY_TEAM_NAME>" unbound unbound unbound unbound unbound unbound unbound nil nil unbound unbound unbound nil nil nil 20 t nil 10 0 360 nil nil #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ( ...)) 0 nil nil nil nil nil unbound [eieio-class-tag--slack-team-threads nil t 0 0]] [cl-struct-eieio--class slack-team nil nil [[cl-struct-cl-slot-descriptor id unbound t nil] [cl-struct-cl-slot-descriptor token nil t nil] [cl-struct-cl-slot-descriptor client-id unbound t nil] [cl-struct-cl-slot-descriptor client-secret unbound t nil] [cl-struct-cl-slot-descriptor name nil t nil] [cl-struct-cl-slot-descriptor domain unbound t nil] [cl-struct-cl-slot-descriptor self unbound t nil] [cl-struct-cl-slot-descriptor self-id unbound t nil] [cl-struct-cl-slot-descriptor self-name unbound t nil] [cl-struct-cl-slot-descriptor channels unbound t nil] [cl-struct-cl-slot-descriptor groups unbound t nil] [cl-struct-cl-slot-descriptor ims unbound t nil] [cl-struct-cl-slot-descriptor file-room nil t nil] [cl-struct-cl-slot-descriptor search-results nil t nil] [cl-struct-cl-slot-descriptor users unbound t nil] [cl-struct-cl-slot-descriptor bots unbound t nil] [cl-struct-cl-slot-descriptor ws-url unbound t nil] [cl-struct-cl-slot-descriptor ws-conn nil t nil] [cl-struct-cl-slot-descriptor ping-timer nil t nil] [cl-struct-cl-slot-descriptor check-ping-timeout-timer nil t nil] [cl-struct-cl-slot-descriptor check-ping-timeout-sec 20 t nil] [cl-struct-cl-slot-descriptor reconnect-auto t t nil] [cl-struct-cl-slot-descriptor reconnect-timer nil t nil] [cl-struct-cl-slot-descriptor reconnect-after-sec 10 t nil] [cl-struct-cl-slot-descriptor reconnect-count 0 t nil] [cl-struct-cl-slot-descriptor reconnect-count-max 360 t nil] [cl-struct-cl-slot-descriptor last-pong nil t nil] [cl-struct-cl-slot-descriptor waiting-send nil t nil] [cl-struct-cl-slot-descriptor sent-message (make-hash-table) t nil] [cl-struct-cl-slot-descriptor message-id 0 t nil] [cl-struct-cl-slot-descriptor connected nil t nil] [cl-struct-cl-slot-descriptor subscribed-channels nil list nil] [cl-struct-cl-slot-descriptor typing nil t nil] [cl-struct-cl-slot-descriptor typing-timer nil t nil] [cl-struct-cl-slot-descriptor reminders nil list nil] [cl-struct-cl-slot-descriptor ping-check-timers unbound t nil] [cl-struct-cl-slot-descriptor threads (make-instance (quote slack-team-threads)) slack-team-threads nil]] #s(hash-table size 65 test eq rehash-size 1.5 rehash-threshold 0.8 data (id 0 token 1 client-id 2 client-secret 3 name 4 domain 5 self 6 self-id 7 self-name 8 channels 9 groups 10 ims 11 file-room 12 search-results 13 users 14 bots 15 ws-url 16 ws-conn 17 ping-timer 18 check-ping-timeout-timer 19 check-ping-timeout-sec 20 reconnect-auto 21 reconnect-timer 22 reconnect-after-sec 23 reconnect-count 24 reconnect-count-max 25 last-pong 26 waiting-send 27 sent-message 28 message-id 29 connected 30 subscribed-channels 31 typing 32 typing-timer 33 reminders 34 ping-check-timers 35 threads 36 ...)) nil ((:id . id) (:token . token) (:client-id . client-id) (:client-secret . client-secret) (:name . name) (:domain . domain) (:self . self) (:self-id . self-id) (:self-name . self-name) (:channels . channels) (:groups . groups) (:ims . ims) (:users . users) (:bots . bots) (:ws-url . ws-url) (:ws-conn . ws-conn) (:check-ping-timeout-sec . check-ping-timeout-sec) (:reconnect-auto . reconnect-auto) (:subscribed-channels . subscribed-channels)) [] [] [eieio-class-tag--slack-team unbound nil unbound unbound nil unbound unbound unbound unbound unbound unbound unbound nil nil unbound unbound unbound nil nil nil 20 t nil 10 0 360 nil nil #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ( ...)) 0 nil nil nil nil nil unbound [eieio-class-tag--slack-team-threads nil t 0 0]] (:custom-groups nil)] ims oref)
  apply(#[1028 "\300\301\302!\303!F\"\207" [signal unbound-slot eieio-class-name eieio-object-name] 10 "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.\n\n(fn OBJECT CLASS SLOT-NAME FN)"] [eieio-class-tag--slack-team "<MY_SLACK_TEAM_ID>" "<MY_TOKEN>" "<MY_CLIENT_ID>" "<MY_CLIENT_SECRET>" "<MY_TEAM_NAME>" unbound unbound unbound unbound unbound unbound unbound nil nil unbound unbound unbound nil nil nil 20 t nil 10 0 360 nil nil #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ( ...)) 0 nil nil nil nil nil unbound [eieio-class-tag--slack-team-threads nil t 0 0]] ([cl-struct-eieio--class slack-team nil nil [[cl-struct-cl-slot-descriptor id unbound t nil] [cl-struct-cl-slot-descriptor token nil t nil] [cl-struct-cl-slot-descriptor client-id unbound t nil] [cl-struct-cl-slot-descriptor client-secret unbound t nil] [cl-struct-cl-slot-descriptor name nil t nil] [cl-struct-cl-slot-descriptor domain unbound t nil] [cl-struct-cl-slot-descriptor self unbound t nil] [cl-struct-cl-slot-descriptor self-id unbound t nil] [cl-struct-cl-slot-descriptor self-name unbound t nil] [cl-struct-cl-slot-descriptor channels unbound t nil] [cl-struct-cl-slot-descriptor groups unbound t nil] [cl-struct-cl-slot-descriptor ims unbound t nil] [cl-struct-cl-slot-descriptor file-room nil t nil] [cl-struct-cl-slot-descriptor search-results nil t nil] [cl-struct-cl-slot-descriptor users unbound t nil] [cl-struct-cl-slot-descriptor bots unbound t nil] [cl-struct-cl-slot-descriptor ws-url unbound t nil] [cl-struct-cl-slot-descriptor ws-conn nil t nil] [cl-struct-cl-slot-descriptor ping-timer nil t nil] [cl-struct-cl-slot-descriptor check-ping-timeout-timer nil t nil] [cl-struct-cl-slot-descriptor check-ping-timeout-sec 20 t nil] [cl-struct-cl-slot-descriptor reconnect-auto t t nil] [cl-struct-cl-slot-descriptor reconnect-timer nil t nil] [cl-struct-cl-slot-descriptor reconnect-after-sec 10 t nil] [cl-struct-cl-slot-descriptor reconnect-count 0 t nil] [cl-struct-cl-slot-descriptor reconnect-count-max 360 t nil] [cl-struct-cl-slot-descriptor last-pong nil t nil] [cl-struct-cl-slot-descriptor waiting-send nil t nil] [cl-struct-cl-slot-descriptor sent-message (make-hash-table) t nil] [cl-struct-cl-slot-descriptor message-id 0 t nil] [cl-struct-cl-slot-descriptor connected nil t nil] [cl-struct-cl-slot-descriptor subscribed-channels nil list nil] [cl-struct-cl-slot-descriptor typing nil t nil] [cl-struct-cl-slot-descriptor typing-timer nil t nil] [cl-struct-cl-slot-descriptor reminders nil list nil] [cl-struct-cl-slot-descriptor ping-check-timers unbound t nil] [cl-struct-cl-slot-descriptor threads (make-instance (quote slack-team-threads)) slack-team-threads nil]] #s(hash-table size 65 test eq rehash-size 1.5 rehash-threshold 0.8 data (id 0 token 1 client-id 2 client-secret 3 name 4 domain 5 self 6 self-id 7 self-name 8 channels 9 groups 10 ims 11 file-room 12 search-results 13 users 14 bots 15 ws-url 16 ws-conn 17 ping-timer 18 check-ping-timeout-timer 19 check-ping-timeout-sec 20 reconnect-auto 21 reconnect-timer 22 reconnect-after-sec 23 reconnect-count 24 reconnect-count-max 25 last-pong 26 waiting-send 27 sent-message 28 message-id 29 connected 30 subscribed-channels 31 typing 32 typing-timer 33 reminders 34 ping-check-timers 35 threads 36 ...)) nil ((:id . id) (:token . token) (:client-id . client-id) (:client-secret . client-secret) (:name . name) (:domain . domain) (:self . self) (:self-id . self-id) (:self-name . self-name) (:channels . channels) (:groups . groups) (:ims . ims) (:users . users) (:bots . bots) (:ws-url . ws-url) (:ws-conn . ws-conn) (:check-ping-timeout-sec . check-ping-timeout-sec) (:reconnect-auto . reconnect-auto) (:subscribed-channels . subscribed-channels)) [] [] [eieio-class-tag--slack-team unbound nil unbound unbound nil unbound unbound unbound unbound unbound unbound unbound nil nil unbound unbound unbound nil nil nil 20 t nil 10 0 360 nil nil #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ( ...)) 0 nil nil nil nil nil unbound [eieio-class-tag--slack-team-threads nil t 0 0]] (:custom-groups nil)] ims oref))
  slot-unbound([eieio-class-tag--slack-team "<MY_SLACK_TEAM_ID>" "<MY_TOKEN>" "<MY_CLIENT_ID>" "<MY_CLIENT_SECRET>" "<MY_TEAM_NAME>" unbound unbound unbound unbound unbound unbound unbound nil nil unbound unbound unbound nil nil nil 20 t nil 10 0 360 nil nil #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ( ...)) 0 nil nil nil nil nil unbound [eieio-class-tag--slack-team-threads nil t 0 0]] [cl-struct-eieio--class slack-team nil nil [[cl-struct-cl-slot-descriptor id unbound t nil] [cl-struct-cl-slot-descriptor token nil t nil] [cl-struct-cl-slot-descriptor client-id unbound t nil] [cl-struct-cl-slot-descriptor client-secret unbound t nil] [cl-struct-cl-slot-descriptor name nil t nil] [cl-struct-cl-slot-descriptor domain unbound t nil] [cl-struct-cl-slot-descriptor self unbound t nil] [cl-struct-cl-slot-descriptor self-id unbound t nil] [cl-struct-cl-slot-descriptor self-name unbound t nil] [cl-struct-cl-slot-descriptor channels unbound t nil] [cl-struct-cl-slot-descriptor groups unbound t nil] [cl-struct-cl-slot-descriptor ims unbound t nil] [cl-struct-cl-slot-descriptor file-room nil t nil] [cl-struct-cl-slot-descriptor search-results nil t nil] [cl-struct-cl-slot-descriptor users unbound t nil] [cl-struct-cl-slot-descriptor bots unbound t nil] [cl-struct-cl-slot-descriptor ws-url unbound t nil] [cl-struct-cl-slot-descriptor ws-conn nil t nil] [cl-struct-cl-slot-descriptor ping-timer nil t nil] [cl-struct-cl-slot-descriptor check-ping-timeout-timer nil t nil] [cl-struct-cl-slot-descriptor check-ping-timeout-sec 20 t nil] [cl-struct-cl-slot-descriptor reconnect-auto t t nil] [cl-struct-cl-slot-descriptor reconnect-timer nil t nil] [cl-struct-cl-slot-descriptor reconnect-after-sec 10 t nil] [cl-struct-cl-slot-descriptor reconnect-count 0 t nil] [cl-struct-cl-slot-descriptor reconnect-count-max 360 t nil] [cl-struct-cl-slot-descriptor last-pong nil t nil] [cl-struct-cl-slot-descriptor waiting-send nil t nil] [cl-struct-cl-slot-descriptor sent-message (make-hash-table) t nil] [cl-struct-cl-slot-descriptor message-id 0 t nil] [cl-struct-cl-slot-descriptor connected nil t nil] [cl-struct-cl-slot-descriptor subscribed-channels nil list nil] [cl-struct-cl-slot-descriptor typing nil t nil] [cl-struct-cl-slot-descriptor typing-timer nil t nil] [cl-struct-cl-slot-descriptor reminders nil list nil] [cl-struct-cl-slot-descriptor ping-check-timers unbound t nil] [cl-struct-cl-slot-descriptor threads (make-instance (quote slack-team-threads)) slack-team-threads nil]] #s(hash-table size 65 test eq rehash-size 1.5 rehash-threshold 0.8 data (id 0 token 1 client-id 2 client-secret 3 name 4 domain 5 self 6 self-id 7 self-name 8 channels 9 groups 10 ims 11 file-room 12 search-results 13 users 14 bots 15 ws-url 16 ws-conn 17 ping-timer 18 check-ping-timeout-timer 19 check-ping-timeout-sec 20 reconnect-auto 21 reconnect-timer 22 reconnect-after-sec 23 reconnect-count 24 reconnect-count-max 25 last-pong 26 waiting-send 27 sent-message 28 message-id 29 connected 30 subscribed-channels 31 typing 32 typing-timer 33 reminders 34 ping-check-timers 35 threads 36 ...)) nil ((:id . id) (:token . token) (:client-id . client-id) (:client-secret . client-secret) (:name . name) (:domain . domain) (:self . self) (:self-id . self-id) (:self-name . self-name) (:channels . channels) (:groups . groups) (:ims . ims) (:users . users) (:bots . bots) (:ws-url . ws-url) (:ws-conn . ws-conn) (:check-ping-timeout-sec . check-ping-timeout-sec) (:reconnect-auto . reconnect-auto) (:subscribed-channels . subscribed-channels)) [] [] [eieio-class-tag--slack-team unbound nil unbound unbound nil unbound unbound unbound unbound unbound unbound unbound nil nil unbound unbound unbound nil nil nil 20 t nil 10 0 360 nil nil #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ( ...)) 0 nil nil nil nil nil unbound [eieio-class-tag--slack-team-threads nil t 0 0]] (:custom-groups nil)] ims oref)
  eieio-barf-if-slot-unbound(unbound [eieio-class-tag--slack-team "<MY_SLACK_TEAM_ID>" "<MY_TOKEN>" "<MY_CLIENT_ID>" "<MY_CLIENT_SECRET>" "<MY_TEAM_NAME>" unbound unbound unbound unbound unbound unbound unbound nil nil unbound unbound unbound nil nil nil 20 t nil 10 0 360 nil nil #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ( ...)) 0 nil nil nil nil nil unbound [eieio-class-tag--slack-team-threads nil t 0 0]] ims oref)
 slot-value([eieio-class-tag--slack-team "<MY_SLACK_TEAM_ID>" "<MY_TOKEN>" "<MY_CLIENT_ID>" "<MY_CLIENT_SECRET>" "<MY_TEAM_NAME>" unbound unbound unbound unbound unbound unbound unbound nil nil unbound unbound unbound nil nil nil 20 t nil 10 0 360 nil nil #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ( ...)) 0 nil nil nil nil nil unbound [eieio-class-tag--slack-team-threads nil t 0 0]] ims)
  slack-select-rooms()
  slack-start-select()
  funcall-interactively(slack-start-select)
  #<subr call-interactively>(slack-start-select nil nil)
  ad-Advice-call-interactively(#<subr call-interactively> slack-start-select nil nil)
  apply(ad-Advice-call-interactively #<subr call-interactively> (slack-start-select nil nil))
  call-interactively(slack-start-select nil nil)
  command-execute(slack-start-select)

I'll update this with anything I find. Anyone have any ideas?

com4 commented 7 years ago

try running slack-im-list-update?

jgkamat commented 7 years ago

The function dosen't help, but returns this:


[cl-struct-request-response nil nil nil nil nil "https://slack.com/api/users.list?token=<SLACK_TOKEN>" nil (:type "GET" :sync nil :params (("token" . "<SLACK_TOKEN>")) :files nil :headers nil :parser slack-parse-to-plist :success #[128 "ÁÂ\"A@ÃÄ\"Å=ƒ^@ÆÇÈÃÉ\"#‚$" <this last part was a little hard to copy> [[eieio-class-tag--slack-team "<SLACK_TEAM_ID>" "<SLACK_TOKEN>" "<CLIENT_ID>" "<CLIENT_SECRET>" "<TEAM NAME>" unbound unbound unbound unbound unbound unbound unbound nil nil unbound unbound unbound nil nil nil 20 t nil 10 0 360 nil nil #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ()) 0 nil nil nil nil nil unbound [eieio-class-tag--slack-team-threads nil t 0 0]] plist-member :data plist-get :ok :json-false message "Failed to request %s: %s" "slack-im-list-update" :error :members slack-im-update-room-list] 8 "

(fn &key DATA &allow-other-keys)"] :error #[128 "ÂÀÃÁ\"\"‡" [request-default-error-callback ("https://slack.com/api/users.list") apply append] 6 "

(fn &rest ARGS2)"] :timeout 5 :url "https://slack.com/api/users.list?token=<SLACK_TOKEN>" :response #0) #<buffer  *request curl*> nil [nil 22692 56530 645122 nil request-response--timeout-callback (#0) nil 962000] curl nil]
isaacjwilliams commented 7 years ago

I'm having the same problem!

jgkamat commented 7 years ago

@fomentia just curious, are you using a paid slack team? The team I'm using this one on is a premium one (and the one that's working is a free one) so maybe that's related to something?

isaacjwilliams commented 7 years ago

@jgkamat No, I'm part of a free slack team. I don't think that has anything to do with it...

jgkamat commented 7 years ago

The team that this issue was affecting is working again (maybe they rolled back an update, because it broke something in the API?). I'll close this in a few days if I don't see it again.

isaacjwilliams commented 7 years ago

@jgkamat It's still happening for me (as of about 2 hours ago).

jgkamat commented 7 years ago

hopefully it'll be fixed for you too soon, I'll keep you updated if anything changes on my end.

jonathanwilner commented 7 years ago

I have also had this happen sporadically. I rolled back from HEAD to the MELPA package, open and closed the websocket a few times and got back in.

I was also seeing invalid-slot-type errors. I can send the whole thing, but there's a ton of it and there seems to be private info that's hard to obfuscate.

jgkamat commented 7 years ago

I've started getting this again (I'm fairly sure I haven't changed any config related to this). :cry:

jgkamat commented 7 years ago

I think this is related to #163. It seems like slack has no way of maing unrestricted tokens, and are forcing people to add scopes. Maybe some of the full featured tokesn that already existed are being deactivated to force people to switch to the new method.

If I deactivate and reactivate my token (I was testing it out) I run into #163...

This might also be relevant (see last comment): https://github.com/slackhq/slack-api-docs/issues/47

com4 commented 7 years ago

Recreating the app with the scopes fixed this issue for me.

jgkamat commented 7 years ago

can you post some screenshots of which scopes you used (and also maybe instructions too). I can't seem to get the scopes error to go away (#163). Thanks! =D

com4 commented 7 years ago

Go to: https://api.slack.com/apps You should see your app listed. Delete it and come back. Create a new app

Click the box that says permissions on the page for your new app. Note: Your client id and client secret are on this page.

the 2nd section on this page has a box to define scopes. I added all of the scopes except the ones under the "Other" category. (These are at the top.) Adding all scopes should set you up to have a fully working client, but feel free to pick and choose scopes to fit your needs. Remember to click the Save button when you're finished.

After that go back to your app page (the first screen shot) and click "Install your app to your team". You will be asked to authorize your app.

Once you've done that click on "Oauth and Permissions" on the left hand side bar to get your token.

jgkamat commented 7 years ago

I just tried that out and I can't seem to get it to work (still getting the missing scope error, followed by the error in the original comment). I tried updating to the latest version of emacs-slack and I still see this issue. I might be able to spend some time debugging this over break, but thanks for the detailed instructions (for anyone else stuck on this).

com4 commented 7 years ago

I rebooted my computer for an unrelated reason and I'm now getting the missing_scope error (#163). Doh! I also just tried to recreate the app with no luck.

benreyn commented 7 years ago

I have been experiencing this issue periodically with one of my teams. When run slack-start with debugging on, i get the following....

Debugger entered--Lisp error: (unbound-slot slack-team "#<slack-team slack-team>" ims oref)
  ... etc
benreyn commented 7 years ago

Could this have to do with this.. https://api.slack.com/changelog/2017-04-start-using-rtm-connect-and-stop-using-rtm-start

benreyn commented 7 years ago

@jgkamat I opened #180 Related to this. Did you ever figure our what was going on here? About 50% of the time I successfully connect to the websocket. Would love to get this working consistently.

jgkamat commented 7 years ago

@benjamreynolds I have one slack team which is unaffected by this issue, and another slack team which I can't get working. I think it's because I generated the credentials for the newer slack team later (maybe after slack made an auth change). I don't want to risk regenerating my old team to find out though...

I don't think I've ever had connection problems intermittently (50% of the time), so I can't comment on that, maybe it's a poor internet connection? I've only tried this on a pretty strong connection.

benreyn commented 7 years ago

Its not internet connection related for sure. I keep an eye on my network activity. It is totally weird, I outlined in #180, but it looks like I can still receive event but cant send messages. Its very odd.

jgkamat commented 7 years ago

Also, I didn't notice this note in the readme before, but this is probably relatd to this issue: https://github.com/yuya373/emacs-slack#note

It sounds like the new slack app creation tool does not support the permissions that emacs-slack needs, which is a pretty big problem...

benreyn commented 7 years ago

Weird though that I can get it to work sometimes, (with no change to configuration) Also, as I noted in #180, It looks like slack would like developers to start using the rtm.connect instead of rtm.start. See here. This package may need some serious updating for new users to get much use out of it.

greened commented 5 years ago

I am seeing this error when I try to post a message to a channel. I can see previous channel messages just fine but can't post.