Initial commit: Telegram Management System
Some checks failed
Deploy / deploy (push) Has been cancelled
Some checks failed
Deploy / deploy (push) Has been cancelled
Full-stack web application for Telegram management - Frontend: Vue 3 + Vben Admin - Backend: NestJS - Features: User management, group broadcast, statistics 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
-- Adds extended fields required by the proxy platform configuration wizard
|
||||
ALTER TABLE `proxy_platform`
|
||||
ADD COLUMN `displayName` VARCHAR(255) NULL AFTER `platform`,
|
||||
ADD COLUMN `connectionStatus` VARCHAR(50) NOT NULL DEFAULT 'unknown' COMMENT '最近一次连接状态' AFTER `rotationInterval`,
|
||||
ADD COLUMN `proxyCount` INT NOT NULL DEFAULT 0 COMMENT '最近同步的可用代理数量' AFTER `connectionStatus`,
|
||||
ADD COLUMN `avgResponseTime` INT NULL COMMENT '最近一次连接测试响应时间 (ms)' AFTER `proxyCount`,
|
||||
ADD COLUMN `successRate` FLOAT NULL COMMENT '连接成功率 (0-1)' AFTER `avgResponseTime`,
|
||||
ADD COLUMN `lastTestAt` DATETIME NULL COMMENT '最近一次连接测试时间' AFTER `successRate`,
|
||||
ADD COLUMN `lastTestResult` TEXT NULL COMMENT '最近一次连接测试结果详情(JSON)' AFTER `lastTestAt`;
|
||||
48
database/migrations/add-rolaip-data.sql
Normal file
48
database/migrations/add-rolaip-data.sql
Normal file
@@ -0,0 +1,48 @@
|
||||
-- 添加Rola-IP代理平台到数据库
|
||||
-- 执行此SQL文件将Rola-IP平台配置插入到proxy_platform表中
|
||||
|
||||
-- 检查是否已存在Rola-IP配置
|
||||
SELECT COUNT(*) as existing_count FROM proxy_platform WHERE platform = 'rola-ip';
|
||||
|
||||
-- 插入Rola-IP平台配置(如果不存在)
|
||||
INSERT INTO proxy_platform (
|
||||
platform,
|
||||
description,
|
||||
apiUrl,
|
||||
authType,
|
||||
apiKey,
|
||||
username,
|
||||
password,
|
||||
proxyTypes,
|
||||
countries,
|
||||
concurrentLimit,
|
||||
rotationInterval,
|
||||
remark,
|
||||
isEnabled,
|
||||
createdAt,
|
||||
updatedAt
|
||||
)
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
'rola-ip' as platform,
|
||||
'Rola-IP专业代理IP服务平台,支持住宅IP、数据中心IP、移动IP等多种类型' as description,
|
||||
'https://admin.rola-ip.co' as apiUrl,
|
||||
'userPass' as authType,
|
||||
'' as apiKey,
|
||||
'' as username,
|
||||
'' as password,
|
||||
'residential,datacenter,mobile,static_residential,ipv6' as proxyTypes,
|
||||
'US,UK,DE,FR,JP,KR,AU,CA,BR,IN,SG,HK,TW,RU,NL' as countries,
|
||||
100 as concurrentLimit,
|
||||
300 as rotationInterval,
|
||||
'支持多种代理类型和15个国家/地区,提供住宅IP、数据中心IP、移动IP、静态住宅IP和IPv6代理服务。需要配置用户名和密码后启用。' as remark,
|
||||
0 as isEnabled,
|
||||
NOW() as createdAt,
|
||||
NOW() as updatedAt
|
||||
) AS tmp
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM proxy_platform WHERE platform = 'rola-ip'
|
||||
);
|
||||
|
||||
-- 验证插入结果
|
||||
SELECT * FROM proxy_platform WHERE platform = 'rola-ip';
|
||||
27
database/migrations/init-dc-data.sql
Normal file
27
database/migrations/init-dc-data.sql
Normal file
@@ -0,0 +1,27 @@
|
||||
-- Initialize Telegram Data Centers
|
||||
USE tg_manage;
|
||||
|
||||
-- Create table if not exists
|
||||
CREATE TABLE IF NOT EXISTS `tg_dc` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`ip` varchar(255) NOT NULL COMMENT 'IP地址',
|
||||
`port` varchar(255) NOT NULL COMMENT '端口',
|
||||
`address` varchar(255) NOT NULL COMMENT '地址,1美国,2荷兰,3美国,4荷兰,5新加坡',
|
||||
`createdAt` datetime DEFAULT CURRENT_TIMESTAMP,
|
||||
`updatedAt` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Telegram数据中心表';
|
||||
|
||||
-- Clear existing data
|
||||
TRUNCATE TABLE `tg_dc`;
|
||||
|
||||
-- Insert Telegram Data Centers
|
||||
INSERT INTO `tg_dc` (`id`, `ip`, `port`, `address`) VALUES
|
||||
(1, '149.154.175.50', '443', '1'), -- DC1 Miami, USA
|
||||
(2, '149.154.167.50', '443', '2'), -- DC2 Amsterdam, Netherlands
|
||||
(3, '149.154.175.100', '443', '3'), -- DC3 Miami, USA
|
||||
(4, '149.154.167.91', '443', '4'), -- DC4 Amsterdam, Netherlands
|
||||
(5, '91.108.56.100', '443', '5'); -- DC5 Singapore
|
||||
|
||||
-- Verify data
|
||||
SELECT * FROM `tg_dc`;
|
||||
67
database/migrations/init-telegram-users.sql
Normal file
67
database/migrations/init-telegram-users.sql
Normal file
@@ -0,0 +1,67 @@
|
||||
-- Create Telegram Users Table
|
||||
USE tg_manage;
|
||||
|
||||
-- 创建 Telegram 用户表
|
||||
CREATE TABLE IF NOT EXISTS `tg_telegram_users` (
|
||||
`id` bigint NOT NULL COMMENT 'Telegram用户ID',
|
||||
`username` varchar(100) DEFAULT NULL COMMENT '用户名',
|
||||
`first_name` varchar(100) DEFAULT NULL COMMENT '名',
|
||||
`last_name` varchar(100) DEFAULT NULL COMMENT '姓',
|
||||
`phone` varchar(20) DEFAULT NULL COMMENT '电话号码',
|
||||
`bio` text COMMENT '个人简介',
|
||||
`is_bot` tinyint(1) DEFAULT '0' COMMENT '是否机器人',
|
||||
`is_verified` tinyint(1) DEFAULT '0' COMMENT '是否认证账号',
|
||||
`is_premium` tinyint(1) DEFAULT '0' COMMENT '是否Premium用户',
|
||||
`is_scam` tinyint(1) DEFAULT '0' COMMENT '是否诈骗账号',
|
||||
`is_fake` tinyint(1) DEFAULT '0' COMMENT '是否虚假账号',
|
||||
`is_restricted` tinyint(1) DEFAULT '0' COMMENT '是否受限账号',
|
||||
`is_support` tinyint(1) DEFAULT '0' COMMENT '是否官方支持账号',
|
||||
`language_code` varchar(10) DEFAULT NULL COMMENT '语言代码',
|
||||
`status` enum('online','offline','recently','last_week','last_month') DEFAULT 'offline' COMMENT '在线状态',
|
||||
`profile_photo` text COMMENT '头像URL',
|
||||
`last_seen_at` datetime DEFAULT NULL COMMENT '最后上线时间',
|
||||
`created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_username` (`username`),
|
||||
KEY `idx_phone` (`phone`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_is_bot` (`is_bot`),
|
||||
KEY `idx_is_verified` (`is_verified`),
|
||||
KEY `idx_is_premium` (`is_premium`),
|
||||
KEY `idx_created_at` (`created_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Telegram用户表';
|
||||
|
||||
-- 插入一些示例数据
|
||||
INSERT INTO `tg_telegram_users` (`id`, `username`, `first_name`, `last_name`, `phone`, `bio`, `is_bot`, `is_verified`, `is_premium`, `is_scam`, `is_fake`, `is_restricted`, `is_support`, `language_code`, `status`, `profile_photo`, `last_seen_at`) VALUES
|
||||
(777000, 'Telegram', 'Telegram', NULL, NULL, 'Official Telegram Support', 0, 1, 0, 0, 0, 0, 1, 'en', 'online', 'https://telegram.org/img/t_logo.png', NOW()),
|
||||
(1087968824, 'GroupAnonymousBot', 'Group', 'Anonymous Bot', NULL, 'Anonymous Admin', 1, 1, 0, 0, 0, 0, 1, 'en', 'online', NULL, NOW()),
|
||||
(136817688, 'Channel_Bot', 'Channel', 'Bot', NULL, 'Telegram Channel Bot', 1, 1, 0, 0, 0, 0, 1, 'en', 'online', NULL, NOW()),
|
||||
(12345678, 'john_doe', 'John', 'Doe', '+1234567890', 'Software Developer', 0, 0, 1, 0, 0, 0, 0, 'en', 'recently', NULL, DATE_SUB(NOW(), INTERVAL 30 MINUTE)),
|
||||
(87654321, 'jane_smith', 'Jane', 'Smith', '+0987654321', 'Designer & Content Creator', 0, 1, 1, 0, 0, 0, 0, 'en', 'last_week', NULL, DATE_SUB(NOW(), INTERVAL 3 DAY)),
|
||||
(11111111, 'scammer_account', 'Fake', 'User', NULL, 'This is a scam account', 0, 0, 0, 1, 0, 0, 0, 'en', 'offline', NULL, DATE_SUB(NOW(), INTERVAL 30 DAY)),
|
||||
(22222222, 'fake_profile', 'Fake', 'Profile', NULL, 'Impersonating someone else', 0, 0, 0, 0, 1, 0, 0, 'en', 'offline', NULL, DATE_SUB(NOW(), INTERVAL 15 DAY)),
|
||||
(33333333, 'restricted_user', 'Restricted', 'User', NULL, 'Account has been restricted', 0, 0, 0, 0, 0, 1, 0, 'zh', 'last_month', NULL, DATE_SUB(NOW(), INTERVAL 20 DAY)),
|
||||
(44444444, 'premium_user', 'Premium', 'Member', '+1122334455', 'Telegram Premium subscriber', 0, 0, 1, 0, 0, 0, 0, 'es', 'online', NULL, NOW()),
|
||||
(55555555, 'verified_celeb', 'Celebrity', 'Account', NULL, 'Verified public figure', 0, 1, 1, 0, 0, 0, 0, 'fr', 'recently', NULL, DATE_SUB(NOW(), INTERVAL 2 HOUR)),
|
||||
(66666666, 'echo_bot', 'Echo', 'Bot', NULL, 'A simple echo bot', 1, 0, 0, 0, 0, 0, 0, 'en', 'online', NULL, NOW()),
|
||||
(77777777, 'music_lover', 'Music', 'Lover', '+2233445566', 'I love music and concerts', 0, 0, 0, 0, 0, 0, 0, 'de', 'last_week', NULL, DATE_SUB(NOW(), INTERVAL 5 DAY)),
|
||||
(88888888, 'tech_guru', 'Tech', 'Guru', NULL, 'Technology enthusiast and blogger', 0, 1, 0, 0, 0, 0, 0, 'ja', 'recently', NULL, DATE_SUB(NOW(), INTERVAL 1 HOUR)),
|
||||
(99999999, 'crypto_trader', 'Crypto', 'Trader', '+3344556677', 'Cryptocurrency trader and investor', 0, 0, 1, 0, 0, 0, 0, 'ko', 'offline', NULL, DATE_SUB(NOW(), INTERVAL 12 HOUR)),
|
||||
(10101010, 'news_channel', 'News', 'Channel', NULL, 'Daily news and updates', 1, 1, 0, 0, 0, 0, 0, 'en', 'online', NULL, NOW());
|
||||
|
||||
-- 验证数据
|
||||
SELECT COUNT(*) as total_users FROM tg_telegram_users;
|
||||
SELECT
|
||||
status,
|
||||
COUNT(*) as count
|
||||
FROM tg_telegram_users
|
||||
GROUP BY status;
|
||||
|
||||
SELECT
|
||||
SUM(CASE WHEN is_bot = 1 THEN 1 ELSE 0 END) as bots,
|
||||
SUM(CASE WHEN is_verified = 1 THEN 1 ELSE 0 END) as verified,
|
||||
SUM(CASE WHEN is_premium = 1 THEN 1 ELSE 0 END) as premium,
|
||||
SUM(CASE WHEN is_scam = 1 THEN 1 ELSE 0 END) as scam,
|
||||
SUM(CASE WHEN is_fake = 1 THEN 1 ELSE 0 END) as fake
|
||||
FROM tg_telegram_users;
|
||||
11
database/migrations/init.sql
Normal file
11
database/migrations/init.sql
Normal file
@@ -0,0 +1,11 @@
|
||||
-- Initialize database with proper settings
|
||||
SET SQL_MODE = '';
|
||||
|
||||
-- Create database if not exists
|
||||
CREATE DATABASE IF NOT EXISTS tg_manage CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
USE tg_manage;
|
||||
|
||||
-- Grant privileges to user
|
||||
GRANT ALL PRIVILEGES ON tg_manage.* TO 'tg_manage'@'%';
|
||||
FLUSH PRIVILEGES;
|
||||
72
database/migrations/migrate-data-clean.sql
Normal file
72
database/migrations/migrate-data-clean.sql
Normal file
@@ -0,0 +1,72 @@
|
||||
-- 禁用外键检查
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- 设置SQL模式以允许零日期
|
||||
SET SQL_MODE = '';
|
||||
|
||||
-- 清空目标表避免主键冲突
|
||||
TRUNCATE TABLE tg_account;
|
||||
TRUNCATE TABLE tg_firstname;
|
||||
TRUNCATE TABLE tg_lastname;
|
||||
TRUNCATE TABLE tg_group;
|
||||
TRUNCATE TABLE tg_message;
|
||||
TRUNCATE TABLE tg_config;
|
||||
TRUNCATE TABLE tg_script;
|
||||
TRUNCATE TABLE tg_script_article;
|
||||
TRUNCATE TABLE tg_script_project;
|
||||
TRUNCATE TABLE tg_script_task;
|
||||
|
||||
-- 迁移TG账号数据,处理无效日期
|
||||
INSERT INTO tg_account (id, firstname, lastname, phone, password, usageId, isBan, lastOnline, createdAt, updatedAt, status, session, banTime, nextTime, addGroupIds, about, targetId)
|
||||
SELECT
|
||||
id,
|
||||
firstname,
|
||||
lastname,
|
||||
phone,
|
||||
password,
|
||||
usageId,
|
||||
isBan,
|
||||
CASE WHEN lastOnline = '0000-00-00 00:00:00' THEN NULL ELSE lastOnline END,
|
||||
createdAt,
|
||||
updatedAt,
|
||||
status,
|
||||
session,
|
||||
CASE WHEN banTime = '0000-00-00 00:00:00' THEN NULL ELSE banTime END,
|
||||
nextTime,
|
||||
addGroupIds,
|
||||
about,
|
||||
targetId
|
||||
FROM c_tg_account;
|
||||
|
||||
-- 迁移名字数据
|
||||
INSERT INTO tg_firstname SELECT * FROM c_firstname;
|
||||
INSERT INTO tg_lastname SELECT * FROM c_lastname;
|
||||
|
||||
-- 迁移群组数据
|
||||
INSERT IGNORE INTO tg_group SELECT * FROM c_group;
|
||||
|
||||
-- 迁移消息数据
|
||||
INSERT IGNORE INTO tg_message SELECT * FROM c_message;
|
||||
|
||||
-- 迁移配置数据
|
||||
INSERT IGNORE INTO tg_config SELECT * FROM c_config;
|
||||
|
||||
-- 迁移脚本相关数据
|
||||
INSERT IGNORE INTO tg_script SELECT * FROM c_script;
|
||||
INSERT IGNORE INTO tg_script_article SELECT * FROM c_script_article;
|
||||
INSERT IGNORE INTO tg_script_project SELECT * FROM c_script_project;
|
||||
INSERT IGNORE INTO tg_script_task SELECT * FROM c_script_task;
|
||||
|
||||
-- 重新启用外键检查
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- 查看迁移结果
|
||||
SELECT 'tg_account' as table_name, COUNT(*) as count FROM tg_account
|
||||
UNION ALL
|
||||
SELECT 'tg_firstname', COUNT(*) FROM tg_firstname
|
||||
UNION ALL
|
||||
SELECT 'tg_lastname', COUNT(*) FROM tg_lastname
|
||||
UNION ALL
|
||||
SELECT 'tg_group', COUNT(*) FROM tg_group
|
||||
UNION ALL
|
||||
SELECT 'tg_message', COUNT(*) FROM tg_message;
|
||||
52
database/migrations/migrate-data-final.sql
Normal file
52
database/migrations/migrate-data-final.sql
Normal file
@@ -0,0 +1,52 @@
|
||||
-- 禁用外键检查
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- 清空目标表避免主键冲突
|
||||
TRUNCATE TABLE tg_account;
|
||||
TRUNCATE TABLE tg_firstname;
|
||||
TRUNCATE TABLE tg_lastname;
|
||||
TRUNCATE TABLE tg_group;
|
||||
TRUNCATE TABLE tg_message;
|
||||
TRUNCATE TABLE tg_config;
|
||||
TRUNCATE TABLE tg_script;
|
||||
TRUNCATE TABLE tg_script_article;
|
||||
TRUNCATE TABLE tg_script_project;
|
||||
TRUNCATE TABLE tg_script_task;
|
||||
|
||||
-- 迁移TG账号数据(只迁移共同字段)
|
||||
INSERT INTO tg_account (id, firstname, lastname, phone, password, usageId, isBan, lastOnline, createdAt, updatedAt, status, session, banTime, nextTime, addGroupIds, about, targetId)
|
||||
SELECT id, firstname, lastname, phone, password, usageId, isBan, lastOnline, createdAt, updatedAt, status, session, banTime, nextTime, addGroupIds, about, targetId
|
||||
FROM c_tg_account;
|
||||
|
||||
-- 迁移名字数据
|
||||
INSERT INTO tg_firstname SELECT * FROM c_firstname;
|
||||
INSERT INTO tg_lastname SELECT * FROM c_lastname;
|
||||
|
||||
-- 迁移群组数据(检查表结构是否一致)
|
||||
INSERT IGNORE INTO tg_group SELECT * FROM c_group;
|
||||
|
||||
-- 迁移消息数据
|
||||
INSERT IGNORE INTO tg_message SELECT * FROM c_message;
|
||||
|
||||
-- 迁移配置数据
|
||||
INSERT IGNORE INTO tg_config SELECT * FROM c_config;
|
||||
|
||||
-- 迁移脚本相关数据
|
||||
INSERT IGNORE INTO tg_script SELECT * FROM c_script;
|
||||
INSERT IGNORE INTO tg_script_article SELECT * FROM c_script_article;
|
||||
INSERT IGNORE INTO tg_script_project SELECT * FROM c_script_project;
|
||||
INSERT IGNORE INTO tg_script_task SELECT * FROM c_script_task;
|
||||
|
||||
-- 重新启用外键检查
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- 查看迁移结果
|
||||
SELECT 'tg_account' as table_name, COUNT(*) as count FROM tg_account
|
||||
UNION ALL
|
||||
SELECT 'tg_firstname', COUNT(*) FROM tg_firstname
|
||||
UNION ALL
|
||||
SELECT 'tg_lastname', COUNT(*) FROM tg_lastname
|
||||
UNION ALL
|
||||
SELECT 'tg_group', COUNT(*) FROM tg_group
|
||||
UNION ALL
|
||||
SELECT 'tg_message', COUNT(*) FROM tg_message;
|
||||
35
database/migrations/migrate-data-safe.sql
Normal file
35
database/migrations/migrate-data-safe.sql
Normal file
@@ -0,0 +1,35 @@
|
||||
-- 清空目标表避免主键冲突
|
||||
TRUNCATE TABLE tg_account;
|
||||
TRUNCATE TABLE tg_firstname;
|
||||
TRUNCATE TABLE tg_lastname;
|
||||
TRUNCATE TABLE tg_group;
|
||||
TRUNCATE TABLE tg_message;
|
||||
TRUNCATE TABLE tg_config;
|
||||
TRUNCATE TABLE tg_script;
|
||||
TRUNCATE TABLE tg_script_article;
|
||||
TRUNCATE TABLE tg_script_project;
|
||||
TRUNCATE TABLE tg_script_task;
|
||||
|
||||
-- 迁移TG账号数据(只迁移共同字段)
|
||||
INSERT INTO tg_account (id, firstname, lastname, phone, password, usageId, isBan, lastOnline, createdAt, updatedAt, status, session, banTime, nextTime, addGroupIds, about, targetId)
|
||||
SELECT id, firstname, lastname, phone, password, usageId, isBan, lastOnline, createdAt, updatedAt, status, session, banTime, nextTime, addGroupIds, about, targetId
|
||||
FROM c_tg_account;
|
||||
|
||||
-- 迁移名字数据
|
||||
INSERT INTO tg_firstname SELECT * FROM c_firstname;
|
||||
INSERT INTO tg_lastname SELECT * FROM c_lastname;
|
||||
|
||||
-- 迁移群组数据
|
||||
INSERT INTO tg_group SELECT * FROM c_group;
|
||||
|
||||
-- 迁移消息数据
|
||||
INSERT INTO tg_message SELECT * FROM c_message;
|
||||
|
||||
-- 迁移配置数据
|
||||
INSERT INTO tg_config SELECT * FROM c_config;
|
||||
|
||||
-- 迁移脚本相关数据
|
||||
INSERT INTO tg_script SELECT * FROM c_script;
|
||||
INSERT INTO tg_script_article SELECT * FROM c_script_article;
|
||||
INSERT INTO tg_script_project SELECT * FROM c_script_project;
|
||||
INSERT INTO tg_script_task SELECT * FROM c_script_task;
|
||||
21
database/migrations/migrate-data.sql
Normal file
21
database/migrations/migrate-data.sql
Normal file
@@ -0,0 +1,21 @@
|
||||
-- 迁移TG账号数据
|
||||
INSERT IGNORE INTO tg_account SELECT * FROM c_tg_account;
|
||||
|
||||
-- 迁移名字数据
|
||||
INSERT IGNORE INTO tg_firstname SELECT * FROM c_firstname;
|
||||
INSERT IGNORE INTO tg_lastname SELECT * FROM c_lastname;
|
||||
|
||||
-- 迁移群组数据
|
||||
INSERT IGNORE INTO tg_group SELECT * FROM c_group;
|
||||
|
||||
-- 迁移消息数据
|
||||
INSERT IGNORE INTO tg_message SELECT * FROM c_message;
|
||||
|
||||
-- 迁移配置数据
|
||||
INSERT IGNORE INTO tg_config SELECT * FROM c_config;
|
||||
|
||||
-- 迁移其他重要数据
|
||||
INSERT IGNORE INTO tg_script SELECT * FROM c_script;
|
||||
INSERT IGNORE INTO tg_script_article SELECT * FROM c_script_article;
|
||||
INSERT IGNORE INTO tg_script_project SELECT * FROM c_script_project;
|
||||
INSERT IGNORE INTO tg_script_task SELECT * FROM c_script_task;
|
||||
Reference in New Issue
Block a user