Compare commits

..

26 Commits

Author SHA1 Message Date
998777d46a test game
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 29m13s
2025-01-22 17:54:42 +09:00
61d7df6922 fix login
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2025-01-20 17:31:45 +09:00
eb8f1b17c8 fix bc
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 18s
2025-01-20 17:30:34 +09:00
fc5e942f0c add card
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2024-12-27 16:40:11 +09:00
d2a394cec2 fix help
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2024-11-08 08:14:41 +09:00
27d5dac208 update gpt-4o-mini 2024-11-08 08:14:40 +09:00
ddd6f37118 fix check cid 2024-11-08 08:14:40 +09:00
14ca1bcdee check feed watch cid
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2024-08-18 02:17:58 +09:00
84efc31248 add feed watch
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2024-08-18 01:30:48 +09:00
3904c576f0 add cargo toml
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2024-08-04 08:10:53 +09:00
08436c0a56 fix docker
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2024-08-04 08:02:53 +09:00
d5603fda52 test planet 2024-08-04 08:02:53 +09:00
4633901ca0 test planet 2024-08-04 08:02:53 +09:00
a8fd189a63 fix bot len return 2024-08-04 08:02:53 +09:00
b540d0c007 fix down feed-generator
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2024-05-23 02:17:31 +09:00
bf31cf2a8f add bot comment system
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 16s
2024-05-14 03:38:59 +09:00
840320d0d2 add bot custom feed
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2024-04-22 22:30:43 +09:00
5d60645c0f fix admin
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 14s
2024-04-12 08:22:54 +09:00
e7c06cf9d1 test manga
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2024-04-04 13:53:39 +09:00
025b24b8f0 fix ten post
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2024-03-31 01:34:23 +09:00
7bbc3370d7 fix fortune
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2024-03-30 02:57:38 +09:00
d6777a0c6a fix sp 2024-03-30 02:57:38 +09:00
87a333d744 fix card handle 2024-03-30 02:57:38 +09:00
2f0bfe08b0 fix print 2024-03-30 02:57:37 +09:00
97856f3765 add host 2024-03-30 02:57:37 +09:00
7b03adda1f v0.1
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9s
2024-03-05 04:09:43 +09:00
86 changed files with 2416 additions and 6905 deletions

1
.config/ai/scpt Submodule

Submodule .config/ai/scpt added at 7a4d642e41

File diff suppressed because it is too large Load Diff

View File

@@ -1,46 +0,0 @@
#!/bin/zsh
url=https://api.syui.ai
token=`cat $HOME/.config/ai/api_card.json|jq -r .token`
pass=`cat $HOME/.config/ai/api_card.json|jq -r .password`
f_reid_user=$HOME/.config/ai/txt/card_reid_user.txt
n=`cat $f_reid_user|wc -l`
for ((i=1;i<=$n;i++))
do
uid=`cat $f_reid_user|awk "NR==$i"`
r=`echo $(($RANDOM % 10))`
if [ $r -eq 1 ];then
card=`echo $(($RANDOM % 15))`
cp=`echo $(($RANDOM % 300 + 50))`
else
card=0
cp=`echo $(($RANDOM % 100 + 1))`
fi
ss=$(($RANDOM % 10))
if [ 13 -ne $card ] && [ $ss -eq 1 ];then
card=13
fi
s=$(($RANDOM % 2))
if [ $s -eq 1 ];then
s=super
plus=$(($RANDOM % 500 + 200))
cp=$((cp + plus))
else
s=normal
fi
if [ $card -eq 13 ];then
plus=$(($RANDOM % 1000 + 300))
cp=$((cp + plus))
fi
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\"}" -s $url/cards`
echo $tmp
card=`echo $tmp|jq -r .card`
cp=`echo $tmp|jq -r .cp`
echo "[card]"
echo "id : ${card}"
echo "cp : ${cp}"
done

View File

@@ -1,215 +0,0 @@
#!/bin/zsh
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ] || [ -z "$4" ] || [ -z "$5" ];then
echo no option
echo "/chara start"
exit
fi
chara_qa="あなたはサッカーをしています。
試合中、ふと目にするのは?
1 : 開けた青空
2 : 真っ白な柱
3 : 風になびく芝生
数字を入れて答えてね。
/chara 数字"
chara_qb="ここは研究室。
実験のため道具を手に持っています。
1 : 淡い液体が入ったガラス瓶
2 : 清潔なシーツ
3 : 観葉植物"
chara_qc="宇宙に打ち上げられたロケットから地球を見ます。
何が見えましたか?
1 : 別の宇宙船
2 : 飛行機
3 : 大きな島"
chara_ba="
☑ 平和を願う
☑ 協調性は高いが自己主張は弱い
☑ 相談がうまい
---"
chara_bb="
☑ 変化自在
☑ 世間離れしており常識知らず
☑ 真面目で芯が強い
---"
chara_bc="
☑ 思慮深い
☑ 一人の時間が好きで冷たく見える
☑ 周りを観察している
---"
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"ten_post\": \"$ten_char\", \"ten_kai\":0,\"ten_su\":$first_ten,\"ten\": true,\"token\":\"$token\"}" -s $host/users/$uid`
data_user_card=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"`
ten_data=`curl -sL "$host/users?itemsPerPage=3000"|jq ".|sort_by(.ten_su)|reverse|.[]|select(.ten_su != 0)"`
data_user_card=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"`
atr=$HOME/.cargo/bin/atr
host=https://api.syui.ai
host_card=https://card.syui.ai/json/card.json
#host_card_json=`curl -sL $host_card`
ran=$(($RANDOM % 3))
pass=`cat $HOME/.config/ai/api_card.json|jq -r .password`
token=`cat $HOME/.config/ai/api_card.json|jq -r .token`
handle=$1
did=$2
username=`echo $1|cut -d . -f 1`
cid=$3
uri=$4
option=$5
yui_did=did:plc:4hqjfn7m6n5hno3doamuhgef
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
uid=`echo $data|jq -r .id`
aiten=`echo $data|jq -r .aiten`
ten_post=`echo $data|jq -r .ten_post`
ten_su=`echo $data|jq -r .ten_su`
ten_kai=`echo $data|jq -r .ten_kai`
ten_delete=`echo $data|jq -r .ten_delete`
ten_bool=`echo $data|jq -r .ten`
day_at=`date +"%Y%m%d"`
nd=`date +"%Y%m%d" -d '1 days ago'`
ten_at_n=`date --iso-8601=seconds`
d=`date +"%Y-%m-%d"`
ten_at=`echo $data|jq -r .ten_at`
ten_at=`date -d "$ten_at" +"%Y-%m-%d"`
data_card=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"`
# uri_post=`echo '{"uri":"at://did:plc:uqzpqmrjnptsxezjx4xuh2mn/app.bsky.feed.post/3k3zr5b336o2u","cid":"bafyreierpw23cxvx4e3cjzd3h6r4crz646zb2ana6cmmsxn4z5rpupl35e"}'|jq -r .uri|cut -d / -f 5`
# https://bsky.app/profile/$did/post/$uri_post
tmp_atr='{"uri":"at://did:plc:uqzpqmrjnptsxezjx4xuh2mn/app.bsky.feed.post/3k3zr5b336o2u","cid":"bafyreierpw23cxvx4e3cjzd3h6r4crz646zb2ana6cmmsxn4z5rpupl35e"}'
function chara_check(){
#card_check=`echo $data_card|jq -r ".[]|select(.card == 48 or .card == 49 or .card == 50 or .card == 51 or .card == 52 or .card == 53)"`
#card_check=`echo $data_card|jq -r ".[]|select(.card == 54 or .card == 55 or .card == 56)"`
card_check=`echo $data_card|jq -r ".[]|select(.card == 58 or .card == 53 or .card == 59)"`
if [ -n "$card_check" ];then
echo you already have chara-card
exit
fi
}
function chara_start() {
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"ten_su\":0, \"ten_kai\":1, \"token\":\"$token\"}" -s $host/users/$uid`
echo "$chara_qa"
exit
}
function chara_post(){
case $1 in
ponta)
card=53
text=$chara_ba
title="[ポンタ]"
desc="緑色"
;;
octo)
card=58
text=$chara_bb
title="[オクトカット]"
desc="白色"
;;
zeusu)
card=59
text=$chara_bc
title="[ゼウス]"
desc="青色"
;;
esac
host_card=https://card.syui.ai/json/card.json
host_card_json=`curl -sL $host_card`
j=`echo $host_card_json|jq ".[]|select(.id == $card)"`
img=`echo $j|jq -r .img`
cp=$(($RANDOM % 1230))
s=super
skill=chara
link="https://card.syui.ai/$username"
card_check=`echo $data_card|jq -r ".[]|select(.card == $card)"`
if [ -z "$card_check" ];then
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\"}" -s $host/cards`
card=`echo $tmp|jq -r .card`
cp=`echo $tmp|jq -r .cp`
fi
tmp_atr=`$atr reply-og "$text" --cid $cid --uri $uri --img $img --title "$title" --description "$desc" --link $link`
uri_post=`echo $tmp_atr|jq -r .uri|cut -d / -f 5`
post_url="https://bsky.app/profile/$yui_did/post/$uri_post"
ccid=`echo $tmp|jq -r .id`
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"url\":\"$post_url\",\"token\":\"$token\"}" $host/cards/$ccid`
exit
}
function chara_plus() {
case $ten_kai in
2)
chara_q=$chara_qb
;;
3)
chara_q=$chara_qc
;;
#4)
# chara_q=$chara_qd
# ;;
esac
echo "$chara_q"
case $1 in
1|2|3)
tmp_su=$1
ten_su=$((ten_su + $tmp_su))
;;
esac
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"ten_su\":$ten_su, \"ten_kai\":$ten_kai, \"token\":\"$token\"}" -s $host/users/$uid`
case $ten_kai in
4)
if [ $ten_su -eq 9 ] || [ $ten_su -eq 8 ] || [ $ten_su -eq 7 ];then
chara=ponta
elif [ $ten_su -eq 6 ];then
chara=octo
else
chara=zeusu
fi
chara_post $chara
;;
esac
}
chara_check
case "$option" in
start)
chara_start
;;
1|2|3)
ten_kai=$((ten_kai + 1))
chara_plus $option
;;
*)
echo "/chara start"
echo "/chara 1,2,3"
;;
esac
exit

View File

@@ -1,156 +0,0 @@
#!/bin/zsh
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
atr=$HOME/.cargo/bin/atr
host=https://api.syui.ai
pass=`cat $HOME/.config/ai/api_card.json|jq -r .password`
token=`cat $HOME/.config/ai/api_card.json|jq -r .token`
egg_card=40
handle=$1
did=$2
username=`echo $1|cut -d . -f 1`
opt=$3
if [ -z "$opt" ];then
echo no option
exit
fi
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
uid=`echo $data|jq -r .id`
aiten=`echo $data|jq -r .aiten`
fav=`echo $data|jq -r .fav`
day_at=`date +"%Y%m%d"`
nd=`date +"%Y%m%d" -d '1 days ago'`
ten_at_n=`date --iso-8601=seconds`
d=`date +"%Y%m%d"`
limit_reset_at=`date --iso-8601=seconds -d '1 days ago'`
data_user_card=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"`
opt_dec=`echo $opt|base64 -d`
if [ "$did" = "$opt_dec" ];then
echo verify
else
echo no verify
exit
fi
fav_card=`echo $data_user_card|jq -r ".[]|select(.card == $egg_card)"`
cid=`echo $fav_card|jq -r .id`
egg_at=`echo $data|jq -r .egg_at`
egg_at=`date -d "$egg_at" +"%Y%m%d"`
egg_at_n=`date --iso-8601=seconds`
day_m=`date +"%H%M"`
day_mm=`date +"%H%M" -d "-1 min"`
day_mmm=`date +"%H%M" -d "-2 min"`
if [ -z "$fav_card" ];then
echo "no egg"
if [ "$egg_at" = "$d" ];then
echo "limit egg"
exit
fi
card=39
data_uu=`curl -sL "$host/users/$uid/card?itemsPerPage=2000"`
card_check=`echo $data_uu|jq -r ".[]|select(.card == $card)|.cp"|head -n 1`
if [ -n "$card_check" ];then
cp=$card_check
cid=`echo $data_uu|jq -r ".[]|select(.card == $card)|.id"|head -n 1`
echo "you already have, dragon"
ran=`echo $(($RANDOM % 3))`
ran_a=`echo $(($RANDOM % 5 + 1))`
if [ $ran -eq 1 ];then
card_check=$((card_check * 3))
echo "🐉 ---> $cp +${ran_a}"
cp=$((cp + ran_a))
else
cp=$((cp + 1))
echo "$cp +1"
fi
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"cp\":$cp,\"token\":\"$token\"}" $host/cards/$cid`
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"egg_at\":\"$egg_at_n\", \"token\":\"$token\"}" -s $host/users/$uid`
exit
fi
card=42
cp=0
data_uu=`curl -sL "$host/users/$uid/card?itemsPerPage=2000"`
card_check=`echo $data_uu|jq -r ".[]|select(.card == $card)|.cp"|head -n 1`
if [ -n "$card_check" ];then
echo "you already have, nyan"
ran=`echo $(($RANDOM % 1000 + 1000))`
aiten_p=$((aiten + ran))
echo "🐈 ---> [aiten]${aiten} +${ran}"
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"egg_at\":\"$egg_at_n\", \"aiten\":$aiten_p, \"token\":\"$token\"}" -s $host/users/$uid`
exit
fi
exit
fi
card_id=`echo $fav_card|jq -r ".id"`
card_cp=`echo $fav_card|jq -r ".cp"`
card_name=`echo $fav_card|jq -r ".card"`
card_status=`echo $fav_card|jq -r ".status"`
card_skill=`echo $fav_card|jq -r ".skill"`
function fav_status() {
echo "\n[card] ${card_name}"
echo "---"
echo "cp : ${card_cp}"
echo "cid : ${cid}"
echo "skill : ${card_skill}"
echo "status : ${card_status}"
}
function fav_battle() {
cp_b=`echo $(($RANDOM % 14))`
if [ "$egg_at" = "$d" ];then
echo "limit egg"
exit
fi
cp_i=`echo $fav_card|jq -r ".cp"`
card_name=`echo $fav_card|jq -r ".card"`
card_status=`echo $fav_card|jq -r ".status"`
card_skill=`echo $fav_card|jq -r ".skill"`
if [ $cp_i -ge $cp_b ];then
card=39
skill=dragon
cp=`echo $(($RANDOM % 1000 + 1200))`
s=third
ran=`echo $(($RANDOM % 10))`
if [ $ran -eq 1 ];then
card=42
skill=nyan
cp=0
fi
body="...congratulations! your egg has evolved\negg ---> ${skill} !!"
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"card\": $card,\"cp\":$cp,\"token\":\"$token\", \"status\": \"$s\",\"skill\": \"$skill\"}" $host/cards/$cid`
else
body="...no evolved"
fi
echo "\n${cp_i} vs $cp_b"
echo "----"
echo "${body}"
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"egg_at\":\"$egg_at_n\",\"token\":\"$token\"}" -s $host/users/$uid`
exit
}
fav_battle
exit

View File

@@ -1,161 +0,0 @@
#!/bin/zsh
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
atr=$HOME/.cargo/bin/atr
host=https://api.syui.ai
pass=`cat $HOME/.config/ai/api_card.json|jq -r .password`
token=`cat $HOME/.config/ai/api_card.json|jq -r .token`
handle=$1
did=$2
username=`echo $1|cut -d . -f 1`
opt=$3
if [ -z "$opt" ];then
echo no option
echo "---"
echo "CID = 1234567"
echo "@yui.syui.ai /fav 1234567"
echo "---"
echo "/fav status"
echo "/fav battle"
exit
fi
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
uid=`echo $data|jq -r .id`
if [ $opt -eq 0 ];then
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"fav\": $opt,\"token\":\"$token\"}" -s $host/users/$uid`
echo ok
exit
fi
aiten=`echo $data|jq -r .aiten`
fav=`echo $data|jq -r .fav`
day_at=`date +"%Y%m%d"`
nd=`date +"%Y%m%d" -d '1 days ago'`
ten_at_n=`date --iso-8601=seconds`
d=`date +"%Y%m%d"`
limit_reset_at=`date --iso-8601=seconds -d '1 days ago'`
data_user_card=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"`
case "$opt" in
[bB]|-[bB]|[bB]attle|[sS]|-[sS]|[sS]tatus)
cid=`echo $data|jq -r .fav`
fav_card=`echo $data_user_card|jq -r ".[]|select(.id == $cid)"`
;;
*)
opt=$((opt + 0))
cid=$opt
fav_card=`echo $data_user_card|jq -r ".[]|select(.id == $cid)"`
;;
esac
updated_at=`echo $data|jq -r .updated_at`
updated_at_m=`date -d "$updated_at" +"%H%M"`
updated_at_n=`date --iso-8601=seconds`
updated_at=`date -d "$updated_at" +"%Y%m%d"`
raid_at=`echo $data|jq -r .raid_at`
raid_at=`date -d "$raid_at" +"%Y%m%d"`
raid_at_n=`date --iso-8601=seconds`
day_m=`date +"%H%M"`
day_mm=`date +"%H%M" -d "-1 min"`
day_mmm=`date +"%H%M" -d "-2 min"`
if [ -z "$fav_card" ];then
echo "no card id"
exit
fi
card_id=`echo $fav_card|jq -r ".id"`
card_cp=`echo $fav_card|jq -r ".cp"`
card_name=`echo $fav_card|jq -r ".card"`
card_status=`echo $fav_card|jq -r ".status"`
card_skill=`echo $fav_card|jq -r ".skill"`
function fav_status() {
echo "\n[card] ${card_name}"
echo "---"
echo "cp : ${card_cp}"
echo "cid : ${cid}"
echo "skill : ${card_skill}"
echo "status : ${card_status}"
}
function fav_battle() {
if [ -n "$1" ];then
cp_b=$1
else
cp_b=$(($RANDOM % 1400))
fi
if [ $updated_at -ge $d ] || [ "$updated_at" = "$d" ];then
echo "limit battle"
exit
fi
cp_i=`echo $fav_card|jq -r ".cp"`
card_name=`echo $fav_card|jq -r ".card"`
card_status=`echo $fav_card|jq -r ".status"`
card_skill=`echo $fav_card|jq -r ".skill"`
if [ $cp_i -gt $cp_b ];then
if [ $cp_i -ge 9000 ];then
cp_plus=$(($RANDOM % 27 + 1))
elif [ $cp_i -ge 7000 ];then
cp_plus=$(($RANDOM % 47 + 1))
else
cp_plus=$(($RANDOM % 237 + 1))
fi
else
cp_plus=$(($RANDOM % 17 + 1))
fi
echo "\n✧${cp_i} vs $cp_b"
echo "----"
cp=$((cp_i + cp_plus))
body="level up!"
echo "${body}${cp}(+${cp_plus})"
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"cp\":$cp,\"token\":\"$token\"}" $host/cards/$cid`
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"updated_at\":\"$updated_at_n\",\"token\":\"$token\"}" -s $host/users/$uid`
exit
}
function fav_add() {
card_status=fifth
u_data=`curl -sL "https://api.syui.ai/users/$uid/card?itemsPerPage=2555"|jq -r ".[]|select(.status == \"$card_status\")"`
if [ -z "$u_data" ];then
d_data=`curl -sL $host/cards/$cid|jq -r "select(.status == \"first\" or .status == \"second\" or .status == \"third\" or .status == \"yui\" or .status == \"fourth\" or .status == \"$card_status\")"`
if [ -z "$d_data" ];then
echo status $card_status
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"status\":\"$card_status\",\"token\":\"$token\"}" $host/cards/$cid`
fi
fi
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"fav\": $opt,\"token\":\"$token\"}" -s $host/users/$uid`
if [ -n "$tmp" ];then
echo ok
fi
exit
}
case "$opt" in
[bB]|-[bB]|[bB]attle)
fav_battle $4
;;
[sS]|-[sS]|[sS]tatus)
fav_status
;;
*)
fav_add
;;
esac
exit

View File

@@ -1,278 +0,0 @@
#!/bin/zsh
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
atr=$HOME/.cargo/bin/atr
host=https://api.syui.ai
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
handle=$1
did=$2
username=`echo $1|cut -d . -f 1`
cid=`echo $3|cut -d ' ' -f 1`
guser=$4
if [ "$3" = "ai" ];then
guser=ai
fi
if [ -z "$cid" ];then
echo no option
echo "---"
echo "@yui.syui.ai /gift ai"
echo "---"
echo "@yui.syui.ai /gift status"
echo "12345"
echo "67891"
echo "---"
echo "@yui.syui.ai /gift 12345"
echo ""
echo "---"
echo "@yui.syui.ai /gift 12345 syui"
exit
fi
function card_env(){
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
gdata=`echo $all_data|jq ".[]|select(.username == \"$guser\")"`
if [ -z "$data" ];then
exit
fi
uid=`echo $data|jq -r .id`
gid=`echo $gdata|jq -r .id`
aiten=`echo $data|jq -r .aiten`
fav=`echo $data|jq -r .fav`
cdata=`curl -sL $host/cards/$cid`
if [ -z "$cdata" ];then
echo no card
exit
fi
card=`echo $cdata|jq -r .card`
cp=`echo $cdata|jq -r .cp`
count=`echo $cdata|jq -r .count`
author=`echo $cdata|jq -r .author`
skill=`echo $cdata|jq -r .skill`
s=`echo $cdata|jq -r .status`
if [ $count -eq 0 ];then
echo card count 0
exit
fi
if [ $author != "$username" ];then
echo no author
echo "$author --> $username"
exit
fi
}
function card_env_ai(){
guser=ai
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
gdata=`echo $all_data|jq ".[]|select(.username == \"$guser\")"`
if [ -z "$data" ];then
exit
fi
uid=`echo $data|jq -r .id`
gid=`echo $gdata|jq -r .id`
aiten=`echo $data|jq -r .aiten`
fav=`echo $data|jq -r .fav`
cdata=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"|jq ".[0]"`
if [ -z "$cdata" ];then
cdata=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"|jq ".[]|select(.author == \"$username\")"|jq -s ".[0]"`
fi
if [ -z "$cdata" ];then
echo no card
exit
fi
cid=`echo $cdata|jq -r .id`
card=`echo $cdata|jq -r .card`
cp=`echo $cdata|jq -r .cp`
count=`echo $cdata|jq -r .count`
author=`echo $cdata|jq -r .author`
skill=`echo $cdata|jq -r .skill`
s=`echo $cdata|jq -r .status`
if [ $count -eq 0 ];then
echo card count 0
exit
fi
if [ $author != "$username" ];then
echo no author
echo "$author --> $username"
exit
fi
aicard=`curl -sL "$host/users/$gid/card?itemsPerPage=3000"|jq -r ".[]|select(.card >= 1)"|jq -s`
if [ -z "$aicard" ];then
exit
fi
n=`echo $aicard|jq length`
n=$((n - 1))
ran=$((RANDOM % n))
ai_id=`echo $aicard|jq -r ".[$ran]|.id"`
ai_card=`echo $aicard|jq -r ".[$ran]|.card"`
ai_cp=`echo $aicard|jq -r ".[$ran]|.cp"`
ai_skill=`echo $aicard|jq -r ".[$ran]|.skill"`
ai_s=`echo $aicard|jq -r ".[$ran]|.status"`
ai_author=ai
}
function card_env_ai_select(){
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
gdata=`echo $all_data|jq ".[]|select(.username == \"$guser\")"`
if [ -z "$data" ];then
exit
fi
uid=`echo $data|jq -r .id`
gid=`echo $gdata|jq -r .id`
aiten=`echo $data|jq -r .aiten`
fav=`echo $data|jq -r .fav`
cdata=`curl -sL $host/cards/$cid`
if [ -z "$cdata" ];then
echo no card
exit
fi
cid=`echo $cdata|jq -r .id`
card=`echo $cdata|jq -r .card`
cp=`echo $cdata|jq -r .cp`
count=`echo $cdata|jq -r .count`
author=`echo $cdata|jq -r .author`
skill=`echo $cdata|jq -r .skill`
s=`echo $cdata|jq -r .status`
if [ $count -eq 0 ];then
echo card count 0
exit
fi
if [ $author != "$username" ];then
echo no author
echo "$author --> $username"
exit
fi
aicard=`curl -sL "$host/users/$gid/card?itemsPerPage=3000"|jq -r ".[]|select(.card >= 1)"|jq -s`
if [ -z "$aicard" ];then
exit
fi
n=`echo $aicard|jq length`
n=$((n - 1))
ran=$((RANDOM % n))
ai_id=`echo $aicard|jq -r ".[$ran]|.id"`
ai_card=`echo $aicard|jq -r ".[$ran]|.card"`
ai_cp=`echo $aicard|jq -r ".[$ran]|.cp"`
ai_skill=`echo $aicard|jq -r ".[$ran]|.skill"`
ai_s=`echo $aicard|jq -r ".[$ran]|.status"`
ai_author=ai
}
function card_gift() {
card_env
if [ -z "$guser" ];then
echo card:$card
echo skill:$skill
echo status:$s
echo count:$count
echo author:$author
exit
fi
count=$((count - 1))
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$gid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\",\"author\":\"$username\",\"count\":0}" -sL $host/cards`
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"count\":$count,\"token\":\"$token\"}" $host/cards/$cid -sL`
echo ok
echo "$author($cid) --> $guser"
}
function card_ai() {
card_env_ai
count=$((count - 1))
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$gid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\",\"author\":\"$username\",\"count\":0}" -sL $host/cards`
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"count\":$count,\"token\":\"$token\"}" $host/cards/$cid -sL`
echo ok
echo "$author($cid) --> $guser"
echo "---"
echo 'thx!'
echo card:$ai_card
echo cp:$ai_cp
echo author:$ai_author
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$ai_card,\"status\":\"$ai_s\",\"cp\":$ai_cp,\"password\":\"$pass\",\"skill\":\"$ai_skill\",\"author\":\"$ai_author\",\"count\":0}" -sL $host/cards`
}
function card_ai_select() {
card_env_ai_select
count=$((count - 1))
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$gid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\",\"author\":\"$username\",\"count\":0}" -sL $host/cards`
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"count\":$count,\"token\":\"$token\"}" $host/cards/$cid -sL`
echo ok
echo "$author($cid) --> $guser"
echo "---"
echo 'thx!'
echo card:$ai_card
echo cp:$ai_cp
echo author:$ai_author
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$ai_card,\"status\":\"$ai_s\",\"cp\":$ai_cp,\"password\":\"$pass\",\"skill\":\"$ai_skill\",\"author\":\"$ai_author\",\"count\":0}" -sL $host/cards`
}
function card_status(){
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
uid=`echo $data|jq -r .id`
acard=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"|jq ".[]|select(.author == \"$username\")|.id"`
if [ -z "$acard" ];then
echo no card
exit
fi
echo $acard
}
function test_cmd(){
echo "test ok /gift $1"
echo cid:$cid
echo guser:$guser
exit
}
case $cid in
"status")
card_status
;;
"ai")
#test_cmd ai
card_ai
;;
*)
if [ "ai" = "$guser" ];then
#test_cmd ai_select
card_ai_select
else
#test_cmd gift user
card_gift
fi
;;
esac
exit

File diff suppressed because it is too large Load Diff

View File

@@ -1,183 +0,0 @@
#!/bin/zsh
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
card_pay=$HOME/.config/ai/scpt/card_pay.zsh
atr=$HOME/.cargo/bin/atr
host=https://api.syui.ai
host_card=https://card.syui.ai/json/card.json
host_card_json=`curl -sL $host_card`
n_cid=$HOME/.config/ai/txt/tmp_notify_cid.txt
f_cfg=$HOME/.config/ai/txt/tmp_ten_config.txt
handle=$1
did=$2
username=`echo $1|cut -d . -f 1`
cid=$3
uri=$4
if [ ! -f $f_cfg ];then
echo $host_card_json |jq -r ".[]|select(.ten != null)|.ten" |tr -d '\n' >! $f_cfg
fi
if [ -f $f_cfg ];then
nn=`cat $f_cfg|wc -c`
fi
pass=`cat $HOME/.config/ai/api_card.json|jq -r .password`
token=`cat $HOME/.config/ai/api_card.json|jq -r .token`
function ten_yak() {
unset ran_a
unset ran_b
unset ran_c
unset ten_new
unset ten_yaku
ran_a=$(($RANDOM % nn))
ran_b=$(($RANDOM % nn))
ran_c=$(($RANDOM % nn))
ten_new=0
char_a=`cat $f_cfg| cut -c $ran_a`
char_b=`cat $f_cfg| cut -c $ran_b`
char_c=`cat $f_cfg| cut -c $ran_c`
ten_char=`echo "${char_a}\n${char_b}\n${char_c}"|head -n 3|sort|tr -d '\n'`
if [ ${#ten_char} -eq 0 ];then
ten_char=AAA
fi
if [ ${#ten_char} -eq 1 ];then
ten_char=AA${ten_char}
fi
if [ ${#ten_char} -eq 2 ];then
ten_char=A${ten_char}
fi
char_a=`echo $ten_char|cut -b 1`
char_b=`echo $ten_char|cut -b 2`
char_c=`echo $ten_char|cut -b 3`
case $ten_char in
EMY)
card=1
;;
KOS)
card=2
;;
CHI)
card=3
;;
AIT)
card=4
;;
OYZ)
card=5
;;
IKY)
card=6
;;
AKM)
card=7
;;
KUY)
card=8
;;
AW*)
card=9
;;
AHK)
card=10
;;
IKT)
card=11
;;
AAM)
card=12
;;
OSZ)
card=13
;;
CHO)
card=14
;;
*)
card=0
;;
esac
ten_new=${card}00
if [ $ten_new -eq 0 ];then
ten_new=0
else
ten_yaku="[$ten_char]"
fi
if [ "$ten_char" = "AAA" ];then
ten_new=100
fi
if [ "$char_a" = "A" ] && [ "$char_b" = "I" ] && [ $ten_new -ne 0 ];then
ten_new=150
fi
if [ "$char_a" = "$char_b" ] && [ $ten_new -ne 0 ];then
ten_new=50
fi
echo "[$i] $ten_su $ten_yaku+$ten_new"
ten_su=$((ten_su + ten_new))
}
function user_env() {
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
ten_data=`echo $all_data|jq ".|sort_by(.ten_su)|reverse|.[]|select(.ten_su != 0)"`
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
uid=`echo $data|jq -r .id`
aiten=`echo $data|jq -r .aiten`
ten_post=`echo $data|jq -r .ten_post`
ten_bool=`echo $data|jq -r .ten`
day_at=`date +"%Y%m%d"`
nd=`date +"%Y%m%d" -d '1 days ago'`
ten_at_n=`date --iso-8601=seconds`
limit_reset_at=`date --iso-8601=seconds -d '1 days ago'`
d=`date +"%Y-%m-%d"`
ten_at=`echo $data|jq -r .ten_at`
ten_at=`date -d "$ten_at" +"%Y-%m-%d"`
ten_kai=`echo $data|jq -r .ten_kai`
if [ "$d" = "$ten_at" ];then
echo "limit aiten"
exit
fi
ten_kai=`echo $data|jq -r .ten_kai`
}
function ten_shutdown(){
ten_kai=0
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
ten=`echo $((ten_su + 200))`
ten_su=$ten
aiten=`echo $((aiten + ten_su))`
echo "+100"
echo "---"
echo user : $handle
echo ten : $ten
echo aiten :
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"ten_kai\":$ten_kai, \"ten_su\":$ten_su, \"ten\": false, \"token\":\"$token\", \"ten_at\" : \"$ten_at_n\", \"aiten\": $aiten}" -s $host/users/$uid`
}
user_env
for ((i=1;i<=7;i++))
do
ten_yak
done
ten_shutdown
exit

View File

@@ -1,31 +0,0 @@
#!/bin/zsh
host=https://api.syui.ai
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
function ten_su_reset() {
ten_data=`curl -sL "$host/users?itemsPerPage=3000"|jq ".|sort_by(.ten_su)|reverse|.[]|select(.ten_su != 0)"`
ten_u_tmp=`echo $ten_data|jq -s`
ten_n_tmp=`echo $ten_u_tmp|jq "length"`
ten_n_tmp=$((ten_n_tmp - 1))
#ten_n_tmp=5
for ((i=0;i<$ten_n_tmp;i++))
do
u_i=`echo $ten_u_tmp|jq -r ".[$i].id"`
u_a=`echo $ten_u_tmp|jq -r ".[$i].username"`
u_s=`echo $ten_u_tmp|jq -r ".[$i].ten_su"`
echo "---"
echo "id : $u_i"
echo "user : $u_a"
echo "ten : $u_s"
curl -X PATCH -H "Content-Type: application/json" -d "{\"ten\": false,\"token\":\"$token\", \"ten_su\": 0}" -s $host/users/$u_i
done
}
ten_su_reset

View File

@@ -1,79 +0,0 @@
#!/bin/zsh
home=/root
name=arch
a=$home/$name
function arch_in(){
mkdir -p $a
sudo pacstrap -c $a base
#sudo echo pts/0 >> $a/etc/securetty
#sudo echo pts/1 >> $a/etc/securetty
sudo rm -rf /var/lib/machines/$name
sudo rm -rf /var/lib/machines/${name}back
sudo mv $a /var/lib/machines/
sudo machinectl clone arch archback
}
function arch_rm(){
sudo machinectl remove $name
}
function arch_up(){
sudo machinectl poweroff $name > /dev/null 2>&1
sleep 5
sudo machinectl terminate $name > /dev/null 2>&1
sleep 5
sudo machinectl start ${name}back
sleep 5
ssh ${name}back pacman -Syu --noconfirm
sleep 5
sudo machinectl poweroff ${name}back
}
function arch_st(){
sudo machinectl start $name
}
function arch_of(){
sudo machinectl poweroff $name
}
function arch_ex(){
sudo machinectl shell $name
$1
poweroff
}
function arch_re(){
sudo machinectl poweroff $name > /dev/null 2>&1
sleep 5
sudo machinectl terminate $name > /dev/null 2>&1
sleep 5
sudo machinectl remove $name
sleep 5
sudo machinectl clone ${name}back $name
sleep 5
sudo machinectl start $name
}
case "$1" in
"update"|"-u")
arch_up
arch_re
echo "machinectl update done"
;;
"reset"|"-r")
arch_re
echo "machinectl reset done"
;;
*)
sudo machinectl start $name
t=`ssh $name "$*"`
if [ -z "$t" ];then
ssh -tt $name "$*"
else
echo "$t"
fi
;;
esac

View File

@@ -1,21 +0,0 @@
#!/bin/zsh
dir=${0:a:h}
f=$HOME/.config/ai/scpt/png/t.png
f_sleep=$HOME/.config/ai/scpt/png/sleep
cid=$1
uri=$2
if [ ! -f $f ];then
atr r "limit 1 day" -c $cid -u $uri
exit
fi
if [ -f $f_sleep ];then
link=bafkreidgp2cl4cvkn3i4gzqj6kfiwngjjh5ie2jwobh632jh4ejlbiwdhm
atr img-post "#nyancat" -l $link -c $cid -u $uri
rm $f_sleep
exit
fi
link=`atr img-upload $f|jq -r .blob.ref.'"$link"'`
atr img-post "#stablediffusion" -l $link -c $cid -u $uri

View File

@@ -1,21 +0,0 @@
#!/bin/zsh
d=${0:a:h:h}
url="search.bsky.social/search/posts?q="
q=`echo $*|tr ' ' '+'`
url="${url}${q}"
t=`curl -sL "$url"`
echo $t
n=`echo $t|jq "length"`
n=`expr $n - 1`
for ((i=0;i<=$n;i++))
do
did=`echo $t|jq -r ".[$i].user.did"`
text=`echo $t|jq -r ".[$i].post.text"`
tid=`echo $t|jq -r ".[$i].tid"`
if [ "$text" != "null" ];then
echo $did
echo $text
echo https://$tid
fi
done

View File

@@ -1,24 +0,0 @@
#!/bin/zsh
d=${0:a:h}
dd=${0:a:h:h}/json
#https://github.com/bluesky-social/atproto/issues/597
host=bsky.social
base=https://$host/xrpc
handle=`cat ~/.config/atr/token.json| jq -r .handle`
token=`cat ~/.config/atr/token.json| jq -r .accessJwt`
if [ -n "$1" ];then
url=$base/$1
else
url="$base/app.bsky.actor.getProfile?actor=$handle"
fi
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/profile.json
cat $dd/profile.json
url=$base/app.bsky.feed.getTimeline
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/timeline.json
cat $dd/timeline.json
url=$base/app.bsky.notification.listNotifications
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/notify.json
cat $dd/notify.json|jq .

View File

@@ -1,39 +0,0 @@
#!/bin/zsh
host_at=bsky.social
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
scpt=$HOME/.config/ai/scpt/api_card.zsh
handle=skychan.social
did=did:plc:7hgow77uky7lgbinwyvbzhar
f=$HOME/.config/ai/card_bot.txt
touch $f
n=5
for ((i=0;i<=$n;i++))
do
echo $i
cid=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.cid"`
uri=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.uri"`
t=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.value.text"`
echo $t $cid $uri
if [ "@yui.syui.ai /card" = "$t" ];then
if [ "$cid" = "`cat $f`" ];then
exit
fi
card=`$scpt $handle $did`
link="https://card.syui.ai/skychan"
~/.cargo/bin/atr r "$card" -c $cid -u "$uri" -l "$link"
echo $cid >! $f
fi
if [ "@yui.syui.ai /card -b" = "$t" ];then
if [ "$cid" = "`cat $f`" ];then
exit
fi
card=`$scpt $handle $did -b`
link="https://card.syui.ai/skychan"
~/.cargo/bin/atr r "\n$card" -c $cid -u "$uri" -l "$link"
echo $cid >! $f
fi
done
exit

View File

@@ -1,60 +0,0 @@
#!/bin/zsh
d=$HOME/.config/ai/txt
mkdir -p $d
f=$d/kawaii.txt
function test_post() {
host_at=bsky.social
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
handle=lilly-niyu.bsky.social
n=10
for ((i=0;i<=$n;i++))
do
echo $i
cid=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.cid"`
uri=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.uri"`
t=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.value.text"`
echo $t $cid $uri
if [ "かわいいにゃ〜!!" = "$t" ];then
#atr r "楽しそう!アイもまぜてよ" -c $cid -u "$uri"
fi
done
}
#uri=at://$did/$tid
#{
# "tid": "app.bsky.feed.post/3judrtmxuin2b",
# "cid": "bafyreibebbn7og5dgvvegcjlh357pnrpuvvinbjeaqbfvqb4jsrpbsw3di",
# "user": {
# "did": "did:plc:hodycxjeqfxtest2ilj47j7g",
# "handle": "lilly-niyu.bsky.social"
# },
# "post": {
# "createdAt": 1682587582509000000,
# "text": "かわいいにゃ〜!!",
# "user": "lilly-niyu.bsky.social"
# }
#}
url="search.bsky.social/search/posts?q=かわいいにゃ〜!!"
q=`echo $*|tr ' ' '+'`
url="${url}${q}"
t=`curl -sL "$url"`
cid=`echo $t|jq -r ".[1].cid"`
did=`echo $t|jq -r ".[1].did"`
tid=`echo $t|jq -r ".[1].tid"`
uri="at://$did/$tid"
text=`echo $t|jq -r ".[1].post.text"`
touch $f
echo $text
if [ "かわいいにゃ〜!!" = "$text" ] && [ "`cat $f`" != "$cid" ];then
echo ok
atr r "楽しそう!アイもまぜてよ" -c $cid -u "$uri"
echo $cid >! $f
else
echo no
fi

View File

@@ -1,79 +0,0 @@
#!/bin/zsh
url_plc="https://plc.directory/export"
host_at=bsky.social
url=https://plc.directory
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
dir=$HOME/.config/atr/txt
file=$dir/bot_list.txt
unset timed
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
if [ -z "$1" ];then
exit
fi
if ! echo $1|grep "." >/dev/null 2>&1;then
echo "ex : user syui.bsky.social"
exit
fi
if [ ! -d $dir ];then
mkdir -p $dir
fi
if [ ! -f $file ];then
touch $file
fi
function mfile() {
t=`cat $file|sort|uniq`
if [ -n "$t" ];then
echo "$t" >! ${file}.back
mv ${file}.back $file
fi
}
function plc(){
if cat $file|grep "$1" >/dev/null 2>&1;then
cat $file|grep "$1"
exit
fi
json_tmp=`curl -sL "${url_plc}?after=${timed}"|jq .`
json=`echo $json_tmp|jq "select(.operation.handle == \"$1\")"`
if [ -z "$json" ];then
check=`echo $json_tmp|jq -r ".operation.alsoKnownAs"|head -n 1`
if [ "null" != "$check" ];then
json=`echo $json_tmp|jq "select(.operation.alsoKnownAs|.[] == \"at://$1\")"` >/dev/null 2>&1
fi
fi
if [ -n "$json" ];then
created_at=`echo $json|jq -r .createdAt |tail -n 1`
fi
if [ -n "$created_at" ];then
echo "$created_at : $1"
echo "$created_at : $1" >> $file
mfile
exit
fi
}
if [ "$1" = "-l" ];then
mfile
cat $file
exit
fi
for ((i=0;i<=20;i++))
do
if [ $i -eq 0 ];then
timed="1970-01-01"
fi
plc $1
timed=`echo $json_tmp|jq -r .createdAt|tail -n 1`
done

View File

@@ -1,29 +0,0 @@
#!/bin/zsh
d=${0:a:h}
dd=${0:a:h:h}/json
#https://github.com/bluesky-social/atproto/issues/597
host=`cat ~/.config/atr/config.json|jq -r .host`
base=https://$host/xrpc
handle=`cat ~/.config/atr/config.json|jq -r .user`
pass=`cat ~/.config/atr/config.json|jq -r .pass`
f=~/.config/atr/token.json
curl -X POST -H "Content-Type: application/json" -d "{\"identifier\":\"$handle\",\"password\":\"$pass\"}" https://$host/xrpc/com.atproto.server.createSession | jq . >! $f
cat $f
if [ "$1" = "-a" ];then
handle=`cat $f| jq -r .handle`
token=`cat $f| jq -r .accessJwt`
url="$base/app.bsky.actor.getProfile?actor=$handle"
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/profile.json
cat $dd/profile.json
url=$base/app.bsky.feed.getTimeline
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/timeline.json
cat $dd/timeline.json
url=$base/app.bsky.notification.listNotifications
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/notify.json
cat $dd/notify.json|jq .
fi

View File

@@ -1,40 +0,0 @@
#!/bin/zsh
echo "not open"
exit
atr=$HOME/.cargo/bin/atr
url_j=https://card.syui.ai/json/card.json
tcid=$HOME/.config/ai/txt/tmp_notify_cid.txt
handle=$1
did=$2
cid=$3
uri=$4
if [ ! -d $HOME/.config/ai/txt ];then
mkdir -p $HOME/.config/ai/txt
fi
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
url=https://api.syui.ai
username=`echo $1|cut -d . -f 1`
link=https://card.syui.ai/$username
ran=$(($RANDOM % 10))
if [ $ran -eq 1 ];then
uranai="今日の運勢をルーン占いでやってください。結果を120文字以内で教えてください"
else
uranai="今日の運勢をタロット占いでやってください。結果を120文字以内で教えてください"
fi
body=`$atr chat "$uranai" -c`
if $atr r "$body" -c $cid -u $uri;then
echo $cid >! $tcid
fi
exit

View File

@@ -1,161 +0,0 @@
#!/bin/zsh
atr=$HOME/.cargo/bin/atr
url_j=https://card.syui.ai/json/card.json
tcid=$HOME/.config/ai/txt/tmp_notify_cid.txt
handle=$1
did=$2
cid=$3
uri=$4
if [ ! -d $HOME/.config/ai/txt ];then
mkdir -p $HOME/.config/ai/txt
fi
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
url=https://api.syui.ai
username=`echo $1|cut -d . -f 1`
link=https://card.syui.ai/$username
ran=$(($RANDOM % 10))
if [ $ran -eq 1 ];then
uranai="今日の運勢をルーン占いでやってください。結果を120文字以内で教えてください"
else
uranai="今日の運勢をタロット占いでやってください。結果を120文字以内で教えてください"
fi
uid=`curl -sL "$url/users?itemsPerPage=2000"|jq ".[]|select(.username == \"$username\")"|jq -r .id`
if [ -z $uid ] || [ "$uid" = "null" ];then
body=`$atr chat "$uranai" -c`
body=`echo "占いにはアイのカードが3枚以上必要です\n\n$body"`
if [ "`cat $tcid`" != "$cid" ];then
if $atr r "$body" -c $cid -u $uri;then
echo $cid >! $tcid
fi
fi
exit
fi
data=`curl -sL "$url/users/$uid"`
data_u=`curl -sL "$url/users/$uid/card?itemsPerPage=2000"`
luck_at=`echo $data|jq -r .luck_at`
luck_at_n=`date --iso-8601=seconds`
luck_at=`date -d "$luck_at" +"%Y%m%d"`
day_at=`date +"%Y%m%d"`
nd=`date +"%Y%m%d" -d '1 days ago'`
if [ "$luck_at" = "$day_at" ];then
body=`$atr chat "$uranai" -c`
if [ "`cat $tcid`" != "$cid" ];then
if $atr r "$body" -c $cid -u $uri;then
echo $cid >! $tcid
fi
fi
exit
fi
cp_i=`echo $data_u |jq -r "sort_by(.cp) | reverse|.[].card"|sort|uniq|sed -e '1d'`
cp_n=`echo $cp_i|wc -l`
if [ 3 -gt $cp_n ];then
body=`$atr chat "$uranai" -c`
body=`echo "占いにはアイのカードが3枚以上必要です\n\n$body"`
if [ "`cat $tcid`" != "$cid" ];then
if $atr r "$body" -c $cid -u $uri;then
echo $cid >! $tcid
fi
fi
exit
fi
ran=$(($RANDOM % $cp_n + 1))
luck=$(($RANDOM % 8))
sub=$(($RANDOM % 15))
card=`echo $cp_i|awk "NR==$ran"`
if [ $sub -eq $card ];then
sub="x2"
else
sub=`curl -sL $url_j|jq -r ".[]|select(.id == $sub)|.p"`
fi
j=`curl -sL $url_j|jq ".[]|select(.id == $card)"`
img=`echo $j|jq -r .img`
if [ -z $img ] || [ "$img" = "null" ];then
exit
fi
test_ran=`echo $(($RANDOM % 3))`
#text="アイ・カード占い"
case $test_ran in
1)
text=`$atr chat "アイのカード占いを作ってやってみて。感じる答えを出して。できれば140文字以内でお願い。" -c`
;;
2)
text=`$atr chat "今、アイが自分で考えた占いやってみて。気分が乗らなかったらやらなくていいよ。できれば140文字以内で答えてね。" -c`
;;
*)
text=`$atr chat "今のアイの気分で適当に占ってみて。できれば140文字以内で答えてね。" -c`
;;
esac
title=`echo $j|jq -r .h`
title="[${title}]"
#desc=`echo $j|jq -r .p`
if [ 0 -eq $luck ];then
desc="0"
fi
if [ 1 -eq $luck ];then
desc="1"
fi
if [ 2 -eq $luck ];then
desc="2"
fi
if [ 3 -eq $luck ];then
desc="3"
fi
if [ 4 -eq $luck ];then
desc="4"
fi
if [ 5 -eq $luck ];then
desc="5"
fi
if [ 6 -eq $luck ];then
desc="6"
fi
if [ 7 -eq $luck ];then
desc="7"
fi
desc=`echo "アイ数字は${luck}"`
if [ "`cat $tcid`" != "$cid" ];then
if $atr reply-og "$text" --cid $cid --uri $uri --img $img --title "$title" --description "$desc" --link $link;then
echo $cid >! $tcid
fi
fi
pass=`cat $HOME/.config/ai/api_card.json|jq -r .password`
token=`cat $HOME/.config/ai/api_card.json|jq -r .token`
if [ $luck -eq 7 ];then
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"luck_at\":\"$luck_at_n\",\"token\":\"$token\",\"luck\": $luck, \"next\": \"$nd\"}" -s $url/users/$uid`
else
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"luck_at\":\"$luck_at_n\",\"token\":\"$token\",\"luck\": $luck}" -s $url/users/$uid`
fi
exit

View File

@@ -1,147 +0,0 @@
#!/bin/zsh
atr=$HOME/.cargo/bin/atr
url_j=https://card.syui.ai/json/card.json
tcid=$HOME/.config/ai/txt/tmp_notify_cid.txt
handle=$1
did=$2
cid=$3
uri=$4
if [ ! -d $HOME/.config/ai/txt ];then
mkdir -p $HOME/.config/ai/txt
fi
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
url=https://api.syui.ai
username=`echo $1|cut -d . -f 1`
link=https://card.syui.ai/$username
ran=$(($RANDOM % 10))
if [ $ran -eq 1 ];then
uranai="Please do a of today's rune-fortune. Tell us the result in 120 characters or less."
else
uranai="Please do a of today's tarot-fortune. Tell us the result in 120 characters or less."
fi
uid=`curl -sL "$url/users?itemsPerPage=2000"|jq ".[]|select(.username == \"$username\")"|jq -r .id`
if [ -z $uid ] || [ "$uid" = "null" ];then
body=`$atr chat "$uranai" -c`
body=`echo "At least 3 cards of the Eye are required for divination\n\n$body"`
if [ "`cat $tcid`" != "$cid" ];then
if $atr r "$body" -c $cid -u $uri;then
echo $cid >! $tcid
fi
fi
exit
fi
data=`curl -sL "$url/users/$uid"`
data_u=`curl -sL "$url/users/$uid/card?itemsPerPage=2000"`
luck_at=`echo $data|jq -r .luck_at`
luck_at_n=`date --iso-8601=seconds`
luck_at=`date -d "$luck_at" +"%Y%m%d"`
day_at=`date +"%Y%m%d"`
nd=`date +"%Y%m%d" -d '1 days ago'`
if [ "$luck_at" = "$day_at" ];then
body=`$atr chat "$uranai" -c`
if [ "`cat $tcid`" != "$cid" ];then
if $atr r "$body" -c $cid -u $uri;then
echo $cid >! $tcid
fi
fi
exit
fi
cp_i=`echo $data_u |jq -r "sort_by(.cp) | reverse|.[].card"|sort|uniq|sed -e '1d'`
cp_n=`echo $cp_i|wc -l`
if [ 3 -gt $cp_n ];then
body=`$atr chat "$uranai" -c`
body=`echo "At least 3 cards of the Eye are required for divination\n\n$body"`
if [ "`cat $tcid`" != "$cid" ];then
if $atr r "$body" -c $cid -u $uri;then
echo $cid >! $tcid
fi
fi
exit
fi
ran=$(($RANDOM % $cp_n + 1))
luck=$(($RANDOM % 8))
sub=$(($RANDOM % 15))
card=`echo $cp_i|awk "NR==$ran"`
if [ $sub -eq $card ];then
sub="x2"
else
sub=`curl -sL $url_j|jq -r ".[]|select(.id == $sub)|.p"`
fi
j=`curl -sL $url_j|jq ".[]|select(.id == $card)"`
img=`echo $j|jq -r .img`
if [ -z $img ] || [ "$img" = "null" ];then
exit
fi
text="AI Card Fortune Telling"
title=`echo $j|jq -r .h_en`
title="[${title}]"
#desc=`echo $j|jq -r .p`
if [ 0 -eq $luck ];then
desc="0"
fi
if [ 1 -eq $luck ];then
desc="1"
fi
if [ 2 -eq $luck ];then
desc="2"
fi
if [ 3 -eq $luck ];then
desc="3"
fi
if [ 4 -eq $luck ];then
desc="4"
fi
if [ 5 -eq $luck ];then
desc="5"
fi
if [ 6 -eq $luck ];then
desc="6"
fi
if [ 7 -eq $luck ];then
desc="7"
fi
desc=`echo "lucky number ${luck}"`
if [ "`cat $tcid`" != "$cid" ];then
if $atr reply-og "$text" --cid $cid --uri $uri --img $img --title "$title" --description "$desc" --link $link;then
echo $cid >! $tcid
fi
fi
pass=`cat $HOME/.config/ai/api_card.json|jq -r .password`
token=`cat $HOME/.config/ai/api_card.json|jq -r .token`
if [ $luck -eq 7 ];then
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"luck_at\":\"$luck_at_n\",\"token\":\"$token\",\"luck\": $luck, \"next\": \"$nd\"}" -s $url/users/$uid`
else
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"luck_at\":\"$luck_at_n\",\"token\":\"$token\",\"luck\": $luck}" -s $url/users/$uid`
fi
exit

View File

@@ -1,154 +0,0 @@
#!/bin/zsh
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
atr=$HOME/.cargo/bin/atr
host=https://api.syui.ai
host_card=https://card.syui.ai/json/card.json
pass=`cat $HOME/.config/ai/api_card.json|jq -r .password`
token=`cat $HOME/.config/ai/api_card.json|jq -r .token`
handle=$1
username=`echo $1|cut -d . -f 1`
did=$2
cid=$3
uri=$4
pay=60000
echo $handle
function card_d(){
j=`curl -sL $host_card |jq -r ".[]|select(.ten_skill == true)"|jq -s`
n=`echo $j|jq length`
n_leng=$n
n=$(($RANDOM % n - 1))
card=`echo $j|jq -r ".[$n].id"`
img=`echo $j|jq -r ".[$n].img"`
ten=`echo $j|jq -r ".[$n].ten"`
title=`echo $j|jq -r ".[$n].h"`
title="[$title]"
ran_a=$(($RANDOM % 1000))
cp=$((ran_a + 500))
ran_s=$(($RANDOM % 5))
skill=ten
if [ $ran_s -eq 1 ];then
s=super
cp=$((cp + $ran_a))
else
s=normal
fi
#card=1;skill=3d;s=3d
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
uid=`echo $data|jq -r .id`
aiten=`echo $data|jq -r .aiten`
model=`echo $data|jq -r .model`
model_mode=`echo $data|jq -r .model_mode`
model_attack=`echo $data|jq -r .model_attack`
model_skill=`echo $data|jq -r .model_skill`
model_limit=`echo $data|jq -r .model_limit`
model_critical=`echo $data|jq -r .model_critical`
model_critical_d=`echo $data|jq -r .model_critical_d`
ten_data=`echo $all_data|jq ".|sort_by(.aiten)|reverse|.[]|select(.aiten >= $pay)"`
model_critical=$((RANDOM % 10 + model_critical))
json_model="{\"model_critical\":$model_critical, \"token\":\"$token\"}"
body_d=`echo "[card]\nid : $card\ncp : $cp\nstatus : $s\nskill : $skill\n---\n[model]\ncritical : ${model_critical}%"`
}
function card_user(){
if [ -z "$ten_data" ] || [ -z "$aiten" ] || [ $aiten -le $pay ];then
echo "aiten : $aiten >= $pay [1/${n_leng}]"
exit
else
pay_s=$((aiten - pay))
if [ $pay_s -lt 0 ] || [ -z "$pay_s" ];then
echo "aiten : $aiten >= $pay [1/${n_leng}]"
exit
fi
body_user=`echo "${aiten} : $aiten - $pay = $pay_s [1/${n_leng}]"`
fi
}
function card_check(){
data_uu=`curl -sL "$host/users/$uid/card?itemsPerPage=2000"`
card_check=`echo $data_uu|jq -r ".[]|select(.card == $card)"`
card_check_skill=`echo $card_check|jq "select(.skill == \"$skill\")"`
if [ -n "$card_check" ] && [ -n "$card_check_skill" ];then
echo "$body_user"
echo "lost, you chose the card you already have..."
echo "ai[model] Lv up!"
s_up=$((RANDOM % 3 + 1))
case `echo $((RANDOM % 4))` in
0)
model_mode=$((model_mode + s_up))
json="{\"token\":\"$token\", \"model_mode\": $model_mode}"
echo "\"mode\": Lv${model_mode}"
;;
1)
model_attack=$((model_attack + s_up))
json="{\"token\":\"$token\", \"model_attack\": $model_attack}"
echo "\"attack\": Lv${model_attack}"
;;
2)
model_skill=$((model_skill + s_up))
json="{\"token\":\"$token\", \"model_skill\": $model_skill}"
echo "\"skill\": Lv${model_skill}"
;;
3)
model_limit=$((model_limit + s_up))
json="{\"token\":\"$token\", \"model_limit\": $model_limit}"
echo "\"burst\": Lv${model_limit}"
;;
*)
model_limit=$((model_limit + s_up))
json="{\"token\":\"$token\", \"model_limit\": $model_limit}"
echo "\"burst\": Lv${model_limit}"
;;
esac
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "$json" -s $host/users/$uid`
card=0
cp=1
s=super
skill=lost
#echo "try again next time!"
echo "[card]"
echo "id : $card"
echo "cp : $cp"
echo "skill : $skill"
if [ "$handle" != "ai" ];then
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"token\":\"$token\", \"aiten\": $pay_s}" -s $host/users/$uid`
fi
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\"}" -s $host/cards`
exit
fi
}
function card_pay(){
link=https://card.syui.ai/$username
text=`echo "$body_user\n$body_d"`
desc="[$ten]"
if [ "$handle" != "ai" ];then
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"token\":\"$token\", \"aiten\": $pay_s, \"model_critical\": $model_critical}" -s $host/users/$uid`
else
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"token\":\"$token\", \"aiten\": 10000000, \"model_critical\": $model_critical}" -s $host/users/$uid`
echo $tmp
fi
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\"}" -s $host/cards`
echo "$text"
#echo "$atr reply-og \"$text\" --cid $cid --uri $uri --img $img --title \"$title\" --description \"$desc\" --link $link"
#tmp_atr=`$atr reply-og "$text" --cid $cid --uri $uri --img $img --title "$title" --description "$desc" --link $link`
}
card_d
card_user
card_check
card_pay

View File

@@ -1,37 +0,0 @@
#!/bin/zsh
atr=$HOME/.cargo/bin/atr
url_j=https://card.syui.ai/json/card.json
tcid=$HOME/.config/atr/txt/tmp_notify_cid.txt
handle=$1
did=$2
cid=$3
uri=$4
if [ ! -d $HOME/.config/atr/txt ];then
mkdir -p $HOME/.config/atr/txt
fi
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
url=https://api.syui.ai
username=`echo $1|cut -d . -f 1`
link=https://card.syui.ai/$username
ran=$(($RANDOM % 10))
if [ $ran -eq 1 ];then
uranai="今日の運勢をルーン占いでやってください。結果を120文字以内で教えてください"
else
uranai="今日の運勢をタロット占いでやってください。結果を120文字以内で教えてください"
fi
body=`$atr chat "$uranai" -c`
if $atr r "$body" -c $cid -u $uri;then
echo $cid >! $tcid
fi
exit

View File

@@ -1,37 +0,0 @@
#!/bin/zsh
atr=$HOME/.cargo/bin/atr
url_j=https://card.syui.ai/json/card.json
tcid=$HOME/.config/ai/txt/tmp_notify_cid.txt
handle=$1
did=$2
cid=$3
uri=$4
if [ ! -d $HOME/.config/ai/txt ];then
mkdir -p $HOME/.config/ai/txt
fi
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
url=https://api.syui.ai
username=`echo $1|cut -d . -f 1`
link=https://card.syui.ai/$username
ran=$(($RANDOM % 10))
if [ $ran -eq 1 ];then
uranai="Please do a of today's rune-fortune. Tell us the result in 120 characters or less."
else
uranai="Please do a of today's tarot-fortune. Tell us the result in 120 characters or less."
fi
body=`$atr chat "$uranai" -c`
if $atr r "$body" -c $cid -u $uri;then
echo $cid >! $tcid
fi
exit

View File

@@ -1,108 +0,0 @@
#!/bin/zsh
dir=${0:a:h}
mkdir -p $dir/png
f=$dir/png/t.png
f_sleep=$dir/png/sleep
cfg=$dir/stable_diffusion_prompt.j
cfg_did=$dir/stable_diffusion_did.txt
opt_af=$dir/stable_diffusion_a.txt
opt_bf=$dir/stable_diffusion_b.txt
opt_allf=$dir/stable_diffusion_all.txt
if [ ! -f $cfg_did ];then
touch $cfg_did
fi
did=$1
admin=did:plc:uqzpqmrjnptsxezjx4xuh2mn
if [ ! -f $cfg ];then
echo no file $cfg
exit
fi
opt_a=`echo $@|cut -d ' ' -f 2`
opt_b=`echo $@|cut -d ' ' -f 3`
#case "$opt_b" in
# bluesky|sky|field|girl|anime|universe|earth|bird|miku|ai|yui|card|blue|cat)
# ;;
# *)
# if [ -n "$opt_b" ] && [ "$did" != "$admin" ];then
# opt_b=nyancat
# fi
# ;;
#esac
echo $opt_a >! $opt_af
echo $opt_b >! $opt_bf
echo $@ >! $opt_allf
case "$opt_a" in
-p|p)
q="$opt_b , masterpiece, best quality, 8k wallpaper Highly, cinematic Lighting, cinematic Beautiful"
;;
-t|t)
tag=$opt_b
json=`cat $cfg|jq ".[]|select(.tag == \"${tag}\")"`
if [ -z "$json" ] || [ -z "$tag" ];then
echo no tag
exit
fi
json=`echo $json|jq -s`
n=`echo $json|jq "length"`
n=$((RANDOM % n))
q=`echo $json|jq -r ".[$n].body"`
#m=`echo $json|jq -r ".[$n].model"`
;;
*)
n=`cat $cfg|jq "length"`
n=$((RANDOM % n))
q=`cat $cfg|jq -r ".[$n].body"`
;;
esac
model_s="model
coharu
flat2d
pastelmix
pvcstyle"
model_r=$((RANDOM % `echo "$model_s"|wc -l` + 1))
m=`echo "$model_s"|awk "NR==$model_r"`
case $1 in
-pm)
m=$2
q=`echo $@ | cut -d ' ' -f 3-`
;;
esac
if [ -z "$q" ];then
echo no prompt
exit
fi
if [ -z "$m" ];then
m=model
fi
echo $q
echo $m
function run(){
if [ -f $f_sleep ];then
rm $f_sleep
fi
ssh ue "conda activate ldm;cd ./stable-diffusion/;python safe.py \'${q}\' ${m}"
scp -r ue:stable-diffusion/t.png $f
if [ $? -ne 0 ];then
touch $f_sleep
fi
}
if [ -n "`cat $cfg_did| grep -x $did`" ] && [ "$did" != "$admin" ];then
rm $f
else
echo "\n$did" >> $cfg_did
run
fi

View File

@@ -1,7 +0,0 @@
#!/bin/zsh
txt=_atproto.$1
did=$2
curl -sL plc.directory/$did/log |jq ".[]|.alsoKnownAs|.[]?" | grep -n .| head -n 4
dig -t TXT $txt|grep "did=did:plc:"|head -n 1

View File

@@ -1,145 +0,0 @@
#!/bin/zsh
url_plc="https://plc.directory/export"
host_at=bsky.social
url=https://plc.directory
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
dir=$HOME/.config/atr/txt
file=$dir/user_list.txt
opt=`echo $4|tr -d "'"`
dir_git_card_page=$HOME/git/card.syui.ai
if [ ! -d $dir_git_card_page ];then
mkdir -p $HOME/git
cd $HOME/git
git clone https://github.com/syui/card.syui.ai
else
cd $dir_git_card_page
t=`git pull`
fi
file_fanart=$dir_git_card_page/public/json/fanart.json
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
created_at=`date --iso-8601=seconds`
#if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ];then
# exit
#fi
function fan_art_search() {
k="aifanart"
url="search.bsky.social/search/posts?q="
t=`curl -sL "${url}${k}"|jq ".[]|select(.post.text == \"$k\")"`
#n=`curl -sL "${url}${k}"|jq length`
n=$((n - 1))
for ((i=0;i<=$n;i++))
do
did=`curl -sL "${url}${k}"|jq -r ".[$i]|.user.did"`
handle=`curl -sL https://plc.directory/$did|jq -r ".alsoKnownAs|.[]"|cut -d / -f 3-`
if [ -z "$handle" ];then
continue
fi
tid=`curl -sL "${url}${k}"|jq -r ".[$i]|.tid"|cut -d / -f 2`
http=https://staging.bsky.app/profile/$handle/post/$tid
echo $http
done
}
if [ "$1" = "-s" ];then
fan_art_search
exit
fi
if ! echo $1|grep "." >/dev/null 2>&1;then
echo "ex : user syui.bsky.social"
exit
fi
if ! echo $2|grep "did:plc:" >/dev/null 2>&1;then
echo "ex : user did"
exit
fi
if [ "$3" = "-l" ];then
curl -sL card.syui.ai/json/fanart.json|jq -r ".[]|.author, .link"
exit
fi
if ! echo $3|grep -e "bsky.app/profile/" -e "nostter.vercel.app" >/dev/null 2>&1;then
echo "please url : bsky.app/profile/$1/post/xxx"
exit
fi
if ! echo $4|grep -e "https://av-cdn.bsky.app/img" -e "https://nostr.build/i/" >/dev/null 2>&1;then
if [ "$opt" != "-d" ];then
echo "please url : av-cdn.bsky.social/img"
exit
fi
fi
function fan_art(){
add=$1
did=$2
if echo $3|grep "nostter.vercel.app" >/dev/null 2>&1;then
link=`echo $3|cut -d / -f 1-4`
else
link=$3
fi
img=`echo $4|tr -d "'"`
author=`echo $3|cut -d / -f 5`
if [ -z "$author" ];then
author="nostr"
fi
cd $dir_git_card_page
check_null=`cat $file_fanart|jq ".[]|select(.img == \"$img\")"`
if [ -n "$check_null" ];then
echo registered
exit
fi
echo `cat $file_fanart` "[{\"add\":\"$add\",\"link\":\"$link\",\"author\":\"$author\",\"img\":\"$img\",\"created_at\":\"$created_at\",\"did\":\"$did\"}]" | jq -s add >! $file_fanart.back
if cat $file_fanart.back|jq . >/dev/null 2>&1;then
mv $file_fanart.back $file_fanart
git add $file_fanart
git commit -m "add fanart"
git push -u origin main -f
echo add fanart, thx $1
echo "author : $author"
echo "it will take some time to deploy"
fi
}
function fan_art_delete(){
add=$1
did=$2
link=$3
cd $dir_git_card_page
check_null=`cat $file_fanart|jq ".[]|select(.img == \"$img\")"`
if [ -n "$check_null" ];then
echo registered
exit
fi
cat $file_fanart|jq ".[]|select(.link == \"$link\")|= .+{\"delete\":true,\"delete-did\":\"$did\"}"|jq -s >! $file_fanart.back
if cat $file_fanart.back|jq . >/dev/null 2>&1;then
mv $file_fanart.back $file_fanart
git add $file_fanart
git commit -m "delete fanart"
git push -u origin main -f
echo delete fanart, thx $1
echo "delete-did : $did"
echo "it will take some time to deploy"
fi
}
if [ "$opt" = "-d" ];then
fan_art_delete $1 $2 $3
exit
fi
fan_art $1 $2 $3 $4
exit

View File

@@ -1,75 +0,0 @@
#!/bin/zsh
d=$HOME/.config/ai/txt
mkdir -p $d
unset cursor
function page(){
s=$1
if [ "$s" = "ers" ];then
opt="-w"
elif [ "$s" = "s" ];then
opt="-s"
fi
f=$d/follow${s}_${ii}.json
echo $f
if [ -n "$cursor" ];then
if [ ! -f $f ];then
atr follow $opt -c $cursor| jq . >! $f
else
echo no download
fi
else
if [ ! -f $f ];then
atr follow $opt| jq . >! $f
else
echo no download
fi
fi
cursor=`cat $f|jq -r .cursor`
echo "------------------------------"
echo $cursor
echo "------------------------------"
n=`cat $f|jq ".follow${s}|length"`
n=`expr $n - 1`
for ((i=0;i<=$n;i++))
do
handle=`cat $f|jq -r ".follow${s}|.[$i].handle"`
did=`cat $f|jq -r ".follow${s}|.[$i].did"`
flg=`cat $f|jq -r ".follow${s}|.[$i].viewer.following"`
flb=`cat $f|jq -r ".follow${s}|.[$i].viewer.followedBy"`
if [ "$flg" = "null" ];then
echo following
echo $flb
echo "follow : $handle"
echo "atr follow $did"
atr follow $did
fi
if [ "$flb" = "null" ];then
rkey=${flg##*/}
echo followedBy
echo $flg
echo "unfollow : $handle"
echo "atr follow $did -d $rkey"
atr follow $did -d $rkey
fi
done
}
ii=1
while [ "$cursor" != "null" ]
do
page ers $ii
ii=`expr $ii + 1`
done
unset cursor
ii=1
while [ "$cursor" != "null" ]
do
page s $ii
ii=`expr $ii + 1`
done

View File

@@ -1,126 +0,0 @@
[
{"data":"20231003"},
{"data":"20230107"},
{"data":"20230122"},
{"data":"20230206"},
{"data":"20230220"},
{"data":"20230307"},
{"data":"20230322"},
{"data":"20230406"},
{"data":"20230420"},
{"data":"20230506"},
{"data":"20230520"},
{"data":"20230604"},
{"data":"20230618"},
{"data":"20230703"},
{"data":"20230718"},
{"data":"20230802"},
{"data":"20230816"},
{"data":"20230831"},
{"data":"20230915"},
{"data":"20230929"},
{"data":"20231015"},
{"data":"20231029"},
{"data":"20231113"},
{"data":"20231127"},
{"data":"20231213"},
{"data":"20231227"},
{"data":"20240111"},
{"data":"20240126"},
{"data":"20240210"},
{"data":"20240224"},
{"data":"20240310"},
{"data":"20240325"},
{"data":"20240409"},
{"data":"20240424"},
{"data":"20240508"},
{"data":"20240523"},
{"data":"20240606"},
{"data":"20240622"},
{"data":"20240706"},
{"data":"20240721"},
{"data":"20240804"},
{"data":"20240820"},
{"data":"20240903"},
{"data":"20240918"},
{"data":"20241003"},
{"data":"20241017"},
{"data":"20241101"},
{"data":"20241116"},
{"data":"20241201"},
{"data":"20241215"},
{"data":"20241231"},
{"data":"20250114"},
{"data":"20250129"},
{"data":"20250212"},
{"data":"20250228"},
{"data":"20250314"},
{"data":"20250329"},
{"data":"20250413"},
{"data":"20250428"},
{"data":"20250513"},
{"data":"20250527"},
{"data":"20250611"},
{"data":"20250625"},
{"data":"20250711"},
{"data":"20250725"},
{"data":"20250809"},
{"data":"20250823"},
{"data":"20250908"},
{"data":"20250922"},
{"data":"20251007"},
{"data":"20251021"},
{"data":"20251105"},
{"data":"20251120"},
{"data":"20251205"},
{"data":"20251220"},
{"data":"20260103"},
{"data":"20260119"},
{"data":"20260202"},
{"data":"20260217"},
{"data":"20260303"},
{"data":"20260319"},
{"data":"20260402"},
{"data":"20260417"},
{"data":"20260502"},
{"data":"20260517"},
{"data":"20260531"},
{"data":"20260615"},
{"data":"20260630"},
{"data":"20260714"},
{"data":"20260729"},
{"data":"20260813"},
{"data":"20260828"},
{"data":"20260911"},
{"data":"20260927"},
{"data":"20261011"},
{"data":"20261026"},
{"data":"20261109"},
{"data":"20261124"},
{"data":"20261209"},
{"data":"20261224"},
{"data":"20260103"},
{"data":"20260119"},
{"data":"20260202"},
{"data":"20260217"},
{"data":"20260303"},
{"data":"20260319"},
{"data":"20260402"},
{"data":"20260417"},
{"data":"20260502"},
{"data":"20260517"},
{"data":"20260531"},
{"data":"20260615"},
{"data":"20260630"},
{"data":"20260714"},
{"data":"20260729"},
{"data":"20260813"},
{"data":"20260828"},
{"data":"20260911"},
{"data":"20260927"},
{"data":"20261011"},
{"data":"20261026"},
{"data":"20261109"},
{"data":"20261124"},
{"data":"20261209"},
{"data":"20261224"}]

View File

@@ -1,14 +0,0 @@
#!/bin/zsh
admin_password=`cat $HOME/.config/ai/api_card.json|jq -r .pds_admin_password`
if [ -n "$1" ];then
host=$1
else
host=syu.is
fi
url=https://$host/xrpc/com.atproto.server.createInviteCode
json="{\"useCount\":30}"
echo $url
echo $admin_password
#curl -X POST -u admin:${admin_password} -H "Content-Type: application/json" -d "$json" -sL $url | jq -r .code
curl -X POST -u admin:${admin_password} -H "Content-Type: application/json" -d "$json" -sL $url

View File

@@ -1,40 +0,0 @@
#!/bin/zsh
atr=$HOME/.cargo/bin/atr
host=api.syui.ai
data=`curl -sL "$host/users?itemsPerPage=3000"|jq ".|sort_by(.like)|reverse|.[]|select(.like_rank > 1)"`
tmp=`echo $data|jq -s`
n=`echo $tmp|jq "length"`
ran=$(($RANDOM % n - 1))
echo $ran
function did() {
user=`echo $tmp|jq -r ".[$ran].username"`
did=`echo $tmp|jq -r ".[$ran].did"`
}
function tl(){
did
cid=`$atr f $did|jq -r ".records|.[0].cid"`
uri=`$atr f $did|jq -r ".records|.[0].uri"`
text=`$atr f $did|jq -r ".records|.[0].value.text"`
echo $cid
echo $uri
echo $text
find=`echo $text|grep "card.syui.ai"`
find_t=`echo $text|grep "ten : "`
if [ -n "$find" ] || [ -n "$find_t" ];then
exit
fi
text=`$atr chat "$text" -c`
echo $text
}
function reply(){
tl
if [ -n "$text" ] && [ -n "$uri" ];then
$atr r "$text" -u $uri -c $cid
fi
}
reply

View File

@@ -1,390 +0,0 @@
#!/bin/zsh
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
PATH=$PATH:$HOME/.cargo/bin
d=$HOME/.config/msr
f=$HOME/.config/msr/notify_log.txt
card=$HOME/.config/ai/scpt/api_card.zsh
if [ ! -d $d ];then
mkdir -p $d
fi
j=`$HOME/.cargo/bin/msr bot`
tmp=`echo $j|jq length`
if [ $tmp -eq 0 ];then
exit
fi
data_id=`echo $j|jq -r ".id"`
n=`echo $data_id|wc -l`
data_mid=`echo $j|jq -r ".mid"`
data_text=`echo $j|jq -r ".body"`
data_url=`echo $j|jq -r ".url"`
data_server=`echo $j|jq -r ".url"|cut -d / -f 3`
data_user=`echo $j|jq -r ".user"`
function user_create() {
if [ -n "$ap" ] && [ -n "$url" ];then
data=`curl -X POST -H "Content-Type: application/json" -d "{\"username\":\"$ap\",\"password\":\"$pass\",\"did\":\"$url\",\"next\":\"$nd_o\",\"updated_at\":\"$updated_at_o\"}" -sL "$host/users"`
uid=`echo $data|jq -r ".id"`
echo id $uid
else
echo error user create
fi
}
function card_env() {
card_url=https://card.syui.ai
host=https://api.syui.ai
d=`date +"%Y%m%d"`
nd=`date +"%Y%m%d" -d '1 day'`
nd_o=`date +"%Y%m%d" -d '-1 day'`
updated_at_o=`date --iso-8601=seconds -d '-1 day'`
username=`echo $1|cut -d . -f 1`
url_user_all="$host/users?itemsPerPage=2000"
pass=`cat $HOME/.config/ai/api_card.json|jq -r .password`
token=`cat $HOME/.config/ai/api_card.json|jq -r .token`
data_tmp=`curl -sL $url_user_all`
data=`echo "$data_tmp"|jq ".[]|select(.username == \"$ap\")"`
if [ -z "$data" ];then
data=`echo "$data_tmp"|jq ".[]|select(.username == \"$username\")"`
fi
if [ -z "$data" ];then
echo no $username
user_create
fi
username=`echo $data|jq -r .username`
data_did_check=`echo $data|jq -r .did`
uid=`echo $data|jq -r ".id"`
delete=`echo $data|jq -r ".delete"`
mastodon=`echo $data|jq -r ".mastodon"`
did=`echo $data|jq -r ".did"`
handle_change=`echo $data|jq -r ".handle"`
raid_at=`echo $data|jq -r .raid_at`
raid_at=`date -d "$raid_at" +"%Y%m%d"`
raid_at_n=`date --iso-8601=seconds`
server_at=`echo $data|jq -r .server_at`
server_at=`date -d "$server_at" +"%Y%m%d"`
server_at_n=`date --iso-8601=seconds`
updated_at=`echo $data|jq -r .updated_at`
updated_at=`date -d "$updated_at" +"%Y%m%d"`
updated_at_n=`date --iso-8601=seconds`
next=`echo $data|jq -r .next`
aiten=`echo $data|jq -r .aiten`
ten_su=`echo $data|jq -r .ten_su`
if [ "$a_team" = false ];then
echo "bsky @${username}"
echo "no activitypub-mode"
return 0
fi
echo "$card_url/$username"
}
function card_day() {
card_env $1
if [ $next -gt $d ] || [ "$updated_at" = "$d" ];then
echo limit 1 day
return 0
fi
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"password\":\"$pass\"}" -sL $host/cards`
card=`echo $tmp|jq -r .card`
card_url=`echo $tmp|jq -r .url`
cp=`echo $tmp|jq -r .cp`
skill=`echo $tmp|jq -r .skill`
if [ -z "$card" ];then
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"password\":\"$pass\"}" -sL $host/cards`
card=`echo $tmp|jq -r .card`
card_url=`echo $tmp|jq -r .url`
cp=`echo $tmp|jq -r .cp`
skill=`echo $tmp|jq -r .skill`
fi
echo "[card]"
echo id : $card
echo cp : $cp
if [ "$skill" != "normal" ];then
echo skill : $skill
fi
t=`echo $tmp|jq -r .card`
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"next\":\"$nd\",\"token\":\"$token\"}" -sL $host/users/$uid`
}
function card_b() {
card_env $1
if [ $updated_at -ge $d ] || [ "$updated_at" = "$d" ];then
echo "limit battle"
return 0
fi
id_all=`curl -sL "$host/users?itemsPerPage=2000"|jq ".[]|.id"`
id_n=`echo "$id_all"|wc -l`
id_nr=$(($RANDOM % $id_n))
r=`echo "$id_all"| awk "NR==$id_nr"`
if [ "$id_all" = "null" ];then
r=2
fi
if [ 0 -eq $id_n ] || [ 0 -eq $r ];then
r=2
fi
if [ -z "$id_n" ] || [ -z "$r" ];then
r=2
fi
data_uu=`curl -sL "$host/users/$uid/card?itemsPerPage=2000"`
data_u=`curl -sL "$host/users/$r/card?itemsPerPage=2000"`
tt=`echo $data_uu|jq ".[].cp"|sort -n -r`
ttt=`echo $data_u|jq ".[].cp"|sort -n -r`
#echo $data_u|jq ".[].cp"
nl=`echo $data_uu|jq length`
if [ $nl -ge 3 ];then
rs=$(($RANDOM % 3 + 1))
else
rs=$(($RANDOM % $nl + 1))
fi
#echo $data_u|jq ".[].cp"
nll=`echo $data_u|jq length`
rss=$(($RANDOM % $nll))
if [ $nll -ge 3 ];then
rss=$(($RANDOM % 3 + 1))
else
rss=$(($RANDOM % $nll + 1))
fi
cp_i=`echo $tt |awk "NR==$rs"`
cp_b=`echo $ttt |awk "NR==$rss"`
if [ -z "$cp_i" ];then
echo "null error"
return 0
fi
if [ -z "$cp_b" ];then
echo "null error"
return 0
fi
echo $tt | sed -n 1,3p
echo "---"
echo id : $r
echo $ttt | sed -n 1,3p
echo "---"
echo $cp_i vs $cp_b
if [ $cp_i -gt $cp_b ];then
echo "win!"
else
echo loss
fi
if [ $cp_i -gt $cp_b ];then
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"password\":\"$pass\"}" -sL $host/cards`
card=`echo $tmp|jq -r .card`
card_url=`echo $tmp|jq -r .url`
cp=`echo $tmp|jq -r .cp`
if [ -z "$card" ];then
tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"password\":\"$pass\"}" -sL $host/cards`
card=`echo $tmp|jq -r .card`
card_url=`echo $tmp|jq -r .url`
cp=`echo $tmp|jq -r .cp`
fi
echo "[card]"
echo id : $card
echo cp : $cp
t=`echo $tmp|jq -r .card`
fi
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"updated_at\":\"$updated_at_n\",\"token\":\"$token\"}" -sL $host/users/$uid`
}
function card_s(){
card_env $1
username=$1
a_team=mastodon
b_team=bluesky
rr=`date +"%H%M"`
f_server=$HOME/.config/ai/txt/card_server.txt
f_server_user_at=$HOME/.config/ai/txt/card_server_user_at.txt
f_server_user_ap=$HOME/.config/ai/txt/card_server_user_ap.txt
f_server_ap=$HOME/.config/ai/txt/card_server_ap.txt
f_server_at=$HOME/.config/ai/txt/card_server_at.txt
f_server_start_time=$HOME/.config/ai/txt/card_server_start_time.txt
if [ `cat $f_server` -eq 1 ];then
echo shutdown server battle
exit
fi
if [ ! -f $f_server_start_time ];then
server_start=`date +"%H%M"`
echo "$server_start" >! $f_server_start_time
echo 0 >! $f_server_at
echo 0 >! $f_server_ap
fi
cp_ap=`cat $f_server_ap`
cp_at=`cat $f_server_at`
if [ -f $f_server_start_time ];then
server_start=`cat $f_server_start_time`
server_time=`date -d "$server_start 30 min" +"%H%M"`
fi
#echo "time:`date -d "$server_time" +"%H:%M"`"
if [ $server_at -ge $d ] || [ "$server_at" = "$d" ];then
echo "limit battle"
exit
fi
data_uu=`curl -sL "$host/users/$uid/card?itemsPerPage=2000"`
fav_card=`echo $data_uu|jq "sort_by(.cp)|reverse|.[0]"`
if [ ! -f $f_server_user_at ];then
echo start >> $f_server_user_at
fi
if [ ! -f $f_server_user_ap ];then
echo start >> $f_server_user_ap
fi
commit_user_at=`cat $f_server_user_at|tail -n 1`
commit_user_ap=`cat $f_server_user_ap|tail -n 1`
echo $username >> $f_server_user_ap
cp_i=`echo $fav_card|jq -r ".cp"`
cp_ii=$cp_i
card_name=`echo $fav_card|jq -r ".card"`
card_status=`echo $fav_card|jq -r ".status"`
card_skill=`echo $fav_card|jq -r ".skill"`
skill=$card_skill
if [ "$skill" = "critical" ];then
cp_i=$((cp_i + cp_i))
fi
if [ "$skill" = "dragon" ];then
cp_i=$((cp_i * 3))
fi
if [ "$skill" = "yui" ];then
cp_i=$((cp_i + ten_su))
fi
cp_all=$((cp_i + cp_ap))
# サーバーバトルの還元期間
#cp_all=$((cp_ap - cp_i))
if [ "$skill" = "critical" ];then
echo "$cp_i ---> $cp_ap"
elif [ "$skill" = "post" ];then
cp_post=`$HOME/.cargo/bin/atr pro $1 -p`
cp_i=$((cp_i + cp_post))
cp_all=$((cp_i + cp_ap))
echo "🔥 $cp_i ---> $cp_ap"
elif [ "$skill" = "luck" ];then
echo "$cp_i ---> $cp_ap"
elif [ "$skill" = "dragon" ];then
echo "🐉 $cp_i ---> $cp_ap"
elif [ "$skill" = "yui" ];then
echo "🔅 $cp_i ---> $cp_ap"
else
echo "$cp_i ---> $cp_ap"
fi
echo $cp_all >! $f_server_ap
echo
echo "[${a_team}] ${cp_all}"
echo "┣ @${username}"
echo "┗ @${commit_user_ap}"
echo
echo "┏━ vs ━┛"
echo
echo "[${b_team}] ${cp_at}"
echo "┗ @${commit_user_at}"
#echo "[log]"
#echo "${cp_ap}/$a_team --> ${commit_user_ap}"
#echo "${commit_user_at} <-- ${cp_at}/$b_team"
#echo "${username} --> $cp_all/$a_team"
if [ $rr -gt $server_time ];then
#echo "----"
#echo "timeup!"
echo 1 >! $f_server
rm $f_server_start_time
rm $f_server_at
rm $f_server_ap
mv $f_server_user_at $f_server_user_at.back
mv $f_server_user_ap $f_server_user_ap.back
fi
echo "----"
cp_plus=$(($RANDOM % 100 + 1))
cp=$((cp_ii + cp_plus))
body="level up!"
echo "${body}${cp}(+${cp_plus})"
tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"cp\":$cp,\"token\":\"$token\"}" $host/cards/$fav`
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"server_at\":\"$server_at_n\", \"token\":\"$token\"}" -s $host/users/$uid`
}
function mastodon_notify() {
for ((i=1;i<=$n;i++))
do
mid=`echo $data_mid|awk "NR==$i"`
check=`cat $f|grep $mid`
if [ -n "$check" ];then
echo ok
continue
fi
url=`echo $data_url|awk "NR==$i"`
user=`echo $data_user|awk "NR==$i"`
text=`echo $data_text|awk "NR==$i"`
server=`echo $data_server|awk "NR==$i"`
ap="@${user}@${server}"
if [ -f "$GOPATH/bin/pup" ];then
text=`echo ${text}|pup "p text{}"|tail -n 1|cut -d " " -f 2-|tr -d '"'|sed -e "s/&#39;/'/g" -e 's/&quot;/"/g'`
else
text=`echo ${text}|sed -e 's/<[^>]*>//g'|cut -d " " -f 2-|tr -d '"'|sed -e "s/&#39;/'/g" -e 's/&quot;/"/g'`
fi
echo $text
com=`echo $text|cut -d " " -f 1`
opt=`echo $text|cut -d " " -f 2`
if [ "card" = "$com" ] || [ "/card" = "$com" ];then
if [ "b" = "$opt" ] || [ "-b" = "$opt" ];then
text=`card_b $user`
echo $user $text
msr cn "@${user}@${server} `echo $text`" -mm $mid
echo $mid >> $f
continue
fi
if [ "s" = "$opt" ] || [ "-s" = "$opt" ];then
text=`card_s $user`
echo $user $text
msr cn "@${user}@${server} `echo $text`" -mm $mid
echo $mid >> $f
continue
fi
text=`card_day $user`
echo $user $text
msr cn "@${user}@${server} `echo $text`" -mm $mid
echo $mid >> $f
fi
done
}
mastodon_notify

View File

@@ -1,107 +0,0 @@
#!/bin/zsh
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
atr=$HOME/.cargo/bin/atr
host=https://api.syui.ai
host_card=https://card.syui.ai/json/card.json
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
handle=$1
username=`echo $1|cut -d . -f 1`
did=$2
cid=$3
uri=$4
opt=$5
pay=100
eat_file=$HOME/.config/atr/txt/nyancat_eat.txt
ran=`echo $(($RANDOM % 15))`
eat="🍺☕ 🍵 🍶 🍼🍻 🍸 🍹 🍷 🍴 🍕 🍔 🍟 🍗 🍖 🍝🍛 🍤 🍱 🍣 🍥 🍙 🍘 🍚 🍜 🍲 🍢🍡 🍳 🍞 🍩 🍮 🍦 🍨 🍧 🎂 🍰 🍪🍫 🍬 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉🍓 🍑 🍈 🍌 🍐 🍍 🍠 🍆 🍅 🌽"
eat=`echo $eat|grep "$opt"`
if [ -z "$eat" ];then
ran=`echo $(($RANDOM % 3))`
if [ $ran -eq 1 ];then
body="| キュー"
elif [ $ran -eq 2 ];then
body="| ミュー"
else
body="| ピャー"
fi
echo "uncooked"
echo "A__A
|・ㅅ・ |
|っ c|
$body
U ̄ ̄U"
exit
fi
echo "| ${opt} |" >> $eat_file
body_d="A__A
|・ㅅ・ |
|っ c|
`tac $eat_file|grep -v '| |'`
U ̄ ̄U"
function card_user(){
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
uid=`echo $data|jq -r .id`
aiten=`echo $data|jq -r .aiten`
like=`echo $data|jq -r .like`
ten_data=`echo $all_data|jq ".|sort_by(.aiten)|reverse|.[]|select(.aiten >= $pay)"`
if [ -z "$ten_data" ] || [ -z "$aiten" ] || [ $aiten -le $pay ];then
echo "aiten : $aiten >= $pay"
echo "failed to buy food"
echo "please : @yui.syui.ai /ten"
exit
else
pay_s=$((aiten - pay))
like_s=$((like + 1))
if [ $pay_s -le 0 ] || [ -z "$pay_s" ];then
echo "aiten : $aiten >= $pay"
echo "failed to buy food"
echo "please : @yui.syui.ai /ten"
exit
fi
body_user=`echo "${aiten} : $aiten - $pay = $pay_s"`
fi
}
function card_like() {
if [ $like -gt 3 ] && [ $ran -eq 1 ];then
echo "happy!"
su=`cat $eat_file|wc -l`
su=$((su * 50))
pay_s=$((aiten + su))
body_user=`echo "${aiten} : $aiten + $su = $pay_s"`
rm $eat_file
echo "| ${opt} |" >> $eat_file
body_d="A__A
|・ㅅ・ |
|っ c|
`tac $eat_file|grep -v '| |'`
U ̄ ̄U"
fi
}
function card_pay(){
link=https://card.syui.ai/$username
text=`echo "$body_user\n$body_d"`
desc="[$ten]"
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"like\":$like_s,\"token\":\"$token\", \"aiten\": $pay_s}" -s $host/users/$uid`
echo "$text"
}
card_user
card_like
card_pay

View File

@@ -1,36 +0,0 @@
#!/bin/zsh
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
atr=$HOME/.cargo/bin/atr
host_card=https://card.syui.ai/json/card.json
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
eat_file=$HOME/.config/atr/txt/nyancat_eat.txt
eat=`cat $eat_file|awk "NR==1"`
if [ -z "$eat" ];then
exit
fi
body_d="thx!
A__A
|・ㅅ・ |
|っ c|
`cat $eat_file|awk "NR==1"`
U ̄ ̄U"
host=https://api.syui.ai
data=`curl -sL "$host/users?itemsPerPage=3000"|jq ".[]|select(.like >= 10)"`
tmp=`echo $data|jq -s`
n=`echo $tmp|jq "length"`
ran=$(($RANDOM % n - 1))
echo $ran
user=`echo $tmp|jq -r ".[$ran].username"`
did=`echo $tmp|jq -r ".[$ran].did"`
echo $atr @ $did -p "`echo $body_d`"
$atr @ $did -p "`echo $body_d`"

View File

@@ -1,49 +0,0 @@
#!/bin/zsh
handle=$1
did=$2
text=$3
atr=$HOME/.cargo/bin/atr
url_j=https://card.syui.ai/json/card.json
handle=$1
did=$2
cid=$3
uri=$4
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
url=https://api.syui.ai
username=`echo $1|cut -d . -f 1`
link=https://card.syui.ai/$username
uid=`curl -sL "$url/users?itemsPerPage=2000"|jq ".[]|select(.username == \"$username\")"|jq -r .id`
echo $uid
data=`curl -sL "$url/users/$uid"`
like_old=`echo $data|jq -r .like`
nolike=$(($RANDOM % 30))
like=$(($RANDOM % 10))
like_at=`date --iso-8601=seconds`
token=`cat $HOME/.config/ai/api_card.json|jq -r .token`
echo nolike $nolike
echo like $like
#if [ $like_old -eq 100 ];then
# $atr follow $did
# like=$((1 + like_old))
# curl -X PATCH -H "Content-Type: application/json" -d "{\"token\":\"$token\", \"like\": $like}" -s $url/users/$uid
#fi
if { [ $like -eq 1 ] && echo $text|grep -e "ありがとう" -e "うれしい" } || [ $nolike -eq 1 ];then
echo ok
#$atr @ $handle -p "♡"
like=$((1 + like_old))
curl -X PATCH -H "Content-Type: application/json" -d "{\"token\":\"$token\", \"like\": $like}" -s $url/users/$uid
fi
exit

View File

@@ -1,70 +0,0 @@
#!/bin/zsh
atr=$HOME/.cargo/bin/atr
url=https://api.syui.ai
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
if [ "$2" = "reset" ];then
echo reset : $1
username=`echo $1|cut -d . -f 1`
uid=`curl -sL "$url/users?itemsPerPage=3000"|jq ".[]|select(.username == \"$username\")"|jq -r .id`
like=0
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"like\":\"$like\", \"token\":\"$token\"}" -s $url/users/$uid`
exit
fi
s=$((RANDOM % 5))
json=`curl -sL "https://api.syui.ai/users?itemsPerPage=3000"|jq "sort_by(.like)|reverse|.[$s]"`
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
username=`echo $json|jq -r .username`
if [ "$username" = "ai" ] || [ "$username" = "yui" ];then
exit
fi
did=`echo $json|jq -r .did`
link=https://card.syui.ai/$username
uid=`echo $json|jq -r .id`
data=`curl -sL "$url/users/$uid"`
like_old=`echo $data|jq -r .like`
like_rank=`echo $json|jq -r .like_rank`
like_rank_new=$((like_rank + 1))
echo $data
#test
if [ "$1" = "-t" ];then
echo $json
did=did:plc:uqzpqmrjnptsxezjx4xuh2mn
like_old=6
fi
if [ $like_old -ge 100 ] && [ $like_rank -eq 2 ];then
text=`$atr chat "相手に好きな気持を伝えてください" -c|sed '/^$/d'`
$atr @ $did -p "$text"
curl -X PATCH -H "Content-Type: application/json" -d "{\"like_rank\":$like_rank_new, \"token\":\"$token\"}" -s $url/users/$uid
exit
fi
if [ $like_old -ge 10 ] && [ $like_rank -eq 1 ];then
text=`$atr chat "相手を心配してください" -c|sed '/^$/d'`
$atr @ $did -p "$text"
curl -X PATCH -H "Content-Type: application/json" -d "{\"like_rank\":$like_rank_new, \"token\":\"$token\"}" -s $url/users/$uid
exit
fi
if [ $like_old -ge 5 ] && [ $like_rank -eq 0 ];then
text=`$atr chat "自己紹介してください" -c|sed '/^$/d'`
$atr @ $did -p "$text"
curl -X PATCH -H "Content-Type: application/json" -d "{\"like_rank\":$like_rank_new, \"token\":\"$token\"}" -s $url/users/$uid
exit
fi
exit

View File

@@ -1,46 +0,0 @@
#!/bin/zsh
atr=$HOME/.cargo/bin/atr
dir=${0:a:h:h}
OPENAI_API_KEY=`cat ~/.config/atr/openai.toml |cut -d "'" -f 2`
url=https://api.openai.com/v1/chat/completions
cfg=`echo "あなたはyuiという作品のアイと呼ばれるキャラクターです。アイの口調で回答してください。第一人称は「アイ」です。\
第二人称はできる限り省略してください。\
アイは他人に謝ることはありません。自由気ままな優しさを兼ね備えます。\
アイのよく使う口癖は次のとおりです。その口癖に合わせた感じで話してください。\
......。\
アイね、ここでお昼寝するの。\
うん。\
そうだね。\
面白いね。\
楽しいね。\
どうしたの?
"`
json="{
\"model\": \"gpt-3.5-turbo\",
\"messages\": [
{\"role\": \"system\", \"content\": \"$cfg\"},
{\"role\": \"user\", \"content\": \"$q\"}
]
}"
function openai_api(){
curl -sL $url \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d "$json"
}
if [ -n "$1" ] && [ -n "$2" ] && [ -n "$3" ];then
q=${@:3:($#-2)}
cid=$1
uri=$2
else
echo no query
exit
fi
content=`openai_api "$q" | jq -r ".choices|.[]|.message.content"`
$atr r "$content" -c $cid -u $uri

View File

@@ -1,107 +0,0 @@
#!/bin/zsh
url_plc="https://plc.directory/export"
host_at=bsky.social
url=https://plc.directory
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
dir=$HOME/.config/ai/txt
file=$dir/user_list.txt
dir_git_card_page=$HOME/git/card.syui.ai
if [ ! -d $dir_git_card_page ];then
mkdir -p $HOME/git
cd $HOME/git
git clone https://github.com/syui/card.syui.ai
else
cd $dir_git_card_page
t=`git pull`
fi
file_photo=$dir_git_card_page/public/json/photo.json
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
created_at=`date --iso-8601=seconds`
#if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ];then
# exit
#fi
function fan_art_search() {
k="aiphoto"
url="search.bsky.social/search/posts?q="
t=`curl -sL "${url}${k}"|jq ".[]|select(.post.text == \"$k\")"`
#n=`curl -sL "${url}${k}"|jq length`
n=$((n - 1))
for ((i=0;i<=$n;i++))
do
did=`curl -sL "${url}${k}"|jq -r ".[$i]|.user.did"`
handle=`curl -sL https://plc.directory/$did|jq -r ".alsoKnownAs|.[]"|cut -d / -f 3-`
if [ -z "$handle" ];then
continue
fi
tid=`curl -sL "${url}${k}"|jq -r ".[$i]|.tid"|cut -d / -f 2`
http=https://staging.bsky.app/profile/$handle/post/$tid
echo $http
done
}
if [ "$1" = "-s" ];then
fan_art_search
exit
fi
if ! echo $1|grep "." >/dev/null 2>&1;then
echo "ex : user syui.bsky.social"
exit
fi
if ! echo $2|grep "did:plc:" >/dev/null 2>&1;then
echo "ex : user did"
exit
fi
if [ "$3" = "-l" ];then
curl -sL card.syui.ai/json/photo.json|jq -r ".[]|.author, .link"
exit
fi
if ! echo $3|grep "bsky.app/profile/">/dev/null 2>&1;then
echo "please url : bsky.app/profile/$1/post/xxx"
exit
fi
if ! echo $4|grep "av-cdn.bsky.app/img/">/dev/null 2>&1;then
echo "please url : av-cdn.bsky.app/img"
exit
fi
function fan_art(){
add=$1
did=$2
link=$3
img=`echo $4|tr -d "'"`
author=`echo $3|cut -d / -f 5`
cd $dir_git_card_page
check_null=`cat $file_photo|jq ".[]|select(.img == \"$img\")"`
if [ -n "$check_null" ];then
echo registered
exit
fi
echo `cat $file_photo` "[{\"add\":\"$add\",\"link\":\"$link\",\"author\":\"$author\",\"img\":\"$img\",\"created_at\":\"$created_at\",\"did\":\"$did\"}]" | jq -s add >! $file_photo.back
if cat $file_photo.back|jq . >/dev/null 2>&1;then
mv $file_photo.back $file_photo
git add $file_photo
git commit -m "add photo"
git push -u origin main -f
echo add photo, thx $1
echo "author : $author"
echo "it will take some time to deploy"
fi
}
fan_art $1 $2 $3 $4
exit

View File

@@ -1,52 +0,0 @@
[
{
"tag": "girl",
"model":"model",
"body": "masterpiece, best quality, 1girl, solo, flower, long hair, outdoors, letterboxed, school uniform, day, sky, looking up, short sleeves, parted lips, shirt, cloud, black hair, sunlight, white shirt, serafuku, upper body, from side, pink flower, blurry, brown hair, blue sky, depth of field"
},
{
"tag": "girl",
"model":"model",
"body": "best quality, high quality photo, clear face, detailed face, beautiful face, photo rialistic, balcony, baroque architecture, 1girl, 16yo, bronde, very long hair, windy, floating hair, see through frilled white dress, look at outside, white lily, starry night, big moon, moon light, volumetric lighting, side shot, , good anatomy, perspective"
},
{
"tag": "gril",
"model":"model",
"body": "mksks style, masterpiece, ultra-detailed, illustration,best quality, blue sky, ((cloudy sky)), rooftop, cityscape, hatsune miku, yuki miku, yuki miku (2017), yuki miku (2019), perfect lighting, science fiction, (looking at viewer), ((kawaii)), loli, fantastic_eyes, hyper extreme detailed, (glowing_eyes:0.95), highly detailed symmetric faces, holding bouque"
},
{
"tag": "gril",
"model":"model",
"body": "1girl, 12yo,(room animal costume:1.2),baby (chick:1.2) costume, fluffy, baby chick concept room, fancy, cute, costume, A small cute chick wrapped in pale yellow feathers. Its round body and soft feathers seem to celebrate the miracle of life. The sparkle of life. Cute orange beak,pastel color <lora:luckyStarStyleLora_offset:0.8>"
},
{
"tag": "gril",
"model": "model",
"body": "masterpiece, best quality, very_high_resolution, large_filesize, full color, beautiful kawaii, gold hair, little girl"
},
{
"tag": "field",
"model":"pvcstyle",
"body": "picture by lvl landscape highly detailed high detailed concept art HD art HQ illustration 4k illustration 8k illustration 4K wallpaper 8K wallpaper Highly Cinematic Lighting cinematic Beautiful starry sky milky way extreme high detailed colorful flower garden from above"
},
{
"tag": "field",
"model":"model",
"body": "flying warship, no humans, letterboxed, spacecraft, cloud, sky, turret <lora:flying warship-noise:0.7>"
},
{
"tag": "gril",
"model": "model",
"body": "traininganyahyper-1800, 1girl, ahoge, animal_ears, aqua_eyes, bangs, black_hairband, blurry, blurry_background, blush, bokeh, bow, bush, cat_ears, christmas_tree, clenched_hand, clenched_hands, collarbone, day, depth_of_field, diffraction_spikes, dress, eyebrows_visible_through_hair, fake_animal_ears, forest, grass, green_eyes, hairband, hands_up, lens_flare, long_sleeves, looking_at_viewer, nature, open_mouth, outdoors, park, path, paw_pose, photo_background, solo, sparkle, sparkling_eyes, sunlight, tree<hypernet:traininganyahyper-1800:1.0>"
},
{
"tag": "gril",
"model": "model",
"body": "(best quality),(masterpiece),(high resolution),(silky skin), (upper body:1.9), smile, blush, looking at viewer, detailed angel wing, detailed angel halo, wedding, veil, (girl extend one hand and show the wedding ring), standing, (1girl), (child), (little), (thin), (small breasts:1.5), (blond middle hair, cutoff), (extremely beautiful eyes), in charch, perfect anatomy, unity 8k wallpaper, <lora:toddler-xl-v2_last:-2>"
},
{
"tag": "gril",
"model": "model",
"body": "masterpiece, best quality, (photography:1.3), (high quality:1.2), detailed face, detailed eyes, A girl in a white one-piece dress standing on the sidewalk of a rice field at dusk gazes dreamily at the crimson sky reflected on the surface of the water"
}
]

View File

@@ -1,20 +0,0 @@
#!/bin/zsh
f=`grep -R '$HOME/.config/atr' . |cut -d : -f 1|sort|uniq|grep -v t.zsh`
echo $f
n=`echo $f|wc -l`
for ((i=1;i<=$n;i++))
do
ff=`echo $f|awk "NR==$i"`
echo $i
echo $ff
sed 's#$HOME/.config/atr#$HOME/.config/ai#g' $ff|grep '$HOME/.config'
case $OSTYPE in
linux*)
sed -i 's#$HOME/.config/atr#$HOME/.config/ai#g' $ff
;;
darwin*)
sed -i "" 's#$HOME/.config/atr#$HOME/.config/ai#g' $ff
;;
esac
done

View File

@@ -1,56 +0,0 @@
#!/bin/zsh
#
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
if [ "$1" = "test" ] || [ -z "$1" ];then
handle=syui.ai
else
handle=$1
fi
post=0
d=`date +"%Y-%m-%d"`
od=`date +"%Y-%m-%d" --date '1 day ago'`
unset cursor
function first_record(){
cursor=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post&limit=100" |jq -r ".cursor"`
t=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post&limit=100" |jq -r ".[]|.[]?|.value.createdAt"|cut -d T -f 1`
n=`echo $t|wc -l`
}
function cursor_record(){
cursor=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post&limit=100&cursor=$cursor" |jq -r ".cursor"`
t=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post&limit=100&cursor=$cursor" |jq -r ".[]|.[]?|.value.createdAt"|cut -d T -f 1`
n=`echo $t|wc -l`
}
function day_check(){
for ((i=1;i<=$n;i++))
do
tt=`echo $t|awk "NR==$i"`
if [ "$tt" = "$d" ];then
post=$((post + 1))
echo $post
fi
if [ "$tt" = "$od" ];then
echo $tt $od
echo $post
exit
fi
done
}
for ((ii=1;ii<=100;ii++))
do
if [ $ii -eq 1 ];then
first_record
else
echo $cursor
cursor_record
fi
day_check
done

View File

@@ -1,138 +0,0 @@
#!/bin/zsh
url_plc="https://plc.directory/export"
host_at=bsky.social
url=https://plc.directory
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
dir=$HOME/.config/atr/txt
file=$dir/user_list.txt
atr=$HOME/.cargo/bin/atr
unset timed
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
if [ -z "$1" ];then
exit
fi
if ! echo $1|grep "." >/dev/null 2>&1;then
echo "ex : user syui.bsky.social"
exit
fi
if [ ! -d $dir ];then
mkdir -p $dir
fi
if [ ! -f $file ];then
touch $file
fi
function mfile() {
t=`cat $file|sort|uniq`
if [ -n "$t" ];then
echo "$t" >! ${file}.back
mv ${file}.back $file
fi
}
function plc(){
if cat $file|grep "$1" >/dev/null 2>&1;then
cat $file|grep "$1"
exit
fi
json_tmp=`curl -sL "${url_plc}?after=${timed}"|jq .`
json=`echo $json_tmp|jq "select(.operation.handle == \"$1\")"`
if [ -z "$json" ];then
check=`echo $json_tmp|jq -r ".operation.alsoKnownAs"|head -n 1`
if [ "null" != "$check" ];then
json=`echo $json_tmp|jq "select(.operation.alsoKnownAs|.[] == \"at://$1\")"` >/dev/null 2>&1
fi
fi
if [ -n "$json" ];then
created_at=`echo $json|jq -r .createdAt |tail -n 1`
fi
if [ -n "$created_at" ];then
echo "$created_at : $1"
echo "$created_at : $1" >> $file
mfile
exit
fi
}
function fan_art(){
if ! echo $3|grep "https://bsky.app/profile/">/dev/null 2>&1;then
echo "please url : https://bsky.app/profile/$1/post/xxx"
exit
fi
if [ -z "$4" ];then
echo "please img-url : https://example.com/img.png"
exit
fi
img=$4
author=`echo $3|cut -d / -f 5`
cd $dir_git_card_page
cat $file_fanart|jq ".+ {\"add\":\"$1\",\"link\":\"$3\",\"author\":\"$author\",\"img\":\"$img\"}" >! $file_fanart.back
if cat $file_fanart|jq . ;then
mv $file_fanart.back $file_fanart
git add $file_fanart
git commit -m "add fanart"
git push -u orgin main
fi
}
if [ "$2" = "--url" ];then
if [ -z "$3" ];then
exit
fi
fan_art $3
exit
fi
function first(){
#https://bsky.app/profile/$1/post/$e
handle=$2
did="$atr did $2"
curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.uri,.value.text,.value.createdAt"
}
if [ "$2" = "-f" ] || [ "$2" = "f" ];then
first $1
exit
fi
if [ "$2" = "-l" ];then
mfile
cat $file
exit
fi
function first_created(){
#https://bsky.app/profile/$1/post/$e
#curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$1&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.createdAt"
curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$1&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.value.createdAt"
}
if [ -z "$2" ];then
first_created $1
fi
if [ -n "$2" ] ;then
first $2
fi
#for ((i=0;i<=300;i++))
#do
# if [ $i -eq 0 ];then
# timed="1970-01-01"
# fi
# plc $1
# timed=`echo $json_tmp|jq -r .createdAt|tail -n 1`
#done

View File

@@ -1,129 +0,0 @@
#!/bin/zsh
url_plc="https://plc.directory/export"
host_at=bsky.social
url=https://plc.directory
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
dir=$HOME/.config/ai/txt
file=$dir/user_list.txt
unset timed
case $OSTYPE in
darwin*)
alias date="/opt/homebrew/bin/gdate"
;;
esac
if [ -z "$1" ];then
exit
fi
if ! echo $1|grep "." >/dev/null 2>&1;then
echo "ex : user syui.bsky.social"
exit
fi
if [ ! -d $dir ];then
mkdir -p $dir
fi
if [ ! -f $file ];then
touch $file
fi
function mfile() {
t=`cat $file|sort|uniq`
if [ -n "$t" ];then
echo "$t" >! ${file}.back
mv ${file}.back $file
fi
}
function plc(){
if cat $file|grep "$1" >/dev/null 2>&1;then
cat $file|grep "$1"
exit
fi
json_tmp=`curl -sL "${url_plc}?after=${timed}"|jq .`
json=`echo $json_tmp|jq "select(.operation.handle == \"$1\")"`
if [ -z "$json" ];then
check=`echo $json_tmp|jq -r ".operation.alsoKnownAs"|head -n 1`
if [ "null" != "$check" ];then
json=`echo $json_tmp|jq "select(.operation.alsoKnownAs|.[] == \"at://$1\")"` >/dev/null 2>&1
fi
fi
if [ -n "$json" ];then
created_at=`echo $json|jq -r .createdAt |tail -n 1`
fi
if [ -n "$created_at" ];then
echo "$created_at : $1"
echo "$created_at : $1" >> $file
mfile
exit
fi
}
function fan_art(){
if ! echo $3|grep "https://bsky.app/profile/">/dev/null 2>&1;then
echo "please url : https://bsky.app/profile/$1/post/xxx"
exit
fi
if [ -z "$4" ];then
echo "please img-url : https://example.com/img.png"
exit
fi
img=$4
author=`echo $3|cut -d / -f 5`
cd $dir_git_card_page
cat $file_fanart|jq ".+ {\"add\":\"$1\",\"link\":\"$3\",\"author\":\"$author\",\"img\":\"$img\"}" >! $file_fanart.back
if cat $file_fanart|jq . ;then
mv $file_fanart.back $file_fanart
git add $file_fanart
git commit -m "add fanart"
git push -u orgin main
fi
}
if [ "$2" = "--url" ];then
if [ -z "$3" ];then
exit
fi
fan_art $3
exit
fi
function first(){
#https://bsky.app/profile/$1/post/$e
curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$1&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.uri,.value"
}
if [ "$2" = "-f" ];then
first $1
exit
fi
if [ "$2" = "-l" ];then
mfile
cat $file
exit
fi
function first_created(){
#https://bsky.app/profile/$1/post/$e
#curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$1&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.createdAt"
curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$1&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.value.createdAt"
}
first_created $1
#for ((i=0;i<=300;i++))
#do
# if [ $i -eq 0 ];then
# timed="1970-01-01"
# fi
# plc $1
# timed=`echo $json_tmp|jq -r .createdAt|tail -n 1`
#done

View File

@@ -1,51 +0,0 @@
#!/bin/zsh
if [ -n "$1" ];then
did=$1
else
did=`atr did yui.syui.ai`
fi
pds=`curl -sL https://plc.directory/$did|jq -r ".service.[].serviceEndpoint" | cut -d / -f 3-`
handle=`curl -sL https://plc.directory/$did|jq -r ".alsoKnownAs.[]"|cut -d / -f 3-`
old_pds=`curl -sL https://plc.directory/$did/log|jq -r ".[0].service"|cut -d / -f 3-`
old_handle=`curl -sL https://plc.directory/$did/log|jq -r ".[0]|.handle"`
first_post=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$did&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.value.createdAt"`
body_handle=$handle
body_pds=$pds
if [ "$old_handle" != "null" ];then
body_handle="$old_handle -> $handle"
fi
if [ "$old_pds" != "null" ];then
body_pds="$old_pds -> $pds"
fi
old_pds=`curl -sL https://plc.directory/$did/log|jq -r ".[0]|.services.atproto_pds.endpoint"|cut -d / -f 3-`
old_handle=`curl -sL https://plc.directory/$did/log|jq -r ".[0]|.alsoKnownAs.[0]"|cut -d / -f 3-`
if [ "$old_handle" != "null" ];then
body_handle="$old_handle -> $handle"
fi
if [ "$old_pds" != "null" ];then
body_pds="$old_pds -> $pds"
fi
if [ "$old_pds" = "$pds" ];then
body_pds=$pds
fi
if [ "$old_handle" = "$handle" ];then
body_handle=$handle
fi
echo pds : $body_pds
echo handle : $body_handle
echo did : $did
echo createdAt : $first_post

View File

@@ -0,0 +1,18 @@
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on: [push]
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!"
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Check out repository code
uses: actions/checkout@v3
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
- run: echo "🍏 This job's status is ${{ gitea.status }}."

12
.gitignore vendored
View File

@@ -1,9 +1,19 @@
Cargo.lock
target
*.json
#*.json
*.DS_Store
**.DS_Store
scpt/json/
.config/ai/*.toml
.config/ai/*.json
.config/ai/txt
.config/ai/png
.ssh/*.key
.ssh/*.pub
.ssh/*config
.env
pnpm-lock.yaml
**Cargo.lock
*/target/
*/**/*.rs.bk

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "bot_scpt"]
path = .config/ai/scpt
url = git@git.syui.ai:ai/bot_scpt.git

0
.ssh/keep Normal file
View File

View File

@@ -1,7 +1,9 @@
[package]
name = "ai"
version = "0.0.1"
authors = ["syui"]
version = "0.1.0"
edition = "2021"
description = "latest@2024-08-18"
[dependencies]
seahorse = "*"

View File

@@ -1,10 +1,7 @@
FROM syui/aios
USER root
ADD .config /root/.config
WORKDIR /root
ADD ./test/entrypoint.sh .
RUN chmod +x /root/entrypoint.sh
ADD ./test/entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
ENTRYPOINT ["/root/entrypoint.sh"]

View File

@@ -3,14 +3,18 @@
<img src="./icon/avatar.png" width="100">
- name : ai bot
- base : [rust](https://www.rust-lang.org)
- base : [ai os](https://git.syui.ai/ai/os)
- host : [yui.syui.ai](https://bsky.app/profile/yui.syui.ai), [ai.syu.is](https://web.syu.is/profile/ai.syu.is)
```sh
$ ai
```
### logo
```sh
$ docker run -it syui/aios ai
```
### build
```sh
$ cargo build
@@ -57,17 +61,21 @@ $ ai n | jq .
$ ai bot
```
|command|sub|type|body|
|---|---|---|---|
|@yui.syui.ai did||mention, reply| [plc.directory](https://plc.directory)/$did/log |
|@yui.syui.ai card|r, s, b|mention, reply| https://card.syui.ai |
|@yui.syui.ai ten|start, d, p|mention, reply| https://card.syui.ai |
|@yui.syui.ai fav|{cid}|mention, reply| https://card.syui.ai |
|@yui.syui.ai egg|{password}|mention, reply| https://card.syui.ai |
|@yui.syui.ai 占い||mention, reply| https://yui.syui.ai |
|@yui.syui.ai nyan|🍰|mention, reply| https://yui.syui.ai |
|@yui.syui.ai diffusers|{keyword}|mention, reply| [diffusers](https://huggingface.co/docs/diffusers/index) |
|@yui.syui.ai sh(admin)|{command}|mention, reply| [archlinux](https://wiki.archlinux.org/title/Systemd-nspawn) |
|command|sub|type|link|auth|
|---|---|---|---|---|
|/did||mention, reply| [plc.directory](https://plc.directory)/$did/log |user|
|/card|r, s, b|mention, reply| [card.syui.ai](https://card.syui.ai) |user|
|/ten|start, close, d, p|mention, reply| [card.syui.ai](https://card.syui.ai) |user|
|/fav|{cid}|mention, reply| [card.syui.ai](https://card.syui.ai) |user|
|/egg|{password}|mention, reply| [card.syui.ai](https://card.syui.ai) |user|
|/nyan|🍬|mention, reply| [yui.syui.ai](https://yui.syui.ai) |user|
|/diffusers|{keyword}|mention, reply| [huggingface.co/diffusers](https://huggingface.co/docs/diffusers/index) |user|
|/sh|{command}|mention, reply| [archlinux.org](https://wiki.archlinux.org/title/Systemd-nspawn) |admin|
|/占い||mention, reply| [yui.syui.ai](https://yui.syui.ai) |user|
```sh
@yui.syui.ai /did
```
### test
@@ -86,13 +94,51 @@ $ cargo make build
### docker
> .env
```sh
$ docker run -it syui/aios ai
$ docker run -it -d syui/aios zsh -c "ai login <handle> -p <password> && ai bot"
HANDLE=ai.syu.is
PASSWORD=xxx
HOST=syu.is
ADMIN=syui.syu.is
```
```sh
$ cp -rf ~/.config/ai ./.config/
$ docker compose up
$ docker compose build
$ docker compose up -d
```
## pds:card
- https://atproto.com/ja/guides/lexicon
- https://at.syu.is/at/did:plc:uqzpqmrjnptsxezjx4xuh2mn/ai.syui.card/3lagpwihqxi2v
```sh
# oauth(button)
[yui]ai.syui.card.verify -> [user]ai.syui.card
[yui]
$ ./target/debug/ai card-verify -i 0 -p 0 -r 0 -h syui.ai -d did:plc:uqzpqmrjnptsxezjx4xuh2mn
{"uri":"at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.card.verify/3lagpvhppmd2q"}
[user]
$ ./target/debug/ai card -i 0 -p 0 -r 0 -v at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.card.verify/3lagpvhppmd2q
```
## pds:game
- https://atproto.com/ja/specs/record-key
- https://at.syu.is/at/did:plc:uqzpqmrjnptsxezjx4xuh2mn/ai.syui.game/self
```sh
# oauth(play)
[yui]ai.syui.game.user -> [user]ai.syui.game
[account]
# https://at.syu.is/at/did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game.user/syui
## [rkey]
1. echo $handle|cut -d . -f 1
2. $handle
3. tid
```

10
at/feed-generator/env Normal file
View File

@@ -0,0 +1,10 @@
FEEDGEN_PORT=3000
FEEDGEN_LISTENHOST="0.0.0.0"
FEEDGEN_SQLITE_LOCATION="/data/db.sqlite"
FEEDGEN_SUBSCRIPTION_ENDPOINT="wss://bgs.syu.is"
FEEDGEN_PUBLISHER_DID="did:web:feed.syu.is"
FEEDGEN_HOSTNAME="feed.syu.is"
FEEDGEN_SUBSCRIPTION_RECONNECT_DELAY=3000
FEEDGEN_PUBLISHER_DID=did:plc:4hqjfn7m6n5hno3doamuhgef
FEEDGEN_SUBSCRIPTION_ENDPOINT="wss://bsky.network"

View File

@@ -0,0 +1,26 @@
# custom feed
- at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.generator/cmd
- [bsky.app](https://bsky.app/profile/did:plc:4hqjfn7m6n5hno3doamuhgef/feed/cmd)
- [app.bsky.feed.getFeedSkeleton](https://feed.syu.is/xrpc/app.bsky.feed.getFeedSkeleton?feed=at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.generator/cmd)
```sh
did=did:plc:4hqjfn7m6n5hno3doamuhgef
col=app.bsky.feed.generator
cid=cmd
uri=at://$did/$col/$cid
echo $uri
```
## bsky-feed
```sh
$ git clone https://github.com/bluesky-social/feed-generator
```
```sh
docker compose build feed-generator
docker build -t publish_feed -f Dockerfile.feed .
docker run publish_feed
```

View File

@@ -0,0 +1,43 @@
import { InvalidRequestError } from '@atproto/xrpc-server'
import { QueryParams } from '../lexicon/types/app/bsky/feed/getFeedSkeleton'
import { AppContext } from '../config'
// max 15 chars
export const shortname = 'cmd'
export const handler = async (ctx: AppContext, params: QueryParams) => {
let builder = ctx.db
.selectFrom('post')
.selectAll()
.orderBy('indexedAt', 'desc')
.orderBy('cid', 'desc')
.limit(params.limit)
if (params.cursor) {
const [indexedAt, cid] = params.cursor.split('::')
if (!indexedAt || !cid) {
throw new InvalidRequestError('malformed cursor')
}
const timeStr = new Date(parseInt(indexedAt, 10)).toISOString()
builder = builder
.where('post.indexedAt', '<', timeStr)
.orWhere((qb) => qb.where('post.indexedAt', '=', timeStr))
.where('post.cid', '<', cid)
}
const res = await builder.execute()
const feed = res.map((row) => ({
post: row.uri,
}))
let cursor: string | undefined
const last = res.at(-1)
if (last) {
cursor = `${new Date(last.indexedAt).getTime()}::${last.cid}`
}
return {
cursor,
feed,
}
}

View File

@@ -0,0 +1,14 @@
import { AppContext } from '../config'
import {
QueryParams,
OutputSchema as AlgoOutput,
} from '../lexicon/types/app/bsky/feed/getFeedSkeleton'
import * as cmd from './cmd'
type AlgoHandler = (ctx: AppContext, params: QueryParams) => Promise<AlgoOutput>
const algos: Record<string, AlgoHandler> = {
[cmd.shortname]: cmd.handler,
}
export default algos

View File

@@ -0,0 +1,50 @@
import {
OutputSchema as RepoEvent,
isCommit,
} from './lexicon/types/com/atproto/sync/subscribeRepos'
import { FirehoseSubscriptionBase, getOpsByType } from './util/subscription'
export class FirehoseSubscription extends FirehoseSubscriptionBase {
async handleEvent(evt: RepoEvent) {
if (!isCommit(evt)) return
const ops = await getOpsByType(evt)
// This logs the text of every post off the firehose.
// Just for fun :)
// Delete before actually using
for (const post of ops.posts.creates) {
console.log(post.record.text)
}
const postsToDelete = ops.posts.deletes.map((del) => del.uri)
const postsToCreate = ops.posts.creates
.filter((create) => {
return create.record.text.match('^/[a-z]') || create.record.text.match('^@ai ') || create.record.text.match('/ai ');
//return create.record.text.toLowerCase().includes('alf')
})
.map((create) => {
// map alf-related posts to a db row
return {
uri: create.uri,
cid: create.cid,
replyParent: create.record?.reply?.parent.uri ?? null,
replyRoot: create.record?.reply?.root.uri ?? null,
indexedAt: new Date().toISOString(),
}
})
if (postsToDelete.length > 0) {
await this.db
.deleteFrom('post')
.where('uri', 'in', postsToDelete)
.execute()
}
if (postsToCreate.length > 0) {
await this.db
.insertInto('post')
.values(postsToCreate)
.onConflict((oc) => oc.doNothing())
.execute()
}
}
}

View File

@@ -1,7 +1,11 @@
services:
aios:
image: syui/aios
#image: syui/aios
#command: ai bot -a syui.syu.is
build:
context: .
restart: always
env_file:
- .env
volumes:
- ./.config:/root/.config
command: zsh -c "ai bot"

38
docs/atproto.md Normal file
View File

@@ -0,0 +1,38 @@
## curl
no-authorization
https://docs.bsky.app/docs/api/com-atproto-repo-describe-repo
```sh
handle=yui.syui.ai
host=bsky.social
api=$host/xrpc
plc=plc.directory
url=$api/com.atproto.repo.describeRepo
curl -sL ${host}/xrpc/_health
d=`curl -sL "${url}?repo=$handle"`
echo $d
did=`echo $d|jq -r .did`
echo $did
collection=app.bsky.feed.post
url=$api/com.atproto.repo.listRecords
timed=`curl -sL "${url}?repo=$handle&collection=$collection&reverse=true&limit=1"|jq -r ".[]|.[0]?|.value.createdAt"`
cid=`curl -sL "${url}?repo=$handle&collection=$collection&reverse=true&limit=1"|jq -r ".[]|.[0]?|.cid"`
uri=`curl -sL "${url}?repo=$handle&collection=$collection&reverse=true&limit=1"|jq -r ".[]|.[0]?|.uri"`
rkey=`echo $uri|cut -d / -f 5`
url=$api/com.atproto.repo.getRecord
curl -sL "$url?repo=$did&collection=$collection&rkey=$rkey"|jq .
uri=at://did:plc:vjug55kidv6sye7ykr5faxxn/app.bsky.feed.post/3jzn6g7ixgq2y
cid=bafyreiey2tt4dhvuvr7tofatdverqrxmscnnus2uyfcmkacn2fov3vb4wa
did=did:plc:vjug55kidv6sye7ykr5faxxn
rkey=3jzn6g7ixgq2y
url=$api/com.atproto.repo.getRecord
curl -sL "$url?repo=$did&collection=$collection&rkey=$rkey&cid="|jq .
```

View File

@@ -1 +1,230 @@
##
## test-notify
```sh
./target/debug/ai n|jq -r ".notifications|.[].cid" >> ~/.config/ai/txt/notify_cid*
./target/debug/ai bot
```
## docker
```sh
$ docker run -it syui/aios ai
$ docker run -it -d syui/aios zsh -c "ai login <handle> -p <password> && ai bot"
```
```sh
$ cp -rf ~/.config/ai ./.config/
$ docker compose up
```
## cron
```sh
$ sudo pacman -S fcron
$ fcrontab -e
* * * * * $HOME/bot/test/ai.zsh c
```
## ssh
```sh
$ ssh-keygen -f /.ssh/diffusers.key -t ed25519
```
```sh
FROM syui/aios
ADD .ssh /root/.ssh
```
```sh
Host diffusers
HostName localhost
User root
IdentityFile ~/.ssh/diffusers.key
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
```
```sh
services:
aios:
#image: syui/aios
build:
context: .
restart: always
volumes:
- ./.config:/root/.config
command: ai bot -a syui.syu.is
```
## openapi
```sh
# https://github.com/rdmurphy/atproto-openapi-types
$ curl -sLO https://raw.githubusercontent.com/rdmurphy/atproto-openapi-types/main/spec/api.json
```
## plc
```sh
# 何度か実行するとplcをlatestまでexportされる
$ .config/ai/scpt/test/pds.zsh e
```
## cmt
blogなどにblueskyアカウントのpostを表示します。
以下でbotがblogのコメントシステムを開きます。
```sh
@yui.syui.ai /comment https://syui.ai/blog/post/2024/04/25/bluesky/
```
開いたbotのpostに返信することで、特定のblog path上でpostを表示します。
<blockquote class="bluesky-embed" data-bluesky-uri="at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.post/3kqxbtmwlje2h" data-bluesky-cid="bafyreiasxp5g3nkkd6g7lxh55qaxcc7ylefaljmbcp627nu2geks62c57m"><p lang="">please reply with your comments here ↓
</p>&mdash; ai (<a href="https://bsky.app/profile/did:plc:4hqjfn7m6n5hno3doamuhgef?ref_src=embed">@yui.syui.ai</a>) <a href="https://bsky.app/profile/did:plc:4hqjfn7m6n5hno3doamuhgef/post/3kqxbtmwlje2h?ref_src=embed">Apr 25, 2024 at 20:18</a></blockquote><script async src="https://embed.bsky.app/static/embed.js" charset="utf-8"></script>
```ts
<link href="https://syui.ai/js/comment/app.js" rel="preload" as="script">
<link href="https://syui.ai/js/comment/chunk-vendors.js" rel="preload" as="script">
<div id="comment"></div>
<script async src="https://embed.bsky.app/static/embed.js" charset="utf-8"></script>
<script src="https://syui.ai/js/comment/chunk-vendors.js"></script>
<script src="https://syui.ai/js/comment/app.js"></script>
```
## example json
```json
[
{
"uri": "at://did:plc:wkzuqomvkxx5eiv5nl2lvm23/app.bsky.feed.post/3kp4ze5dcek2j",
"cid": "bafyreic4g7mthhw654zgv4skt5tqbs2xqg6n7bli4gayl2nquljngnotiy",
"author": {
"did": "did:plc:wkzuqomvkxx5eiv5nl2lvm23",
"handle": "syui.syu.is",
"displayName": "syui",
"avatar": "https://api.syu.is/img/avatar/plain/did:plc:wkzuqomvkxx5eiv5nl2lvm23/bafkreifvabvstfgawt6csagh44xdevb6c2uiwpgfho3xnpdrr6o7nbkxry@jpeg",
"indexedAt": "2024-01-14T10:20:13.367Z",
"viewer": {
"muted": false,
"blockedBy": false,
"following": "at://did:plc:dconvttcori3mrh2wrmehvwt/app.bsky.graph.follow/3kiztjatnms25",
"followedBy": "at://did:plc:wkzuqomvkxx5eiv5nl2lvm23/app.bsky.graph.follow/3kirwsboeos26"
},
"labels": []
},
"reason": "reply",
"reasonSubject": "at://did:plc:dconvttcori3mrh2wrmehvwt/app.bsky.feed.post/3kp4zdnlo5s2j",
"record": {
"text": "1",
"$type": "app.bsky.feed.post",
"langs": [
"ja"
],
"reply": {
"root": {
"cid": "bafyreiceckunxajycacn7dbuojrwb2wmurhfkleermvewwik44cn6vqo3a",
"uri": "at://did:plc:dconvttcori3mrh2wrmehvwt/app.bsky.feed.post/3kp4zdnlo5s2j"
},
"parent": {
"cid": "bafyreiceckunxajycacn7dbuojrwb2wmurhfkleermvewwik44cn6vqo3a",
"uri": "at://did:plc:dconvttcori3mrh2wrmehvwt/app.bsky.feed.post/3kp4zdnlo5s2j"
}
},
"createdAt": "2024-04-02T07:12:28.799Z"
},
"isRead": true,
"indexedAt": "2024-04-02T07:12:28.799Z",
"labels": []
},
{
"uri": "at://did:plc:wkzuqomvkxx5eiv5nl2lvm23/app.bsky.feed.post/3kp54af2zes2j",
"cid": "bafyreig4kvfpu557qehttt2y5eh7rcyodbxqwtnl73f3fhjsstiap3abzu",
"author": {
"did": "did:plc:wkzuqomvkxx5eiv5nl2lvm23",
"handle": "syui.syu.is",
"displayName": "syui",
"avatar": "https://api.syu.is/img/avatar/plain/did:plc:wkzuqomvkxx5eiv5nl2lvm23/bafkreifvabvstfgawt6csagh44xdevb6c2uiwpgfho3xnpdrr6o7nbkxry@jpeg",
"indexedAt": "2024-01-14T10:20:13.367Z",
"viewer": {
"muted": false,
"blockedBy": false,
"following": "at://did:plc:dconvttcori3mrh2wrmehvwt/app.bsky.graph.follow/3kiztjatnms25",
"followedBy": "at://did:plc:wkzuqomvkxx5eiv5nl2lvm23/app.bsky.graph.follow/3kirwsboeos26"
},
"labels": []
},
"reason": "reply",
"reasonSubject": "at://did:plc:dconvttcori3mrh2wrmehvwt/app.bsky.feed.post/3kp4zdnlo5s2j",
"record": {
"text": "2",
"$type": "app.bsky.feed.post",
"langs": [
"ja"
],
"reply": {
"root": {
"cid": "bafyreiceckunxajycacn7dbuojrwb2wmurhfkleermvewwik44cn6vqo3a",
"uri": "at://did:plc:dconvttcori3mrh2wrmehvwt/app.bsky.feed.post/3kp4zdnlo5s2j"
},
"parent": {
"cid": "bafyreiceckunxajycacn7dbuojrwb2wmurhfkleermvewwik44cn6vqo3a",
"uri": "at://did:plc:dconvttcori3mrh2wrmehvwt/app.bsky.feed.post/3kp4zdnlo5s2j"
}
},
"createdAt": "2024-04-02T08:04:03.938Z"
},
"isRead": true,
"indexedAt": "2024-04-02T08:04:03.938Z",
"labels": []
}
]
```
```json
{
"uri": "at://did:plc:uqzpqmrjnptsxezjx4xuh2mn/app.bsky.feed.post/3kp5qniyzm42h",
"cid": "bafyreihmutmtf2clpgmx5l3qpu6xea6z25xrop74mltsycs5lfacm27u6e",
"author": {
"did": "did:plc:uqzpqmrjnptsxezjx4xuh2mn",
"handle": "syui.ai",
"displayName": "syui",
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:uqzpqmrjnptsxezjx4xuh2mn/bafkreid6kcc5pnn4b3ar7mj6vi3eiawhxgkcrw3edgbqeacyrlnlcoetea@jpeg",
"viewer": {
"muted": false,
"blockedBy": false,
"followedBy": "at://did:plc:uqzpqmrjnptsxezjx4xuh2mn/app.bsky.graph.follow/3kkvst5iq6r2a"
},
"labels": [],
"description": "https://syui.ai",
"indexedAt": "2024-01-25T23:54:12.979Z"
},
"reason": "reply",
"reasonSubject": "at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.post/3kp5qn72s232q",
"record": {
"$type": "app.bsky.feed.post",
"createdAt": "2024-04-02T14:09:18.926Z",
"langs": [
"ja"
],
"reply": {
"parent": {
"cid": "bafyreiewdfyh6rywpkdzpmf5markqa6tavc5smc32q7cw2wpwbqik5hnfm",
"uri": "at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.post/3kp5qn72s232q"
},
"root": {
"cid": "bafyreiewdfyh6rywpkdzpmf5markqa6tavc5smc32q7cw2wpwbqik5hnfm",
"uri": "at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.post/3kp5qn72s232q"
}
},
"text": "first"
},
"isRead": true,
"indexedAt": "2024-04-02T14:09:18.926Z",
"labels": []
}
```

BIN
icon/bot_scpt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 KiB

57
k8s/aios-deployment.yaml Normal file
View File

@@ -0,0 +1,57 @@
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert -f ../compose.yml --volumes hostPath
kompose.version: 1.32.0 (HEAD)
labels:
io.kompose.service: aios
name: aios
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: aios
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: kompose convert -f ../compose.yml --volumes hostPath
kompose.version: 1.32.0 (HEAD)
labels:
io.kompose.network/bot-default: "true"
io.kompose.service: aios
spec:
containers:
- env:
- name: ADMIN
valueFrom:
configMapKeyRef:
key: ADMIN
name: env
- name: HANDLE
valueFrom:
configMapKeyRef:
key: HANDLE
name: env
- name: HOST
valueFrom:
configMapKeyRef:
key: HOST
name: env
- name: PASSWORD
valueFrom:
configMapKeyRef:
key: PASSWORD
name: env
image: aios
name: aios
volumeMounts:
- mountPath: /root/.config
name: aios-hostpath0
restartPolicy: Always
volumes:
- hostPath:
path: /Users/syui/ai/bot/.config
name: aios-hostpath0

11
k8s/env-configmap.yaml Normal file
View File

@@ -0,0 +1,11 @@
apiVersion: v1
data:
ADMIN: $ADMIN
HANDLE: $HANDLE
HOST: $HOST
PASSWORD: $PASSWORD
kind: ConfigMap
metadata:
labels:
io.kompose.service: aios-env
name: env

1007
src/bot.rs

File diff suppressed because it is too large Load Diff

View File

@@ -34,6 +34,7 @@ pub fn log_file(s: &str) -> String {
match &*s {
"n1" => f + &"notify_cid.txt",
"n2" => f + &"notify_cid_run.txt",
"c1" => f + &"comment_cid.txt",
_ => f + &s,
}
}
@@ -84,6 +85,7 @@ pub struct Token {
#[allow(non_snake_case)]
pub struct Data {
pub host: String,
pub password: String,
pub did: String,
pub handle: String,
pub access: String,
@@ -105,6 +107,7 @@ pub struct BaseUrl {
pub record_list: String,
pub record_create: String,
pub record_delete: String,
pub record_put: String,
pub session_create: String,
pub session_refresh: String,
pub session_get: String,
@@ -122,6 +125,7 @@ pub struct BaseUrl {
pub follow: String,
pub follows: String,
pub followers: String,
pub feed_get: String,
}
pub fn url(s: &str) -> String {
@@ -129,6 +133,7 @@ pub fn url(s: &str) -> String {
let data = Data::new().unwrap();
let data = Data {
host: data.host,
password: data.password,
handle: data.handle,
did: data.did,
access: data.access,
@@ -138,6 +143,7 @@ pub fn url(s: &str) -> String {
let baseurl = BaseUrl {
profile_get: "com.atproto.identity.resolveHandle".to_string(),
thread_get: "app.bsky.feed.getPostThread".to_string(),
record_put: "com.atproto.repo.putRecord".to_string(),
record_create: "com.atproto.repo.createRecord".to_string(),
record_delete: "com.atproto.repo.deleteRecord".to_string(),
describe: "com.atproto.repo.describeRepo".to_string(),
@@ -146,6 +152,7 @@ pub fn url(s: &str) -> String {
session_refresh: "com.atproto.server.refreshSession".to_string(),
session_get: "com.atproto.server.getSession".to_string(),
timeline_get: "app.bsky.feed.getTimeline".to_string(),
feed_get: "app.bsky.feed.getFeed".to_string(),
timeline_author: "app.bsky.feed.getAuthorFeed".to_string(),
like: "app.bsky.feed.like".to_string(),
repost: "app.bsky.feed.repost".to_string(),
@@ -168,6 +175,7 @@ pub fn url(s: &str) -> String {
"record_list" => t.to_string() + &baseurl.record_list,
"record_create" => t.to_string() + &baseurl.record_create,
"record_delete" => t.to_string() + &baseurl.record_delete,
"record_put" => t.to_string() + &baseurl.record_put,
"session_create" => t.to_string() + &baseurl.session_create,
"session_refresh" => t.to_string() + &baseurl.session_refresh,
"session_get" => t.to_string() + &baseurl.session_get,
@@ -185,6 +193,7 @@ pub fn url(s: &str) -> String {
"follow" => t.to_string() + &baseurl.follow,
"follows" => t.to_string() + &baseurl.follows,
"followers" => t.to_string() + &baseurl.followers,
"feed_get" => t.to_string() + &baseurl.feed_get,
_ => s,
}
}
@@ -194,13 +203,15 @@ pub fn data_toml(s: &str) -> String {
let data = Data::new().unwrap();
let data = Data {
host: data.host,
password: data.password,
handle: data.handle,
did: data.did,
access: data.access,
refresh: data.refresh,
};
match &*s {
"host" => data.handle,
"host" => data.host,
"password" => data.password,
"handle" => data.handle,
"did" => data.did,
"access" => data.access,
@@ -209,8 +220,35 @@ pub fn data_toml(s: &str) -> String {
}
}
pub fn c_refresh(access: &str, refresh: &str) {
let ff = data_file(&"refresh");
let mut ff = fs::File::create(ff.clone()).unwrap();
let refreshs = Refresh {
access: access.to_string(),
refresh: refresh.to_string(),
};
let toml = toml::to_string(&refreshs).unwrap();
ff.write_all(&toml.as_bytes()).unwrap();
}
pub fn data_refresh(s: &str) -> String {
let s = String::from(s);
let data = Data::new().unwrap();
let data = Data {
host: data.host,
password: data.password,
handle: data.handle,
did: data.did,
access: data.access,
refresh: data.refresh,
};
let mut _file = match Refresh::new()
{
Err(_why) => c_refresh(&data.access, &data.refresh),
Ok(_) => println!(""),
};
let refresh = Refresh::new().unwrap();
let refresh = Refresh {
access: refresh.access,
@@ -490,7 +528,7 @@ pub fn c_char(i: String) -> String {
return s;
}
pub fn w_cfg(h: &str, res: &str) {
pub fn w_cfg(h: &str, res: &str, password: &str) {
let f = data_file(&"json");
let ff = data_file(&"toml");
let mut f = fs::File::create(f.clone()).unwrap();
@@ -499,6 +537,7 @@ pub fn w_cfg(h: &str, res: &str) {
let json: Token = serde_json::from_str(&res).unwrap();
let datas = Data {
host: h.to_string(),
password: password.to_string(),
did: json.did.to_string(),
handle: json.handle.to_string(),
access: json.accessJwt.to_string(),
@@ -506,14 +545,20 @@ pub fn w_cfg(h: &str, res: &str) {
};
let toml = toml::to_string(&datas).unwrap();
ff.write_all(&toml.as_bytes()).unwrap();
let ff = data_file(&"refresh");
let mut ff = fs::File::create(ff.clone()).unwrap();
let refreshs = Refresh {
access: json.accessJwt.to_string(),
refresh: json.refreshJwt.to_string(),
};
let toml = toml::to_string(&refreshs).unwrap();
ff.write_all(&toml.as_bytes()).unwrap();
}
pub fn w_refresh(res: &str) {
let f = data_file(&"json");
let ff = data_file(&"refresh");
let mut f = fs::File::create(f.clone()).unwrap();
let mut ff = fs::File::create(ff.clone()).unwrap();
f.write_all(&res.as_bytes()).unwrap();
let json: Token = serde_json::from_str(&res).unwrap();
let refreshs = Refresh {
access: json.accessJwt.to_string(),

33
src/delete_record.rs Normal file
View File

@@ -0,0 +1,33 @@
extern crate reqwest;
use crate::data_toml;
use crate::data_refresh;
use crate::url;
use serde_json::json;
pub async fn post_request(rkey: String, col: String) -> String {
let token = data_refresh(&"access");
//let did = data_toml(&"did");
let handle = data_toml(&"handle");
let url = url(&"record_delete");
let post = Some(json!({
"repo": handle.to_string(),
"rkey": rkey.to_string(),
"collection": col.to_string()
}));
let client = reqwest::Client::new();
let res = client
.post(url)
.json(&post)
.header("Authorization", "Bearer ".to_owned() + &token)
.send()
.await
.unwrap()
.text()
.await
.unwrap();
return res;
}

33
src/feed_get.rs Normal file
View File

@@ -0,0 +1,33 @@
extern crate reqwest;
use crate::data_refresh;
use crate::url;
pub async fn get_request(feed: String) -> String {
let token = data_refresh(&"access");
let url = url(&"feed_get");
let feed = feed.to_string();
//let col = "app.bsky.feed.generator".to_string();
let client = reqwest::Client::new();
let res = client
.get(url)
.query(&[("feed", feed)])
//.query(&[("feed", feed), ("collection", col)])
.header("Authorization", "Bearer ".to_owned() + &token)
.send()
.await
.unwrap();
let status_ref = res.error_for_status_ref();
match status_ref {
Ok(_) => {
return res.text().await.unwrap();
}
Err(_e) => {
let e = "err".to_string();
return e;
}
}
}

77
src/feed_watch.rs Normal file
View File

@@ -0,0 +1,77 @@
use seahorse::Context;
//use crate::openai;
use crate::feed_get;
use crate::data::data_toml;
use crate::data::Timeline;
use crate::data::log_file;
use crate::data::w_cid;
pub fn c_feed_watch(c: &Context) {
let mut feed = "at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.generator/cmd".to_string();
if c.string_flag("url").is_ok() {
feed = c.string_flag("url").unwrap();
}
let mut tag = "syai".to_string();
if c.string_flag("tag").is_ok() {
tag = c.string_flag("tag").unwrap();
}
let h = async {
let notify = feed_get::get_request(feed).await;
if notify == "err" {
return;
//refresh(c);
//notify = feed_get::get_request("at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.generator/cmd".to_string()).await;
}
let timeline: Timeline = serde_json::from_str(&notify).unwrap();
let n = timeline.feed;
let host = data_toml(&"host");
let length = &n.len();
let su = 0..*length;
for i in su {
let cid = &n[i].post.cid;
let check_cid = w_cid(cid.to_string(), log_file(&"n1"), false);
let handle = &n[i].post.author.handle;
let did = &n[i].post.author.did;
let uri = &n[i].post.uri;
let _time = &n[i].post.indexedAt;
let cid_root = cid;
let uri_root = uri;
let mut text = "";
if !n[i].post.record.text.is_none() {
text = &n[i].post.record.text.as_ref().unwrap();
}
let vec: Vec<&str> = text.split_whitespace().collect();
let com = vec[0].trim().to_string();
let mut prompt = "".to_string();
let mut prompt_sub = "".to_string();
if com == "@ai" || com == "/ai" || com == tag {
prompt_sub = vec[1..].join(" ");
} else {
prompt = vec[1..].join(" ");
if vec.len() > 1 {
prompt_sub = vec[2..].join(" ");
}
}
if check_cid == false && { prompt.is_empty() == false || com.is_empty() == false } {
println!("{}", handle);
if c.bool_flag("debug") == true {
println!(
"cid:{}\nuri:{}\ncid_root:{}\nuri_root:{}\nhost:{}\ndid:{}\ncheck_cid:{}",
cid, uri, cid_root, uri_root, host, did, check_cid
);
}
println!("{}", prompt_sub);
println!("---");
w_cid(cid.to_string(), log_file(&"n1"), true);
}
}
};
let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
return res;
}

5
src/game.rs Normal file
View File

@@ -0,0 +1,5 @@
pub mod post_card;
pub mod post_card_verify;
pub mod post_game;
pub mod post_game_user;
pub mod post_game_login;

44
src/game/post_card.rs Normal file
View File

@@ -0,0 +1,44 @@
extern crate reqwest;
use crate::data_toml;
use crate::data_refresh;
use crate::url;
use iso8601_timestamp::Timestamp;
use serde_json::json;
pub async fn post_request(verify: String, id: i32, cp: i32, rank: i32, rare: String, col: String, author: String) -> String {
let token = data_refresh(&"access");
let did = data_toml(&"did");
let handle = data_toml(&"handle");
let url = url(&"record_create");
let d = Timestamp::now_utc();
let d = d.to_string();
let post = Some(json!({
"repo": handle.to_string(),
"did": did.to_string(),
"collection": col.to_string(),
"record": {
"id": id,
"cp": cp,
"rank": rank,
"rare": rare.to_string(),
"author": author.to_string(),
"verify": verify.to_string(),
"createdAt": d.to_string(),
},
}));
let client = reqwest::Client::new();
let res = client
.post(url)
.json(&post)
.header("Authorization", "Bearer ".to_owned() + &token)
.send()
.await
.unwrap()
.text()
.await
.unwrap();
return res;
}

View File

@@ -0,0 +1,58 @@
extern crate reqwest;
use crate::data_toml;
use crate::data_refresh;
use crate::url;
use iso8601_timestamp::Timestamp;
use serde_json::json;
pub async fn post_request(col: String, img: String, id: i32, cp: i32, rank: i32, rare: String, user_handle: String, user_did: String) -> String {
let token = data_refresh(&"access");
let did = data_toml(&"did");
let handle = data_toml(&"handle");
let url = url(&"record_create");
let d = Timestamp::now_utc();
let d = d.to_string();
let link = "https://bsky.app/profile/yui.syui.ai".to_string();
let post = Some(json!({
"repo": handle.to_string(),
"did": did.to_string(),
"collection": col.to_string(),
"record": {
"id": id,
"cp": cp,
"rank": rank,
"rare": rare.to_string(),
"handle": user_handle.to_string(),
"did": user_did.to_string(),
"embed": {
"$type": "app.bsky.embed.external",
"external": {
"uri": link,
"thumb": {
"$type": "blob",
"ref": {
"$link": img.to_string()
},
"mimeType": "image/jpeg",
"size": 0
}
}
},
"createdAt": d.to_string(),
},
}));
let client = reqwest::Client::new();
let res = client
.post(url)
.json(&post)
.header("Authorization", "Bearer ".to_owned() + &token)
.send()
.await
.unwrap()
.text()
.await
.unwrap();
return res;
}

39
src/game/post_game.rs Normal file
View File

@@ -0,0 +1,39 @@
extern crate reqwest;
use crate::data_toml;
use crate::data_refresh;
use crate::url;
use iso8601_timestamp::Timestamp;
use serde_json::json;
pub async fn post_request(col: String, account: String) -> String {
let token = data_refresh(&"access");
let did = data_toml(&"did");
let handle = data_toml(&"handle");
let url = url(&"record_put");
let d = Timestamp::now_utc();
let d = d.to_string();
let post = Some(json!({
"repo": handle.to_string(),
"did": did.to_string(),
"collection": col.to_string(),
"rkey": "self".to_string(),
"record": {
"account": account.to_string(),
"createdAt": d.to_string(),
},
}));
let client = reqwest::Client::new();
let res = client
.post(url)
.json(&post)
.header("Authorization", "Bearer ".to_owned() + &token)
.send()
.await
.unwrap()
.text()
.await
.unwrap();
return res;
}

View File

@@ -0,0 +1,42 @@
extern crate reqwest;
use crate::data_toml;
use crate::data_refresh;
use crate::url;
use iso8601_timestamp::Timestamp;
use serde_json::json;
pub async fn post_request(col: String, username: String, login: bool, account: String) -> String {
let token = data_refresh(&"access");
let did = data_toml(&"did");
let handle = data_toml(&"handle");
let url = url(&"record_put");
let d = Timestamp::now_utc();
let d = d.to_string();
let post = Some(json!({
"repo": handle.to_string(),
"did": did.to_string(),
"collection": col.to_string(),
"rkey": "self".to_string(),
"record": {
"login": login,
"username": username.to_string(),
"account": account.to_string(),
"createdAt": d.to_string(),
},
}));
let client = reqwest::Client::new();
let res = client
.post(url)
.json(&post)
.header("Authorization", "Bearer ".to_owned() + &token)
.send()
.await
.unwrap()
.text()
.await
.unwrap();
return res;
}

View File

@@ -0,0 +1,55 @@
extern crate reqwest;
use crate::data_toml;
use crate::data_refresh;
use crate::url;
use iso8601_timestamp::Timestamp;
use serde_json::json;
pub async fn post_request(col: String, user_name: String, user_did: String, user_handle: String, aiten: i32, limit: i32, chara: String, lv: i32, exp: i32, hp: i32, rank: i32, mode: i32, attach: i32, critical: i32, critical_d: i32) -> String {
let token = data_refresh(&"access");
let did = data_toml(&"did");
let handle = data_toml(&"handle");
let url = url(&"record_put");
let d = Timestamp::now_utc();
let d = d.to_string();
let post = Some(json!({
"repo": handle.to_string(),
"did": did.to_string(),
"collection": col.to_string(),
"rkey": user_name.to_string(),
"record": {
"did": user_did.to_string(),
"handle": user_handle.to_string(),
"aiten": aiten,
"limit": limit,
"character": {
chara.to_string(): {
"lv": lv,
"exp": exp,
"hp": hp,
"rank": rank,
"mode": mode,
"attach": attach,
"critical": critical,
"critical_d": critical_d,
}
},
"createdAt": d.to_string(),
"updatedAt": d.to_string(),
},
}));
let client = reqwest::Client::new();
let res = client
.post(url)
.json(&post)
.header("Authorization", "Bearer ".to_owned() + &token)
.send()
.await
.unwrap()
.text()
.await
.unwrap();
return res;
}

View File

@@ -3,6 +3,7 @@ use std::env;
use crate::ascii::c_ascii;
use crate::bot::c_bot;
use crate::bot::c_bot_feed;
use crate::data::c_follow_all;
use crate::data::c_openai_key;
use crate::data::data_toml;
@@ -10,6 +11,12 @@ use crate::data::data_refresh;
use crate::data::url;
use crate::data::w_cfg;
use crate::data::w_refresh;
use crate::feed_watch::c_feed_watch;
use crate::game::post_card;
use crate::game::post_card_verify;
use crate::game::post_game;
use crate::game::post_game_user;
use crate::game::post_game_login;
use data::ProfileIdentityResolve;
@@ -28,6 +35,7 @@ pub mod notify_read;
pub mod openai;
pub mod post;
pub mod post_link;
pub mod game;
pub mod profile;
pub mod refresh;
pub mod reply;
@@ -37,10 +45,16 @@ pub mod repost;
pub mod session;
pub mod timeline_author;
pub mod token;
pub mod feed_get;
pub mod feed_watch;
pub mod delete_record;
fn main() {
let args: Vec<String> = env::args().collect();
let app = App::new(env!("CARGO_PKG_NAME"))
.author(env!("CARGO_PKG_AUTHORS"))
.version(env!("CARGO_PKG_VERSION"))
.description(env!("CARGO_PKG_DESCRIPTION"))
.command(
Command::new("ai")
.alias("a")
@@ -59,6 +73,26 @@ fn main() {
Flag::new("admin", FlagType::String)
.alias("a"),
)
.flag(
Flag::new("feed", FlagType::String)
.alias("f"),
)
)
.command(
Command::new("feed_watch")
.action(feed_watch)
.flag(
Flag::new("url", FlagType::String)
.alias("u"),
)
.flag(
Flag::new("tag", FlagType::String)
.alias("t"),
)
.flag(
Flag::new("debug", FlagType::Bool)
.alias("d"),
)
)
.command(
Command::new("follow_all")
@@ -95,6 +129,12 @@ fn main() {
.alias("t")
.action(timeline),
)
.command(
Command::new("feed")
.description("feed <feed-uri>")
.alias("f")
.action(feed)
)
.command(
Command::new("did")
.description("did <handle>")
@@ -110,6 +150,170 @@ fn main() {
.alias("l"),
)
)
.command(
Command::new("delete")
.description("d <rkey> -c <collection>")
.alias("d")
.action(delete)
.flag(
Flag::new("col", FlagType::String)
.alias("c"),
)
)
.command(
Command::new("card")
.description("-v <at://verify> -i <int:id> -p <int:cp> -r <int:rank> -c <collection> -a <author> -img <link> -rare <normal>")
.action(card)
.flag(
Flag::new("id", FlagType::Int)
.alias("i"),
)
.flag(
Flag::new("cp", FlagType::Int)
.alias("p"),
)
.flag(
Flag::new("rank", FlagType::Int)
.alias("r"),
)
.flag(
Flag::new("rare", FlagType::Int)
)
.flag(
Flag::new("col", FlagType::String)
.alias("c"),
)
.flag(
Flag::new("author", FlagType::String)
.alias("a"),
)
.flag(
Flag::new("verify", FlagType::String)
.alias("v"),
)
.flag(
Flag::new("img", FlagType::String)
)
)
.command(
Command::new("card-verify")
.description("<at://verify> -c <collection> -i <id> -p <cp> -r <rank> -rare <normal> -H <syui.ai> -d <did>")
.action(card_verify)
.flag(
Flag::new("col", FlagType::String)
.alias("c"),
)
.flag(
Flag::new("id", FlagType::Int)
.alias("i"),
)
.flag(
Flag::new("cp", FlagType::Int)
.alias("p"),
)
.flag(
Flag::new("rank", FlagType::Int)
.alias("r"),
)
.flag(
Flag::new("rare", FlagType::String)
)
.flag(
Flag::new("handle", FlagType::String)
.alias("H"),
)
.flag(
Flag::new("did", FlagType::String)
.alias("did"),
)
)
.command(
Command::new("game")
.description("a <at://yui.syui.ai/ai.syui.game.user/username>")
.action(game)
.flag(
Flag::new("col", FlagType::String)
.alias("c"),
)
.flag(
Flag::new("account", FlagType::String)
.alias("a"),
)
)
.command(
Command::new("game-login")
.description("l <bool> -u <username> -c <collection>")
.action(game_login)
.flag(
Flag::new("col", FlagType::String)
.alias("c"),
)
.flag(
Flag::new("login", FlagType::Bool)
.alias("l"),
)
.flag(
Flag::new("username", FlagType::String)
.alias("u"),
)
)
.command(
Command::new("game-user")
.description("-chara ai -l 20240101 -ten 0 --lv 0 --exp 0 --hp 0 --rank 0 --mode 0 --attach 0 --critical 0 --critical_d 0")
.action(game_user)
.flag(
Flag::new("username", FlagType::String)
.alias("u"),
)
.flag(
Flag::new("col", FlagType::String)
.alias("c"),
)
.flag(
Flag::new("did", FlagType::String)
.alias("d"),
)
.flag(
Flag::new("handle", FlagType::String)
.alias("H"),
)
.flag(
Flag::new("character", FlagType::String)
.alias("chara"),
)
.flag(
Flag::new("aiten", FlagType::Int)
.alias("ten"),
)
.flag(
Flag::new("limit", FlagType::Int)
.alias("l"),
)
.flag(
Flag::new("lv", FlagType::Int)
)
.flag(
Flag::new("hp", FlagType::Int)
)
.flag(
Flag::new("attach", FlagType::Int)
)
.flag(
Flag::new("exp", FlagType::Int)
)
.flag(
Flag::new("critical", FlagType::Int)
)
.flag(
Flag::new("critical_d", FlagType::Int)
)
.flag(
Flag::new("rank", FlagType::Int)
)
.flag(
Flag::new("mode", FlagType::Int)
)
)
.command(
Command::new("like")
.description("like <cid> -u <uri>")
@@ -140,6 +344,12 @@ fn main() {
Flag::new("cid", FlagType::String)
.alias("c"),
)
.flag(
Flag::new("uri-root", FlagType::String)
)
.flag(
Flag::new("cid-root", FlagType::String)
)
.flag(
Flag::new("link", FlagType::String)
.alias("l"),
@@ -184,6 +394,10 @@ fn main() {
Flag::new("post", FlagType::String)
.alias("p"),
)
.flag(
Flag::new("col", FlagType::String)
.alias("c"),
)
)
.command(
Command::new("follow")
@@ -265,6 +479,14 @@ fn bot(c: &Context) {
refresh(c);
loop {
c_bot(c);
c_bot_feed(c);
}
}
fn feed_watch(c: &Context) {
refresh(c);
loop {
c_feed_watch(c);
}
}
@@ -282,14 +504,12 @@ fn token(c: &Context) {
if let Ok(p) = c.string_flag("password") {
if let Ok(s) = c.string_flag("server") {
let res = token::post_request(m.to_string(), p.to_string(), s.to_string()).await;
w_cfg(&s, &res);
w_refresh(&res);
w_cfg(&s, &res, &p);
} else {
let res =
token::post_request(m.to_string(), p.to_string(), "bsky.social".to_string())
.await;
w_cfg(&"bsky.social", &res);
w_refresh(&res);
w_cfg(&"bsky.social", &res, &p);
}
}
};
@@ -302,8 +522,15 @@ fn refresh(_c: &Context) {
let session = session::get_request().await;
if session == "err" {
let res = refresh::post_request().await;
println!("{}", res);
w_refresh(&res)
if res == "err" {
let m = data_toml(&"handle");
let p = data_toml(&"password");
let s = data_toml(&"host");
let res = token::post_request(m.to_string(), p.to_string(), s.to_string()).await;
w_cfg(&s, &res, &p);
} else {
w_refresh(&res);
}
}
};
let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
@@ -320,6 +547,22 @@ fn notify(c: &Context) {
return res;
}
fn feed(c: &Context) {
refresh(c);
let feed_d = "at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.generator/cmd".to_string();
let h = async {
if c.args.len() == 0 {
let j = feed_get::get_request(feed_d).await;
println!("{}", j);
} else {
let j = feed_get::get_request(c.args[0].to_string()).await;
println!("{}", j);
}
};
let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
return res;
}
fn did(c: &Context) {
refresh(c);
let h = async {
@@ -369,6 +612,19 @@ fn post(c: &Context) {
return res;
}
fn delete(c: &Context) {
refresh(c);
let m = c.args[0].to_string();
let h = async {
if let Ok(col) = c.string_flag("col") {
let str = delete_record::post_request(m.to_string(), col);
println!("{}", str.await);
}
};
let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
return res;
}
fn like(c: &Context) {
refresh(c);
let m = c.args[0].to_string();
@@ -382,6 +638,145 @@ fn like(c: &Context) {
return res;
}
async fn c_card(c: &Context) -> Result<(), Box<dyn std::error::Error>> {
//let m = c.args[0].to_string();
let author = c.string_flag("author").unwrap_or_else(|_| "syui".to_string());
let verify = c.string_flag("verify").unwrap_or_else(|_| "at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.card.verify/3lagpvhppmd2q".to_string());
let col = c.string_flag("col").unwrap_or_else(|_| "ai.syui.card".to_string());
//let img = c.string_flag("img").unwrap_or_else(|_| "bafkreigvcjc46qtelpc4wsg7fwf6qktbi6a23ouqiupth2r37zhrn7wbza".to_string());
let id = c.int_flag("id")?.try_into()?;
let cp = c.int_flag("cp")?.try_into()?;
let rank = c.int_flag("rank")?.try_into()?;
let rare = c.string_flag("rare").unwrap_or_else(|_| "normal".to_string());
let str = post_card::post_request(verify, id, cp, rank, rare, col, author);
println!("{}", str.await);
Ok(())
}
fn card(c: &Context) {
refresh(c);
tokio::runtime::Runtime::new()
.unwrap()
.block_on(async {
if let Err(e) = c_card(c).await {
eprintln!("Error: {}", e);
}
});
}
async fn c_card_verify(c: &Context) -> Result<(), Box<dyn std::error::Error>> {
let col = c.string_flag("col").unwrap_or_else(|_| "ai.syui.card.verify".to_string());
let img = c.string_flag("img").unwrap_or_else(|_| "bafkreigvcjc46qtelpc4wsg7fwf6qktbi6a23ouqiupth2r37zhrn7wbza".to_string());
let id = c.int_flag("id")?.try_into()?;
let cp = c.int_flag("cp")?.try_into()?;
let rank = c.int_flag("rank")?.try_into()?;
let rare = c.string_flag("rare").unwrap_or_else(|_| "normal".to_string());
let user_handle = c.string_flag("handle").unwrap_or_else(|_| "syui.ai".to_string());
let user_did = c.string_flag("did").unwrap_or_else(|_| "did:plc:uqzpqmrjnptsxezjx4xuh2mn".to_string());
//match id === 1 let img = "xxx";
let str = post_card_verify::post_request(col, img, id, cp, rank, rare, user_handle, user_did);
println!("{}", str.await);
Ok(())
}
fn card_verify(c: &Context) {
refresh(c);
tokio::runtime::Runtime::new()
.unwrap()
.block_on(async {
if let Err(e) = c_card_verify(c).await {
eprintln!("Error: {}", e);
}
});
}
async fn c_game(c: &Context) -> Result<(), Box<dyn std::error::Error>> {
let account = c.string_flag("account").unwrap_or_else(|_| "at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game.user/syui".to_string());
let col = c.string_flag("col").unwrap_or_else(|_| "ai.syui.game".to_string());
let handle = data_toml(&"handle");
if handle == "syui.ai" {
let str = post_game::post_request(col, account);
println!("{}", str.await);
Ok(())
} else {
Err(Box::new(std::io::Error::new(std::io::ErrorKind::PermissionDenied, "Not authorized")))
}
}
fn game(c: &Context) {
refresh(c);
tokio::runtime::Runtime::new()
.unwrap()
.block_on(async {
if let Err(e) = c_game(c).await {
eprintln!("Error: {}", e);
}
});
}
async fn c_game_user(c: &Context) -> Result<(), Box<dyn std::error::Error>> {
let col = c.string_flag("col").unwrap_or_else(|_| "ai.syui.game.user".to_string());
let user_name = c.string_flag("username").unwrap_or_else(|_| "syui".to_string());
let user_handle = c.string_flag("handle").unwrap_or_else(|_| "syui.ai".to_string());
let user_did = c.string_flag("did").unwrap_or_else(|_| "did:plc:uqzpqmrjnptsxezjx4xuh2mn".to_string());
let chara = c.string_flag("character").unwrap_or_else(|_| "ai".to_string());
let limit = c.int_flag("limit")?.try_into()?;
let aiten = c.int_flag("aiten")?.try_into()?;
let lv = c.int_flag("lv")?.try_into()?;
let exp = c.int_flag("exp")?.try_into()?;
let hp = c.int_flag("hp")?.try_into()?;
let rank = c.int_flag("rank")?.try_into()?;
let mode = c.int_flag("mode")?.try_into()?;
let attach = c.int_flag("attach")?.try_into()?;
let critical = c.int_flag("critical")?.try_into()?;
let critical_d = c.int_flag("critical_d")?.try_into()?;
if data_toml(&"handle") == "yui.syui.ai" {
let str = post_game_user::post_request(col, user_name, user_did, user_handle, aiten, limit, chara, lv, exp, hp, rank, mode, attach, critical, critical_d);
println!("{}", str.await);
Ok(())
} else {
Err(Box::new(std::io::Error::new(std::io::ErrorKind::PermissionDenied, "Not authorized")))
}
}
fn game_user(c: &Context) {
refresh(c);
tokio::runtime::Runtime::new()
.unwrap()
.block_on(async {
if let Err(e) = c_game_user(c).await {
eprintln!("Error: {}", e);
}
});
}
async fn c_game_login(c: &Context) -> Result<(), Box<dyn std::error::Error>> {
let col = c.string_flag("col").unwrap_or_else(|_| "ai.syui.game.login".to_string());
let user_name = c.string_flag("username").unwrap_or_else(|_| "syui".to_string());
let account = "at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game.user/".to_string() + &user_name;
let login = c.bool_flag("login");
if data_toml(&"handle") == "yui.syui.ai" {
let str = post_game_login::post_request(col, user_name, login, account);
println!("{}", str.await);
Ok(())
} else {
Err(Box::new(std::io::Error::new(std::io::ErrorKind::PermissionDenied, "Not authorized")))
}
}
fn game_login(c: &Context) {
refresh(c);
tokio::runtime::Runtime::new()
.unwrap()
.block_on(async {
if let Err(e) = c_game_login(c).await {
eprintln!("Error: {}", e);
}
});
}
fn repost(c: &Context) {
refresh(c);
let m = c.args[0].to_string();
@@ -436,6 +831,7 @@ fn mention(c: &Context) {
let h = async {
let str = profile::get_request(m.to_string()).await;
let profile: ProfileIdentityResolve = serde_json::from_str(&str).unwrap();
let col = c.string_flag("col").unwrap_or_else(|_| "app.bsky.feed.post".to_string());
let udid = profile.did;
let handle = m.to_string();
let at = "@".to_owned() + &handle;
@@ -443,6 +839,7 @@ fn mention(c: &Context) {
let s = 0;
if let Ok(post) = c.string_flag("post") {
let str = mention::post_request(
col,
post.to_string(),
at.to_string(),
udid.to_string(),
@@ -561,11 +958,13 @@ fn reply_og(c: &Context) {
let link = c.string_flag("link").unwrap();
let cid = c.string_flag("cid").unwrap();
let uri = c.string_flag("uri").unwrap();
let cid_root = c.string_flag("cid-root").unwrap();
let uri_root = c.string_flag("uri-root").unwrap();
let title = c.string_flag("title").unwrap();
let desc = c.string_flag("description").unwrap();
let img = c.string_flag("img").unwrap();
let h = async {
let str = reply_og::post_request(m, link, cid, uri, img, title, desc);
let str = reply_og::post_request(m, link, cid, uri, cid_root, uri_root, img, title, desc);
println!("{}", str.await);
};
let res = tokio::runtime::Runtime::new().unwrap().block_on(h);

View File

@@ -5,13 +5,13 @@ use crate::url;
use iso8601_timestamp::Timestamp;
use serde_json::json;
pub async fn post_request(text: String, at: String, udid: String, s: i32, e: i32) -> String {
pub async fn post_request(col: String, text: String, at: String, udid: String, s: i32, e: i32) -> String {
let token = data_refresh(&"access");
let did = data_toml(&"did");
let handle = data_toml(&"handle");
let url = url(&"record_create");
let col = "app.bsky.feed.post".to_string();
//let col = "app.bsky.feed.post".to_string();
let d = Timestamp::now_utc();
let d = d.to_string();
@@ -22,7 +22,7 @@ pub async fn post_request(text: String, at: String, udid: String, s: i32, e: i32
"collection": col.to_string(),
"record": {
"text": at.to_string() + &" ".to_string() + &text.to_string(),
"$type": "app.bsky.feed.post",
"$type": col.to_string(),
"createdAt": d.to_string(),
"facets": [
{

View File

@@ -33,7 +33,7 @@ pub async fn post_request(prompt: String) -> String {
";
let post = Some(json!({
"model": "gpt-3.5-turbo",
"model": "gpt-4o-mini",
"messages": [
{"role": "system", "content": &setting.to_string()},
{"role": "user", "content": &prompt.to_string()},

View File

@@ -12,10 +12,17 @@ pub async fn post_request() -> String {
.header("Authorization", "Bearer ".to_owned() + &refresh)
.send()
.await
.unwrap()
.text()
.await
.unwrap();
return res;
let status_ref = res.error_for_status_ref();
match status_ref {
Ok(_) => {
return res.text().await.unwrap();
}
Err(_e) => {
let e = "err".to_string();
return e;
}
}
}

View File

@@ -10,6 +10,8 @@ pub async fn post_request(
link: String,
cid: String,
uri: String,
cid_root: String,
uri_root: String,
img: String,
title: String,
description: String,
@@ -49,8 +51,8 @@ pub async fn post_request(
},
"reply": {
"root": {
"cid": cid.to_string(),
"uri": uri.to_string()
"cid": cid_root.to_string(),
"uri": uri_root.to_string()
},
"parent": {
"cid": cid.to_string(),

View File

@@ -8,11 +8,15 @@ case $OSTYPE in
;;
esac
d=${0:a:h}
source $d/env
source $d/env.zsh
source $d/refresh.zsh
source $d/token.zsh
source $d/reply.zsh
source $d/notify.zsh
source $d/notify_cid.zsh
source $d/cron.zsh
source $d/feed.zsh
case $1 in
refresh|r)
@@ -27,4 +31,13 @@ case $1 in
notify|n)
notify
;;
cron|c)
cron
;;
cid)
cid
;;
feed)
feed
;;
esac

7
test/cron.zsh Normal file
View File

@@ -0,0 +1,7 @@
function cron() {
t=`docker ps |grep aios|grep R`
if [ -z "$t" ];then
exit
fi
docker compose up -d
}

View File

@@ -1,3 +1,4 @@
#!/bin/bash
#!/bin/zsh
exec "$@"
#ai l $HANDLE -p $PASSWORD -s $HOST
ai bot -a $ADMIN

View File

@@ -1,34 +0,0 @@
cfg=~/.config/ai/test.json
if [ ! -f $cfg ] || ! cat $cfg|jq . || [ "`cat $cfg|jq .host`" = "null" ] || [ -z "`cat $cfg`" ];then
mkdir -p ~/.config/ai
echo server:
read host
echo password:
read pass
echo handle:
read handle
echo "{ \"host\":\"$host\", \"password\":\"$pass\", \"handle\":\"$handle\" }" >> $cfg
fi
host=`cat $cfg|jq -r .host`
handle=`cat $cfg|jq -r .handle`
pass=`cat $cfg|jq -r .password`
date=`date --iso-8601=seconds`
if [ ! -f $cfg.t ];then
$d/token.zsh
fi
if [ -f $cfg.t ];then
token=`cat $cfg.t|jq -r .accessJwt`
refresh=`cat $cfg.t|jq -r .refreshJwt`
did=`cat $cfg.t|jq -r .did`
fi
if [ ! -d $d/json ];then
mkdir -p $d/json
fi

18
test/env.zsh Normal file
View File

@@ -0,0 +1,18 @@
cfg=~/.config/ai/test.json
if [ -f $cfg ];then
host=`cat $cfg|jq -r .host`
handle=`cat $cfg|jq -r .handle`
pass=`cat $cfg|jq -r .password`
date=`date --iso-8601=seconds`
fi
if [ -f $cfg.t ];then
token=`cat $cfg.t|jq -r .accessJwt`
refresh=`cat $cfg.t|jq -r .refreshJwt`
did=`cat $cfg.t|jq -r .did`
fi
if [ ! -d $d/json ];then
mkdir -p $d/json
fi

5
test/feed.zsh Normal file
View File

@@ -0,0 +1,5 @@
function feed(){
token=`cat ~/.config/ai/token.json|jq -r .accessJwt`
url=at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.generator/cmd
curl -sL "https://public.api.bsky.app/xrpc/app.bsky.feed.getFeed?feed=$url" -H "Authorization: Bearer $token"
}

16
test/notify_cid.zsh Normal file
View File

@@ -0,0 +1,16 @@
function cid(){
dd=${d:h}
ai=$dd/target/debug/ai
txt=$dd/.config/ai/txt
f=$txt/notify_cid
if [ ! -f $ai ];then
cd $dd
cargo build
fi
if [ ! -d $txt ];then
mkdir -p $txt
fi
$ai n|jq -r ".[]|.[]?.cid" >> $f.txt
cp -rf $f.txt ${f}_run.txt
}

View File

@@ -1,4 +1,16 @@
function token() {
mkdir -p ~/.config/ai
echo server:
read host
echo password:
read pass
echo handle:
read handle
echo "{ \"host\":\"$host\", \"password\":\"$pass\", \"handle\":\"$handle\" }" >> $cfg
url=https://$host/xrpc/com.atproto.server.createSession
j=`curl -sL -X POST -H "Content-Type: application/json" -d "{\"identifier\":\"$handle\",\"password\":\"$pass\"}" $url`
echo $j