It works :)
This commit is contained in:
commit
1858d883f6
3 changed files with 148 additions and 0 deletions
71
.gitignore
vendored
Normal file
71
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
# Created by https://www.toptal.com/developers/gitignore/api/clojure,emacs
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=clojure,emacs
|
||||
|
||||
### Clojure ###
|
||||
pom.xml
|
||||
pom.xml.asc
|
||||
*.jar
|
||||
*.class
|
||||
/lib/
|
||||
/classes/
|
||||
/target/
|
||||
/checkouts/
|
||||
.lein-deps-sum
|
||||
.lein-repl-history
|
||||
.lein-plugins/
|
||||
.lein-failures
|
||||
.nrepl-port
|
||||
.cpcache/
|
||||
|
||||
### Emacs ###
|
||||
# -*- mode: gitignore; -*-
|
||||
*~
|
||||
\#*\#
|
||||
/.emacs.desktop
|
||||
/.emacs.desktop.lock
|
||||
*.elc
|
||||
auto-save-list
|
||||
tramp
|
||||
.\#*
|
||||
|
||||
# Org-mode
|
||||
.org-id-locations
|
||||
*_archive
|
||||
|
||||
# flymake-mode
|
||||
*_flymake.*
|
||||
|
||||
# eshell files
|
||||
/eshell/history
|
||||
/eshell/lastdir
|
||||
|
||||
# elpa packages
|
||||
/elpa/
|
||||
|
||||
# reftex files
|
||||
*.rel
|
||||
|
||||
# AUCTeX auto folder
|
||||
/auto/
|
||||
|
||||
# cask packages
|
||||
.cask/
|
||||
dist/
|
||||
|
||||
# Flycheck
|
||||
flycheck_*.el
|
||||
|
||||
# server auth directory
|
||||
/server/
|
||||
|
||||
# projectiles files
|
||||
.projectile
|
||||
|
||||
# directory configuration
|
||||
.dir-locals.el
|
||||
|
||||
# network security
|
||||
/network-security.data
|
||||
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/clojure,emacs
|
||||
1
bb.edn
Normal file
1
bb.edn
Normal file
|
|
@ -0,0 +1 @@
|
|||
{:paths ["."]}
|
||||
76
memento.clj
Normal file
76
memento.clj
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
(ns memento
|
||||
(:require [cheshire.core :as json]
|
||||
[org.httpkit.client :as http]
|
||||
[clojure.string :as str])
|
||||
(:import [java.time LocalDateTime Instant ZoneId Duration]
|
||||
[java.net URLEncoder]))
|
||||
|
||||
(def acct (System/getenv "MASTODON_ACCOUNT"))
|
||||
(def auth-token (System/getenv "MASTODON_AUTH_TOKEN"))
|
||||
|
||||
(def assert-msg "Please set the MASTODON_ACCOUNT, MASTODON_AUTH_TOKEN and MEMENTO_ACCOUNT env vars.")
|
||||
(assert (not (empty? acct)) assert-msg)
|
||||
(assert (not (empty? auth-token)) assert-msg)
|
||||
|
||||
(def instance-url (format "https://%s" (last (str/split acct #"@"))))
|
||||
|
||||
(defn mastodon-api [path params]
|
||||
(->
|
||||
@(http/request
|
||||
(merge-with
|
||||
#(if (map? %1) (merge %1 %2) %2)
|
||||
{:url (format "%s/%s" instance-url path)
|
||||
:method :get
|
||||
:headers {"Authorization" (format "Bearer %s" auth-token)}}
|
||||
params))
|
||||
(update :body #(json/parse-string % true))))
|
||||
|
||||
(defn prn-res [res]
|
||||
(prn (assoc-in res [:opts :headers "Authorization"] "Bearer XXX")))
|
||||
|
||||
(println "Requesting account details for" acct)
|
||||
|
||||
(def account-details
|
||||
(mastodon-api "api/v1/accounts/lookup" {:query-params {:acct acct}}))
|
||||
|
||||
(prn-res account-details)
|
||||
|
||||
(def cutoff (.. (Instant/now) (minus (Duration/ofDays 1))))
|
||||
|
||||
(println "cutoff" cutoff)
|
||||
|
||||
(def delete-xf
|
||||
(comp (filter #(. (Instant/parse (:created_at %)) isBefore cutoff))
|
||||
(remove #(= (:visibility %) "direct"))))
|
||||
|
||||
(def to-delete
|
||||
(->
|
||||
(mastodon-api (format "api/v1/accounts/%s/statuses" (-> account-details :body :id))
|
||||
{:query-params {:tagged "today"
|
||||
:exclude_reblogs true}})
|
||||
(update :body #(into [] delete-xf %))))
|
||||
|
||||
(defn sleep [ms]
|
||||
(future (Thread/sleep ms)))
|
||||
|
||||
(doseq [status (:body to-delete)]
|
||||
(try
|
||||
(print "Deleting post ")
|
||||
(prn (select-keys status [:created_at :url]))
|
||||
(let [deleted (mastodon-api (format "api/v1/statuses/%s" (:id status)) {:method :delete})]
|
||||
(print "Deleted ")
|
||||
(prn-res deleted)
|
||||
@(sleep 2500) ; we need to wait, otherwise media_ids are still "attached" and can't be reused
|
||||
(print "Recreating ")
|
||||
(prn-res (mastodon-api
|
||||
(format "api/v1/statuses" #_(:id refiled))
|
||||
{:method :post
|
||||
:headers {"Content-Type" "application/json"}
|
||||
:body (json/encode
|
||||
{:visibility "direct"
|
||||
:media_ids (map :id (-> deleted :body :media_attachments))
|
||||
:status (-> deleted :body :text)})})))
|
||||
(catch Exception e
|
||||
(println "Error deleting " (:url status))
|
||||
(throw e))))
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue