shithub: ircd

ref: eaf9a2c0694335ea7d5139f83b3824f6127fb310
dir: /chan.c/

View raw version
#include <u.h>
#include <libc.h>
#include "dat.h"
#include "fns.h"
#include "ll.h"

static Linked *channels = nil;

static int
findchanbyname(void *c, void *n)
{
	char *name = n;
	IChan *ch = c;
	return !strcmp(name, ch->name);
}

static int
findclientinchannel(void *a, void *b)
{
	return a == b;
}

static void
printusers(void *a, void *b)
{
	Client *c = a;
	char *ch = b;
	fprint(2, "  %s: %s\n", ch, c->nick);
}

static void
printchannel(void *a, void*)
{
	IChan *ch = a;
	fprint(2, "channel: %s\n", ch->name);
	lforeach(&ch->users, printusers, ch->name);
}

IChan*
joinchannel(Client *cl, char *name)
{
	IChan *c = lfind(&channels, findchanbyname, name);
	if (!c) {
		c = mallocz(sizeof(IChan), 1);
		c->name = strdup(name);
		ladd(&channels, c);
	}
	ladd(&c->users, cl);
	ladd(&cl->channels, c);
	if (debug > 2) {
		lforeach(&channels, printchannel, nil);
	}
	return c;
}

IChan*
findchannel(char *name)
{
	return lfind(&channels, findchanbyname, name);
}

int
userinchannel(IChan *ch, Client *cl)
{
	return !!lfind(&ch->users, findclientinchannel, cl);
}