aboutsummaryrefslogtreecommitdiff
path: root/lib/models
diff options
context:
space:
mode:
authorAdelyn Breedlove <[email protected]>2019-01-13 23:52:45 +0000
committerAdelyn Breedlove <[email protected]>2019-01-13 23:52:45 +0000
commitd95f0342f9cf2280b5d9794ab638c16a59c02a69 (patch)
tree191164d198c07cf388d9aae8a54013e5613c272c /lib/models
parentMerge branch 'dev' into 'master' (diff)
parentAdd deriving sexp to models (diff)
downloaddisml-d95f0342f9cf2280b5d9794ab638c16a59c02a69.tar.xz
disml-d95f0342f9cf2280b5d9794ab638c16a59c02a69.zip
Merge branch 'switch-to-deriving_yojson' into 'master'
Switch to deriving yojson See merge request Mishio595/disml!12
Diffstat (limited to 'lib/models')
-rw-r--r--lib/models/activity.ml10
-rw-r--r--lib/models/attachment.ml14
-rw-r--r--lib/models/ban_t.ml6
-rw-r--r--lib/models/channel.ml38
-rw-r--r--lib/models/channel_t.ml118
-rw-r--r--lib/models/embed.ml62
-rw-r--r--lib/models/emoji.ml19
-rw-r--r--lib/models/guild.ml69
-rw-r--r--lib/models/guild_t.ml67
-rw-r--r--lib/models/member.ml3
-rw-r--r--lib/models/member_t.ml43
-rw-r--r--lib/models/message.ml24
-rw-r--r--lib/models/message_t.ml45
-rw-r--r--lib/models/presence.ml13
-rw-r--r--lib/models/reaction.ml2
-rw-r--r--lib/models/reaction_t.ml14
-rw-r--r--lib/models/role.ml6
-rw-r--r--lib/models/role_t.ml32
-rw-r--r--lib/models/snowflake.ml32
-rw-r--r--lib/models/user.ml10
-rw-r--r--lib/models/user_t.ml13
21 files changed, 514 insertions, 126 deletions
diff --git a/lib/models/activity.ml b/lib/models/activity.ml
index 6fe69b8..8e6ff80 100644
--- a/lib/models/activity.ml
+++ b/lib/models/activity.ml
@@ -1,3 +1,7 @@
-module Make(Http : S.Http) = struct
- type t = Activity_t.t
-end \ No newline at end of file
+open Core
+
+type t = {
+ name: string;
+ kind: int [@key "type"];
+ url: string [@default ""];
+} [@@deriving sexp, yojson { strict = false}] \ No newline at end of file
diff --git a/lib/models/attachment.ml b/lib/models/attachment.ml
index cd04da8..c56b389 100644
--- a/lib/models/attachment.ml
+++ b/lib/models/attachment.ml
@@ -1,3 +1,11 @@
-module Make(Http : S.Http) = struct
- type t = Attachment_t.t
-end \ No newline at end of file
+open Core
+
+type t = {
+ id: Snowflake.t;
+ filename: string;
+ size: int;
+ url: string;
+ proxy_url: string;
+ height: int [@default -1];
+ width: int [@default -1];
+} [@@deriving sexp, yojson { strict = false}] \ No newline at end of file
diff --git a/lib/models/ban_t.ml b/lib/models/ban_t.ml
new file mode 100644
index 0000000..b49eefc
--- /dev/null
+++ b/lib/models/ban_t.ml
@@ -0,0 +1,6 @@
+open Core
+
+type t = {
+ reason: string [@default ""];
+ user: User_t.t;
+} [@@deriving sexp, yojson { strict = false}] \ No newline at end of file
diff --git a/lib/models/channel.ml b/lib/models/channel.ml
index 15202b1..3fab452 100644
--- a/lib/models/channel.ml
+++ b/lib/models/channel.ml
@@ -1,22 +1,14 @@
-exception Invalid_message
-exception No_message_found
-
-let get_id (ch:Channel_t.t) = match ch with
-| `Group g -> g.id
-| `Private p -> p.id
-| `GuildText t -> t.id
-| `GuildVoice v -> v.id
-| `Category c -> c.id
-
module Make(Http : S.Http) = struct
open Async
open Core
+ include Channel_t
- type t = Channel_t.t
-
+ exception Invalid_message
+ exception No_message_found
+
let say ~content ch =
Http.create_message (get_id ch) (`Assoc [("content", `String content)])
- >>| Result.map ~f:Message_j.t_of_string
+ >>| Result.map ~f:Message_t.of_yojson_exn
let send_message ?embed ?content ?file ?(tts=false) ch =
let embed = match embed with
@@ -36,13 +28,13 @@ module Make(Http : S.Http) = struct
("content", content);
("file", file);
("tts", `Bool tts);
- ]) >>| Result.map ~f:Message_j.t_of_string
+ ]) >>| Result.map ~f:Message_t.of_yojson_exn
let delete ch =
Http.delete_channel (get_id ch) >>| Result.map ~f:ignore
let get_message ~id ch =
- Http.get_message (get_id ch) id >>| Result.map ~f:Message_j.t_of_string
+ Http.get_message (get_id ch) id >>| Result.map ~f:Message_t.of_yojson_exn
let get_messages ?(mode=`Around) ?id ?(limit=50) ch =
let kind = match mode with
@@ -54,20 +46,14 @@ module Make(Http : S.Http) = struct
| Some id -> id
| None -> raise No_message_found in
Http.get_messages (get_id ch) id kind >>| Result.map ~f:(fun l ->
- Yojson.Safe.(from_string l
- |> Util.to_list)
- |> List.map ~f:(fun i ->
- Yojson.Safe.to_string i
- |> Message_j.t_of_string))
-
+ Yojson.Safe.Util.to_list l
+ |> List.map ~f:Message_t.of_yojson_exn)
+
let broadcast_typing ch =
Http.broadcast_typing (get_id ch) >>| Result.map ~f:ignore
let get_pins ch =
Http.get_pinned_messages (get_id ch) >>| Result.map ~f:(fun l ->
- Yojson.Safe.(from_string l
- |> Util.to_list)
- |> List.map ~f:(fun i ->
- Yojson.Safe.to_string i
- |> Message_j.t_of_string))
+ Yojson.Safe.Util.to_list l
+ |> List.map ~f:Message_t.of_yojson_exn)
end \ No newline at end of file
diff --git a/lib/models/channel_t.ml b/lib/models/channel_t.ml
new file mode 100644
index 0000000..dce1d54
--- /dev/null
+++ b/lib/models/channel_t.ml
@@ -0,0 +1,118 @@
+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 sexp, yojson { strict = false}]
+
+type dm = {
+ id: Snowflake.t;
+ last_message_id: Snowflake.t option [@default None];
+ last_pin_timestamp: string option [@default None];
+} [@@deriving sexp, yojson { strict = false}]
+
+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 option [@default None];
+ name: string;
+ position: int;
+ topic: string option [@default None];
+ nsfw: bool;
+ slow_mode_timeout: int option [@default None];
+} [@@deriving sexp, yojson { strict = false}]
+
+type guild_voice = {
+ id: Snowflake.t;
+ category_id: Snowflake.t option [@default None][@key "parent_id"];
+ guild_id: Snowflake.t option [@default None];
+ name: string;
+ position: int;
+ user_limit: int [@default -1];
+ bitrate: int option [@default None];
+} [@@deriving sexp, yojson { strict = false}]
+
+type category = {
+ id: Snowflake.t;
+ guild_id: Snowflake.t option [@default None];
+ position: int;
+ name: string;
+} [@@deriving sexp, yojson { strict = false}]
+
+type t =
+| Group of group
+| Private of dm
+| GuildText of guild_text
+| GuildVoice of guild_voice
+| Category of category
+[@@deriving sexp, yojson { strict = false}]
+
+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 sexp, yojson { strict = false}]
+
+let unwrap_as_guild_text {id;guild_id;position;name;topic;nsfw;last_message_id;slow_mode_timeout;category_id;last_pin_timestamp;_} =
+ 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 }
+
+let unwrap_as_guild_voice {id;guild_id;position;name;bitrate;user_limit;category_id;_} =
+ 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 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
diff --git a/lib/models/embed.ml b/lib/models/embed.ml
index ce25e78..4faaba7 100644
--- a/lib/models/embed.ml
+++ b/lib/models/embed.ml
@@ -1,8 +1,54 @@
-module Make(Http : S.Http) = struct
- type footer = Embed_t.footer
- type image = Embed_t.image
- type video = Embed_t.video
- type provider = Embed_t.provider
- type field = Embed_t.field
- type t = Embed_t.t
-end \ No newline at end of file
+open Core
+
+type footer = {
+ text: string;
+ icon_url: string option [@default None];
+ proxy_icon_url: string option [@default None];
+} [@@deriving sexp, yojson]
+
+type image = {
+ url: string option [@default None];
+ proxy_url: string option [@default None];
+ height: int option [@default None];
+ width: int option [@default None];
+} [@@deriving sexp, yojson]
+
+type video = {
+ url: string option [@default None];
+ height: int option [@default None];
+ width: int option [@default None];
+} [@@deriving sexp, yojson]
+
+type provider = {
+ name: string option [@default None];
+ url: string option [@default None];
+} [@@deriving sexp, yojson]
+
+type author = {
+ name: string option [@default None];
+ url: string option [@default None];
+ icon_url: string option [@default None];
+ proxy_icon_url: string option [@default None];
+} [@@deriving sexp, yojson]
+
+type field = {
+ name: string;
+ value: string;
+ inline: bool [@default true];
+} [@@deriving sexp, yojson]
+
+type t = {
+ title: string option [@default None];
+ kind: string option [@default None][@key "type"];
+ description: string option [@default None];
+ url: string option [@default None];
+ timestamp: string option [@default None];
+ colour: int option [@default None];
+ footer: footer option [@default None];
+ image: image option [@default None];
+ thumbnail: image option [@default None];
+ video: video option [@default None];
+ provider: provider option [@default None];
+ author: author option [@default None];
+ fields: field list [@default []];
+} [@@deriving sexp, yojson { strict = false }] \ No newline at end of file
diff --git a/lib/models/emoji.ml b/lib/models/emoji.ml
index ece5bcd..2b7cf1d 100644
--- a/lib/models/emoji.ml
+++ b/lib/models/emoji.ml
@@ -1,3 +1,16 @@
-module Make(Http : S.Http) = struct
- type t = Emoji_t.t
-end \ No newline at end of file
+open Core
+
+type partial_emoji = {
+ id: Snowflake.t option [@default None];
+ name: string;
+} [@@deriving sexp, yojson { strict = false }]
+
+type t = {
+ id: Snowflake.t option [@default None];
+ name: string;
+ roles: Snowflake.t list [@default []];
+ user: User_t.t option [@default None];
+ require_colons: bool option [@default None];
+ managed: bool option [@default None];
+ animated: bool option [@default None];
+} [@@deriving sexp, yojson { strict = false}] \ No newline at end of file
diff --git a/lib/models/guild.ml b/lib/models/guild.ml
index 733fc9f..60652df 100644
--- a/lib/models/guild.ml
+++ b/lib/models/guild.ml
@@ -1,9 +1,7 @@
module Make(Http : S.Http) = struct
open Core
open Async
- open Guild_t
-
- type t = Guild_t.t
+ include Guild_t
let ban_user ~id ?(reason="") ?(days=0) guild =
Http.guild_ban_add guild.id id (`Assoc [
@@ -16,7 +14,7 @@ module Make(Http : S.Http) = struct
("name", `String name);
("image", `String image);
("roles", `List []);
- ]) >>| Result.map ~f:Emoji_j.t_of_string
+ ]) >>| Result.map ~f:Emoji.of_yojson_exn
let create_role ~name ?colour ?permissions ?hoist ?mentionable guild =
let payload = ("name", `String name) :: [] in
@@ -33,10 +31,8 @@ module Make(Http : S.Http) = struct
| Some m -> ("mentionable", `Bool m) :: payload
| None -> payload
in Http.guild_role_add guild.id (`Assoc payload)
- >>| Result.map ~f:(fun r ->
- Role_j.role_of_string r
- |> Event.wrap_role ~guild_id:guild.id)
-
+ >>| Result.map ~f:(fun r -> Role_t.role_of_yojson_exn r |> Role_t.wrap ~guild_id:guild.id)
+
let create_channel ~mode ~name guild =
let kind = match mode with
| `Text -> 0
@@ -45,29 +41,26 @@ module Make(Http : S.Http) = struct
in Http.create_guild_channel guild.id (`Assoc [
("name", `String name);
("type", `Int kind);
- ]) >>| Result.map ~f:Channel_j.t_of_string
-
+ ]) >>| Result.map ~f:Channel_t.of_yojson_exn
+
let delete guild =
Http.delete_guild guild.id >>| Result.map ~f:ignore
let get_ban ~id guild =
- Http.get_ban guild.id id >>| Result.map ~f:Ban_j.t_of_string
-
+ Http.get_ban guild.id id >>| Result.map ~f:Ban_t.of_yojson_exn
+
let get_bans guild =
Http.get_bans guild.id >>| Result.map ~f:(fun bans ->
- Yojson.Safe.from_string bans
- |> Yojson.Safe.Util.to_list
- |> List.map ~f:(fun ban ->
- Yojson.Safe.to_string ban
- |> Ban_j.t_of_string))
+ Yojson.Safe.Util.to_list bans
+ |> List.map ~f:Ban_t.of_yojson_exn)
let get_channel ~id guild =
- match List.find ~f:(fun c -> c.id = id) guild.channels with
- | Some c -> Channel_j.(string_of_channel_wrapper c |> t_of_string) |> Deferred.Or_error.return
- | None -> Http.get_channel id >>| Result.map ~f:Event.wrap_channel
-
+ match List.find ~f:(fun c -> Channel_t.get_id c = id) guild.channels with
+ | Some c -> Deferred.Or_error.return c
+ | None -> Http.get_channel id >>| Result.map ~f:(fun c -> Channel_t.(channel_wrapper_of_yojson_exn c |> wrap))
+
let get_emoji ~id guild =
- Http.get_emoji guild.id id >>| Result.map ~f:Emoji_j.t_of_string
+ Http.get_emoji guild.id id >>| Result.map ~f:Emoji.of_yojson_exn
(* TODO add invite abstraction? *)
let get_invites guild =
@@ -76,19 +69,16 @@ module Make(Http : S.Http) = struct
let get_member ~id guild =
match List.find ~f:(fun m -> m.user.id = id) guild.members with
| Some m -> Deferred.Or_error.return m
- | None -> Http.get_member guild.id id >>| Result.map ~f:Member_j.member_of_string
+ | None -> Http.get_member guild.id id >>| Result.map ~f:Member_t.of_yojson_exn
let get_prune_count ~days guild =
Http.guild_prune_count guild.id days >>| Result.map ~f:(fun prune ->
- Yojson.Safe.(from_string prune
- |> Util.member "pruned"
- |> Util.to_int))
+ Yojson.Safe.Util.(member "pruned" prune |> to_int))
(* TODO add HTTP fallback *)
let get_role ~id guild =
- let role = List.find ~f:(fun r -> r.id = id) guild.roles in
- Option.(role >>| Event.wrap_role ~guild_id:guild.id)
-
+ List.find ~f:(fun r -> r.id = id) guild.roles
+
(* TODO add webhook abstraction? *)
let get_webhooks guild =
Http.get_guild_webhooks guild.id
@@ -108,33 +98,28 @@ module Make(Http : S.Http) = struct
let prune ~days guild =
Http.guild_prune_start guild.id days >>| Result.map ~f:(fun prune ->
- Yojson.Safe.(from_string prune
- |> Util.member "pruned"
- |> Util.to_int))
-
+ Yojson.Safe.Util.(member "pruned" prune |> to_int))
+
let request_members guild =
Http.get_members guild.id >>| Result.map ~f:(fun members ->
- Yojson.Safe.from_string members
- |> Yojson.Safe.Util.to_list
- |> List.map ~f:(fun ban ->
- Yojson.Safe.to_string ban
- |> Member_j.t_of_string))
+ Yojson.Safe.Util.to_list members
+ |> List.map ~f:Member_t.of_yojson_exn)
let set_afk_channel ~id guild = Http.edit_guild guild.id (`Assoc [
("afk_channel_id", `Int id);
- ]) >>| Result.map ~f:Guild_j.t_of_string
+ ]) >>| Result.map ~f:of_yojson_exn
let set_afk_timeout ~timeout guild = Http.edit_guild guild.id (`Assoc [
("afk_timeout", `Int timeout);
- ]) >>| Result.map ~f:Guild_j.t_of_string
+ ]) >>| Result.map ~f:of_yojson_exn
let set_name ~name guild = Http.edit_guild guild.id (`Assoc [
("name", `String name);
- ]) >>| Result.map ~f:Guild_j.t_of_string
+ ]) >>| Result.map ~f:of_yojson_exn
let set_icon ~icon guild = Http.edit_guild guild.id (`Assoc [
("icon", `String icon);
- ]) >>| Result.map ~f:Guild_j.t_of_string
+ ]) >>| Result.map ~f:of_yojson_exn
let unban_user ~id ?reason guild =
let payload = match reason with
diff --git a/lib/models/guild_t.ml b/lib/models/guild_t.ml
new file mode 100644
index 0000000..6bb5090
--- /dev/null
+++ b/lib/models/guild_t.ml
@@ -0,0 +1,67 @@
+open Core
+
+type pre = {
+ id: Snowflake.t;
+ name: string;
+ icon: string option [@default None];
+ splash: string option [@default None];
+ owner_id: Snowflake.t;
+ region: string;
+ afk_channel_id: Snowflake.t option [@default None];
+ afk_timeout: int;
+ embed_enabled: bool option [@default None];
+ embed_channel_id: Snowflake.t option [@default None];
+ verification_level: int;
+ default_message_notifications: int;
+ explicit_content_filter: int;
+ roles: Role_t.role list;
+ emojis: Emoji.t list;
+ features: string list;
+ mfa_level: int;
+ application_id: Snowflake.t option [@default None];
+ widget_enabled: bool option [@default None];
+ widget_channel: Channel_t.channel_wrapper option [@default None];
+ system_channel: Channel_t.channel_wrapper option [@default None];
+ large: bool;
+ unavailable: bool;
+ member_count: int option [@default None];
+ members: Member_t.member list;
+ channels: Channel_t.channel_wrapper list;
+} [@@deriving sexp, yojson { strict = false }]
+
+type t = {
+ id: Snowflake.t;
+ name: string;
+ icon: string option [@default None];
+ splash: string option [@default None];
+ owner_id: Snowflake.t;
+ region: string;
+ afk_channel_id: Snowflake.t option [@default None];
+ afk_timeout: int;
+ embed_enabled: bool option [@default None];
+ embed_channel_id: Snowflake.t option [@default None];
+ verification_level: int;
+ default_message_notifications: int;
+ explicit_content_filter: int;
+ roles: Role_t.t list;
+ emojis: Emoji.t list;
+ features: string list;
+ mfa_level: int;
+ application_id: Snowflake.t option [@default None];
+ widget_enabled: bool option [@default None];
+ widget_channel: Channel_t.t option [@default None];
+ system_channel: Channel_t.t option [@default None];
+ large: bool;
+ unavailable: bool;
+ member_count: int option [@default None];
+ members: Member_t.t list;
+ channels: Channel_t.t list;
+} [@@deriving sexp, yojson { strict = false }]
+
+let wrap ({id;name;icon;splash;owner_id;region;afk_channel_id;afk_timeout;embed_enabled;embed_channel_id;verification_level;default_message_notifications;explicit_content_filter;roles;emojis;features;mfa_level;application_id;widget_enabled;widget_channel;system_channel;large;unavailable;member_count;members;channels}:pre) =
+ let roles = List.map ~f:(Role_t.wrap ~guild_id:id) roles in
+ let members = List.map ~f:(Member_t.wrap ~guild_id:id) members in
+ let channels = List.map ~f:Channel_t.wrap channels in
+ let widget_channel = Option.map ~f:Channel_t.wrap widget_channel in
+ let system_channel = Option.map ~f:Channel_t.wrap system_channel in
+ {id;name;icon;splash;owner_id;region;afk_channel_id;afk_timeout;embed_enabled;embed_channel_id;verification_level;default_message_notifications;explicit_content_filter;roles;emojis;features;mfa_level;application_id;widget_enabled;widget_channel;system_channel;large;unavailable;member_count;members;channels} \ No newline at end of file
diff --git a/lib/models/member.ml b/lib/models/member.ml
index 7fa9c03..190d865 100644
--- a/lib/models/member.ml
+++ b/lib/models/member.ml
@@ -1,4 +1,7 @@
module Make(Http : S.Http) = struct
+ type partial_member = Member_t.partial_member
+ type member = Member_t.member
+ type member_update = Member_t.member_update
type t = Member_t.t
(* val add_role : Member_t.t -> Role_t.t -> Yojson.Safe.json Deferred.t
val remove_role : Member_t.t -> Role_t.t -> Yojson.Safe.json Deferred.t
diff --git a/lib/models/member_t.ml b/lib/models/member_t.ml
new file mode 100644
index 0000000..e6edb61
--- /dev/null
+++ b/lib/models/member_t.ml
@@ -0,0 +1,43 @@
+open Core
+
+type partial_member = {
+ nick: string option [@default None];
+ roles: Snowflake.t list;
+ joined_at: string;
+ deaf: bool;
+ mute: bool;
+} [@@deriving sexp, yojson { strict = false}]
+
+type member = {
+ nick: string option [@default None];
+ roles: Snowflake.t list;
+ joined_at: string;
+ deaf: bool;
+ mute: bool;
+ user: User_t.t;
+} [@@deriving sexp, yojson { strict = false}]
+
+type member_wrapper = {
+ guild_id: Snowflake.t;
+ user: User_t.t;
+} [@@deriving sexp, yojson { strict = false }]
+
+type member_update = {
+ guild_id: Snowflake.t;
+ roles: Snowflake.t list [@default []];
+ user: User_t.t;
+ nick: string option [@default None];
+} [@@deriving sexp, yojson { strict = false}]
+
+type t = {
+ nick: string option [@default None];
+ roles: Snowflake.t list;
+ joined_at: string;
+ deaf: bool;
+ mute: bool;
+ user: User_t.t;
+ guild_id: Snowflake.t;
+} [@@deriving sexp, yojson { strict = false}]
+
+let wrap ~guild_id ({nick;roles;joined_at;deaf;mute;user}:member) =
+ {nick;roles;joined_at;deaf;mute;user;guild_id} \ No newline at end of file
diff --git a/lib/models/message.ml b/lib/models/message.ml
index ffd7583..bce361c 100644
--- a/lib/models/message.ml
+++ b/lib/models/message.ml
@@ -1,46 +1,42 @@
module Make(Http : S.Http) = struct
open Async
- open Message_t
+ include Message_t
- type t = Message_t.t
-
- let add_reaction msg (emoji:Emoji_t.t) =
+ let add_reaction msg (emoji:Emoji.t) =
let e = match emoji.id with
| Some i -> Printf.sprintf "%s:%d" emoji.name i
| None -> emoji.name
in
Http.create_reaction msg.channel_id msg.id e
- let remove_reaction msg (emoji:Emoji_t.t) (user:User_t.t) =
+ let remove_reaction msg (emoji:Emoji.t) (user:User_t.t) =
let e = match emoji.id with
| Some i -> Printf.sprintf "%s:%d" emoji.name i
| None -> emoji.name
in
Http.delete_reaction msg.channel_id msg.id e user.id
-
+
let clear_reactions msg =
Http.delete_reactions msg.channel_id msg.id
-
+
let delete msg =
Http.delete_message msg.channel_id msg.id
-
+
let pin msg =
Http.pin_message msg.channel_id msg.id
-
+
let unpin msg =
Http.unpin_message msg.channel_id msg.id
-
+
let reply msg cont =
let rep = `Assoc [("content", `String cont)] in
Http.create_message msg.channel_id rep
let set_content msg cont =
- Message_j.string_of_t { msg with content = cont; }
- |> Yojson.Safe.from_string
+ to_yojson { msg with content = cont; }
|> Http.edit_message msg.channel_id msg.id
let set_embed msg embed =
- Message_j.string_of_t { msg with embeds = [embed]; }
- |> Yojson.Safe.from_string
+ to_yojson { msg with embeds = [embed]; }
|> Http.edit_message msg.channel_id msg.id
end \ No newline at end of file
diff --git a/lib/models/message_t.ml b/lib/models/message_t.ml
new file mode 100644
index 0000000..c4253d5
--- /dev/null
+++ b/lib/models/message_t.ml
@@ -0,0 +1,45 @@
+open Core
+
+type message_update = {
+ id: Snowflake.t;
+ author: User_t.t option [@default None];
+ channel_id: Snowflake.t;
+ member: Member_t.partial_member option [@default None];
+ guild_id: Snowflake.t option [@default None];
+ content: string option [@default None];
+ timestamp: string option [@default None];
+ editedimestamp: string option [@default None];
+ tts: bool option [@default None];
+ mention_everyone: bool option [@default None];
+ mentions: Snowflake.t list [@default []];
+ role_mentions: Snowflake.t list [@default []];
+ attachments: Attachment.t list [@default []];
+ embeds: Embed.t list [@default []];
+ reactions: Snowflake.t list [@default []];
+ nonce: Snowflake.t option [@default None];
+ pinned: bool option [@default None];
+ webhook_id: Snowflake.t option [@default None];
+ kind: int option [@default None][@key "type"];
+} [@@deriving sexp, yojson { strict = false}]
+
+type t = {
+ id: Snowflake.t;
+ author: User_t.t;
+ channel_id: Snowflake.t;
+ member: Member_t.partial_member option [@default None];
+ guild_id: Snowflake.t option [@default None];
+ content: string;
+ timestamp: string;
+ editedimestamp: string option [@default None];
+ tts: bool;
+ mention_everyone: bool;
+ (* mentions: Snowflake.t list [@default []]; *)
+ (* role_mentions: Snowflake.t list [@default []]; *)
+ attachments: Attachment.t list [@default []];
+ embeds: Embed.t list [@default []];
+ reactions: Snowflake.t list [@default []];
+ nonce: Snowflake.t option [@default None];
+ pinned: bool;
+ webhook_id: Snowflake.t option [@default None];
+ kind: int [@key "type"];
+} [@@deriving sexp, yojson { strict = false}] \ No newline at end of file
diff --git a/lib/models/presence.ml b/lib/models/presence.ml
index 2ce9a51..ab245a7 100644
--- a/lib/models/presence.ml
+++ b/lib/models/presence.ml
@@ -1,3 +1,10 @@
-module Make(Http : S.Http) = struct
- type t = Presence_t.t
-end \ No newline at end of file
+open Core
+
+type t = {
+ user: User_t.partial_user;
+ roles: Snowflake.t list;
+ game: Activity.t option [@default None];
+ guild_id: Snowflake.t;
+ status: string;
+ activities: Activity.t list;
+} [@@deriving sexp, yojson { strict = false}] \ No newline at end of file
diff --git a/lib/models/reaction.ml b/lib/models/reaction.ml
index 23de12f..3134bc3 100644
--- a/lib/models/reaction.ml
+++ b/lib/models/reaction.ml
@@ -1,6 +1,4 @@
module Make(Http : S.Http) = struct
- (* open Reaction_t *)
-
type t = Reaction_t.t
(* let delete reaction user =
diff --git a/lib/models/reaction_t.ml b/lib/models/reaction_t.ml
new file mode 100644
index 0000000..c382b68
--- /dev/null
+++ b/lib/models/reaction_t.ml
@@ -0,0 +1,14 @@
+open Core
+
+type reaction_event = {
+ user_id: Snowflake.t;
+ channel_id: Snowflake.t;
+ message_id: Snowflake.t;
+ guild_id: Snowflake.t option [@default None];
+ emoji: Emoji.partial_emoji;
+} [@@deriving sexp, yojson]
+
+type t = {
+ count: int;
+ emoji: Emoji.t;
+} [@@deriving sexp, yojson { strict = false}] \ No newline at end of file
diff --git a/lib/models/role.ml b/lib/models/role.ml
index aa931d6..1d641cb 100644
--- a/lib/models/role.ml
+++ b/lib/models/role.ml
@@ -1,13 +1,13 @@
module Make(Http : S.Http) = struct
- open Role_t
-
+ type role = Role_t.role
+ type role_update = Role_t.role_update
type t = Role_t.t
let edit_role ~body (role:t) = 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:t) = Http.guild_role_remove role.guild_id role.id
let disallow_mention role =
diff --git a/lib/models/role_t.ml b/lib/models/role_t.ml
new file mode 100644
index 0000000..e41f31d
--- /dev/null
+++ b/lib/models/role_t.ml
@@ -0,0 +1,32 @@
+open Core
+
+type role = {
+ id: Snowflake.t;
+ name: string;
+ colour: int [@key "color"];
+ hoist: bool;
+ position: int;
+ permissions: int;
+ managed: bool;
+ mentionable: bool;
+} [@@deriving sexp, yojson { strict = false}]
+
+type role_update = {
+ role: role;
+ guild_id: Snowflake.t;
+} [@@deriving sexp, yojson { strict = false}]
+
+type t = {
+ id: Snowflake.t;
+ name: string;
+ colour: int [@key "color"];
+ hoist: bool;
+ position: int;
+ permissions: int;
+ managed: bool;
+ mentionable: bool;
+ guild_id: Snowflake.t;
+} [@@deriving sexp, yojson { strict = false}]
+
+let wrap ~guild_id ({id;name;colour;hoist;position;permissions;managed;mentionable}:role) =
+ {id;name;colour;hoist;position;permissions;managed;mentionable;guild_id} \ No newline at end of file
diff --git a/lib/models/snowflake.ml b/lib/models/snowflake.ml
index 6b52ec6..0122da8 100644
--- a/lib/models/snowflake.ml
+++ b/lib/models/snowflake.ml
@@ -1,16 +1,22 @@
-module Make(Http : S.Http) = struct
- open Core
+open Core
- type t = Snowflake_t.t
+type t = Int.t [@@deriving sexp]
- let timestamp snowflake =
- let offset = (snowflake lsr 22) / 1000 in
- 1_420_070_400 + offset
+let of_yojson_exn d = Yojson.Safe.Util.to_string d |> Int.of_string
- 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
+let of_yojson d =
+ try of_yojson_exn d |> Ok
+ with Yojson.Safe.Util.Type_error (why,_) -> Error why
+
+let to_yojson s : Yojson.Safe.json = `String (Int.to_string s)
+
+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" \ No newline at end of file
diff --git a/lib/models/user.ml b/lib/models/user.ml
index cd91a39..8edcea1 100644
--- a/lib/models/user.ml
+++ b/lib/models/user.ml
@@ -1,17 +1,15 @@
module Make(Http : S.Http) = struct
open Core
- open User_t
-
- type t = User_t.t
+ include User_t
let tag user =
- Printf.sprintf "%s#%d" user.username user.discriminator
+ Printf.sprintf "%s#%s" user.username user.discriminator
- let mention (user:User_t.t) =
+ let mention user =
Printf.sprintf "<@%d>" user.id
let default_avatar user =
- let avatar = user.discriminator % 5 in
+ let avatar = Int.of_string user.discriminator % 5 in
Endpoints.cdn_default_avatar avatar
let face user = match user.avatar with
diff --git a/lib/models/user_t.ml b/lib/models/user_t.ml
new file mode 100644
index 0000000..52dbaf4
--- /dev/null
+++ b/lib/models/user_t.ml
@@ -0,0 +1,13 @@
+open Core
+
+type partial_user = {
+ id: Snowflake.t;
+} [@@deriving sexp, yojson { strict = false}]
+
+type t = {
+ id: Snowflake.t;
+ username: string;
+ discriminator: string;
+ avatar: string option [@default None];
+ bot: bool [@default false];
+} [@@deriving sexp, yojson { strict = false }] \ No newline at end of file