summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/proto.h2
-rw-r--r--include/pttstruct.h3
-rw-r--r--mbbsd/bbs.c221
-rw-r--r--mbbsd/stuff.c13
4 files changed, 187 insertions, 52 deletions
diff --git a/include/proto.h b/include/proto.h
index d1e51a48..a072c5d9 100644
--- a/include/proto.h
+++ b/include/proto.h
@@ -401,7 +401,7 @@ void initscr();
void Jaky_outs(char *str, int line);
/* stuff */
-time_t gettime(int line, time_t dt);
+time_t gettime(int line, time_t dt, char* head);
void setcalfile(char *buf, char *userid);
void stand_title(char *title);
void pressanykey();
diff --git a/include/pttstruct.h b/include/pttstruct.h
index 41ff9b81..f14317e7 100644
--- a/include/pttstruct.h
+++ b/include/pttstruct.h
@@ -6,6 +6,7 @@
typedef struct bid_t {
int high;
int buyitnow;
+ int usermax;
int increment;
char userid[IDLEN + 1];
time_t enddate;
@@ -172,7 +173,7 @@ typedef struct fileheader_t {
#define FILE_BM 0x40 /* BM only */
#define FILE_BOTH 0x80 /* both replay for mail and board */
#define FILE_MULTI 0x100 /* multi send for mail */
-#define FILE_BID 0x200 /* for bid */
+#define FILE_BID 0x20 /* for bid */
#define STRLEN 80 /* Length of most string data */
diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c
index 82051438..b08db231 100644
--- a/mbbsd/bbs.c
+++ b/mbbsd/bbs.c
@@ -146,12 +146,9 @@ static void
readdoent(int num, fileheader_t * ent)
{
int type;
- char *mark, *title, color, special = 0, isonline = 0;
+ char *mark, *title, color, special = 0, isonline = 0, recom[3];
userinfo_t *uentp;
- if (ent->recommend > 9 || ent->recommend < 0)
- ent->recommend = 0;
-//Ptt:暫時
- type = brc_unread(ent->filename, brc_num, brc_list) ? '+' : ' ';
+ type = brc_unread(ent->filename, brc_num, brc_list) ? '+' : ' ';
if ((currmode & MODE_BOARD) && (ent->filemode & FILE_DIGEST))
type = (type == ' ') ? '*' : '#';
@@ -166,13 +163,15 @@ readdoent(int num, fileheader_t * ent)
type = 's';
}
title = subject(mark = ent->title);
- if (title == mark)
+ if (ent->filemode & FILE_BID)
+ color = '1', mark = "B:";
+ else if (title == mark)
color = '1', mark = "□";
else
color = '3', mark = "R:";
- if (title[47])
- strlcpy(title + 44, " …", sizeof(title) - 44); /* 把多餘的 string 砍掉 */
+ if (title[45])
+ strlcpy(title + 42, " …", sizeof(title) - 42); /* 把多餘的 string 砍掉 */
if (!strncmp(title, "[公告]", 6))
special = 1;
@@ -186,14 +185,19 @@ readdoent(int num, fileheader_t * ent)
(uentp = search_ulist(uid)) && isvisible(currutmp, uentp))
isonline = 1;
#endif
+ if(ent->recommend>99)
+ strcpy(recom,"--");
+ else if(ent->recommend>0)
+ sprintf(recom,"%2d",ent->recommend);
+ else strcpy(recom," ");
prints(
#ifdef COLORDATE
- "%6d %c\033[1;32m%c\033[%dm%-6s\033[m\033[%dm%-13.12s",
+ "%6d %c\033[1;32m%2.2s\033[%dm%-6s\033[m\033[%dm%-13.12s",
#else
- "%6d %c\033[1;32m%c\033[m%-6s\033[%dm%-13.12s",
+ "%6d %c\033[1;32m%2.2s\033[m%-6s\033[%dm%-13.12s",
#endif
- num, type, ent->recommend ? ent->recommend + '0' : ' ',
+ num, type, recom,
#ifdef COLORDATE
(ent->date[3] + ent->date[4]) % 7 + 31,
#endif
@@ -508,14 +512,17 @@ do_general(int isbid)
currboard, bp->title + 7);
if(isbid)
{
- prints("設定結標日期:");
- bidinfo.enddate = gettime(20, now+86400);
+ memset(&bidinfo,0,sizeof(bidinfo));
+ bidinfo.enddate = gettime(20, now+86400,"結束標案於");
do
getdata_str(21,0,"底價:",buf, 8, LCECHO, "1");
- while((bidinfo.enddate=postfile.money=atoi(buf))<=0);
+ while((bidinfo.high=postfile.money=atoi(buf))<=0);
do
- getdata_str(21,0, "每標至少增加多少:",buf, 5, LCECHO, "1");
+ getdata_str(21,20, "每標至少增加多少:",buf, 5, LCECHO, "1");
while((bidinfo.increment=atoi(buf))<=0);
+ getdata(21,44, "直接購買價(可不設):",buf, 5, LCECHO);
+ bidinfo.buyitnow=atoi(buf);
+
getdata_str(22,0,
"付款方式: 1.Ptt幣 2.郵局或銀行轉帳 3.支票或電匯 4.郵局貨到付款 [1]:",
buf, 3, LCECHO,"1");
@@ -524,23 +531,25 @@ do_general(int isbid)
getdata_str(23,0, "運費(0:免運費或文中說明)[0]:", buf, 6, LCECHO, "0");
bidinfo.shipping = atoi(buf);
if(bidinfo.shipping<0) bidinfo.shipping=0;
- postfile.filemode |= FILE_BID ;
move(20,0);
clrtobot();
}
if (quote_file[0])
do_reply_title(20, currtitle);
else {
- getdata(21, 0,
+ if(!isbid)
+ {
+ getdata(21, 0,
"種類:1.問題 2.建議 3.討論 4.心得 5.閒聊 6.公告 7.情報 (1-7或不選)",
save_title, 3, LCECHO);
- local_article = save_title[0] - '1';
- if (local_article >= 0 && local_article <= 6)
+ local_article = save_title[0] - '1';
+ if (local_article >= 0 && local_article <= 6)
snprintf(save_title, sizeof(save_title),
"[%s] ", ctype[local_article]);
- else
+ else
save_title[0] = '\0';
+ }
getdata_buf(22, 0, "標題:", save_title, TTLEN, DOECHO);
strip_ansi(save_title, save_title, 0);
}
@@ -592,12 +601,14 @@ do_general(int isbid)
strlcpy(postfile.owner, owner, sizeof(postfile.owner));
strlcpy(postfile.title, save_title, sizeof(postfile.title));
if (islocal) /* local save */
- postfile.filemode = FILE_LOCAL;
+ postfile.filemode |= FILE_LOCAL;
setbdir(buf, currboard);
if(isbid)
{
- append_record(buf, &postfile, sizeof(postfile));
+ sprintf(genbuf, "%s.bid", fpath);
+ append_record(genbuf,(void*) &bidinfo, sizeof(bidinfo));
+ postfile.filemode |= FILE_BID ;
}
if (append_record(buf, &postfile, sizeof(postfile)) != -1) {
setbtotal(currbid);
@@ -619,7 +630,7 @@ do_general(int isbid)
#endif
if (strcmp(currboard, "Test") && !ifuseanony) {
prints("這是您的第 %d 篇文章。",++cuser.numposts);
- if(!isbid)
+ if(!(postfile.filemode&FILE_BID))
{
prints(" 稿酬 %d 銀。",aborted);
demoney(aborted);
@@ -652,7 +663,7 @@ do_general(int isbid)
strlcpy(postfile.owner, cuser.userid, sizeof(postfile.owner));
strlcpy(postfile.title, save_title, sizeof(postfile.title));
- postfile.filemode = FILE_BOTH; /* both-reply flag */
+ postfile.filemode |= FILE_BOTH; /* both-reply flag */
sethomedir(genbuf, quote_user);
if (append_record(genbuf, &postfile, sizeof(postfile)) == -1)
msg = err_uid;
@@ -685,7 +696,7 @@ do_post_openbid()
{
boardheader_t *bp;
bp = getbcache(currbid);
- if (!bp->brdattr & BRD_VOTEBOARD)
+ if (!(bp->brdattr & BRD_VOTEBOARD))
return do_general(1);
touchdircache(currbid);
return 0;
@@ -1195,7 +1206,7 @@ hold_gamble(int ent, fileheader_t * fhdr, char *direct)
} while (i < 10 || i > 10000);
fprintf(fp, "%d\n", i);
if (!getdata(3, 0, "設定自動封盤時間?(Y/n)", yn, 3, LCECHO) || yn[0] != 'n') {
- bp->endgamble = gettime(4, now);
+ bp->endgamble = gettime(4, now, "封盤於");
substitute_record(fn_board, bp, sizeof(boardheader_t), currbid);
}
move(6, 0);
@@ -1310,6 +1321,134 @@ recommend_cancel(int ent, fileheader_t * fhdr, char *direct)
touchdircache(currbid);
return FULLUPDATE;
}
+static int
+do_add_recommend(char * direct,fileheader_t * fhdr, int ent, char*buf)
+{
+ char path[256];
+ lock_substitute_record(direct, fhdr, sizeof(*fhdr), ent, LOCK_EX);
+ setdirpath(path, direct, fhdr->filename);
+ log_file(path, buf);
+ if (!(fhdr->recommend < 100))
+ lock_substitute_record(direct, fhdr, sizeof(*fhdr), ent, LOCK_UN);
+ else{
+ fhdr->recommend++;
+ passwd_update(usernum, &cuser);
+ lock_substitute_record(direct, fhdr, sizeof(*fhdr), ent, LOCK_UN);
+ substitute_check(fhdr);
+ touchdircache(currbid);
+ }
+ return 0;
+}
+static int
+do_bid(int ent, fileheader_t * fhdr, boardheader_t *bp, char *direct, struct tm *ptime)
+{
+ char genbuf[200], fpath[256],say[30];
+ bid_t bidinfo;
+ int i, next;
+ char *payby[4]={ "Ptt幣","郵局或銀行轉帳","支票或電匯","郵局貨到付款"};
+
+ setdirpath(fpath, direct, fhdr->filename);
+ strcat(fpath,".bid");
+ get_record(fpath, &bidinfo, sizeof(bidinfo), 1);
+
+ move(18,0); clrtobot();
+ prints("競標主題: %s\n", fhdr->title);
+ prints("目前最高價:%-20d出價者:%-16s\n",bidinfo.high, bidinfo.userid);
+ prints("付款方式: %-20s結束於:%-16s\n",payby[bidinfo.payby%4],Cdate(& bidinfo.enddate));
+ if(bidinfo.buyitnow)
+ prints("直接購買價:%-20d",bidinfo.buyitnow);
+ if(bidinfo.shipping)
+ prints("運費:%d", bidinfo.shipping);
+ prints("\n");
+ if(now>bidinfo.enddate || bidinfo.high==bidinfo.buyitnow)
+ {
+ prints("此競標已經結束,");
+ if( bidinfo.userid[0]) prints("恭喜%s得標!", bidinfo.userid);
+ else prints("無人得標!");
+ pressanykey();
+ return FULLUPDATE;
+ }
+ if(bidinfo.userid[0])
+ {
+ prints("下次出價至少要:%d", bidinfo.high + bidinfo.increment);
+ if(bidinfo.buyitnow)
+ prints(" (超過 %d 等於直接購買)",bidinfo.buyitnow);
+ next=bidinfo.high + bidinfo.increment;
+ }
+ else
+ {
+ prints("起標價: %d", bidinfo.high);
+ next=bidinfo.high;
+ }
+ if(!strcmp(cuser.userid,bidinfo.userid))
+ {
+ prints("你是最高得標者!");
+ pressanykey();
+ return FULLUPDATE;
+ }
+ getdata_str(23,0,"是否要下標? (y/N)", genbuf, 3, LCECHO,"n");
+ if(genbuf[0]!='y') return FULLUPDATE;
+
+ getdata(23, 0, "您的最高下標金額(0:取消):", genbuf, 8, LCECHO);
+ i=atoi(genbuf);
+
+ get_record(fpath, &bidinfo, sizeof(bidinfo), 1);
+ if(bidinfo.userid[0])
+ next=bidinfo.high;
+ else
+ next=bidinfo.high + bidinfo.increment;
+
+ if(i< next);
+ {
+ outmsg("取消下標或標金不足");
+ pressanykey();
+ }
+
+ getdata(23,0,"下標感言:",say,12,DOECHO);
+ snprintf(genbuf, sizeof(genbuf),
+ "\033[1;31m→ \033[33m%s\033[m\033[33m:%s\033[m%*s金額:%-15d標%15s %02d/%02d\n",
+ cuser.userid,say,
+ 31 - strlen(cuser.userid) - strlen(say), " ",
+ next, fromhost,
+ ptime->tm_mon + 1, ptime->tm_mday);
+ do_add_recommend(direct, fhdr, ent, genbuf);
+ if(next>bidinfo.usermax)
+ {
+ bidinfo.usermax=i;
+ bidinfo.high=next;
+ strcpy(bidinfo.userid,cuser.userid);
+ }
+ else if(next<bidinfo.usermax && i>bidinfo.usermax)
+ {
+ bidinfo.high=bidinfo.usermax+bidinfo.increment;
+ bidinfo.usermax=i;
+ strcpy(bidinfo.userid,cuser.userid);
+
+ snprintf(genbuf, sizeof(genbuf),
+"\033[1;31m→ \033[33m自動競標%s勝出\033[m\033[33m\033[m%*s金額:%-15d標 %02d/%02d\n",
+ cuser.userid,
+ 20 - strlen(cuser.userid) , " ",
+ bidinfo.high,
+ ptime->tm_mon + 1, ptime->tm_mday);
+ do_add_recommend(direct, fhdr, ent, genbuf);
+ }
+ else
+ {
+ if(i+bidinfo.increment<bidinfo.usermax)
+ bidinfo.high=i+bidinfo.increment;
+ else
+ bidinfo.high=bidinfo.usermax; /*這邊怪怪的*/
+ snprintf(genbuf, sizeof(genbuf),
+"\033[1;31m→ \033[33m自動競標%s勝出\033[m\033[33m\033[m%*s金額:%-15d標 %02d/%02d\n",
+ bidinfo.userid,
+ 20 - strlen(bidinfo.userid) , " ",
+ bidinfo.high,
+ ptime->tm_mon + 1, ptime->tm_mday);
+ do_add_recommend(direct, fhdr, ent, genbuf);
+ }
+ substitute_record(fpath, &bidinfo, sizeof(bidinfo), 1);
+ return FULLUPDATE;
+}
static int
recommend(int ent, fileheader_t * fhdr, char *direct)
@@ -1321,18 +1460,19 @@ recommend(int ent, fileheader_t * fhdr, char *direct)
bp = getbcache(currbid);
if( bp->brdattr & BRD_NORECOMMEND ){
- vmsg("抱歉, 本板禁止推薦");
+ vmsg("抱歉, 本板禁止推薦或競標");
return FULLUPDATE;
}
if (!(currmode & MODE_POST) || bp->brdattr & BRD_VOTEBOARD) {
- vmsg("您因權限不足無法推薦!");
+ vmsg("您因權限不足!");
return FULLUPDATE;
}
+ if( fhdr->filemode & FILE_BID)
+ return do_bid(ent, fhdr, bp, direct, ptime);
+
setdirpath(path, direct, fhdr->filename);
- if (fhdr->recommend > 9 || fhdr->recommend < 0)
- /* 暫時性的 code 原來舊有值取消 */
- fhdr->recommend = 0;
+
if (fhdr->recommend == 0 && strcmp(cuser.userid, fhdr->owner) == 0){
vmsg("警告! 本人不能推薦第一次!");
@@ -1348,6 +1488,7 @@ recommend(int ent, fileheader_t * fhdr, char *direct)
}
#endif
+
if (!getdata(b_lines - 2, 0, "推薦語:", path, 40, DOECHO) ||
path == NULL ||
!getdata(b_lines - 1, 0, "確定要推薦, 請仔細考慮(Y/N)?[n] ",
@@ -1360,18 +1501,7 @@ recommend(int ent, fileheader_t * fhdr, char *direct)
cuser.userid, path,
51 - strlen(cuser.userid) - strlen(path), " ", fromhost,
ptime->tm_mon + 1, ptime->tm_mday);
- lock_substitute_record(direct, fhdr, sizeof(*fhdr), ent, LOCK_EX);
- setdirpath(path, direct, fhdr->filename);
- log_file(path, buf);
- if (!(fhdr->recommend < 9))
- lock_substitute_record(direct, fhdr, sizeof(*fhdr), ent, LOCK_UN);
- else{
- fhdr->recommend++;
- passwd_update(usernum, &cuser);
- lock_substitute_record(direct, fhdr, sizeof(*fhdr), ent, LOCK_UN);
- substitute_check(fhdr);
- touchdircache(currbid);
- }
+ do_add_recommend(direct, fhdr, ent, buf);
lastrecommend = now;
return FULLUPDATE;
}
@@ -1718,7 +1848,8 @@ b_note_edit_bname(int bid)
} else {
if (!getdata(2, 0, "設定有效期限天?(n/Y)", buf, 3, LCECHO)
|| buf[0] != 'n')
- fh->bupdate = gettime(3, fh->bupdate ? fh->bupdate : now);
+ fh->bupdate = gettime(3, fh->bupdate ? fh->bupdate : now,
+ "有效日期至");
else
fh->bupdate = 0;
substitute_record(fn_board, fh, sizeof(boardheader_t), bid);
@@ -1775,7 +1906,7 @@ b_post_note()
setbfile(buf, currboard, FN_POST_BID);
if (more(buf, NA) == -1)
more("etc/" FN_POST_BID, NA);
- getdata(b_lines - 2, 0, "是否要用自訂bid注意事項?", yn, sizeof(yn), LCECHO);
+ getdata(b_lines - 2, 0, "是否要用自訂競標文章注意事項?", yn, sizeof(yn), LCECHO);
if (yn[0] == 'y')
vedit(buf, NA, NULL);
else
diff --git a/mbbsd/stuff.c b/mbbsd/stuff.c
index 9f13b2ef..d8201330 100644
--- a/mbbsd/stuff.c
+++ b/mbbsd/stuff.c
@@ -337,27 +337,30 @@ belong(char *filelist, char *key)
#ifndef _BBS_UTIL_C_ /* getdata_buf */
time_t
-gettime(int line, time_t dt)
+gettime(int line, time_t dt, char*head)
{
char yn[7];
+ int i;
struct tm *ptime = localtime(&dt), endtime;
memcpy(&endtime, ptime, sizeof(struct tm));
snprintf(yn, sizeof(yn), "%4d", ptime->tm_year + 1900);
+ move(line, 0); prints("%s",head);
+ i=strlen(head);
do {
- getdata_buf(line, 0, "西元年:", yn, 5, LCECHO);
+ getdata_buf(line, i, " 西元年:", yn, 5, LCECHO);
} while ((endtime.tm_year = atoi(yn) - 1900) < 0 || endtime.tm_year > 200);
snprintf(yn, sizeof(yn), "%d", ptime->tm_mon + 1);
do {
- getdata_buf(line, 13, "月:", yn, 3, LCECHO);
+ getdata_buf(line, i+15, "月:", yn, 3, LCECHO);
} while ((endtime.tm_mon = atoi(yn) - 1) < 0 || endtime.tm_mon > 11);
snprintf(yn, sizeof(yn), "%d", ptime->tm_mday);
do {
- getdata_buf(line, 22, "日:", yn, 3, LCECHO);
+ getdata_buf(line, i+24, "日:", yn, 3, LCECHO);
} while ((endtime.tm_mday = atoi(yn)) < 1 || endtime.tm_mday > 31);
snprintf(yn, sizeof(yn), "%d", ptime->tm_hour);
do {
- getdata_buf(line, 31, "時(0-23):", yn, 3, LCECHO);
+ getdata_buf(line, i+33, "時(0-23):", yn, 3, LCECHO);
} while ((endtime.tm_hour = atoi(yn)) < 0 || endtime.tm_hour > 23);
return mktime(&endtime);
}