This repository has been archived on 2023-07-28. You can view files and clone it, but cannot push or open issues or pull requests.
mastodon-bot/src/main/mastodon_bot/core.cljs

97 lines
3.2 KiB
Text
Raw Normal View History

2020-05-12 16:17:37 +00:00
#!/usr/bin/env lumo
(ns mastodon-bot.core
(:require
[clojure.spec.alpha :as s]
[clojure.spec.test.alpha :as st]
[orchestra.core :refer-macros [defn-spec]]
["rss-parser" :as rss]
[mastodon-bot.infra :as infra]
2020-05-21 10:20:50 +00:00
[mastodon-bot.transform :as transform]
2020-05-15 17:25:31 +00:00
[mastodon-bot.mastodon-api :as masto]
2020-05-22 08:14:19 +00:00
[mastodon-bot.twitter-api :as twitter]
[mastodon-bot.tumblr-api :as tumblr]
[cljs.core :refer [*command-line-args*]]))
2020-05-12 16:17:37 +00:00
2020-05-30 15:14:49 +00:00
(s/def ::mastodon masto/mastodon-auth?)
2020-05-26 15:10:58 +00:00
(s/def ::twitter twitter/twitter-auth?)
2020-05-30 15:14:49 +00:00
(s/def ::transform transform/transformations?)
2020-05-13 15:41:27 +00:00
(s/def ::tumblr map?)
(s/def ::rss map?)
2020-05-30 15:14:49 +00:00
(s/def ::auth (s/keys :opt-un [::mastodon ::twitter]))
(def config?
(s/keys :req-un [::auth ::transform]))
2020-05-13 15:49:37 +00:00
2020-05-30 15:14:49 +00:00
(defn-spec mastodon-auth ::mastodon
[config config?]
2020-05-30 15:14:49 +00:00
(get-in config [:auth :mastodon]))
2020-05-12 16:17:37 +00:00
2020-05-26 15:10:58 +00:00
(defn-spec twitter-auth ::twitter
2020-05-15 17:25:31 +00:00
[config config?]
2020-05-30 15:14:49 +00:00
(get-in config [:auth :twitter]))
2020-05-15 17:25:31 +00:00
2020-05-26 15:10:58 +00:00
(defn-spec transform ::transform
[config config?]
(:transform config))
2020-05-14 06:56:50 +00:00
(def config (infra/load-config))
2020-05-12 16:17:37 +00:00
(defn post-tumblrs [last-post-time]
(fn [err response]
(->> response
infra/js->edn
:posts
2020-05-22 08:14:19 +00:00
(mapv tumblr/parse-tumblr-post)
(map #(transform/intermediate-to-mastodon
2020-05-29 17:48:48 +00:00
(mastodon-auth config)
;todo: fix this
(:target (first (transform config))) %))
2020-05-12 16:17:37 +00:00
(masto/post-items
2020-05-26 15:10:58 +00:00
(mastodon-auth config)
2020-05-29 19:13:43 +00:00
(:target (first (transform config)))
2020-05-12 16:17:37 +00:00
last-post-time))))
(defn parse-feed [last-post-time parser [title url]]
(-> (.parseURL parser url)
(.then #(masto/post-items
2020-05-26 15:10:58 +00:00
(mastodon-auth config)
2020-05-29 19:13:43 +00:00
(:target (first (transform config)))
2020-05-12 16:17:37 +00:00
last-post-time
(for [{:keys [title isoDate pubDate content link]} (-> % infra/js->edn :items)]
{:created-at (js/Date. (or isoDate pubDate))
2020-05-21 10:20:50 +00:00
:text (str (transform/trim-text
2020-05-21 10:42:27 +00:00
title
(masto/max-post-length (:target (first (transform config)))))
2020-05-21 10:20:50 +00:00
"\n\n" (twitter/strip-utm link))})))))
2020-05-12 16:17:37 +00:00
(defn -main []
2020-05-26 15:10:58 +00:00
(let [mastodon-auth (mastodon-auth config)]
(masto/get-mastodon-timeline
mastodon-auth
(fn [timeline]
(let [last-post-time (-> timeline first :created_at (js/Date.))]
2020-05-12 16:17:37 +00:00
;;post from Twitter
2020-05-26 15:10:58 +00:00
(when-let [twitter-auth (twitter-auth config)]
2020-05-29 13:54:32 +00:00
(let [{:keys [transform]} config]
(doseq [transformation transform]
(transform/tweets-to-mastodon
mastodon-auth
twitter-auth
transformation
last-post-time))))
2020-05-12 16:17:37 +00:00
;;post from Tumblr
2020-05-26 15:10:58 +00:00
(when-let [{:keys [access-keys accounts limit]} (:tumblr config)]
(doseq [account accounts]
(let [client (tumblr/tumblr-client access-keys account)]
(.posts client #js {:limit (or limit 5)} (post-tumblrs last-post-time)))))
2020-05-12 16:17:37 +00:00
;;post from RSS
2020-05-26 15:10:58 +00:00
(when-let [feeds (some-> config :rss)]
(let [parser (rss.)]
(doseq [feed feeds]
(parse-feed last-post-time parser feed)))))))))
2020-05-12 16:17:37 +00:00
(set! *main-cli-fn* -main)
2020-05-26 15:10:58 +00:00
(st/instrument 'mastodon-auth)
(st/instrument 'twitter-auth)
(st/instrument 'transform)