shithub: ircd

ref: c86384b841687ea975571db934fb0e353ce5b5d4
dir: /chan.c/

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

#define DC (0x2)

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 && userinchannel(c, cl)) {
		fprint(2, "user %s already in channel %s\n", cl->nick, name);
		goto Out;
	}
	if (!c) {
		c = mallocz(sizeof(IChan), 1);
		c->name = strdup(name);
		ladd(&channels, c);
	}
	ladd(&c->users, cl);
	ladd(&cl->channels, c);
	
Out:
	if (debug & DC) {
		lforeach(&channels, printchannel, nil);
	}
	return c;
}

void
partchannel(IChan *ch, Client *cl)
{
	ldel(ch->users, cl, nil);
	ldel(cl->channels, ch, nil);
	if (debug & DC) {
		lforeach(&channels, printchannel, nil);
	}
}

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

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