diff --git a/lib/irc/mode.ml b/lib/irc/mode.ml index 60c8a1e..28f07b8 100644 --- a/lib/irc/mode.ml +++ b/lib/irc/mode.ml @@ -86,11 +86,6 @@ module Set = struct let pp ppf s = Format.pp_print_string ppf (to_string s) - let of_list l = - List.fold_left (fun s e -> add e s) empty l - - (* TODO: i dont think the following two functions are useful outside of the expect tests *) - let of_string s = let chr = function | 'i' -> `i | 'm' -> `m | 'n' -> `n | 'o' -> `o @@ -98,14 +93,6 @@ module Set = struct | _ -> invalid_arg "Irc.Mode.Set.of_string" in String.fold_left (fun s c -> add (chr c) s) empty s - - let to_list s = - let cons x xs = - if mem x s then x :: xs - else xs - in - cons `i @@ cons `m @@ cons `n @@ cons `o @@ - cons `s @@ cons `t @@ cons `w [] end @@ -177,15 +164,14 @@ let%expect_test _ = let print_bool_nl b = print_endline (if b then "true" else "false") in print_set_nl Set.empty; [%expect {| [] |}]; - print_set_nl (Set.of_list [`i]); [%expect {| [i] |}]; - print_set_nl (Set.of_list [`n; `o]); [%expect {| [no] |}]; - print_set_nl (Set.of_list [`s; `m]); [%expect {| [ms] |}]; - print_set_nl (Set.of_string "wi"); [%expect {| [iw] |}]; - print_set_nl (Set.of_string "wi"); [%expect {| [iw] |}]; - print_bool_nl (Set.(mem `i (of_string "ins"))); [%expect "true"]; - print_bool_nl (Set.(mem `w (of_string "ins"))); [%expect "false"]; - print_bool_nl (Set.(mem `w (of_string "wwww"))); [%expect "true"]; - print_bool_nl (Set.(mem `t (of_string "imnosw"))); [%expect "false"]; + print_set_nl Set.(of_string "i"); [%expect {| [i] |}]; + print_set_nl Set.(of_string "no"); [%expect {| [no] |}]; + print_set_nl Set.(of_string "sm"); [%expect {| [ms] |}]; + print_set_nl Set.(of_string "wi"); [%expect {| [iw] |}]; + print_bool_nl Set.(mem `i (of_string "ins")); [%expect "true"]; + print_bool_nl Set.(mem `w (of_string "ins")); [%expect "false"]; + print_bool_nl Set.(mem `w (of_string "wwww")); [%expect "true"]; + print_bool_nl Set.(mem `t (of_string "imnosw")); [%expect "false"]; let print_user_mode_set_nl um = Format.printf "%a\n" Parse.pp_user_mode_set um diff --git a/lib/irc/mode.mli b/lib/irc/mode.mli index bc4ab75..24a05d0 100644 --- a/lib/irc/mode.mli +++ b/lib/irc/mode.mli @@ -19,9 +19,9 @@ Type D: +i Invite-Only Channel Mode +m Moderated Channel Mode + +n No External Messages Mode +s Secret Channel Mode +t Protected Topic Channel Mode - +n No External Messages Mode *) type user = [`i | `o | `w] @@ -54,8 +54,8 @@ module Set : sig val pp : Format.formatter -> t -> unit val to_string : t -> string val of_string : string -> t - val to_list : t -> elt list - val of_list : [< elt] list -> t + (* val to_list : t -> elt list *) + (* val of_list : [< elt] list -> t *) end module Parse : sig diff --git a/lib/server/router.ml b/lib/server/router.ml index 286d805..0aceff5 100644 --- a/lib/server/router.ml +++ b/lib/server/router.ml @@ -8,7 +8,7 @@ type t = { and user = { outbox : Outbox.t; userinfo : Irc.userinfo; - mutable mode : Irc.Mode.Set.t; + mutable user_mode : Irc.Mode.Set.t; mutable nick : Irc.name; mutable nick_key : string_ci; mutable membership : membership Dllist.t; @@ -19,6 +19,10 @@ and chan = { name_key : string_ci; mutable topic : string option; mutable members : membership Dllist.t; + mutable chan_mode : Irc.Mode.Set.t; (* +imstn *) + (* TODO: +b, +o, +v *) + (* TODO: +k *) + (* TODO: +l *) } and membership = { @@ -79,13 +83,14 @@ module User = struct userinfo; nick = "*"; nick_key = empty_string_ci; - mode = Irc.Mode.Set.of_list [`i; `w]; + user_mode = Irc.Mode.Set.of_string "iw"; membership = Dllist.create (); } let outbox t = t.outbox let nick t = t.nick - let mode t = t.mode + let mode t = t.user_mode + let set_mode t new_mode = t.user_mode <- new_mode let channels = user_channels let prefix = user_prefix (* let is_registered t = t.nick_key <> empty_string_ci *) @@ -108,9 +113,6 @@ module User = struct `nick_set end - let set_mode t new_mode = - t.mode <- new_mode - let rec part_all t = (* List.iter (fun c -> Chan.part c t) (channels t) *) match Dllist.take_l t.membership with @@ -131,12 +133,15 @@ module Chan = struct name_key = string_ci name; topic = None; members = Dllist.create (); + chan_mode = Irc.Mode.Set.of_string "nst"; } let name t = t.name let topic t = t.topic let members = chan_members let no_members t = Dllist.is_empty t.members + let mode t = t.chan_mode + let set_mode t new_mode = t.chan_mode <- new_mode let register t ~router = Hashtbl.replace router.channels t.name_key t