/*-------------------------------------------------------*/
/* menu.c ( NTHU CS MapleBBS Ver 2.36 ) */
/*-------------------------------------------------------*/
/* target : menu/help/movie routines */
/* create : 95/03/29 */
/* update : 95/12/15 */
/*-------------------------------------------------------*/
#include "bbs.h"
/* ------------------------------------- */
/* help & menu processring */
/* ------------------------------------- */
int refscreen = NA;
extern char *boardprefix;
int
egetch()
{
int rval;
while (1)
{
rval = igetkey();
if (talkrequest)
{
talkreply();
refscreen = YEA;
return rval;
}
if (rval != Ctrl('L'))
return rval;
redoscr();
}
}
void
showtitle(title, mid)
char *title, *mid;
{
char buf[40];
int spc, pad;
spc = strlen(mid);
if (title[0] == 0)
title++;
else if (chkmail(0))
{
mid = " 郵差來按鈴囉 ";
/*
* CyberMax:
* spc 是匹配 mid 的大小.
*/
spc = 22;
}
spc = 66 - strlen(title) - spc - strlen(currboard);
/*
woju
*/
if (spc < 0)
spc = 0;
pad = 1 - spc & 1;
memset(buf, ' ', spc >>= 1);
buf[spc] = '\0';
clear();
prints("【%s】%s%s%s%s《%s》\n",
title, buf, mid, buf, " " + pad,
currmode & MODE_SELECT ? "6m系列" : currmode & MODE_ETC ? "5m其他" :
currmode & MODE_DIGEST ? "2m文摘" : "7m看板", currboard);
}
/* ------------------------------------ */
/* 動畫處理 */
/* ------------------------------------ */
#define FILMROW 10
unsigned char menu_row = 12;
unsigned char menu_column = 20;
char mystatus[160];
static int
u_movie()
{
cuser.uflag ^= MOVIE_FLAG;
return 0;
}
/*
===== changer by Ptt, 2/14, '97 =====
*/
movie(i)
int i;
{
extern struct PTTCACHE *ptt;
static short history[MAX_HISTORY];
static char myweek[] = "天一二三四五六";
static char today_is[20] , buf[256],pbuf[256];
struct tm *ptime;
FILE *fp;
time_t now;
resolve_garbage(); /* get ptt cache */
if ((currstat != CLASS) && (cuser.uflag & MOVIE_FLAG))
{
do {
if (!i)
i = (rand() % ptt->max_film) + 1;
for (now = ptt->max_history; now >= 0; now--)
if (i == history[now]) {
i = 0;
break;
}
} while (i == 0);
memcpy(history, &history[1], ptt->max_history * sizeof(short));
history[ptt->max_history] = now = i;
if (i == 999) /* Goodbye my friend */
i = 0;
setapath(pbuf, "Note");
sprintf(buf, "%s/%s", pbuf, ptt->notes[i]);
if (ptt->notes[i][0] && (fp = fopen(buf, "r")))
{
for (i = 1; i < FILMROW + 2 ; i++)
{
move(i, 0);
clrtoeol();
refresh();
if(fgets(buf, ANSILINELEN, fp)) outs(Ptt_prints(buf));
}
fclose(fp);
outs(reset_color);
}
}
time(&now);
ptime = localtime(&now);
i = ptime->tm_wday << 1;
{ char *chr,*msgs[] = {"關閉", "打開", "拔掉", "防水","好友"};
if(currutmp->birth)
{
strcpy(today_is,"生日要請客唷");
}
else
{
strcpy(today_is,ptt->today_is);
}
sprintf(mystatus, "[%d/%d 星期%c%c %d:%02d]%-14s 目前坊裡有 %d 人, 我是%-12s[扣機]%s",
ptime->tm_mon + 1, ptime->tm_mday, myweek[i], myweek[i + 1],
ptime->tm_hour, ptime->tm_min,today_is, count_ulist(), cuser.userid,
msgs[currutmp->pager]);
}
outmsg(mystatus);
refresh();
}
/* ===== end ===== */
static int
show_menu(p)
struct commands *p;
{
register int n = 0;
register char *s;
char *state[4]={"用功\型","安逸型","自定型","SHUTUP"};
char buf[80];
movie(currstat);
/*
move(menu_row, 0);
outs(
" \\ . \\ . \\ . \\ . \\ . \\ .\\ \\. . \\\n"
" \\\\ . \\\\ . \\\\ . \\\\ . \\\\ .\\\\ \\\\ \\\\ \\\\\n"
" \\\\ . \\\\. \\\\ . \\\\ . \\\\ . \\\\ . \\\\ . \\\\ . \\\\\n"
" * . * . * . * . * . * . * . * . *\n"
" . . . . . . . .\n"
" . . . . . . .\n"
" . . . . . . . .\n"
" . . . . . . . . . . . . . . . . .\n\n"
" ___/~\\_/\\____/~\\_/\\____/~\\_/\\____/~\\_/\\____/~\\_/\\____/~\\_/\\____/~\\_/\\____/~\\_/\\____/~\\_/\\_\n"
" _/~~\\_ _/~~\\_ _/~~\\_ _/~~\\_ _/~~\\_ _/~~\\_ _/~~\\_ _/~~\\_ _/~~\\_ _/~~\\_\n");
*/
move(menu_row, 0);
while (s = p[n].desc)
{
if (HAS_PERM(p[n].level))
{
sprintf(buf,s+2,state[cuser.proverb%4]);
prints("%*s (%c)%s\n", menu_column, "", s[1], buf);
}
n++;
}
return n - 1;
}
int
domenu(cmdmode, cmdtitle, cmd, cmdtable)
char *cmdtitle;
int cmdmode, cmd;
struct commands cmdtable[];
{
int lastcmdptr;
int n, pos, total, i;
int err;
int chkmailbox();
static char cmd0[LOGIN];
if (cmd0[cmdmode])
cmd = cmd0[cmdmode];
setutmpmode(cmdmode);
if (cmdmode == CLASS)
{
menu_row = 4;
menu_column = 17;
}
showtitle(cmdtitle, BoardName);
total = show_menu(cmdtable);
outmsg(mystatus);
lastcmdptr = pos = 0;
do
{
i = -1;
switch (cmd)
{
/*
woju
*/
case Ctrl('R'): if (currutmp->msgs[0].last_pid) {
show_last_call_in();
my_write(currutmp->msgs[0].last_pid, "水球丟回去:");
refscreen = YEA;
}
i = lastcmdptr;
break;
case Ctrl('C'):
cal();
i = lastcmdptr;
refscreen = YEA;
break;
case Ctrl('U'):
t_users();
refscreen = YEA;
i = lastcmdptr;
break;
case KEY_ESC:
if (KEY_ESC_arg == 'c')
capture_screen();
else if (KEY_ESC_arg == 'n') {
edit_note();
refscreen = YEA;
}
i = lastcmdptr;
break;
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 (!HAS_PERM(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 (!HAS_PERM(cmdtable[i].level));
break;
case KEY_LEFT:
case 'e':
case 'E':
if (cmdmode == MMENU)
{
cmd = 'G';
}
else if ((cmdmode == MAIL) && chkmailbox())
{
cmd = 'R';
}
else
{
if (cmdmode == CLASS)
{
menu_row = 12;
menu_column = 20;
}
return 0;
}
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)
{
if (cmdmode == CLASS)
boardprefix = cmdtable[lastcmdptr].desc + 2;
move(b_lines, 0);
clrtoeol();
currstat = XMODE;
if ((err = (*cmdtable[lastcmdptr].cmdfunc) ()) == QUIT)
return;
currutmp->mode = currstat = cmdmode;
if (err == XEASY)
{
refresh();
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];
cmd0[cmdmode] = cmdtable[lastcmdptr].desc[0];
}
if (cmd >= 'a' && cmd <= 'z')
cmd &= ~0x20;
while (++i <= total)
{
if (cmdtable[i].desc[1] == cmd)
break;
}
}
if (i > total || !HAS_PERM(cmdtable[i].level))
{
continue;
}
if (refscreen)
{
showtitle(cmdtitle, BoardName);
show_menu(cmdtable);
outmsg(mystatus);
refscreen = NA;
}
cursor_clear(menu_row + pos, menu_column);
/*
woju
move(menu_row + pos, menu_column);
outs(STR_UNCUR);
*/
n = pos = -1;
while (++n <= (lastcmdptr = i))
{
if (HAS_PERM(cmdtable[n].level))
pos++;
}
cursor_show(menu_row + pos, menu_column);
/*
woju
move(menu_row + pos, menu_column);
outs(STR_CURSOR);
*/
/*outmsg(mystatus);*/
} while (((cmd = egetch()) != EOF) || refscreen);
abort_bbs();
}
/* INDENT OFF */
/* ----------------------------------------------------- */
/* administrator's maintain menu */
/* ----------------------------------------------------- */
int m_user(), m_newbrd(), m_board(), m_register(),
x_file(),search_key_user();
/* ,search_bad_id();*/
#ifdef HAVE_ADM_SHELL
int x_csh();
#endif
#ifdef HAVE_MAILCLEAN
int m_mclean();
#endif
#ifdef HAVE_REPORT
int m_trace();
#endif
#ifdef SYS_VOTE
int m_vote();
#endif
static struct commands adminlist[] = {
m_user, PERM_ACCOUNTS, "UUser 使用者資料",
search_key_user,PERM_SYSOP, "SSearch User 特殊搜尋使用者",
/*
search_bad_id,PERM_SYSOP, "SSearch badID 尋找已損毀id",
*/
m_newbrd, PERM_SYSOP, "NNew Board 開闢新看板",
m_board, PERM_SYSOP, "BBoard 設定看板",
m_register, PERM_SYSOP, "RRegister 審核註冊表單",
x_file, PERM_SYSOP, "XXfile 編輯系統檔案",
#ifdef HAVE_MAILCLEAN
m_mclean, PERM_SYSOP, "MMail Clean 清理使用者個人信箱",
#endif
#ifdef HAVE_ADM_SHELL
x_csh, PERM_SYSOP, "SShell 執行系統 Shell",
#endif
#ifdef HAVE_REPORT
m_trace, PERM_SYSOP, "TTrace 設定是否記錄除錯資訊",
#endif
NULL, 0, NULL};
/* ----------------------------------------------------- */
/* class menu */
/* ----------------------------------------------------- */
int board(), local_board(), Boards(), Post(), Read(),
Select(),all_sequential_read();
int New();
static struct commands classlist[] = {
board, PERM_ADMIN, "00市中發電機 《高壓危險,非人可敵》",
board, 0, "11嘰哩呱啦 報告站長!",
/*
board, 0, "22數位精靈 台大資訊系所資訊",
board, 0, "33希臘城邦 校園, 社團",
board, 0, "44異苔同岑 校友, 黑社會, 小團體",
board, 0, "55建北一族 各地建北連誼區",
board, 0, "66西灣風情 全國雄友會專區",
*/
board, 0, "22民族融合 系所, 系所, 系所",
board, 0, "33鴉鴉回憶 校友, 校友, 校友",
board, 0, "44另類社團 服務, 體育, 文藝",
board, 0, "55星星故鄉 星座, 星座, 星座",
board, 0, "66偶像崇拜 港台, 東瀛, 歐美",
board, 0, "77富蘭克林 電腦, 科學, 新知",
board, 0, "88嶽麓書院 書香, 藝術, 音樂",
board, 0, "99陽春白雪 娛樂, 休閒, 運動",
board, 0, "AA男女之間 生活, 聊天, 心情",
board, 0, "OO其他... 前面, 找不, 到的",
/*
local_board, 0, "LL本站專題 所有的Local看版 ",
*/
Boards, 0, "BBoards ─────┬─ 所有看板",
New, 0, "NNew ├─ 閱\讀所有新作品",
/*
all_sequential_read,PERM_SYSOP,
"TThread ├─ 循序閱\讀所有新作品",
*/
Post, PERM_POST, "PPost ├─ 發表文章",
Read, 0, "RRead ├─ 閱\讀文章",
Select, 0, "SSelect └─ 選擇看板",
NULL, 0, NULL};
/* ----------------------------------------------------- */
/* mail menu */
/* ----------------------------------------------------- */
int m_new(), m_read(), m_send(),
/*m_list(),*/
mail_list(), m_sysop(),mail_mbox(),mail_all(),x_love(),setforward();
#ifdef INTERNET_PRIVATE_EMAIL
int m_internet();
#endif
static struct commands maillist[] = {
m_new, PERM_READMAIL, "RNew 閱\讀新進郵件",
m_read, PERM_READMAIL,"RRead 多功\能讀信選單",
m_send, PERM_BASIC, "RSend 站內寄信",
/* m_list, PERM_BASIC, "LList 編輯群組名單",*/
x_love, PERM_LOGINOK, "PPaper 情書產生器 ",
mail_list, PERM_BASIC,"RMail List 群組寄信",
setforward,PERM_LOGINOK,"FForward 設定信箱自動轉寄",
m_sysop, 0, "YYes, sir! 諂媚站長",
#ifdef INTERNET_PRIVATE_EMAIL
m_internet, PERM_INTERNET, "RInternet 寄信到 Internet",
#endif
mail_mbox,PERM_INTERNET, "RZip UserHome 把所有私人資料打包回去",
mail_all, PERM_SYSOP, "RAll 寄信給所有使用者",
NULL, 0, NULL};
/* ----------------------------------------------------- */
/* Talk menu */
/* ----------------------------------------------------- */
int t_users(), t_list(), t_idle(), t_query(), t_monitor();
int t_pager(), t_talk(), t_chat(), t_override(), t_reject();
/* Thor: for ask last call-in message */
int t_display();
#ifdef HAVE_MUD
int x_mud();
#endif
#ifdef HAVE_IRC
int x_irc();
#endif
static struct commands talklist[] = {
t_users, 0, "UUsers 完全聊天手冊",
/*
t_friends, PERM_LOGINOK, "FFriends 探訪親愛好友",
*/
t_monitor, PERM_BASIC, "MMonitor 監視所有站友動態",
t_pager, PERM_BASIC, "PPager 切換呼叫器",
t_idle, 0, "IIdle 發呆",
t_query, 0, "QQuery 查詢網友",
t_talk, PERM_PAGE, "TTalk 找人聊聊",
t_chat, PERM_CHAT, "CChat 找家茶坊喫茶去",
#ifdef HAVE_MUD
x_mud,0 , "VVrChat 虛擬實業聊天廣場",
#endif
t_display, 0, "DDisplay 顯示上幾次熱訊",
NULL, 0, NULL};
/*-------------------------------------------------------*/
/* name menu Ptt */
/* ----------------------------------------------------- */
static int
t_aloha()
{
friend_edit(FRIEND_ALOHA);
}
t_post()
{
friend_edit(FRIEND_POST);
}
t_special()
{
friend_edit(FRIEND_SPECIAL);
}
int x_cdict();
static struct commands namelist[] = {
t_override, PERM_LOGINOK,"OOverRide 好友名單",
t_reject, PERM_LOGINOK, "BBlack 壞人名單",
t_aloha,PERM_LOGINOK, "AALOHA 上站通知名單",
t_post,PERM_LOGINOK, "NNewPost 新文章通知名單",
t_special,PERM_LOGINOK, "SSpecial 其他特別名單",
/*
x_cdict,PERM_LOGINOK, "TTranslator 英漢,漢英翻譯機",
*/
NULL, 0, NULL};
/* ----------------------------------------------------- */
/* User menu */
/* ----------------------------------------------------- */
/* -------------- */
/* 座右銘 */
/*--------------- */
extern int u_switchproverb(),u_editproverb();
int u_info(), u_editsig(), u_editplan(), u_register();
int u_cloak(), u_ansi(), u_movie(), u_list();
/*u_lock()*/
#ifdef HAVE_SUICIDE
int u_kill();
#endif
static struct commands userlist[] = {
u_info, PERM_LOGINOK, "IInfo 設定個人資料與密碼",
u_ansi, 0, "AANSI 切換 ANSI 彩色/黑白模示",
u_movie, 0, "MMovie 切換動畫模示",
#ifdef HAVE_SUICIDE
u_kill, PERM_BASIC, "IKill 自殺!!",
#endif
u_editplan, PERM_LOGINOK, "QQueryEdit 編輯名片檔",
u_editsig, PERM_LOGINOK, "SSignature 編輯簽名檔",
u_switchproverb, PERM_LOGINOK, "PProverbMode 切換座右銘 [%s]",
u_editproverb, PERM_LOGINOK, "RRegProverb 編輯自定座右銘",
u_cloak, PERM_CLOAK, "CCloak 隱身術",
u_register, PERM_BASIC, "RRegister 填寫《註冊申請單》",
u_list, PERM_BASIC, "UUsers 列出註冊名單",
NULL, 0, NULL};
/* ----------------------------------------------------- */
/* XYZ tool menu */
/* ----------------------------------------------------- */
int x_note(), x_issue(), x_week(), x_today(), x_yesterday(),show_hint_message(),
x_user100() ,x_birth(),x_login(),x_boards();
#ifdef HAVE_License
int x_gpl();
#endif
#ifdef HAVE_INFO
int x_program();
#endif
#ifdef SYS_VOTE
int x_vote(), x_results();
#endif
static struct commands xyzlist[] = {
#ifdef HAVE_License
x_gpl, 0, "LLicense GNU 使用執照",
#endif
#ifdef HAVE_INFO
x_program, 0, "PProgram 本程式之版本與版權宣告",
#endif
x_boards,0, "HHot Boards 《看版人氣排行榜》",
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 《使用者百大排行榜》",
x_birth, 0, "BBirthday 《近期壽星大觀》",
show_hint_message,0,"XXHint 《系統功\能精靈》",
NULL, 0, NULL};
/* ----------------------------------------------------- */
/* Ptt Play menu */
/* ----------------------------------------------------- */
/* Ptt */
int x_dict(),note(),x_weather(),x_stock(),x_86(),x_lynx();
#ifdef BBSDOORS
int x_bbsnet();
#endif
#ifdef HAVE_BIG2
int x_big2();
#endif
#ifdef HAVE_MJ
int x_mj();
#endif
#ifdef HAVE_BRIDGE
int x_bridge();
#endif
#ifdef HAVE_GOPHER
int x_gopher();
#endif
#ifdef HAVE_TIN
int x_tin();
#endif
#ifdef HAVE_WWW
int x_www();
#endif
#ifdef HAVE_CAL
extern int cal();
#endif
int x_history();
int x_ipreg();
static struct commands playlist[] = {
note, PERM_LOGINOK, "NNote 【 刻刻流言版 】",
x_history, 0, "HHistory 【 我們的成長 】",
x_weather,0 , "WWeather 【 氣象預報 】",
x_stock,0 , "SStock 【 股市行情 】",
#ifdef HAVE_BIG2
x_big2, 0, "BBig2 【 網路大老二 】",
#endif
#ifdef HAVE_MJ
x_mj, PERM_LOGINOK, "QQkmj 【 網路打麻將 】",
#endif
#ifdef HAVE_BRIDGE
x_bridge, PERM_LOGINOK, "OOkBridge 【 橋牌競技 】",
#endif
#ifdef HAVE_GOPHER
x_gopher, PERM_LOGINOK, "GGopher 【 地鼠資料庫 】 ",
#endif
#ifdef HAVE_TIN
x_tin, PERM_LOGINOK, "NNEWS 【 網際新聞 】",
#endif
#ifdef BBSDOORS
x_bbsnet, PERM_LOGINOK, "BBBSNet 【 其他 BBS站 】",
#endif
#ifdef HAVE_CAL
cal,0 , "CCaluate 【 計算機 】",
#endif
#ifdef HAVE_WWW
x_www, PERM_LOGINOK, "WWWW Browser 【 汪汪汪 】",
#endif
x_dict,0, "DDictionary 【 趣味大字典 】",
x_ipreg, PERM_LOGINOK, "IIP address 【申請ipaddress】",
x_86,PERM_LOGINOK, "886 JCEE 【86學年度大學聯招查榜系統】",
NULL, 0, NULL};
/* ----------------------------------------------------- */
/* main menu */
/* ----------------------------------------------------- */
static int
admin()
{
domenu(ADMIN, "系統維護", 'X', adminlist);
return 0;
}
static int
Class()
{
domenu(CLASS, "分類看板", '1', classlist);
return 0;
}
static int
Mail()
{
domenu(MAIL, "電子郵件", 'R', maillist);
return 0;
}
static int
Talk()
{
domenu(TMENU, "聊天說話", 'U', talklist);
return 0;
}
static int
User()
{
domenu(UMENU, "個人設定", 'A', userlist);
return 0;
}
static int
Xyz()
{
domenu(XMENU, "工具程式", 'N', xyzlist);
return 0;
}
/* Ptt */
static int
Play_Play()
{
domenu(PMENU, "網路遊樂場", 'B', playlist);
return 0;
}
static int
Name_Menu()
{
domenu(NMENU, "白色恐怖", 'O', namelist);
return 0;
}
int Announce(), Boards(), Goodbye(), Welcome();
struct commands cmdlist[] = {
admin,PERM_ADMIN, "00Admin 【 系統維護區 】",
Announce, 0, "AAnnounce 【 精華公佈欄 】",
Boards, 0, "BBoards 【 佈告討論區 】",
Class, 0, "CClass 【 分組討論區 】",
Mail, PERM_BASIC, "MMail 【 私人信件區 】",
Talk, 0, "TTalk 【 休閒聊天區 】",
User, 0, "UUser 【 個人設定區 】",
Xyz, 0, "XXyz 【 系統工具區 】",
/* Ptt */
Play_Play,0, "PPlay 【 網路遊樂場 】",
Name_Menu,PERM_LOGINOK, "NNamelist 【 編特別名單 】",
/*
Welcome, 0, "WWelcome 觀賞歡迎畫面",
*/
Goodbye, 0, "GGoodbye 離開,再見……",
NULL, 0, NULL};
/* INDENT ON */