open! Import include Router_types type t = user let make ~userinfo ~outbox = { outbox; userinfo; nick = ""; nick_key = empty_string_ci; user_mode = Irc.Mode.Set.empty; membership = Dllist.create (); } let outbox t = t.outbox let nick t = t.nick let mode t = t.user_mode let set_mode t new_mode = t.user_mode <- new_mode let prefix user = Irc.Msg.User_prefix (user.nick, Some user.userinfo) let channels user = Dllist.fold_r (fun m xs -> m.mem_chan :: xs) user.membership [] let register t ~router = Hashtbl.add router.users t.nick_key t let unregister t ~router = Hashtbl.remove router.users t.nick_key let set_nick ?(success_callback = ignore) t new_nick ~router = let key = string_ci new_nick in if Hashtbl.mem router.users key then `nick_in_use else begin (* hack to allow broadcasting a NICK message before nick is actually changed *) success_callback (); unregister t ~router; t.nick <- new_nick; t.nick_key <- key; register t ~router; `nick_set end let rec part_all t = (* List.iter (fun c -> Chan.part c t) (channels t) *) match Dllist.take_l t.membership with | m -> Option.iter Dllist.remove m.mem_in_chan; part_all t | exception Dllist.Empty -> ()