diff options
| author | Adelyn Breelove <[email protected]> | 2019-01-25 15:56:07 -0700 |
|---|---|---|
| committer | Adelyn Breelove <[email protected]> | 2019-01-25 15:56:07 -0700 |
| commit | bb6f6d728444936a6d810e01b2bdffe4b85c4d96 (patch) | |
| tree | 35fb88dafafe4e189adf304ce32193d9765d036d /lib | |
| parent | simple corrections (diff) | |
| download | disml-bb6f6d728444936a6d810e01b2bdffe4b85c4d96.tar.xz disml-bb6f6d728444936a6d810e01b2bdffe4b85c4d96.zip | |
hopeful reconnection fix
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sharder.ml | 16 | ||||
| -rw-r--r-- | lib/sharder.mli | 7 |
2 files changed, 21 insertions, 2 deletions
diff --git a/lib/sharder.ml b/lib/sharder.ml index afa8965..11a6bd8 100644 --- a/lib/sharder.ml +++ b/lib/sharder.ml @@ -14,6 +14,7 @@ module Shard = struct ready: unit Ivar.t; url: string; id: int * int; + _internal: Reader.t * Writer.t; } type 'a t = { @@ -206,6 +207,9 @@ module Shard = struct | _ -> 443 in let scheme = Option.value_exn ~message:"no scheme in uri" Uri.(scheme uri) in let tcp_fun (net_to_ws, ws_to_net) = + (* Writer.monitor ws_to_net + |> Monitor.detach_and_get_error_stream + |> Stream.iter ~f:(fun e -> Logs.err (fun m -> m "Socket Connection Error: %s" (Exn.sexp_of_t e |> Sexp.to_string_hum))); *) let (app_to_ws, write) = Pipe.create () in let (read, ws_to_app) = Pipe.create () in let initialized = Ivar.create () in @@ -226,6 +230,7 @@ module Shard = struct id = shards; session = None; url; + _internal = (net_to_ws, ws_to_net); } in match Unix.getaddrinfo host (string_of_int port) [] with @@ -244,8 +249,12 @@ module Shard = struct in Conduit_async.V2.connect addr >>= tcp_fun + let shutdown_clean shard = + let (_,w) = shard._internal in + Writer.close w + let recreate shard = - print_endline "Reconnecting..."; + shutdown_clean shard >>= fun () -> create ~url:(shard.url) ~shards:(shard.id) () end @@ -310,4 +319,9 @@ let set_status_with ~f sharder = let request_guild_members ?query ?limit ~guild sharder = Deferred.all @@ List.map ~f:(fun t -> Shard.request_guild_members ~guild ?query ?limit t.state + ) sharder.shards + +let shutdown_all sharder = + Deferred.all @@ List.map ~f:(fun t -> + Shard.shutdown_clean t.state ) sharder.shards
\ No newline at end of file diff --git a/lib/sharder.mli b/lib/sharder.mli index 86a0da0..0bc014b 100644 --- a/lib/sharder.mli +++ b/lib/sharder.mli @@ -26,6 +26,7 @@ module Shard : sig ready: unit Ivar.t; (** A simple Ivar indicating if the shard has received READY. *) url: string; (** The websocket URL in use. *) id: int * int; (** A tuple as expected by Discord. First element is the current shard index, second element is the total shard count. *) + _internal: Reader.t * Writer.t; } (** Wrapper around an internal state, used to wrap {!shard}. *) @@ -58,6 +59,8 @@ module Shard : sig shards:int * int -> unit -> shard Deferred.t + + val shutdown_clean : shard -> unit Deferred.t end (** Calls {!Shard.set_status} for each shard registered with the sharder. *) @@ -78,4 +81,6 @@ val request_guild_members : ?limit:int -> guild:Snowflake.t -> t -> - Shard.shard list Deferred.t
\ No newline at end of file + Shard.shard list Deferred.t + +val shutdown_all : t -> unit list Deferred.t
\ No newline at end of file |