diff options
| author | Adelyn Breedlove <[email protected]> | 2019-01-13 23:52:45 +0000 |
|---|---|---|
| committer | Adelyn Breedlove <[email protected]> | 2019-01-13 23:52:45 +0000 |
| commit | d95f0342f9cf2280b5d9794ab638c16a59c02a69 (patch) | |
| tree | 191164d198c07cf388d9aae8a54013e5613c272c /lib/models | |
| parent | Merge branch 'dev' into 'master' (diff) | |
| parent | Add deriving sexp to models (diff) | |
| download | disml-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.ml | 10 | ||||
| -rw-r--r-- | lib/models/attachment.ml | 14 | ||||
| -rw-r--r-- | lib/models/ban_t.ml | 6 | ||||
| -rw-r--r-- | lib/models/channel.ml | 38 | ||||
| -rw-r--r-- | lib/models/channel_t.ml | 118 | ||||
| -rw-r--r-- | lib/models/embed.ml | 62 | ||||
| -rw-r--r-- | lib/models/emoji.ml | 19 | ||||
| -rw-r--r-- | lib/models/guild.ml | 69 | ||||
| -rw-r--r-- | lib/models/guild_t.ml | 67 | ||||
| -rw-r--r-- | lib/models/member.ml | 3 | ||||
| -rw-r--r-- | lib/models/member_t.ml | 43 | ||||
| -rw-r--r-- | lib/models/message.ml | 24 | ||||
| -rw-r--r-- | lib/models/message_t.ml | 45 | ||||
| -rw-r--r-- | lib/models/presence.ml | 13 | ||||
| -rw-r--r-- | lib/models/reaction.ml | 2 | ||||
| -rw-r--r-- | lib/models/reaction_t.ml | 14 | ||||
| -rw-r--r-- | lib/models/role.ml | 6 | ||||
| -rw-r--r-- | lib/models/role_t.ml | 32 | ||||
| -rw-r--r-- | lib/models/snowflake.ml | 32 | ||||
| -rw-r--r-- | lib/models/user.ml | 10 | ||||
| -rw-r--r-- | lib/models/user_t.ml | 13 |
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 |