ref: 2716869c69ae007306e1b2bacfc0bf7adbccb0fc
parent: eaf9a2c0694335ea7d5139f83b3824f6127fb310
author: sirjofri <sirjofri@sirjofri.de>
date: Sun Aug 3 12:14:49 EDT 2025
first working channel conversation with ircrc and RevolutionIRC
--- a/cmd.c
+++ b/cmd.c
@@ -21,6 +21,18 @@
}
static void
+postconnect(Client *c)
+{+ reply(c, Rwelcome, c);
+ reply(c, Ryourhost, sysnameb, Vversion);
+ reply(c, Rcreated, "sometime"); // TODO
+ reply(c, Rmyinfo, sysnameb, Vversion, "i", "ov");
+ reply(c, Rmotdstart, sysnameb);
+ reply(c, Rmotd);
+ reply(c, Rmotdend);
+}
+
+static void
cuser(Client *c, Request *r)
{/* (/lib/rfc/rfc2812:/^3.1.3) */
@@ -36,12 +48,10 @@
}
u = adduser(r->args[0]);
u->realname = strdup(r->args[3]);
+ u->host = strdup(sysnameb);
+ c->nick = strdup(r->args[0]);
c->user = u;
-
- if (c->nick && !u->greeted) {- u->greeted = 1;
- reply(c, Rwelcome, welcome, c->nick, u->name, sysnameb);
- }
+ postconnect(c);
}
static void
@@ -48,6 +58,7 @@
cnick(Client *c, Request *r)
{/* (/lib/rfc/rfc2812:/^3.1.2) */
+ User *u;
if (!r->args[0]) {reply(c, Enonicknamegiven);
return;
@@ -59,11 +70,16 @@
}
c->nick = strdup(r->args[0]);
-
- if (c->user && !c->user->greeted) {- c->user->greeted = 1;
- reply(c, Rwelcome, welcome, c->nick, c->user->name, sysnameb);
+ u = finduser(r->args[0]);
+ if (u) {+ reply(c, Enicknameinuse, r->args[0]);
+ return;
}
+ u = adduser(r->args[0]);
+ u->host = sysnameb;
+ c->user = u;
+
+ postconnect(c);
}
static void
@@ -117,6 +133,8 @@
{Client *c = a;
A_privmsgsend *args = b;
+ if (c == args->sender)
+ return;
ircsend(c, args->sender, Sprivmsg, args->chan->name, args->msg);
}
--- a/cmd.h
+++ b/cmd.h
@@ -1,8 +1,23 @@
Reply Rwelcome = {.nr = 001,
- .msg = ":%s %s!%s@%s",
+ .msg = ":Welcome to the Internet Relay Network %I",
};
+Reply Ryourhost = {+ .nr = 002,
+ .msg = "Your host is %s, running version %s",
+};
+
+Reply Rcreated = {+ .nr = 003,
+ .msg = "This server was created %s",
+};
+
+Reply Rmyinfo = {+ .nr = 004,
+ .msg = "%s %s %s %s",
+};
+
Reply Raway = {.nr = 301,
.msg = "%s :%s",
@@ -45,12 +60,27 @@
Reply Rnamreply = {.nr = 353,
- .msg = "%c%s :%s",
+ .msg = "%c %s :%s",
};
Reply Rendofnames = {.nr = 366,
.msg = "%s :End of NAMES list",
+};
+
+Reply Rmotd = {+ .nr = 372,
+ .msg = ":- some motd",
+};
+
+Reply Rmotdstart = {+ .nr = 375,
+ .msg = ":- %s Message of the day - ",
+};
+
+Reply Rmotdend = {+ .nr = 376,
+ .msg = ":End of MOTD command",
};
Reply Enosuchnick = {--- a/dat.h
+++ b/dat.h
@@ -8,6 +8,7 @@
typedef struct IChan IChan;
#pragma varargck type "R" Request
+#pragma varargck type "I" Client*
struct Prefix
{@@ -46,7 +47,6 @@
char *name;
char *host; /* if nil, local use (use sysname) */
char *realname;
- int greeted;
};
struct Client
--- a/fmt.c
+++ b/fmt.c
@@ -21,3 +21,19 @@
r.args[10], r.args[11], r.args[12], r.args[13], r.args[14]
);
}
+
+int
+Ifmt(Fmt *f)
+{+ Client *c;
+ int valid;
+ c = va_arg(f->args, Client*);
+ valid = c->user && c->user->host && c->user->name;
+ return fmtprint(f, "%s%s%s%s%s",
+ c->nick,
+ valid ? "!" : "",
+ valid ? c->user->name : "",
+ valid ? "@" : "",
+ valid ? c->user->host : ""
+ );
+}
--- a/fns.h
+++ b/fns.h
@@ -11,6 +11,7 @@
char *getreplies(Client*);
void flushreplies(Client*);
+int Ifmt(Fmt *f);
int Rfmt(Fmt *f);
char *getversion(void);
--- a/ircd.c
+++ b/ircd.c
@@ -65,6 +65,7 @@
return;
}
+ /* TODO idea: qlock to note that new messages are there */
while (1) {qlock(&c->replies);
repl = getreplies(c);
@@ -198,6 +199,7 @@
}ARGEND;
fmtinstall('R', Rfmt);+ fmtinstall('I', Ifmt);sysnameb = sysname();
reqqueue = reqqueuecreate();
--- a/reply.c
+++ b/reply.c
@@ -28,7 +28,7 @@
va_list arg;
String *s;
- i = snprint(buf, sizeof buf, ":%s %03d ", sysnameb, repl.nr);
+ i = snprint(buf, sizeof buf, ":%s %03d %s ", sysnameb, repl.nr, c->nick);
va_start(arg, repl);
i += vsnprint(&buf[i], sizeof(buf) - i, repl.msg, arg);
@@ -53,9 +53,7 @@
String *s;
if (sender) {- i = snprint(buf, sizeof buf, ":%s!%s@%s ",
- sender->nick, sender->user->name,
- sender->user->host ? sender->user->host : sysnameb);
+ i = snprint(buf, sizeof buf, ":%I ", sender);
} else {i = snprint(buf, sizeof buf, ":%s ", sysnameb);
}
--
⑨