summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorwrmr2025-08-24 21:30:51 -0400
committerwrmr2025-08-24 21:30:51 -0400
commit82ff02b24c6fd4933e210da751575ebde0aff932 (patch)
treebe3ca865793db44e37c7d9e16772228e4e9d5524 /main.c
parent5ff39608e0eb40043564945d52f4234f62d0285d (diff)
edit ~/.binkpfp with `p`!
Diffstat (limited to 'main.c')
-rw-r--r--main.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/main.c b/main.c
index 47b59df..ce0f02d 100644
--- a/main.c
+++ b/main.c
@@ -220,10 +220,11 @@ void pfp_load(Pfp *pfp, Str src, Arena *a) {
}
}
-User *user_load(Str name, Str binkdir, Arena *a) {
+User *user_load(Str name, Str homedir, Str binkdir, Arena *a) {
+ (void)binkdir;
User *u = new(a, User);
u->name = str_dup(name, a);
- FILE *f = fopen(cstr_fmt(a, "%S/.client/pfp.txt", binkdir), "r/o");
+ FILE *f = fopen(cstr_fmt(a, "%S/.binkpfp", homedir), "r/o");
Str pfp_src = {0};
if (f) {
read_all(f, &pfp_src, a);
@@ -300,18 +301,20 @@ void post_stats_fini(PostStats *ps) {
* (a) absolute; and
* (b) allocated either statically or within arena @a
*/
-void posts_gather_from(PostList *posts, Str username, const char *path, Arena *a) {
+void posts_gather_from(PostList *posts, Str username, Str homedir, Arena *a) {
+ const char *path = cstr_fmt(a, "%S/.bink", homedir);
DIR *d = opendir(path);
if (!d) return;
post_stats.user_count++;
- User *user = user_load(username, str_from_cstr(path), a);
+ Str binkdir = str_from_cstr(path);
+ User *user = user_load(username, homedir, binkdir, a);
for (struct dirent *de; (de = readdir(d)); ) {
if (*de->d_name == '.') continue;
Post p = { 0 };
if (str_to_timespec(str_from_cstr(de->d_name), &p.timestamp)) continue;
if (timestamp_invalid(&p.timestamp)) continue;
p.user = user;
- p.path = cstr_fmt(a, "%s/%s", path, de->d_name);
+ p.path = cstr_fmt(a, "%S/%s", binkdir, de->d_name);
DA_PUSH(posts, p);
}
closedir(d);
@@ -323,10 +326,10 @@ void posts_gather(PostList *posts, Arena *a) {
for (struct dirent *de; (de = readdir(d)); ) {
if (*de->d_name == '.') continue;
posts_gather_from(posts, str_from_cstr(de->d_name),
- cstr_fmt(a, "/home/%s/.bink", de->d_name), a);
+ str_fmt(a, "/home/%s", de->d_name), a);
}
closedir(d);
- posts_gather_from(posts, S("our"), "/town/our/data/.bink", a);
+ posts_gather_from(posts, S("our"), S("/town/our/data"), a);
}
void posts_load(PostList *posts, Arena *a) {
@@ -542,8 +545,17 @@ char *get_editor(void) {
return editor;
}
+void init_curses(void);
+void fini_curses(void);
+int edit_file(const char *path, Arena *temp) {
+ fini_curses();
+ int r = system(cstr_fmt(temp, "%s %s", get_editor(), path));
+ init_curses();
+ return r;
+}
+
void edit_post(Post *post, Arena *temp) {
- system(cstr_fmt(temp, "%s %s", get_editor(), post->path));
+ edit_file(post->path, temp);
}
void ensure_dotbink_exists(Arena *temp) {
@@ -565,7 +577,7 @@ void new_post(Arena *temp) {
const char *tmpf = cstr_fmt(temp, "/tmp/cbink_%s_%U%09u.txt", getlogin(),
(uint64_t)ts.tv_sec, (uint32_t)ts.tv_nsec);
- if (system(cstr_fmt(temp, "%s %s", get_editor(), tmpf))) return;
+ if (edit_file(tmpf, temp)) return;
Str body = { 0 };
FILE *f = fopen(tmpf, "r/o");
@@ -699,20 +711,22 @@ int main(void) {
case 0x15 /* ^U */:
cur = gfx_line_skip(&gfx, cur, -HALF_PAGE_LEN);
break;
+
case 'e':
if (is_post_mine(&posts.data[cur])) {
- fini_curses();
edit_post(&posts.data[cur], &temp_arena);
- init_curses();
goto refresh;
} else {
log_warn("not your post to edit!");
break;
}
+
+ case 'p':
+ edit_file(cstr_fmt(&temp_arena, "/home/%s/.binkpfp", getlogin()), &temp_arena);
+ goto refresh;
+
case 'c':
- fini_curses();
new_post(&temp_arena);
- init_curses();
/* fallthrough */
case 'r':
refresh: