blob: e332c36b620f9b77aa9a4ccdc2b73af75cc75c6a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
open Core
exception Invalid_channel of Yojson.Safe.t
type group = {
id: Channel_id_t.t;
last_message_id: Message_id.t option [@default None];
last_pin_timestamp: string option [@default None];
icon: string option [@default None];
name: string option [@default None];
owner_id: User_id_t.t;
recipients: User_t.t list [@default []];
} [@@deriving sexp, yojson { strict = false; exn = true }]
type dm = {
id: Channel_id_t.t;
last_message_id: Message_id.t option [@default None];
last_pin_timestamp: string option [@default None];
} [@@deriving sexp, yojson { strict = false; exn = true }]
type guild_text = {
id: Channel_id_t.t;
last_message_id: Message_id.t option [@default None];
last_pin_timestamp: string option [@default None];
category_id: Channel_id_t.t option [@default None][@key "parent_id"];
guild_id: Guild_id_t.t option [@default None];
name: string;
position: int;
topic: string option [@default None];
nsfw: bool;
slow_mode_timeout: int option [@default None];
permission_overwrites: Overwrites.t list [@default []];
} [@@deriving sexp, yojson { strict = false; exn = true }]
type guild_voice = {
id: Channel_id_t.t;
category_id: Channel_id_t.t option [@default None][@key "parent_id"];
guild_id: Guild_id_t.t option [@default None];
name: string;
position: int;
user_limit: int [@default -1];
bitrate: int option [@default None];
permission_overwrites: Overwrites.t list [@default []];
} [@@deriving sexp, yojson { strict = false; exn = true }]
type category = {
id: Channel_id_t.t;
guild_id: Guild_id_t.t option [@default None];
position: int;
name: string;
permission_overwrites: Overwrites.t list [@default []];
} [@@deriving sexp, yojson { strict = false; exn = true }]
type t = [
| `Group of group
| `Private of dm
| `GuildText of guild_text
| `GuildVoice of guild_voice
| `Category of category
] [@@deriving sexp, yojson { strict = false; exn = true }]
type channel_wrapper = {
id: Channel_id_t.t;
kind: int [@key "type"];
guild_id: Guild_id_t.t option [@default None];
position: int option [@default None];
name: string option [@default None];
topic: string option [@default None];
nsfw: bool option [@default None];
last_message_id: Message_id.t option [@default None];
bitrate: int option [@default None];
user_limit: int option [@default None];
slow_mode_timeout: int option [@default None];
recipients: User_t.t list option [@default None];
icon: string option [@default None];
owner_id: User_id_t.t option [@default None];
application_id: Snowflake.t option [@default None];
category_id: Channel_id_t.t option [@default None][@key "parent_id"];
last_pin_timestamp: string option [@default None];
permission_overwrites: Overwrites.t list [@default []];
} [@@deriving sexp, yojson { strict = false; exn = true }]
let unwrap_as_guild_text {id;guild_id;position;name;topic;nsfw;last_message_id;slow_mode_timeout;category_id;last_pin_timestamp;permission_overwrites;_} =
let position = Option.value_exn position in
let name = Option.value_exn name in
let nsfw = Option.value ~default:false nsfw in
{ id; guild_id; position; name; topic; nsfw; last_message_id; slow_mode_timeout; category_id; last_pin_timestamp; permission_overwrites }
let unwrap_as_guild_voice {id;guild_id;position;name;bitrate;user_limit;category_id;permission_overwrites;_} =
let position = Option.value_exn position in
let name = Option.value_exn name in
let user_limit = Option.value ~default:(-1) user_limit in
{ id; guild_id; position; name; user_limit; bitrate ; category_id; permission_overwrites }
let unwrap_as_dm {id;last_message_id;last_pin_timestamp;_} =
{ id; last_message_id; last_pin_timestamp; }
let unwrap_as_group {id;name;last_message_id;recipients;icon;owner_id;last_pin_timestamp;_} =
let recipients = Option.value ~default:[] recipients in
let owner_id = Option.value_exn owner_id in
{ id; name; last_message_id; recipients; icon; owner_id; last_pin_timestamp; }
let unwrap_as_category {id;guild_id;position;name;permission_overwrites;_} =
let position = Option.value_exn position in
let name = Option.value_exn name in
{ id; guild_id; position; name; permission_overwrites }
let wrap s =
match s.kind with
| 0 -> `GuildText (unwrap_as_guild_text s)
| 1 -> `Private (unwrap_as_dm s)
| 2 -> `GuildVoice (unwrap_as_guild_voice s)
| 3 -> `Group (unwrap_as_group s)
| 4 -> `Category (unwrap_as_category s)
| _ -> raise (Invalid_channel (channel_wrapper_to_yojson s))
let get_id (c:t) = match c with
| `Group g -> let `Channel_id id = g.id in id
| `Private p -> let `Channel_id id = p.id in id
| `GuildText t -> let `Channel_id id = t.id in id
| `GuildVoice v -> let `Channel_id id = v.id in id
| `Category c -> let `Channel_id id = c.id in id
|