diff options
| author | Mishio595 <[email protected]> | 2018-11-24 09:51:03 -0700 |
|---|---|---|
| committer | Mishio595 <[email protected]> | 2018-11-24 09:51:03 -0700 |
| commit | d342c4cf9fe907d2107cd815f9988f8ad147218b (patch) | |
| tree | febb926d6f3e1956346db2d3ee952391b193deb9 /lib/client | |
| parent | Add opam build file (diff) | |
| download | disml-d342c4cf9fe907d2107cd815f9988f8ad147218b.tar.xz disml-d342c4cf9fe907d2107cd815f9988f8ad147218b.zip | |
Major structural changes
Diffstat (limited to 'lib/client')
| -rw-r--r-- | lib/client/client.ml | 116 | ||||
| -rw-r--r-- | lib/client/opcode.ml | 54 | ||||
| -rw-r--r-- | lib/client/sharder.ml | 466 | ||||
| -rw-r--r-- | lib/client/sharder.mli | 138 |
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 |