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