open! Import include Router_types type t = chan let make ~name = { name; name_key = string_ci name; topic = None; members = Dllist.create (); chan_mode = Irc.Mode.Set.empty; chan_limit = None; chan_key = None; } let name t = t.name let topic t = t.topic let mode t = t.chan_mode let set_mode t new_mode = t.chan_mode <- new_mode let limit t = t.chan_limit let set_limit t n = t.chan_limit <- n let key t = t.chan_key let set_key t k = t.chan_key <- k let members chan = Dllist.fold_r (fun m xs -> m.mem_user :: xs) chan.members [] let no_members t = Dllist.is_empty t.members let register t ~router = Hashtbl.replace router.channels t.name_key t let unregister t ~router = Hashtbl.remove router.channels t.name_key let is_registered t ~router = Hashtbl.mem router.channels t.name_key let is_member t user = let is_mem m = m.mem_chan == t in try ignore (Dllist.find_node_l is_mem user.membership); true with Not_found -> false let join t user = let m = { mem_chan = t; mem_user = user; mem_in_chan = None; } in begin m.mem_in_chan <- Some (Dllist.add_r m t.members); ignore (Dllist.add_r m user.membership); end let part t user = let is_mem m = m.mem_chan == t in let mem = Dllist.find_node_l is_mem user.membership in Option.iter Dllist.remove (Dllist.get mem).mem_in_chan; Dllist.remove mem