66 lines
1.4 KiB
OCaml
66 lines
1.4 KiB
OCaml
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
|
|
|