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

64 lines
1.8 KiB
Factor

! Copyright (C) 2020 .
! See http://factorcode.org/license.txt for BSD license.
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 environment ;
IN: bonerbonerboner.services.slack
SYMBOLS: slack-callbacks ;
{ } slack-callbacks set-global
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
<200> ;
: <slack-event-action> ( -- action )
<action>
[
request get post-data>> data>> json> dup
"type" of
{
{ "url_verification" [ handle-challenge ] }
{ "event_callback" [ "event" of handle-slack-event ] }
[ drop <bad-callback-response> ]
} case
] >>submit ;
: slack-lookup-user ( id -- name )
[
"https://slack.com/api/users.profile.get" >url
{ "user" "token" }
] dip
"SLACK_AUTH_TOKEN" os-env 2array zip
set-query-params
http-get swap drop json>
"profile" of "real_name" of ;
: slack-post-message ( payload -- )
>json
"SLACK_WEBHOOK_URL" os-env >url
<post-request>
http-request 2drop ;
: say-slack ( str -- )
! . flush ;
"text" associate
slack-post-message ;