Initial commit
This commit is contained in:
commit
451ece3490
7 changed files with 161 additions and 0 deletions
1
.envrc
Normal file
1
.envrc
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
use flake
|
||||||
15
.gitignore
vendored
Normal file
15
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/deno
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=deno
|
||||||
|
|
||||||
|
### Deno ###
|
||||||
|
/.idea/
|
||||||
|
/.vscode/
|
||||||
|
|
||||||
|
/node_modules
|
||||||
|
|
||||||
|
.env
|
||||||
|
*.orig
|
||||||
|
*.pyc
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/deno
|
||||||
26
flake.lock
generated
Normal file
26
flake.lock
generated
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1672770591,
|
||||||
|
"narHash": "sha256-5GtjEo7vcvxngkXR+rC3u0kP3VNSeSpkf2vJz9J+1co=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "a736c4a4fada64012313256202f035133282c2e9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
17
flake.nix
Normal file
17
flake.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
description = "kidpixbot";
|
||||||
|
inputs.nixpkgs.url = github:NixOS/nixpkgs;
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs }:
|
||||||
|
let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
lib = pkgs.lib;
|
||||||
|
in {
|
||||||
|
devShell.${system} = pkgs.mkShell rec {
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
deno
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
97
main.ts
Normal file
97
main.ts
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
const MASTODON_INSTANCE_URL = Deno.env.get('MASTODON_INSTANCE_URL') // e.g. https://botsin.space
|
||||||
|
const MASTODON_ACCESS_TOKEN = Deno.env.get('MASTODON_ACCESS_TOKEN') // you can get this at $INSTANCE_URL/settings/applications
|
||||||
|
|
||||||
|
// first we need to find out which files we can post, and which ones we already
|
||||||
|
// have posted
|
||||||
|
|
||||||
|
console.log('Picking file to post…')
|
||||||
|
const alreadyPostedFiles = new Set()
|
||||||
|
for await (const dirEntry of Deno.readDir("./posts/.posted")) {
|
||||||
|
if (dirEntry.isSymlink) {
|
||||||
|
alreadyPostedFiles.add(dirEntry.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const availableFiles = []
|
||||||
|
for await (const dirEntry of Deno.readDir("./posts/")) {
|
||||||
|
if (dirEntry.name === '.gitignore') continue
|
||||||
|
|
||||||
|
if (dirEntry.isFile && !alreadyPostedFiles.has(dirEntry.name)) {
|
||||||
|
availableFiles.push(dirEntry.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Found ${availableFiles.length} files which are not yet posted`)
|
||||||
|
|
||||||
|
if (availableFiles.length === 0) {
|
||||||
|
console.log('Nothing left to post at the moment. Bye!')
|
||||||
|
Deno.exit()
|
||||||
|
}
|
||||||
|
|
||||||
|
const fileToPost = availableFiles[Math.floor(Math.random() * availableFiles.length)]
|
||||||
|
const bytes = await Deno.readFile(`./posts/${fileToPost}`)
|
||||||
|
|
||||||
|
// we need two requests
|
||||||
|
// 1. upload media
|
||||||
|
// 2. create status with media id
|
||||||
|
|
||||||
|
// see https://docs.joinmastodon.org/methods/media/#v2
|
||||||
|
const mediaData = new FormData()
|
||||||
|
mediaData.append('file', new Blob([bytes]))
|
||||||
|
|
||||||
|
type MediaResponse = {
|
||||||
|
'id': string
|
||||||
|
'type': string
|
||||||
|
'url': string
|
||||||
|
'preview_url': string
|
||||||
|
'remote_url': null,
|
||||||
|
'text_url': string
|
||||||
|
'meta': {
|
||||||
|
'focus': {
|
||||||
|
'x': number
|
||||||
|
'y': number
|
||||||
|
},
|
||||||
|
'original': {
|
||||||
|
'width': number
|
||||||
|
'height': number
|
||||||
|
'size': string
|
||||||
|
'aspect': number
|
||||||
|
},
|
||||||
|
'small': {
|
||||||
|
'width': number
|
||||||
|
'height': number
|
||||||
|
'size': string
|
||||||
|
'aspect': number
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'description': string
|
||||||
|
'blurhash': string
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Sending post request to', `${MASTODON_INSTANCE_URL}/api/v2/media`)
|
||||||
|
const mediaRequest = await fetch(`${MASTODON_INSTANCE_URL}/api/v2/media`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${MASTODON_ACCESS_TOKEN}`
|
||||||
|
},
|
||||||
|
body: mediaData
|
||||||
|
}).then(res => res.json()) as unknown as MediaResponse
|
||||||
|
console.log('mediaRequest', mediaRequest)
|
||||||
|
|
||||||
|
// see https://docs.joinmastodon.org/methods/statuses/#create
|
||||||
|
const statusData = new FormData()
|
||||||
|
statusData.append('media_ids[]', mediaRequest.id)
|
||||||
|
|
||||||
|
console.log('Sending post request to', `${MASTODON_INSTANCE_URL}/api/v1/statuses`)
|
||||||
|
const statusRequest = await fetch(`${MASTODON_INSTANCE_URL}/api/v1/statuses`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${MASTODON_ACCESS_TOKEN}`
|
||||||
|
},
|
||||||
|
body: statusData
|
||||||
|
}).then(res => res.json())
|
||||||
|
console.log('statusRequest', statusRequest)
|
||||||
|
|
||||||
|
console.log('Linking posted file so we can skip it in the future…')
|
||||||
|
await Deno.symlink(`./posts/${fileToPost}`, `./posts/.posted/${fileToPost}`)
|
||||||
|
console.log('Done!')
|
||||||
3
posts/.gitignore
vendored
Normal file
3
posts/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
*
|
||||||
|
!.gitignore
|
||||||
|
!.posted
|
||||||
2
posts/.posted/.gitignore
vendored
Normal file
2
posts/.posted/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
*
|
||||||
|
!.gitignore
|
||||||
Loading…
Add table
Add a link
Reference in a new issue