VegetealHandler.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. namespace App\Module\AppGame\Handler\Pet;
  3. use App\Module\AppGame\Handler\BaseHandler;
  4. use App\Module\AppGame\Validations\PetVegetealValidation;
  5. use App\Module\Pet\Services\PetStealService;
  6. use Google\Protobuf\Internal\Message;
  7. use Illuminate\Support\Facades\DB;
  8. use Illuminate\Support\Facades\Log;
  9. use Uraus\Kku\Request\RequestPetVegeteal;
  10. use Uraus\Kku\Response\ResponsePetVegeteal;
  11. use UCore\Exception\LogicException;
  12. /**
  13. * 处理宠物偷菜请求
  14. *
  15. * 处理宠物偷菜功能,包括验证请求参数、执行偷菜逻辑、返回偷菜结果
  16. */
  17. class VegetealHandler extends BaseHandler
  18. {
  19. /**
  20. * 是否需要登录
  21. *
  22. * @var bool
  23. */
  24. protected bool $need_login = true;
  25. /**
  26. * 处理宠物偷菜请求
  27. *
  28. * @param RequestPetVegeteal $data 宠物偷菜请求数据
  29. * @return ResponsePetVegeteal 宠物偷菜响应
  30. */
  31. public function handle(Message $data): Message
  32. {
  33. // 创建验证对象
  34. $validation = PetVegetealValidation::makeByProrobufUser($data);
  35. // 验证请求数据
  36. $validation->validated();
  37. // 验证完成
  38. // 获取请求参数
  39. $targetUserId = $validation->getSafe('user_id'); // 被偷的玩家ID
  40. $petId = $validation->getSafe('pet_id'); // 宠物ID
  41. $plantId = $validation->getSafe('plant_id'); // 作物ID
  42. $stealerId = $this->user_id; // 偷菜者用户ID
  43. // 创建响应对象
  44. $response = new ResponsePetVegeteal();
  45. try {
  46. // 开启事务执行偷菜操作
  47. $stealResult = DB::transaction(function () use ($stealerId, $targetUserId, $plantId, $petId) {
  48. return PetStealService::stealCrop($stealerId, $targetUserId, $plantId, $petId);
  49. });
  50. // 记录偷菜操作日志
  51. Log::info('宠物偷菜操作', [
  52. 'stealer_id' => $stealerId,
  53. 'target_user_id' => $targetUserId,
  54. 'pet_id' => $petId,
  55. 'plant_id' => $plantId,
  56. 'success' => $stealResult->success,
  57. 'defended' => $stealResult->defended,
  58. 'steal_amount' => $stealResult->stealAmount,
  59. 'item_id' => $stealResult->itemId,
  60. 'steal_log_id' => $stealResult->stealLogId,
  61. 'pick_log_id' => $stealResult->pickLogId,
  62. ]);
  63. // 根据偷菜结果设置响应
  64. if ($stealResult->success) {
  65. // 偷菜成功
  66. Log::info('偷菜成功', [
  67. 'stealer_id' => $stealerId,
  68. 'target_user_id' => $targetUserId,
  69. 'steal_amount' => $stealResult->stealAmount,
  70. 'item_id' => $stealResult->itemId,
  71. ]);
  72. } elseif ($stealResult->defended) {
  73. // 被防御 - 抛出异常返回失败状态
  74. Log::info('偷菜被防御', [
  75. 'stealer_id' => $stealerId,
  76. 'target_user_id' => $targetUserId,
  77. 'stealer_pet_id' => $stealResult->stealerPetId,
  78. 'target_pet_id' => $stealResult->targetPetId,
  79. ]);
  80. throw new LogicException('偷菜被防御,偷菜失败');
  81. } else {
  82. // 偷菜失败
  83. Log::warning('偷菜失败', [
  84. 'stealer_id' => $stealerId,
  85. 'target_user_id' => $targetUserId,
  86. 'fail_reason' => $stealResult->failReason,
  87. ]);
  88. throw new LogicException($stealResult->failReason ?? '偷菜失败');
  89. }
  90. } catch (LogicException $e) {
  91. // 业务逻辑异常,记录日志并重新抛出
  92. Log::warning('偷菜业务逻辑异常', [
  93. 'stealer_id' => $stealerId,
  94. 'target_user_id' => $targetUserId,
  95. 'pet_id' => $petId,
  96. 'plant_id' => $plantId,
  97. 'error' => $e->getMessage(),
  98. 'trace' => $e->getTraceAsString(),
  99. ]);
  100. throw $e;
  101. } catch (\Exception $e) {
  102. // 其他异常,记录日志并重新抛出
  103. Log::error('偷菜操作异常', [
  104. 'stealer_id' => $stealerId,
  105. 'target_user_id' => $targetUserId,
  106. 'pet_id' => $petId,
  107. 'plant_id' => $plantId,
  108. 'error' => $e->getMessage(),
  109. 'trace' => $e->getTraceAsString(),
  110. ]);
  111. throw $e;
  112. }
  113. return $response;
  114. }
  115. }