Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix conversation type #52

Merged
merged 3 commits into from
Aug 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 33 additions & 6 deletions src/lib/slacko.ml
Original file line number Diff line number Diff line change
Expand Up @@ -195,14 +195,16 @@ type channel = ChannelId of string | ChannelName of string

type conversation = string

type im = string

type user = UserId of string | UserName of string

type bot = BotId of string

type group = GroupId of string | GroupName of string

(* TODO: Sure about user? *)
type chat = Channel of channel | Im of conversation | User of user | Group of group
type chat = Channel of channel | Im of im | User of user | Group of group

type sort_criterion = Score | Timestamp

Expand All @@ -226,13 +228,17 @@ let channel_of_yojson = function
| `String x -> Ok (ChannelId x)
| _ -> Error "Couldn't parse channel type"

let conversation_of_yojson = function
| `String x -> Ok x
| _ -> Error "Couldn't parse conversation type"

let group_of_yojson = function
| `String x -> Ok (GroupId x)
| _ -> Error "Couldn't parse group type"

let conversation_of_yojson = function
let im_of_yojson = function
| `String x -> Ok x
| _ -> Error "Couldn't parse conversation type"
| _ -> Error "Couldn't parse im type"

type topic_obj = {
value: string;
Expand All @@ -259,6 +265,25 @@ type channel_obj = {
num_members: int option [@default None];
} [@@deriving of_yojson { strict = false }]

type conversation_obj = {
id: conversation;
name: string;
is_channel: bool;
created: Timestamp.t;
creator: user;
is_archived: bool;
is_general: bool;
is_member: bool;
topic: topic_obj;
purpose: topic_obj;
last_read: Timestamp.t option [@default None];
latest: string option [@default None];
unread_count: int option [@default None];
unread_count_display: int option [@default None];
num_members: int option [@default None];
} [@@deriving of_yojson { strict = false }]


type user_obj = {
id: user;
name: string;
Expand Down Expand Up @@ -336,7 +361,7 @@ type file_obj = {
(*public_url_shared: ???;*)
channels: channel list;
groups: group list;
ims: conversation list;
ims: im list;
initial_comment: Yojson.Safe.t option [@default None];
num_stars: int option [@default None];
} [@@deriving of_yojson { strict = false }]
Expand Down Expand Up @@ -485,6 +510,8 @@ type im_obj = {
user: user;
created: Timestamp.t;
is_user_deleted: bool;
is_open: bool option [@default None];
last_read: Timestamp.t option [@default None];
unread_count: int option [@default None];
unread_count_display: int option [@default None];
} [@@deriving of_yojson { strict = false }]
Expand Down Expand Up @@ -883,8 +910,8 @@ let user_of_string s =
let group_of_string s =
if s.[0] = 'G' then GroupId s else GroupName s

(* TODO Create a conversation if conversation does not exist? *)
let conversation_of_string s =
(* TODO Create a im if im does not exist? *)
let im_of_string s =
if s.[0] = 'D' then s else failwith "Not an IM channel"

let translate_parsing_error = function
Expand Down
46 changes: 35 additions & 11 deletions src/lib/slacko.mli
Original file line number Diff line number Diff line change
Expand Up @@ -279,9 +279,12 @@ type message
channel id. *)
type channel

(** A type of an IM conversation *)
(** A channel-like container for a conversation used by the Conversations API. *)
type conversation

(** A type of an IM conversation *)
type im

(** An user, represented by either a user name or a user id. *)
type user

Expand All @@ -292,7 +295,7 @@ type bot
type group

(** A place one can post messages to. *)
type chat = Channel of channel | Im of conversation | User of user | Group of group
type chat = Channel of channel | Im of im | User of user | Group of group

(** What criterion to use in search. *)
type sort_criterion = Score | Timestamp
Expand Down Expand Up @@ -368,6 +371,25 @@ type channel_obj = {
num_members: int option;
}

(** Object representing information about a Slack channel. *)
type conversation_obj = {
id: conversation;
name: string;
is_channel: bool;
created: timestamp;
creator: user;
is_archived: bool;
is_general: bool;
is_member: bool;
topic: topic_obj;
purpose: topic_obj;
last_read: timestamp option;
latest: string option;
unread_count: int option;
unread_count_display: int option;
num_members: int option;
}

(** Object representing a message attachment field. *)
type field_obj = {
title: string option;
Expand Down Expand Up @@ -468,13 +490,15 @@ type groups_rename_obj = {
created: timestamp
}

(** Information about a direct conversation with a person. *)
(** Information about a direct im with a person. *)
type im_obj = {
id: string;
is_im: bool;
user: user;
created: timestamp;
is_user_deleted: bool;
is_open: bool option;
last_read: timestamp option;
unread_count: int option;
unread_count_display: int option;
}
Expand All @@ -483,7 +507,7 @@ type im_channel_obj = {
id: string;
}

(** Information about an direct conversation channel. *)
(** Information about an direct im channel. *)
type im_open_obj = {
no_op: bool option;
already_open: bool option;
Expand Down Expand Up @@ -555,7 +579,7 @@ type file_obj = {
(*public_url_shared: ???;*)
channels: channel list;
groups: group list;
ims: conversation list;
ims: im list;
initial_comment: Yojson.Safe.t option;
num_stars: int option;
}
Expand Down Expand Up @@ -690,9 +714,9 @@ val bot_of_string : string -> bot
id by means of an additional request. *)
val channel_of_string: string -> channel

(** Create a conversation type out of a given string. The string is usually
starting with a capital 'D' and represents an IM conversation channel. *)
val conversation_of_string: string -> conversation
(** Create a im type out of a given string. The string is usually
starting with a capital 'D' and represents an IM im channel. *)
val im_of_string: string -> im

(** {2 Slack API calls} *)

Expand Down Expand Up @@ -823,16 +847,16 @@ val groups_set_topic: session -> group -> topic -> topic_result Lwt.t
val groups_unarchive: session -> group -> [ `Success | parsed_auth_error | channel_error | `Not_archived | `User_is_restricted | bot_error ] Lwt.t

(** Close a direct message channel. *)
val im_close: session -> conversation -> [ `Success of chat_close_obj | parsed_auth_error | channel_error | `User_does_not_own_channel ] Lwt.t
val im_close: session -> im -> [ `Success of chat_close_obj | parsed_auth_error | channel_error | `User_does_not_own_channel ] Lwt.t

(** Fetches history of messages and events from direct message channel. *)
val im_history: session -> ?latest:timestamp -> ?oldest:timestamp -> ?count:int -> ?inclusive:bool -> conversation -> history_result Lwt.t
val im_history: session -> ?latest:timestamp -> ?oldest:timestamp -> ?count:int -> ?inclusive:bool -> im -> history_result Lwt.t

(** Lists direct message channels for the calling user. *)
val im_list: session -> [ `Success of im_obj list | parsed_auth_error ] Lwt.t

(** Sets the read cursor in a direct message channel. *)
val im_mark: session -> conversation -> timestamp -> [ `Success | parsed_auth_error | channel_error | not_in_channel_error ] Lwt.t
val im_mark: session -> im -> timestamp -> [ `Success | parsed_auth_error | channel_error | not_in_channel_error ] Lwt.t

(** Opens a direct message channel. *)
val im_open: session -> user -> [ `Success of im_open_obj | parsed_auth_error | user_error | user_visibility_error ] Lwt.t
Expand Down
4 changes: 2 additions & 2 deletions test/test_slacko.ml
Original file line number Diff line number Diff line change
Expand Up @@ -292,13 +292,13 @@ let groups_list_tests = fake_slack_tests "groups_list" [

let test_im_history_bad_auth _tctx =
let session = Slacko.start_session ?base_url badtoken in
let slackbot = Slacko.conversation_of_string Fake_slack.im_slackbot in
let slackbot = Slacko.im_of_string Fake_slack.im_slackbot in
Slacko.im_history session slackbot >|= fun resp ->
assert_equal `Invalid_auth resp

let test_im_history_no_params _tctx =
let session = Slacko.start_session ?base_url token in
let slackbot = Slacko.conversation_of_string Fake_slack.im_slackbot in
let slackbot = Slacko.im_of_string Fake_slack.im_slackbot in
Slacko.im_history session slackbot >|= get_success >|= fun history ->
assert_equal ~printer:show_abbr_history_obj
(abbr_json abbr_history_obj_of_yojson Fake_slack.slackbot_history_json)
Expand Down