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 | |
| parent | Add opam build file (diff) | |
| download | disml-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.ml | 10 | ||||
| -rw-r--r-- | lib/client.ml | 35 | ||||
| -rw-r--r-- | lib/client/client.ml | 116 | ||||
| -rw-r--r-- | lib/guild.ml | 10 | ||||
| -rw-r--r-- | lib/message.ml | 12 | ||||
| -rw-r--r-- | lib/model.ml | 26 | ||||
| -rw-r--r-- | lib/model/channel.ml | 1 | ||||
| -rw-r--r-- | lib/model/emoji.ml | 1 | ||||
| -rw-r--r-- | lib/model/guild.ml | 26 | ||||
| -rw-r--r-- | lib/model/member.ml | 1 | ||||
| -rw-r--r-- | lib/model/message.ml | 1 | ||||
| -rw-r--r-- | lib/model/presence.ml | 1 | ||||
| -rw-r--r-- | lib/model/role.ml | 1 | ||||
| -rw-r--r-- | lib/model/user.ml | 26 | ||||
| -rw-r--r-- | lib/model/voiceState.ml | 1 | ||||
| -rw-r--r-- | lib/opcode.ml (renamed from lib/client/opcode.ml) | 0 | ||||
| -rw-r--r-- | lib/s.ml | 4 | ||||
| -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 |