web增加“BBS網絡聊天室”功能

發信人: chutium (秋天|阿新是誰?), 信區: BBSDev
標  題: web下增加 BBS網絡聊天室 功能
發信站: 鄭大綠城 BBS (Mon Sep  6 07:37:55 2004), 本站(bbs.zzu.edu.cn)

必須是註冊用戶才能使用本功能

登陸後,在 談天說地 -> BBS網絡聊天室 打開即可
這個聊天程序可以與telnet模式下的聊天室同步,用戶可同時在telnet或web彼此聊天。


1.proto.h
diff proto.h proto.h.bak
458,459d457
< /* bbschat.c */
< int bbschat_main(void);


2.bbsmain.c
diff bbsmain.c bbsmain.c.bak
59c59
<       {bbschat_main, {"bbschat", NULL}},
---
>       //{bbschat_main, {"bbschat", NULL}},


3.bbsleft.c
150,153d151
< if (currentuser->userlevel & PERM_CHAT) {
< printf
<     ("&nbsp;&nbsp;<a href=bbschat target=f3>BBS網絡聊天室</a><br>/n");
< }


4.bbschat.c
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include "bbslib.h"
static int chat_fd;
static int test=0;
static char genbuf[1024];

int bbschat_main() {
char t[80];
int pid;
html_header(1);
if(!loginok || isguest) {
http_fatal("錯誤,請先登錄");
}
changemode(CHAT2);
strsncpy(t, getparm("t"), 80);
pid=atoi(getparm("pid"));
if(pid==0) reg();
if(pid>0)
if(kill(pid, 0)!=0) {
printf("<script>top.location='about:您已經斷線或已有1個窗口進入聊天室了.'</script>");
exit(0);
}
        if(!strcmp(t, "frm")) show_frm(pid);
if(!strcmp(t, "chatsnd")) chatsnd(pid);
if(!strcmp(t, "frame_input")) frame_input(pid);
if(!strcmp(t, "chatrefresh")) {test=1;chatrefresh(pid);}
printf("err cmd");
return 0;
}

int reg() {
int n, pid;
if((pid=fork())) {
sprintf(genbuf, "bbschat?pid=%d&t=frm", pid);
redirect(genbuf);
http_quit();
}
for(n=0; n<1024; n++) close(n);
pid=getpid();
agent(pid);
exit(0);
}

int show_frm(int pid) {
printf("<frameset rows=0,0,*,48,16 frameborder=0>"
"<frame name=hide src=''>"
"<frame name=hide2 src=''>"
"<frame name=main src=''>"
"<frame scrolling=auto marginheight=1 framespacing=1 name=input src=bbschat?t=frame_input&pid=%d>"
"<frame scrolling=no marginwidth=4 marginheight=1 framespacing=1 name=foot src=bbsfoot>"
"</frameset>"
"</html>", pid);
http_quit();
return 0;
}

int frame_input(int pid) {
printf("<script>
function r1() {
top.hide2.location='bbschat?t=chatrefresh&pid=%d';
setTimeout('r1()', 10000);
}
setTimeout('r1()', 500);
</script>
<body οnlοad='document.form1.in1.focus()'>
<nobr>
<form οnsubmit='add_cc()' name=form1 action=bbschat?pid=%d&t=chatsnd method=post target=hide>
&nbsp;Input: <input name=in1 maxlength=60 size=56>
<input type=submit value=發送>
<script>
var cc, cc2;
cc='';
function add_cc0(x1, x) {
cc2=x1;
cc=x;
}
function do_quit() {
if(confirm('您真的要退出了嗎?')) {
form1.in1.value='/b';
form1.submit();
}
}
function do_help() {
open('/chathelp.html', '_blank', 
'toolbar=yes,location=no,status=no,menubar=no,scrollbar=auto,resizable=yes,width=620,height=400');
}
function do_alias(x) {
form1.in1.value=x;
form1.submit();
}
function do_room() {
xx=prompt('請輸入包廂名稱','');
if(xx=='' || xx==null) return;
form1.in1.value='/j '+ xx;
form1.submit();
}
function do_user() {
form1.in1.value='/l';
form1.submit();
}
function do_r() {
form1.in1.value='/r';
form1.submit();
}
function do_w() {
form1.in1.value='/w';
form1.submit();
}
function do_msg() {
xx=prompt('給誰丟小紙條','');
if(xx=='' || xx==null) return;
yy=prompt('什麼內容','');
if(yy=='' || xx==null) return;
form1.in1.value='/m '+xx+' '+yy;
form1.submit();
}
function do_n() {
xx=prompt('你想改成什麼名字?','');
if(xx=='' || xx==null) return;
form1.in1.value='/n '+xx;
form1.submit();
}
function do_pic() {
xx=prompt('請輸入圖片的URL地址:','http://');
if(xx=='http://' || xx=='' || xx==null) return;
form1.in1.value='<img src='+xx+'>';
form1.submit();
}
</script>
<select onChange='do_alias(this.options[this.selectedIndex].value);this.selectedIndex=0;'>
        <option value=' ' selected>聊天動作</option>
        <option value='//hehe'>呵呵的傻笑</option>
<option value='//faint'>要暈倒了</option>
<option value='//ep'>要睡着了</option>
<option value='//:D'>樂滋滋的</option>
<option value='//so'>就這樣</option>
<option value='//shake'>搖搖頭</option>
<option value='//luck'>真幸運啊</option>
<option value='//tongue'>吐吐舌頭</option>
<option value='//blush'>臉紅了</option>
<option value='//applaud'>熱烈鼓掌</option>
<option value='//cough'>咳嗽一下</option>
<option value='//happy'>好高興啊</option>
<option value='//hungry'>肚子餓了</option>
<option value='//strut'>大搖大擺</option>
<option value='//think'>想一想</option>
<option value='//?'>疑惑不已</option>
<option value='//bearbug'>熱情擁抱</option>
<option value='//bless'>祝福</option>
<option value='//bow'>鞠躬</option>
        <option value='//caress'>撫摸</option>
        <option value='//cringe'>企求寬恕</option>
        <option value='//cry'>放聲大哭</option>
        <option value='//comfort'>安慰一下</option>
<option value='//clap'>熱烈鼓掌</option>
        <option value='//dance'>翩翩起舞</option>
     <option value='//drivel'>流口水</option>
     <option value='//farewell'>再見</option>
   <option value='//giggle'>呆笑</option>
     <option value='//grin'>咧嘴笑</option>
       <option value='//growl'>大聲咆哮</option>
/*
hand      heng      hug       haha      heihei    joycup    kick
kiss      koko      laugh     mm        nod       nudge     oh        pad
pat       papaya    pinch     punch     pure      puke      report    shrug
sigh      slap      smooch    snicker   sniff     spank     squeeze   thank
tickle    wave      welcome   wink      xixi      zap

【 Verb + Message:動詞 + 要說的話 】   例://sing 天天天藍
ask       chant     cheer     chuckle   curse     demand    frown     groan
grumble   hum       moan      notice    order     ponder    pout      pray
request   shout     sing      smile     smirk     swear     tease     whimper
yawn      yell
*/
        </select>
<select name=ccc onChange='add_cc0(this, this.options[this.selectedIndex].value)'>
<option value='' selected>白色</option>
<option value='%s'><font color=green>紅色</font></option>
<option value='%s'><font color=red>綠色</font></option>
        <option value='%s'><font color=blue>藍色</font></option>
        <option value='%s'><font color=blue>天藍</font></option>
        <option value='%s'><font color=yellow>黃色</font></option>
        <option value='%s'><font color=red>品紅</font></option>
<option value='%s'>大字</option>
</select>
<select onChange='do_func(this.selectedIndex);this.selectedIndex=0;'>
  <option selected>聊天室功能</option>
<option>進入包廂</option>
<option>查看包廂名</option>
<option>本包廂有誰</option>
<option>看有誰在線</option>
<option>丟小紙條</option>
<option>改聊天代號</option>
<option>貼圖片</option>
<option>清除屏幕</option>
<option>背景反色</option>
<option>離開聊天室</option>
        </select>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='/chathelp.html' target=_blank>[聊天室幫助]</a>
&nbsp;<a href='javascript:do_quit()'>[離開 鄭州大學BBS 聊天室]</a>
<script>
function do_func(n) {
if(n==0) return;
if(n==1) return do_room();
if(n==2) return do_r();
if(n==3) return do_w();
if(n==4) return do_user();
if(n==5) return do_msg();
if(n==6) return do_n();
if(n==7) return do_pic();
if(n==8) return do_c();
if(n==9) return do_css2();
if(n==10) return do_quit();
}
var css1;
css1='http://"MY_BBS_DOMAIN"/bbschat.css';
function do_c() {
top.main.document.close();
                top.main.document.writeln('<link rel=stylesheet type=text/css href='+css1+'><body><pre><font class=c37>');
}
function do_css2() {
if(css1=='http://"MY_BBS_DOMAIN"/bbschat.css')
css1='http://"MY_BBS_DOMAIN"/bbschat2.css';
else
css1='http://"MY_BBS_DOMAIN"/bbschat.css';
top.main.document.writeln('<link rel=stylesheet type=text/css href='+css1+'><body><pre><font class=c37>');
}
function add_cc() {
  xxx=form1.in1.value;
if(xxx=='/h') {
do_help();
form1.in1.value='';
return; 
}
if(xxx=='/c') {
do_c();
form1.in1.value='';
return;
}
if(xxx=='') return;
  if(xxx.indexOf('/')<0) {
  form1.in1.value=cc+xxx;
  }
/*  if(cc=='%I') {
  cc='';
  cc2.selectedIndex=0;
  }*/
  }
</script>
</form></body>

", pid, pid, "%R", "%G", "%B", "%C", "%Y", "%M", "%I");
http_quit();
return 0;
}

int chatsnd(int pid) {
char in1[255], filename[256];
FILE *fp;
strsncpy(in1, getparm("in1"), 60);
sprintf(filename, "tmp/%d.in", pid);
fp=fopen(filename, "a");
fprintf(fp, "%s/n/n", in1);
fclose(fp);
chatrefresh(pid);
return 0;
}

char *cco(char *s) {
        static char buf[512];
        char *p=buf, co[20];
        bzero(buf, 512);
        while(s[0]) {
                if(s[0]!='%') {
                        p[0]=s[0];
                        p++;
                        s++;
                        continue;
                }
                bzero(co, 20);
                if(!strncmp(s, "%R", 2)) strcpy(co, "/033[31m");
                if(!strncmp(s, "%G", 2)) strcpy(co, "/033[32m");
                if(!strncmp(s, "%B", 2)) strcpy(co, "/033[34m");
                if(!strncmp(s, "%C", 2)) strcpy(co, "/033[36m");
                if(!strncmp(s, "%Y", 2)) strcpy(co, "/033[33m");
                if(!strncmp(s, "%M", 2)) strcpy(co, "/033[35m");
                if(!strncmp(s, "%N", 2)) strcpy(co, "/033[0m");
                if(!strncmp(s, "%W", 2)) strcpy(co, "/033[37m");
                if(!strncmp(s, "%I", 2)) strcpy(co, "/033[99m");
                if(co[0]) {
                        strncpy(p, co, strlen(co));
                        p+=strlen(co);
                        s+=2;
                        continue;
                }
                p[0]=s[0];
                p++;
                s++;
        }
        return buf;
}

int chatrefresh(int pid) {
char filename[256];
int t1;
FILE *fp;
        kill(pid, SIGINT);
        usleep(150000);
        if(kill(pid, 0)!=0) {
                printf("<script>top.location='javascript:close()';</script>");
                exit(0);
        }
sprintf(filename, "tmp/%d.out", pid);
t1=time(0);
while(abs(t1-time(0))<8 && !file_exist(filename)) {
sleep(1);
continue;
}
fp=fopen(filename, "r");
if(fp){
while(1) {
int i;
char buf2[512];
if(fgets(buf2, 255, fp)<=0) break;
sprintf(genbuf, "%s", cco(buf2));
for(i=0; genbuf[i]; i++) if(genbuf[i]==10 || genbuf[i]==13) genbuf[i]=0;
if(!strncmp(genbuf, "/init", 5)) {
printf("<script>/n");
printf("top.main.document.write(/"");
printf("<link rel=stylesheet type=text/css href='http://"MY_BBS_DOMAIN"/bbschat.css'><body id=body1 bgColor=black><p
printf("/");");
printf("/n</script>/n");
continue;
}
if(!strncmp(genbuf, "/t", 2)) {
printf("<script>top.document.title='BBS茶館--話題: ");
hprintf("%s", genbuf+2);
printf("'</script>");
sprintf(buf2, "本包廂的話題是: [/033[1;33m%s/033[37m]", genbuf+2);
strcpy(genbuf, buf2);
}
if(!strncmp(genbuf, "/r", 2)) {
sprintf(buf2, "本包廂的名稱是: [/033[1;33m%s/033[37m]", genbuf+2);
strcpy(genbuf, buf2);
}
if(!strncmp(genbuf, "/", 1)) {
genbuf[0]='>';
genbuf[1]='>';
}
for(i=0; i<strlen(genbuf); i++) {
if(genbuf[i]==10 || genbuf[i]==13) genbuf[i]=0;
if(genbuf[i]==34) genbuf[i]=39;
}
printf("<script>/n");
printf("top.main.document.writeln(/"");
fhhprintf(stdout, "%s", genbuf);
printf(" <font class=c37>");
printf("/");");
printf("top.main.scrollBy(0, 99999);/n");
if(test==0) printf("top.input.form1.in1.value='';/n");
printf("</script>/n");
}
fclose(fp);
}
unlink(filename);
printf("<br>");
http_quit();
return 0;
}

void foo() {
FILE *fp;
char filename[80], buf[256];
sprintf(filename, "tmp/%d.in", getpid());
fp=fopen(filename, "r");
if(fp) {
while(1) {
if(fgets(buf, 250, fp)<=0) break;
write(chat_fd, buf, strlen(buf));
}
fclose(fp);
}
unlink(filename);
alarm(60);
}

void abort_chat() {
int pid=getpid();
        char filename[200];
sprintf(filename, "tmp/%d.out", pid);
        unlink(filename);
        sprintf(filename, "tmp/%d.in", pid);
        unlink(filename);
        exit(0);
}

int agent(int pid) {
        int i, num;
  FILE *fp;
char filename[80];
struct sockaddr_in blah;
sprintf(filename, "tmp/%d.out", pid);
        bzero((char *)&blah, sizeof(blah));
        blah.sin_family=AF_INET;
        blah.sin_addr.s_addr=inet_addr("127.0.0.1");
        blah.sin_port=htons(7202);
        chat_fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(connect(chat_fd, (struct sockaddr *)&blah, 16)<0) return -1;
        signal(SIGINT, (void *)foo);
signal(SIGALRM, (void *)abort_chat);
alarm(60);
  sprintf(genbuf, "/! %d %d %s %s %d/n", 
u_info->uid, currentuser->userlevel, currentuser->userid, currentuser->userid, 0);
  write(chat_fd, genbuf, strlen(genbuf));
read(chat_fd, genbuf, 2);
if(!strcasecmp(genbuf, "OK")) exit(0);
fp=fopen(filename, "w");
fprintf(fp, "/init/n");
fclose(fp);
  while(1) {
  num=read(chat_fd, genbuf, 2048);
                        if (num<=0) break;
                        for(i=0; i<num; i++)
                                if(genbuf[i]==0) genbuf[i]=10;
genbuf[num]=0;
  fp=fopen(filename, "a");
fprintf(fp, "%s", genbuf);
fclose(fp);
        }
abort_chat();
return 0;
}

--
※ 來源:.鄭大綠城 BBS bbs.zzu.edu.cn.[FROM: 221.14.170.57] 
發佈了47 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章