Compare commits

...

12 Commits

Author SHA1 Message Date
8cd519fe75 Don't include git history in package whoops 2024-07-02 15:20:57 +10:00
b1cb700ef7 Lemmy finally fixed auth tokens to not be in the fucking query params 2024-07-02 14:51:50 +10:00
ba29b1491d pretty.sh uses consistent naming now. Also finally did following command to show communities you are subscribed to. 2023-11-26 18:27:03 +11:00
b3185b2d25 Having a default account setter is handy, instead of having to mod the creds file constantly. 2023-11-26 17:45:42 +11:00
261f125761 Probably should version bump it 2023-10-13 20:59:34 +11:00
e9ed7b3e11 jq now gets upset if passed an empty argument (which is, in fact, distinct to not being passed an argument\!) 2023-10-13 20:57:42 +11:00
07950c0be7 can create communities at least now, and delete them, but that's not tested. Pagination next, then I'll do options stuff so you can actually add descriptions and images. 2023-09-20 04:26:15 +10:00
840ec2723b oh yeah I figured out what that was a while ago. I guess I should have just looked at the name lol 2023-07-29 19:12:35 +10:00
c0ab52f1c3 Fixed a bunch of annoying backslashes. 2023-07-02 19:28:33 +10:00
eb656567cf haha should take out that reference line 2023-06-19 02:08:03 +10:00
92fb247756 maybe can process applications now, I haven't tested it yet 2023-06-19 02:06:49 +10:00
b31c474ff0 Can use http without ssl now. I use it internally for my instance. Maybe I'll also allow ignoring specific SSL errors, maybe some passthrough to curl. 2023-06-19 00:47:48 +10:00
11 changed files with 86 additions and 46 deletions

View File

@@ -2,20 +2,21 @@
#Well, it seems to work now.
pkgname=clemmy
pkgver=0.1.2
pkgrel=1
pkgver=0.2.0
pkgrel=2
pkgdesc='A pure bash client for lemmy, with multiaccount support.'
arch=('any')
url='http://precious.harpy.faith/Zergling_man/clemmy'
license=('GPL' 'custom:plusnigger.autism.exposed')
depends=('curl' 'jq')
makedepends=('git')
source=('git+http://precious.harpy.faith/Zergling_man/clemmy.git')
sha256sums=('SKIP') #Don't know how to use this on a repo.
package() {
cd ${pkgname}
install -d ${pkgdir}/usr/bin ${pkgdir}/opt/clemmy
rm PKGBUILD README.txt
rm -rf README.txt .git
cp -r . ${pkgdir}/opt/clemmy
ln -s /opt/clemmy/clemmy.sh ${pkgdir}/usr/bin/clemmy
chmod +x ${pkgdir}/opt/clemmy/clemmy.sh

9
api.sh
View File

@@ -1,8 +1,7 @@
baseurl(){ echo "https://$INSTANCE/api/v3/"; } # This needs to be a function so updates to INSTANCE affect it. This is a very old bug lmao
baseurl(){ if [ -z $INSEC ]; then sec=s; fi; echo "http$sec://$INSTANCE/api/v3/"; } # This needs to be a function so updates to INSTANCE affect it. This is a very old bug lmao
#Generics
get(){ curl -s "$(baseurl)$1?${*:3}" | jq "$2"; }
getauth(){ get "$1" "$2" "auth=$TOKE&${*:3}"; }
post(){ curl -s "$(baseurl)$1" --json "$(echo ${*:2} | jq .+{\"auth\":\"$TOKE\"})"; }
get(){ curl -sH "Cookie:jwt=$TOKE" "$(baseurl)$1?${*:3}" | jq "${2:-.}"; }
post(){ curl -sH "Cookie:jwt=$TOKE" "$(baseurl)$1" --json "${*:2}"; }
# I'm just gonna clone this thing rather than try to palm the -X PUT into post. I can fix it later.
put(){ curl -sX PUT "$(baseurl)$1" --json "$(echo ${*:2} | jq .+{\"auth\":\"$TOKE\"})"; }
put(){ curl -sX PUT "$(baseurl)$1" --json "$(echo ${*:2} | jq '.+{"auth":"'$TOKE'"}')"; }

View File

@@ -9,10 +9,10 @@ source $imps/creds.sh
source $imps/utils.sh
while getopts "a:hi:v" o;do case "${o}" in
a) INSTANCE=${insts[$OPTARG]}; TOKE=${tokes[$OPTARG]};;
a) select_account $OPTARG;;
i) INSTANCE=$OPTARG;;
h) echo $actions; exit;;
v) echo 0.1.2; exit;;
v) echo 0.1.7; exit;;
esac done
shift $((OPTIND-1))

View File

@@ -2,8 +2,9 @@
whoami(){ echo $INSTANCE $TOKE; }
login()
{
post "user/login" "{\"username_or_email\":\"$1\",\"password\":\"$2\"}"
post "user/login" '{"username_or_email":"'$1'","password":"'$2'"}'
}
register()
{
get "site" ".site_view.site | .open_registration,.require_email_verification,.require_application,.application_question" | jq -r . | read reg em app appq
@@ -17,7 +18,7 @@ register()
if [ ! reg_pw == reg_pw2 ]; then echo "passwords don't match (continuing anyway, expect failure later though)"; fi
namedget reg_email "Email address $em"
if [ $app == true ]; then namedget reg_appa "Application question: $appq"; fi
result="$(post "user/register" "{\"username\":\"$reg_username\",\"password\":\"$reg_pw\",\"password_verify\":\"$reg_pw2\",\"email\":\"$reg_email\",\"answer\":\"$reg_appa\"}")"
result="$(post "user/register" '{"username":"'$reg_username'","password":"'$reg_pw'","password_verify":"'$reg_pw2'","email":"'$reg_email'","answer":"'$reg_appa'"}')"
if [ ! $(jq .error <<< "$result") == "captcha_incorrect" ]; then
jq <<< "$result"; exit;
fi
@@ -26,5 +27,5 @@ register()
jq -r '.wav' <<< "$a" | base64 -d > "captcha.wav"
jq -r '.png' <<< "$a" | base64 -d > "captcha.png"
namedget reg_captcha "Please open captcha.wav and captcha.png and input the text - in that order, no spaces"
post "user/register" "{\"username\":\"$reg_username\",\"password\":\"$reg_pw\",\"password_verify\":\"$reg_pw2\",\"email\":\"$reg_email\",\"answer\":\"$reg_appa\",\"captcha_uuid\":\"$reg_uuid\",\"captcha_answer\":\"$reg_captcha\"}"
post "user/register" '{"username":"'$reg_username'","password":"'$reg_pw'","password_verify":"'$reg_pw2'","email":"'$reg_email'","answer":"'$reg_appa'","captcha_uuid":"'$reg_uuid'","captcha_answer":"'$reg_captcha'"}'
}

26
commands/admin.sh Normal file
View File

@@ -0,0 +1,26 @@
pendcount()
{
get "admin/registration_application/count" ".registration_applications"
}
pending()
{
applications=$(get "admin/registration_application/list" ".registration_applications" "unread_only=true")
i=0
app=$(jq ".[$i] // empty" <<< "$applications")
while [ -n "$app" ]; do
appid=$(jq -r .registration_application.id <<< "$app")
jq '.registration_application.id, (.creator | .name,.published,.bio,"bot: "+.bot_account,"matrix: "+.matrix_user_id,.avatar,.banner), "captcha: "+.registration_application.answer' <<< "$app"
ans= # Better make sure this resets lol
while [ ! ans = 'y' -a ! ans = 'n' -a ! ans = 's' ]; do
namedget ans "Accept? (y)es (n)o (s)kip"
done
case $ans in
y) put "admin/registration_application/approve" '{"id":'$appid',"approve":true}';;
n) namedget rejected "Why not?" true; put "admin/registration_application/approve" '{"id":'$appid',"deny_reason":"'$rejected'","approve":false}';;
esac
done
}
addadmin(){ echo "stub"; }
remadmin(){ echo "stub"; }

View File

@@ -9,4 +9,4 @@ source $imps/commands/posts.sh
source $imps/commands/admin.sh
#Misc
deref(){ getauth "resolve_object" "" "q=$*"; }
deref(){ get "resolve_object" "" "q=$*"; }

View File

@@ -1,4 +1,10 @@
#Community hoardan
follow(){ post "community/follow" "{\"community_id\":$1,\"follow\":true}"; }
unfollow(){ post "community/follow" "{\"community_id\":$1,\"follow\":false}"; }
following(){ echo "use <home> instead"; } # Maybe this will help.
follow(){ post "community/follow" '{"community_id":'$1',"follow":true}'; }
unfollow(){ post "community/follow" '{"community_id":'$1',"follow":false}'; }
following(){ get "community/list" ".communities | $communities_jq" "type_=Subscribed"; } # Alright it's time
comcreate(){ namedget desc "The community's display name (can be edited later)"; post "community" '{"name":"'$1'","title":"'"$desc"'"}'; }
comedit(){ echo "stub"; }
comdelete(){ namedget confirm "are you sure? (y/n)"; if [ confirm == "y" ]; then post "community/delete" '{"community_id":"'$1'","deleted":true}'; fi; }
addmod(){ echo "stub"; }
remmod(){ echo "stub"; }

View File

@@ -1,6 +1,7 @@
#Lurkan
notifs(){ getauth "user/replies" ".replies | reverse | $notifs"; }
notifs2(){ getauth "user/mention" ".mentions | reverse | $notifs"; }
home(){ getauth "post/list" ".posts | $posts" "type_=Subscribed"; }
notifs(){ get "user/replies" ".replies | reverse | $notifs_jq"; }
notifs2(){ echo "use mentions instead"; }
mentions(){ get "user/mention" ".mentions | reverse | $notifs_jq"; }
home(){ get "post/list" ".posts | $posts_jq" "type_=Subscribed"; }
#This has to get complex now -.-
comments(){ getauth "post" "(.post_view | $showpost)" "id=$1"; getauth "comment/list" "(.comments | reverse | $comments_view)" "post_id=$1&sort=New"; }
comments(){ get "post" "(.post_view | $full_post_jq)" "id=$1"; get "comment/list" "(.comments | reverse | $comments_jq)" "post_id=$1&sort=New"; }

View File

@@ -1,7 +1,7 @@
#Post hoardan
save(){ put "post/save" "{\"post_id\":$1,\"save\":true}"; }
unsave(){ put "post/save" "{\"post_id\":$1,\"save\":false}"; }
load(){ getauth "post/list" ".posts | .[] | $postsummary" "type_=All&saved_only=true"; }
save(){ put "post/save" '{"post_id":'$1',"save":true}'; }
unsave(){ put "post/save" '{"post_id":'$1',"save":false}'; }
load(){ get "post/list" ".posts | .[] | $short_post_jq" "type_=All&saved_only=true"; }
#Postan
freepost(){ getbody; post "post" "{\"community_id\":$1,\"name\":\"${*:2}\",\"body\":\"$body\"}"; }
shitpost(){ getbody; postid=$1; parentid=$2; post "comment" "{\"post_id\":$postid,\"parent_id\":$parentid,\"content\":\"$body\"}"; }
freepost(){ getbody; post "post" '{"community_id":'$1',"name":"'${*:2}'","body":"'$body'"}'; }
shitpost(){ getbody; postid=$1; parentid=$2; if [ -z $parentid ]; then parentid=null; fi; post "comment" '{"post_id":'$postid',"parent_id":'$parentid',"content":"'$body'"}'; }

View File

@@ -11,11 +11,16 @@ if [ ! -f ~/.config/clemmy/accounts.csv ]; then
exit
fi
accs=$(cat ~/.config/clemmy/accounts.csv)
touch ~/.config/clemmy/default_account
accsr=$(cat ~/.config/clemmy/accounts.csv)
i=0
for line in ${accs[*]}; do
IFS=, read insts[$i] tokes[$i] <<< $line
for line in ${accsr[*]}; do
accs[$i]="$line"
i=$((i+1))
done
INSTANCE=${insts[0]}
TOKE=${tokes[0]}
select_account(){ IFS=, read INSTANCE TOKE INSEC <<< "${accs[$1]}"; }
defaultacc(){ echo -n $1 > ~/.config/clemmy/default_account; }
select_account $(cat ~/.config/clemmy/default_account)

View File

@@ -1,23 +1,24 @@
# Please don't abuse jq like this
showpost='(.post | (.id | tostring)+" "+(.name | tostring)),
full_post_jq='(.post | (.id | tostring)+" "+(.name | tostring)),
(.post.url)+", "+(.creator.display_name // .creator.name)+":",
((.comment // .post) | .published,
(.body // .content)),
""'
postsummary='(.post | (.id | tostring)+" "+(.name | tostring)),
(.body // .content))'
short_post_jq='(.post | (.id | tostring)+" "+(.name | tostring)),
(.post.url)+", "+(.creator.display_name // .creator.name)+":",
((.comment // .post) | .published),
""'
showcomment='(.comment | .path[2:])+", "+(.creator.display_name // .creator.name)+":",
((.comment // .post) | .published)'
comment_jq='(.comment | .path[2:])+", "+(.creator.display_name // .creator.name)+":",
((.comment // .post) | .published,
(.body // .content)),
""'
(.body // .content))'
#Split this out because I specifically do want to include post IDs in some places. Or rather, I only don't want to include them on the comments view.
notif='(.comment | (.parent_id | tostring)+"->"+(.id | tostring))+" ("+(.post | (.id | tostring))+"), "+(.creator.display_name // .creator.name)+":",
notif_jq='(.comment | (.parent_id | tostring)+"->"+(.id | tostring))+" ("+(.post | (.id | tostring))+"), "+(.creator.display_name // .creator.name)+":",
((.comment // .post) | .published,
(.body // .content)),
""'
(.body // .content))'
community_jq='(.community | (.id | tostring)+" "+.actor_id,.description),
.subscribed,
(.counts | [.subscribers,.posts,.comments,.users_active_week] | join(" "))'
comments_view=".[] | $showcomment"
posts=".[] | $showpost"
notifs=".[] | $notif"
multi_jq(){ echo '.[] | '"$1"',""'; }
comments_jq=$(multi_jq "$comment_jq")
posts_jq=$(multi_jq "$full_post_jq")
notifs_jq=$(multi_jq "$notif_jq")
communities_jq=$(multi_jq "$community_jq")