diff options
| author | Adelyn Breelove <[email protected]> | 2018-12-17 13:13:10 -0700 |
|---|---|---|
| committer | Adelyn Breelove <[email protected]> | 2018-12-17 13:13:10 -0700 |
| commit | 57df76de6441899b659e30c6a8e9d7572b85f7a0 (patch) | |
| tree | 3825d09337f03c447bb86ce66834b4fd39a8083b /lib/models | |
| parent | Add a few sigs (diff) | |
| download | disml-57df76de6441899b659e30c6a8e9d7572b85f7a0.tar.xz disml-57df76de6441899b659e30c6a8e9d7572b85f7a0.zip | |
Some abstractions
Diffstat (limited to 'lib/models')
| -rw-r--r-- | lib/models/gen/guild.atd | 4 | ||||
| -rw-r--r-- | lib/models/gen/guild_j.ml | 172 | ||||
| -rw-r--r-- | lib/models/gen/guild_j.mli | 4 | ||||
| -rw-r--r-- | lib/models/gen/guild_t.ml | 4 | ||||
| -rw-r--r-- | lib/models/gen/guild_t.mli | 4 | ||||
| -rw-r--r-- | lib/models/gen/role.atd | 12 | ||||
| -rw-r--r-- | lib/models/gen/role_j.ml | 645 | ||||
| -rw-r--r-- | lib/models/gen/role_j.mli | 54 | ||||
| -rw-r--r-- | lib/models/gen/role_t.ml | 14 | ||||
| -rw-r--r-- | lib/models/gen/role_t.mli | 14 | ||||
| -rw-r--r-- | lib/models/gen/user.atd | 12 | ||||
| -rw-r--r-- | lib/models/gen/user_j.ml | 8 | ||||
| -rw-r--r-- | lib/models/gen/user_j.mli | 2 | ||||
| -rw-r--r-- | lib/models/gen/user_t.ml | 2 | ||||
| -rw-r--r-- | lib/models/gen/user_t.mli | 2 | ||||
| -rw-r--r-- | lib/models/guild.ml | 98 | ||||
| -rw-r--r-- | lib/models/role.ml | 23 | ||||
| -rw-r--r-- | lib/models/snowflake.ml | 12 | ||||
| -rw-r--r-- | lib/models/user.ml | 20 |
19 files changed, 934 insertions, 172 deletions
diff --git a/lib/models/gen/guild.atd b/lib/models/gen/guild.atd index c622eea..3bb40d9 100644 --- a/lib/models/gen/guild.atd +++ b/lib/models/gen/guild.atd @@ -31,6 +31,6 @@ type t = { ?large: bool option; ?unavailable: bool option; ?member_count: int option; - ?members: member list option; - ?channels: channel list option; + ~members: member list; + ~channels: channel list; }
\ No newline at end of file diff --git a/lib/models/gen/guild_j.ml b/lib/models/gen/guild_j.ml index 9f7b069..210dee8 100644 --- a/lib/models/gen/guild_j.ml +++ b/lib/models/gen/guild_j.ml @@ -38,8 +38,8 @@ type t = Guild_t.t = { large: bool option; unavailable: bool option; member_count: int option; - members: member list option; - channels: channel list option + members: member list; + channels: channel list } let write_user = ( @@ -406,133 +406,19 @@ let read__2 = ( ) let _2_of_string s = read__2 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) -let write__11 = ( +let write__10 = ( Atdgen_runtime.Oj_run.write_list ( write_channel ) ) -let string_of__11 ?(len = 1024) x = - let ob = Bi_outbuf.create len in - write__11 ob x; - Bi_outbuf.contents ob -let read__11 = ( - Atdgen_runtime.Oj_run.read_list ( - read_channel - ) -) -let _11_of_string s = - read__11 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) -let write__12 = ( - Atdgen_runtime.Oj_run.write_option ( - write__11 - ) -) -let string_of__12 ?(len = 1024) x = - let ob = Bi_outbuf.create len in - write__12 ob x; - Bi_outbuf.contents ob -let read__12 = ( - fun p lb -> - Yojson.Safe.read_space p lb; - match Yojson.Safe.start_any_variant p lb with - | `Edgy_bracket -> ( - match Yojson.Safe.read_ident p lb with - | "None" -> - Yojson.Safe.read_space p lb; - Yojson.Safe.read_gt p lb; - (None : _ option) - | "Some" -> - Atdgen_runtime.Oj_run.read_until_field_value p lb; - let x = ( - read__11 - ) p lb - in - Yojson.Safe.read_space p lb; - Yojson.Safe.read_gt p lb; - (Some x : _ option) - | x -> - Atdgen_runtime.Oj_run.invalid_variant_tag p x - ) - | `Double_quote -> ( - match Yojson.Safe.finish_string p lb with - | "None" -> - (None : _ option) - | x -> - Atdgen_runtime.Oj_run.invalid_variant_tag p x - ) - | `Square_bracket -> ( - match Atdgen_runtime.Oj_run.read_string p lb with - | "Some" -> - Yojson.Safe.read_space p lb; - Yojson.Safe.read_comma p lb; - Yojson.Safe.read_space p lb; - let x = ( - read__11 - ) p lb - in - Yojson.Safe.read_space p lb; - Yojson.Safe.read_rbr p lb; - (Some x : _ option) - | x -> - Atdgen_runtime.Oj_run.invalid_variant_tag p x - ) -) -let _12_of_string s = - read__12 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) -let write__10 = ( - Atdgen_runtime.Oj_run.write_option ( - write__9 - ) -) let string_of__10 ?(len = 1024) x = let ob = Bi_outbuf.create len in write__10 ob x; Bi_outbuf.contents ob let read__10 = ( - fun p lb -> - Yojson.Safe.read_space p lb; - match Yojson.Safe.start_any_variant p lb with - | `Edgy_bracket -> ( - match Yojson.Safe.read_ident p lb with - | "None" -> - Yojson.Safe.read_space p lb; - Yojson.Safe.read_gt p lb; - (None : _ option) - | "Some" -> - Atdgen_runtime.Oj_run.read_until_field_value p lb; - let x = ( - read__9 - ) p lb - in - Yojson.Safe.read_space p lb; - Yojson.Safe.read_gt p lb; - (Some x : _ option) - | x -> - Atdgen_runtime.Oj_run.invalid_variant_tag p x - ) - | `Double_quote -> ( - match Yojson.Safe.finish_string p lb with - | "None" -> - (None : _ option) - | x -> - Atdgen_runtime.Oj_run.invalid_variant_tag p x - ) - | `Square_bracket -> ( - match Atdgen_runtime.Oj_run.read_string p lb with - | "Some" -> - Yojson.Safe.read_space p lb; - Yojson.Safe.read_comma p lb; - Yojson.Safe.read_space p lb; - let x = ( - read__9 - ) p lb - in - Yojson.Safe.read_space p lb; - Yojson.Safe.read_rbr p lb; - (Some x : _ option) - | x -> - Atdgen_runtime.Oj_run.invalid_variant_tag p x - ) + Atdgen_runtime.Oj_run.read_list ( + read_channel + ) ) let _10_of_string s = read__10 (Yojson.Safe.init_lexer ()) (Lexing.from_string s) @@ -837,7 +723,7 @@ let write_t : _ -> t -> _ = ( ) ob x; ); - (match x.members with None -> () | Some x -> + if x.members <> [] then ( if !is_first then is_first := false else @@ -846,18 +732,18 @@ let write_t : _ -> t -> _ = ( ( write__9 ) - ob x; + ob x.members; ); - (match x.channels with None -> () | Some x -> + if x.channels <> [] then ( if !is_first then is_first := false else Bi_outbuf.add_char ob ','; Bi_outbuf.add_string ob "\"channels\":"; ( - write__11 + write__10 ) - ob x; + ob x.channels; ); Bi_outbuf.add_char ob '}'; ) @@ -893,8 +779,8 @@ let read_t = ( let field_large = ref (None) in let field_unavailable = ref (None) in let field_member_count = ref (None) in - let field_members = ref (None) in - let field_channels = ref (None) in + let field_members = ref ([]) in + let field_channels = ref ([]) in let bits0 = ref 0 in try Yojson.Safe.read_space p lb; @@ -1381,21 +1267,17 @@ let read_t = ( | 24 -> if not (Yojson.Safe.read_null_if_possible p lb) then ( field_members := ( - Some ( - ( - read__9 - ) p lb - ) + ( + read__9 + ) p lb ); ) | 25 -> if not (Yojson.Safe.read_null_if_possible p lb) then ( field_channels := ( - Some ( - ( - read__11 - ) p lb - ) + ( + read__10 + ) p lb ); ) | _ -> ( @@ -1887,21 +1769,17 @@ let read_t = ( | 24 -> if not (Yojson.Safe.read_null_if_possible p lb) then ( field_members := ( - Some ( - ( - read__9 - ) p lb - ) + ( + read__9 + ) p lb ); ) | 25 -> if not (Yojson.Safe.read_null_if_possible p lb) then ( field_channels := ( - Some ( - ( - read__11 - ) p lb - ) + ( + read__10 + ) p lb ); ) | _ -> ( diff --git a/lib/models/gen/guild_j.mli b/lib/models/gen/guild_j.mli index d430b2a..7eca304 100644 --- a/lib/models/gen/guild_j.mli +++ b/lib/models/gen/guild_j.mli @@ -38,8 +38,8 @@ type t = Guild_t.t = { large: bool option; unavailable: bool option; member_count: int option; - members: member list option; - channels: channel list option + members: member list; + channels: channel list } val write_user : diff --git a/lib/models/gen/guild_t.ml b/lib/models/gen/guild_t.ml index 9ffe83f..fe2a59c 100644 --- a/lib/models/gen/guild_t.ml +++ b/lib/models/gen/guild_t.ml @@ -38,6 +38,6 @@ type t = { large: bool option; unavailable: bool option; member_count: int option; - members: member list option; - channels: channel list option + members: member list; + channels: channel list } diff --git a/lib/models/gen/guild_t.mli b/lib/models/gen/guild_t.mli index 9ffe83f..fe2a59c 100644 --- a/lib/models/gen/guild_t.mli +++ b/lib/models/gen/guild_t.mli @@ -38,6 +38,6 @@ type t = { large: bool option; unavailable: bool option; member_count: int option; - members: member list option; - channels: channel list option + members: member list; + channels: channel list } diff --git a/lib/models/gen/role.atd b/lib/models/gen/role.atd index a6bdcba..8e3f6aa 100644 --- a/lib/models/gen/role.atd +++ b/lib/models/gen/role.atd @@ -1,6 +1,6 @@ type snowflake <ocaml from="Snowflake" t="t"> = abstract -type t = { +type role = { id: snowflake; name: string; colour <json name="color">: int; @@ -9,4 +9,14 @@ type t = { permissions: int; managed: bool; mentionable: bool; +} + +type role_update = { + role: role; + id: snowflake; +} + +type t = { + inherit role; + guild_id: snowflake; }
\ No newline at end of file diff --git a/lib/models/gen/role_j.ml b/lib/models/gen/role_j.ml index a15b6cf..4761c70 100644 --- a/lib/models/gen/role_j.ml +++ b/lib/models/gen/role_j.ml @@ -11,9 +11,23 @@ type t = Role_t.t = { position: int; permissions: int; managed: bool; + mentionable: bool; + guild_id: snowflake +} + +type role = Role_t.role = { + id: snowflake; + name: string; + colour: int; + hoist: bool; + position: int; + permissions: int; + managed: bool; mentionable: bool } +type role_update = Role_t.role_update = { role: role; id: snowflake } + let write_snowflake = ( Snowflake_j.write_t ) @@ -102,6 +116,15 @@ let write_t : _ -> t -> _ = ( Yojson.Safe.write_bool ) ob x.mentionable; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"guild_id\":"; + ( + write_snowflake + ) + ob x.guild_id; Bi_outbuf.add_char ob '}'; ) let string_of_t ?(len = 1024) x = @@ -120,6 +143,471 @@ let read_t = ( let field_permissions = ref (Obj.magic (Sys.opaque_identity 0.0)) in let field_managed = ref (Obj.magic (Sys.opaque_identity 0.0)) in let field_mentionable = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_guild_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 'n' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 5 -> ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'o' && String.unsafe_get s (pos+4) = 'r' then ( + 2 + ) + else ( + -1 + ) + ) + | 'h' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 's' && String.unsafe_get s (pos+4) = 't' then ( + 3 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 'g' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'd' then ( + 6 + ) + else ( + -1 + ) + ) + | 8 -> ( + match String.unsafe_get s pos with + | 'g' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 8 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 't' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'o' && String.unsafe_get s (pos+7) = 'n' then ( + 4 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 11 -> ( + match String.unsafe_get s pos with + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'o' && String.unsafe_get s (pos+6) = 'n' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 'b' && String.unsafe_get s (pos+9) = 'l' && String.unsafe_get s (pos+10) = 'e' then ( + 7 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'r' && String.unsafe_get s (pos+3) = 'm' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 's' && String.unsafe_get s (pos+6) = 's' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'o' && String.unsafe_get s (pos+9) = 'n' && String.unsafe_get s (pos+10) = 's' then ( + 5 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + field_colour := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 3 -> + field_hoist := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 4 -> + field_position := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x10; + | 5 -> + field_permissions := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x20; + | 6 -> + field_managed := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x40; + | 7 -> + field_mentionable := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x80; + | 8 -> + field_guild_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x100; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 0 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 'n' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'm' && String.unsafe_get s (pos+3) = 'e' then ( + 1 + ) + else ( + -1 + ) + ) + | 5 -> ( + match String.unsafe_get s pos with + | 'c' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'o' && String.unsafe_get s (pos+4) = 'r' then ( + 2 + ) + else ( + -1 + ) + ) + | 'h' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 's' && String.unsafe_get s (pos+4) = 't' then ( + 3 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 7 -> ( + if String.unsafe_get s pos = 'm' && String.unsafe_get s (pos+1) = 'a' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 'a' && String.unsafe_get s (pos+4) = 'g' && String.unsafe_get s (pos+5) = 'e' && String.unsafe_get s (pos+6) = 'd' then ( + 6 + ) + else ( + -1 + ) + ) + | 8 -> ( + match String.unsafe_get s pos with + | 'g' -> ( + if String.unsafe_get s (pos+1) = 'u' && String.unsafe_get s (pos+2) = 'i' && String.unsafe_get s (pos+3) = 'l' && String.unsafe_get s (pos+4) = 'd' && String.unsafe_get s (pos+5) = '_' && String.unsafe_get s (pos+6) = 'i' && String.unsafe_get s (pos+7) = 'd' then ( + 8 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 's' && String.unsafe_get s (pos+3) = 'i' && String.unsafe_get s (pos+4) = 't' && String.unsafe_get s (pos+5) = 'i' && String.unsafe_get s (pos+6) = 'o' && String.unsafe_get s (pos+7) = 'n' then ( + 4 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | 11 -> ( + match String.unsafe_get s pos with + | 'm' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'n' && String.unsafe_get s (pos+3) = 't' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 'o' && String.unsafe_get s (pos+6) = 'n' && String.unsafe_get s (pos+7) = 'a' && String.unsafe_get s (pos+8) = 'b' && String.unsafe_get s (pos+9) = 'l' && String.unsafe_get s (pos+10) = 'e' then ( + 7 + ) + else ( + -1 + ) + ) + | 'p' -> ( + if String.unsafe_get s (pos+1) = 'e' && String.unsafe_get s (pos+2) = 'r' && String.unsafe_get s (pos+3) = 'm' && String.unsafe_get s (pos+4) = 'i' && String.unsafe_get s (pos+5) = 's' && String.unsafe_get s (pos+6) = 's' && String.unsafe_get s (pos+7) = 'i' && String.unsafe_get s (pos+8) = 'o' && String.unsafe_get s (pos+9) = 'n' && String.unsafe_get s (pos+10) = 's' then ( + 5 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_name := ( + ( + Atdgen_runtime.Oj_run.read_string + ) p lb + ); + bits0 := !bits0 lor 0x2; + | 2 -> + field_colour := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x4; + | 3 -> + field_hoist := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x8; + | 4 -> + field_position := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x10; + | 5 -> + field_permissions := ( + ( + Atdgen_runtime.Oj_run.read_int + ) p lb + ); + bits0 := !bits0 lor 0x20; + | 6 -> + field_managed := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x40; + | 7 -> + field_mentionable := ( + ( + Atdgen_runtime.Oj_run.read_bool + ) p lb + ); + bits0 := !bits0 lor 0x80; + | 8 -> + field_guild_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x100; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x1ff then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "id"; "name"; "colour"; "hoist"; "position"; "permissions"; "managed"; "mentionable"; "guild_id" |]; + ( + { + id = !field_id; + name = !field_name; + colour = !field_colour; + hoist = !field_hoist; + position = !field_position; + permissions = !field_permissions; + managed = !field_managed; + mentionable = !field_mentionable; + guild_id = !field_guild_id; + } + : t) + ) +) +let t_of_string s = + read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_role : _ -> role -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"id\":"; + ( + write_snowflake + ) + ob x.id; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"name\":"; + ( + Yojson.Safe.write_string + ) + ob x.name; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"color\":"; + ( + Yojson.Safe.write_int + ) + ob x.colour; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"hoist\":"; + ( + Yojson.Safe.write_bool + ) + ob x.hoist; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"position\":"; + ( + Yojson.Safe.write_int + ) + ob x.position; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"permissions\":"; + ( + Yojson.Safe.write_int + ) + ob x.permissions; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"managed\":"; + ( + Yojson.Safe.write_bool + ) + ob x.managed; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"mentionable\":"; + ( + Yojson.Safe.write_bool + ) + ob x.mentionable; + Bi_outbuf.add_char ob '}'; +) +let string_of_role ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_role ob x; + Bi_outbuf.contents ob +let read_role = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_name = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_colour = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_hoist = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_position = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_permissions = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_managed = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_mentionable = ref (Obj.magic (Sys.opaque_identity 0.0)) in let bits0 = ref 0 in try Yojson.Safe.read_space p lb; @@ -442,8 +930,159 @@ let read_t = ( managed = !field_managed; mentionable = !field_mentionable; } - : t) + : role) ) ) -let t_of_string s = - read_t (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let role_of_string s = + read_role (Yojson.Safe.init_lexer ()) (Lexing.from_string s) +let write_role_update : _ -> role_update -> _ = ( + fun ob x -> + Bi_outbuf.add_char ob '{'; + let is_first = ref true in + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"role\":"; + ( + write_role + ) + ob x.role; + if !is_first then + is_first := false + else + Bi_outbuf.add_char ob ','; + Bi_outbuf.add_string ob "\"id\":"; + ( + write_snowflake + ) + ob x.id; + Bi_outbuf.add_char ob '}'; +) +let string_of_role_update ?(len = 1024) x = + let ob = Bi_outbuf.create len in + write_role_update ob x; + Bi_outbuf.contents ob +let read_role_update = ( + fun p lb -> + Yojson.Safe.read_space p lb; + Yojson.Safe.read_lcurl p lb; + let field_role = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let field_id = ref (Obj.magic (Sys.opaque_identity 0.0)) in + let bits0 = ref 0 in + try + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_end lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 1 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' then ( + 0 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_role := ( + ( + read_role + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x2; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + while true do + Yojson.Safe.read_space p lb; + Yojson.Safe.read_object_sep p lb; + Yojson.Safe.read_space p lb; + let f = + fun s pos len -> + if pos < 0 || len < 0 || pos + len > String.length s then + invalid_arg "out-of-bounds substring position or length"; + match len with + | 2 -> ( + if String.unsafe_get s pos = 'i' && String.unsafe_get s (pos+1) = 'd' then ( + 1 + ) + else ( + -1 + ) + ) + | 4 -> ( + if String.unsafe_get s pos = 'r' && String.unsafe_get s (pos+1) = 'o' && String.unsafe_get s (pos+2) = 'l' && String.unsafe_get s (pos+3) = 'e' then ( + 0 + ) + else ( + -1 + ) + ) + | _ -> ( + -1 + ) + in + let i = Yojson.Safe.map_ident p f lb in + Atdgen_runtime.Oj_run.read_until_field_value p lb; + ( + match i with + | 0 -> + field_role := ( + ( + read_role + ) p lb + ); + bits0 := !bits0 lor 0x1; + | 1 -> + field_id := ( + ( + read_snowflake + ) p lb + ); + bits0 := !bits0 lor 0x2; + | _ -> ( + Yojson.Safe.skip_json p lb + ) + ); + done; + assert false; + with Yojson.End_of_object -> ( + if !bits0 <> 0x3 then Atdgen_runtime.Oj_run.missing_fields p [| !bits0 |] [| "role"; "id" |]; + ( + { + role = !field_role; + id = !field_id; + } + : role_update) + ) +) +let role_update_of_string s = + read_role_update (Yojson.Safe.init_lexer ()) (Lexing.from_string s) diff --git a/lib/models/gen/role_j.mli b/lib/models/gen/role_j.mli index b4ea78c..f908204 100644 --- a/lib/models/gen/role_j.mli +++ b/lib/models/gen/role_j.mli @@ -11,9 +11,23 @@ type t = Role_t.t = { position: int; permissions: int; managed: bool; + mentionable: bool; + guild_id: snowflake +} + +type role = Role_t.role = { + id: snowflake; + name: string; + colour: int; + hoist: bool; + position: int; + permissions: int; + managed: bool; mentionable: bool } +type role_update = Role_t.role_update = { role: role; id: snowflake } + val write_snowflake : Bi_outbuf.t -> snowflake -> unit (** Output a JSON value of type {!snowflake}. *) @@ -54,3 +68,43 @@ val t_of_string : string -> t (** Deserialize JSON data of type {!t}. *) +val write_role : + Bi_outbuf.t -> role -> unit + (** Output a JSON value of type {!role}. *) + +val string_of_role : + ?len:int -> role -> string + (** Serialize a value of type {!role} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_role : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> role + (** Input JSON data of type {!role}. *) + +val role_of_string : + string -> role + (** Deserialize JSON data of type {!role}. *) + +val write_role_update : + Bi_outbuf.t -> role_update -> unit + (** Output a JSON value of type {!role_update}. *) + +val string_of_role_update : + ?len:int -> role_update -> string + (** Serialize a value of type {!role_update} + into a JSON string. + @param len specifies the initial length + of the buffer used internally. + Default: 1024. *) + +val read_role_update : + Yojson.Safe.lexer_state -> Lexing.lexbuf -> role_update + (** Input JSON data of type {!role_update}. *) + +val role_update_of_string : + string -> role_update + (** Deserialize JSON data of type {!role_update}. *) + diff --git a/lib/models/gen/role_t.ml b/lib/models/gen/role_t.ml index a4e83c5..0954156 100644 --- a/lib/models/gen/role_t.ml +++ b/lib/models/gen/role_t.ml @@ -11,5 +11,19 @@ type t = { position: int; permissions: int; managed: bool; + mentionable: bool; + guild_id: snowflake +} + +type role = { + id: snowflake; + name: string; + colour: int; + hoist: bool; + position: int; + permissions: int; + managed: bool; mentionable: bool } + +type role_update = { role: role; id: snowflake } diff --git a/lib/models/gen/role_t.mli b/lib/models/gen/role_t.mli index a4e83c5..0954156 100644 --- a/lib/models/gen/role_t.mli +++ b/lib/models/gen/role_t.mli @@ -11,5 +11,19 @@ type t = { position: int; permissions: int; managed: bool; + mentionable: bool; + guild_id: snowflake +} + +type role = { + id: snowflake; + name: string; + colour: int; + hoist: bool; + position: int; + permissions: int; + managed: bool; mentionable: bool } + +type role_update = { role: role; id: snowflake } diff --git a/lib/models/gen/user.atd b/lib/models/gen/user.atd index 106b3b0..588242d 100644 --- a/lib/models/gen/user.atd +++ b/lib/models/gen/user.atd @@ -1,13 +1,13 @@ type snowflake <ocaml from="Snowflake" t="t"> = abstract -type t = { +type partial_user = { id: snowflake; +} + +type t = { + inherit partial_user; username: string; - discriminator: string; + discriminator: int <json repr="string">; ?avatar: string option; ~bot <ocaml default="false">: bool; -} - -type partial_user = { - id: snowflake; }
\ No newline at end of file diff --git a/lib/models/gen/user_j.ml b/lib/models/gen/user_j.ml index 552a20d..e281a7f 100644 --- a/lib/models/gen/user_j.ml +++ b/lib/models/gen/user_j.ml @@ -6,7 +6,7 @@ type snowflake = Snowflake_t.t type t = User_t.t = { id: snowflake; username: string; - discriminator: string; + discriminator: int; avatar: string option; bot: bool } @@ -110,7 +110,7 @@ let write_t : _ -> t -> _ = ( Bi_outbuf.add_char ob ','; Bi_outbuf.add_string ob "\"discriminator\":"; ( - Yojson.Safe.write_string + Yojson.Safe.write_int ) ob x.discriminator; (match x.avatar with None -> () | Some x -> @@ -225,7 +225,7 @@ let read_t = ( | 2 -> field_discriminator := ( ( - Atdgen_runtime.Oj_run.read_string + Atdgen_runtime.Oj_run.read_int ) p lb ); bits0 := !bits0 lor 0x4; @@ -325,7 +325,7 @@ let read_t = ( | 2 -> field_discriminator := ( ( - Atdgen_runtime.Oj_run.read_string + Atdgen_runtime.Oj_run.read_int ) p lb ); bits0 := !bits0 lor 0x4; diff --git a/lib/models/gen/user_j.mli b/lib/models/gen/user_j.mli index 576768e..0da284a 100644 --- a/lib/models/gen/user_j.mli +++ b/lib/models/gen/user_j.mli @@ -6,7 +6,7 @@ type snowflake = Snowflake_t.t type t = User_t.t = { id: snowflake; username: string; - discriminator: string; + discriminator: int; avatar: string option; bot: bool } diff --git a/lib/models/gen/user_t.ml b/lib/models/gen/user_t.ml index 294cf0a..f08b782 100644 --- a/lib/models/gen/user_t.ml +++ b/lib/models/gen/user_t.ml @@ -6,7 +6,7 @@ type snowflake = Snowflake_t.t type t = { id: snowflake; username: string; - discriminator: string; + discriminator: int; avatar: string option; bot: bool } diff --git a/lib/models/gen/user_t.mli b/lib/models/gen/user_t.mli index 294cf0a..f08b782 100644 --- a/lib/models/gen/user_t.mli +++ b/lib/models/gen/user_t.mli @@ -6,7 +6,7 @@ type snowflake = Snowflake_t.t type t = { id: snowflake; username: string; - discriminator: string; + discriminator: int; avatar: string option; bot: bool } diff --git a/lib/models/guild.ml b/lib/models/guild.ml index 36b7d4b..ade67be 100644 --- a/lib/models/guild.ml +++ b/lib/models/guild.ml @@ -1,2 +1,100 @@ module Make(Http : S.Http) = struct + open Core + open Async + open Guild_t + + let ban_user ~id ?(reason="") ?(days=0) guild = + Http.guild_ban_add guild.id id (`Assoc [ + ("delete-message-days", `Int days); + ("reason", `String reason); + ]) + + let create_emoji ~name ~image guild = + Http.create_emoji guild.id (`Assoc [ + ("name", `String name); + ("image", `String image); + ("roles", `List []); + ]) + + let create_role ~name ?colour ?permissions ?hoist ?mentionable guild = + let payload = ("name", `String name) :: [] in + let payload = match permissions with + | Some p -> ("permissions", `Int p) :: payload + | None -> payload + in let payload = match colour with + | Some c -> ("color", `Int c) :: payload + | None -> payload + in let payload = match hoist with + | Some h -> ("hoist", `Bool h) :: payload + | None -> payload + in let payload = match mentionable with + | Some m -> ("mentionable", `Bool m) :: payload + | None -> payload + in Http.guild_role_add guild.id (`Assoc payload) + + let create_channel ~mode ~name guild = + let kind = match mode with + | `Text -> 0 + | `Voice -> 2 + | `Category -> 4 + in Http.create_guild_channel guild.id (`Assoc [ + ("name", `String name); + ("type", `Int kind); + ]) + + let delete guild = Http.delete_guild guild.id + let get_ban ~id guild = Http.get_ban guild.id id + let get_bans guild = Http.get_bans guild.id + + let get_channel ~id guild = + match List.find ~f:(fun c -> c.id = id) guild.channels with + | Some c -> return c + | None -> Http.get_channel id >>| fun c -> + c |> Yojson.Safe.to_string |> Channel_j.t_of_string + + let get_emoji ~id guild = Http.get_emoji guild.id id + let get_invites guild = Http.get_guild_invites guild.id + + let get_member ~id guild = + match List.find ~f:(fun m -> m.user.id = id) guild.members with + | Some m -> return m + | None -> Http.get_member guild.id id >>| fun m -> + m |> Yojson.Safe.to_string |> Member_j.t_of_string + + let get_prune_count ~days guild = Http.guild_prune_count guild.id days + let get_role ~id guild = List.find ~f:(fun r -> r.id = id) guild.roles + let get_webhooks guild = Http.get_guild_webhooks guild.id + + let kick_user ~id ?reason guild = + let payload = match reason with + | Some r -> `Assoc [("reason", `String r)] + | None -> `Null + in Http.remove_member guild.id id payload + + let leave guild = Http.leave_guild guild.id + let list_voice_regions guild = Http.get_guild_voice_regions guild.id + let prune ~days guild = Http.guild_prune_start guild.id days + let request_members guild = Http.get_members guild.id + + let set_afk_channel ~id guild = Http.edit_guild guild.id (`Assoc [ + ("afk_channel_id", `Int id); + ]) + + let set_afk_timeout ~timeout guild = Http.edit_guild guild.id (`Assoc [ + ("afk_timeout", `Int timeout); + ]) + + let set_name ~name guild = Http.edit_guild guild.id (`Assoc [ + ("name", `String name); + ]) + + let set_icon ~icon guild = Http.edit_guild guild.id (`Assoc [ + ("icon", `String icon); + ]) + + let unban_user ~id ?reason guild = + let payload = match reason with + | Some r -> `Assoc [("reason", `String r)] + | None -> `Null + in Http.guild_ban_remove guild.id id payload end
\ No newline at end of file diff --git a/lib/models/role.ml b/lib/models/role.ml index 36b7d4b..10272a7 100644 --- a/lib/models/role.ml +++ b/lib/models/role.ml @@ -1,2 +1,25 @@ module Make(Http : S.Http) = struct + open Role_t + + let edit_role ~body role = Http.guild_role_edit role.guild_id role.id body + + let allow_mention role = + edit_role ~body:(`Assoc [("mentionable", `Bool true)]) role + + let delete role = Http.guild_role_remove role.guild_id role.id + + let disallow_mention role = + edit_role ~body:(`Assoc [("mentionable", `Bool false)]) role + + let hoist role = + edit_role ~body:(`Assoc [("hoist", `Bool true)]) role + + let set_colour ~colour role = + edit_role ~body:(`Assoc [("color", `Int colour)]) role + + let set_name ~name role = + edit_role ~body:(`Assoc [("name", `String name)]) role + + let unhoist role = + edit_role ~body:(`Assoc [("hoist", `Bool false)]) role end
\ No newline at end of file diff --git a/lib/models/snowflake.ml b/lib/models/snowflake.ml index 36b7d4b..305043e 100644 --- a/lib/models/snowflake.ml +++ b/lib/models/snowflake.ml @@ -1,2 +1,14 @@ module Make(Http : S.Http) = struct + open Core + + let timestamp snowflake = + let offset = (snowflake lsr 22) / 1000 in + 1_420_070_400 + offset + + let timestamp_iso snowflake = + let t = timestamp snowflake in + Date.( + of_time ~zone:Time.Zone.utc + Time.(of_span_since_epoch @@ Span.of_int_sec t) + |> format) "%FT%T+00:00" end
\ No newline at end of file diff --git a/lib/models/user.ml b/lib/models/user.ml index 36b7d4b..13ee1cf 100644 --- a/lib/models/user.ml +++ b/lib/models/user.ml @@ -1,2 +1,22 @@ module Make(Http : S.Http) = struct + open Core + open User_t + + let tag user = + Printf.sprintf "%s#%d" user.username user.discriminator + + let mention (user:User_t.t) = + Printf.sprintf "<@%d>" user.id + + let default_avatar user = + let avatar = user.discriminator % 5 in + Endpoints.cdn_default_avatar avatar + + let face user = match user.avatar with + | Some avatar -> + let ext = if String.is_substring ~substring:"a_" avatar + then "gif" + else "png" in + Endpoints.cdn_avatar user.id avatar ext + | None -> default_avatar user end
\ No newline at end of file |