WX-Game1/Assets/Scripts/Component/SearchFriendItemComponent.cs

423 lines
16 KiB
C#
Raw 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.

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Cysharp.Threading.Tasks;
using TMPro;
using WXGame.Network;
namespace DefaultNamespace.Component
{
/// <summary>
/// 搜索好友项组件
/// 用于显示搜索结果中的好友信息
/// </summary>
public class SearchFriendItemComponent : MonoBehaviour
{
[Header("UI组件引用")]
[SerializeField] private RawImage avatarImage; // 头像图片组件
[SerializeField] private TMP_Text usernameText; // 用户名文本组件
[SerializeField] private TMP_Text levelText; // 等级文本组件
[SerializeField] private Button addFriendButton; // 添加好友按钮
[SerializeField] private TMP_Text addFriendButtonText; // 添加好友按钮文本
// [SerializeField] private TMP_Text statusText; // 状态文本(是否已是好友)
//
[Header("调试设置")]
[SerializeField] private bool enableDebugLog = true; // 是否启用调试日志
// 私有字段
private SearchFriendData searchFriendData; // 搜索好友数据
/// <summary>
/// 初始化搜索好友项数据
/// </summary>
/// <param name="data">搜索好友数据</param>
public void InitializeSearchFriendItem(SearchFriendData data)
{
if (data == null)
{
Debug.Log("搜索好友数据为空,无法初始化");
return;
}
searchFriendData = data;
Debug.Log($"开始初始化搜索好友项: {data.user_username}");
// 设置用户信息
SetUserInfo(data);
// 设置好友状态
// SetFriendStatus(data.have);
// 设置添加好友按钮事件
SetupAddFriendButton();
// 异步下载头像
DownloadAvatarAsync(data.user_image).Forget();
}
/// <summary>
/// 设置用户信息(用户名和等级)
/// </summary>
/// <param name="data">搜索好友数据</param>
private void SetUserInfo(SearchFriendData data)
{
try
{
// 设置用户名
if (usernameText != null)
{
usernameText.text = string.IsNullOrEmpty(data.user_username) ? "未知用户" : data.user_username;
Debug.Log($"设置用户名: {usernameText.text}");
}
else
{
Debug.Log("用户名文本组件未设置");
}
// 设置等级
if (levelText != null)
{
levelText.text = $"等级: {data.user_honor_level}";
Debug.Log($"设置等级: {levelText.text}");
}
else
{
Debug.Log("等级文本组件未设置");
}
}
catch (Exception ex)
{
Debug.Log($"设置用户信息时发生异常: {ex.Message}");
}
}
// /// <summary>
// /// 设置好友状态
// /// </summary>
// /// <param name="have">是否已是好友0-不是好友1-已是好友)</param>
// private void SetFriendStatus(int have)
// {
// try
// {
// if (statusText != null)
// {
// if (have == 1)
// {
// statusText.text = "已是好友";
// statusText.color = Color.green;
// }
// else
// {
// statusText.text = "可添加";
// statusText.color = Color.blue;
// }
// Debug.Log($"设置好友状态: {statusText.text}");
// }
//
// // 设置添加好友按钮状态
// if (addFriendButton != null)
// {
// addFriendButton.interactable = (have == 0);
// Debug.Log($"设置添加好友按钮可交互状态: {addFriendButton.interactable}");
// }
// }
// catch (Exception ex)
// {
// Debug.Log($"设置好友状态时发生异常: {ex.Message}");
// }
// }
/// <summary>
/// 设置添加好友按钮事件
/// </summary>
private void SetupAddFriendButton()
{
try
{
if (addFriendButton != null)
{
// 移除之前的事件监听器
addFriendButton.onClick.RemoveAllListeners();
// 添加新的事件监听器
addFriendButton.onClick.AddListener(OnAddFriendButtonClick);
Debug.Log("添加好友按钮事件设置完成");
}
else
{
Debug.Log("添加好友按钮未设置");
}
}
catch (Exception ex)
{
Debug.Log($"设置添加好友按钮事件时发生异常: {ex.Message}");
}
}
/// <summary>
/// 添加好友按钮点击事件
/// </summary>
private void OnAddFriendButtonClick()
{
try
{
if (searchFriendData == null)
{
Debug.Log("搜索好友数据为空,无法添加好友");
return;
}
Debug.Log($"点击添加好友: {searchFriendData.user_username} (ID: {searchFriendData.user_id})");
// 禁用按钮防止重复点击
if (addFriendButton != null)
{
addFriendButton.interactable = false;
}
// 更新按钮文本
if (addFriendButtonText != null)
{
addFriendButtonText.text = "添加中";
}
// 调用添加好友的方法
AddFriendAsync().Forget();
}
catch (Exception ex)
{
Debug.Log($"添加好友按钮点击事件处理异常: {ex.Message}");
}
}
/// <summary>
/// 异步添加好友
/// </summary>
/// <returns>UniTask</returns>
private async UniTask AddFriendAsync()
{
try
{
Debug.Log($"开始添加好友: {searchFriendData.user_username} (ID: {searchFriendData.user_id})");
// 调用添加好友API
var result = await WebRequestManager.Instance.PostRequestAsync(
url: Apis.GetAddFriend(),
signParams: new Dictionary<string, string>()
{
{ "other_uid", searchFriendData.user_id.ToString() },
}
);
if (result.ResponseCode == 200)
{
Debug.Log($"添加好友请求成功!状态码: {result.ResponseCode}");
Debug.Log($"响应内容: {result.ResponseText}");
// 解析响应(假设返回标准格式:{"code":0,"msg":"","data":null}
try
{
var response = JsonUtility.FromJson<AddFriendResponse>(result.ResponseText);
if (response != null && response.code == 0)
{
// 添加好友成功
Debug.Log($"成功添加好友: {searchFriendData.user_username}");
// 更新UI状态
if (addFriendButtonText != null)
{
addFriendButtonText.text = "已发送";
}
// 禁用按钮,防止重复添加
if (addFriendButton != null)
{
addFriendButton.interactable = false;
}
Debug.Log($"好友 {searchFriendData.user_username} 添加请求发送成功!");
}
else if (response != null && response.code == 1001)
{
// 根据msg字段判断具体状态
string msg = response.msg ?? "";
if (msg.Contains("已经是好友了"))
{
// 已经是好友了
Debug.Log($"用户 {searchFriendData.user_username} 已经是好友了");
// 更新UI状态为"已是好友"
if (addFriendButtonText != null)
{
addFriendButtonText.text = "已是好友";
}
// 禁用按钮,因为已经是好友了
if (addFriendButton != null)
{
addFriendButton.interactable = false;
}
Debug.Log($"好友 {searchFriendData.user_username} 已经是好友状态!");
}
else if (msg.Contains("已申请"))
{
// 已申请好友
Debug.Log($"用户 {searchFriendData.user_username} 已申请好友");
// 更新UI状态为"已申请"
if (addFriendButtonText != null)
{
addFriendButtonText.text = "已申请";
}
// 禁用按钮,因为已经申请过了
if (addFriendButton != null)
{
addFriendButton.interactable = false;
}
Debug.Log($"好友 {searchFriendData.user_username} 已申请状态!");
}
else
{
// code: 1001 但msg不明确当作一般错误处理
Debug.LogWarning($"添加好友返回code: 1001但msg不明确: {msg}");
// 恢复按钮状态
RestoreButtonState();
// 显示错误信息
if (addFriendButtonText != null)
{
addFriendButtonText.text = "添加失败";
}
}
}
else
{
// API返回其他错误
string errorMsg = response?.msg ?? "未知错误";
Debug.LogWarning($"添加好友失败: {errorMsg} (错误码: {response?.code ?? -1})");
// 恢复按钮状态
RestoreButtonState();
// 显示错误信息
if (addFriendButtonText != null)
{
addFriendButtonText.text = "添加失败";
}
}
}
catch (Exception parseEx)
{
Debug.LogError($"解析添加好友响应失败: {parseEx.Message}");
RestoreButtonState();
}
}
else
{
Debug.LogError($"添加好友请求失败: {result.ResponseCode}");
RestoreButtonState();
}
}
catch (Exception ex)
{
Debug.LogError($"添加好友时发生异常: {ex.Message}");
RestoreButtonState();
}
}
/// <summary>
/// 恢复按钮状态
/// </summary>
private void RestoreButtonState()
{
if (addFriendButton != null)
{
addFriendButton.interactable = true;
}
if (addFriendButtonText != null)
{
addFriendButtonText.text = "添加好友";
}
}
/// <summary>
/// 异步下载头像
/// </summary>
/// <param name="imageUrl">头像URL</param>
/// <returns>UniTask</returns>
private async UniTask DownloadAvatarAsync(string imageUrl)
{
try
{
// 检查URL是否有效
if (string.IsNullOrEmpty(imageUrl))
{
Debug.Log("头像URL为空使用默认头像");
return;
}
Debug.Log($"开始下载头像: {imageUrl}");
// 使用WebRequestManager下载图片
Texture2D texture = await WebRequestManager.Instance.DownloadImageAsync(imageUrl);
if (texture != null)
{
// 设置头像
SetAvatarTexture(texture);
Debug.Log($"头像设置完成,尺寸: {texture.width}x{texture.height}");
}
else
{
Debug.Log("头像下载失败,使用默认头像");
}
}
catch (Exception ex)
{
Debug.Log($"下载头像时发生异常: {ex.Message}");
}
}
/// <summary>
/// 设置头像纹理
/// </summary>
/// <param name="texture">要设置的纹理</param>
private void SetAvatarTexture(Texture2D texture)
{
try
{
if (avatarImage != null && texture != null)
{
avatarImage.texture = texture;
Debug.Log("头像纹理设置成功");
}
else
{
Debug.Log("头像图片组件未设置或纹理为空");
}
}
catch (Exception ex)
{
Debug.Log($"设置头像纹理时发生异常: {ex.Message}");
}
}
/// <summary>
/// 获取当前搜索好友数据
/// </summary>
/// <returns>搜索好友数据</returns>
public SearchFriendData GetSearchFriendData()
{
return searchFriendData;
}
}
}