55 lines
1.2 KiB
OCaml
55 lines
1.2 KiB
OCaml
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 ->
|
|
()
|