diff options
-rw-r--r-- | pttbbs/include/proto.h | 17 | ||||
-rw-r--r-- | pttbbs/mbbsd/bbs.c | 158 | ||||
-rw-r--r-- | pttbbs/mbbsd/gamble.c | 160 |
3 files changed, 169 insertions, 166 deletions
diff --git a/pttbbs/include/proto.h b/pttbbs/include/proto.h index 78a03ee5..449cfece 100644 --- a/pttbbs/include/proto.h +++ b/pttbbs/include/proto.h @@ -271,6 +271,8 @@ void setfriendfile(char *fpath, int type); int ticket_main(void); int openticket(int bid); int ticket(int bid); +int hold_gamble(void); +int join_gamble(int, const fileheader_t *, const char *); /* go */ void gochess(int s, ChessGameMode mode); @@ -427,19 +429,19 @@ int pmore2(const char *fpath, int promptend, void *ctx, int (*footer_handler)(int ratio, int width, void *ctx), int (*help_handler) (int y, void *ctx)); /* piaip's new telnet, telnet.c */ -extern void telnet_init(int do_init_cmd); -extern ssize_t tty_read(unsigned char *buf, size_t max); -extern void telnet_turnoff_client_detect(void); +void telnet_init(int do_init_cmd); +ssize_t tty_read(unsigned char *buf, size_t max); +void telnet_turnoff_client_detect(void); /* name */ typedef int (*gnc_comp_func)(int, const char*, int); typedef int (*gnc_perm_func)(int); typedef char* (*gnc_getname_func)(int); -extern void namecomplete2(const struct Vector *namelist, const char *prompt, char *data); -extern void namecomplete3(const struct Vector *namelist, const char *prompt, char *data, const char *defval); -extern int ShowVector(struct Vector *self, int row, int column, const char *prompt, int idx); -extern void ToggleVector(struct Vector *list, int *recipient, const char *listfile, const char *msg); +void namecomplete2(const struct Vector *namelist, const char *prompt, char *data); +void namecomplete3(const struct Vector *namelist, const char *prompt, char *data, const char *defval); +int ShowVector(struct Vector *self, int row, int column, const char *prompt, int idx); +void ToggleVector(struct Vector *list, int *recipient, const char *listfile, const char *msg); void usercomplete(const char *prompt, char *data); void usercomplete2(const char *prompt, char *data, const char *defval); @@ -653,7 +655,6 @@ int isvisible_stat(const userinfo_t * me, const userinfo_t * uentp, int fri_stat int cmpwatermtime(const void *a, const void *b); void getmessage(msgque_t msg); void my_write2(void); -int t_idle(void); void check_water_init(void); const char *modestring(const userinfo_t * uentp, int simple); int t_users(void); diff --git a/pttbbs/mbbsd/bbs.c b/pttbbs/mbbsd/bbs.c index 1ce0a44f..94ce9d0a 100644 --- a/pttbbs/mbbsd/bbs.c +++ b/pttbbs/mbbsd/bbs.c @@ -2523,164 +2523,6 @@ b_man(void) NULL, backup_path); } -#ifndef NO_GAMBLE -static int -stop_gamble(void) -{ - boardheader_t *bp = getbcache(currbid); - char fn_ticket[128], fn_ticket_end[128]; - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - if (!bp->endgamble || bp->endgamble > now) - return 0; - - setbfile(fn_ticket, currboard, FN_TICKET); - setbfile(fn_ticket_end, currboard, FN_TICKET_END); - - rename(fn_ticket, fn_ticket_end); - if (bp->endgamble) { - bp->endgamble = 0; - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); - } - return 1; -} -static int -join_gamble(int eng GCC_UNUSED, const fileheader_t * fhdr GCC_UNUSED, - const char *direct GCC_UNUSED) -{ - if (!HasBasicUserPerm(PERM_LOGINOK)) - return DONOTHING; - if (stop_gamble()) { - vmsg("目前未舉辦賭盤或賭盤已開獎"); - return DONOTHING; - } - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - ticket(currbid); - return FULLUPDATE; -} -static int -hold_gamble(void) -{ - char fn_ticket[128], fn_ticket_end[128], genbuf[128], msg[256] = "", - yn[10] = ""; - char tmp[128]; - boardheader_t *bp = getbcache(currbid); - int i; - FILE *fp = NULL; - - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - if (!(currmode & MODE_BOARD)) - return 0; - if (bp->brdattr & BRD_NOCREDIT ) { - vmsg("本看板目前被設定為發文無獎勵,無法使用賭盤"); - return 0; - } - - setbfile(fn_ticket, currboard, FN_TICKET); - setbfile(fn_ticket_end, currboard, FN_TICKET_END); - setbfile(genbuf, currboard, FN_TICKET_LOCK); - - if (dashf(fn_ticket)) { - getdata(b_lines - 1, 0, "已經有舉辦賭盤, " - "是否要 [停止下注]?(N/y):", yn, 3, LCECHO); - if (yn[0] != 'y') - return FULLUPDATE; - rename(fn_ticket, fn_ticket_end); - if (bp->endgamble) { - bp->endgamble = 0; - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); - - } - return FULLUPDATE; - } - if (dashf(fn_ticket_end)) { - getdata(b_lines - 1, 0, "已經有舉辦賭盤, " - "是否要開獎 [否/是]?(N/y):", yn, 3, LCECHO); - if (yn[0] != 'y') - return FULLUPDATE; - if(cpuload(NULL) > MAX_CPULOAD/4) - { - vmsg("負荷過高 請於系統負荷低時開獎.."); - return FULLUPDATE; - } - openticket(currbid); - return FULLUPDATE; - } else if (dashf(genbuf)) { - vmsg(" 目前系統正在處理開獎事宜, 請結果出爐後再舉辦......."); - return FULLUPDATE; - } - getdata(b_lines - 2, 0, "要舉辦賭盤 (N/y):", yn, 3, LCECHO); - if (yn[0] != 'y') - return FULLUPDATE; - getdata(b_lines - 1, 0, "賭什麼? 請輸入主題 (輸入後編輯內容):", - msg, 20, DOECHO); - if (msg[0] == 0 || - veditfile(fn_ticket_end) < 0) - return FULLUPDATE; - - clear(); - showtitle("舉辦賭盤", BBSNAME); - setbfile(tmp, currboard, FN_TICKET_ITEMS ".tmp"); - - //sprintf(genbuf, "%s/" FN_TICKET_ITEMS, direct); - - if (!(fp = fopen(tmp, "w"))) - return FULLUPDATE; - do { - getdata(2, 0, "輸入彩票價格 (價格:10-10000):", yn, 6, NUMECHO); - i = atoi(yn); - } 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, "封盤於"); - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); - } - move(6, 0); - snprintf(genbuf, sizeof(genbuf), - "\n請到 %s 板 按'f'參與賭博!\n\n" - "一張 %d " MONEYNAME ", 這是%s的賭博\n%s%s\n", - currboard, - i, i < 100 ? "小賭式" : i < 500 ? "平民級" : - i < 1000 ? "貴族級" : i < 5000 ? "富豪級" : "傾家蕩產", - bp->endgamble ? "賭盤結束時間: " : "", - bp->endgamble ? Cdate(&bp->endgamble) : "" - ); - strcat(msg, genbuf); - outs("請依次輸入彩票名稱, 需提供2~8項. (未滿八項, 輸入直接按Enter)\n"); - //outs(ANSI_COLOR(1;33) "注意輸入後無法修改!\n"); - for( i = 0 ; i < 8 ; ++i ){ - snprintf(yn, sizeof(yn), " %d)", i + 1); - getdata(7 + i, 0, yn, genbuf, 9, DOECHO); - if (!genbuf[0] && i > 1) - break; - fprintf(fp, "%s\n", genbuf); - } - fclose(fp); - - setbfile(genbuf, currboard, FN_TICKET_RECORD); - unlink(genbuf); // Ptt: 防堵利用不同id同時舉辦賭場 - setbfile(genbuf, currboard, FN_TICKET_USER); - unlink(genbuf); // Ptt: 防堵利用不同id同時舉辦賭場 - - setbfile(genbuf, currboard, FN_TICKET_ITEMS); - setbfile(tmp, currboard, FN_TICKET_ITEMS ".tmp"); - if(!dashf(fn_ticket)) - Rename(tmp, genbuf); - - snprintf(genbuf, sizeof(genbuf), TN_ANNOUNCE " %s 板 開始賭博!", currboard); - post_msg(currboard, genbuf, msg, cuser.userid); - post_msg("Record", genbuf + 7, msg, "[馬路探子]"); - /* Tim 控制CS, 以免正在玩的user把資料已經寫進來 */ - rename(fn_ticket_end, fn_ticket); - /* 設定完才把檔名改過來 */ - - vmsg("賭盤設定完成"); - return FULLUPDATE; -} -#endif - static int cite_post(int ent GCC_UNUSED, const fileheader_t * fhdr, const char *direct GCC_UNUSED) diff --git a/pttbbs/mbbsd/gamble.c b/pttbbs/mbbsd/gamble.c index e6f46e0b..c91b4f78 100644 --- a/pttbbs/mbbsd/gamble.c +++ b/pttbbs/mbbsd/gamble.c @@ -266,6 +266,7 @@ doesnt_catch_up: return -1; } +#ifndef NO_GAMBLE int openticket(int bid) { @@ -478,6 +479,165 @@ openticket(int bid) } int +stop_gamble(void) +{ + boardheader_t *bp = getbcache(currbid); + char fn_ticket[128], fn_ticket_end[128]; + assert(0<=currbid-1 && currbid-1<MAX_BOARD); + if (!bp->endgamble || bp->endgamble > now) + return 0; + + setbfile(fn_ticket, currboard, FN_TICKET); + setbfile(fn_ticket_end, currboard, FN_TICKET_END); + + rename(fn_ticket, fn_ticket_end); + if (bp->endgamble) { + bp->endgamble = 0; + assert(0<=currbid-1 && currbid-1<MAX_BOARD); + substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); + } + return 1; +} + +int +join_gamble(int eng GCC_UNUSED, const fileheader_t * fhdr GCC_UNUSED, + const char *direct GCC_UNUSED) +{ + if (!HasBasicUserPerm(PERM_LOGINOK)) + return DONOTHING; + if (stop_gamble()) { + vmsg("目前未舉辦賭盤或賭盤已開獎"); + return DONOTHING; + } + assert(0<=currbid-1 && currbid-1<MAX_BOARD); + ticket(currbid); + return FULLUPDATE; +} + +int +hold_gamble(void) +{ + char fn_ticket[128], fn_ticket_end[128], genbuf[128], msg[256] = "", + yn[10] = ""; + char tmp[128]; + boardheader_t *bp = getbcache(currbid); + int i; + FILE *fp = NULL; + + assert(0<=currbid-1 && currbid-1<MAX_BOARD); + if (!(currmode & MODE_BOARD)) + return 0; + if (bp->brdattr & BRD_NOCREDIT ) { + vmsg("本看板目前被設定為發文無獎勵,無法使用賭盤"); + return 0; + } + + setbfile(fn_ticket, currboard, FN_TICKET); + setbfile(fn_ticket_end, currboard, FN_TICKET_END); + setbfile(genbuf, currboard, FN_TICKET_LOCK); + + if (dashf(fn_ticket)) { + getdata(b_lines - 1, 0, "已經有舉辦賭盤, " + "是否要 [停止下注]?(N/y):", yn, 3, LCECHO); + if (yn[0] != 'y') + return FULLUPDATE; + rename(fn_ticket, fn_ticket_end); + if (bp->endgamble) { + bp->endgamble = 0; + assert(0<=currbid-1 && currbid-1<MAX_BOARD); + substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); + + } + return FULLUPDATE; + } + if (dashf(fn_ticket_end)) { + getdata(b_lines - 1, 0, "已經有舉辦賭盤, " + "是否要開獎 [否/是]?(N/y):", yn, 3, LCECHO); + if (yn[0] != 'y') + return FULLUPDATE; + if(cpuload(NULL) > MAX_CPULOAD/4) + { + vmsg("負荷過高 請於系統負荷低時開獎.."); + return FULLUPDATE; + } + openticket(currbid); + return FULLUPDATE; + } else if (dashf(genbuf)) { + vmsg(" 目前系統正在處理開獎事宜, 請結果出爐後再舉辦......."); + return FULLUPDATE; + } + getdata(b_lines - 2, 0, "要舉辦賭盤 (N/y):", yn, 3, LCECHO); + if (yn[0] != 'y') + return FULLUPDATE; + getdata(b_lines - 1, 0, "賭什麼? 請輸入主題 (輸入後編輯內容):", + msg, 20, DOECHO); + if (msg[0] == 0 || + veditfile(fn_ticket_end) < 0) + return FULLUPDATE; + + clear(); + showtitle("舉辦賭盤", BBSNAME); + setbfile(tmp, currboard, FN_TICKET_ITEMS ".tmp"); + + //sprintf(genbuf, "%s/" FN_TICKET_ITEMS, direct); + + if (!(fp = fopen(tmp, "w"))) + return FULLUPDATE; + do { + getdata(2, 0, "輸入彩票價格 (價格:10-10000):", yn, 6, NUMECHO); + i = atoi(yn); + } 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, "封盤於"); + assert(0<=currbid-1 && currbid-1<MAX_BOARD); + substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); + } + move(6, 0); + snprintf(genbuf, sizeof(genbuf), + "\n請到 %s 板 按'f'參與賭博!\n\n" + "一張 %d " MONEYNAME ", 這是%s的賭博\n%s%s\n", + currboard, + i, i < 100 ? "小賭式" : i < 500 ? "平民級" : + i < 1000 ? "貴族級" : i < 5000 ? "富豪級" : "傾家蕩產", + bp->endgamble ? "賭盤結束時間: " : "", + bp->endgamble ? Cdate(&bp->endgamble) : "" + ); + strcat(msg, genbuf); + outs("請依次輸入彩票名稱, 需提供2~8項. (未滿八項, 輸入直接按Enter)\n"); + //outs(ANSI_COLOR(1;33) "注意輸入後無法修改!\n"); + for( i = 0 ; i < 8 ; ++i ){ + snprintf(yn, sizeof(yn), " %d)", i + 1); + getdata(7 + i, 0, yn, genbuf, 9, DOECHO); + if (!genbuf[0] && i > 1) + break; + fprintf(fp, "%s\n", genbuf); + } + fclose(fp); + + setbfile(genbuf, currboard, FN_TICKET_RECORD); + unlink(genbuf); // Ptt: 防堵利用不同id同時舉辦賭場 + setbfile(genbuf, currboard, FN_TICKET_USER); + unlink(genbuf); // Ptt: 防堵利用不同id同時舉辦賭場 + + setbfile(genbuf, currboard, FN_TICKET_ITEMS); + setbfile(tmp, currboard, FN_TICKET_ITEMS ".tmp"); + if(!dashf(fn_ticket)) + Rename(tmp, genbuf); + + snprintf(genbuf, sizeof(genbuf), TN_ANNOUNCE " %s 板 開始賭博!", currboard); + post_msg(currboard, genbuf, msg, cuser.userid); + post_msg("Record", genbuf + 7, msg, "[馬路探子]"); + /* Tim 控制CS, 以免正在玩的user把資料已經寫進來 */ + rename(fn_ticket_end, fn_ticket); + /* 設定完才把檔名改過來 */ + + vmsg("賭盤設定完成"); + return FULLUPDATE; +} +#endif + +int ticket_main(void) { ticket(0); |