diff options
-rw-r--r-- | pttbbs/mbbsd/gamble.c | 21 | ||||
-rw-r--r-- | pttbbs/util/openticket.c | 178 |
2 files changed, 155 insertions, 44 deletions
diff --git a/pttbbs/mbbsd/gamble.c b/pttbbs/mbbsd/gamble.c index 1d20f1c5..92148a8c 100644 --- a/pttbbs/mbbsd/gamble.c +++ b/pttbbs/mbbsd/gamble.c @@ -26,6 +26,7 @@ show_ticket_data(char betname[MAX_ITEM][MAX_ITEM_LEN],const char *direct, int *p int i, count, total = 0, end = 0, ticket[MAX_ITEM] = {0, 0, 0, 0, 0, 0, 0, 0}; FILE *fp; char genbuf[256], t[25]; + int wide = 0; clear(); if (bh) { @@ -49,8 +50,11 @@ show_ticket_data(char betname[MAX_ITEM][MAX_ITEM_LEN],const char *direct, int *p } fgets(genbuf, MAX_ITEM_LEN, fp); *price = atoi(genbuf); - for (count = 0; fgets(betname[count], MAX_ITEM_LEN, fp) && count < MAX_ITEM; count++) { + for (count = 0; fgets(betname[count], MAX_ITEM_LEN, fp) && + count < MAX_ITEM; count++) { chomp(betname[count]); + if (strlen(betname[count]) > 8) + wide = 1; } fclose(fp); @@ -81,13 +85,18 @@ show_ticket_data(char betname[MAX_ITEM][MAX_ITEM_LEN],const char *direct, int *p outs(ANSI_COLOR(33)); for (i = 0; i < count; i++) { - prints("%d.%-8s: %-7d", i + 1, betname[i], ticket[i]); - if (i == 3) - outc('\n'); + if (wide) { + prints("%d.%-*s: %-7d ", i + 1, IDLEN, betname[i], ticket[i]); + if (i % 3 == 2) outc('\n'); + } else { + prints("%d.%-8s: %-7d", i + 1, betname[i], ticket[i]); + if (i == 3) outc('\n'); + } } - prints(ANSI_RESET "\n" ANSI_COLOR(42) " 下注總金額:" ANSI_COLOR(31) " %d 元 " ANSI_RESET, total * (*price)); + prints(ANSI_RESET "\n" ANSI_COLOR(42) " 下注總金額:" + ANSI_COLOR(31) " %d 元 " ANSI_RESET, total * (*price)); if (end) { - outs("\n賭盤已經停止下注\n"); + outs(",賭盤已經停止下注\n"); return -count; } return count; diff --git a/pttbbs/util/openticket.c b/pttbbs/util/openticket.c index 8502cdaa..d6daf8f6 100644 --- a/pttbbs/util/openticket.c +++ b/pttbbs/util/openticket.c @@ -3,10 +3,21 @@ #define _UTIL_C_ #include "bbs.h" -static char *betname[8] = {"Ptt", "Jaky", "Action", "Heat", - "DUNK", "Jungo", "waiting", "wofe"}; - +#define MAX_ITEM 8 //最大 賭項(item) 個數 +#define MAX_ITEM_LEN 30 //最大 每一賭項名字長度 +#define MAX_DISP_LEN 8 //每項顯示最大長度 +#define PRICE 100 //Default price #define MAX_DES 7 /* 最大保留獎數 */ +#define VALID_UNUM(u) ((u) > 0 && (u) < MAX_USERS) + +#if (MAX_ITEM_LEN < IDLEN) +# error MAX_ITEM_LEN must be greater than IDLEN. +#endif + +const char unique_betnames[MAX_ITEM][MAX_ITEM_LEN] = { + "Ptt", "Jaky", "Action", "Heat", + "DUNK", "Jungo", "waiting", "wofe", +}; int sendalert_uid(int uid, int alert){ @@ -17,29 +28,119 @@ sendalert_uid(int uid, int alert){ return 0; } -int main(int argc, char **argv) +int load_ticket_items(const char *filename, int n_items, + int *pPrice, char items[MAX_ITEM][MAX_ITEM_LEN]) { + FILE *fp = fopen(filename, "rt"); + char genbuf[MAX_ITEM_LEN] = ""; + int i; + + if (!fp) + return 0; + + if (fgets(genbuf, sizeof(genbuf), fp) && *genbuf) { + if (pPrice) + *pPrice = atoi(genbuf); + } + + for (i = 0; fgets(items[i], MAX_ITEM_LEN, fp) && i < n_items; i++) { + chomp(items[i]); + } + fclose(fp); + return 1; +} + +int save_ticket_items(const char *filename, int n_items, + int price, char items[MAX_ITEM][MAX_ITEM_LEN]) { + FILE *fp = fopen(filename, "wt"); + int i; + if (!fp) + return 0; + fprintf(fp, "%d\n", price); + for (i = 0; i < n_items; i++) { + fprintf(fp, "%s\n", items[i]); + } + fclose(fp); + return 1; +} + +void create_new_items(char items[MAX_ITEM][MAX_ITEM_LEN], + char ref_items[MAX_ITEM][MAX_ITEM_LEN], + int n_items) { + int i; + int unum = 0; + time4_t now = (time4_t)time(NULL); + + // initialize names by duplicating + for (i = 0; i < n_items; i++) { + strlcpy(items[i], ref_items[i], MAX_ITEM_LEN); + } + + // find last user index + for (i = n_items - 1; i >= 0; i--) { + unum = searchuser(items[i], NULL); + if (VALID_UNUM(unum)) { + unum++; + break; + } + } + log_filef("log/openticket_items.log", LOG_CREAT, + "%s last user index: %d (%s)\n", + Cdatelite(&now), unum, + VALID_UNUM(unum) ? SHM->userid[unum - 2] : "-unkonwn-"); + + // pickup new names + for (i = 0; i < n_items; i++) { + // find next valid unum + for (; VALID_UNUM(unum) && !*SHM->userid[unum - 1]; unum++) { + // find next one + } + if (!VALID_UNUM(unum)) { + strlcpy(items[i], unique_betnames[i], MAX_ITEM_LEN); + // rewind + unum = 1; + log_filef("log/openticket_items.log", LOG_CREAT, + "%s rewind user index.\n", + Cdatelite(&now)); + continue; + } + + strlcpy(items[i], SHM->userid[unum - 1], MAX_ITEM_LEN); + unum ++; + } +} + + +int main() { - int money, bet, n, total = 0, ticket[8] = - {0, 0, 0, 0, 0, 0, 0, 0}; + int money, bet, n, total = 0; + int ticket[MAX_ITEM] = {0}; FILE *fp; time4_t now = (time4_t)time(NULL); - char des[MAX_DES][200] = - {"", "", "", ""}; + char des[MAX_DES][200] = {"", "", "", ""}; + + char newbetname[MAX_ITEM][MAX_ITEM_LEN] = {0}; + char betname[MAX_ITEM][MAX_ITEM_LEN] = { + "Ptt", "Jaky", "Action", "Heat", + "DUNK", "Jungo", "waiting", "wofe", + }; nice(10); - attach_SHM(); - if(passwd_init()) - exit(1); chdir(BBSHOME); // for sethomedir - - rename(BBSHOME "/etc/" FN_TICKET_RECORD, - BBSHOME "/etc/" FN_TICKET_RECORD ".tmp"); - rename(BBSHOME "/etc/" FN_TICKET_USER, - BBSHOME "/etc/" FN_TICKET_USER ".tmp"); + attach_SHM(); + srand(now); - if (!(fp = fopen(BBSHOME "/etc/"FN_TICKET_RECORD ".tmp", "r"))) + load_ticket_items("etc/" FN_TICKET_ITEMS, MAX_ITEM, NULL, betname); + create_new_items(newbetname, betname, MAX_ITEM); + + rename("etc/" FN_TICKET_RECORD, "etc/" FN_TICKET_RECORD ".tmp"); + rename("etc/" FN_TICKET_USER, "etc/" FN_TICKET_USER ".tmp"); + + save_ticket_items("etc/" FN_TICKET_ITEMS, MAX_ITEM, PRICE, newbetname); + + if (!(fp = fopen("etc/"FN_TICKET_RECORD ".tmp", "r"))) return 0; + fscanf(fp, "%9d %9d %9d %9d %9d %9d %9d %9d\n", &ticket[0], &ticket[1], &ticket[2], &ticket[3], &ticket[4], &ticket[5], &ticket[6], &ticket[7]); @@ -50,24 +151,25 @@ int main(int argc, char **argv) if (!total) return 0; - if((fp = fopen(BBSHOME "/etc/" FN_TICKET , "r"))) + if((fp = fopen("etc/" FN_TICKET , "r"))) { for (n = 0; n < MAX_DES && fgets(des[n], 200, fp); n++) ; fclose(fp); } - /* 現在開獎號碼並沒用到 random function. - * 小站的 UTMPnumber 可視為定值, 且 UTMPnumber 預設一秒才更新一次 - * 開站一段時間的開獎 pid 應該無法預測. - * 若是小站當站開獎前開站, 則有被猜中的可能 */ - attach_SHM(); - bet = (SHM->UTMPnumber+getpid()) % 8; - - + if ((fp = fopen("/dev/random", "rb")) != NULL) { + bet = fgetc(fp) % MAX_ITEM; + fclose(fp); + } else { + /* 現在開獎號碼並沒用到 random function. + * 小站的 UTMPnumber 可視為定值, 且 UTMPnumber 預設一秒才更新一次 + * 開站一段時間的開獎 pid 應該無法預測. + * 若是小站當站開獎前開站, 則有被猜中的可能 */ + bet = (SHM->UTMPnumber+getpid()) % MAX_ITEM; + } money = ticket[bet] ? total * 95 / ticket[bet] : 9999999; - - if((fp = fopen(BBSHOME "/etc/" FN_TICKET, "w"))) + if((fp = fopen("etc/" FN_TICKET, "w"))) { if (des[MAX_DES - 1][0]) n = 1; @@ -79,22 +181,22 @@ int main(int argc, char **argv) fputs(des[n], fp); } - printf("\n\n開獎時間: %s \n\n" - "開獎結果: %s \n\n" + printf("\n\n開獎時間: %s\n\n" + "開獎結果: %s\n\n" "下注總金額: %d00 " MONEYNAME "\n" "中獎比例: %d張/%d張 (%f)\n" "每張中獎彩票可得 %d 枚" MONEYNAME "\n\n", Cdatelite(&now), betname[bet], total, ticket[bet], total, (float) ticket[bet] / total, money); - fprintf(fp, "%s 賭盤開出:%s 總金額:%d00 獎金/張:%d 機率:%1.2f\n", + fprintf(fp, "%s 開出:%s 總金額:%d00 獎金/張:%d 機率:%1.2f\n", Cdatelite(&now), betname[bet], total, money, (float) ticket[bet] / total); fclose(fp); } - if (ticket[bet] && (fp = fopen(BBSHOME "/etc/" FN_TICKET_USER ".tmp", "r"))) + if (ticket[bet] && (fp = fopen("etc/" FN_TICKET_USER ".tmp", "r"))) { int mybet, num, uid; char userid[20], genbuf[200]; @@ -105,8 +207,8 @@ int main(int argc, char **argv) if (mybet == bet) { int oldm, newm; - printf("恭喜 %-15s買了%9d 張 %s, 獲得 %d 枚" MONEYNAME "\n" - ,userid, num, betname[mybet], money * num); + printf("恭喜 %-*s 買了%9d 張 %s, 獲得 %d 枚" MONEYNAME "\n", + IDLEN, userid, num, betname[mybet], money * num); if((uid=searchuser(userid, userid))==0 || !is_validuserid(userid)) continue; @@ -125,8 +227,8 @@ int main(int argc, char **argv) strcpy(mymail.owner, BBSNAME); sprintf(mymail.title, "[%s] 中獎囉! $ %d", Cdatelite(&now), money * num); unlink(genbuf); - Link(BBSHOME "/etc/ticket", genbuf); - sprintf(genbuf, BBSHOME "/home/%c/%s/.DIR", userid[0], userid); + Link("etc/ticket", genbuf); + sprintf(genbuf, "home/%c/%s/.DIR", userid[0], userid); append_record(genbuf, &mymail, sizeof(mymail)); sendalert_uid(uid, ALERT_NEW_MAIL); } else { @@ -134,7 +236,7 @@ int main(int argc, char **argv) } } } - unlink(BBSHOME "/etc/" FN_TICKET_RECORD ".tmp"); - unlink(BBSHOME "/etc/" FN_TICKET_USER ".tmp"); + unlink("etc/" FN_TICKET_RECORD ".tmp"); + unlink("etc/" FN_TICKET_USER ".tmp"); return 0; } |