⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 func.c

📁 一个C语言的聊天室源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
	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&reg; Server version %s &nbsp;&nbsp;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 + -