Bash と Caddy サーバで ActivityPub のインスタンス(13) Create と Announce の POST を HTML にする

## 他のアクターから自分の Note が見えるようにする
他のアクターが自分の投稿を announce した場合、もちろん自分もその POST を受け取るのだが、今のままではネット越しに自分のインスタンスで自分の投稿を取得できない。なので自分を含め他のアクターも自分の投稿を見ることが出来るようにする。
自分が作成した Create オブジェクトの Note オブジェクトを突っ込んでいる statuses ディレクトリのファイルが他のアクターから GET できるようにすればよい。Caddyfile に以下を追加。
```
ホニャララ {

## 中略
## 以下を追加
    handle_path /users/aktor/statuses/* {
		file_server
    	root * ./statuses/
	header {
	       Content-Type: application/activity+json
	       }
	}
}
```

## ./receive/create ディレクトリのファイルを HTML ぽくする
他のアクターの投稿など折角受け取った POST を見たいわけだが、HTTPリクエストのまま一つ々々見るのも面倒なので Object の Note 部分の
- id
- published (時間)
- attributedTo (投稿者)
- content (内容)

を取得して HTML ぽくしてブラウザで見るようにする。単に
```
ID=$(grep "{" HTTPリクエストのファイル | jq .object.id | tr -d '"')
Time=$(grep "{" HTTPリクエストのファイル | jq .object.published | tr -d '"')
Poster=$(grep "{" HTTPリクエストのファイル | jq .actor | tr -d '"')
Content=$(grep "{" HTTPリクエストのファイル | jq .object.content | tr -d '"')
```

で取得できるので、これに `<div>` タグ等をつける。

## ./receive/announce ディレクトリのファイルを HTML ぽくする
上と同じようだが、違うのは Create オブジェクトその物が json に記載されているわけではなく、そのリンクが object タグに記載されていることだ。
まずは announcer を actor タグから取得し、それ以外は
curl -H "Accept: application/activity+json"
を
grep "{"
の代わりに使う。

## announce ディレクトリのファイルと create ディレクトリのファイルを混ぜて処理する
note も announce も同じタイムラインで表示したいので、いったん同じディレクトリに入れてファイルの名前である Unixtime を基準にソートし、新しい順に上から HTML ぽく表示するようにする。
そのためカレントディレクトリに ./4timeline というディレクトリを作る。
```
mkdir ./4timeline
```
この中に ./receive/create ディレクトリと ./receive/announce ディレクトリのファイルを入れ、処理し、 ./receive/create_done ディレクトリと ./receive/announce_done ディレクトリに送る。

## 4timeline ディレクトリのファイルを処理する
処理するスクリプトを make_timeline.sh として ./scripts ディレクトリに作る。
```bash:make_timeline.sh
#!/bin/bash


if [ -n "$(ls ./receive/create/)" ]; then
	mv ./receive/create/* ./4timeline
fi

if [ -n "$(ls ./receive/announce/)" ]; then
	mv ./receive/announce/* ./4timeline
fi

sorted_files=( $(ls ./4timeline | sort) )

tac timeline.html > TMP # tac コマンドで timeline.html を逆さまに TMP へコピー

for i in ${sorted_files[*]}; do
	req_file="./4timeline/$i"
	json_type=$(cat "$req_file" | grep "{" | jq .type)

	if [ "$json_type" = '"Create"' ]; then
		ID=$(grep "{" "$req_file" | jq .object.id | tr -d '"')
		Time=$(grep "{" "$req_file" | jq .object.published | tr -d '"')
		Poster=$(grep "{" "$req_file" | jq .actor | tr -d '"')
		Content=$(grep "{" "$req_file" | jq -r .object.content | tr -d '"') # jq -r オプションで文字列として出力

# html を変えたかったらここ
		echo "<div>ID:$ID</div><div>$Time</div><div>Poster:$Poster</div><div>$Content</div><hr>" >> TMP
		mv $req_file ./receive/create_done/

	elif [ "$json_type" = '"Announce"' ]; then
		Announcer=$(grep "{" "$req_file" | jq .actor | tr -d '"')
		object=$(grep "{" "$req_file" | jq .object | tr -d '"')
		json_line=$(curl -H "Accept: application/activity+json" "$object")
		ID=$(echo "$json_line" | jq .id | tr -d '"')
		Time=$(echo "$json_line" | jq .published | tr -d '"')
		Poster=$(echo "$json_line" | jq .attributedTo | tr -d '"')
		Content=$(echo "$json_line" | jq -r .content | tr -d '"') # jq -r オプションで文字列として出力

# html を変えたかったらここ
		echo "<div>Announcer:$Announcer</div><div>ID:$ID</div><div>$Time</div><div>Poster:$Poster</div><div>$Content</div><hr>" >> TMP
		mv $req_file ./receive/announce_done/

	fi
done

tac TMP > timeline.html # そして TMP ファイルを tac でまた逆さまに timeline.html へコピー
# rm TMP # TMP ファイル（一時ファイル）を消したかったら
```

この結果
bash ./scripts/make_timeline.sh
を実行すると
./receive/create/* => ./4timeline/* => ./receive/create_done/*
./receive/announce/* => ./4timeline/* => ./receive/announce_done/*
そして 4timeline ディレクトリから移動する前に timeline.html という、投稿と announce が降順時系列になったファイルが出来る。