aboutsummaryrefslogtreecommitdiff
path: root/lib/models/channel_t.ml
diff options
context:
space:
mode:
authorAdelyn Breelove <[email protected]>2019-01-10 13:12:49 -0700
committerAdelyn Breelove <[email protected]>2019-01-10 13:12:49 -0700
commitb9ee77f8153090e9d47e73ab195540d10720c7b6 (patch)
treed36bdb7ce17e03ee1bdb60d6b638f8ac6e022711 /lib/models/channel_t.ml
parentWhy are events so confusing (diff)
downloaddisml-b9ee77f8153090e9d47e73ab195540d10720c7b6.tar.xz
disml-b9ee77f8153090e9d47e73ab195540d10720c7b6.zip
AAAAAAAAAAAAAAAAAAAAAAAA
Diffstat (limited to 'lib/models/channel_t.ml')
-rw-r--r--lib/models/channel_t.ml121
1 files changed, 121 insertions, 0 deletions
diff --git a/lib/models/channel_t.ml b/lib/models/channel_t.ml
new file mode 100644
index 0000000..df3e929
--- /dev/null
+++ b/lib/models/channel_t.ml
@@ -0,0 +1,121 @@
+open Core
+
+exception Invalid_channel of Yojson.Safe.json
+
+type group = {
+ id: Snowflake.t;
+ last_message_id: Snowflake.t option [@default None];
+ last_pin_timestamp: string option [@default None];
+ icon: string option [@default None];
+ name: string option [@default None];
+ owner_id: Snowflake.t;
+ recipients: User_t.t list [@default []];
+} [@@deriving yojson]
+
+type dm = {
+ id: Snowflake.t;
+ last_message_id: Snowflake.t option [@default None];
+ last_pin_timestamp: string option [@default None];
+} [@@deriving yojson]
+
+type guild_text = {
+ id: Snowflake.t;
+ last_message_id: Snowflake.t option [@default None];
+ last_pin_timestamp: string option [@default None];
+ category_id: Snowflake.t option [@default None][@key "parent_id"];
+ guild_id: Snowflake.t;
+ name: string;
+ position: int;
+ topic: string option [@default None];
+ nsfw: bool;
+ slow_mode_timeout: int option [@default None];
+} [@@deriving yojson]
+
+type guild_voice = {
+ id: Snowflake.t;
+ category_id: Snowflake.t option [@default None][@key "parent_id"];
+ guild_id: Snowflake.t;
+ name: string;
+ position: int;
+ user_limit: int [@default -1];
+ bitrate: int option [@default None];
+} [@@deriving yojson]
+
+type category = {
+ id: Snowflake.t;
+ guild_id: Snowflake.t;
+ position: int;
+ name: string;
+} [@@deriving yojson]
+
+type t =
+| Group of group
+| Private of dm
+| GuildText of guild_text
+| GuildVoice of guild_voice
+| Category of category
+[@@deriving yojson]
+
+type channel_wrapper = {
+ id: Snowflake.t;
+ kind: int [@key "type"];
+ guild_id: Snowflake.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: Snowflake.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: Snowflake.t option [@default None];
+ application_id: Snowflake.t option [@default None];
+ category_id: Snowflake.t option [@default None][@key "parent_id"];
+ last_pin_timestamp: string option [@default None];
+} [@@deriving yojson]
+
+let unwrap_as_guild_text {id;guild_id;position;name;topic;nsfw;last_message_id;slow_mode_timeout;category_id;last_pin_timestamp;_} =
+ let guild_id = Option.value_exn guild_id in
+ let position = Option.value_exn position in
+ let name = Option.value_exn name in
+ let nsfw = Option.value_exn nsfw in
+ { id; guild_id; position; name; topic; nsfw; last_message_id; slow_mode_timeout; category_id; last_pin_timestamp }
+
+let unwrap_as_guild_voice {id;guild_id;position;name;bitrate;user_limit;category_id;_} =
+ let guild_id = Option.value_exn guild_id in
+ 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; }
+
+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;_} =
+ let guild_id = Option.value_exn guild_id in
+ let position = Option.value_exn position in
+ let name = Option.value_exn name in
+ { id; guild_id; position; name; }
+
+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 = function
+| Group g -> g.id
+| Private p -> p.id
+| GuildText t -> t.id
+| GuildVoice v -> v.id
+| Category c -> c.id \ No newline at end of file