/
handlers.gleam
84 lines (73 loc) · 2.36 KB
/
handlers.gleam
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
import gleam/option.{None, Option, Some}
import shimmer/ws/packets/message_create.{MessageCreate}
import shimmer/ws/packets/ready.{ReadyPacket}
import shimmer/client.{Client}
// Types
pub type HandlersBuilder(message) {
HandlersBuilder(
/// When the bot is online and ready.
on_ready: Option(fn(ReadyPacket, Client(message)) -> Nil),
/// When a new message is recieved.
on_message: Option(fn(MessageCreate, Client(message)) -> Nil),
/// Send when the internal heartbeats are acknowlaged by the gateway.
on_heartbeat_ack: Option(fn(Client(message)) -> Nil),
/// Called when the gateway connection is closed for any reason. The function is given the close code we recieved from discord.
on_disconnect: Option(fn(Int, Client(message)) -> Nil),
)
}
pub type Handlers(message) {
Handlers(
on_ready: fn(ReadyPacket, Client(message)) -> Nil,
on_message: fn(MessageCreate, Client(message)) -> Nil,
on_heartbeat_ack: fn(Client(message)) -> Nil,
on_disconnect: fn(Int, Client(message)) -> Nil,
)
}
// Events
pub fn on_ready(
builder: HandlersBuilder(message),
f: fn(ReadyPacket, Client(message)) -> Nil,
) -> HandlersBuilder(message) {
HandlersBuilder(..builder, on_ready: Some(f))
}
pub fn on_message(
builder: HandlersBuilder(message),
f: fn(MessageCreate, Client(message)) -> Nil,
) -> HandlersBuilder(message) {
HandlersBuilder(..builder, on_message: Some(f))
}
pub fn on_heartbeat_ack(
builder: HandlersBuilder(message),
f: fn(Client(message)) -> Nil,
) -> HandlersBuilder(message) {
HandlersBuilder(..builder, on_heartbeat_ack: Some(f))
}
pub fn on_disconnect(
builder: HandlersBuilder(message),
f: fn(Int, Client(message)) -> Nil,
) -> HandlersBuilder(message) {
HandlersBuilder(..builder, on_disconnect: Some(f))
}
// Utils
pub fn new_builder() -> HandlersBuilder(message) {
HandlersBuilder(
on_ready: None,
on_message: None,
on_heartbeat_ack: None,
on_disconnect: None,
)
}
pub fn handlers_from_builder(
builder: HandlersBuilder(message),
) -> Handlers(message) {
Handlers(
on_ready: builder.on_ready
|> option.unwrap(or: fn(_, _) { Nil }),
on_message: builder.on_message
|> option.unwrap(or: fn(_, _) { Nil }),
on_heartbeat_ack: builder.on_heartbeat_ack
|> option.unwrap(or: fn(_) { Nil }),
on_disconnect: builder.on_disconnect
|> option.unwrap(or: fn(_, _) { Nil }),
)
}