diff options
Diffstat (limited to 'client_network.c')
-rw-r--r-- | client_network.c | 150 |
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; } |