From 833c53b1ad3338677056445c32c490cac0a08875 Mon Sep 17 00:00:00 2001 From: Nakidai Date: Tue, 6 Jan 2026 04:01:24 +0300 Subject: Add basic channels Though they don't have modes, and JOIN/PART must be able to parse comma separated list of channels --- reply.c | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 reply.c (limited to 'reply.c') diff --git a/reply.c b/reply.c new file mode 100644 index 0000000..b73fbea --- /dev/null +++ b/reply.c @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2026 Nakidai Perumenei + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "ircd.h" + +#include + +#include + + +typedef int Reply(const struct Peer *peer, va_list ap); + +#define REPLY(n) static int r##n (const struct Peer *peer, va_list ap) +#define ARG(n) const char *n = va_arg(ap, const char *) + +REPLY(1) +{ + return writef( + peer->fd, + ":%s 001 %s Welcome to the Internet Relay Network %s!%s@%s", + hostname, + getnick(peer), + getnick(peer), + peer->user, + peer->host + ); +} + +REPLY(401) +{ + ARG(name); + return writef( + peer->fd, + ":%s 401 %s %s :No such nick/channel", + hostname, + getnick(peer), + name + ); +} + +REPLY(403) +{ + ARG(channel); + return writef( + peer->fd, + ":%s 403 %s %s :No such channel", + hostname, + getnick(peer), + channel + ); +} + +REPLY(405) +{ + ARG(channel); + return writef( + peer->fd, + ":%s 405 %s %s :You have joined too many channels", + hostname, + getnick(peer), + channel + ); +} + +REPLY(411) +{ + return writef( + peer->fd, + ":%s 411 %s :No recipient given (PRIVMSG)", + hostname, + getnick(peer) + ); +} + +REPLY(412) +{ + return writef( + peer->fd, + ":%s 412 %s :No text to send", + hostname, + getnick(peer) + ); +} + +REPLY(421) +{ + ARG(command); + return writef( + peer->fd, + ":%s 421 %s %s :Unknown command", + hostname, + getnick(peer), + command + ); +} + +REPLY(431) +{ + return writef( + peer->fd, + ":%s 431 %s :No nickname given", + hostname, + getnick(peer) + ); +} + +REPLY(442) +{ + ARG(channel); + return writef( + peer->fd, + ":%s 442 %s %s :You're not on that channel", + hostname, + getnick(peer), + channel + ); +} + +REPLY(451) +{ + return writef( + peer->fd, + ":%s 451 %s :You have not registered", + hostname, + getnick(peer) + ); +} + +REPLY(461) +{ + ARG(command); + return writef( + peer->fd, + ":%s 461 %s %s :Not enough parameters", + hostname, + getnick(peer), + command + ); +} + +REPLY(462) +{ + return writef( + peer->fd, + ":%s 462 %s :Unauthorized command (already registered)", + hostname, + getnick(peer) + ); +} + +REPLY(471) +{ + ARG(channel); + return writef( + peer->fd, + ":%s 471 %s %s :Cannot join channel (+l)", + hostname, + getnick(peer), + channel + ); +} + +#undef REPLY +#define REPLY(n) [n] = r##n +static Reply *replies[] = { + REPLY( 1), + REPLY(401), + REPLY(403), + REPLY(405), + REPLY(411), + REPLY(412), + REPLY(421), + REPLY(431), + REPLY(442), + REPLY(451), + REPLY(461), + REPLY(462), + REPLY(471), +}; + +int +reply(const struct Peer *peer, int number, ...) +{ + Reply *choice; + va_list args; + int ret; + + choice = replies[number]; + if (!choice) + warnx("YOU FUCKING STUPID SHIT IMPLEMENT REPLY #%d NOW!!!", number); + va_start(args, number); + ret = choice(peer, args); + va_end(args); + + return ret; +} -- cgit 1.4.1