ref: c86384b841687ea975571db934fb0e353ce5b5d4
dir: /chan.c/
#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);
}