-- Пользователи: регистрация, ник, выборки, удаление. -- Список всех игроков. 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; $$;