From ebd93fd55ff47ee34bc0cbfb3a2caa93f0b0f7fa Mon Sep 17 00:00:00 2001 From: Steve Ayerhart Date: Sun, 11 Apr 2021 23:04:12 -0400 Subject: [PATCH] getting close to parity --- bonerbonerboner/bonerbonerboner.factor | 40 +++++++++---- .../services/link-logger/link-logger.factor | 25 +++++--- .../services/mississippis/mississippis.factor | 57 ++++++++++++++++--- .../services/platzisms/platzisms.factor | 8 ++- bonerbonerboner/services/services.factor | 11 +++- bonerbonerboner/services/slack/slack.factor | 35 ++++++------ bonerbonerboner/templates/themes.xml | 4 +- 7 files changed, 130 insertions(+), 50 deletions(-) diff --git a/bonerbonerboner/bonerbonerboner.factor b/bonerbonerboner/bonerbonerboner.factor index 0ca363d..52342e0 100644 --- a/bonerbonerboner/bonerbonerboner.factor +++ b/bonerbonerboner/bonerbonerboner.factor @@ -1,29 +1,49 @@ ! Copyright (C) 2020 . ! See http://factorcode.org/license.txt for BSD license. -USING: kernel http.server http.server.responses http.server.dispatchers furnace.actions html.forms accessors namespaces io.servers io.sockets.secure.debug ; +USING: kernel http.server http.server.responses http.server.dispatchers furnace.actions html.forms accessors namespaces io.servers io.sockets.secure.debug sequences validators ; USING: bonerbonerboner.services ; +USING: prettyprint ; IN: bonerbonerboner TUPLE: bbb < dispatcher ; +: bbb-themes ( -- themes ) + { "bbb" "rocket" "hockey" } ; + +: v-valid-theme ( str -- theme ) + dup bbb-themes member? [ "not a valid theme" throw ] unless ; + +: validate-theme ( -- ) + { + { "theme" [ v-required v-valid-theme ] } + } validate-params ; + : ( -- action ) - [ "bbb" "theme" set-value ] >>init + + + [ + validate-theme + ] >>init { bbb "templates/themes" } >>template ; - -: ( -- response ) - "bonerbonerboner" ; +: ( -- action ) + [ "bonerbonerboner" ] >>display ; : ( -- responder ) bbb new-dispatcher - "heartbeat" add-responder ; -! "theme" add-responder ; + "heartbeat" add-responder + "slack-events" add-responder + "subdomain" add-responder ; -SYMBOL: current-test-server -: run-test-bbb ( -- ) +SYMBOL: current-bbb-server +: run-bbb-server ( -- ) main-responder set-global - 8080 httpd current-test-server set ; + 8080 httpd current-bbb-server set ; + +: restart-bbb-server ( -- ) + current-bbb-server get stop-server + run-bbb-server ; diff --git a/bonerbonerboner/services/link-logger/link-logger.factor b/bonerbonerboner/services/link-logger/link-logger.factor index ba424d6..d65f4d6 100644 --- a/bonerbonerboner/services/link-logger/link-logger.factor +++ b/bonerbonerboner/services/link-logger/link-logger.factor @@ -1,8 +1,8 @@ ! Copyright (C) 2020 . ! See http://factorcode.org/license.txt for BSD license. -USING: kernel sequences http http.server.dispatchers accessors vocabs.parser furnace.actions regexp db.types db.tuples math urls strings calendar ; -USING: bonerbonerboner ; +USING: kernel sequences http http.server.dispatchers accessors vocabs.parser furnace.actions regexp db.types db.tuples math urls strings calendar assocs arrays formatting combinators.random ; +USING: bonerbonerboner.services bonerbonerboner.services.slack ; IN: bonerbonerboner.services.link-logger @@ -32,10 +32,17 @@ link "links" [ dup repost-count>> 1 + >>repost-count ] dip >>updated-by now >>date-updated ; : add-link ( url who -- ) - [ insert-tuple ] with-bbb-db ; + ensure-link-logger [ insert-tuple ] with-bbb-db ; + +: random-callout ( repost -- ) + { + [ ] + [ created-by>> "%s already posted that" sprintf ] + [ drop "nice repost" ] + } call-random say-slack ; : update-repost ( link who -- ) - [ update-tuple ] with-bbb-db ; + ensure-link-logger [ dup update-tuple ] with-bbb-db random-callout ; : repost? ( url -- link/f ) link new swap >>url [ select-tuple ] with-bbb-db ; @@ -47,7 +54,11 @@ link "links" url-regex all-matching-subseqs ; : check-repost ( url who -- ) - [ dup repost? ] dip swap [ update-repost ] [ add-link ] if ; + [ dup repost? ] dip swap [ swap update-repost drop ] [ add-link ] if* ; -! : check-links ( str -- ) - ! strip-urls [ check-repost ] each ; +: check-link ( url who -- ) + check-repost ; + +: check-links ( event -- ) + [ "text" of strip-urls dup length ] [ "user" of ] bi + [ check-link ] 2each ; diff --git a/bonerbonerboner/services/mississippis/mississippis.factor b/bonerbonerboner/services/mississippis/mississippis.factor index 7d46516..c93cbf9 100644 --- a/bonerbonerboner/services/mississippis/mississippis.factor +++ b/bonerbonerboner/services/mississippis/mississippis.factor @@ -1,14 +1,37 @@ ! Copyright (C) 2020 . ! See http://factorcode.org/license.txt for BSD license. -USING: kernel math math.ranges math.order math.parser math.functions arrays sequences sequences.extras threads calendar io timers accessors random formatting combinators combinators.random http.server.responses ; -USING: prettyprint http furnace.actions http.server.dispatchers ; -USING: bonerbonerboner.services.slack ; +USING: kernel math math.ranges math.order math.parser math.functions arrays sequences sequences.extras threads calendar io timers accessors random formatting combinators combinators.random http.server.responses regexp unicode peg peg.parsers assocs db.types db.tuples ; + +USING: bonerbonerboner.services bonerbonerboner.services.slack ; IN: bonerbonerboner.services.mississippis CONSTANT: max-mississippi-count 30 CONSTANT: min-mississippi-count 1 +TUPLE: mississippis id standard-mississippi? terminal requester requested-on ; + +mississippis "mississippis" +{ + { "id" "id" +db-assigned-id+ } + { "standard-mississippi?" "is_standard" BOOLEAN } + { "terminal" "terminal" INTEGER } + { "requester" "requester" VARCHAR } + { "requested-on" "requested_on" TIMESTAMP } +} define-persistent + +: ( event -- mississippis ) + [ f ] dip + [ + "text" of + >lower + integer-parser " standard" token [ >boolean ] action optional 2seq parse + [ second ] [ first ] bi + ] + [ "user" of slack-lookup-user ] + [ "event_ts" of string>number unix-time>timestamp ] tri + mississippis boa ; + : random-stupid-word ( -- something-stupid ) { "balls" "fart" "SIEEEEEEEEEEGE" "hey" "HONESTLY" "fuckface" "it's too late-TOOOOO LATE" } random ; @@ -22,7 +45,7 @@ CONSTANT: min-mississippi-count 1 random ; : nonstandard-mississippi-duration ( -- duration ) - .25 5 uniform-random-float seconds ; + .5 1.5 uniform-random-float seconds ; : standard-mississippi-duration ( -- duration ) 1 seconds ; @@ -34,8 +57,7 @@ CONSTANT: min-mississippi-count 1 min-mississippi-count max-mississippi-count between? ; : announce ( str -- ) - . flush ; -! say-slack ; + say-slack ; : announce-sip ( sip -- ) "%d Mississippi" sprintf announce ; @@ -60,13 +82,13 @@ CONSTANT: min-mississippi-count 1 { .3 [ ] } { .1 [ announce-random-sip ] } { .075 [ announce-random-stupid-word ] } - { .025 [ terminal announce-fake-terminal ] } + { .025 [ terminal announce-fake-terminal nonstandard-mississippi-wait ] } { .5 [ sip announce-sip ] } } casep ; : announce-nonstandard-mississippis ( terminal -- ) [ - 1 - [ dup ] [ [1,b] ] bi + [ dup ] [ 1 - [1,b] ] bi [ nonstandard-mississippi-wait announce-nonstandard-mississippi ] 2each ] [ announce-sip ] bi ; @@ -78,3 +100,22 @@ CONSTANT: min-mississippi-count 1 dup valid-mississippi-count? [ announce-go! swap announce-mississippis ] [ 2drop random-no-word announce ] if ; + +: log-mississippi-request ( mississippi -- ) + [ + mississippis ensure-table + insert-tuple + ] with-bbb-db ; + +: is-mississippi-request? ( str -- ? ) + R/ ^\d\d? (standard )?mississippis? go!?/i matches? ; + +: check-mississippi-request ( event -- ) + dup + "text" of is-mississippi-request? + [ + + [ [ standard-mississippi?>> ] [ terminal>> ] bi mississippi-go! ] + [ log-mississippi-request ] bi + ] + [ drop ] if ; diff --git a/bonerbonerboner/services/platzisms/platzisms.factor b/bonerbonerboner/services/platzisms/platzisms.factor index 0f549f2..aa9d890 100644 --- a/bonerbonerboner/services/platzisms/platzisms.factor +++ b/bonerbonerboner/services/platzisms/platzisms.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2020 . ! See http://factorcode.org/license.txt for BSD license. USING: kernel regexp sequences http.server http.server.responses db db.types db.tuples unicode formatting assocs ; -USING: bonerbonerboner bonerbonerboner.services.slack ; +USING: bonerbonerboner.services bonerbonerboner.services.slack ; IN: bonerbonerboner.services.platzisms @@ -20,6 +20,7 @@ platzism "platzisms" [ f ] dip platzism boa ; : add-platzism ( str -- ) + ensure-platzisms [ insert-tuple ] with-bbb-db ; : platzism-exists? ( str -- ? ) @@ -32,6 +33,7 @@ platzism "platzisms" R/ ^steve platz is currently .+/i matches? ; : random-platzism ( -- platzism ) + ensure-platzisms "SELECT quote from platzisms ORDER BY RANDOM() LIMIT 1" [ sql-query ] with-bbb-db dup empty? [ drop "I'm not sure what Platz is up to." ] [ first first ] if ; @@ -55,7 +57,7 @@ platzism "platzisms" : check-platz ( event -- ) "text" of [ is-platz? [ share-platzism ] when ] - [ is-platzism? [ log/confirm-platzism ] when* ] bi ; + [ dup is-platzism? [ log/confirm-platzism ] [ drop ] if ] bi ; -[ check-platz ] add-slack-handler +! [ check-platz ] add-slack-handler diff --git a/bonerbonerboner/services/services.factor b/bonerbonerboner/services/services.factor index 9210c33..59cb4d5 100644 --- a/bonerbonerboner/services/services.factor +++ b/bonerbonerboner/services/services.factor @@ -1,14 +1,21 @@ ! Copyright (C) 2020 . ! See http://factorcode.org/license.txt for BSD license. -USING: kernel fry db db.sqlite environment math.parser ; +USING: kernel fry db db.sqlite environment math.parser io.pathnames ; +USING: bonerbonerboner.services.slack ; IN: bonerbonerboner.services CONSTANT: bbb-default-port 8069 +: bbb-data-directory ( -- path ) + home ".bonerbonerboner" append-path ; + +: ( -- db ) + bbb-data-directory "bbb.db" append-path ; + : with-bbb-db ( quot -- ) - '[ "bbb.db" _ with-db ] call ; inline + '[ _ with-db ] call ; inline : bbb-api-port ( -- port ) "BBB_API_PORT" os-env [ string>number ] [ bbb-default-port ] if* ; diff --git a/bonerbonerboner/services/slack/slack.factor b/bonerbonerboner/services/slack/slack.factor index 742749d..b4d539d 100644 --- a/bonerbonerboner/services/slack/slack.factor +++ b/bonerbonerboner/services/slack/slack.factor @@ -1,8 +1,8 @@ ! 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 ; -USING: prettyprint ; +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 ; IN: bonerbonerboner.services.slack @@ -10,18 +10,12 @@ SYMBOLS: slack-callbacks current-slack-webhook-url current-slack-authorization-t TUPLE: slack < dispatcher ; -: add-slack-handler ( quot: ( event -- ) -- ) - slack-callbacks get append slack-callbacks set ; - : ( -- response ) "400" "unrecognized event type" ; : ( -- response ) "slack" ; -: ( -- response ) - "200" "OK" ; - : handle-challenge ( json -- response ) "challenge" of ; @@ -31,7 +25,7 @@ TUPLE: slack < dispatcher ; slack-callbacks get length slack-event slack-callbacks get [ curry "Slack Callback" spawn drop ] 2each ] unless - ; + <200> ; : ( -- action ) @@ -40,13 +34,20 @@ TUPLE: slack < dispatcher ; "type" of { { "url_verification" [ handle-challenge ] } - { "event_callback" [ handle-slack-event ] } + { "event_callback" [ "event" of handle-slack-event ] } [ drop ] } case ] >>submit ; -: ( -- action ) - [ ] >>display ; +: 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 ; : slack-post-message ( payload -- ) >json @@ -55,10 +56,6 @@ TUPLE: slack < dispatcher ; http-request 2drop ; : say-slack ( str -- ) - "text" associate - slack-post-message ; - -: ( -- responder ) - slack new-dispatcher - "slack-events" add-responder - "heartbeat" add-responder ; + . flush ; +! "text" associate +! slack-post-message ; diff --git a/bonerbonerboner/templates/themes.xml b/bonerbonerboner/templates/themes.xml index a64f114..efd6178 100644 --- a/bonerbonerboner/templates/themes.xml +++ b/bonerbonerboner/templates/themes.xml @@ -1,8 +1,10 @@ - + + boners +