summaryrefslogtreecommitdiffstats
path: root/mbbsd/voteboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'mbbsd/voteboard.c')
-rw-r--r--mbbsd/voteboard.c447
1 files changed, 447 insertions, 0 deletions
diff --git a/mbbsd/voteboard.c b/mbbsd/voteboard.c
new file mode 100644
index 00000000..1286d986
--- /dev/null
+++ b/mbbsd/voteboard.c
@@ -0,0 +1,447 @@
+/* $Id: voteboard.c,v 1.1 2002/03/07 15:13:48 in2 Exp $ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include "config.h"
+#include "pttstruct.h"
+#include "modes.h"
+#include "common.h"
+#include "perm.h"
+#include "proto.h"
+
+#define VOTEBOARD "NewBoard"
+
+extern char currboard[];
+extern int currbid;
+extern boardheader_t *bcache;
+extern int currmode;
+extern userec_t cuser;
+
+void do_voteboardreply(fileheader_t *fhdr){
+ char genbuf[1024];
+ char reason[60];
+ char fpath[80];
+ char oldfpath[80];
+ char opnion[10];
+ char *ptr;
+ FILE *fo, *fp;
+ fileheader_t votefile;
+ int len;
+ int i, j;
+ int fd;
+ time_t endtime, now = time(NULL);
+ int hastime = 0;
+
+
+ clear();
+ if(!(currmode & MODE_POST)) {
+ move(5, 10);
+ outs("對不起,您目前無法在此發表文章!");
+ pressanykey();
+ return;
+ }
+
+ setbpath(fpath, currboard);
+ stampfile(fpath, &votefile);
+
+ setbpath(oldfpath, currboard);
+
+ strcat(oldfpath, "/");
+ strcat(oldfpath, fhdr->filename);
+
+ fp = fopen(oldfpath, "r");
+
+ len = strlen(cuser.userid);
+
+ while(fgets(genbuf, 1024, fp)){
+ if (!strncmp(genbuf, "連署結束時間", 12)){
+ hastime = 1;
+ ptr = strchr(genbuf, '(');
+ sscanf(ptr+1, "%ld", &endtime);
+ if (endtime < now){
+ prints("連署時間已過");
+ pressanykey();
+ fclose(fp);
+ return;
+ }
+ }
+ if (!strncmp(genbuf+4, cuser.userid, len)){
+ move(5, 10);
+ prints("您已經連署過本篇了");
+ opnion[0] = 'n';
+ getdata(7, 0, "要修改您之前的連署嗎?(Y/N) [N]", opnion, 3, LCECHO);
+ if (opnion[0] != 'y'){
+ fclose(fp);
+ return;
+ }
+ strcpy(reason, genbuf+19);
+ }
+ }
+ fclose(fp);
+
+ if((fd = open(oldfpath, O_RDONLY)) == -1)
+ return;
+ flock(fd, LOCK_EX);
+
+ fo = fopen(fpath, "w");
+
+ if (!fo)
+ return;
+ i = 0;
+ while(fo){
+ j = 0;
+ do{
+ if (read(fd, genbuf+j, 1)<=0){
+ flock(fd, LOCK_UN);
+ close(fd);
+ fclose(fo);
+ unlink(fpath);
+ return;
+ }
+ j++;
+ }while(genbuf[j-1] !='\n');
+ genbuf[j] = '\0';
+ i++;
+ if (!strncmp("----------", genbuf, 10))
+ break;
+ if (i > 3)
+ prints(genbuf);
+ fprintf(fo, "%s", genbuf);
+ }
+ if (!hastime){
+ now += 14*24*60*60;
+ fprintf(fo, "連署結束時間: (%ld)%s", now, ctime(&now));
+ now -= 14*24*60*60;
+ }
+
+ fprintf(fo, "%s", genbuf);
+
+ do{
+ if (!getdata(18, 0, "請問您 (Y)支持 (N)反對 這個議題:", opnion, 3, LCECHO)){
+ flock(fd, LOCK_UN);
+ close(fd);
+ fclose(fo);
+ unlink(fpath);
+ return;
+ }
+ }while(opnion[0] != 'y' && opnion[0] != 'n');
+
+ if (!getdata(20, 0, "請問您與這個議題的關係或連署理由為何:", reason, 40, DOECHO)){
+ flock(fd, LOCK_UN);
+ close(fd);
+ fclose(fo);
+ unlink(fpath);
+ return;
+ }
+
+ i = 0;
+
+ while(fo){
+ i++;
+ j = 0;
+ do{
+ if (read(fd, genbuf+j, 1)<=0){
+ flock(fd, LOCK_UN);
+ close(fd);
+ fclose(fo);
+ unlink(fpath);
+ return;
+ }
+ j++;
+ }while(genbuf[j-1] !='\n');
+ genbuf[j] = '\0';
+ if (!strncmp("----------", genbuf, 10))
+ break;
+ if (strncmp(genbuf+4, cuser.userid, len))
+ fprintf(fo, "%3d.%s", i, genbuf+4);
+ else
+ i--;
+ }
+ if (opnion[0] == 'y')
+ fprintf(fo, "%3d.%-15s%-34s 來源:%s\n", i, cuser.userid, reason,cuser.lasthost);
+ i = 0;
+ fprintf(fo, "%s", genbuf);
+ while(fo){
+ i++;
+ j = 0;
+ do{
+ if (!read(fd, genbuf+j, 1))
+ break;
+ j++;
+ }while(genbuf[j-1] !='\n');
+ genbuf[j] = '\0';
+ if (j <= 3)
+ break;
+ if (strncmp(genbuf+4, cuser.userid, len))
+ fprintf(fo, "%3d.%s", i, genbuf+4);
+ else
+ i--;
+ }
+ if (opnion[0] == 'n')
+ fprintf(fo, "%3d.%-15s%-34s 來源:%s\n", i, cuser.userid, reason,cuser.lasthost);
+ flock(fd, LOCK_UN);
+ close(fd);
+ fclose(fo);
+ unlink(oldfpath);
+ rename(fpath, oldfpath);
+}
+
+int do_voteboard() {
+ fileheader_t votefile;
+ char topic[100];
+ char title[80];
+ char genbuf[1024];
+ char fpath[80];
+ FILE* fp;
+ int temp, i;
+ time_t now = time(NULL);
+
+ clear();
+ if(!(currmode & MODE_POST)) {
+ move(5, 10);
+ outs("對不起,您目前無法在此發表文章!");
+ pressanykey();
+ return FULLUPDATE;
+ }
+
+ move(0, 0);
+ clrtobot();
+ prints("您正在使用 PTT 的連署系統\n");
+ prints("本連署系統將詢問您一些問題,請小心回答才能開始連署\n");
+ prints("任意提出連署案者,將被列入本系統不受歡迎使用者喔\n");
+ pressanykey();
+ move(0, 0);
+ clrtobot();
+ prints("(1)申請新版 (2)廢除舊版 (3)連署版主 (4)罷免版主\n");
+ if (!strcmp(currboard, VOTEBOARD))
+ prints("(5)連署小組長 (6)罷免小組長 ");
+ if (!strcmp(currboard, VOTEBOARD) && HAS_PERM(PERM_SYSOP))
+ prints("(7)站民公投");
+ prints("(8)申請新群組");
+
+ do{
+ getdata(3, 0, "請輸入連署類別:", topic, 3, DOECHO);
+ temp = atoi(topic);
+ }while(temp <= 0 && temp >= 9);
+
+ switch(temp){
+ case 1:
+ do{
+ if (!getdata(4, 0, "請輸入看版英文名稱:", topic, IDLEN+1, DOECHO))
+ return FULLUPDATE;
+ else if (invalid_brdname(topic))
+ outs("不是正確的看版名稱");
+ else if (getbnum(topic) > 0)
+ outs("本名稱已經存在");
+ else
+ break;
+ }while(temp > 0);
+ sprintf(title, "[申請新版] %s", topic);
+ sprintf(genbuf, "%s\n\n%s%s\n%s","申請新版", "英文名稱: ", topic, "中文名稱: ");
+
+ if (!getdata(5, 0, "請輸入看版中文名稱:", topic, 20, DOECHO))
+ return FULLUPDATE;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n看版類別: ");
+ if (!getdata(6, 0, "請輸入看版類別:", topic, 20, DOECHO))
+ return FULLUPDATE;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n版主名單: ");
+ getdata(7, 0, "請輸入版主名單:", topic, IDLEN * 3 + 3, DOECHO);
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n申請原因: \n");
+ outs("請輸入申請原因(至多五行),要清楚填寫不然不會核准喔");
+ for(i= 8;i<13;i++){
+ if (!getdata(i, 0, ":", topic, 60, DOECHO))
+ break;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n");
+ }
+ if (i==8)
+ return FULLUPDATE;
+ break;
+ case 2:
+ do{
+ if (!getdata(4, 0, "請輸入看版英文名稱:", topic, IDLEN+1, DOECHO))
+ return FULLUPDATE;
+ else if (getbnum(topic) <= 0)
+ outs("本名稱並不存在");
+ else
+ break;
+ }while(temp > 0);
+ sprintf(title, "[廢除舊版] %s", topic);
+ sprintf(genbuf, "%s\n\n%s%s\n","廢除舊版", "英文名稱: ", topic);
+ strcat(genbuf, "\n廢除原因: \n");
+ outs("請輸入廢除原因(至多五行),要清楚填寫不然不會核准喔");
+ for(i= 8;i<13;i++){
+ if (!getdata(i, 0, ":", topic, 60, DOECHO))
+ break;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n");
+ }
+ if (i==8)
+ return FULLUPDATE;
+
+ break;
+ case 3:
+ do{
+ if (!getdata(4, 0, "請輸入看版英文名稱:", topic, IDLEN+1, DOECHO))
+ return FULLUPDATE;
+ else if (getbnum(topic) <= 0)
+ outs("本名稱並不存在");
+ else
+ break;
+ }while(temp > 0);
+ sprintf(title, "[連署版主] %s", topic);
+ sprintf(genbuf, "%s\n\n%s%s\n%s%s","連署版主", "英文名稱: ", topic, "申請 ID : ", cuser.userid);
+ strcat(genbuf, "\n申請政見: \n");
+ outs("請輸入申請政見(至多五行),要清楚填寫不然不會核准喔");
+ for(i= 8;i<13;i++){
+ if (!getdata(i, 0, ":", topic, 60, DOECHO))
+ break;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n");
+ }
+ if (i==8)
+ return FULLUPDATE;
+ break;
+ case 4:
+ do{
+ if (!getdata(4, 0, "請輸入看版英文名稱:", topic, IDLEN+1, DOECHO))
+ return FULLUPDATE;
+ else if ((i = getbnum(topic)) <= 0)
+ outs("本名稱並不存在");
+ else
+ break;
+ }while(temp > 0);
+ sprintf(title, "[罷免版主] %s", topic);
+ sprintf(genbuf, "%s\n\n%s%s\n%s","罷免版主", "英文名稱: ", topic, "版主 ID : ");
+ do{
+ if (!getdata(6, 0, "請輸入版主ID:", topic, IDLEN + 1, DOECHO))
+ return FULLUPDATE;
+ else if (!userid_is_BM(topic, bcache[i-1].BM))
+ outs("不是該版的版主");
+ else
+ break;
+ }while(temp > 0);
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n罷免原因: \n");
+ outs("請輸入罷免原因(至多五行),要清楚填寫不然不會核准喔");
+ for(i= 8;i<13;i++){
+ if (!getdata(i, 0, ":", topic, 60, DOECHO))
+ break;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n");
+ }
+ if (i==8)
+ return FULLUPDATE;
+ break;
+ case 5:
+ if (!getdata(4, 0, "請輸入小組中英文名稱:", topic, 30, DOECHO))
+ return FULLUPDATE;
+ sprintf(title, "[連署小組長] %s", topic);
+ sprintf(genbuf, "%s\n\n%s%s\n%s%s","連署小組長", "小組名稱: ", topic, "申請 ID : ", cuser.userid);
+ strcat(genbuf, "\n申請政見: \n");
+ outs("請輸入申請政見(至多五行),要清楚填寫不然不會核准喔");
+ for(i= 8;i<13;i++){
+ if (!getdata(i, 0, ":", topic, 60, DOECHO))
+ break;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n");
+ }
+ if (i==8)
+ return FULLUPDATE;
+ break;
+ case 6:
+
+ if (!getdata(4, 0, "請輸入小組中英文名稱:", topic, 30, DOECHO))
+ return FULLUPDATE;
+ sprintf(title, "[罷免小組長] %s", topic);
+ sprintf(genbuf, "%s\n\n%s%s\n%s","罷免小組長", "小組名稱: ", topic, "小組長 ID : ");
+ if (!getdata(6, 0, "請輸入小組長ID:", topic, IDLEN + 1, DOECHO))
+ return FULLUPDATE;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n罷免原因: \n");
+ outs("請輸入罷免原因(至多五行),要清楚填寫不然不會核准喔");
+ for(i= 8;i<13;i++){
+ if (!getdata(i, 0, ":", topic, 60, DOECHO))
+ break;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n");
+ }
+ if (i==8)
+ return FULLUPDATE;
+ break;
+ case 7:
+ if (!HAS_PERM(PERM_SYSOP))
+ return FULLUPDATE;
+ if (!getdata(4, 0, "請輸入公投主題:", topic, 30, DOECHO))
+ return FULLUPDATE;
+ sprintf(title, "%s %s", "[站民公投]", topic);
+ sprintf(genbuf, "%s\n\n%s%s\n","站民公投", "公投主題: ", topic);
+ strcat(genbuf, "\n公投原因: \n");
+ outs("請輸入公投原因(至多五行),要清楚填寫不然不會核准喔");
+ for(i= 8;i<13;i++){
+ if (!getdata(i, 0, ":", topic, 60, DOECHO))
+ break;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n");
+ }
+ if (i==8)
+ return FULLUPDATE;
+ break;
+ case 8:
+ if(!getdata(4, 0, "請輸入群組中英文名稱:", topic, 30, DOECHO))
+ return FULLUPDATE;
+ sprintf(title, "[申請新群組] %s", topic);
+ sprintf(genbuf, "%s\n\n%s%s\n%s%s","申請群組", "群組名稱: ", topic, "申請 ID : ", cuser.userid);
+ strcat(genbuf, "\n申請政見: \n");
+ outs("請輸入申請政見(至多五行),要清楚填寫不然不會核准喔");
+ for(i= 8;i<13;i++){
+ if (!getdata(i, 0, ":", topic, 60, DOECHO))
+ break;
+ strcat(genbuf, topic);
+ strcat(genbuf, "\n");
+ }
+ if (i==8)
+ return FULLUPDATE;
+ break;
+ default:
+ return FULLUPDATE;
+ }
+ strcat(genbuf, "連署結束時間: ");
+ now += 14*24*60*60;
+ sprintf(topic, "(%ld)", now);
+ strcat(genbuf, topic);
+ strcat(genbuf, ctime(&now));
+ now -= 14*24*60*60;
+ strcat(genbuf, "----------支持----------\n");
+ strcat(genbuf, "----------反對----------\n");
+ outs("開始連署嘍");
+ setbpath(fpath, currboard);
+ stampfile(fpath, &votefile);
+
+ if (!(fp = fopen(fpath, "w"))){
+ outs("開檔失敗,請稍候重來一次");
+ return FULLUPDATE;
+ }
+ fprintf(fp, "%s%s %s%s\n%s%s\n%s%s", "作者: ", cuser.userid,
+ "看板: ", currboard,
+ "標題: ", title,
+ "時間: ", ctime(&now));
+ fprintf(fp, "%s\n", genbuf);
+ fclose(fp);
+ strcpy(votefile.owner, cuser.userid);
+ strcpy(votefile.title, title);
+ votefile.savemode = 'S';
+ setbdir(genbuf, currboard);
+ if(append_record(genbuf, &votefile, sizeof(votefile)) != -1)
+ setbtotal(currbid);
+ do_voteboardreply(&votefile);
+ return FULLUPDATE;
+}