aboutsummaryrefslogtreecommitdiff
path: root/lib/client/client.ml
blob: 98777144ba53c49303f10338329f198a24f7eeb9 (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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