aboutsummaryrefslogtreecommitdiff
path: root/lib/models/guild/guild.ml
blob: 95485a4282a6c0acb7f86ee1816343aa0404f2b6 (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
117
118
119
120
121
122
123
124
125
126
127
128
open Core
open Async

include Guild_t

let ban_user ~id ?(reason="") ?(days=0) guild =
    Http.guild_ban_add (get_id guild) id (`Assoc [
        ("delete-message-days", `Int days);
        ("reason", `String reason);
    ])

let create data =
    let data = `Assoc data in
    Http.create_guild data

let create_emoji ~name ~image guild =
    Http.create_emoji (get_id guild) (`Assoc [
        ("name", `String name);
        ("image", `String image);
        ("roles", `List []);
    ])

let create_role ~name ?colour ?permissions ?hoist ?mentionable guild =
    let payload = ("name", `String name) :: [] in
    let payload = match permissions with
    | Some p -> ("permissions", `Int p) :: payload
    | None -> payload
    in let payload = match colour with
    | Some c -> ("color", `Int c) :: payload
    | None -> payload
    in let payload = match hoist with
    | Some h -> ("hoist", `Bool h) :: payload
    | None -> payload
    in let payload = match mentionable with
    | Some m -> ("mentionable", `Bool m) :: payload
    | None -> payload
    in Http.guild_role_add (get_id guild) (`Assoc payload)

let create_channel ~mode ~name guild =
    let kind = match mode with
    | `Text -> 0
    | `Voice -> 2
    | `Category -> 4
    in Http.create_guild_channel (get_id guild) (`Assoc [
        ("name", `String name);
        ("type", `Int kind);
    ])

let delete guild =
    Http.delete_guild (get_id guild)

let get_ban ~id guild =
    Http.get_ban (get_id guild) id

let get_bans guild =
    Http.get_bans (get_id guild)

let get_emoji ~id guild =
    Http.get_emoji (get_id guild) id

(* TODO add invite abstraction? *)
let get_invites guild =
    Http.get_guild_invites (get_id guild)

let get_prune_count ~days guild =
    Http.guild_prune_count (get_id guild) days

(* TODO add webhook abstraction? *)
let get_webhooks guild =
    Http.get_guild_webhooks (get_id guild)

let kick_user ~id ?reason guild =
    let payload = match reason with
    | Some r -> `Assoc [("reason", `String r)]
    | None -> `Null
    in Http.remove_member (get_id guild) id payload

let leave guild =
    Http.leave_guild (get_id guild)

(* TODO Voice region abstractions? *)
let list_voice_regions guild =
    Http.get_guild_voice_regions (get_id guild)

let prune ~days guild =
    Http.guild_prune_start (get_id guild) days

let request_members guild =
    Http.get_members (get_id guild)

let set_afk_channel ~id guild = Http.edit_guild (get_id guild) (`Assoc [
    ("afk_channel_id", `Int id);
    ])

let set_afk_timeout ~timeout guild = Http.edit_guild (get_id guild) (`Assoc [
    ("afk_timeout", `Int timeout);
    ])

let set_name ~name guild = Http.edit_guild (get_id guild) (`Assoc [
    ("name", `String name);
    ])

let set_icon ~icon guild = Http.edit_guild (get_id guild) (`Assoc [
    ("icon", `String icon);
    ])

let unban_user ~id ?reason guild =
    let payload = match reason with
    | Some r -> `Assoc [("reason", `String r)]
    | None -> `Null
    in Http.guild_ban_remove (get_id guild) id payload

let get_member ~(id:User_id_t.t) guild =
    match List.find ~f:(fun m -> User_id.compare m.user.id id = 0) guild.members with
    | Some m -> Deferred.Or_error.return m
    | None ->
        let `User_id id = id in
        Http.get_member (get_id guild) id

let get_channel ~(id:Channel_id_t.t) guild =
    let `Channel_id id = id in
    match List.find ~f:(fun c -> Channel_t.get_id c = id) guild.channels with
    | Some c -> Deferred.Or_error.return c
    | None -> Http.get_channel id

(* TODO add HTTP fallback *)
let get_role ~(id:Role_id.t) guild =
    List.find ~f:(fun r -> Role_id.get_id r.id = Role_id.get_id id) guild.roles