parse priv (+o, +v) modes in chan mode strings

This commit is contained in:
tali 2024-01-25 18:38:38 -05:00
parent 2bea08d04f
commit d66cd93152
2 changed files with 55 additions and 4 deletions

View File

@ -1,3 +1,5 @@
open Types
type user = [`i | `o | `w]
type chan_a = [`b]
type chan_b = [`k | `o | `v]
@ -166,24 +168,41 @@ module Parse = struct
| `unset
]
type add_or_rem = [
| `add
| `rem
]
type priv = [`o | `v]
type chan_modes = {
chan_modes : Set.change;
chan_key : string set_or_unset option;
chan_limit : int set_or_unset option;
chan_privs : (add_or_rem * priv * name) list;
}
let chan_modes_add (args, modes) = function
| `b ->
(* type A *)
(* TODO: ban *)
let args = match args with [] -> [] | _ :: args -> args in
args, modes
| `k ->
(* type B *)
let key, args = take args in
let chan_key = Some (`set key) in
args, { modes with chan_key }
| (`o | `v) as priv ->
(* type B *)
let nick, args = take args in
let chan_privs = (`add, priv, nick) :: modes.chan_privs in
args, { modes with chan_privs }
| `l ->
(* type C *)
let limit, args = take_int args in
let chan_limit = Some (`set limit) in
args, { modes with chan_limit }
| `b | `o | `v -> fail "TODO: + ban/op/voice"
| #chan_d as m ->
let chan_modes = {
Set.add = Set.add m modes.chan_modes.add;
@ -192,6 +211,11 @@ module Parse = struct
args, { modes with chan_modes }
let chan_modes_rem (args, modes) = function
| `b ->
(* type A *)
(* TODO: ban *)
let args = match args with [] -> [] | _ :: args -> args in
args, modes
| `k ->
(* type B *)
let _key, args = take args in
@ -201,7 +225,11 @@ module Parse = struct
(* type C *)
let chan_limit = Some `unset in
args, { modes with chan_limit }
| `b | `o | `v -> fail "TODO: - ban/op/voice"
| (`o | `v) as priv ->
(* type B *)
let nick, args = take args in
let chan_privs = (`rem, priv, nick) :: modes.chan_privs in
args, { modes with chan_privs }
| #chan_d as m ->
let chan_modes = {
Set.add = Set.remove m modes.chan_modes.add;
@ -214,6 +242,7 @@ module Parse = struct
chan_modes = Set.no_change;
chan_key = None;
chan_limit = None;
chan_privs = []
} in
let _, modes =
parse_mode_set str
@ -222,7 +251,7 @@ module Parse = struct
~add:chan_modes_add
~rem:chan_modes_rem
in
modes
{ modes with chan_privs = List.rev modes.chan_privs }
end
@ -292,6 +321,13 @@ let%expect_test _ =
| Some `unset -> Format.printf " -k"
| None -> ()
end;
List.iter
(fun (add_rem, mode, nick) ->
Format.printf " %c%c:%s"
(match add_rem with `add -> '+' | `rem -> '-')
(to_char mode)
nick)
m.chan_privs;
Format.printf "]\n@."
in
@ -303,3 +339,9 @@ let%expect_test _ =
print_chan_modes (Parse.chan_modes "+k-k+k" ["a"; "b"; "c"]);
[%expect {| [+ +k:"c"] |}];
print_chan_modes (Parse.chan_modes "+o+v" ["aaa"; "bbb"]);
[%expect {| [+ +o:aaa +v:bbb] |}];
print_chan_modes (Parse.chan_modes "+o-v" ["aaa"; "bbb"]);
[%expect {| [+ +o:aaa -v:bbb] |}];

View File

@ -1,3 +1,5 @@
open Types
(*
User Modes:
+i Invisible User Mode
@ -78,11 +80,18 @@ module Parse : sig
| `unset
]
type add_or_rem = [
| `add
| `rem
]
type priv = [`o | `v]
type chan_modes = {
chan_modes : Set.change;
chan_key : string set_or_unset option;
chan_limit : int set_or_unset option;
(* TODO: ban, op, voice *)
chan_privs : (add_or_rem * priv * name) list;
}
val user_modes : string -> user_modes