aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAdelyn Breelove <[email protected]>2019-01-25 15:56:07 -0700
committerAdelyn Breelove <[email protected]>2019-01-25 15:56:07 -0700
commitbb6f6d728444936a6d810e01b2bdffe4b85c4d96 (patch)
tree35fb88dafafe4e189adf304ce32193d9765d036d /lib
parentsimple corrections (diff)
downloaddisml-bb6f6d728444936a6d810e01b2bdffe4b85c4d96.tar.xz
disml-bb6f6d728444936a6d810e01b2bdffe4b85c4d96.zip
hopeful reconnection fix
Diffstat (limited to 'lib')
-rw-r--r--lib/sharder.ml16
-rw-r--r--lib/sharder.mli7
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