DispelEvilBot/sql/R__functions_users.sql

140 lines
4.2 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Пользователи: регистрация, ник, выборки, удаление.
-- Список всех игроков.
CREATE OR REPLACE FUNCTION bot.get_nick_list()
RETURNS TABLE(username character varying, nick character varying)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT tg.username, de.nick
FROM bot.tg_users tg
LEFT JOIN bot.de_users de ON tg.id_user = de.id_user
ORDER BY de.nick;
END;
$$;
-- Список подписанных на рассылки.
CREATE OR REPLACE FUNCTION bot.get_nick_list_subscribe()
RETURNS TABLE(username character varying, nick character varying)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT tg.username, de.nick
FROM bot.tg_users tg
LEFT JOIN bot.de_users de ON tg.id_user = de.id_user
WHERE NOT EXISTS (SELECT 1 FROM bot.unsubscribe u WHERE u.id_user = tg.id_user)
ORDER BY de.nick;
END;
$$;
-- Ник по id.
CREATE OR REPLACE FUNCTION bot.get_nick_by_id(p_id_user bigint)
RETURNS TABLE(nick character varying)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY SELECT de.nick FROM bot.de_users de WHERE de.id_user = p_id_user;
END;
$$;
-- Сводная информация о пользователе.
CREATE OR REPLACE FUNCTION bot.get_info_by_id(p_id_user bigint)
RETURNS TABLE(
username character varying,
nick character varying,
title character varying,
lvl bigint,
expr bigint,
mny bigint,
dt text,
msg_count bigint,
eggs_count bigint
)
LANGUAGE plpgsql
AS $$
DECLARE
v_money bigint;
v_eggs bigint;
BEGIN
v_money := coalesce(bot.get_money(p_id_user), 0);
v_eggs := coalesce(bot.get_eggs(p_id_user), 0);
RETURN QUERY
SELECT tg.username,
coalesce(de.nick, ''),
coalesce(t.title, ''),
de.lvl,
de.expr,
v_money AS mny,
to_char(de.dt_create, 'dd.mm.yyyy'),
coalesce(m.msg_count, 0),
v_eggs AS eggs_count
FROM bot.tg_users tg
LEFT JOIN bot.de_users de ON tg.id_user = de.id_user
LEFT JOIN bot.titles t ON de.id_title = t.id_title
LEFT JOIN (
SELECT id_user, count(*) AS msg_count
FROM bot.messages
GROUP BY id_user
) m ON tg.id_user = m.id_user
WHERE tg.id_user = p_id_user;
END;
$$;
-- Создать/обновить пользователя и записать сообщение.
CREATE OR REPLACE PROCEDURE bot.add_user(
IN p_id_user bigint,
IN p_username character varying,
IN p_first_name character varying,
IN p_last_name character varying
) LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO bot.tg_users (id_user, username, first_name, last_name)
VALUES (p_id_user, p_username, p_first_name, p_last_name)
ON CONFLICT (id_user) DO UPDATE
SET username = EXCLUDED.username,
first_name = EXCLUDED.first_name,
last_name = EXCLUDED.last_name;
INSERT INTO bot.de_users (id_user, nick)
VALUES (p_id_user, NULL)
ON CONFLICT (id_user) DO NOTHING;
INSERT INTO bot.messages (id_user) VALUES (p_id_user);
END;
$$;
-- Установить ник.
CREATE OR REPLACE PROCEDURE bot.add_nick(IN p_id_user bigint, IN p_nick character varying)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO bot.de_users (id_user, nick)
VALUES (p_id_user, p_nick)
ON CONFLICT (id_user) DO UPDATE SET nick = EXCLUDED.nick;
END;
$$;
-- Удалить пользователя и обнулить его баланс.
CREATE OR REPLACE PROCEDURE bot.del_user_by_id(IN p_id_user bigint)
LANGUAGE plpgsql
AS $$
DECLARE
v_money bigint;
BEGIN
DELETE FROM bot.tg_users WHERE id_user = p_id_user;
DELETE FROM bot.de_users WHERE id_user = p_id_user;
DELETE FROM bot.messages WHERE id_user = p_id_user;
DELETE FROM bot.purifications WHERE id_user = p_id_user;
v_money := bot.get_money(p_id_user);
IF v_money IS NOT NULL AND v_money <> 0 THEN
INSERT INTO bot.money (id_user, amount, id_action)
VALUES (p_id_user, -1 * v_money, 5);
END IF;
END;
$$;