! 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 assocs arrays formatting combinators.random ;
USING: bonerbonerboner.services bonerbonerboner.services.slack ;
IN: bonerbonerboner.services.link-logger
! TODO: index url and updated date
! TODO: add slack integration
TUPLE: link id url created-by updated-by repost-count date-created date-updated ;
link "links"
{
{ "id" "id" +db-assigned-id+ }
{ "url" "url" URL }
{ "repost-count" "repost_count" INTEGER }
{ "created-by" "created_by" TEXT }
{ "updated-by" "updated_by" TEXT }
{ "date-created" "date_created" TIMESTAMP }
{ "date-updated" "date_updated" TIMESTAMP }
} define-persistent
: ensure-link-logger ( -- )
[ link ensure-table ] with-bbb-db ;
: ( url who -- link )
[ f ] 2dip dup 0 now dup link boa ;
: ( link who -- link )
slack-lookup-user [ dup repost-count>> 1 + >>repost-count ] dip >>updated-by now >>date-updated ;
: add-link ( url who -- )
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 -- )
ensure-link-logger [ dup update-tuple ] with-bbb-db random-callout ;
: repost? ( url -- link/f )
ensure-link-logger link new swap >>url [ select-tuple ] with-bbb-db ;
: url-regex ( -- regexp )
R/ http[s]?:\/\/(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+/i ;
: strip-urls ( str -- seq )
url-regex all-matching-subseqs ;
: check-repost ( url who -- )
[ dup repost? ] dip swap [ swap update-repost drop ] [ add-link ] if* ;
: check-link ( url who -- )
check-repost ;
: check-links ( event -- )
[ "text" of strip-urls dup length ] [ "user" of ] bi
[ check-link ] 2each ;