summaryrefslogtreecommitdiff
path: root/client_network.c
diff options
context:
space:
mode:
Diffstat (limited to 'client_network.c')
-rw-r--r--client_network.c150
1 files changed, 108 insertions, 42 deletions
diff --git a/client_network.c b/client_network.c
index 35e3055..bbeaec3 100644
--- a/client_network.c
+++ b/client_network.c
@@ -109,14 +109,30 @@ int client_user_handler(uint64_t argc, struct string *argv) {
SEND(argv[3]);
SEND(STRING("\n"));
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 001 me :Welcome to the AndrewIRC IRC Network\r\n"));
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 002 me :Your host is hax.irc.andrewyu.org, running a totally not sus IRCd\r\n"));
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 003 me :This server was created 02:51:36 Apr 03 2023\r\n"));
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 004 me irc.andrewyu.org InspIRCd-3 BDGHILNORSTWcdghikorswxz ABCDEFGHIJKLMNOPQRSTXYZabcdefghijklmnopqrstuvwz :BEFHIJLXYZabdefghjkloqvw\r\n"));
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 005 me ACCEPT=100 AWAYLEN=200 BOT=B CALLERID=g CASEMAPPING=ascii CHANLIMIT=#:20 CHANMODES=IXZbegw,k,BEFHJLdfjl,ACDGKMNOPQRSTcimnprstuz CHANNELLEN=60 CHANTYPES=# ELIST=CMNTU ESILENCE=CcdiNnPpTtx EXCEPTS=e :are supported by this server\r\n"));
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 005 me EXTBAN=,ACNOQRSTUacjmnprswz HOSTLEN=64 INVEX=I KEYLEN=32 KICKLEN=300 LINELEN=512 MAXLIST=I:1000,X:1000,b:1000,e:1000,g:1000,w:1000 MAXTARGETS=20 MODES=20 MONITOR=30 NAMELEN=130 NAMESX NETWORK=LibreIRC :are supported by this server\r\n"));
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 005 me NICKLEN=30 OVERRIDE=O PREFIX=(Yqaohv)!~&@%+ REMOVE SAFELIST SECURELIST=60 SILENCE=100 STATUSMSG=!~&@%+ TOPICLEN=330 UHNAMES USERIP USERLEN=10 USERMODES=,,s,BDGHILNORSTWcdghikorwxz :are supported by this server\r\n"));
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 005 me WATCH=32 WHOX :are supported by this server\r\n"));
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 001 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" :Welcome to the RunxiIRC Network\r\n"));
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 002 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" :Your host is hax.irc.andrewyu.org, running a totally not sus IRCd\r\n"));
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 003 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" :This server was created 02:51:36 Apr 03 2023\r\n"));
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 004 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" irc.andrewyu.org InspIRCd-3 BDGHILNORSTWcdghikorswxz ABCDEFGHIJKLMNOPQRSTXYZabcdefghijklmnopqrstuvwz :BEFHIJLXYZabdefghjkloqvw\r\n"));
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 005 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" ACCEPT=100 AWAYLEN=200 BOT=B CALLERID=g CASEMAPPING=ascii CHANLIMIT=#:20 CHANMODES=IXZbegw,k,BEFHJLdfjl,ACDGKMNOPQRSTcimnprstuz CHANNELLEN=60 CHANTYPES=# ELIST=CMNTU ESILENCE=CcdiNnPpTtx EXCEPTS=e :are supported by this server\r\n"));
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 005 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" EXTBAN=,ACNOQRSTUacjmnprswz HOSTLEN=64 INVEX=I KEYLEN=32 KICKLEN=300 LINELEN=512 MAXLIST=I:1000,X:1000,b:1000,e:1000,g:1000,w:1000 MAXTARGETS=20 MODES=20 MONITOR=30 NAMELEN=130 NAMESX NETWORK=LibreIRC :are supported by this server\r\n"));
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 005 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" NICKLEN=30 OVERRIDE=O PREFIX=(Yqaohv)!~&@%+ REMOVE SAFELIST SECURELIST=60 SILENCE=100 STATUSMSG=!~&@%+ TOPICLEN=330 UHNAMES USERIP USERLEN=10 USERMODES=,,s,BDGHILNORSTWcdghikorwxz :are supported by this server\r\n"));
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 005 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" WATCH=32 WHOX :are supported by this server\r\n"));
client_connected = 1;
@@ -127,41 +143,91 @@ int client_join_handler(uint64_t argc, struct string *argv) {
if (argc < 1)
return 1;
- SENDCLIENT(STRING(":"));
- SENDCLIENT(client_nick);
- SENDCLIENT(STRING("!e@e JOIN :"));
- SENDCLIENT(argv[0]);
- SENDCLIENT(STRING("\r\n"));
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 332 "));
- SENDCLIENT(client_nick);
- SENDCLIENT(STRING(" "));
- SENDCLIENT(argv[0]);
- SENDCLIENT(STRING(" :\r\n")); // TODO: Actual topic
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 333 "));
- SENDCLIENT(client_nick);
- SENDCLIENT(STRING(" "));
- SENDCLIENT(argv[0]);
- SENDCLIENT(STRING(" "));
- SENDCLIENT(client_nick); // TODO: Actual channel creator
- SENDCLIENT(STRING(" :1\r\n")); // TODO: Actual timestamp
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 353 "));
- SENDCLIENT(client_nick);
- SENDCLIENT(STRING(" = "));
- SENDCLIENT(argv[0]);
- SENDCLIENT(STRING(" :\r\n")); // TODO: NAMES list
- SENDCLIENT(STRING(":hax.irc.andrewyu.org 366 "));
- SENDCLIENT(client_nick);
- SENDCLIENT(STRING(" "));
- SENDCLIENT(argv[0]);
- SENDCLIENT(STRING(" :End of /NAMES list.\r\n"));
+ char current_time_nulstr[22];
+ uint64_t current_time;
+ { // Mostly to get rid of the compiler complaining about conversion to unsigned
+ time_t ctime = time(NULL);
+ if (ctime < 0) {
+ WRITES(2, STRING("Please check your clock."));
+ return 1;
+ }
+ current_time = (uint64_t)ctime;
+ }
+ snprintf(current_time_nulstr, 22, "%lu", time(NULL));
- SEND(STRING(":1HC FJOIN "));
- SEND(argv[0]);
- SEND(STRING(" "));
- char current_time[22];
- snprintf(current_time, 22, "%ld", time(NULL));
- SEND(((struct string){current_time, strlen(current_time)}));
- SEND(STRING(" + :,1HC000001\n"));
+ struct string channels = argv[0];
+ while (1) {
+ uint64_t offset = 0;
+
+ while (offset < channels.len && channels.data[offset] != ',')
+ offset++;
+
+ uint64_t oldlen = channels.len;
+ channels.len = offset;
+
+ struct channel_info *channel_info = get_table_index(channel_list, channels);
+ if (!channel_info) {
+ channel_info = malloc(sizeof(*channel_info));
+ if (!channel_info) {
+ WRITES(2, STRING("OOM! (client_join)\n"));
+ return 1;
+ }
+ *channel_info = (struct channel_info){
+ .ts = current_time,
+ .modes = {.array = malloc(0), .len = 0},
+ .user_list = {.array = malloc(0), .len = 0},
+ .metadata = {.array = malloc(0), .len = 0},
+ };
+
+ set_table_index(&channel_list, channels, channel_info);
+ }
+
+ set_table_index(&(channel_info->user_list), STRING("1HC000001"), get_table_index(user_list, STRING("1HC000001"))); // TODO: Actually add local users to that
+
+ SENDCLIENT(STRING(":"));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING("!e@e JOIN :"));
+ SENDCLIENT(channels);
+ SENDCLIENT(STRING("\r\n"));
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 332 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" "));
+ SENDCLIENT(channels);
+ SENDCLIENT(STRING(" :\r\n")); // TODO: Actual topic
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 333 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" "));
+ SENDCLIENT(channels);
+ SENDCLIENT(STRING(" "));
+ SENDCLIENT(client_nick); // TODO: Actual channel creator
+ SENDCLIENT(STRING(" :"));
+ SENDCLIENT(((struct string){.data = current_time_nulstr, .len = strlen(current_time_nulstr)}));
+ SENDCLIENT(STRING("\r\n"));
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 353 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" = "));
+ SENDCLIENT(channels);
+ SENDCLIENT(STRING(" :\r\n")); // TODO: NAMES list
+ SENDCLIENT(STRING(":hax.irc.andrewyu.org 366 "));
+ SENDCLIENT(client_nick);
+ SENDCLIENT(STRING(" "));
+ SENDCLIENT(channels);
+ SENDCLIENT(STRING(" :End of /NAMES list.\r\n"));
+
+ SEND(STRING(":1HC FJOIN "));
+ SEND(channels);
+ SEND(STRING(" "));
+ SEND(((struct string){.data = current_time_nulstr, .len = strlen(current_time_nulstr)}));
+ SEND(STRING(" +Cnt :,1HC000001\n"));
+
+ channels.len = oldlen;
+
+ if (channels.len <= offset+1)
+ break;
+
+ channels.data += offset + 1;
+ channels.len -= offset + 1;
+ }
return 0;
}