#include "irc.h"
+struct dynarr databuf;
+
int processPacket(struct client_data *client) {
char *packet = client->buf;
//size_t packetLen = client->bufLen;
+ databuf.len = 0;
if(strncmp(packet, "PING", 4) == 0) {
- char data[1024];
- strcpy(data, ":irc.patchysicp.xyz PONG irc.patchysicp.xyz ");
- strcpy(data+strlen(":irc.patchysicp.xyz PONG irc.patchysicp.xyz :"), packet+5);
- data[strlen(":irc.patchysicp.xyz PONG irc.patchysicp.xyz ")] = ':';
- send_log(client->FD, data, strlen(data), 0);
+ append_str(&databuf, ":irc.patchysicp.xyz PONG irc.patchysicp.xyz :");
+ append_str(&databuf, packet+5);
+ send_log(client->FD, databuf.buf, databuf.len, 0);
} else if(strncmp(packet, "NICK ", 5) == 0) {
// User now registered
setNick(client, packet+5, 32);
sendMOTD(client);
// Horrible join but it works and its funny
} 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 :");
+ append_str(&databuf, ":");
+ append_str(&databuf, client->nick);
+ append_str(&databuf, " JOIN :");
+ // Start GitHub Copilot
if(packet[5] == ':') {
i = packet+6;
} else {
i = packet+5;
}
- strcpy(data+8+client->nickLen, i);
- // Start GitHub Copilot
- i = data+8+client->nickLen;
+ append_str(&databuf, i);
+ i = databuf.buf+8+client->nickLen;
while(*i != '\0') {
- if(*i == ' ') {
+ // Fuck you and multiple channels at once
+ // TODO: actually implement multiple channels
+ if(*i == ' ' || *i == ',') {
*i = '\n';
- *(i+1) = '\0';
+ *(i+1) = 0;
break;
}
i++;
}
+ databuf.len = strlen(databuf.buf);
// End GitHub Copilot
- send_log(client->FD, data, strlen(data), 0);
- sendall_log(client->FD, data, strlen(data), 0);
+ send_log(client->FD, databuf.buf, databuf.len, 0);
+ sendall_log(client->FD, databuf.buf, databuf.len, 0);
} else if(strncmp(packet, "PRIVMSG ", 8) == 0) {
- char data[256];
- data[0] = ':';
- strcpy(data+1, client->nick);
- data[1+client->nickLen] = ' ';
- strcpy(data+2+client->nickLen, packet);
- sendall_log(client->FD, data, strlen(data), 0);
+ append_str(&databuf, ":");
+ append_str(&databuf, client->nick);
+ append_str(&databuf, " ");
+ append_str(&databuf, packet);
+ sendall_log(client->FD, databuf.buf, databuf.len, 0);
// Start GitHub Copilot - this shit actually be copy pasting my code lmao
} else if(strncmp(packet, "QUIT", 4) == 0) {
- 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);
+ append_str(&databuf, ":");
+ append_str(&databuf, client->nick);
+ append_str(&databuf, " QUIT :");
+ if(packet[4] == ' ') {
+ if(packet[5] == ':') {
+ append_str(&databuf, packet+6);
+ } else {
+ append_str(&databuf, packet+5);
+ }
+ } else {
+ append_str(&databuf, "Client Quit\n");
+ }
+ sendall_log(client->FD, databuf.buf, databuf.len, 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 {
}
void setNick(struct client_data *client, char* nickname, size_t size) {
+ size_t i;
// TODO: perform basic sanitization
- strncpy(client->nick, nickname, size);
- // Null term
- client->nick[size-1] = 0;
+
// Remove newline
- size_t i;
for(i=0;i<size;i++){
// CR/^M
- if(client->nick[i] == 13) {
- client->nick[i] = 0;
+ if(nickname[i] == 13) {
+ nickname[i] = 0;
break;
}
// Newline
- if(client->nick[i] == 10) {
- client->nick[i] = 0;
+ if(nickname[i] == 10) {
+ nickname[i] = 0;
+ break;
+ }
+ // Space
+ if(nickname[i] == ' ') {
+ break;
+ }
+ // NULL
+ if(nickname[i] == 0) {
break;
}
}
+
+ // Start GitHub Copilot
+ // Check if the nickname is already taken
+ for(i=0;i<CLIENTS;i++) {
+ if(clients[i] == 0) continue;
+ if(strncmp(clients[i]->nick, nickname, size) == 0) {
+ // Nickname is already taken
+ databuf.len = 0;
+ append_str(&databuf, ":irc.patchysicp.xyz 443 * ");
+ append_str(&databuf, nickname);
+ append_str(&databuf, " :Nickname is already in use\n");
+ send_log(client->FD, databuf.buf, databuf.len, 0);
+ return;
+ }
+ }
+ // End GitHub Copilot
+
+ // Update nickname
+ if(client->nickLen) {
+ databuf.len = 0;
+ append_str(&databuf, ":");
+ append_str(&databuf, client->nick);
+ append_str(&databuf, " NICK ");
+ append_str(&databuf, nickname);
+ append_str(&databuf, "\n");
+ send_log(client->FD, databuf.buf, databuf.len, 0);
+ sendall_log(client->FD, databuf.buf, databuf.len, 0);
+ }
+
+ strncpy(client->nick, nickname, size);
+ // Null term just incase
+ client->nick[size-1] = 0;
// Set length
client->nickLen = strlen(client->nick);
return;
#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);
+ databuf.len = 0;
+ append_str(&databuf, ":");
+ append_str(&databuf, cl->nick);
+ append_str(&databuf, " QUIT :");
+ append_str(&databuf, "Has left the building (Forced)\n");
+ sendall_log(cl->FD, databuf.buf, databuf.len, 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);
+ databuf.len = 0;
+ append_str(&databuf, "ERROR :Closing Link: ");
+ append_str(&databuf, cl->nick);
+ append_str(&databuf, " ()\n");
+ send_log(cl->FD, databuf.buf, databuf.len, 0);
// End GitHub Copilot
shutdown(cl->FD, SHUT_RDWR);
closesocket(cl->FD);