创建新工程

This commit is contained in:
moyin
2025-12-05 19:00:14 +08:00
commit ff4fa5fffd
227 changed files with 32804 additions and 0 deletions

603
scripts/SocialManager.gd Normal file
View File

@@ -0,0 +1,603 @@
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()
}