aboutsummaryrefslogtreecommitdiff
path: root/lib/client/client.ml
blob: e07e348ad05cc9a7d620f3df60c1e9e85dfccc55 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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 =
    match ev with
    | "MESSAGE_CREATE" -> client.handler <- { client.handler with message_create = Some(fn) }
    | _ -> ()

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