diff --git a/src/SilverMUDClient.c b/src/SilverMUDClient.c index bde2293..f64bb66 100644 --- a/src/SilverMUDClient.c +++ b/src/SilverMUDClient.c @@ -9,6 +9,7 @@ #include #include #include +#include "misc/playerdata.h" #include "misc/texteffects.h" #include "misc/inputhandling.h" #define MAX 1024 @@ -61,13 +62,16 @@ void * messageReceiver(void * parameters) { // Takes messages from the server and prints them to the chat log window: struct threadparameters *threadParameters = parameters; - char receiveBuffer[MAX]; + userMessage receiveBuffer; while (!shouldExit) { - read(threadParameters->socketDescriptor, receiveBuffer, MAX); - slowPrintNcurses("USER-MESSAGE: ", 8000, threadParameters->window); - slowPrintNcurses(receiveBuffer, 8000, threadParameters->window); - bzero(receiveBuffer, MAX); + read(threadParameters->socketDescriptor, &receiveBuffer.senderName, sizeof(receiveBuffer.senderName)); + read(threadParameters->socketDescriptor, &receiveBuffer.messageContent, sizeof(receiveBuffer.messageContent)); + slowPrintNcurses(receiveBuffer.senderName, 8000, threadParameters->window); + slowPrintNcurses(": ", 8000, threadParameters->window); + slowPrintNcurses(receiveBuffer.messageContent, 8000, threadParameters->window); + bzero(receiveBuffer.senderName, sizeof(receiveBuffer.senderName)); + bzero(receiveBuffer.messageContent, sizeof(receiveBuffer.messageContent)); } pthread_exit(NULL); } @@ -83,7 +87,7 @@ int main(int argc, char **argv) signal(SIGINT, sigintHandler); // Print welcome message: - slowPrint("\n--==== \033[33;40mSILVERKIN INDUSTRIES\033[0m COMM-LINK CLIENT ====--\nVersion Alpha 0.2\n", 5000); + slowPrint("\n--==== \033[33;40mSILVERKIN INDUSTRIES\033[0m COMM-LINK CLIENT ====--\nVersion Alpha 0.3\n", 5000); // Give me a socket, and make sure it's working: sockfd = socket(AF_INET, SOCK_STREAM, 0); diff --git a/src/SilverMUDServer.c b/src/SilverMUDServer.c index 3eb8724..c2bde11 100644 --- a/src/SilverMUDServer.c +++ b/src/SilverMUDServer.c @@ -1,4 +1,4 @@ -// Silverkin Industries Comm-Link Server, Engineering Sample Alpha 0.1. +// Silverkin Industries Comm-Link Server, Engineering Sample Alpha 0.3. // PROJECT CODENAME: WHAT DO I PAY YOU FOR? | Level-3 Clearance. // Barry Kane, 2021 #include @@ -12,6 +12,7 @@ #include #include #include +#include "misc/playerdata.h" #include "misc/texteffects.h" const int PORT = 5000; const int MAX = 1024; @@ -23,13 +24,21 @@ int main() socketCheck, activityCheck, readLength; int clientSockets[64]; int maxClients = 64; + userMessage sendBuffer; char receiveBuffer[MAX]; fd_set connectedClients; - struct sockaddr_in serverAddress, clientAddress; + playerInfo connectedPlayers[64]; + struct sockaddr_in serverAddress, clientAddress; + // Initialize playerdata: + for (int index = 0; index < maxClients; index++) + { + strcpy(connectedPlayers[index].playerName, "UNNAMED"); + } + // Give an intro: Display the Silverkin Industries logo and splash text. slowPrint(logostring, 3000); - slowPrint("\n--==== \033[33;40mSILVERKIN INDUSTRIES\033[0m COMM-LINK SERVER ====--\nVersion Alpha 0.2\n", 5000); + slowPrint("\n--==== \033[33;40mSILVERKIN INDUSTRIES\033[0m COMM-LINK SERVER ====--\nVersion Alpha 0.3\n", 5000); // Initialize the sockets to 0, so we don't crash. for (int index = 0; index < maxClients; index++) @@ -163,21 +172,49 @@ int main() // Close the socket and mark as 0 in list for reuse: close(socketCheck); clientSockets[i] = 0; - } - + } + // Name change command: Move logic to a command interpreter later: + else if (receiveBuffer[0] == '/') + { + char newName[32]; + if(strncmp(receiveBuffer, "/NAME", 5) == 0) + { + strncpy(newName, &receiveBuffer[6], 32); + // Remove newlines: + for (int index = 0; index < 32; index++) + { + if (newName[index] == '\n') + { + newName[index] = '\0'; + } + } + for (int index = 0; index < maxClients; index++) + { + if(strncmp(newName, connectedPlayers[index].playerName, 32) == 0) + { + break; + } + } + strncpy(connectedPlayers[i].playerName, newName, 32); + } + } // Echo back the message that came in: else { - printf("%d: %s", clientSockets[i], receiveBuffer); + printf("%d/%s: %s", clientSockets[i], connectedPlayers[i].playerName, receiveBuffer); fflush(stdout); + strcpy(sendBuffer.senderName, connectedPlayers[i].playerName); + strcpy(sendBuffer.messageContent, receiveBuffer); for (int sendIndex = 0; sendIndex < clientsAmount; sendIndex++) { if(clientSockets[sendIndex] != STDIN_FILENO && clientSockets[sendIndex] != STDOUT_FILENO && clientSockets[sendIndex] != STDERR_FILENO) { - write(clientSockets[sendIndex], receiveBuffer, sizeof(receiveBuffer)); + write(clientSockets[sendIndex], sendBuffer.senderName, sizeof(sendBuffer.senderName)); + write(clientSockets[sendIndex], sendBuffer.messageContent, sizeof(sendBuffer.messageContent)); } } - bzero(receiveBuffer, sizeof(receiveBuffer)); + bzero(sendBuffer.senderName, sizeof(sendBuffer.senderName)); + bzero(sendBuffer.messageContent, sizeof(sendBuffer.messageContent)); } } } diff --git a/src/misc/playerdata.h b/src/misc/playerdata.h new file mode 100644 index 0000000..4cf1d8c --- /dev/null +++ b/src/misc/playerdata.h @@ -0,0 +1,17 @@ +// playerdata.h: Header file containing data structures for player data and function +// definitions for interacting with said data. +// Barry Kane, 2021. + +typedef struct userMessage +{ + char senderName[32]; + char messageContent[1024]; +} userMessage; + +typedef struct playerInfo +{ + char playerName[32]; +} playerInfo; + + +