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
|