📄 personal_corp.c
字号:
#undef PUTS#undef PUTC#undef GET_TAG/******* * num==-1: 增加 * num >=0: 修改 * num为序号 */int pc_add_a_dir(unsigned long nid){ struct pc_nodes pn; char ans[201]; int ret; bzero(&pn, sizeof(pn)); if (nid) { if (get_pc_a_node(&pn, nid) <= 0) return 0; } move(t_lines - 1, 0); clrtoeol(); if (nid) { strncpy(ans, pn.subject, 200); ans[200] = 0; } else ans[0] = 0; getdata(t_lines - 1, 0, "标题:", ans, 200, DOECHO, NULL, false); if (!ans[0]) return 0; strncpy(pn.subject, ans, 200); pn.subject[200] = 0; if (pn.body) free(pn.body); pn.body = NULL; strncpy(pn.hostname, uinfo.from, 20); pn.hostname[20] = 0; pn.created = time(0); pn.changed = pn.created; pn.uid = pc_u->uid; pn.pid = pc_fav_dir; pn.type = 1; pn.comment = 1; pn.access = 3; ret = add_pc_nodes(&pn); return ret;}/******* * nid==-1: 增加 * nid >=0: 修改 * num为序号 */int pc_add_a_node(unsigned long nid){ struct pc_nodes pn; char ans[201]; char fpath[STRLEN]; int ret; bzero(&pn, sizeof(pn)); if (nid) { if (get_pc_a_node(&pn, nid) <= 0) return 0; } move(t_lines - 1, 0); clrtoeol(); if (nid) { strncpy(ans, pn.subject, 200); ans[200] = 0; } else ans[0] = 0; getdata(t_lines - 1, 0, "标题:", ans, 200, DOECHO, NULL, false); if (!ans[0]) return 0; strncpy(pn.subject, ans, 200); pn.subject[200] = 0; gettmpfilename(fpath, "pc.node"); unlink(fpath); if (nid && pn.body) { pc_conv_body_to_file(pn.body, fpath); free(pn.body); pn.body = NULL; } else unlink(fpath); if (vedit(fpath, 0, NULL, NULL, 0) == -1) return 0; pn.body = NULL; if (!pc_conv_file_to_body(&(pn.body), fpath)) { unlink(fpath); return 0; } unlink(fpath); strncpy(pn.hostname, uinfo.from, 20); pn.hostname[20] = 0; pn.created = time(0); pn.changed = pn.created; pn.uid = pc_u->uid; pn.pid = pc_fav_dir; pn.comment = 1; pn.access = pc_dirmode - 1; ret = add_pc_nodes(&pn); if (pn.body) free(pn.body); return ret;}static int pc_dir_title(struct _select_def *conf){ int chkmailflag; chkmailflag = chkmail(); clear(); move(0, 0); if (chkmailflag == 2) { prints("\033[0;1;5;44m [您的信箱超过容量,不能再收信!] \033[m"); } else if (chkmailflag) { prints("\033[0;1;5;44m [您有信件] \033[m"); } else { prints("\033[0;1;44m %s的个人文集 -- %-44s ", pc_u->username, pc_u->corpusname); switch (pc_dirmode) { case 2: prints("[好友区]\033[m"); break; case 3: prints("[私人区]\033[m"); break; case 4: prints("[收藏区]\033[m"); break; case 5: prints("[删除区]\033[m"); break; default: prints("[公开区]\033[m"); break; } } move(1, 0); if (pc_dirmode != 2) prints(" 退出[\033[1;32mq\033[m] 增加[\033[1;32ma\033[m] 删除[\033[1;32md\033[m] 修改[\033[1;32me\033[m] 拷贝[\033[1;32mc\033[m] 粘贴[\033[1;32mp\033[m]"); else prints ("退出[\033[1;32mq\033[m] 增加[\033[1;32ma\033[m] 删除[\033[1;32md\033[m] 修改[\033[1;32me\033[m] 拷贝[\033[1;32mc\033[m] 粘贴[\033[1;32mp\033[m] 修改好友[\033[1;32mo\033[m] 导入好友[\033[1;32mi\033[m]"); move(2, 0); prints("\033[0;1;44m %-4s %-6s %-38s %-4s %-4s %-12s\033[m", "序号", "类别", "标题", "评论", "访问", "文章发表时间"); update_endline(); return SHOW_CONTINUE;}static int pc_dir_select(struct _select_def *conf){ char fpath[STRLEN]; int ch; clear(); //pc_add_visitcount(pc_n[conf->pos - conf->page_pos].nid); pc_n[conf->pos - conf->page_pos].visitcount++; /**如果是目录***/ if (pc_dirmode == 4 && pc_n[conf->pos - conf->page_pos].type == 1) { unsigned long old_fav_dir = pc_fav_dir; pc_fav_dir = pc_n[conf->pos - conf->page_pos].nid; pc_read_dir(0); pc_fav_dir = old_fav_dir; if (pc_select_user[0]) return SHOW_QUIT; return SHOW_DIRCHANGE; } /***先显示文章正文*****/ gettmpfilename(fpath, "pc.node"); unlink(fpath); if (!pc_conv_node_to_file(pc_n[conf->pos - conf->page_pos].nid, fpath)) { move(3, 0); prints("没有内容"); pressanykey(); return SHOW_REFRESH; } ch = mmap_more(fpath, 1, "r", "PersonalCorp"); if (ch == 0) { move(t_lines - 1, 0); if (pc_n[conf->pos - conf->page_pos].comment) prints("\033[0;1;44m r 查看所有评论(共%d条) \033[m", pc_n[conf->pos - conf->page_pos].commentcount); else prints("\033[0;1;44m 本文不许评论 \033[m"); ch = igetkey(); } switch (ch) { case 'r': pc_now_node_ent = conf->pos - conf->page_pos; pc_read_comment(); return SHOW_DIRCHANGE; default: break; } unlink(fpath); return SHOW_REFRESH;}static int pc_dir_show(struct _select_def *conf, int i){ char newts[20]; prints(" %-3d %s %-38s %-3d %-3d %-12s", i, pc_n[i - conf->page_pos].type == 0 ? "[文章]" : "\033[1;33m[目录]\033[m", pc_n[i - conf->page_pos].subject, pc_n[i - conf->page_pos].commentcount, pc_n[i - conf->page_pos].visitcount, tt2timestamp(pc_n[i - conf->page_pos].created, newts)); return SHOW_CONTINUE;}static int pc_dir_key(struct _select_def *conf, int key){ switch (key) { case 'a': if (!pc_is_owner(pc_u->username)) return SHOW_CONTINUE; if (conf->item_count > pc_u->nodelimit) { clear(); prints("文章数目达到限制"); pressreturn(); return SHOW_REFRESH; } if (pc_add_a_node(0)) return SHOW_DIRCHANGE; return SHOW_REFRESH; break; case 'i': { char ans[4]; if (!pc_is_owner(pc_u->username) || pc_dirmode != 2) return SHOW_CONTINUE; clear(); getdata(3, 0, "确实要导入好友名单? (Y/N) [N]: ", ans, 3, DOECHO, NULL, true); if (ans[0] != 'y' && ans[0] != 'Y') { return SHOW_REFRESH; } else { char fpath[STRLEN]; char buf[STRLEN]; struct friends fh; FILE *fp; int suc = 0; sethomefile(fpath, getCurrentUser()->userid, "friends"); sethomefile(buf, getCurrentUser()->userid, "pc_friend"); if ((fp = fopen(fpath, "r")) == NULL) return SHOW_REFRESH; while (fread(&fh, sizeof(fh), 1, fp)) { if (pc_add_friend(fh.id, buf, 0) > 0) suc++; } fclose(fp); move(10, 0); clrtoeol(); prints("成功导入 %d 个好友", suc); pressanykey(); return SHOW_REFRESH; } } case 'o': if (!pc_is_owner(pc_u->username) || pc_dirmode != 2) return SHOW_CONTINUE; pc_change_friend(); return SHOW_REFRESH; break; case 'g': if (!pc_is_owner(pc_u->username) || pc_dirmode != 4 || pc_fav_dir == 0) return SHOW_CONTINUE; if (conf->item_count > pc_u->dirlimit) { clear(); prints("目录数目达到限制"); pressreturn(); return SHOW_REFRESH; } if (pc_add_a_dir(0)) return SHOW_DIRCHANGE; return SHOW_REFRESH; break; case 'd': if (!pc_is_admin(pc_u->username)) return SHOW_CONTINUE; if (pc_dirmode == 5) { if (del_pc_nodes(pc_n[conf->pos - conf->page_pos].nid, pc_n[conf->pos - conf->page_pos].access, pc_u->uid)) { return SHOW_DIRCHANGE; } } else if (pc_dirmode == 4) { struct pc_nodes pn; if (get_pc_nodes(&pn, pc_u->uid, pc_n[conf->pos - conf->page_pos].nid, -1, 3, 0, 1, 0) > 0) { move(t_lines - 1, 0); clrtoeol(); prints("不能删除非空目录,按任意键继续"); igetkey(); update_endline(); return SHOW_CONTINUE; } if (del_pc_node_junk(pc_n[conf->pos - conf->page_pos].nid, pc_n[conf->pos - conf->page_pos].access, pc_u->uid)) return SHOW_DIRCHANGE; } else { if (del_pc_node_junk(pc_n[conf->pos - conf->page_pos].nid, pc_n[conf->pos - conf->page_pos].access, pc_u->uid)) return SHOW_DIRCHANGE; } return SHOW_REFRESH; break; case 'D': { char ans[4]; if (!pc_is_owner(pc_u->username)) return SHOW_CONTINUE; if (pc_dirmode != 5) return SHOW_CONTINUE; clear(); getdata(1, 0, "确实要清空垃圾箱吗? (Y/N) [N]:", ans, 3, DOECHO, NULL, true); if (ans[0] != 'y' && ans[0] != 'Y') return SHOW_REFRESH; pc_del_junk(pc_u->uid); return SHOW_DIRCHANGE; } case 'e': if (!pc_is_owner(pc_u->username)) return SHOW_CONTINUE; if (pc_dirmode == 4 && pc_n[conf->pos - conf->page_pos].type == 1) { if (pc_add_a_dir(pc_n[conf->pos - conf->page_pos].nid)) return SHOW_DIRCHANGE; return SHOW_REFRESH; } if (pc_add_a_node(pc_n[conf->pos - conf->page_pos].nid)) return SHOW_DIRCHANGE; return SHOW_REFRESH; break; case 'c': if (pc_n[conf->pos - conf->page_pos].type == 1) { move(t_lines - 1, 0); clrtoeol(); prints("不能复制目录,按任意键继续"); igetkey(); update_endline(); return SHOW_CONTINUE; } pc_pasteboard = pc_n[conf->pos - conf->page_pos].nid; move(t_lines - 1, 0); clrtoeol(); prints("已经复制该条目到剪贴板中,按任意键继续"); igetkey(); update_endline(); return SHOW_CONTINUE; break; case 'p': if (!pc_is_owner(pc_u->username)) return SHOW_CONTINUE; if (conf->item_count > pc_u->nodelimit) { clear(); prints("文章数目达到限制"); pressreturn(); return SHOW_REFRESH; } if (pc_pasteboard <= 0) { move(t_lines - 1, 0); clrtoeol(); prints("剪贴板没有内容,按任意键继续"); igetkey(); update_endline(); return SHOW_DIRCHANGE; } if (pc_paste_node(pc_pasteboard, pc_u->uid, pc_dirmode - 1, pc_dirmode == 4 ? pc_fav_dir : 0)) { move(t_lines - 1, 0); clrtoeol(); prints("粘贴成功,按任意键继续"); igetkey(); update_endline(); return SHOW_DIRCHANGE; } move(t_lines - 1, 0); clrtoeol(); prints("粘贴失败,按任意键继续"); igetkey(); update_endline(); return SHOW_CONTINUE; break; case 's': { char ans[20]; struct userec *lookupuser; move(0, 0); clrtoeol(); prints("选择别的用户的个人文集"); move(1, 0); clrtoeol(); prints("输入用户id:"); usercomplete(NULL, ans); if (ans[0] == 0 || ans[0] == '\n' || ans[0] == '\r') return SHOW_REFRESH; if (getuser(ans, &lookupuser) == 0) return SHOW_REFRESH; strncpy(pc_select_user, ans, IDLEN + 2); pc_select_user[IDLEN + 1] = 0; return SHOW_QUIT; break; } case 'v': i_read_mail(); return SHOW_REFRESH; break; } return SHOW_CONTINUE;}static int pc_dir_getdata(struct _select_def *conf, int pos, int len){ int i; for (i = 0; i < BBS_PAGESIZE; i++) { if (pc_n[i].body) free(pc_n[i].body); } bzero(pc_n, sizeof(struct pc_nodes) * BBS_PAGESIZE); if (conf->item_count - conf->page_pos < BBS_PAGESIZE) conf->item_count = count_pc_nodes(pc_u->uid, pc_fav_dir, -1, pc_dirmode - 1); if (pos <= 0) { clear(); move(3, 0); prints("pos:%d\n", pos); pressanykey(); } i = get_pc_nodes(pc_n, pc_u->uid, pc_fav_dir, -1, pc_dirmode - 1, pos - 1, BBS_PAGESIZE, 0); if (i < 0) return SHOW_QUIT; if (i == 0) { conf->page_pos = 1; i = get_pc_nodes(pc_n, pc_u->uid, pc_fav_dir, -1, pc_dirmode - 1, 0, BBS_PAGESIZE, 0); if (i <= 0) return SHOW_QUIT; } return SHOW_CONTINUE;}static int pc_dir_prekey(struct _select_def *conf, int *key){ switch (*key) { case 'q': *key = KEY_LEFT; break; case 'k': *key = KEY_UP; break; case 'j': *key = KEY_DOWN; break; } return SHOW_CONTINUE;}int pc_read_dir(int first){ struct _select_def group_conf; POINT *pts; int i; if (pc_dirmode <= 0 || pc_dirmode > 5) return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -