📄 func.c
字号:
/*
Version: 0.2.0(alpha)
Author: Computer_xu
Email: Computer_xu@sina.com
HomePage: http://www.socketchat.com
LastModify: 2001-06-03 (yyyy-mm-dd)
*/
#include "func.h"
BANLIST *BanList=NULL;
void AddBanList(int mode, char *msg, time_t keep, int roomid)
{
BANLIST *p;
p=(BANLIST *)Malloc(sizeof(BANLIST));
p->ban=(char *)Malloc(strlen(msg)+1);
strcpy(p->ban, msg);
time(&p->time);
p->end=p->time+keep;
p->mode=mode;
p->roomid=roomid;
p->next=BanList;
BanList=p;
}
int IsBan(char *ip, char *id,int roomid)
{
BANLIST *p,*p1;
time_t t;
p1=p=BanList;
time(&t);
while(p!=NULL)
{
while( p->end <= t )
{
Free(p->ban);
if( BanList==p )
{
BanList=p1=p->next;
Free(p);
p=p1;
}
else
{
p1->next=p->next;
Free(p);
p=p1->next;
}
if( p==NULL ) return(0);
}
if( p->roomid==-1 || p->roomid==roomid )
{
if( p->mode == 1 )
if( strcmp(p->ban,id)==0 ) return(1);
else if( p->mode == 2 )
if( strcmp(p->ban,ip)==0 ) return(1);
}
p=p->next;
while( p1->next != p )
{
p1=p1->next;
if( p1==NULL ) return(0);
}
}
return(0);
}
void UnBan(char *ip, char *id, int roomid)
{
BANLIST *p,*p1;
time_t t;
p=BanList;
time(&t);
while(p!=NULL)
{
if( p->roomid==-1 || p->roomid==roomid )
{
if( p->mode == 1 )
if( strcmp(p->ban,id)==0 ) p->end=p->time;
else if( p->mode == 2 )
if( strcmp(p->ban,ip)==0 ) p->end=p->time;
}
p=p->next;
}
}
void Func_Login(int connfd, RequestData *RDp)
{
char *pp1,*pp2,*pp3,*pp4,*pp5,*pp6;
char Buffer[2048];
time_t t;
pp1=GetQueryVarValue(RDp->Query,"user");
pp2=GetQueryVarValue(RDp->Query,"pass");
pp3=GetQueryVarValue(RDp->Query,"roomid");
pp4=GetQueryVarValue(RDp->Query,"sex");
pp5=GetQueryVarValue(RDp->Query,"box");
pp6=GenUID(pp2);
if( IsBan(GetSocketIP(connfd), pp1, atoi(pp3)) )
{/* Baned */
WriteRedirect(connfd,"/ban.htm");
}
else
{
if( strcmp(pp1,"guest")==0 || strstr(pp1,"游客")==pp1 || pp2==NULL || Strlen(pp2)==0 )
{ /* guest user */
char guestid[64];
char guestpw[64];
time(&t);
sprintf(guestid,"游客%u", t%604800);
sprintf(guestpw,"%u",t%100000000);
pp1=guestid;
pp2=guestpw;
}
if( Login(pp1,pp2,pp3,pp4,pp5,pp6)==0 )
{
time(&t);
sprintf(Buffer,"/cmd?Enter&user=%s&sid=%s&t=%d",pp1,pp6,t);
WriteRedirect(connfd,Buffer);
}
else WriteRedirect(connfd,"/chkusrpw.htm");
}
Free(pp6);
}
void Func_Enter(int connfd, RequestData *RDp)
{
char *p1,*p2,*p4;
char *pp1,*pp2;
unsigned long filesize;
USERINFO *up1;
time_t t;
pp1=GetQueryVarValue(RDp->Query,"user");
pp2=GetQueryVarValue(RDp->Query,"sid");
up1=GetUP(GetNN(pp1));
if( up1!=NULL )
{
if( StrnCmp(up1->sid,pp2,48)==0 )
{
/* output chatmain.htm */
p1=GetFileData("/chatmain.htm",&filesize);
if(p1!=NULL)
{
ROOMINFO *rp1;
WriteHeader(connfd);
p2=Malloc(Strlen(p1)+1);
strcpy(p2,p1);
p4=Malloc(4096);
rp1=GetRP(up1->roomid);
sprintf(p4,"var nowroom=new Array(\"%d\",\"%s\",\"%d\");",rp1->roomid,rp1->roomname,rp1->usernum);
if( up1->status & 0x4000 )
sprintf(&p4[Strlen(p4)],"\nMyBoxOn=1;");
else
sprintf(&p4[Strlen(p4)],"\nMyBoxOn=0;");
p2=ExChange(p2,"<!--nowroom-->",p4);
sprintf(p4,"var whoami=new Array(\"%s\",\"%s\",\"%s\");",pp1,up1->nickname,up1->sid);
p2=ExChange(p2,"<!--whoami-->",p4);
time(&t);
sprintf(p4,"/cmd?chatmessage&user=%s&roomid=%d&box=%s&sid=%s&t=%d",pp1,up1->roomid,(up1->status & 0x4000)?"on":"off",up1->sid,t);
p2=ExChange(p2,"<!--chatmessage-->",p4);
send(connfd,p2,Strlen(p2),0);
Free(p4);
Free(p2);
strncpy(up1->ip,GetSocketIP(connfd),16);
}
}
}
else WriteRedirect(connfd,"/chkusrpw.htm");
}
void Func_Logout(int connfd, RequestData *RDp)
{
char *pp1,*pp2,*pp3,*pp4;
char Buffer[4096];
USERINFO *up1;
ROOMINFO *rp1;
SOCKET_INFO *sp1;
pp1=GetQueryVarValue(RDp->Query,"user");
pp4=GetQueryVarValue(RDp->Query,"sid");
if( pp1!=NULL ) up1=GetUP(pp1);
else up1=NULL;
if( up1!=NULL )
{
if( pp4!=NULL && StrCmp(up1->sid,pp4) )
WriteRedirect(connfd,"/chkusrpw.htm");
else if( up1->status )
{
sprintf(Buffer,"<a href=\"\" OnClick=\"parent.SelectUser(\\\'%s\\\'); return false;\">%s</a> 离开了聊天室",up1->userid, up1->nickname);
AddWords(up1->roomid, NULL, NULL, 0, "", "", Buffer, 0);
sprintf(Buffer,"<script>parent.RemoveUser('%s','%s','%s');</script>\n",up1->userid, up1->nickname, up1->sex);
AddWords(up1->roomid, NULL, NULL, 0, "", "", Buffer, 2);
sprintf(Buffer,"<script>top.close();</script>\n");
sp1=sysinfo.SOCKET_HEAD;
while(sp1!=NULL)
{
if(sp1->user==up1) break;
sp1=sp1->next;
}
if( sp1 !=NULL )
{
write(sp1->socketfd,Buffer,strlen(Buffer));
ForceSend();
LogOut(up1->nickname,up1->sid);
}
}
}
else WriteRedirect(connfd,"/chkusrpw.htm");
}
void Func_OnlineUserList(int connfd, RequestData *RDp)
{
char *pp1;
pp1=GetQueryVarValue(RDp->Query,"roomid");
if( pp1==NULL )
{
/* 列出所有房间用户 */
}
else
{
/* 列出roomid指定的房间的用户 */
}
}
void Func_FindUser(int connfd, RequestData *RDp)
{
}
int Func_ChatMessage(int connfd, RequestData *RDp)
{
char *pp1,*pp2,*pp3,*pp4;
char Buffer[2048];
int off=1;
USERINFO *up1;
ROOMINFO *rp1;
pp1=GetQueryVarValue(RDp->Query,"user");
pp2=GetQueryVarValue(RDp->Query,"roomid");
pp3=GetQueryVarValue(RDp->Query,"box");
pp4=GetQueryVarValue(RDp->Query,"sid");
up1=GetUP(GetNN(pp1));
if( up1!=NULL )
{
if( StrCmp(up1->sid,pp4) && up1->status&0x8000 )
WriteRedirect(connfd,"/chkusrpw.htm");
else
{
int flag;
WriteHeader(connfd);
off=0;
rp1=GetRP(atoi(pp2));
sprintf(Buffer,"<HTML><HEAD><meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\"><link href=\"message.css\" rel=stylesheet></HEAD><BODY id=allwords>\n");
write(connfd,Buffer,strlen(Buffer));
sprintf(Buffer,"<font color=blue>欢迎光临SocketChat聊天室[%s],</font><font color=red>请注意文明聊天!</font><BR>\n",rp1->roomname);
write(connfd,Buffer,strlen(Buffer));
sprintf(Buffer,"<HR>\n");
write(connfd,Buffer,strlen(Buffer));
sprintf(Buffer,"<font face='Arial'>Powered by SocketChat® Server version %s All Rights Left.</font><BR>\n",version);
write(connfd,Buffer,strlen(Buffer));
flag=AddSocket(connfd,up1);
rp1->usernum+=flag;
OutPutUserList(connfd,rp1->roomid);
OutPutRoomList(connfd);
if( flag )
{
sprintf(Buffer,"<a href=\"\" OnClick=\"parent.SelectUser(\\\'%s\\\'); return false;\">%s</a> 进入了聊天室",up1->userid, up1->nickname);
AddWords(atoi(pp2), NULL, NULL, 0, "", "", Buffer, 0);
}
sprintf(Buffer,"<script>parent.AddUser(\"%s\",\"%s\",\"%s\");</script>\n",up1->userid, up1->nickname, up1->sex);
AddWords(atoi(pp2), NULL, NULL, 0, "", "", Buffer, 2);
ForceSend();
}
}
else WriteRedirect(connfd,"/chkusrpw.htm");
return( off );
}
int Func_UserExist(userid)
{
}
void Func_Register(int connfd, RequestData *RDp)
{
MYSQL_RES *res;
MYSQL_ROW row;
char query[2048];
char varlist[4096], valuelist[4096];
char *userid,*nickname,*password,*sex,*sign,*photo;
char *realname,*born,*email,*readme,*regip;
userid=GetFormVarValue(RDp->Form,"userid");
nickname=GetFormVarValue(RDp->Form,"NickName");
password=GetFormVarValue(RDp->Form,"Passwd");
sex=GetFormVarValue(RDp->Form,"sex");
sign=GetFormVarValue(RDp->Form,"sign");
photo=GetFormVarValue(RDp->Form,"photo");
realname=GetFormVarValue(RDp->Form,"realname");
born=GetFormVarValue(RDp->Form,"born");
email=GetFormVarValue(RDp->Form,"Email");
readme=GetFormVarValue(RDp->Form,"readme");
regip=GetSocketIP(connfd);
if( userid == NULL )
{
if( nickname == NULL )
{
/* 错误 */
return;
}
else userid=nickname;
}
else nickname=userid;
/* 检查用户是否已经存在 */
if( Strlen(userid)>20 ) userid[20]='\0';
if( Func_UserExist(userid) )
{
/* 已经存在 */
return;
}
/* 检查密码 */
if( password == NULL || Strlen(password)<1 )
{
/* 没有输入密码 */
return;
}
if( Strlen(password)>20 ) password[20]='\0';
/* 检查性别 */
if( sex == NULL || strstr(sex,"girl")==NULL || strstr(sex,"boy")==NULL || strstr(sex,"private")==NULL )
{
/* 性别输入错误 */
return;
}
sprintf(varlist,"id,nickname,password,sex");
sprintf(valuelist,"%s,%s,%s,%s",userid,userid,password,sex);
if( sign != NULL )
{
}
if( photo != NULL )
{
}
if( realname != NULL )
{
}
if( born != NULL )
{
}
sprintf(query,"insert into users (%s,regtime) values (%s,NOW())",varlist,valuelist);
QueryMyDB(sqlfd, query, strlen(query));
}
void Func_Cmd(char *cmdstr, char *id, char *toid, char *toself, char *totarget, char *toall)
{
USERINFO *up, *toup;
char Buffer[4096];
SOCKET_INFO *sp1;
char *str;
toself[0]='\0'; totarget[0]='\0'; toall[0]='\0';
up=GetUP(GetNN(id));
if( up == NULL ) return;
toup=GetUP(GetNN(toid));
strcpy(Buffer,cmdstr);
str=strstr(Buffer," ");
if( str!=NULL ) *str='\0';
if( LevelRight(up->level, Buffer)==0 )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -