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

📄 chatroom.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
字号:
#include "version.h"#include "main.h"#include "util.h"#include "saacproto_serv.h"#include "saacproto_util.h"#ifdef _UNIVERSE_CHATROOM#include "chatroom.h"UniChatRoomlist UniChatRoom[MAX_CHATROOM];void CHATROOM_resetChat( int chat){	int i;	if( chat<0 || chat>=MAX_CHATROOM ) return;	UniChatRoom[chat].use=0;	UniChatRoom[chat].masindex=-1;	UniChatRoom[chat].charanum=0;	for( i=0; i<MAX_PPLINROOM; i++){		UniChatRoom[chat].charalist[i].use=0;	}}void CHATROOM_Init( void){	int i;	for( i=0; i<MAX_CHATROOM; i++){		CHATROOM_resetChat( i);	}}int CHATROOM_getfreeChatRoom( void){	int i;	for( i=0; i<MAX_CHATROOM; i++){		if( UniChatRoom[i].use == 0 ) return i;	}	return -1;}int CHATROOM_CreateChatRoom( int fd, char *cdkey, char *data,							char *message, int userindex, int clifdid){	int chat=-1;	char buf1[256];	if( (chat=CHATROOM_getfreeChatRoom()) == -1 ){		sprintf( message, "频道已满!");		return -1;	}	CHATROOM_resetChat( chat);	easyGetTokenFromBuf( data, '|', 2, buf1, sizeof(buf1) );	sprintf( UniChatRoom[chat].chatname, "%s", buf1);	easyGetTokenFromBuf( data, '|', 3, buf1, sizeof(buf1) );	sprintf( UniChatRoom[chat].charalist[0].cdkey, "%s", buf1);	easyGetTokenFromBuf( data, '|', 4, buf1, sizeof(buf1) );	sprintf( UniChatRoom[chat].charalist[0].name, "%s", buf1);	easyGetTokenFromBuf( data, '|', 5, buf1, sizeof(buf1) );	sprintf( UniChatRoom[chat].charalist[0].own, "%s", buf1);	UniChatRoom[chat].charalist[0].use = 1;	UniChatRoom[chat].charalist[0].fd = fd;	UniChatRoom[chat].masindex = 0;	UniChatRoom[chat].masfd = fd;	UniChatRoom[chat].charanum = 1;	UniChatRoom[chat].use = 1;	CHATROOM_UpdateChatRoom( -1, chat);	{		char token[256];		sprintf( token, "C|%s|%d|%s|%d|%s|%s|%s|",				SUCCESSFUL,				chat,				UniChatRoom[chat].chatname,				UniChatRoom[chat].masindex,				UniChatRoom[chat].charalist[0].cdkey,				UniChatRoom[chat].charalist[0].name,				UniChatRoom[chat].charalist[0].own				);		saacproto_ACUniChatroom_send( fd, "", SUCCESSFUL, token, userindex, clifdid);	}	return chat;}void CHATROOM_DelChatRoom( char *Cdkey, char *data ){	int chat=-1, uti;	char buf1[256];	char cdkey[256], name[256];extern gmsv gs[MAXCONNECTION];	easyGetTokenFromBuf( data, '|', 2, buf1, sizeof(buf1) );	chat = atoi( buf1);	if( chat<0 || chat>=MAX_CHATROOM ) return;	easyGetTokenFromBuf( data, '|', 3, buf1, sizeof(buf1) );	sprintf( cdkey, "%s", buf1);	easyGetTokenFromBuf( data, '|', 4, buf1, sizeof(buf1) );	sprintf( name, "%s", buf1);		uti = UniChatRoom[chat].masindex;	if( uti<0 || uti >= MAX_PPLINROOM ) return;	if( UniChatRoom[chat].charalist[uti].use == 0 ) return;	if( !strcmp( UniChatRoom[chat].charalist[uti].cdkey, cdkey) &&		!strcmp( UniChatRoom[chat].charalist[uti].name, name) ){		int i;		char token[256];		CHATROOM_resetChat( chat);		sprintf( token, "D|%d|", chat);		for( i=0; i<MAXCONNECTION; i++) {			if( !gs[i].use ) continue;			saacproto_ACUniChatroom_send( i, "", SUCCESSFUL, token, -1, -1);		}	}}void CHATROOM_LeaveChatRoom( char *Cdkey, char *data ){	int chat=-1, uti, i;	char buf1[256], token[256];extern gmsv gs[MAXCONNECTION];	easyGetTokenFromBuf( data, '|', 2, buf1, sizeof(buf1) );	chat = atoi( buf1);	if( chat<0 || chat>=MAX_CHATROOM ) return;	easyGetTokenFromBuf( data, '|', 3, buf1, sizeof(buf1) );	uti = atoi( buf1);	if( uti<0 || uti >= MAX_PPLINROOM ) return;	if( UniChatRoom[chat].charalist[uti].use == 0 ) return;	sprintf( token, "L|%d|%d|%s|", chat, uti, UniChatRoom[chat].charalist[uti].name );	for( i=0; i<MAXCONNECTION; i++) {		if( !gs[i].use ) continue;		saacproto_ACUniChatroom_send( i, "", SUCCESSFUL, token, -1, -1);	}	UniChatRoom[chat].charalist[uti].use = 0;	UniChatRoom[chat].charanum--;	{		int mti = UniChatRoom[chat].masindex;		if( mti == uti ){ //室长离开			for( i=0; i<MAX_PPLINROOM; i++){				if( UniChatRoom[chat].charalist[i].use == 0 ) continue;				UniChatRoom[chat].masindex = i;				UniChatRoom[chat].masfd = UniChatRoom[chat].charalist[i].fd;				sprintf( token, "M|%d|%d|", chat, i);				break;			}			if( i>=MAX_PPLINROOM ){				CHATROOM_resetChat( chat);				sprintf( token, "D|%d|", chat);				for( i=0; i<MAXCONNECTION; i++) {					if( !gs[i].use ) continue;					saacproto_ACUniChatroom_send( i, "", SUCCESSFUL, token, -1, -1);				}				return;			}else{				for( i=0; i<MAXCONNECTION; i++) {					if( !gs[i].use ) continue;					saacproto_ACUniChatroom_send( i, "", SUCCESSFUL, token, -1, -1);				}			}		}		CHATROOM_UpdateChatRoom( -1, chat);	}}void CHATROOM_KickChatRoom( char *Cdkey, char *data ){	int chat=-1, uti, whoti;	char buf1[256];	char cdkey[256],name[256];extern gmsv gs[MAXCONNECTION];	easyGetTokenFromBuf( data, '|', 2, buf1, sizeof(buf1) );	chat = atoi( buf1);	if( chat<0 || chat>=MAX_CHATROOM ) return;	easyGetTokenFromBuf( data, '|', 3, buf1, sizeof(buf1) );	sprintf( cdkey, "%s", buf1);	easyGetTokenFromBuf( data, '|', 4, buf1, sizeof(buf1) );	sprintf( name, "%s", buf1);	easyGetTokenFromBuf( data, '|', 5, buf1, sizeof(buf1) );	whoti = atoi( buf1);	uti = UniChatRoom[chat].masindex;	if( uti<0 || uti >= MAX_PPLINROOM ) return;	if( UniChatRoom[chat].charalist[uti].use == 0 ) return;	if( whoti<0 || whoti >= MAX_PPLINROOM ) return;	if( UniChatRoom[chat].charalist[whoti].use == 0 ) return;	if( !strcmp( UniChatRoom[chat].charalist[uti].cdkey, cdkey) &&		!strcmp( UniChatRoom[chat].charalist[uti].name, name) ){		int i;		char token[256];		sprintf( token, "K|%d|%d|", chat, whoti);		for( i=0; i<MAXCONNECTION; i++) {			if( !gs[i].use ) continue;			saacproto_ACUniChatroom_send( i, "", SUCCESSFUL, token, -1, -1);		}		UniChatRoom[chat].charalist[whoti].use = 0;		UniChatRoom[chat].charanum--;	}	CHATROOM_UpdateChatRoom( -1, chat);}void CHATROOM_JoinChatRoom( char *Cdkey, char *data ){	int chat=-1, uti;	char buf1[256];extern gmsv gs[MAXCONNECTION];	easyGetTokenFromBuf( data, '|', 2, buf1, sizeof(buf1) );	chat = atoi( buf1);	if( chat<0 || chat>=MAX_CHATROOM ) return;	uti = UniChatRoom[chat].masindex;	if( uti<0 || uti >= MAX_PPLINROOM ) return;	if( UniChatRoom[chat].charalist[uti].use == 0 ) return;	if( !gs[ UniChatRoom[chat].masfd].use ) return;	saacproto_ACUniChatroom_send( UniChatRoom[chat].masfd, "", SUCCESSFUL, data, -1, -1);	UniChatRoom[chat].charanum++;}void CHATROOM_AgreeJoinCR( int fd, char *data, int userindex, int clifd){	int chat=-1, ti, i;	char buf1[256], cdkey[256], name[256], own[256];	char token[256];extern gmsv gs[MAXCONNECTION];	easyGetTokenFromBuf( data, '|', 2, buf1, sizeof(buf1) );	chat = atoi( buf1);	if( chat<0 || chat>=MAX_CHATROOM ) return;	easyGetTokenFromBuf( data, '|', 3, buf1, sizeof(buf1) );	sprintf( cdkey, "%s", buf1);	easyGetTokenFromBuf( data, '|', 4, buf1, sizeof(buf1) );	sprintf( name, "%s", buf1);	easyGetTokenFromBuf( data, '|', 5, buf1, sizeof(buf1) );	sprintf( own, "%s", buf1);	if( (ti=CHATROOM_AgreeSomeOne( chat, cdkey, name, own, fd)) < 0 ){		sprintf( token, "A|%d|FULL|", chat);		saacproto_ACUniChatroom_send( fd, "", SUCCESSFUL, token, userindex, clifd);	}else{		sprintf( token, "A|%d|OK|", chat);		saacproto_ACUniChatroom_send( fd, "", SUCCESSFUL, token, userindex, clifd);		UniChatRoom[chat].charanum++;	}	CHATROOM_UpdateChatRoom( -1, chat);}void CHATROOM_GSClosedHandle( int fd){	int i, j, mindex;	extern gmsv gs[MAXCONNECTION];	//andy_log	log( "\nCHATROOM_GSClosedHandle( %d)\n", fd);	for( j=0; j<MAX_CHATROOM; j++){		if( UniChatRoom[j].use == 0 ) continue;		UniChatRoom[j].charanum=0;		for( i=0; i<MAX_PPLINROOM; i++){			if( UniChatRoom[j].charalist[i].use == 0 ) continue;			if( UniChatRoom[j].charalist[i].fd == fd ){				UniChatRoom[j].charalist[i].use = 0;			}else{				UniChatRoom[j].charanum++;			}		}		mindex = UniChatRoom[j].masindex;		if( mindex < 0 || mindex >= MAX_PPLINROOM ||			UniChatRoom[j].charalist[mindex].use == 0 ){			char token[512];			CHATROOM_resetChat( j);			sprintf( token, "D|%d|", j);			for( i=0; i<MAXCONNECTION; i++) {				if( !gs[i].use ) continue;				saacproto_ACUniChatroom_send( i, "", SUCCESSFUL, token, -1, -1);			}			continue;		}		CHATROOM_UpdateChatRoom( -1, j);	}}int CHATROOM_AgreeSomeOne( int chat, char *cdkey, char *name, char *own, int whofd){	int i;	if( chat<0 || chat>=MAX_CHATROOM ) return -1;	if( UniChatRoom[chat].use == 0 ) return -1;	for( i=0; i<MAX_PPLINROOM; i++){		if( UniChatRoom[chat].charalist[i].use == 1 ) continue;		sprintf( UniChatRoom[chat].charalist[i].cdkey, "%s", cdkey);		sprintf( UniChatRoom[chat].charalist[i].name, "%s", name);		sprintf( UniChatRoom[chat].charalist[i].own, "%s", own);		UniChatRoom[chat].charalist[i].fd = whofd;		UniChatRoom[chat].charalist[i].use = 1;		return i;	}	return -2;}void CHATROOM_AgreeChatRoom( char *Cdkey, char *data ){	int chat=-1, uti, whofd;	char buf1[256];	char cdkey[256],name[256], own[256], result[256];extern gmsv gs[MAXCONNECTION];	easyGetTokenFromBuf( data, '|', 2, buf1, sizeof(buf1) );	chat = atoi( buf1);	if( chat<0 || chat>=MAX_CHATROOM ) return;	easyGetTokenFromBuf( data, '|', 3, buf1, sizeof(buf1) );	sprintf( cdkey, "%s", buf1);	easyGetTokenFromBuf( data, '|', 4, buf1, sizeof(buf1) );	sprintf( name, "%s", buf1);	uti = UniChatRoom[chat].masindex;	if( uti<0 || uti >= MAX_PPLINROOM ) return;	if( UniChatRoom[chat].charalist[uti].use == 0 ) return;	if( !strcmp( UniChatRoom[chat].charalist[uti].cdkey, cdkey) &&		!strcmp( UniChatRoom[chat].charalist[uti].name, name) ){		char token[256];		easyGetTokenFromBuf( data, '|', 5, buf1, sizeof(buf1) );		sprintf( result, "%s", buf1);		easyGetTokenFromBuf( data, '|', 6, buf1, sizeof(buf1) );		sprintf( cdkey, "%s", buf1);		easyGetTokenFromBuf( data, '|', 7, buf1, sizeof(buf1) );		sprintf( name, "%s", buf1);		easyGetTokenFromBuf( data, '|', 8, buf1, sizeof(buf1) );		sprintf( own, "%s", buf1);		easyGetTokenFromBuf( data, '|', 9, buf1, sizeof(buf1) );		whofd = atoi( buf1);		if( !gs[ whofd].use ) return;		sprintf( token, "A|%d|%s|%s|%s|%s|", chat, result, cdkey, name, own );		if( !strcmp( result, "OK") ){//			UniChatRoom[chat].charanum++;			if( CHATROOM_AgreeSomeOne( chat, cdkey, name, own, whofd) < 0 ){				sprintf( token, "A|%d|FULL|%s|%s|%s|", chat, cdkey, name, own );			}		}else{			UniChatRoom[chat].charanum--;		}		saacproto_ACUniChatroom_send( whofd, "", SUCCESSFUL, token, -1, -1);	}}void CHATROOM_MasterChatRoom( char *Cdkey, char *data ){	int chat=-1, uti;	char buf1[256];	char cdkey[256],name[256];extern gmsv gs[MAXCONNECTION];	easyGetTokenFromBuf( data, '|', 2, buf1, sizeof(buf1) );	chat = atoi( buf1);	if( chat<0 || chat>=MAX_CHATROOM ) return;	if( UniChatRoom[chat].use == 0 ) return;	easyGetTokenFromBuf( data, '|', 3, buf1, sizeof(buf1) );	sprintf( cdkey, "%s", buf1);	easyGetTokenFromBuf( data, '|', 4, buf1, sizeof(buf1) );	sprintf( name, "%s", buf1);	uti = UniChatRoom[chat].masindex;	if( uti<0 || uti >= MAX_PPLINROOM ) return;	if( UniChatRoom[chat].charalist[uti].use == 0 ) return;	if( !strcmp( UniChatRoom[chat].charalist[uti].cdkey, cdkey) &&		!strcmp( UniChatRoom[chat].charalist[uti].name, name) ){		int i,ti;		char token[256];		easyGetTokenFromBuf( data, '|', 5, buf1, sizeof(buf1) );		ti = atoi( buf1);		if( UniChatRoom[chat].charalist[ti].use == 0 ) return;		UniChatRoom[chat].masindex = ti;		UniChatRoom[chat].masfd = UniChatRoom[chat].charalist[ti].fd;		sprintf( token, "M|%d|%d|", chat, ti );		for( i=0; i<MAXCONNECTION; i++) {			if( !gs[i].use ) continue;			saacproto_ACUniChatroom_send( i, "", SUCCESSFUL, token, -1, -1);		}		return;	}}void CHATROOM_MessageChatRoom( char *Cdkey, char *data ){	int chat=-1, i;	char buf1[256];extern gmsv gs[MAXCONNECTION];	easyGetTokenFromBuf( data, '|', 2, buf1, sizeof(buf1) );	chat = atoi( buf1);	if( chat<0 || chat>=MAX_CHATROOM ) return;		for( i=0; i<MAXCONNECTION; i++) {		if( !gs[i].use ) continue;		saacproto_ACUniChatroom_send( i, "", SUCCESSFUL, data, -1, -1);	}}int CHATROOM_UpdateChatRoom( int fd, int chat){	char token[4096], buf[256];	int i;extern gmsv gs[MAXCONNECTION];	if( chat<0 || chat>=MAX_CHATROOM ) return 0;//	if( UniChatRoom[chat].use == 0 ) return 0;	sprintf( token, "U|%d|%d|%s|%d|%d|",		chat,		UniChatRoom[chat].use,		UniChatRoom[chat].chatname,		UniChatRoom[chat].masindex,		UniChatRoom[chat].charanum	);			for( i=0; i<MAX_PPLINROOM; i++ ){		if( UniChatRoom[chat].charalist[i].use == 0 ) continue;		sprintf( buf, ",%d|%s|%s|%s",			i,			UniChatRoom[chat].charalist[i].cdkey,			UniChatRoom[chat].charalist[i].name,			UniChatRoom[chat].charalist[i].own			);		strcat( token, buf);	}	//更新.	if( fd == -1 ){		for( i=0; i<MAXCONNECTION; i++) {			if( !gs[i].use ) continue;			saacproto_ACUniChatroom_send( i, "", SUCCESSFUL, token, -1, -1);		}	}else{		saacproto_ACUniChatroom_send( fd, "", SUCCESSFUL, token, -1, -1);	}	return chat;}void CHATROOM_RecvAll( int fd, char *cdkey, char *data, int userindex, int clifdid ){	char token[1024];	char comm[256], buf1[256];	int i;	//andy_log	log( "_RecvAll:%s\n", data);	easyGetTokenFromBuf( data, '|', 1, comm, sizeof(comm) );	if( !strcmp( comm, "C") ){//建立频道		if( CHATROOM_CreateChatRoom( fd, cdkey, data, token, userindex, clifdid) >= 0 ){		}else{			saacproto_ACUniChatroom_send( fd, cdkey, FAILED, data, userindex, clifdid );		}	}else if( !strcmp( comm, "D") ) {//删除频道		CHATROOM_DelChatRoom( cdkey, data);	}else if( !strcmp( comm, "L") ) {//离开频道		CHATROOM_LeaveChatRoom( cdkey, data);	}else if( !strcmp( comm, "T") ) {//频道讯息		CHATROOM_MessageChatRoom( cdkey, data);	}else if( !strcmp( comm, "K") ) {//踢出频道		CHATROOM_KickChatRoom( cdkey, data);	}else if( !strcmp( comm, "J") ) {//申请加入频道		CHATROOM_AgreeJoinCR( fd, data, userindex, clifdid);		//CHATROOM_JoinChatRoom( cdkey, data);	}else if( !strcmp( comm, "A") ) {//同意加入		CHATROOM_AgreeChatRoom( cdkey, data);	}else if ( strcmp ( comm , "M" ) == 0 ) { // 更换室长		CHATROOM_MasterChatRoom( cdkey, data);	}else if( !strcmp( comm, "U") ) {//更新频道		easyGetTokenFromBuf( data, '|', 2, buf1, sizeof(buf1) );		if( atoi( buf1) == -1 ){			for( i=0; i<MAX_CHATROOM; i++){				CHATROOM_UpdateChatRoom( fd, i);			}		}else{			CHATROOM_UpdateChatRoom( fd, atoi( buf1));		}	}else{			}}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -