Files
whale-town/scripts/SocialManager.gd
2025-12-06 17:33:14 +08:00

604 lines
20 KiB
GDScript
Raw Permalink 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.
extends Node
class_name SocialManager
## 社交管理器
## 统一管理所有社交功能和系统集成
# 社交系统组件
var friend_system: FriendSystem
var private_chat_system: PrivateChatSystem
var relationship_network: RelationshipNetwork
var community_event_system: CommunityEventSystem
# 网络管理器引用
var network_manager: NetworkManager
# 社交状态
var is_initialized: bool = false
var current_user_id: String = "player"
# 信号
signal social_systems_ready()
signal friend_activity(activity_type: String, data: Dictionary)
signal social_notification(notification_type: String, title: String, message: String, data: Dictionary)
func _ready():
"""初始化社交管理器"""
print("SocialManager initializing...")
_initialize_social_systems()
## 初始化社交系统
func _initialize_social_systems() -> void:
"""初始化所有社交系统组件"""
# 创建好友系统
friend_system = FriendSystem.new()
friend_system.name = "FriendSystem"
add_child(friend_system)
# 创建私聊系统
private_chat_system = PrivateChatSystem.new()
private_chat_system.name = "PrivateChatSystem"
add_child(private_chat_system)
# 创建关系网络
relationship_network = RelationshipNetwork.new()
relationship_network.name = "RelationshipNetwork"
add_child(relationship_network)
# 创建社区事件系统
community_event_system = CommunityEventSystem.new()
community_event_system.name = "CommunityEventSystem"
add_child(community_event_system)
# 设置系统间的引用
private_chat_system.set_friend_system(friend_system)
community_event_system.set_relationship_network(relationship_network)
# 连接信号
_connect_system_signals()
is_initialized = true
social_systems_ready.emit()
print("SocialManager initialized with all social systems")
## 连接系统信号
func _connect_system_signals() -> void:
"""连接各个社交系统的信号"""
# 好友系统信号
friend_system.friend_request_sent.connect(_on_friend_request_sent)
# friend_system.friend_request_received.connect(_on_friend_request_received) # 信号暂时未使用
friend_system.friend_request_accepted.connect(_on_friend_request_accepted)
friend_system.friend_removed.connect(_on_friend_removed)
friend_system.friend_online.connect(_on_friend_online)
friend_system.friend_offline.connect(_on_friend_offline)
friend_system.relationship_level_changed.connect(_on_relationship_level_changed)
# 私聊系统信号
private_chat_system.conversation_created.connect(_on_conversation_created)
private_chat_system.message_received.connect(_on_private_message_received)
private_chat_system.unread_count_changed.connect(_on_unread_count_changed)
# 关系网络信号
relationship_network.relationship_created.connect(_on_relationship_created)
relationship_network.relationship_updated.connect(_on_relationship_updated)
relationship_network.influence_score_changed.connect(_on_influence_score_changed)
# 社区事件系统信号
community_event_system.event_created.connect(_on_event_created)
community_event_system.participant_joined.connect(_on_participant_joined)
community_event_system.event_started.connect(_on_event_started)
community_event_system.event_completed.connect(_on_event_completed)
community_event_system.milestone_achieved.connect(_on_milestone_achieved)
## 设置网络管理器
func set_network_manager(nm: NetworkManager) -> void:
"""
设置网络管理器引用
@param nm: 网络管理器实例
"""
network_manager = nm
if network_manager:
network_manager.message_received.connect(_on_network_message_received)
## 处理网络消息
func _on_network_message_received(message: Dictionary) -> void:
"""
处理来自网络的社交相关消息
@param message: 网络消息
"""
var message_type = message.get("type", "")
var data = message.get("data", {})
match message_type:
"friend_request":
_handle_friend_request_message(data)
"friend_response":
_handle_friend_response_message(data)
"private_message":
_handle_private_message(data)
"event_invitation":
_handle_event_invitation(data)
"social_update":
_handle_social_update(data)
## 发送好友请求
func send_friend_request(target_id: String, target_name: String) -> bool:
"""
发送好友请求
@param target_id: 目标用户ID
@param target_name: 目标用户名称
@return: 是否成功发送
"""
if not is_initialized:
print("Social systems not initialized")
return false
# 本地处理
var success = friend_system.send_friend_request(target_id, target_name)
if success and network_manager:
# 发送网络消息
var message = {
"type": "friend_request",
"data": {
"target_id": target_id,
"requester_name": "Player" # 这里应该从用户数据获取
}
}
network_manager.send_message(message)
return success
## 接受好友请求
func accept_friend_request(requester_id: String) -> bool:
"""
接受好友请求
@param requester_id: 请求者ID
@return: 是否成功接受
"""
if not is_initialized:
return false
var success = friend_system.accept_friend_request(requester_id)
if success and network_manager:
# 发送网络消息
var message = {
"type": "friend_response",
"data": {
"requester_id": requester_id,
"accepted": true
}
}
network_manager.send_message(message)
# 在关系网络中创建好友关系
relationship_network.create_relationship(current_user_id, requester_id, RelationshipNetwork.RelationshipType.FRIEND)
return success
## 开始私聊
func start_private_chat(target_id: String, target_name: String) -> String:
"""
开始私聊
@param target_id: 目标用户ID
@param target_name: 目标用户名称
@return: 会话ID
"""
if not is_initialized:
return ""
return private_chat_system.start_private_chat(target_id, target_name)
## 发送私聊消息
func send_private_message(conversation_id: String, message: String) -> bool:
"""
发送私聊消息
@param conversation_id: 会话ID
@param message: 消息内容
@return: 是否成功发送
"""
if not is_initialized:
return false
var success = private_chat_system.send_private_message(conversation_id, message)
if success and network_manager:
# 发送网络消息
var network_message = {
"type": "private_message",
"data": {
"conversation_id": conversation_id,
"message": message,
"sender_id": current_user_id
}
}
network_manager.send_message(network_message)
# 记录关系网络互动
var conversation_info = private_chat_system.get_conversation_messages(conversation_id, 1)
if conversation_info.size() > 0:
# 这里需要获取对方ID简化处理
relationship_network.record_interaction(current_user_id, "other_user", "private_chat")
return success
## 创建社区事件
func create_community_event(title: String, description: String, event_type: CommunityEventSystem.EventType, start_time: float = 0.0) -> String:
"""
创建社区事件
@param title: 事件标题
@param description: 事件描述
@param event_type: 事件类型
@param start_time: 开始时间
@return: 事件ID
"""
if not is_initialized:
return ""
var event_id = community_event_system.create_event(title, description, event_type, current_user_id, start_time)
if not event_id.is_empty() and network_manager:
# 发送网络消息
var message = {
"type": "event_created",
"data": {
"event_id": event_id,
"title": title,
"description": description,
"event_type": event_type,
"organizer_id": current_user_id,
"start_time": start_time
}
}
network_manager.send_message(message)
return event_id
## 加入社区事件
func join_community_event(event_id: String) -> bool:
"""
加入社区事件
@param event_id: 事件ID
@return: 是否成功加入
"""
if not is_initialized:
return false
var success = community_event_system.join_event(event_id, current_user_id)
if success and network_manager:
# 发送网络消息
var message = {
"type": "event_join",
"data": {
"event_id": event_id,
"participant_id": current_user_id
}
}
network_manager.send_message(message)
return success
## 获取社交摘要
func get_social_summary() -> Dictionary:
"""
获取社交活动摘要
@return: 社交摘要数据
"""
if not is_initialized:
return {}
var friends_list = friend_system.get_friends_list()
var friend_requests = friend_system.get_friend_requests()
var conversations = private_chat_system.get_conversations_list()
var unread_messages = private_chat_system.get_total_unread_count()
var user_events = community_event_system.get_user_events(current_user_id)
var influence_ranking = relationship_network.get_influence_ranking(10)
return {
"friends_count": friends_list.size(),
"pending_requests": friend_requests.size(),
"active_conversations": conversations.size(),
"unread_messages": unread_messages,
"upcoming_events": user_events.size(),
"influence_rank": _get_user_influence_rank(influence_ranking),
"recent_activity": _get_recent_social_activity()
}
## 获取推荐内容
func get_social_recommendations() -> Dictionary:
"""
获取社交推荐内容
@return: 推荐内容数据
"""
if not is_initialized:
return {}
var recommended_events = community_event_system.get_recommended_events(current_user_id, 5)
var mutual_friends = _get_potential_friends()
var active_conversations = private_chat_system.get_conversations_list()
# 过滤最近活跃的会话
var recent_conversations = []
for conv in active_conversations:
if conv.unread_count > 0 or (Time.get_unix_time_from_system() - conv.last_activity) < 86400: # 24小时内
recent_conversations.append(conv)
return {
"recommended_events": recommended_events,
"potential_friends": mutual_friends,
"active_conversations": recent_conversations.slice(0, 5),
"trending_topics": _get_trending_topics()
}
## 处理角色上线
func handle_character_online(character_id: String, character_name: String) -> void:
"""
处理角色上线事件
@param character_id: 角色ID
@param character_name: 角色名称
"""
if not is_initialized:
return
# 检查是否为好友
if friend_system.is_friend(character_id):
friend_system.handle_friend_online(character_id)
# 发送通知
social_notification.emit("friend_online", "好友上线", character_name + " 上线了", {"character_id": character_id})
## 处理角色下线
func handle_character_offline(character_id: String, _character_name: String) -> void:
"""
处理角色下线事件
@param character_id: 角色ID
@param _character_name: 角色名称 (暂未使用)
"""
if not is_initialized:
return
# 检查是否为好友
if friend_system.is_friend(character_id):
friend_system.handle_friend_offline(character_id)
## 记录社交互动
func record_social_interaction(target_id: String, interaction_type: String, data: Dictionary = {}) -> void:
"""
记录社交互动
@param target_id: 目标角色ID
@param interaction_type: 互动类型
@param data: 互动数据
"""
if not is_initialized:
return
# 记录到关系网络
relationship_network.record_interaction(current_user_id, target_id, interaction_type, data)
# 如果是好友,记录到好友系统
if friend_system.is_friend(target_id):
friend_system.record_interaction(target_id, interaction_type)
## 获取用户影响力排名
func _get_user_influence_rank(ranking: Array[Dictionary]) -> int:
"""
获取用户在影响力排行榜中的排名
@param ranking: 影响力排行数据
@return: 排名从1开始0表示未上榜
"""
for i in range(ranking.size()):
if ranking[i].character_id == current_user_id:
return i + 1
return 0
## 获取潜在好友
func _get_potential_friends() -> Array[Dictionary]:
"""
获取潜在好友推荐
@return: 潜在好友数组
"""
var potential_friends = []
var user_relationships = relationship_network.get_character_relationships(current_user_id)
# 基于共同好友推荐
for relationship in user_relationships:
if relationship.type == RelationshipNetwork.RelationshipType.FRIEND:
var mutual_connections = relationship_network.find_mutual_connections(current_user_id, relationship.to_character)
for connection in mutual_connections:
if not friend_system.is_friend(connection) and not friend_system.is_blocked(connection):
potential_friends.append({
"character_id": connection,
"reason": "共同好友: " + relationship.to_character,
"mutual_friends": 1
})
# 去重并限制数量
var unique_friends = {}
for friend in potential_friends:
var id = friend.character_id
if not unique_friends.has(id):
unique_friends[id] = friend
else:
unique_friends[id].mutual_friends += 1
var result = unique_friends.values()
result.sort_custom(func(a, b): return a.mutual_friends > b.mutual_friends)
return result.slice(0, 5)
## 获取最近社交活动
func _get_recent_social_activity() -> Array[Dictionary]:
"""
获取最近的社交活动
@return: 活动数组
"""
var activities = []
# 获取最近的好友互动
var friends_list = friend_system.get_friends_list()
for friend in friends_list:
if (Time.get_unix_time_from_system() - friend.last_interaction) < 86400: # 24小时内
activities.append({
"type": "friend_interaction",
"description": "" + friend.name + " 互动",
"timestamp": friend.last_interaction
})
# 获取最近的私聊
var conversations = private_chat_system.get_conversations_list()
for conv in conversations:
if (Time.get_unix_time_from_system() - conv.last_activity) < 86400: # 24小时内
activities.append({
"type": "private_chat",
"description": "" + conv.participants[0].name + " 私聊",
"timestamp": conv.last_activity
})
# 按时间排序
activities.sort_custom(func(a, b): return a.timestamp > b.timestamp)
return activities.slice(0, 10)
## 获取热门话题
func _get_trending_topics() -> Array[String]:
"""
获取热门话题
@return: 话题数组
"""
# 这里可以基于最近的事件、对话等分析热门话题
# 简化实现,返回一些示例话题
return ["AI学习", "技术分享", "游戏开发", "社区建设", "创新项目"]
## 处理网络消息 - 好友请求
func _handle_friend_request_message(data: Dictionary) -> void:
"""处理好友请求网络消息"""
var requester_id = data.get("requester_id", "")
var requester_name = data.get("requester_name", "Unknown")
if not requester_id.is_empty():
# 这里应该显示好友请求通知给用户
social_notification.emit("friend_request", "好友请求", requester_name + " 想要添加您为好友", data)
## 处理网络消息 - 好友响应
func _handle_friend_response_message(data: Dictionary) -> void:
"""处理好友响应网络消息"""
var accepted = data.get("accepted", false)
var responder_name = data.get("responder_name", "Unknown")
if accepted:
social_notification.emit("friend_accepted", "好友请求已接受", responder_name + " 接受了您的好友请求", data)
else:
social_notification.emit("friend_declined", "好友请求被拒绝", responder_name + " 拒绝了您的好友请求", data)
## 处理网络消息 - 私聊消息
func _handle_private_message(data: Dictionary) -> void:
"""处理私聊消息网络消息"""
var conversation_id = data.get("conversation_id", "")
var sender_id = data.get("sender_id", "")
var message = data.get("message", "")
if not conversation_id.is_empty() and not sender_id.is_empty():
private_chat_system.receive_private_message(conversation_id, sender_id, message)
## 处理网络消息 - 事件邀请
func _handle_event_invitation(data: Dictionary) -> void:
"""处理事件邀请网络消息"""
var _event_id = data.get("event_id", "")
var event_title = data.get("event_title", "")
var inviter_name = data.get("inviter_name", "Unknown")
social_notification.emit("event_invitation", "活动邀请", inviter_name + " 邀请您参加 " + event_title, data)
## 处理网络消息 - 社交更新
func _handle_social_update(data: Dictionary) -> void:
"""处理社交更新网络消息"""
var update_type = data.get("update_type", "")
match update_type:
"character_online":
handle_character_online(data.get("character_id", ""), data.get("character_name", ""))
"character_offline":
handle_character_offline(data.get("character_id", ""), data.get("character_name", ""))
# 信号处理函数
func _on_friend_request_sent(friend_id: String, friend_name: String):
friend_activity.emit("friend_request_sent", {"friend_id": friend_id, "friend_name": friend_name})
# func _on_friend_request_received(requester_id: String, requester_name: String):
# social_notification.emit("friend_request", "新的好友请求", requester_name + " 想要添加您为好友", {"requester_id": requester_id})
func _on_friend_request_accepted(friend_id: String, friend_name: String):
friend_activity.emit("friend_accepted", {"friend_id": friend_id, "friend_name": friend_name})
social_notification.emit("friend_accepted", "好友请求已接受", "您与 " + friend_name + " 现在是好友了", {"friend_id": friend_id})
func _on_friend_removed(friend_id: String, friend_name: String):
friend_activity.emit("friend_removed", {"friend_id": friend_id, "friend_name": friend_name})
func _on_friend_online(friend_id: String, friend_name: String):
friend_activity.emit("friend_online", {"friend_id": friend_id, "friend_name": friend_name})
func _on_friend_offline(friend_id: String, friend_name: String):
friend_activity.emit("friend_offline", {"friend_id": friend_id, "friend_name": friend_name})
func _on_relationship_level_changed(friend_id: String, old_level: int, new_level: int):
if new_level > old_level:
var friend_info = friend_system.get_friend_info(friend_id)
var friend_name = friend_info.get("name", "Unknown")
social_notification.emit("relationship_improved", "关系提升", "您与 " + friend_name + " 的关系等级提升了", {"friend_id": friend_id, "new_level": new_level})
func _on_conversation_created(conversation_id: String, participants: Array[String]):
friend_activity.emit("conversation_created", {"conversation_id": conversation_id, "participants": participants})
func _on_private_message_received(_conversation_id: String, _sender_id: String, _message: String):
# 这里可以显示消息通知
pass
func _on_unread_count_changed(_conversation_id: String, count: int):
if count > 0:
# 更新UI显示未读消息数量
pass
func _on_relationship_created(from_character: String, to_character: String, relationship_type: RelationshipNetwork.RelationshipType):
friend_activity.emit("relationship_created", {"from": from_character, "to": to_character, "type": relationship_type})
func _on_relationship_updated(from_character: String, to_character: String, old_strength: float, new_strength: float):
friend_activity.emit("relationship_updated", {"from": from_character, "to": to_character, "strength_change": new_strength - old_strength})
func _on_influence_score_changed(character_id: String, old_score: float, new_score: float):
if character_id == current_user_id and new_score > old_score:
social_notification.emit("influence_increased", "影响力提升", "您的社区影响力增加了", {"score_change": new_score - old_score})
func _on_event_created(event_id: String, title: String, organizer_id: String):
friend_activity.emit("event_created", {"event_id": event_id, "title": title, "organizer_id": organizer_id})
func _on_participant_joined(event_id: String, participant_id: String):
friend_activity.emit("event_joined", {"event_id": event_id, "participant_id": participant_id})
func _on_event_started(event_id: String, title: String):
social_notification.emit("event_started", "活动开始", title + " 活动现在开始了", {"event_id": event_id})
func _on_event_completed(event_id: String, title: String, participants: Array[String]):
if current_user_id in participants:
social_notification.emit("event_completed", "活动完成", "您参与的 " + title + " 活动已完成", {"event_id": event_id})
func _on_milestone_achieved(milestone_type: String, data: Dictionary):
social_notification.emit("milestone", "里程碑达成", "社区达成了新的里程碑: " + milestone_type, data)
## 获取统计信息
func get_statistics() -> Dictionary:
"""
获取社交系统统计信息
@return: 统计信息字典
"""
if not is_initialized:
return {}
return {
"friend_system": friend_system.get_statistics(),
"private_chat": private_chat_system.get_statistics(),
"relationship_network": relationship_network.get_statistics(),
"community_events": community_event_system.get_statistics()
}