ref: 454703e94b801ebe25b61f964d52ad4fbb7bd3d9
parent: 22b180670881db7c4850e7fd9786ffcb70498057
author: Julien Blanchard <[email protected]>
date: Fri Apr 7 07:11:58 EDT 2023
Some formatting
--- /dev/null
+++ b/.clang-format
@@ -1,0 +1,11 @@
+BasedOnStyle: LLVM
+IndentWidth: 4
+TabWidth: 4
+UseTab: Always
+AllowShortFunctionsOnASingleLine: InlineOnly
+AlwaysBreakAfterReturnType: TopLevelDefinitions
+BreakBeforeBraces: Allman
+SpaceBeforeParens: false
+PointerAlignment: Right
+AlignTrailingComments: true
+SortIncludes: false
\ No newline at end of file
--- a/http.c
+++ b/http.c
@@ -2,11 +2,10 @@
#include <libc.h>
#include <stdio.h>
#include <json.h>
-#include <bio.h>
#include "masto9.h"
-#define BOUNDARY "---------------------------328018649918767126933410246249"
+#define BOUNDARY "--------HJBOUNDARY"
int
webclone(int *c)
@@ -16,7 +15,7 @@
if((fd = open("/mnt/web/clone", ORDWR)) < 0)
sysfatal("couldn't open %s: %r", buf);
- if((n = read(fd, buf, sizeof buf-1)) < 0)
+ if((n = read(fd, buf, sizeof buf - 1)) < 0)
sysfatal("reading clone: %r");
if(n == 0)
sysfatal("short read on clone");
@@ -29,34 +28,34 @@
char *
httpget(char *token, char *url)
{
- int ctlfd, bodyfd, conn, n;
+ int ctlfd, bodyfd, conn, n;
char buf[1024];
char body[TLBUFSIZE];
- char *bearer_token;
+ char *bearer_token;
- ctlfd = webclone(&conn);
+ ctlfd = webclone(&conn);
snprint(buf, sizeof buf, "url %s", url);
if(write(ctlfd, buf, n = strlen(buf)) != n)
sysfatal("post: write: %r");
- /* Request */
- bearer_token = concat("Authorization: Bearer ", token);
- if (fprint(ctlfd, "headers %s", bearer_token) <= 0)
+ /* Request */
+ bearer_token = concat("Authorization: Bearer ", token);
+ if(fprint(ctlfd, "headers %s", bearer_token) <= 0)
sysfatal("write ctl failed 'headers'");
snprint(buf, sizeof(buf), "/mnt/web/%d/body", conn);
- /* Response */
- if ((bodyfd = open(buf, OREAD)) < 0)
+ /* Response */
+ if((bodyfd = open(buf, OREAD)) < 0)
sysfatal("open %s: %r", buf);
- if (readn(bodyfd, body, TLBUFSIZE) <= 0)
+ if(readn(bodyfd, body, TLBUFSIZE) <= 0)
sysfatal("readn: %r");
close(bodyfd);
close(ctlfd);
- return body;
+ return body;
}
char *
@@ -64,54 +63,61 @@
{
int n, ctlfd, bodyfd, conn;
char buf[TOOTBUFSIZE];
- char *bearer_token;
+ char *bearer_token;
- ctlfd = webclone(&conn);
+ ctlfd = webclone(&conn);
snprint(buf, sizeof buf, "url %s", url);
if(write(ctlfd, buf, n = strlen(buf)) != n)
sysfatal("post: write: %r");
- /* Request */
- bearer_token = concat("Authorization: Bearer ", token);
- if (fprint(ctlfd, "headers %s", bearer_token) <= 0)
+ /* Request */
+ bearer_token = concat("Authorization: Bearer ", token);
+ if(fprint(ctlfd, "headers %s", bearer_token) <= 0)
sysfatal("write ctl failed 'headers'");
snprint(buf, TOOTBUFSIZE, "/mnt/web/%d/postbody", conn);
bodyfd = open(buf, OWRITE);
- if (bodyfd < 0)
+ if(bodyfd < 0)
sysfatal("open bodyfd %s: %r", buf);
- if (write(bodyfd, text, strlen(text)) < 0)
- sysfatal("write: %r");
+ if(write(bodyfd, text, strlen(text)) < 0)
+ sysfatal("write: %r");
close(bodyfd);
- /* Response */
- snprint(buf, TOOTBUFSIZE, "/mnt/web/%d/body", conn);
+ /* Response */
+ snprint(buf, TOOTBUFSIZE, "/mnt/web/%d/body", conn);
if((bodyfd = open(buf, OREAD)) < 0)
sysfatal("post: opening body: %r");
- if (readn(bodyfd, buf, TOOTBUFSIZE) <= 0)
+ if(readn(bodyfd, buf, TOOTBUFSIZE) <= 0)
sysfatal("readn: %r");
close(bodyfd);
close(ctlfd);
- return buf;
+ return buf;
}
-char
-*mime_type(char *filename)
+char *
+mime_type(char *filename)
{
- char *ext = strrchr(filename, '.');
- if (!ext) return "application/octet-stream";
- if (strcmp(ext, ".jpg") == 0 || strcmp(ext, ".jpeg") == 0) return "image/jpeg";
- if (strcmp(ext, ".gif") == 0) return "image/gif";
- if (strcmp(ext, ".png") == 0) return "image/png";
- if (strcmp(ext, ".mp3") == 0) return "audio/mp3";
- if (strcmp(ext, ".mp4") == 0) return "video/mp4";
- if (strcmp(ext, ".webm") == 0) return "video/webm";
- return "application/octet-stream";
+ char *ext = strrchr(filename, '.');
+ if(!ext)
+ return "application/octet-stream";
+ if(strcmp(ext, ".jpg") == 0 || strcmp(ext, ".jpeg") == 0)
+ return "image/jpeg";
+ if(strcmp(ext, ".gif") == 0)
+ return "image/gif";
+ if(strcmp(ext, ".png") == 0)
+ return "image/png";
+ if(strcmp(ext, ".mp3") == 0)
+ return "audio/mp3";
+ if(strcmp(ext, ".mp4") == 0)
+ return "video/mp4";
+ if(strcmp(ext, ".webm") == 0)
+ return "video/webm";
+ return "application/octet-stream";
}
char *
@@ -119,63 +125,65 @@
{
char buf[BUFSIZE];
int n, conn, ctlfd, bodyfd;
- char *bearer_token, *multipart_header;
- FileAttachment *fa;
+ char *bearer_token, *multipart_header;
+ FileAttachment *fa;
ctlfd = open("/mnt/web/clone", ORDWR);
- if (ctlfd < 0)
+ if(ctlfd < 0)
sysfatal("open: %r");
n = read(ctlfd, buf, sizeof(buf));
- if (n < 0)
+ if(n < 0)
sysfatal("read: %r");
buf[n] = '\0';
conn = atoi(buf);
- fa = readfile(filepath);
+ fa = readfile(filepath);
snprint(buf, sizeof buf, "url %s", url);
if(write(ctlfd, buf, n = strlen(buf)) != n)
sysfatal("post: write: %r");
- bearer_token = esmprint("Authorization: Bearer %s", token);
+ bearer_token = esmprint("Authorization: Bearer %s", token);
snprint(buf, sizeof buf, "headers %s", bearer_token);
if(write(ctlfd, buf, n = strlen(buf)) != n)
sysfatal("post: write headers: %r");
- snprint(buf, sizeof buf, "contenttype multipart/form-data; boundary=%s", BOUNDARY);
+ snprint(buf, sizeof buf, "contenttype multipart/form-data; boundary=%s",
+ BOUNDARY);
if(write(ctlfd, buf, n = strlen(buf)) != n)
sysfatal("post: write contenttype: %r");
- snprint(buf, sizeof buf, "/mnt/web/%d/postbody", conn);
- if ((bodyfd = open(buf, OWRITE)) < 0)
+ snprint(buf, sizeof buf, "/mnt/web/%d/postbody", conn);
+ if((bodyfd = open(buf, OWRITE)) < 0)
sysfatal("open bodyfd %s: %r", buf);
- /* Write multipart body */
- write(bodyfd, "--", 2);
- write(bodyfd, BOUNDARY, strlen(BOUNDARY));
- write(bodyfd, "\r\n", 2);
+ /* Write multipart body */
+ write(bodyfd, "--", 2);
+ write(bodyfd, BOUNDARY, strlen(BOUNDARY));
+ write(bodyfd, "\r\n", 2);
- multipart_header = esmprint("Content-Disposition: form-data; \
+ multipart_header = esmprint("Content-Disposition: form-data; \
name=\"file\"; \
- filename=\"blob\"\r\nContent-Type: %s\r\n\r\n", mime_type(basename(filepath)));
- write(bodyfd, multipart_header, strlen(multipart_header));
+ filename=\"blob\"\r\nContent-Type: %s\r\n\r\n",
+ mime_type(basename(filepath)));
+ write(bodyfd, multipart_header, strlen(multipart_header));
- write(bodyfd, fa->buf, fa->size);
+ write(bodyfd, fa->buf, fa->size);
- write(bodyfd, "\r\n", 2);
- write(bodyfd, "--", 2);
- write(bodyfd, BOUNDARY, strlen(BOUNDARY));
- write(bodyfd, "--\r\n", 4);
+ write(bodyfd, "\r\n", 2);
+ write(bodyfd, "--", 2);
+ write(bodyfd, BOUNDARY, strlen(BOUNDARY));
+ write(bodyfd, "--\r\n", 4);
- close(bodyfd);
+ close(bodyfd);
/* Response */
snprint(buf, sizeof buf, "/mnt/web/%d/body", conn);
if((bodyfd = open(buf, OREAD)) < 0)
sysfatal("post: opening body: %r");
- if (readn(bodyfd, buf, BUFSIZE) <= 0)
+ if(readn(bodyfd, buf, BUFSIZE) <= 0)
sysfatal("readn: %r");
close(bodyfd);
close(ctlfd);
- return buf;
+ return buf;
}
--- a/masto9.c
+++ b/masto9.c
@@ -10,9 +10,10 @@
UserPasswd *
getcredentials(char *host)
{
- UserPasswd* p;
+ UserPasswd *p;
- p = auth_getuserpasswd(auth_getkey, "proto=pass service=mastodon server=%s", host);
+ p = auth_getuserpasswd(auth_getkey, "proto=pass service=mastodon server=%s",
+ host);
if(p == nil)
sysfatal("masto9: failed to retrieve token: %r");
@@ -22,21 +23,27 @@
void
gethome(char *token, char *host, Toot toots[], char *after)
{
- JSON *obj, *id, *content, *reblog_content, *account, *reblog_account, *handle, *reblog_handle, *display_name, *avatar, *reblog, *media_attachments, *type, *preview_url, *remote_url;
+ JSON *obj, *id, *content, *reblog_content, *account, *reblog_account,
+ *handle, *reblog_handle, *display_name, *avatar, *reblog,
+ *media_attachments, *type, *preview_url, *remote_url;
char *endpoint;
int i = 0;
- if(after != nil) {
- endpoint = esmprint("timelines/home?max_id=%s", after);
- } else {
- endpoint = "timelines/home";
- }
+ if(after != nil)
+ {
+ endpoint = esmprint("timelines/home?max_id=%s", after);
+ }
+ else
+ {
+ endpoint = "timelines/home";
+ }
- obj = mastodonget(token, host, endpoint);
- if (obj->t != JSONArray)
+ obj = mastodonget(token, host, endpoint);
+ if(obj->t != JSONArray)
sysfatal("jsonparse: not an array");
- for(JSONEl *p = obj->first; p != nil; p = p->next) {
+ for(JSONEl *p = obj->first; p != nil; p = p->next)
+ {
JSON *toot_json = p->val;
id = getjsonkey(toot_json, "id");
@@ -51,10 +58,13 @@
Toot *toot = emalloc(sizeof(Toot));
toot->id = estrdup((char *)id->s);
- if(reblog->s == nil) {
+ if(reblog->s == nil)
+ {
toot->reblogged = 0;
toot->content = estrdup((char *)content->s);
- } else {
+ }
+ else
+ {
reblog_content = getjsonkey(reblog, "content");
reblog_account = getjsonkey(reblog, "account");
reblog_handle = getjsonkey(reblog_account, "acct");
@@ -70,9 +80,11 @@
toot->avatar_url = estrdup((char *)avatar->s);
toot->attachments_count = 0;
- if(media_attachments->s != nil) {
+ if(media_attachments->s != nil)
+ {
int j = 0;
- for(JSONEl *at = media_attachments->first; at != nil; at = at->next) {
+ for(JSONEl *at = media_attachments->first; at != nil; at = at->next)
+ {
JSON *attachment_json = at->val;
Attachment *attachment = emalloc(sizeof(Attachment));
type = getjsonkey(attachment_json, "type");
@@ -80,11 +92,14 @@
remote_url = getjsonkey(attachment_json, "remote_url");
attachment->type = estrdup((char *)type->s);
- if(strcmp(type->s, "image") == 0){
- attachment->url = estrdup((char *)preview_url->s);
- } else {
- attachment->url = estrdup((char *)remote_url->s);
- }
+ if(strcmp(type->s, "image") == 0)
+ {
+ attachment->url = estrdup((char *)preview_url->s);
+ }
+ else
+ {
+ attachment->url = estrdup((char *)remote_url->s);
+ }
toot->media_attachments[j] = attachment;
toot->attachments_count++;
@@ -103,33 +118,38 @@
JSON *obj, *id, *content, *display_name, *handle, *type, *account, *status;
int i = 0;
- obj = mastodonget(token, host, "notifications");
+ obj = mastodonget(token, host, "notifications?types[]=mention");
- if (obj->t != JSONArray)
+ if(obj->t != JSONArray)
sysfatal("jsonparse: not an array");
- for(JSONEl *p = obj->first; p != nil; p = p->next) {
+ for(JSONEl *p = obj->first; p != nil; p = p->next)
+ {
JSON *notif_json = p->val;
id = getjsonkey(notif_json, "id");
type = getjsonkey(notif_json, "type");
- if(strcmp(type->s, "follow") != 0) {
- status = getjsonkey(notif_json, "status");
- content = getjsonkey(status, "content");
- } else {
- content = jsonparse("");
- }
- account = getjsonkey(notif_json, "account");
- display_name = getjsonkey(account, "display_name");
- handle = getjsonkey(account, "acct");
+ if(strcmp(type->s, "follow") != 0)
+ {
+ status = getjsonkey(notif_json, "status");
+ content = getjsonkey(status, "content");
+ }
+ else
+ {
+ content = jsonparse("");
+ }
+ account = getjsonkey(notif_json, "account");
+ display_name = getjsonkey(account, "display_name");
+ handle = getjsonkey(account, "acct");
Notification *notif = emalloc(sizeof(Notification));
notif->id = estrdup((char *)id->s);
- notif->type = estrdup((char *)type->s);
- if(strcmp(type->s, "follow") != 0) {
- notif->content = estrdup((char *)content->s);
- }
+ notif->type = estrdup((char *)type->s);
+ if(strcmp(type->s, "follow") != 0)
+ {
+ notif->content = estrdup((char *)content->s);
+ }
notif->display_name = estrdup((char *)display_name->s);
notif->handle = estrdup((char *)handle->s);
@@ -142,136 +162,148 @@
void
posttoot(char *token, char *host, char *text)
{
- char *url;
- url = esmprint("https://%s/api/v1/statuses", host);
+ char *url;
+ url = esmprint("https://%s/api/v1/statuses", host);
httppost(token, url, concat("status=", text));
- print("Posted:\n %s\n", text);
+ print("Posted:\n %s\n", text);
}
char *
tootauthor(char *token, char *host, char *id)
{
- JSON *obj, *account, *reblog;
- char *endpoint, *response;
+ JSON *obj, *account, *reblog;
+ char *endpoint, *response;
- endpoint = concat("statuses/", id);
+ endpoint = concat("statuses/", id);
obj = mastodonget(token, host, endpoint);
- reblog = getjsonkey(obj, "reblog");
- if(reblog->s != nil) {
- account = getjsonkey(reblog, "account");
- } else {
- account = getjsonkey(obj, "account");
- }
+ reblog = getjsonkey(obj, "reblog");
+ if(reblog->s != nil)
+ {
+ account = getjsonkey(reblog, "account");
+ }
+ else
+ {
+ account = getjsonkey(obj, "account");
+ }
- response = estrdup((char *)getjsonkey(account, "acct")->s);
+ response = estrdup((char *)getjsonkey(account, "acct")->s);
- free(account);
- free(reblog);
- free(obj);
+ free(account);
+ free(reblog);
+ free(obj);
- return response;
+ return response;
}
void
postattachment(char *token, char *host, char *text, char *filepath)
{
- JSON *obj, *id;
- char *url, *response, *body;
+ JSON *obj, *id;
+ char *url, *response, *body;
url = esmprint("https://%s/api/v1/media", host);
response = upload(token, url, filepath);
- obj = jsonparse(response);
- if (obj == nil)
+ obj = jsonparse(response);
+ if(obj == nil)
sysfatal("jsonparse: not json");
- print("%J\n", obj);
- id = getjsonkey(obj, "id");
+ print("%J\n", obj);
+ id = getjsonkey(obj, "id");
- url = esmprint("https://%s/api/v1/statuses", host);
+ url = esmprint("https://%s/api/v1/statuses", host);
- if (strlen(text) >0) {
- body = esmprint("status=%s&media_ids[]=%s", text, id->s);
- } else {
- body = esmprint("media_ids[]=%s", id->s);
- }
+ if(strlen(text) > 0)
+ {
+ body = esmprint("status=%s&media_ids[]=%s", text, id->s);
+ }
+ else
+ {
+ body = esmprint("media_ids[]=%s", id->s);
+ }
httppost(token, url, body);
- print("Posted toot\n");
+ print("Posted toot\n");
}
void
perform(char *token, char *host, char *id, char *action)
{
- char *url;
- url = esmprint("%s/api/v1/statuses/%s/%s", host, id, action);
- httppost(token, url, "");
+ char *url;
+ url = esmprint("%s/api/v1/statuses/%s/%s", host, id, action);
+ httppost(token, url, "");
}
void
boost(char *token, char *host, char *id)
{
- perform(token, host, id, "reblog");
- print("Boosted toot.");
+ perform(token, host, id, "reblog");
+ print("Boosted toot.");
}
void
unboost(char *token, char *host, char *id)
{
- perform(token, host, id, "unreblog");
- print("Unboosted toot.");
+ perform(token, host, id, "unreblog");
+ print("Unboosted toot.");
}
void
fav(char *token, char *host, char *id)
{
- perform(token, host, id, "favourite");
- print("Favorited toot.");
+ perform(token, host, id, "favourite");
+ print("Favorited toot.");
}
void
unfav(char *token, char *host, char *id)
{
- perform(token, host, id, "unfavourite");
- print("Unfavorited toot.");
+ perform(token, host, id, "unfavourite");
+ print("Unfavorited toot.");
}
void
reply(char *token, char *host, char *id)
{
- char *content;
- int fd, wait;
- char *s, *t, *u, *url;
- Biobuf body;
+ char *content;
+ int fd, wait;
+ char *s, *t, *u, *url;
+ Biobuf body;
- wait = 0;
- t = nil;
+ wait = 0;
+ t = nil;
- if(wait)
- close(open("/dev/text", OWRITE|OTRUNC|OCEXEC));
- if((fd = open("/dev/consctl", OWRITE|OCEXEC)) >= 0){
- write(fd, "holdon", 6);
- u = tootauthor(token, host, id);
- print("Reply to %s\n", u);
- Binit(&body, 0, OREAD);
- if((s = Brdstr(&body, 0, 1)) != nil)
- t = esmprint("%s", s);
- free(s);
- if(t != nil){
- url = esmprint("%s/api/v1/statuses", host);
- content = esmprint("in_reply_to_id=%s&status=@%s %s", id, u, t);
+ if(wait)
+ close(open("/dev/text", OWRITE | OTRUNC | OCEXEC));
+ if((fd = open("/dev/consctl", OWRITE | OCEXEC)) >= 0)
+ {
+ write(fd, "holdon", 6);
+ u = tootauthor(token, host, id);
+ print("Reply to %s\n", u);
+ Binit(&body, 0, OREAD);
+ if((s = Brdstr(&body, 0, 1)) != nil)
+ t = esmprint("%s", s);
+ free(s);
+ if(t != nil)
+ {
+ url = esmprint("%s/api/v1/statuses", host);
+ content = esmprint("in_reply_to_id=%s&status=@%s %s", id, u, t);
- httppost(token, url, content);
- print("\nReply sent.\n");
- free(t);
- }else{
- fprint(2, "%r\n");
- }
- close(fd);
- }else{
- fprint(2, "%r\n");
- }
+ httppost(token, url, content);
+ print("\nReply sent.\n");
+ free(t);
+ }
+ else
+ {
+ fprint(2, "%r\n");
+ }
+ close(fd);
+ }
+ else
+ {
+ fprint(2, "%r\n");
+ }
}
char *
@@ -282,7 +314,8 @@
if(pipe(wr) == -1 || pipe(rd) == -1)
sysfatal("pipe: %r");
- switch(fork()){
+ switch(fork())
+ {
case -1:
sysfatal("fork: %r");
break;
@@ -328,155 +361,201 @@
response = httpget(token, url);
obj = jsonparse(response);
- if (obj == nil)
+ if(obj == nil)
sysfatal("jsonparse: not json");
- return(obj);
+ return (obj);
}
void
usage(void)
{
- sysfatal("usage: masto9 url");
+ sysfatal("usage: masto9 url");
}
void
displaytoots(Toot toots[], char *server)
{
- Biobuf out;
- Binit(&out, 1, OWRITE);
+ Biobuf out;
+ Binit(&out, 1, OWRITE);
- for (int i=0;i<TOOTSCOUNT;i++) {
- Toot toot = toots[i];
- char *username;
+ for(int i = 0; i < TOOTSCOUNT; i++)
+ {
+ Toot toot = toots[i];
+ char *username;
- username = esmprint("%s (%s)", toot.display_name, toot.handle);
+ username = esmprint("%s (%s)", toot.display_name, toot.handle);
- Bprint(&out, "\n\n——————————\n");
- if(toot.reblogged == 1) {
- Bprint(&out, "⊙ %s retooted %s:\n", username, toot.reblogged_handle);
- } else {
- Bprint(&out, "⊙ %s:\n", username);
- }
- Bprint(&out, "\n%s", fmthtml(cleanup(toot.content)));
- if(toot.attachments_count>0) {
- for (int j=0;j<toot.attachments_count;j++) {
- Attachment *attachment = toot.media_attachments[j];
- Bprint(&out, "\n[%s] %s", attachment->type, attachment->url);
- }
- Bprint(&out, "\n");
- }
- Bprint(&out, "\nReply[%s] | Boost[%s] | Favorite[%s]", toot.id, toot.id, toot.id);
- }
- Bprint(&out, "\n\n\n⇒ Send the next line to load more");
- Bprint(&out, "\n6.out %s more %s\n\n", server, toots[19].id);
- Bflush(&out);
+ Bprint(&out, "\n\n——————————\n");
+ if(toot.reblogged == 1)
+ {
+ Bprint(&out, "⊙ %s retooted %s:\n", username,
+ toot.reblogged_handle);
+ }
+ else
+ {
+ Bprint(&out, "⊙ %s:\n", username);
+ }
+ Bprint(&out, "\n%s", fmthtml(cleanup(toot.content)));
+ if(toot.attachments_count > 0)
+ {
+ for(int j = 0; j < toot.attachments_count; j++)
+ {
+ Attachment *attachment = toot.media_attachments[j];
+ Bprint(&out, "\n[%s] %s", attachment->type, attachment->url);
+ }
+ Bprint(&out, "\n");
+ }
+ Bprint(&out, "\nReply[%s] | Boost[%s] | Favorite[%s]", toot.id, toot.id,
+ toot.id);
+ }
+ Bprint(&out, "\n\n\n⇒ Send the next line to load more");
+ Bprint(&out, "\n6.out %s more %s\n\n", server, toots[19].id);
+ Bflush(&out);
}
void
displaynotifications(Notification notifs[])
{
- Biobuf out;
- Binit(&out, 1, OWRITE);
+ Biobuf out;
+ Binit(&out, 1, OWRITE);
- for (int i=0;i<NOTIFSCOUNT;i++) {
- Notification notif = notifs[i];
- char *username;
+ for(int i = 0; i < NOTIFSCOUNT; i++)
+ {
+ Notification notif = notifs[i];
+ char *username;
- username = esmprint("%s (%s)", notif.display_name, notif.handle);
+ username = esmprint("%s (%s)", notif.display_name, notif.handle);
- if (strcmp(notif.type, "reblog") == 0) {
- Bprint(&out, "\n⊙ %s retooted\n %s", username, fmthtml(cleanup(notif.content)));
- } else if (strcmp(notif.type, "favourite") == 0) {
- Bprint(&out, "\n⊙ %s favorited\n %s", username, fmthtml(cleanup(notif.content)));
- } else if (strcmp(notif.type, "mention") == 0) {
- Bprint(&out, "\n⊙ %s mentioned you\n %s", username, fmthtml(cleanup(notif.content)));
- } else if (strcmp(notif.type, "follow") == 0) {
- Bprint(&out, "\n⊙ %s followed you\n", username);
- } else if (strcmp(notif.type, "poll") == 0) {
- Bprint(&out, "\n⊙ %s poll ended\n %s", username, fmthtml(cleanup(notif.content)));
- }
- }
- Bprint(&out, "\n");
- Bflush(&out);
+ if(strcmp(notif.type, "reblog") == 0)
+ {
+ Bprint(&out, "\n⊙ %s retooted\n %s", username,
+ fmthtml(cleanup(notif.content)));
+ }
+ else if(strcmp(notif.type, "favourite") == 0)
+ {
+ Bprint(&out, "\n⊙ %s favorited\n %s", username,
+ fmthtml(cleanup(notif.content)));
+ }
+ else if(strcmp(notif.type, "mention") == 0)
+ {
+ Bprint(&out, "\n⊙ %s mentioned you\n %s", username,
+ fmthtml(cleanup(notif.content)));
+ }
+ else if(strcmp(notif.type, "follow") == 0)
+ {
+ Bprint(&out, "\n⊙ %s followed you\n", username);
+ }
+ else if(strcmp(notif.type, "poll") == 0)
+ {
+ Bprint(&out, "\n⊙ %s poll ended\n %s", username,
+ fmthtml(cleanup(notif.content)));
+ }
+ }
+ Bprint(&out, "\n");
+ Bflush(&out);
}
void
debug(char *token, char *host, char *id)
{
- JSON *obj;
- char *endpoint;
+ JSON *obj;
+ char *endpoint;
- endpoint = esmprint("statuses/%s", id);
+ endpoint = esmprint("statuses/%s", id);
obj = mastodonget(token, host, endpoint);
- print("%J\n", obj);
- jsonfree(obj);
+ print("%J\n", obj);
+ jsonfree(obj);
}
-
-//echo 'proto=pass service=mastodon server=instanceHostName pass=yourToken user=yourUsername' > /mnt/factotum/ctl
+// echo 'proto=pass service=mastodon server=instanceHostName pass=yourToken
+// user=yourUsername' > /mnt/factotum/ctl
void
-main(int argc, char**argv)
+main(int argc, char **argv)
{
- UserPasswd *p;
- char *token, *host, *command, *text, *id, *filepath;
+ UserPasswd *p;
+ char *token, *host, *command, *text, *id, *filepath;
- if(argc < 2)
+ if(argc < 2)
usage();
- JSONfmtinstall();
+ JSONfmtinstall();
- host = argv[1];
- command = argv[2];
+ host = argv[1];
+ command = argv[2];
- p = getcredentials(host);
+ p = getcredentials(host);
token = p->passwd;
- if(command == nil) {
- Toot toots[TOOTSCOUNT];
- gethome(token, host, toots, nil);
- displaytoots(toots, host);
- } else if(strcmp(command, "toot") == 0) {
- text = argv[3];
- posttoot(token, host, text);
- } else if(strcmp(command, "tootfile") == 0) {
- if (argc > 4) {
- text = argv[3];
- filepath = argv[4];
- } else {
- text = "";
- filepath = argv[3];
- }
- postattachment(token, host, text, filepath);
- } else if(strcmp(command, "fav") == 0) {
- id = argv[3];
- fav(token, host, id);
- } else if(strcmp(command, "unfav") == 0) {
- id = argv[3];
- unfav(token, host, id);
- } else if(strcmp(command, "boost") == 0) {
- id = argv[3];
- boost(token, host, id);
- } else if(strcmp(command, "unboost") == 0) {
- id = argv[3];
- unboost(token, host, id);
- } else if(strcmp(command, "reply") == 0) {
- id = argv[3];
- reply(token, host, id);
- } else if(strcmp(command, "debug") == 0) {
- id = argv[3];
- debug(token, host, id);
- } else if(strcmp(command, "more") == 0) {
- id = argv[3];
- Toot toots[TOOTSCOUNT];
- gethome(token, host, toots, id);
- displaytoots(toots, host);
- } else if(strcmp(command, "notifications") == 0) {
- Notification notifs[NOTIFSCOUNT];
- getnotifications(token, host, notifs);
- displaynotifications(notifs);
- }
+ if(command == nil)
+ {
+ Toot toots[TOOTSCOUNT];
+ gethome(token, host, toots, nil);
+ displaytoots(toots, host);
+ }
+ else if(strcmp(command, "toot") == 0)
+ {
+ text = argv[3];
+ posttoot(token, host, text);
+ }
+ else if(strcmp(command, "tootfile") == 0)
+ {
+ if(argc > 4)
+ {
+ text = argv[3];
+ filepath = argv[4];
+ }
+ else
+ {
+ text = "";
+ filepath = argv[3];
+ }
+ postattachment(token, host, text, filepath);
+ }
+ else if(strcmp(command, "fav") == 0)
+ {
+ id = argv[3];
+ fav(token, host, id);
+ }
+ else if(strcmp(command, "unfav") == 0)
+ {
+ id = argv[3];
+ unfav(token, host, id);
+ }
+ else if(strcmp(command, "boost") == 0)
+ {
+ id = argv[3];
+ boost(token, host, id);
+ }
+ else if(strcmp(command, "unboost") == 0)
+ {
+ id = argv[3];
+ unboost(token, host, id);
+ }
+ else if(strcmp(command, "reply") == 0)
+ {
+ id = argv[3];
+ reply(token, host, id);
+ }
+ else if(strcmp(command, "debug") == 0)
+ {
+ id = argv[3];
+ debug(token, host, id);
+ }
+ else if(strcmp(command, "more") == 0)
+ {
+ id = argv[3];
+ Toot toots[TOOTSCOUNT];
+ gethome(token, host, toots, id);
+ displaytoots(toots, host);
+ }
+ else if(strcmp(command, "notifications") == 0)
+ {
+ Notification notifs[NOTIFSCOUNT];
+ getnotifications(token, host, notifs);
+ displaynotifications(notifs);
+ }
- free(p);
+ free(p);
exits(nil);
}
--- a/util.c
+++ b/util.c
@@ -31,7 +31,7 @@
return v;
}
-char*
+char *
estrdup(char *s)
{
s = strdup(s);
@@ -44,15 +44,15 @@
char *
concat(char *s1, char *s2)
{
- char *result;
- result = emalloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
+ char *result;
+ result = emalloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
- strcpy(result, s1);
- strcat(result, s2);
- return result;
+ strcpy(result, s1);
+ strcat(result, s2);
+ return result;
}
-char*
+char *
esmprint(char *fmt, ...)
{
char *s;
@@ -67,7 +67,7 @@
return s;
}
-char*
+char *
fslurp(int fd, int *nbuf)
{
int n, sz, r;
@@ -76,7 +76,8 @@
n = 0;
sz = 128;
buf = emalloc(sz);
- while(1){
+ while(1)
+ {
r = read(fd, buf + n, sz - n);
if(r == 0)
break;
@@ -83,8 +84,9 @@
if(r == -1)
goto error;
n += r;
- if(n == sz){
- sz += sz/2;
+ if(n == sz)
+ {
+ sz += sz / 2;
buf = erealloc(buf, sz);
}
}
@@ -100,30 +102,35 @@
void
removesubstring(char *str, char *sub)
{
- int len = strlen(sub);
+ int len = strlen(sub);
- while ((str = strstr(str, sub))) {
- memmove(str, str + len, strlen(str + len) + 1);
- }
+ while((str = strstr(str, sub)))
+ {
+ memmove(str, str + len, strlen(str + len) + 1);
+ }
}
void
removetag(char *str, char *tag)
{
- char *start = strstr(str, tag);
+ char *start = strstr(str, tag);
- while (start) {
- char *end = strchr(start, '>');
+ while(start)
+ {
+ char *end = strchr(start, '>');
- if (end) {
- memmove(start, end + 1, strlen(end + 1) + 1);
- } else {
- *start = '\0';
- break;
- }
+ if(end)
+ {
+ memmove(start, end + 1, strlen(end + 1) + 1);
+ }
+ else
+ {
+ *start = '\0';
+ break;
+ }
- start = strstr(start, tag);
- }
+ start = strstr(start, tag);
+ }
}
JSON *
@@ -130,7 +137,7 @@
getjsonkey(JSON *obj, char *key)
{
JSON *value = jsonbyname(obj, key);
- if (value == nil)
+ if(value == nil)
sysfatal("jsonbyname: key %s not found in %J", key, obj);
return value;
}
@@ -138,40 +145,42 @@
FileAttachment *
readfile(char *filename)
{
- int fd, nread, size = 0, bufsize = 1024;
- FileAttachment *fa = emalloc(sizeof(FileAttachment));
- char *buf = malloc(bufsize);
- if (!buf)
- sysfatal("malloc failed");
+ int fd, nread, size = 0, bufsize = 1024;
+ FileAttachment *fa = emalloc(sizeof(FileAttachment));
+ char *buf = malloc(bufsize);
+ if(!buf)
+ sysfatal("malloc failed");
- fd = open(filename, OREAD);
- if (fd < 0)
- sysfatal("open %s: %r", filename);
+ fd = open(filename, OREAD);
+ if(fd < 0)
+ sysfatal("open %s: %r", filename);
- while ((nread = read(fd, buf + size, bufsize - size)) > 0) {
- size += nread;
- if (size == bufsize) {
- bufsize *= 2;
- buf = realloc(buf, bufsize);
- if (!buf)
- sysfatal("realloc failed");
- }
- }
- close(fd);
+ while((nread = read(fd, buf + size, bufsize - size)) > 0)
+ {
+ size += nread;
+ if(size == bufsize)
+ {
+ bufsize *= 2;
+ buf = realloc(buf, bufsize);
+ if(!buf)
+ sysfatal("realloc failed");
+ }
+ }
+ close(fd);
- if (nread < 0)
- sysfatal("read %s: %r", filename);
+ if(nread < 0)
+ sysfatal("read %s: %r", filename);
- buf[size] = '\0';
+ buf[size] = '\0';
- fa->buf = buf;
- fa->size = size;
- return fa;
+ fa->buf = buf;
+ fa->size = size;
+ return fa;
}
char *
basename(char *path)
{
- char *base = strrchr(path, '/');
- return base ? base + 1 : path;
+ char *base = strrchr(path, '/');
+ return base ? base + 1 : path;
}