-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathschema.sql
164 lines (143 loc) · 4.29 KB
/
schema.sql
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
-- noinspection SpellCheckingInspectionForFile
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE TABLE IF NOT EXISTS guilds (
guild_id BIGINT PRIMARY KEY,
prefixes TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[],
muted_role_id BIGINT,
mutes BIGINT[] NOT NULL DEFAULT ARRAY[]::BIGINT[]
);
CREATE TABLE IF NOT EXISTS news (
news_id BIGINT PRIMARY KEY,
title VARCHAR(256) NOT NULL,
content VARCHAR(1024) NOT NULL,
author_id BIGINT NOT NULL
);
CREATE TABLE IF NOT EXISTS timers (
id BIGSERIAL PRIMARY KEY,
precise BOOLEAN DEFAULT TRUE,
event TEXT,
extra JSONB,
created TIMESTAMP,
expires TIMESTAMP
);
CREATE TABLE IF NOT EXISTS blocks (
guild_id BIGINT,
channel_id BIGINT,
user_id BIGINT,
PRIMARY KEY (guild_id, channel_id, user_id)
);
-- Thanks chai :)
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'blacklist_type') THEN
CREATE TYPE blacklist_type AS ENUM ('guild', 'channel', 'user');
END IF;
END$$;
CREATE TABLE IF NOT EXISTS blacklist (
blacklist_type blacklist_type,
entity_id bigint,
guild_id bigint NOT NULL default 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
PRIMARY KEY (blacklist_type, entity_id, guild_id)
);
-- not as important as roles. But still.
CREATE TABLE IF NOT EXISTS disabled_entities (
guild_id BIGINT,
entity_id BIGINT,
PRIMARY KEY (guild_id, entity_id)
);
CREATE TABLE IF NOT EXISTS disabled_commands (
guild_id BIGINT,
entity_id BIGINT,
command_name TEXT,
whitelist BOOLEAN DEFAULT FALSE,
PRIMARY KEY (guild_id, entity_id, command_name)
);
CREATE TABLE IF NOT EXISTS badges (
badge_id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
emoji TEXT NOT NULL
);
CREATE TABLE acknowledgements (
user_id BIGINT,
badge_id BIGINT REFERENCES badges(badge_id) ON DELETE CASCADE,
PRIMARY KEY (user_id, badge_id)
);
-- Functions that are dispatched to a listener
-- that updates the prefix cache automatically
CREATE OR REPLACE FUNCTION update_prefixes_cache()
RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'DELETE' THEN
PERFORM pg_notify('delete_prefixes', NEW.guild_id::TEXT);
ELSIF TG_OP = 'UPDATE' AND OLD.prefixes <> NEW.prefixes THEN
PERFORM pg_notify('update_prefixes',
JSON_BUILD_OBJECT(
'guild_id', NEW.guild_id,
'prefixes', NEW.prefixes
)::TEXT
);
ELSIF TG_OP = 'INSERT' AND NEW.prefixes <> ARRAY[]::TEXT[] THEN
PERFORM pg_notify('update_prefixes',
JSON_BUILD_OBJECT(
'guild_id', NEW.guild_id,
'prefixes', NEW.prefixes
)::TEXT
);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_prefixes_cache_trigger
AFTER INSERT OR UPDATE OR DELETE
ON guilds
FOR EACH ROW
EXECUTE PROCEDURE update_prefixes_cache();
-- For tags.
CREATE TABLE IF NOT EXISTS tags (
id BIGSERIAL,
name VARCHAR(200),
content VARCHAR(2000),
owner_id BIGINT,
guild_id BIGINT,
uses INT DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE
NOT NULL DEFAULT NOW(),
points_to BIGINT
REFERENCES tags(id)
ON DELETE CASCADE,
embed JSONB,
PRIMARY KEY (id),
UNIQUE (name, guild_id),
CONSTRAINT tags_mutually_excl_cnt_p_to CHECK (
((content IS NOT NULL OR embed IS NOT NULL) and points_to IS NULL)
OR (points_to IS NOT NULL and (content IS NULL AND embed IS NULL))
)
);
CREATE INDEX IF NOT EXISTS tags_name_ind ON tags (name);
CREATE INDEX IF NOT EXISTS tags_location_id_ind ON tags (guild_id);
-- noinspection SqlResolve
CREATE INDEX IF NOT EXISTS tags_name_trgm_ind ON tags USING GIN (name gin_trgm_ops);
CREATE INDEX IF NOT EXISTS tags_name_lower_ind ON tags (LOWER(name));
CREATE UNIQUE INDEX IF NOT EXISTS tags_uniq_ind ON tags (LOWER(name), guild_id);
CREATE TABLE commands (
user_id BIGINT NOT NULL,
guild_id BIGINT,
command TEXT NOT NULL ,
timestamp TIMESTAMP WITH TIME ZONE
NOT NULL DEFAULT NOW()
);
CREATE TABLE auto_sync (
guild_id BIGINT,
payload JSONB
);
CREATE TABLE user_settings (
user_id BIGINT PRIMARY KEY,
locale TEXT
);
CREATE TABLE dm_flow (
user_id BIGINT PRIMARY KEY,
dms_enabled BOOLEAN NOT NULL DEFAULT FALSE,
dm_channel BIGINT NULL,
dm_webhook TEXT NULL
);