SilverMUD/source/client/main.c

146 lines
4.3 KiB
C
Raw Permalink Normal View History

Version 0.0.1 of the rewritten client and server. - Server is capable of accepting an arbitrary number of TLS encrypted client connections. - Server relays messages from one client to the others. - Server spawns a Scheme REPL available over a Unix socket. - Client is a two-pane ncurses-based client, with an input area, chat log, and game status log. - Temporary NAME command exists to change names of players. Squashed commit of the following: commit 442a9319e82e49d6040b5a3015271a951edb9375 Author: Barry Kane <barra@ocathain.ie> Date: Mon Oct 30 16:57:15 2023 +0000 Removed unneeded check, added temporary name command commit a66a07c897cf37b5624bcfa87c309fbbf602ea61 Author: Barry Kane <barra@ocathain.ie> Date: Sun Oct 29 20:15:41 2023 +0000 Properly remove disconnected players commit 81fc72a1d7d55893428c6202be8bd49cbc570ea9 Author: Barry Kane <barra@ocathain.ie> Date: Sun Oct 29 17:20:14 2023 +0000 Added system messages to client and added welcome message from server. commit a1b1b8044989c1d8e60492c2a3054d8885de562c Author: Barra Ó Catháin <barra@ocathain.ie> Date: Tue Sep 12 23:25:44 2023 +0100 Removed now unneeded placeholders, added stubs for "rulebooks" in documentation. commit 54b613befe86637db4aa69adec9e805d4eb355a2 Author: Barra Ó Catháin <barra@ocathain.ie> Date: Tue Sep 12 22:32:19 2023 +0100 Basic implementation of player lists and tying connections to players commit 5a53e9f1974598c62602b3b812398884906b8d00 Author: Barra Ó Catháin <barra@ocathain.ie> Date: Sun Sep 10 17:24:46 2023 +0100 Added basic player type containing a name, and made the server echo messages with player name. commit 3fc75ef30fb7668b9d6d3e7b777aeac4bd9d844a Author: Barry Kane <barra@ocathain.ie> Date: Thu Aug 31 01:44:17 2023 +0100 Basic message receiver, server now echoes messages to all clients. commit b292966588327bef59a102cf7b92dc88f8aed7b3 Author: Barry Kane <barra@ocathain.ie> Date: Mon Aug 28 02:53:31 2023 +0100 Fixed window height calculations. commit 50dcddfc56710964bb4c6a7f3315e20b23ca8200 Author: Barry Kane <barra@ocathain.ie> Date: Mon Aug 28 02:29:21 2023 +0100 Initial ncurses setup, and layout of client. commit c043da64a20064841dc768e85e6735b3b5a731fb Author: Barry Kane <barra@ocathain.ie> Date: Sat Aug 26 00:48:28 2023 +0100 Modify server and client to begin using ClientToServer messages. commit 0104a11a7ecb55f0a56f8b012b63a7a005d03f18 Author: Barry Kane <barra@ocathain.ie> Date: Fri Aug 25 00:34:05 2023 +0100 Added basic client capable of connecting to the server. commit 080e46fe994dc0a1e170e7d9b681ff4679f12e06 Author: Barry Kane <barra@ocathain.ie> Date: Thu Aug 24 00:12:27 2023 +0100 Set up GNU Autotools as build system. commit 0814e437cdc0c00fe3474d86dc8bf7ccd8f1d607 Author: Barry Kane <barra@ocathain.ie> Date: Tue Aug 22 02:02:29 2023 +0100 Basic connection handling (using previous version of client) commit 9801be3622646aa1639884e07459cbd1cdb3a17e Author: Barry Kane <barra@ocathain.ie> Date: Sat Aug 19 16:00:57 2023 +0100 Renamed src back to source, because I liked it better commit e2ef744e87c5652f144ee47ba878038f5097cbea Author: Barry Kane <barra@ocathain.ie> Date: Sat Aug 19 00:18:03 2023 +0100 Moved scheme initialization to main thread, added basic networking The server can now listen on a port and send data to a client. commit 8b0920c35dde3ad766bfc17528ce83e5891a4f1b Author: Barry Kane <barra@ocathain.ie> Date: Fri Aug 18 00:45:24 2023 +0100 Added basic implemantation of message structures. commit 6ed532c3688360ba6aed5abfb83392ce7b000216 Author: Barry Kane <barra@ocathain.ie> Date: Thu Aug 17 00:21:20 2023 +0100 Added structure section. commit 48f0858735f5f5aaf45e23d61a71ba08176021e5 Author: Barry Kane <barra@ocathain.ie> Date: Thu Aug 17 00:14:40 2023 +0100 Began implementation planning document. commit 32503cdbca74de9f454cbc5cf32a7f95d2aa3f5e Author: Barry Kane <barra@ocathain.ie> Date: Mon Aug 14 03:15:37 2023 +0100 Rename source/ to src/ for Autotools. commit 2b488477f5ce4215a999a0fc250cb6f198a0714b Author: Barry Kane <barra@ocathain.ie> Date: Mon Aug 14 02:46:43 2023 +0100 Added initial stubs for server. - Server now launches a thread to initialize Scheme, and drops into a REPL.
2023-11-05 15:14:44 +00:00
// =========================================
// | SilverMUD Client - main.c |
// | Copyright (C) 2023, Barra Ó Catháin |
// | See end of file for copyright notice. |
// =========================================
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <pthread.h>
#include <ncurses.h>
#include <stdbool.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <gnutls/gnutls.h>
#include "../config.h"
#include "../messages.h"
#include "client-drawing.h"
#include "receiving-thread.h"
int main (int argc, char ** argv)
{
// Print a welcome message:
printf("SilverMUD Client - Starting Now.\n"
"================================\n");
// Create a socket for communicating with the server:
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == -1)
{
printf("Socket creation failed. Aborting.\n");
exit(EXIT_FAILURE);
}
// Set up the server address structure to point to the server:
struct sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddress.sin_port = htons(5000);
// Connect to the server:
if (connect(serverSocket, (struct sockaddr *)&serverAddress, sizeof(struct sockaddr_in)) != 0)
{
printf("Failed to connect to the server. Aborting.\n");
exit(EXIT_FAILURE);
}
// Set up a GnuTLS session and handshake with the server:
gnutls_session_t tlsSession = NULL;
if (gnutls_init(&tlsSession, GNUTLS_CLIENT) < 0)
{
exit(EXIT_FAILURE);
}
gnutls_anon_client_credentials_t clientKey = NULL;
gnutls_anon_allocate_client_credentials(&clientKey);
gnutls_credentials_set(tlsSession, GNUTLS_CRD_ANON, &clientKey);
gnutls_transport_set_int(tlsSession, serverSocket);
gnutls_priority_set_direct(tlsSession, "PERFORMANCE:+ANON-ECDH:+ANON-DH", NULL);
gnutls_handshake_set_timeout(tlsSession, GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT);
int returnValue = -1;
do
{
returnValue = gnutls_handshake(tlsSession);
}
while (returnValue < 0 && gnutls_error_is_fatal(returnValue) == 0);
// Initialize ncurses:
initscr();
keypad(stdscr, TRUE);
if (!has_colors())
{
endwin();
exit(EXIT_FAILURE);
}
// Enable colours:
start_color();
use_default_colors();
init_pair(1, COLOR_GREEN, -1);
init_pair(2, COLOR_YELLOW, -1);
init_pair(3, COLOR_RED, -1);
init_pair(4, COLOR_BLUE, -1);
init_pair(5, COLOR_CYAN, -1);
init_pair(6, COLOR_MAGENTA, -1);
// Variables needed for the main loop:
int height, width;
getmaxyx(stdscr, height, width);
struct ClientToServerMessage message;
WINDOW * chatWindow, * gameWindow, * inputWindow;
inputWindow = newwin(1, width - 2, height - 1, 1);
gameWindow = newwin((height / 2) - 1, width - 2, 1, 1);
chatWindow = newwin((height / 2) - 3, width - 2, (height / 2) + 1, 1);
scrollok(gameWindow, TRUE);
scrollok(chatWindow, TRUE);
scrollok(inputWindow, TRUE);
redrawClientLayout(gameWindow, chatWindow, inputWindow);
struct ReceivingThreadArguments receivingThreadArguments;
receivingThreadArguments.chatWindow = chatWindow;
receivingThreadArguments.gameWindow = gameWindow;
receivingThreadArguments.inputWindow = inputWindow;
receivingThreadArguments.session = tlsSession;
pthread_t receivingThread;
pthread_create(&receivingThread, NULL, receivingThreadHandler, &receivingThreadArguments);
while (true)
{
wgetnstr(inputWindow, message.content, 1024);
if (message.content[0] != '\0')
{
gnutls_record_send(tlsSession, &message, 1024);
}
}
// Return a successful status code to the operating system:
return 0;
}
// ============================================
// | End of main.c, copyright notice follows. |
// ============================================
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.