aboutsummaryrefslogtreecommitdiff
path: root/lib/client
diff options
context:
space:
mode:
authorMishio595 <[email protected]>2018-11-24 09:51:03 -0700
committerMishio595 <[email protected]>2018-11-24 09:51:03 -0700
commitd342c4cf9fe907d2107cd815f9988f8ad147218b (patch)
treefebb926d6f3e1956346db2d3ee952391b193deb9 /lib/client
parentAdd opam build file (diff)
downloaddisml-d342c4cf9fe907d2107cd815f9988f8ad147218b.tar.xz
disml-d342c4cf9fe907d2107cd815f9988f8ad147218b.zip
Major structural changes
Diffstat (limited to 'lib/client')
-rw-r--r--lib/client/client.ml116
-rw-r--r--lib/client/opcode.ml54
-rw-r--r--lib/client/sharder.ml466
-rw-r--r--lib/client/sharder.mli138
4 files changed, 0 insertions, 774 deletions
diff --git a/lib/client/client.ml b/lib/client/client.ml
deleted file mode 100644
index 9877714..0000000
--- a/lib/client/client.ml
+++ /dev/null
@@ -1,116 +0,0 @@
-open Async
-
-type t = {
- sharder: Sharder.t Ivar.t;
- (* events: (Events.t, Core_kernel.write) Bvar.t list; *)
- mutable handler: Sharder.handler;
- token: string;
-}
-
-let make ?handler token =
- let handler = match handler with
- | Some h -> h
- | None -> begin
- Sharder.{
- ready = None;
- resumed = None;
- channel_create = None;
- channel_delete = None;
- channel_update = None;
- channel_pins_update = None;
- guild_create = None;
- guild_delete = None;
- guild_update = None;
- guild_ban_add = None;
- guild_ban_remove = None;
- guild_emojis_update = None;
- guild_integrations_update = None;
- guild_member_add = None;
- guild_member_remove = None;
- guild_member_update = None;
- guild_members_chunk = None;
- guild_role_create = None;
- guild_role_delete = None;
- guild_role_update = None;
- message_create = None;
- message_delete = None;
- message_update = None;
- message_delete_bulk = None;
- message_reaction_add = None;
- message_reaction_remove = None;
- message_reaction_remove_all = None;
- presence_update = None;
- typing_start = None;
- user_update = None;
- voice_state_update = None;
- voice_server_update = None;
- webhooks_update = None;
- }
- end in
- {
- sharder = Ivar.create ();
- handler;
- token;
- }
-
-let start ?count client =
- Sharder.start ?count ~handler:client.handler client.token
- >>| fun sharder ->
- Ivar.fill_if_empty client.sharder sharder;
- client
-
-let on ev client fn =
- client.handler <- (match ev with
- | "READY" -> { client.handler with ready = Some(fn) }
- | "RESUMED" -> { client.handler with resumed = Some(fn) }
- | "CHANNEL_CREATE" -> { client.handler with channel_create = Some(fn) }
- | "CHANNEL_DELETE" -> { client.handler with channel_delete = Some(fn) }
- | "CHANNEL_UPDATE" -> { client.handler with channel_update = Some(fn) }
- | "CHANNEL_PINS_UPDATE" -> { client.handler with channel_pins_update = Some(fn) }
- | "GUILD_CREATE" -> { client.handler with guild_create = Some(fn) }
- | "GUILD_DELETE" -> { client.handler with guild_delete = Some(fn) }
- | "GUILD_UPDATE" -> { client.handler with guild_update = Some(fn) }
- | "GUILD_BAN_ADD" -> { client.handler with guild_ban_add = Some(fn) }
- | "GUILD_BAN_REMOVE" -> { client.handler with guild_ban_remove = Some(fn) }
- | "GUILD_EMOJIS_UPDATE" -> { client.handler with guild_emojis_update = Some(fn) }
- | "GUILD_INTEGRATIONS_UPDATE" -> { client.handler with guild_integrations_update = Some(fn) }
- | "GUILD_MEMBER_ADD" -> { client.handler with guild_member_add = Some(fn) }
- | "GUILD_MEMBER_REMOVE" -> { client.handler with guild_member_remove = Some(fn) }
- | "GUILD_MEMBER_UPDATE" -> { client.handler with guild_member_update = Some(fn) }
- | "GUILD_MEMBERS_CHUNK" -> { client.handler with guild_members_chunk = Some(fn) }
- | "GUILD_ROLE_CREATE" -> { client.handler with guild_role_create = Some(fn) }
- | "GUILD_ROLE_DELETE" -> { client.handler with guild_role_delete = Some(fn) }
- | "GUILD_ROLE_UPDATE" -> { client.handler with guild_role_update = Some(fn) }
- | "MESSAGE_CREATE" -> { client.handler with message_create = Some(fn) }
- | "MESSAGE_DELETE" -> { client.handler with message_delete = Some(fn) }
- | "MESSAGE_UPDATE" -> { client.handler with message_update = Some(fn) }
- | "MESSAGE_DELETE_BULK" -> { client.handler with message_delete_bulk = Some(fn) }
- | "MESSAGE_REACTION_ADD" -> { client.handler with message_reaction_add = Some(fn) }
- | "MESSAGE_REACTION_REMOVE" -> { client.handler with message_reaction_remove = Some(fn) }
- | "MESSAGE_REACTION_REMOVE_ALL" -> { client.handler with message_reaction_remove_all = Some(fn) }
- | "PRESENCE_UPDATE" -> { client.handler with presence_update = Some(fn) }
- | "TYPING_START" -> { client.handler with typing_start = Some(fn) }
- | "USER_UPDATE" -> { client.handler with user_update = Some(fn) }
- | "VOICE_STATE_UPDATE" -> { client.handler with voice_state_update = Some(fn) }
- | "VOICE_SERVER_UPDATE" -> { client.handler with voice_server_update = Some(fn) }
- | "WEBHOOKS_UPDATE" -> { client.handler with webhooks_update = Some(fn) }
- | _ -> client.handler);
- match Ivar.peek client.sharder with
- | Some s -> Sharder.update_handler s client.handler;
- | None -> ()
-
-
-let set_status client status =
- Ivar.read client.sharder
- >>= fun sharder ->
- Sharder.set_status sharder status
-
-let set_status_with client f =
- Ivar.read client.sharder
- >>= fun sharder ->
- Sharder.set_status_with sharder f
-
-let request_guild_members ~guild ?query ?limit client =
- Ivar.read client.sharder
- >>= fun sharder ->
- Sharder.request_guild_members ~guild ?query ?limit sharder \ No newline at end of file
diff --git a/lib/client/opcode.ml b/lib/client/opcode.ml
deleted file mode 100644
index 2462d05..0000000
--- a/lib/client/opcode.ml
+++ /dev/null
@@ -1,54 +0,0 @@
-type t =
- | DISPATCH
- | HEARTBEAT
- | IDENTIFY
- | STATUS_UPDATE
- | VOICE_STATE_UPDATE
- | RESUME
- | RECONNECT
- | REQUEST_GUILD_MEMBERS
- | INVALID_SESSION
- | HELLO
- | HEARTBEAT_ACK
-
-exception Invalid_Opcode of int
-
-let to_int = function
- | DISPATCH -> 0
- | HEARTBEAT -> 1
- | IDENTIFY -> 2
- | STATUS_UPDATE -> 3
- | VOICE_STATE_UPDATE -> 4
- | RESUME -> 6
- | RECONNECT -> 7
- | REQUEST_GUILD_MEMBERS -> 8
- | INVALID_SESSION -> 9
- | HELLO -> 10
- | HEARTBEAT_ACK -> 11
-
-let from_int = function
- | 0 -> DISPATCH
- | 1 -> HEARTBEAT
- | 2 -> IDENTIFY
- | 3 -> STATUS_UPDATE
- | 4 -> VOICE_STATE_UPDATE
- | 6 -> RESUME
- | 7 -> RECONNECT
- | 8 -> REQUEST_GUILD_MEMBERS
- | 9 -> INVALID_SESSION
- | 10 -> HELLO
- | 11 -> HEARTBEAT_ACK
- | op -> raise (Invalid_Opcode op)
-
-let to_string = function
- | DISPATCH -> "DISPATCH"
- | HEARTBEAT -> "HEARTBEAT"
- | IDENTIFY -> "IDENTIFY"
- | STATUS_UPDATE -> "STATUS_UPDATE"
- | VOICE_STATE_UPDATE -> "VOICE_STATE_UPDATE"
- | RESUME -> "RESUME"
- | RECONNECT -> "RECONNECT"
- | REQUEST_GUILD_MEMBERS -> "REQUEST_GUILD_MEMBER"
- | INVALID_SESSION -> "INVALID_SESSION"
- | HELLO -> "HELLO"
- | HEARTBEAT_ACK -> "HEARTBEAT_ACK" \ No newline at end of file
diff --git a/lib/client/sharder.ml b/lib/client/sharder.ml
deleted file mode 100644
index 8d735b0..0000000
--- a/lib/client/sharder.ml
+++ /dev/null
@@ -1,466 +0,0 @@
-open Async
-open Core
-open Websocket_async
-
-exception Invalid_Payload
-
-type handler = {
- ready: (Yojson.Basic.json -> unit) option;
- resumed: (Yojson.Basic.json -> unit) option;
- channel_create: (Yojson.Basic.json -> unit) option;
- channel_delete: (Yojson.Basic.json -> unit) option;
- channel_update: (Yojson.Basic.json -> unit) option;
- channel_pins_update: (Yojson.Basic.json -> unit) option;
- guild_create: (Yojson.Basic.json -> unit) option;
- guild_delete: (Yojson.Basic.json -> unit) option;
- guild_update: (Yojson.Basic.json -> unit) option;
- guild_ban_add: (Yojson.Basic.json -> unit) option;
- guild_ban_remove: (Yojson.Basic.json -> unit) option;
- guild_emojis_update: (Yojson.Basic.json -> unit) option;
- guild_integrations_update: (Yojson.Basic.json -> unit) option;
- guild_member_add: (Yojson.Basic.json -> unit) option;
- guild_member_remove: (Yojson.Basic.json -> unit) option;
- guild_member_update: (Yojson.Basic.json -> unit) option;
- guild_members_chunk: (Yojson.Basic.json -> unit) option; (* Not sure if this should be exposed *)
- guild_role_create: (Yojson.Basic.json -> unit) option;
- guild_role_delete: (Yojson.Basic.json -> unit) option;
- guild_role_update: (Yojson.Basic.json -> unit) option;
- message_create: (Yojson.Basic.json -> unit) option;
- message_delete: (Yojson.Basic.json -> unit) option;
- message_update: (Yojson.Basic.json -> unit) option;
- message_delete_bulk: (Yojson.Basic.json -> unit) option;
- message_reaction_add: (Yojson.Basic.json -> unit) option;
- message_reaction_remove: (Yojson.Basic.json -> unit) option;
- message_reaction_remove_all: (Yojson.Basic.json -> unit) option;
- presence_update: (Yojson.Basic.json -> unit) option;
- typing_start: (Yojson.Basic.json -> unit) option;
- user_update: (Yojson.Basic.json -> unit) option;
- voice_state_update: (Yojson.Basic.json -> unit) option;
- voice_server_update: (Yojson.Basic.json -> unit) option;
- webhooks_update: (Yojson.Basic.json -> unit) option;
-}
-
-module Shard = struct
- type t = {
- mutable hb: unit Ivar.t option;
- mutable seq: int;
- mutable session: string option;
- mutable handler: handler;
- token: string;
- shard: int * int;
- write: string Pipe.Writer.t;
- read: string Pipe.Reader.t;
- ready: unit Ivar.t;
- }
-
- let identify_lock = Mutex.create ()
-
- let parse frame =
- match frame with
- | `Ok s -> Yojson.Basic.from_string s
- | `Eof -> raise Invalid_Payload (* This needs to go into reconnect code, or stop using client_ez and handle frames manually *)
-
- let push_frame ?payload shard ev =
- print_endline @@ "Pushing frame. OP: " ^ Opcode.to_string @@ ev;
- let content = match payload with
- | None -> ""
- | Some p ->
- Yojson.Basic.to_string @@ `Assoc [
- ("op", `Int (Opcode.to_int ev));
- ("d", p);
- ]
- in
- Pipe.write shard.write content
- >>| fun () ->
- shard
-
- let heartbeat shard =
- let seq = match shard.seq with
- | 0 -> `Null
- | i -> `Int i
- in
- let payload = `Assoc [
- ("op", `Int 1);
- ("d", seq);
- ] in
- push_frame ~payload shard HEARTBEAT
-
- let dispatch shard payload =
- let module J = Yojson.Basic.Util in
- let seq = J.(member "s" payload |> to_int) in
- shard.seq <- seq;
- let t = J.(member "t" payload |> to_string) in
- let data = J.member "d" payload in
- let _ = match t with
- | "READY" -> begin
- Ivar.fill_if_empty shard.ready ();
- let session = J.(member "session_id" data |> to_string) in
- shard.session <- Some session;
- match shard.handler.ready with
- | Some f -> f data
- | None -> ()
- end
- | "RESUMED" -> begin
- match shard.handler.resumed with
- | Some f -> f data
- | None -> ()
- end
- | "CHANNEL_CREATE" -> begin
- match shard.handler.channel_create with
- | Some f -> f data
- | None -> ()
- end
- | "CHANNEL_DELETE" -> begin
- match shard.handler.channel_delete with
- | Some f -> f data
- | None -> ()
- end
- | "CHANNEL_UPDATE" -> begin
- match shard.handler.channel_update with
- | Some f -> f data
- | None -> ()
- end
- | "CHANNEL_PINS_UPDATE" -> begin
- match shard.handler.channel_pins_update with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_CREATE" -> begin
- match shard.handler.guild_create with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_DELETE" -> begin
- match shard.handler.guild_delete with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_UPDATE" -> begin
- match shard.handler.guild_update with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_BAN_ADD" -> begin
- match shard.handler.guild_ban_add with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_BAN_REMOVE" -> begin
- match shard.handler.guild_ban_remove with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_EMOJIS_UPDATE" -> begin
- match shard.handler.guild_emojis_update with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_INTEGRATIONS_UPDATE" -> begin
- match shard.handler.guild_integrations_update with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_MEMBER_ADD" -> begin
- match shard.handler.guild_member_add with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_MEMBER_REMOVE" -> begin
- match shard.handler.guild_member_remove with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_MEMBER_UPDATE" -> begin
- match shard.handler.guild_member_update with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_MEMBERS_CHUNK" -> begin
- match shard.handler.guild_members_chunk with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_ROLE_CREATE" -> begin
- match shard.handler.guild_role_create with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_ROLE_DELETE" -> begin
- match shard.handler.guild_role_delete with
- | Some f -> f data
- | None -> ()
- end
- | "GUILD_ROLE_UPDATE" -> begin
- match shard.handler.guild_role_update with
- | Some f -> f data
- | None -> ()
- end
- | "MESSAGE_CREATE" -> begin
- match shard.handler.message_create with
- | Some f -> f data
- | None -> ()
- end
- | "MESSAGE_DELETE" -> begin
- match shard.handler.message_delete with
- | Some f -> f data
- | None -> ()
- end
- | "MESSAGE_UPDATE" -> begin
- match shard.handler.message_update with
- | Some f -> f data
- | None -> ()
- end
- | "MESSAGE_DELETE_BULK" -> begin
- match shard.handler.message_delete_bulk with
- | Some f -> f data
- | None -> ()
- end
- | "MESSAGE_REACTION_ADD" -> begin
- match shard.handler.message_reaction_add with
- | Some f -> f data
- | None -> ()
- end
- | "MESSAGE_REACTION_REMOVE" -> begin
- match shard.handler.message_reaction_remove with
- | Some f -> f data
- | None -> ()
- end
- | "MESSAGE_REACTION_REMOVE_ALL" -> begin
- match shard.handler.message_reaction_remove_all with
- | Some f -> f data
- | None -> ()
- end
- | "PRESENCE_UPDATE" -> begin
- match shard.handler.presence_update with
- | Some f -> f data
- | None -> ()
- end
- | "TYPING_START" -> begin
- match shard.handler.typing_start with
- | Some f -> f data
- | None -> ()
- end
- | "USER_UPDATE" -> begin
- match shard.handler.user_update with
- | Some f -> f data
- | None -> ()
- end
- | "VOICE_STATE_UPDATE" -> begin
- match shard.handler.voice_state_update with
- | Some f -> f data
- | None -> ()
- end
- | "VOICE_SERVER_UPDATE" -> begin
- match shard.handler.voice_server_update with
- | Some f -> f data
- | None -> ()
- end
- | "WEBHOOKS_UPDATE" -> begin
- match shard.handler.webhooks_update with
- | Some f -> f data
- | None -> ()
- end
- | _ -> ()
- in
- return shard
-
- let set_status shard status =
- let payload = match status with
- | `Assoc [("name", `String name); ("type", `Int t)] ->
- `Assoc [
- ("status", `String "online");
- ("afk", `Bool false);
- ("since", `Null);
- ("game", `Assoc [
- ("name", `String name);
- ("type", `Int t)
- ])
- ]
- | `String name ->
- `Assoc [
- ("status", `String "online");
- ("afk", `Bool false);
- ("since", `Null);
- ("game", `Assoc [
- ("name", `String name);
- ("type", `Int 0)
- ])
- ]
- | _ -> raise Invalid_Payload
- in
- Ivar.read shard.ready >>= fun _ ->
- push_frame ~payload shard STATUS_UPDATE
-
- let request_guild_members ~guild ?(query="") ?(limit=0) shard =
- let payload = `Assoc [
- ("guild_id", `String (string_of_int guild));
- ("query", `String query);
- ("limit", `Int limit);
- ] in
- Ivar.read shard.ready >>= fun _ ->
- push_frame ~payload shard REQUEST_GUILD_MEMBERS
-
- let initialize shard data =
- let module J = Yojson.Basic.Util in
- let hb = match shard.hb with
- | None -> begin
- let hb_interval = J.(member "heartbeat_interval" data |> to_int) in
- let finished = Ivar.create () in
- Clock.every'
- ~continue_on_error:true
- ~finished
- (Core.Time.Span.create ~ms:hb_interval ())
- (fun () -> heartbeat shard >>= fun _ -> return ());
- finished
- end
- | Some s -> s
- in
- shard.hb <- Some hb;
- Mutex.lock identify_lock;
- let (cur, max) = shard.shard in
- let shards = [`Int cur; `Int max] in
- match shard.session with
- | None ->
- let payload = `Assoc [
- ("token", `String shard.token);
- ("properties", `Assoc [
- ("$os", `String Sys.os_type);
- ("$device", `String "dis.ml");
- ("$browser", `String "dis.ml")
- ]);
- ("compress", `Bool false); (* TODO add compression handling*)
- ("large_threshold", `Int 250);
- ("shard", `List shards);
- ] in
- push_frame ~payload shard IDENTIFY
- | Some s ->
- let payload = `Assoc [
- ("token", `String shard.token);
- ("session_id", `String s);
- ("seq", `Int shard.seq)
- ] in
- push_frame ~payload shard RESUME
- >>| fun s ->
- Clock.after (Core.Time.Span.create ~sec:5 ())
- >>| (fun _ -> Mutex.unlock identify_lock)
- |> ignore;
- s
-
- let handle_frame shard term =
- let module J = Yojson.Basic.Util in
- let op = J.(member "op" term |> to_int)
- |> Opcode.from_int
- in
- match op with
- | DISPATCH -> dispatch shard term
- | HEARTBEAT -> heartbeat shard
- | RECONNECT -> print_endline "OP 7"; return shard (* TODO reconnect *)
- | INVALID_SESSION -> print_endline "OP 9"; return shard (* TODO invalid session *)
- | HELLO -> initialize shard @@ J.member "d" term
- | HEARTBEAT_ACK -> return shard
- | opcode ->
- print_endline @@ "Invalid Opcode:" ^ Opcode.to_string opcode;
- return shard
-
- let create ~url ~shards ~token ~handler () =
- let open Core in
- let uri = (url ^ "?v=6&encoding=json") |> Uri.of_string in
- let extra_headers = Http.Base.process_request_headers () in
- let host = Option.value_exn ~message:"no host in uri" Uri.(host uri) in
- let port =
- match Uri.port uri, Uri_services.tcp_port_of_uri uri with
- | Some p, _ -> p
- | None, Some p -> p
- | _ -> 443 in
- let scheme = Option.value_exn ~message:"no scheme in uri" Uri.(scheme uri) in
- let tcp_fun (r,w) =
- let (read, write) = client_ez
- ~extra_headers
- uri r w
- in
- let rec ev_loop shard =
- Pipe.read read
- >>= fun frame ->
- handle_frame shard @@ parse frame
- >>= fun shard ->
- ev_loop shard
- in
- let shard = {
- read;
- write;
- handler;
- ready = Ivar.create ();
- hb = None;
- seq = 0;
- shard = shards;
- session = None;
- token = token;
- }
- in
- ev_loop shard |> ignore;
- return shard
- in
- match Unix.getaddrinfo host (string_of_int port) [] with
- | [] -> failwithf "DNS resolution failed for %s" host ()
- | { ai_addr; _ } :: _ ->
- let addr =
- match scheme, ai_addr with
- | _, ADDR_UNIX path -> `Unix_domain_socket path
- | "https", ADDR_INET (h, p)
- | "wss", ADDR_INET (h, p) ->
- let h = Ipaddr_unix.of_inet_addr h in
- `OpenSSL (h, p, Conduit_async.V2.Ssl.Config.create ())
- | _, ADDR_INET (h, p) ->
- let h = Ipaddr_unix.of_inet_addr h in
- `TCP (h, p)
- in
- Conduit_async.V2.connect addr >>= tcp_fun
-end
-
-type t = {
- shards: Shard.t list;
-}
-
-let start ?count ~handler token =
- let module J = Yojson.Basic.Util in
- Http.get_gateway_bot () >>= fun data ->
- let url = J.(member "url" data |> to_string) in
- let count = match count with
- | Some c -> c
- | None -> J.(member "shards" data |> to_int)
- in
- let shard_list = (0, count) in
- let rec gen_shards l a =
- match l with
- | (id, total) when id >= total -> return a
- | (id, total) ->
- Shard.create ~url ~shards:(id, total) ~token ~handler ()
- >>= fun shard ->
- let a = shard :: a in
- gen_shards (id+1, total) a
- in
- gen_shards shard_list []
- >>| fun shards ->
- {
- shards;
- }
-
-let set_status sharder status =
- Deferred.all @@ List.map ~f:(fun shard ->
- Shard.set_status shard status
- ) sharder.shards
-
-let set_status_with sharder f =
- Deferred.all @@ List.map ~f:(fun shard ->
- Shard.set_status shard @@ f shard
- ) sharder.shards
-
-let request_guild_members ~guild ?query ?limit sharder =
- Deferred.all @@ List.map ~f:(fun shard ->
- Shard.request_guild_members ~guild ?query ?limit shard
- ) sharder.shards
-
-let update_handler sharder handler =
- List.iter ~f:(fun shard ->
- shard.handler <- handler
- ) sharder.shards \ No newline at end of file
diff --git a/lib/client/sharder.mli b/lib/client/sharder.mli
deleted file mode 100644
index 0fd16d6..0000000
--- a/lib/client/sharder.mli
+++ /dev/null
@@ -1,138 +0,0 @@
-open Async
-
-(**
-Record type for registering event handlers
-*)
-type handler = {
- ready: (Yojson.Basic.json -> unit) option;
- resumed: (Yojson.Basic.json -> unit) option;
- channel_create: (Yojson.Basic.json -> unit) option;
- channel_delete: (Yojson.Basic.json -> unit) option;
- channel_update: (Yojson.Basic.json -> unit) option;
- channel_pins_update: (Yojson.Basic.json -> unit) option;
- guild_create: (Yojson.Basic.json -> unit) option;
- guild_delete: (Yojson.Basic.json -> unit) option;
- guild_update: (Yojson.Basic.json -> unit) option;
- guild_ban_add: (Yojson.Basic.json -> unit) option;
- guild_ban_remove: (Yojson.Basic.json -> unit) option;
- guild_emojis_update: (Yojson.Basic.json -> unit) option;
- guild_integrations_update: (Yojson.Basic.json -> unit) option;
- guild_member_add: (Yojson.Basic.json -> unit) option;
- guild_member_remove: (Yojson.Basic.json -> unit) option;
- guild_member_update: (Yojson.Basic.json -> unit) option;
- guild_members_chunk: (Yojson.Basic.json -> unit) option;
- guild_role_create: (Yojson.Basic.json -> unit) option;
- guild_role_delete: (Yojson.Basic.json -> unit) option;
- guild_role_update: (Yojson.Basic.json -> unit) option;
- message_create: (Yojson.Basic.json -> unit) option;
- message_delete: (Yojson.Basic.json -> unit) option;
- message_update: (Yojson.Basic.json -> unit) option;
- message_delete_bulk: (Yojson.Basic.json -> unit) option;
- message_reaction_add: (Yojson.Basic.json -> unit) option;
- message_reaction_remove: (Yojson.Basic.json -> unit) option;
- message_reaction_remove_all: (Yojson.Basic.json -> unit) option;
- presence_update: (Yojson.Basic.json -> unit) option;
- typing_start: (Yojson.Basic.json -> unit) option;
- user_update: (Yojson.Basic.json -> unit) option;
- voice_state_update: (Yojson.Basic.json -> unit) option;
- voice_server_update: (Yojson.Basic.json -> unit) option;
- webhooks_update: (Yojson.Basic.json -> unit) option;
-}
-
-(**
-Represents a single Shard. Manual creation is discouraged; use Sharder.start instead
-*)
-module Shard : sig
- type t = {
- mutable hb: unit Ivar.t option;
- mutable seq: int;
- mutable session: string option;
- mutable handler: handler;
- token: string;
- shard: int * int;
- write: string Pipe.Writer.t;
- read: string Pipe.Reader.t;
- ready: unit Ivar.t;
- }
-
- val parse :
- [< `Ok of string | `Eof] ->
- Yojson.Basic.json
-
- val push_frame :
- ?payload:Yojson.Basic.json ->
- t ->
- Opcode.t ->
- t Deferred.t
-
- val heartbeat :
- t ->
- t Deferred.t
-
- val dispatch :
- t ->
- Yojson.Basic.json ->
- t Deferred.t
-
- val set_status :
- t ->
- Yojson.Basic.json ->
- t Deferred.t
-
- val request_guild_members :
- guild:int ->
- ?query:string ->
- ?limit:int ->
- t ->
- t Deferred.t
-
- val initialize :
- t ->
- Yojson.Basic.json ->
- t Deferred.t
-
- val handle_frame :
- t ->
- Yojson.Basic.json ->
- t Deferred.t
-
- val create :
- url:string ->
- shards:int * int ->
- token:string ->
- handler: handler ->
- unit ->
- t Deferred.t
-end
-
-type t = {
- shards: Shard.t list;
-}
-
-val start :
- ?count:int ->
- handler:handler ->
- string ->
- t Deferred.t
-
-val set_status :
- t ->
- Yojson.Basic.json ->
- Shard.t list Deferred.t
-
-val set_status_with :
- t ->
- (Shard.t -> Yojson.Basic.json) ->
- Shard.t list Deferred.t
-
-val request_guild_members :
- guild:int ->
- ?query:string ->
- ?limit:int ->
- t ->
- Shard.t list Deferred.t
-
-val update_handler :
- t ->
- handler ->
- unit \ No newline at end of file