aboutsummaryrefslogtreecommitdiff
path: root/lib
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
parentAdd opam build file (diff)
downloaddisml-d342c4cf9fe907d2107cd815f9988f8ad147218b.tar.xz
disml-d342c4cf9fe907d2107cd815f9988f8ad147218b.zip
Major structural changes
Diffstat (limited to 'lib')
-rw-r--r--lib/_sharder.mli (renamed from lib/client/sharder.mli)0
-rw-r--r--lib/channel.ml10
-rw-r--r--lib/client.ml35
-rw-r--r--lib/client/client.ml116
-rw-r--r--lib/guild.ml10
-rw-r--r--lib/message.ml12
-rw-r--r--lib/model.ml26
-rw-r--r--lib/model/channel.ml1
-rw-r--r--lib/model/emoji.ml1
-rw-r--r--lib/model/guild.ml26
-rw-r--r--lib/model/member.ml1
-rw-r--r--lib/model/message.ml1
-rw-r--r--lib/model/presence.ml1
-rw-r--r--lib/model/role.ml1
-rw-r--r--lib/model/user.ml26
-rw-r--r--lib/model/voiceState.ml1
-rw-r--r--lib/opcode.ml (renamed from lib/client/opcode.ml)0
-rw-r--r--lib/s.ml4
-rw-r--r--lib/sharder.ml (renamed from lib/client/sharder.ml)217
19 files changed, 106 insertions, 383 deletions
diff --git a/lib/client/sharder.mli b/lib/_sharder.mli
index 0fd16d6..0fd16d6 100644
--- a/lib/client/sharder.mli
+++ b/lib/_sharder.mli
diff --git a/lib/channel.ml b/lib/channel.ml
new file mode 100644
index 0000000..904bbde
--- /dev/null
+++ b/lib/channel.ml
@@ -0,0 +1,10 @@
+type t = {
+ id: string;
+ name: string;
+}
+
+let from_json term =
+ let module J = Yojson.Basic.Util in
+ let id = J.(member "id" term |> to_string) in
+ let name = J.(member "name" term |> to_string) in
+ { id; name; }
diff --git a/lib/client.ml b/lib/client.ml
new file mode 100644
index 0000000..7c2d532
--- /dev/null
+++ b/lib/client.ml
@@ -0,0 +1,35 @@
+open Async
+
+type t = {
+ sharder: Sharder.t Ivar.t;
+ handler: (string * Model.t) Pipe.Writer.t;
+ token: string;
+}
+
+let make ~handler token =
+ {
+ 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 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
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/guild.ml b/lib/guild.ml
new file mode 100644
index 0000000..904bbde
--- /dev/null
+++ b/lib/guild.ml
@@ -0,0 +1,10 @@
+type t = {
+ id: string;
+ name: string;
+}
+
+let from_json term =
+ let module J = Yojson.Basic.Util in
+ let id = J.(member "id" term |> to_string) in
+ let name = J.(member "name" term |> to_string) in
+ { id; name; }
diff --git a/lib/message.ml b/lib/message.ml
new file mode 100644
index 0000000..5b632d7
--- /dev/null
+++ b/lib/message.ml
@@ -0,0 +1,12 @@
+type t = {
+ id: string;
+ content: string;
+ channel: string;
+}
+
+let from_json term =
+ let module J = Yojson.Basic.Util in
+ let id = J.(member "id" term |> to_string) in
+ let content = J.(member "content" term |> to_string) in
+ let channel = J.(member "channel_id" term |> to_string) in
+ { id; content; channel; }
diff --git a/lib/model.ml b/lib/model.ml
new file mode 100644
index 0000000..c44a289
--- /dev/null
+++ b/lib/model.ml
@@ -0,0 +1,26 @@
+module Make(M: S.Model) = struct
+ include M
+end
+
+module Message = Make(Message)
+module Guild = Make(Guild)
+module Channel = Make(Channel)
+
+exception Type_Mismatch
+
+type t =
+ | Message of Message.t
+ | Guild of Guild.t
+ | Channel of Channel.t
+
+let to_message = function
+ | Message m -> m
+ | _ -> raise Type_Mismatch
+
+let to_guild = function
+ | Guild m -> m
+ | _ -> raise Type_Mismatch
+
+let to_channel = function
+ | Channel m -> m
+ | _ -> raise Type_Mismatch \ No newline at end of file
diff --git a/lib/model/channel.ml b/lib/model/channel.ml
deleted file mode 100644
index eb6679e..0000000
--- a/lib/model/channel.ml
+++ /dev/null
@@ -1 +0,0 @@
-type t \ No newline at end of file
diff --git a/lib/model/emoji.ml b/lib/model/emoji.ml
deleted file mode 100644
index eb6679e..0000000
--- a/lib/model/emoji.ml
+++ /dev/null
@@ -1 +0,0 @@
-type t \ No newline at end of file
diff --git a/lib/model/guild.ml b/lib/model/guild.ml
deleted file mode 100644
index 6345c17..0000000
--- a/lib/model/guild.ml
+++ /dev/null
@@ -1,26 +0,0 @@
-type t = {
- afk_channel_id: int option;
- afk_timeout: int;
- application_id: int option;
- channels: Channel.t list;
- default_message_notifications: int;
- emojis: Emoji.t list;
- explicit_content_filter: int;
- features: string list;
- icon: string option;
- id: int;
- joined_at: string;
- large: bool;
- member_count: int;
- members: Member.t list;
- mfa_level: int;
- name: string;
- owner_id: int;
- presences: Presence.t list;
- region: string;
- roles: Role.t list;
- splash: string option;
- system_channel_id: int option;
- verification_level: int;
- voice_states: VoiceState.t list;
-}
diff --git a/lib/model/member.ml b/lib/model/member.ml
deleted file mode 100644
index eb6679e..0000000
--- a/lib/model/member.ml
+++ /dev/null
@@ -1 +0,0 @@
-type t \ No newline at end of file
diff --git a/lib/model/message.ml b/lib/model/message.ml
deleted file mode 100644
index eb6679e..0000000
--- a/lib/model/message.ml
+++ /dev/null
@@ -1 +0,0 @@
-type t \ No newline at end of file
diff --git a/lib/model/presence.ml b/lib/model/presence.ml
deleted file mode 100644
index eb6679e..0000000
--- a/lib/model/presence.ml
+++ /dev/null
@@ -1 +0,0 @@
-type t \ No newline at end of file
diff --git a/lib/model/role.ml b/lib/model/role.ml
deleted file mode 100644
index eb6679e..0000000
--- a/lib/model/role.ml
+++ /dev/null
@@ -1 +0,0 @@
-type t \ No newline at end of file
diff --git a/lib/model/user.ml b/lib/model/user.ml
deleted file mode 100644
index 182ea6a..0000000
--- a/lib/model/user.ml
+++ /dev/null
@@ -1,26 +0,0 @@
-type t = {
- id: int;
- username: string;
- discriminator: string;
- avatar: string option;
- bot: bool;
-}
-
-let from_json term =
- let module J = Yojson.Basic.Util in
- let id = J.member "id" term
- |> J.to_string
- |> int_of_string
- in
- let username = J.member "username" term
- |> J.to_string in
- let discriminator = J.member "discriminator" term
- |> J.to_string in
- let avatar = J.member "avatar" term
- |> J.to_string_option in
- let bot = J.member "bot" term
- |> J.to_bool in
- { id; username; discriminator; avatar; bot; }
-
-let tag user =
- user.username ^ user.discriminator
diff --git a/lib/model/voiceState.ml b/lib/model/voiceState.ml
deleted file mode 100644
index eb6679e..0000000
--- a/lib/model/voiceState.ml
+++ /dev/null
@@ -1 +0,0 @@
-type t \ No newline at end of file
diff --git a/lib/client/opcode.ml b/lib/opcode.ml
index 2462d05..2462d05 100644
--- a/lib/client/opcode.ml
+++ b/lib/opcode.ml
diff --git a/lib/s.ml b/lib/s.ml
new file mode 100644
index 0000000..6c6456a
--- /dev/null
+++ b/lib/s.ml
@@ -0,0 +1,4 @@
+module type Model = sig
+ type t
+ val from_json : Yojson.Basic.json -> t
+end \ No newline at end of file
diff --git a/lib/client/sharder.ml b/lib/sharder.ml
index 8d735b0..9e2ef74 100644
--- a/lib/client/sharder.ml
+++ b/lib/sharder.ml
@@ -4,48 +4,12 @@ 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;
+ handler: (string * Model.t) Pipe.Writer.t;
token: string;
shard: int * int;
write: string Pipe.Writer.t;
@@ -92,174 +56,16 @@ module Shard = struct
let t = J.(member "t" payload |> to_string) in
let data = J.member "d" payload in
let _ = match t with
- | "READY" -> begin
+ | "READY" ->
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
+ shard.session <- Some session
+ | "MESSAGE_CREATE" ->
+ let msg = Model.Message.from_json data in
+ Pipe.write shard.handler (t, Message msg) >>> ignore
+ | "GUILD_CREATE" ->
+ let guild = Model.Guild.from_json data in
+ Pipe.write shard.handler (t, Guild guild) >>> ignore
| _ -> ()
in
return shard
@@ -459,8 +265,3 @@ 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