138 lines
4.1 KiB
PL/PgSQL
138 lines
4.1 KiB
PL/PgSQL
-- Пользователи: регистрация, ник, выборки, удаление.
|
||
|
||
-- Список всех игроков.
|
||
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 user_id, sum(count)::bigint AS msg_count
|
||
FROM analytics.messages_daily
|
||
GROUP BY user_id
|
||
) m ON tg.id_user = m.user_id
|
||
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;
|
||
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 analytics.messages_daily WHERE user_id = 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;
|
||
$$;
|