From 18a4f416f6970bd826a6a5157cb03a61e1702048 Mon Sep 17 00:00:00 2001 From: Barry Kane Date: Wed, 15 Sep 2021 00:07:13 +0100 Subject: [PATCH] Added basic name system - Added basic name system. - Added playerdata.h. - Added basic /NAME command. TODO: Create proper command system. - Added datastructures for user messages and user names. --- src/SilverMUDClient.c | 14 ++++++++----- src/SilverMUDServer.c | 49 +++++++++++++++++++++++++++++++++++++------ src/misc/playerdata.h | 17 +++++++++++++++ 3 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 src/misc/playerdata.h diff --git a/src/SilverMUDClient.c b/src/SilverMUDClient.c index bde2293..daca94a 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); } diff --git a/src/SilverMUDServer.c b/src/SilverMUDServer.c index 3eb8724..9433d3c 100644 --- a/src/SilverMUDServer.c +++ b/src/SilverMUDServer.c @@ -12,6 +12,7 @@ #include #include #include +#include "misc/playerdata.h" #include "misc/texteffects.h" const int PORT = 5000; const int MAX = 1024; @@ -23,10 +24,18 @@ 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); @@ -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; + + +