From a07543018fd335a4023e90a94c6f56e0c712b33f Mon Sep 17 00:00:00 2001 From: Sam Smith Date: Sat, 30 Apr 2022 16:09:08 -0700 Subject: [PATCH] Github Copajeet pt.1 --- irc.c | 41 +++++++++++++++++++++++++++++++++++++++-- main.c | 2 +- net.c | 32 +++++++++++++++++++++++--------- net.h | 3 ++- 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/irc.c b/irc.c index 67480ab..d760479 100644 --- a/irc.c +++ b/irc.c @@ -24,9 +24,26 @@ int processPacket(struct client_data *client) { } else if(strncmp(packet, "JOIN ", 5) == 0) { char data[256]; data[0] = ':'; + char *i; strcpy(data+1, client->nick); strcpy(data+1+client->nickLen, " JOIN :"); - strcpy(data+8+client->nickLen, packet+5); + if(packet[5] == ':') { + i = packet+6; + } else { + i = packet+5; + } + strcpy(data+8+client->nickLen, i); + // Start GitHub Copilot + i = data+8+client->nickLen; + while(*i != '\0') { + if(*i == ' ') { + *i = '\n'; + *(i+1) = '\0'; + break; + } + i++; + } + // End GitHub Copilot send_log(client->FD, data, strlen(data), 0); sendall_log(client->FD, data, strlen(data), 0); } else if(strncmp(packet, "PRIVMSG ", 8) == 0) { @@ -36,10 +53,30 @@ int processPacket(struct client_data *client) { data[1+client->nickLen] = ' '; strcpy(data+2+client->nickLen, packet); sendall_log(client->FD, data, strlen(data), 0); + // Start GitHub Copilot - this shit actually be copy pasting my code lmao } else if(strncmp(packet, "QUIT", 4) == 0) { - killConnection(client); + char data[256]; + data[0] = ':'; + strcpy(data+1, client->nick); + strcpy(data+1+client->nickLen, " QUIT :"); + strcpy(data+8+client->nickLen, packet+5); + sendall_log(client->FD, data, strlen(data), 0); + killConnection(client, true); return 1; + } else if(strncmp(packet, "PART ", 5) == 0) { + char data[256]; + data[0] = ':'; + strcpy(data+1, client->nick); + strcpy(data+1+client->nickLen, " PART :"); + strcpy(data+8+client->nickLen, packet+5); + sendall_log(client->FD, data, strlen(data), 0); + } else if(strncmp(packet, "PONG", 4) == 0) { + // Do nothing + } else { + printf("Unknown packet: %s\n", packet); + fflush(stdout); } + // End GitHub Copilot return 0; } diff --git a/main.c b/main.c index 8585f7e..933df64 100644 --- a/main.c +++ b/main.c @@ -209,7 +209,7 @@ int main() { fflush(stdout); for(i=0;itype == 4) { getpeername(cl->FD,(struct sockaddr*)&serverAddrV4,(socklen_t*)&serverAddrV4len); - inet_ntop(AF_INET, &(serverAddrV4.sin_addr), client_addr, sizeof(client_addr)); - printf("Client disconnected from Socket: %"PRISocket", IP: %s PORT: %d\n", cl->FD, client_addr, ntohs(serverAddrV4.sin_port)); + inet_ntop(AF_INET, &(serverAddrV4.sin_addr), data, sizeof(data)); + printf("Client disconnected from Socket: %"PRISocket", IP: %s PORT: %d\n", cl->FD, data, ntohs(serverAddrV4.sin_port)); fflush(stdout); } #endif #ifdef SUPPORT_IPV6 if(cl->type == 6) { getpeername(cl->FD,(struct sockaddr*)&serverAddrV6,(socklen_t*)&serverAddrV6len); - inet_ntop(AF_INET6, &(serverAddrV6.sin6_addr), client_addr, sizeof(client_addr)); - printf("Client disconnected from Socket: %"PRISocket", IP: %s PORT: %d\n", cl->FD, client_addr, ntohs(serverAddrV6.sin6_port)); + inet_ntop(AF_INET6, &(serverAddrV6.sin6_addr), data, sizeof(data)); + printf("Client disconnected from Socket: %"PRISocket", IP: %s PORT: %d\n", cl->FD, data, ntohs(serverAddrV6.sin6_port)); fflush(stdout); } #endif + // Start GitHub Copilot + if(!byChoice) { + strcpy(data, ":irc.patchysicp.xyz QUIT :"); + strcpy(data+24, cl->nick); + strcpy(data+24+cl->nickLen, " has left the building\n"); + sendall_log(cl->FD, data, strlen(data), 0); + } + // Send error to client informing them that they will be disconnected + // ERROR :Closing Link: NICK () + strcpy(data, "ERROR :Closing Link: "); + strcpy(data+21, cl->nick); + strcpy(data+21+cl->nickLen, " ()\n"); + send_log(cl->FD, data, strlen(data), 0); + // End GitHub Copilot shutdown(cl->FD, SHUT_RDWR); closesocket(cl->FD); free(cl); @@ -62,17 +76,17 @@ void recvProc(struct client_data *cl) { int packetReturn; while(1){ // I hate you - if(cl->bufLen == cl->bufCap) { killConnection(cl); return; } + if(cl->bufLen == cl->bufCap) { killConnection(cl, false); return; } bytesRead = recv_log(cl->FD,cl->buf + cl->bufLen,cl->bufCap - cl->bufLen, 0); switch(bytesRead){ // Disconnect case 0: - killConnection(cl); + killConnection(cl, false); return; // Error case -1: if(!net_wouldblock()){ - killConnection(cl); + killConnection(cl, false); net_perror("RECV"); } return; diff --git a/net.h b/net.h index 30d601e..0838e90 100644 --- a/net.h +++ b/net.h @@ -1,10 +1,11 @@ #ifndef _net_h #define _net_h #include "common.h" +#include void sendall_log(SOCKET socket, const char *buffer, size_t length, int flags); struct client_data *allocClient(); -void killConnection(struct client_data *client); +void killConnection(struct client_data *client, bool byChoice); void recvProc(struct client_data *cl); #endif -- 2.56.0