ref: 3e1c35f04bc91f20cf8026b7eb03addd3744b19e
parent: 9922e90ae9072e72a7f61c8328ad1f71cee6cf0f
author: sirjofri <sirjofri@sirjofri.de>
date: Mon Jul 21 16:49:35 EDT 2025
basic nick handling, etc
--- a/client.c
+++ b/client.c
@@ -53,3 +53,13 @@
}
return nil;
}
+
+Client*
+findnick(char *nick)
+{
+ for (Client *c = first; c; c = c->next) {
+ if (c->nick && strcmp(c->nick, nick) == 0)
+ return c;
+ }
+ return nil;
+}
--- a/cmd.c
+++ b/cmd.c
@@ -32,18 +32,62 @@
return;
}
u = adduser(r->args[0]);
+ u->realname = strdup(r->args[3]);
c->user = u;
}
static void
+cnick(Client *c, Request *r)
+{
+ if (!r->args[0]) {
+ reply(c, Enonicknamegiven);
+ return;
+ }
+
+ if (findnick(r->args[0])) {
+ reply(c, Enicknameinuse, r->args[0]);
+ return;
+ }
+
+ c->nick = strdup(r->args[0]);
+}
+
+static void
cwhois(Client *c, Request *r)
{
+ // TODO: implement remaining replies: (/lib/rfc/rfc2812:/^3.6.2)
+ int start = 0;
+ char *server = nil;
+ User *u;
+ Client *cl;
+
if (!r->args[0]) {
- /* information about self */
- reply(c, Rwhoisuser, c->user->name, c->user->name, c->user->name, c->user->name);
+ reply(c, Enonicknamegiven);
return;
- // TODO: fill with proper data!
}
+ if (r->args[1] && strcmp(r->args[1], ",")) {
+ server = r->args[0];
+ start = 2;
+ }
+ for (int i = start; i < 15; i += 2) {
+ /* args[i] is nick, args[i+1] is ',' */
+ if (!r->args[i])
+ break;
+ if (!server) {
+ cl = findnick(r->args[i]);
+ if (cl) {
+ u = cl->user;
+ if (!u)
+ goto Next;
+ reply(c, Rwhoisuser, cl->nick, u->name, sysnameb, u->realname);
+ } else
+ reply(c, Enosuchnick, r->args[i]);
+ } else {
+ // TODO: forward to server: send message to server
+ }
+Next:
+ reply(c, Rendofwhois, r->args[i]);
+ }
}
static Command commands[] = {
@@ -50,6 +94,7 @@
{ "whois", cwhois },
{ "version", cversion },
{ "user", cuser },
+ { "nick", cnick },
};
int ncommands = sizeof(commands) / sizeof(Command);
--- a/cmd.h
+++ b/cmd.h
@@ -3,16 +3,36 @@
.msg = "%s %s %s * :%s",
};
+Reply Rendofwhois = {
+ .nr = 318,
+ .msg = "%s :End of WHOIS list",
+};
+
Reply Rversion = {
.nr = 351,
.msg = "%s",
};
+Reply Enosuchnick = {
+ .nr = 401,
+ .msg = "%s :No such nick/channel",
+};
+
Reply Enosuchserver = {
.nr = 402,
.msg = "%s :No such server",
};
+Reply Enonicknamegiven = {
+ .nr = 431,
+ .msg = ":No nickname given",
+};
+
+Reply Enicknameinuse = {
+ .nr = 433,
+ .msg = "%s :Nickname is already in use",
+};
+
Reply Eneedmoreparams = {
.nr = 461,
.msg = "%s :Not enough parameters",
@@ -21,4 +41,9 @@
Reply Ealreadyregistered = {
.nr = 462,
.msg = ":Unauthorized command (already registered)",
+};
+
+Reply Erestricted = {
+ .nr = 484,
+ .msg = ":Your connection is restricted!",
};
--- a/dat.h
+++ b/dat.h
@@ -44,6 +44,7 @@
struct User
{
char *name;
+ char *realname;
User *prev;
User *next;
@@ -59,6 +60,7 @@
ulong fid;
Replybuffer replies;
User *user;
+ char *nick;
Client *next;
Client *prev;
--- a/fns.h
+++ b/fns.h
@@ -5,7 +5,6 @@
void execrequest(Client*, Request);
void clearrequest(Request);
-void setuser(User*);
void reply(Client*, Reply, ...);
char *getreplies(Client*);
void flushreplies(Client*);
@@ -19,4 +18,5 @@
Client* addclient(ulong);
Client* findclient(ulong);
+Client* findnick(char*);
void delclient(Client*);
--- a/ircd.c
+++ b/ircd.c
@@ -49,12 +49,6 @@
return c;
}
-void
-setuser(User *u)
-{
- ;
-}
-
static void
readproc(Req *r)
{
@@ -118,12 +112,11 @@
r->ofcall.count = r->ifcall.count;
line[r->ifcall.count-1] = 0; /* last char is either \n or \r */
- c = strchr(line, '\n');
- if (c) {
- *c = 0;
- c--;
- if (*c == ' ')
- *c = 0;
+ c = strchr(line, ' ');
+ if (c) *c = 0;
+ else {
+ c = strchr(line, '\n');
+ if (c) *c = 0;
}
parsed = parseline(line);
--
⑨