void joynet_handle_server_chat_message(JOYNET_SERVER * sp, JOYNET_MESSAGE * mp) { switch(mp->type) { case JOYNET_CHAT_MESSAGE_SET_NAME: { int client = joynet_get_client_from_peer(sp, mp->event->peer); ENetPacket * packet; /* send SET_NAME message back to client to finalize the change */ strcpy(sp->client[client]->screen_name, mp->data); packet = joynet_build_packet(JOYNET_CHAT_MESSAGE_SET_NAME, mp->data, strlen(mp->data) + 1); enet_peer_send(sp->client[client]->peer, JOYNET_CHANNEL_CHAT, packet); break; } case JOYNET_CHAT_MESSAGE_SET_GROUP: { int client = joynet_get_client_from_peer(sp, mp->event->peer); ENetPacket * packet; joynet_serialize(sp->serial_data, mp->data); joynet_getw(sp->serial_data, &sp->client[client]->group); /* send SET_GROUP message back to client to finalize the change */ packet = joynet_build_packet(JOYNET_CHAT_MESSAGE_SET_GROUP, mp->data, sizeof(short)); enet_peer_send(sp->client[client]->peer, JOYNET_CHANNEL_CHAT, packet); break; } case JOYNET_CHAT_MESSAGE_TALK: case JOYNET_CHAT_MESSAGE_GROUP_TALK: { int client = joynet_get_client_from_peer(sp, mp->event->peer); char data[1024] = {0}; short name_length = strlen(sp->client[client]->screen_name) + 1; short message_length = strlen(mp->data) + 1; ENetPacket * packet; int i; /* TALK message is different for client, contains user name and message */ joynet_serialize(sp->serial_data, data); joynet_putw(sp->serial_data, name_length); joynet_putw(sp->serial_data, message_length); joynet_write(sp->serial_data, sp->client[client]->screen_name, name_length); joynet_write(sp->serial_data, mp->data, message_length); packet = joynet_create_packet(JOYNET_CHAT_MESSAGE_TALK, sp->serial_data); for(i = 0; i < sp->max_clients; i++) { if((sp->client[i]->peer) && ((mp->type == JOYNET_CHAT_MESSAGE_GROUP_TALK) || (sp->client[i]->group == sp->client[client]->group))) { enet_peer_send(sp->client[i]->peer, JOYNET_CHANNEL_CHAT, packet); } } break; } } }
void joynet_poll_server(JOYNET_SERVER * sp) { if(sp && sp->host) { while(enet_host_service(sp->host, &sp->event, 0)) { switch(sp->event.type) { /* a connection has been received */ case ENET_EVENT_TYPE_CONNECT: { int client = joynet_server_find_free_client(sp); if(client >= 0) { sp->client[client]->peer = sp->event.peer; } sp->client[client]->peer->data = malloc(sizeof(int)); if(!sp->client[client]->peer->data) { /* need error system */ } else { joynet_serialize(sp->serial_data, sp->client[client]->peer->data); joynet_putl(sp->serial_data, client); } sp->client[client]->user = client; strcpy(sp->client[client]->screen_name, ""); break; } /* client disconnected */ case ENET_EVENT_TYPE_DISCONNECT: { sp->client[joynet_get_client_from_peer(sp, sp->event.peer)]->peer = NULL; break; } /* packet received */ case ENET_EVENT_TYPE_RECEIVE: { JOYNET_MESSAGE message; joynet_decode_message(&message, &sp->event); switch(sp->event.channelID) { case JOYNET_CHANNEL_SYSTEM: { break; } case JOYNET_CHANNEL_CHAT: { joynet_handle_server_chat_message(sp, &message); break; } case JOYNET_CHANNEL_GAME: { joynet_handle_server_game_message(sp, &message); break; } } if(sp->channel_callback[sp->event.channelID]) { sp->channel_callback[sp->event.channelID](&message); } break; } default: { break; } } if(sp->internal_callback) { sp->internal_callback(&sp->event); } if(sp->global_callback) { sp->global_callback(&sp->event); } } } }