feat: add nearby social services

This commit is contained in:
ANG-Server
2026-07-21 22:19:58 +08:00
parent 77302354ac
commit b5365751bb
17 changed files with 1266 additions and 121 deletions

View File

@@ -0,0 +1,92 @@
-- WhaleTown V2 core social infrastructure. Run after the existing users/user_profiles tables.
-- Compatible with MySQL 5.7+/MariaDB: add the column only once.
SET @nickname_column_exists := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'nickname_updated_at'
);
SET @nickname_column_sql := IF(
@nickname_column_exists = 0,
'ALTER TABLE users ADD COLUMN nickname_updated_at DATETIME NULL COMMENT ''社区昵称最近修改时间''',
'SELECT 1'
);
PREPARE nickname_column_statement FROM @nickname_column_sql;
EXECUTE nickname_column_statement;
DEALLOCATE PREPARE nickname_column_statement;
UPDATE user_profiles SET current_map = 'whale_port' WHERE current_map = 'plaza';
UPDATE user_profiles SET current_map = 'personal_space' WHERE current_map = 'room';
CREATE TABLE IF NOT EXISTS friendships (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_low_id BIGINT NOT NULL,
user_high_id BIGINT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uq_friendships_pair (user_low_id, user_high_id),
KEY idx_friendships_low (user_low_id),
KEY idx_friendships_high (user_high_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS friend_requests (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
requester_id BIGINT NOT NULL,
recipient_id BIGINT NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'pending',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
expires_at DATETIME NOT NULL,
responded_at DATETIME NULL,
KEY idx_friend_requests_recipient (recipient_id, status, expires_at),
KEY idx_friend_requests_pair (requester_id, recipient_id, status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS user_blocks (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
blocked_user_id BIGINT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uq_user_blocks_pair (user_id, blocked_user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS direct_messages (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
sender_id BIGINT NOT NULL,
recipient_id BIGINT NOT NULL,
content VARCHAR(1000) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
expires_at DATETIME NOT NULL,
read_at DATETIME NULL,
KEY idx_direct_messages_conversation (sender_id, recipient_id, created_at),
KEY idx_direct_messages_unread (recipient_id, read_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS user_reports (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
reporter_id BIGINT NOT NULL,
reported_user_id BIGINT NOT NULL,
reason VARCHAR(32) NOT NULL,
note VARCHAR(500) NULL,
message_id BIGINT NULL,
status VARCHAR(24) NOT NULL DEFAULT 'received',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_user_reports_reporter (reporter_id, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS player_travel_unlocks (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
destination_id VARCHAR(80) NOT NULL,
discovered_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uq_player_travel_unlocks (user_id, destination_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS social_notifications (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
category VARCHAR(48) NOT NULL,
title VARCHAR(100) NOT NULL,
content VARCHAR(500) NOT NULL,
action_metadata JSON NULL,
read_at DATETIME NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
expires_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY idx_social_notifications_user (user_id, read_at, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;