shithub: ircd

Download patch

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);
 	}
--