factor-work/bonerbonerboner/services/slack/slack.factor

64 lines
1.9 KiB
Factor
Raw Normal View History

2021-04-04 11:10:32 -04:00
! Copyright (C) 2020 .
! See http://factorcode.org/license.txt for BSD license.
2021-04-11 23:04:12 -04:00
USING: io.sockets.secure kernel http http.server http.server.dispatchers accessors furnace.actions namespaces http.server.responses io.servers io.sockets.secure.debug json.reader assocs combinators sequences arrays threads locals formatting json.writer urls http.client hashtables math ;
USING: prettyprint io.encodings.utf8 io io.files ;
2021-04-04 11:10:32 -04:00
IN: bonerbonerboner.services.slack
SYMBOLS: slack-callbacks current-slack-webhook-url current-slack-authorization-token ;
2021-06-30 10:41:00 -04:00
{ } slack-callbacks set-global
2021-04-04 11:10:32 -04:00
TUPLE: slack < dispatcher ;
: <bad-callback-response> ( -- response )
"400" "unrecognized event type" <trivial-response> ;
: <heartbeat-response> ( -- response )
"slack" <text-content> ;
: handle-challenge ( json -- response )
"challenge" of <text-content> ;
:: handle-slack-event ( slack-event -- response )
"bot_id" slack-event key? "subtype" slack-event key? or
[
slack-callbacks get length slack-event <array>
slack-callbacks get [ curry "Slack Callback" spawn drop ] 2each
] unless
2021-04-11 23:04:12 -04:00
<200> ;
2021-04-04 11:10:32 -04:00
: <slack-event-action> ( -- action )
<action>
[
request get post-data>> data>> json> dup
"type" of
{
{ "url_verification" [ handle-challenge ] }
2021-04-11 23:04:12 -04:00
{ "event_callback" [ "event" of handle-slack-event ] }
2021-04-04 11:10:32 -04:00
[ drop <bad-callback-response> ]
} case
] >>submit ;
2021-04-11 23:04:12 -04:00
: slack-lookup-user ( id -- name )
[
"https://slack.com/api/users.profile.get" >url
{ "user" "token" }
] dip
current-slack-authorization-token get 2array zip
set-query-params
http-get swap drop json>
"profile" of "real_name" of ;
2021-04-04 11:10:32 -04:00
: slack-post-message ( payload -- )
>json
current-slack-webhook-url get >url
<post-request>
http-request 2drop ;
: say-slack ( str -- )
2022-01-24 08:10:42 -05:00
! . flush ;
"text" associate
slack-post-message ;