diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2008-03-20 19:33:49 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2008-03-20 19:33:49 +0800 |
commit | 6c7b18b32d87c2a835f7e5c48faac4a8ad44668b (patch) | |
tree | e88e1b2b1007f4ddcd348a4a1bf1d13c515c4564 /console/menu.c | |
parent | f59699c22c130373cda3cc4cb6fab5bae510bd5a (diff) | |
download | pttbbs-piaip.newlayout.tar pttbbs-piaip.newlayout.tar.gz pttbbs-piaip.newlayout.tar.bz2 pttbbs-piaip.newlayout.tar.lz pttbbs-piaip.newlayout.tar.xz pttbbs-piaip.newlayout.tar.zst pttbbs-piaip.newlayout.zip |
- (internal/exp) first draft of new layoutpiaip.newlayout
git-svn-id: http://opensvn.csie.org/pttbbs/branches/piaip.newlayout@4013 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'console/menu.c')
-rw-r--r-- | console/menu.c | 718 |
1 files changed, 718 insertions, 0 deletions
diff --git a/console/menu.c b/console/menu.c new file mode 100644 index 00000000..6aaf3399 --- /dev/null +++ b/console/menu.c @@ -0,0 +1,718 @@ +/* $Id$ */ +#include "bbs.h" + +#define CheckMenuPerm(x) \ + ( (x == MENU_UNREGONLY)? \ + ((cuser.userlevel == 0 ||HasUserPerm(PERM_LOGINOK))?0:1) :\ + ((x) ? HasUserPerm(x) : 1)) + +/* help & menu processring */ +static int refscreen = NA; +extern char *boardprefix; +extern struct utmpfile_t *utmpshm; + +static const char *title_tail_msgs[] = { + "看板", + "系列", + "文摘", +}; +static const char *title_tail_attrs[] = { + ANSI_COLOR(37), + ANSI_COLOR(32), + ANSI_COLOR(36), +}; +enum { + TITLE_TAIL_BOARD = 0, + TITLE_TAIL_SELECT, + TITLE_TAIL_DIGEST, +}; + +void +showtitle(const char *title, const char *mid) +{ + /* we have to... + * - display title in left, cannot truncate. + * - display mid message, cannot truncate + * - display tail (board info), if possible. + */ + int llen, rlen, mlen, mpos = 0; + int pos = 0; + int tail_type; + const char *mid_attr = ANSI_COLOR(33); + int is_currboard_special = 0; + char buf[64]; + + + /* prepare mid */ +#ifdef DEBUG + { + sprintf(buf, " current pid: %6d ", getpid()); + mid = buf; + mid_attr = ANSI_COLOR(41;5); + } +#else + if (ISNEWMAIL(currutmp)) { + mid = " 你有新信件 "; + mid_attr = ANSI_COLOR(41;5); + } else if ( HasUserPerm(PERM_ACCTREG) ) { + int nreg = dashs((char *)fn_register) / 163; + if(nreg > 100) + { + sprintf(buf, " 有 %03d 未審核 ", nreg); + mid_attr = ANSI_COLOR(41;5); + mid = buf; + } + } +#endif + + /* prepare tail */ + if (currmode & MODE_SELECT) + tail_type = TITLE_TAIL_SELECT; + else if (currmode & MODE_DIGEST) + tail_type = TITLE_TAIL_DIGEST; + else + tail_type = TITLE_TAIL_BOARD; + + if(currbid > 0) + { + assert(0<=currbid-1 && currbid-1<MAX_BOARD); + is_currboard_special = ( + (getbcache(currbid)->brdattr & BRD_HIDE) && + (getbcache(currbid)->brdattr & BRD_POSTMASK)); + } + + /* now, calculate real positioning info */ + llen = strlen(title); + mlen = strlen(mid); + mpos = (t_columns -1 - mlen)/2; + + /* first, print left. */ + clear(); + outs(TITLE_COLOR "【"); + outs(title); + outs("】"); + pos = llen + 4; + + /* print mid */ + while(pos++ < mpos) + outc(' '); + outs(mid_attr); + outs(mid); + pos += mlen; + outs(TITLE_COLOR); + + /* try to locate right */ + rlen = strlen(currboard) + 4 + 4; + if(currboard[0] && pos+rlen < t_columns) + { + // print right stuff + while(pos++ < t_columns-rlen) + outc(' '); + outs(title_tail_attrs[tail_type]); + outs(title_tail_msgs[tail_type]); + outs("《"); + + if (is_currboard_special) + outs(ANSI_COLOR(32)); + outs(currboard); + outs(title_tail_attrs[tail_type]); + outs("》" ANSI_RESET "\n"); + } else { + // just pad it. + while(pos++ < t_columns) + outc(' '); + outs(ANSI_RESET "\n"); + } + +} + +/* 動畫處理 */ +#define FILMROW 11 +static const unsigned char menu_row = 12; +static const unsigned char menu_column = 20; + +static void +show_status(void) +{ + int i; + struct tm *ptime = localtime4(&now); + char mystatus[160]; + char *myweek = "天一二三四五六"; + const char *msgs[] = {"關閉", "打開", "拔掉", "防水", "好友"}; + + i = ptime->tm_wday << 1; + snprintf(mystatus, sizeof(mystatus), + ANSI_COLOR(34;46) "[%d/%d 星期%c%c %d:%02d]" + ANSI_COLOR(1;33;45) "%-14s" + ANSI_COLOR(30;47) " 線上" ANSI_COLOR(31) + "%d" ANSI_COLOR(30) "人, 我是" ANSI_COLOR(31) "%s" + ANSI_COLOR(30) , + ptime->tm_mon + 1, ptime->tm_mday, myweek[i], myweek[i + 1], + ptime->tm_hour, ptime->tm_min, currutmp->birth ? + "生日要請客唷" : SHM->today_is, + SHM->UTMPnumber, cuser.userid); + outmsg(mystatus); + i = strlen(mystatus) - (3*7+25); // 3 = ANSI_COLOR, 25 = stuff inside + sprintf(mystatus, "[扣機]" ANSI_COLOR(31) "%s ", + msgs[currutmp->pager]); + outslr("", i, mystatus, strlen(msgs[currutmp->pager]) + 7); + outs(ANSI_RESET); +} + +/* + * current caller of movie: + * board.c: movie(0); // called when IN_CLASSROOT() + * // with currstat = CLASS -> don't show movies + * xyz.c: movie(999999); // logout + * menu.c: movie(cmdmode); // ... + */ +void +movie(int cmdmode) +{ + // movie 前幾筆是 Note 板精華區「<系統> 動態看板」(SYS) 目錄下的文章 + // movie_map 是用來依 cmdmode 挑出特定的動態看板,index 跟 mode_map 一樣。 + const int movie_map[] = { + 2, 10, 11, -1, 3, -1, 12, + 7, 9, 8, 4, 5, 6, + }; + +#define N_SYSMOVIE (sizeof(movie_map) / sizeof(movie_map[0])) + int i; + if ((currstat != CLASS) && (cuser.uflag & MOVIE_FLAG) && + !SHM->Pbusystate && SHM->last_film > 0) { + if (cmdmode < N_SYSMOVIE && + 0 < movie_map[cmdmode] && movie_map[cmdmode] <= SHM->last_film) { + i = movie_map[cmdmode]; + } else if (cmdmode == 999999) { /* Goodbye my friend */ + i = 0; + } else { + i = N_SYSMOVIE + (int)(((float)SHM->last_film - N_SYSMOVIE + 1) * (random() / (RAND_MAX + 1.0))); + } +#undef N_SYSMOVIE + + move(1, 0); + clrtoln(1 + FILMROW); /* 清掉上次的 */ + out_lines(SHM->notes[i], 11); /* 只印11行就好 */ + outs(reset_color); + } + show_status(); + refresh(); +} + +typedef struct { + int (*cmdfunc)(); + int level; + char *desc; /* next/key/description */ +} commands_t; + +static int +show_menu(int moviemode, const commands_t * p) +{ + register int n = 0; + register char *s; + + movie(moviemode); + + move(menu_row, 0); + while ((s = p[n].desc)) { + if (CheckMenuPerm(p[n].level)) { + prints("%*s (" ANSI_COLOR(1;36) "%c" ANSI_COLOR(0) ")%s\n", menu_column, "", s[1], + s+2); + } + n++; + } + return n - 1; +} + + +enum { + M_ADMIN = 0, M_AMUSE, M_CHC, M_JCEE, M_MAIL, M_MMENU, M_NMENU, + M_PMENU, M_PSALE, M_SREG, M_TMENU, M_UMENU, M_XMENU, M_XMAX +}; + +static const int mode_map[] = { + ADMIN, AMUSE, CHC, JCEE, MAIL, MMENU, NMENU, + PMENU, PSALE, SREG, TMENU, UMENU, XMENU, +}; + +static void +domenu(int cmdmode, const char *cmdtitle, int cmd, const commands_t cmdtable[]) +{ + int lastcmdptr, moviemode; + int n, pos, total, i; + int err; + + moviemode = cmdmode; + assert(cmdmode < M_XMAX); + cmdmode = mode_map[cmdmode]; + + setutmpmode(cmdmode); + + showtitle(cmdtitle, BBSName); + + total = show_menu(moviemode, cmdtable); + + show_status(); + lastcmdptr = pos = 0; + + do { + i = -1; + switch (cmd) { + case Ctrl('I'): + t_idle(); + refscreen = YEA; + i = lastcmdptr; + break; + case Ctrl('N'): + New(); + refscreen = YEA; + i = lastcmdptr; + break; + case Ctrl('A'): + if (mail_man() == FULLUPDATE) + refscreen = YEA; + i = lastcmdptr; + break; + case KEY_DOWN: + i = lastcmdptr; + case KEY_HOME: + case KEY_PGUP: + do { + if (++i > total) + i = 0; + } while (!CheckMenuPerm(cmdtable[i].level)); + break; + case KEY_END: + case KEY_PGDN: + i = total; + break; + case KEY_UP: + i = lastcmdptr; + do { + if (--i < 0) + i = total; + } while (!CheckMenuPerm(cmdtable[i].level)); + break; + case KEY_LEFT: + case 'e': + case 'E': + if (cmdmode == MMENU) + cmd = 'G'; + else if ((cmdmode == MAIL) && chkmailbox()) + cmd = 'R'; + else + return; + default: + if ((cmd == 's' || cmd == 'r') && + (currstat == MMENU || currstat == TMENU || currstat == XMENU)) { + if (cmd == 's') + ReadSelect(); + else + Read(); + refscreen = YEA; + i = lastcmdptr; + break; + } + if (cmd == '\n' || cmd == '\r' || cmd == KEY_RIGHT) { + move(b_lines, 0); + clrtoeol(); + + currstat = XMODE; + + if ((err = (*cmdtable[lastcmdptr].cmdfunc) ()) == QUIT) + return; + currutmp->mode = currstat = cmdmode; + + if (err == XEASY) { + refresh(); + safe_sleep(1); + } else if (err != XEASY + 1 || err == FULLUPDATE) + refscreen = YEA; + + if (err != -1) + cmd = cmdtable[lastcmdptr].desc[0]; + else + cmd = cmdtable[lastcmdptr].desc[1]; + } + if (cmd >= 'a' && cmd <= 'z') + cmd &= ~0x20; + while (++i <= total) + if (cmdtable[i].desc[1] == cmd) + break; + + if (!CheckMenuPerm(cmdtable[i].level)) { + for (i = 0; cmdtable[i].desc; i++) + if (CheckMenuPerm(cmdtable[i].level)) + break; + if (!cmdtable[i].desc) + return; + } + + if (cmd == 'H' && i > total){ + /* TODO: Add menu help */ + } + } + + if (i > total || !CheckMenuPerm(cmdtable[i].level)) + continue; + + if (refscreen) { + showtitle(cmdtitle, BBSName); + + show_menu(moviemode, cmdtable); + + show_status(); + refscreen = NA; + } + cursor_clear(menu_row + pos, menu_column); + n = pos = -1; + while (++n <= (lastcmdptr = i)) + if (CheckMenuPerm(cmdtable[n].level)) + pos++; + + cursor_show(menu_row + pos, menu_column); + } while (((cmd = igetch()) != EOF) || refscreen); + + abort_bbs(0); +} +/* INDENT OFF */ + +/* administrator's maintain menu */ +static const commands_t adminlist[] = { + {m_user, PERM_SYSOP, "UUser 使用者資料"}, + {search_user_bypwd, PERM_ACCOUNTS|PERM_POLICE_MAN, + "SSearch User 特殊搜尋使用者"}, + {search_user_bybakpwd,PERM_ACCOUNTS,"OOld User data 查閱\備份使用者資料"}, + {m_board, PERM_SYSOP|PERM_BOARD, "BBoard 設定看板"}, + {m_register, PERM_ACCOUNTS|PERM_ACCTREG, + "RRegister 審核註冊表單"}, + {cat_register, PERM_SYSOP, "CCatregister 無法審核時用的"}, + {x_file, PERM_SYSOP|PERM_VIEWSYSOP, + "XXfile 編輯系統檔案"}, + {give_money, PERM_SYSOP|PERM_VIEWSYSOP, + "GGivemoney 紅包雞"}, + {m_loginmsg, PERM_SYSOP, "MMessage Login 進站水球"}, + {NULL, 0, NULL} +}; + +/* mail menu */ +static const commands_t maillist[] = { + {m_new, PERM_READMAIL, "RNew 閱\讀新進郵件"}, + {m_read, PERM_READMAIL, "RRead 多功\能讀信選單"}, + {m_send, PERM_LOGINOK, "RSend 站內寄信"}, + {mail_list, PERM_LOGINOK, "RMail List 群組寄信"}, + {x_love, PERM_LOGINOK, "PPaper 情書產生器"}, + {setforward, PERM_LOGINOK, "FForward " ANSI_COLOR(1;32) + "設定信箱自動轉寄" ANSI_RESET}, + {m_sysop, 0, "YYes, sir! 寫信給站長"}, + {m_internet, PERM_INTERNET, "RInternet 寄信到站外"}, + {mail_mbox, PERM_INTERNET, "RZip UserHome 把所有私人資料打包回去"}, + {built_mail_index, PERM_LOGINOK, "SSavemail 重建信箱索引"}, + {mail_all, PERM_SYSOP, "RAll 寄信給所有使用者"}, + {NULL, 0, NULL} +}; + +/* Talk menu */ +static const commands_t talklist[] = { + {t_users, 0, "UUsers 完全聊天手冊"}, + {t_pager, PERM_BASIC, "PPager 切換呼叫器"}, + {t_idle, 0, "IIdle 發呆"}, + {t_query, 0, "QQuery 查詢網友"}, + {t_qchicken, 0, "WWatch Pet 查詢寵物"}, + // PERM_PAGE - 水球都要 PERM_LOGIN 了 + // 沒道理可以 talk 不能水球。 + {t_talk, PERM_LOGINOK, "TTalk 找人聊聊"}, + // PERM_CHAT 非 login 也有,會有人用此吵別人。 + {t_chat, PERM_LOGINOK, "CChat 找家茶坊喫茶去"}, +#ifdef PLAY_ANGEL + {t_changeangel, PERM_LOGINOK, "UAChange Angel 更換小天使"}, + {t_angelmsg, PERM_ANGEL, "LLeave message 留言給小主人"}, +#endif + {t_display, 0, "DDisplay 顯示上幾次熱訊"}, + {NULL, 0, NULL} +}; + +/* name menu */ +static int t_aloha() { + friend_edit(FRIEND_ALOHA); + return 0; +} + +static int t_special() { + friend_edit(FRIEND_SPECIAL); + return 0; +} + +static const commands_t namelist[] = { + {t_override, PERM_LOGINOK,"OOverRide 好友名單"}, + {t_reject, PERM_LOGINOK, "BBlack 壞人名單"}, + {t_aloha,PERM_LOGINOK, "AALOHA 上站通知名單"}, + {t_fix_aloha,PERM_LOGINOK,"XXFixALOHA 修正上站通知"}, + {t_special,PERM_LOGINOK, "SSpecial 其他特別名單"}, + {NULL, 0, NULL} +}; + +void Customize(); // user.c +int u_customize() +{ + Customize(); + return 0; +} + +int u_fixgoodpost(void); // assess.c +/* User menu */ +static const commands_t userlist[] = { + {u_customize, PERM_BASIC, "UUCustomize 個人化設定"}, + {u_info, PERM_LOGINOK, "IInfo 設定個人資料與密碼"}, + {calendar, PERM_LOGINOK, "CCalendar 個人行事曆"}, + {u_loginview, PERM_BASIC, "LLogin View 選擇進站畫面"}, + {u_editplan, PERM_LOGINOK, "QQueryEdit 編輯名片檔"}, + {u_editsig, PERM_LOGINOK, "SSignature 編輯簽名檔"}, +#if HAVE_FREECLOAK + {u_cloak, PERM_LOGINOK, "KKCloak 隱身術"}, +#else + {u_cloak, PERM_CLOAK, "KKCloak 隱身術"}, +#endif + {u_register, MENU_UNREGONLY, "RRegister 填寫《註冊申請單》"}, +#ifdef ASSESS + {u_cancelbadpost, PERM_LOGINOK, "BBye BadPost 申請刪除劣文"}, + {u_fixgoodpost, PERM_LOGINOK, "FFix GoodPost 修復優文"}, +#endif // ASSESS + {u_list, PERM_SYSOP, "XUsers 列出註冊名單"}, +#ifdef MERGEBBS +// {m_sob, PERM_LOGUSER|PERM_SYSOP, "SSOB Import 沙灘變身術"}, + {m_sob, PERM_BASIC, "SSOB Import 沙灘變身術"}, +#endif + {NULL, 0, NULL} +}; + +#ifdef DEBUG +int _debug_check_keyinput(); +int _debug_testregcode(); +int _debug_reportstruct() +{ + clear(); + prints("boardheader_t:\t%d\n", sizeof(boardheader_t)); + prints("fileheader_t:\t%d\n", sizeof(fileheader_t)); + prints("userinfo_t:\t%d\n", sizeof(userinfo_t)); + prints("screenline_t:\t%d\n", sizeof(screenline_t)); + prints("SHM_t:\t%d\n", sizeof(SHM_t)); + prints("bid_t:\t%d\n", sizeof(bid_t)); + prints("userec_t:\t%d\n", sizeof(userec_t)); + pressanykey(); + return 0; +} + +#endif + +/* XYZ tool menu */ +static const commands_t xyzlist[] = { +#ifndef DEBUG + /* All these are useless in debug mode. */ +#ifdef HAVE_LICENSE + {x_gpl, 0, "LLicense GNU 使用執照"}, +#endif +#ifdef HAVE_INFO + {x_program, 0, "PProgram 本程式之版本與版權宣告"}, +#endif + {x_boardman,0, "MMan Boards 《看板精華區排行榜》"}, +// {x_boards,0, "HHot Boards 《看板人氣排行榜》"}, + {x_history, 0, "HHistory 《我們的成長》"}, + {x_note, 0, "NNote 《酸甜苦辣流言板》"}, + {x_login,0, "SSystem 《系統重要公告》"}, + {x_week, 0, "WWeek 《本週五十大熱門話題》"}, + {x_issue, 0, "IIssue 《今日十大熱門話題》"}, + {x_today, 0, "TToday 《今日上線人次統計》"}, + {x_yesterday, 0, "YYesterday 《昨日上線人次統計》"}, + {x_user100 ,0, "UUsers 《使用者百大排行榜》"}, +#else + {_debug_check_keyinput, 0, + "MMKeycode 檢查按鍵控制碼工具"}, + {_debug_testregcode, 0, + "RRegcode 檢查註冊碼公式"}, + {_debug_reportstruct, 0, + "RReportStruct 報告各種結構的大小"}, +#endif + + {p_sysinfo, 0, "XXinfo 《查看系統資訊》"}, + {NULL, 0, NULL} +}; + +/* Ptt money menu */ +static const commands_t moneylist[] = { + {p_give, 0, "00Give 給其他人錢"}, + {save_violatelaw, 0,"11ViolateLaw 繳罰單"}, +#if !HAVE_FREECLOAK + {p_cloak, 0, "22Cloak 切換 隱身/現身 $19 /次"}, +#endif + {p_from, 0, "33From 暫時修改故鄉 $49 /次"}, + {ordersong,0, "44OSong 歐桑動態點歌機 $200 /次"}, + {p_exmail, 0, "55Exmail 購買信箱 $1000/封"}, + {NULL, 0, NULL} +}; + +static const commands_t cmdlist[] = { + {admin, PERM_SYSOP|PERM_ACCOUNTS|PERM_BOARD|PERM_VIEWSYSOP|PERM_ACCTREG|PERM_POLICE_MAN, + "00Admin 【 系統維護區 】"}, + {Announce, 0, "AAnnounce 【 精華公佈欄 】"}, +#ifdef DEBUG + {Favorite, 0, "FFavorite 【 我的最不愛 】"}, +#else + {Favorite, 0, "FFavorite 【 我 的 最愛 】"}, +#endif + {Class, 0, "CClass 【 分組討論區 】"}, + {Mail, PERM_BASIC, "MMail 【 私人信件區 】"}, + {Talk, 0, "TTalk 【 休閒聊天區 】"}, + {User, PERM_BASIC, "UUser 【 個人設定區 】"}, + {Xyz, 0, "XXyz 【 系統資訊區 】"}, + {Play_Play, PERM_LOGINOK, "PPlay 【 娛樂與休閒 】"}, + {Name_Menu, PERM_LOGINOK, "NNamelist 【 編特別名單 】"}, +#ifdef DEBUG + {Goodbye, 0, "GGoodbye 再見再見再見再見"}, +#else + {Goodbye, 0, "GGoodbye 離開,再見… "}, +#endif + {NULL, 0, NULL} +}; + +int main_menu(void) { + domenu(M_MMENU, "主功\能表", (ISNEWMAIL(currutmp) ? 'M' : 'C'), cmdlist); + return 0; +} + +static int p_money() { + domenu(M_PSALE, BBSMNAME2 "量販店", '0', moneylist); + return 0; +}; + +// static int forsearch(); +static int playground(); +static int chessroom(); + +/* Ptt Play menu */ +static const commands_t playlist[] = { + {note, PERM_LOGINOK, "NNote 【 刻刻流言板 】"}, + /* // useless. + {forsearch,PERM_LOGINOK, "SSearchEngine【" ANSI_COLOR(1;35) " " + BBSMNAME2 "搜尋器 " ANSI_RESET "】"}, + */ + {topsong,PERM_LOGINOK, "TTop Songs 【" ANSI_COLOR(1;32) " 點歌排行榜 " ANSI_RESET "】"}, + {p_money,PERM_LOGINOK, "PPay 【" ANSI_COLOR(1;31) " " + BBSMNAME2 "量販店 " ANSI_RESET "】"}, + {chicken_main,PERM_LOGINOK, "CChicken " + "【" ANSI_COLOR(1;34) " " BBSMNAME2 "養雞場 " ANSI_RESET "】"}, + {playground,PERM_LOGINOK, "AAmusement 【" ANSI_COLOR(1;33) " " + BBSMNAME2 "遊樂場 " ANSI_RESET "】"}, + {chessroom, PERM_LOGINOK, "BBChess 【" ANSI_COLOR(1;34) " " + BBSMNAME2 "棋院 " ANSI_RESET "】"}, + {NULL, 0, NULL} +}; + +static const commands_t chesslist[] = { + {chc_main, PERM_LOGINOK, "11CChessFight 【" ANSI_COLOR(1;33) " 象棋邀局 " ANSI_RESET "】"}, + {chc_personal, PERM_LOGINOK, "22CChessSelf 【" ANSI_COLOR(1;34) " 象棋打譜 " ANSI_RESET "】"}, + {chc_watch, PERM_LOGINOK, "33CChessWatch 【" ANSI_COLOR(1;35) " 象棋觀棋 " ANSI_RESET "】"}, + {gomoku_main, PERM_LOGINOK, "44GomokuFight 【" ANSI_COLOR(1;33) "五子棋邀局" ANSI_RESET "】"}, + {gomoku_personal, PERM_LOGINOK, "55GomokuSelf 【" ANSI_COLOR(1;34) "五子棋打譜" ANSI_RESET "】"}, + {gomoku_watch, PERM_LOGINOK, "66GomokuWatch 【" ANSI_COLOR(1;35) "五子棋觀棋" ANSI_RESET "】"}, + {gochess_main, PERM_LOGINOK, "77GoChessFight 【" ANSI_COLOR(1;33) " 圍棋邀局 " ANSI_RESET "】"}, + {gochess_personal, PERM_LOGINOK, "88GoChessSelf 【" ANSI_COLOR(1;34) " 圍棋打譜 " ANSI_RESET "】"}, + {gochess_watch, PERM_LOGINOK, "99GoChessWatch 【" ANSI_COLOR(1;35) " 圍棋觀棋 " ANSI_RESET "】"}, + {NULL, 0, NULL} +}; + +static int chessroom() { + domenu(M_CHC, BBSMNAME2 "棋院", '1', chesslist); + return 0; +} + +static const commands_t plist[] = { + +/* {p_ticket_main, PERM_LOGINOK,"00Pre 【 總統機 】"}, + {alive, PERM_LOGINOK, "00Alive 【 訂票雞 】"}, +*/ + {ticket_main, PERM_LOGINOK, "11Gamble 【 " BBSMNAME2 "賭場 】"}, + {guess_main, PERM_LOGINOK, "22Guess number【 猜數字 】"}, + {othello_main, PERM_LOGINOK, "33Othello 【 黑白棋 】"}, +// {dice_main, PERM_LOGINOK, "44Dice 【 玩骰子 】"}, + {vice_main, PERM_LOGINOK, "44Vice 【 發票對獎 】"}, + {g_card_jack, PERM_LOGINOK, "55Jack 【 黑傑克 】"}, + {g_ten_helf, PERM_LOGINOK, "66Tenhalf 【 十點半 】"}, + {card_99, PERM_LOGINOK, "77Nine 【 九十九 】"}, + {NULL, 0, NULL} +}; + +static int playground() { + domenu(M_AMUSE, BBSMNAME2 "遊樂場",'1',plist); + return 0; +} + +static const commands_t slist[] = { + /* + // x_dict: useless + {x_dict,0, "11Dictionary " + "【" ANSI_COLOR(1;33) " 趣味大字典 " ANSI_RESET "】"}, + */ + {x_mrtmap, 0, "22MRTmap " + "【" ANSI_COLOR(1;34) " 捷運地圖 " ANSI_RESET "】"}, + {NULL, 0, NULL} +}; + +/* // nothing to search... +static int forsearch() { + domenu(M_SREG, BBSMNAME2 "搜尋器", '1', slist); + return 0; +} +*/ + +/* main menu */ + +int +admin(void) +{ + domenu(M_ADMIN, "系統維護", 'X', adminlist); + return 0; +} + +int +Mail(void) +{ + domenu(M_MAIL, "電子郵件", 'R', maillist); + return 0; +} + +int +Talk(void) +{ + domenu(M_TMENU, "聊天說話", 'U', talklist); + return 0; +} + +int +User(void) +{ + domenu(M_UMENU, "個人設定", 'U', userlist); + return 0; +} + +int +Xyz(void) +{ + domenu(M_XMENU, "工具程式", 'M', xyzlist); + return 0; +} + +int +Play_Play(void) +{ + domenu(M_PMENU, "網路遊樂場", 'A', playlist); + return 0; +} + +int +Name_Menu(void) +{ + domenu(M_NMENU, "白色恐怖", 'O', namelist); + return 0; +} + |