Skip to content

Commit

Permalink
Merge pull request #52 from pm5/fix-conversation-type
Browse files Browse the repository at this point in the history
Fix conversation type
  • Loading branch information
Leonidas-from-XIV authored Aug 30, 2023
2 parents 1dbc151 + 1351642 commit 87fbd00
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 19 deletions.
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

0 comments on commit 87fbd00

Please sign in to comment.